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) distCent or topo(position) distCent or topo(position) 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 } } }