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 distTar; // distance de la cible float dirTar; // direction de la cible float mp; // puissance moteur float tangle; // angle d'esquive en cas d'eau boolean ifmove; // si on avance en tirant ou pas 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 lastPos = position; // initialise motor(1,1); // en avant toute while (radar(list, 0, 360, 0, 40) == null) // répète jusqu'à contact { target = radar(list, 0, 360, 0, 40); if (target == null or topo(position)<0)// pas de cible à proximité { // ou pieds dans l'eau if (distance2d(position, center) > distCent or topo(position)<0) { // si la fourmi est en dehors de la zone motor(0, 0); //s'arrête wait(0.5); //marque un arrêt motor (-0.5, -0.5);//recule lentement wait (1.5); //attend qu'ait reculé if (direction(center)>0) motor (0,1); else motor (1,0); do wait(0.2); //tourne vers le centre while (direction(center) > 20 or direction(center) < -20); //tant que pas orienté vers le centre motor (1, 1); //puis en avant toute do { lastPos = position; wait(0.5); //tant que pas dans la zone if (distance2d(lastPos, position) < 0.2) { //si elle est bloquée par obstacle turn(rand()*360-180); motor(1,1); wait(1); turn(direction(center)); } } while (distance2d(position, center) > distCent or topo(position)<0); } else { //si elle est bien dans la zone if (distance2d(lastPos, position) < 0.2) { //si elle est bloquée par obstacle turn(rand()*360-180); motor(1,1); wait(1); } r = rand(); if (r > 0.9) { //dans un cas sur dix motor (1, 0.5);// tourne à droite wait(rand()*3);// pendant un moment motor (1, 1); // puis tout droit } if (r < 0.1) { //dans un cas sur dix motor (0.5, 1);// tourne à gauche wait(rand()*3);// pendant un moment motor (1, 1); // puis tout droit } lastPos = position; wait(0.2); //attend un moment } } else { // si cible à proximité turn(direction(target.position)); fire(target.position); // tourne vers la cible fire(target.position); // et tire deux fois motor(1,1); // avance wait(1.5); // pendant 1.5 s } } //a eu un contact avec l'astronaute lastPos = position; // initialise ifmove = true; while ( true ) // répète à l'infini { target = radar(list); dirTar = direction(target.position); distTar = distance(position, target.position); if (target != null) { if(distTar<40) { turn(dirTar); fire(target.position); target = radar(list); turn(direction(target.position)); for(int i=0; i<3; i=i+1) { if(topo(position)<1.5 or distance(position, target.position) < 8 or !ifmove) { ifmove = false; } else { lastPos = position; motor(1,1); wait(1); if (distance(position, lastPos) < 0.2) ifmove = false; } } } else { ifmove = true; if (distance(lastPos, position) < 0.2) { //si elle est bloquée par obstacle lastPos = position; turn(rand()*360-180); motor(1,1); wait(1); target = radar(list); turn(direction(target.position)); } else { lastPos = position; if (topo(position)>1.5) { mp = direction(target.position)/180; //if (mp>1) mp = 1; //if (mp<-1) mp = -1; if (mp>0) { motor(1-mp,1); } else { motor(1,1+mp); } wait(1); } else { motor (-0.5, -0.5); wait(1.5); target = radar(list); turn(direction(target.position)); tangle = 0; do { tangle = tangle + 22.5; if (tp(tangle) == 0) break; tangle = -tangle; if (tp(tangle) == 0) break; tangle = -tangle; if (tangle > 180) break; } while (true); turn(tangle); motor(1,1); wait(2); } } } } else { wait(1); } } } int object::tp(float angle) { point tpoint; tpoint.x = position.x + cos(orientation + angle)*10; tpoint.y = position.y + sin(orientation + angle)*10; tpoint.z = 0; if (topo(tpoint) < 2) return(1); else return(0); }