extern void object::Attack( ) { int list[], i; // liste des objets cherchés object target; // info sur la cible point center; // coordonnées du centre de la zone point lastPos; // dernière position (pr test si bloquée) float distCent; // rayon de la zone float r; // valeur aléatoire float mp; // vitesse maxi float minAlt; // altitude minimale (danger lave!) errmode(0); // ne stoppe pas si erreur while ( ismovie() != 0 ) wait(1); i = 0; list[i++] = WingedGrabber; list[i++] = TrackedGrabber; list[i++] = WheeledGrabber; list[i++] = LeggedGrabber; list[i++] = WingedShooter; list[i++] = TrackedShooter; list[i++] = WheeledShooter; list[i++] = LeggedShooter; list[i++] = WingedOrgaShooter; list[i++] = TrackedOrgaShooter; list[i++] = WheeledOrgaShooter; list[i++] = LeggedOrgaShooter; list[i++] = WingedSniffer; list[i++] = TrackedSniffer; list[i++] = WheeledSniffer; list[i++] = LeggedSniffer; list[i++] = Thumper; list[i++] = PhazerShooter; list[i++] = Recycler; list[i++] = Shielder; list[i++] = Subber; list[i++] = Me; center.x = cmdline(0); // prend les coordonnée center.y = cmdline(1); // du centre de la zone center.z = 0; // à patrouiller distCent = cmdline(2); // rayon de la zone mp = 0.4; minAlt = cmdline(3); lastPos = position; // initialise motor(mp, mp); // en avant toute while ( true ) // répère à l'infini { target = radar(list, 0, 360, 0, 40); if (target == null or topo(position)<minAlt)// pas de cible à proximité { // ou pieds dans l'eau if (distance2d(position, center) > distCent or topo(position)<minAlt) { // si la fourmi est en dehors de la zone motor(0, 0); //s'arrête wait(0.5); //marque un arrêt motor (-0.4, -0.4);//recule lentement wait (1.5); //attend qu'ait reculé turn(direction(center)); motor (mp, mp); //puis en avant toute do { lastPos = position; wait(0.5); //tant que pas dans la zone if (distance2d(lastPos, position) < 0.1) { //si elle est bloquée par obstacle turn(rand()*360-180); motor(mp, mp); wait(0.5); turn(direction(center)); } } while (distance2d(position, center) > distCent or topo(position)<minAlt); } else { //si elle est bien dans la zone if (distance2d(lastPos, position) < 0.1) { //si elle est bloquée par obstacle turn(rand()*360-180); motor(mp, mp); wait(0.5); } r = rand(); if (r > 0.6) { //dans un cas sur dix motor (mp, mp*0.5);// tourne à droite wait(rand()*2);// pendant un moment motor (mp, mp); // puis tout droit } if (r < 0.4) { //dans un cas sur dix motor (mp*0.5, mp);// tourne à gauche wait(rand()*2);// pendant un moment motor (mp, mp); // puis tout droit } lastPos = position; if(r>0.4 and r<0.6) wait(1);//attend un moment } } else { // si cible à proximité turn(direction(target.position)); fire(target.position); // tourne vers la cible } } }