1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140
|
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
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++] = WingedBuilder;
list[i++] = TrackedBuilder;
list[i++] = WheeledBuilder;
list[i++] = LeggedBuilder;
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 ( true ) // répère à l'infini
{
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é
turn(direction(center));
motor (1, 1); //puis en avant toute
do
{
if (radar(TargetBot, 0, 360, 0, 30) != null)
{
BeScared();
break;
}
lastPos = position;
wait(1); //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.6)
{ //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.4)
{ //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(1); //attend un moment
}
}
else
{ // si cible à proximité
if (radar(TargetBot, 0, 360, 0, 30) != null)
{
BeScared();
continue;
}
turn(direction(target.position));
fire(target.position); // tourne vers la cible
}
}
}
void object::BeScared()
{
object p = radar(TargetBot, 0, 360, 0, 30);
point dest;
float dist, prox;
if ( p != null )
{
dist = distance(p.position, position);
if ( dist < 5 )
{
fire(p.position);
}
else
{
prox = dist+5; // fuite
dest.x = (position.x-p.position.x)*prox/dist + p.position.x;
dest.y = (position.y-p.position.y)*prox/dist + p.position.y;
dest.z = (position.z-p.position.z)*prox/dist + p.position.z;
goto(dest);
}
}
}
|