colobot-data/ai/antec.txt

116 lines
3.4 KiB
Plaintext
Raw Normal View History

2012-09-13 21:35:43 +00:00
extern void object::Attack( )
{
2012-12-29 10:15:47 +00:00
int list[], i; // liste des objets cherchés
2012-09-13 21:35:43 +00:00
object target; // info sur la cible
2012-12-29 10:15:47 +00:00
point center; // coordonnées du centre de la zone
point lastPos; // dernière position (pr test si bloquée)
2012-09-13 21:35:43 +00:00
float distCent; // rayon de la zone
2012-12-29 10:15:47 +00:00
float distLim; // rayon à ne pas dépasser
float r; // valeur aléatoire
2012-09-13 21:35:43 +00:00
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;
2012-12-29 10:15:47 +00:00
center.x = cmdline(0); // prend les coordonnée
2012-09-13 21:35:43 +00:00
center.y = cmdline(1); // du centre de la zone
2012-12-29 10:15:47 +00:00
center.z = 0; // à exclure
2012-09-13 21:35:43 +00:00
distCent = cmdline(2); // rayon de la zone
distLim = cmdline(3);
lastPos = position; // initialise
turn(rand()*360-180);
motor(1,1); // en avant toute
2012-12-29 10:15:47 +00:00
while ( true ) // répère à l'infini
2012-09-13 21:35:43 +00:00
{
target = radar(list, 0, 360, 0, 40);
2012-12-29 10:15:47 +00:00
if (target == null or topo(position)<0)// pas de cible à proximité
2012-09-13 21:35:43 +00:00
{ // ou pieds dans l'eau
if (distance2d(position, center) < distCent
or distance2d(position, center) > distLim
or topo(position)<0)
{ // si la fourmi est dans la zone interdite
2012-12-29 10:15:47 +00:00
motor(0, 0); //s'arrête
wait(0.5); //marque un arrêt
2012-09-13 21:35:43 +00:00
motor (-0.5, -0.5);//recule lentement
2012-12-29 10:15:47 +00:00
wait (1.5); //attend qu'ait reculé
2012-09-13 21:35:43 +00:00
if (distance2d(position, center) < distCent+20)
{ //si trop proche du centre
if (direction(center)>0) turn(direction(center)-180); else turn(direction(center)+180);
motor (1, 1); //puis en avant toute
do
{
wait(1);
}
while (distance2d(position, center) < distCent or topo(position)<0);
}
else
{ //si trop loin du centre
turn(direction(center));
motor (1, 1); //puis en avant toute
do
{
wait(1); //tant que pas dans la zone
}
while (distance2d(position, center) > distLim or topo(position)<0);
}
}
else
{ //si elle est bien dans la zone
if (distance2d(lastPos, position) < 0.2)
2012-12-29 10:15:47 +00:00
{ //si elle est bloquée par obstacle
2012-09-13 21:35:43 +00:00
turn(rand()*360-180);
motor(1,1);
wait(1);
}
r = rand();
if (r > 0.7)
{ //dans un cas sur dix
2012-12-29 10:15:47 +00:00
motor (1, 0.8);// tourne à droite
2012-09-13 21:35:43 +00:00
wait(rand()*3);// pendant un moment
motor (1, 1); // puis tout droit
}
if (r < 0.3)
{ //dans un cas sur dix
2012-12-29 10:15:47 +00:00
motor (0.8, 1);// tourne à gauche
2012-09-13 21:35:43 +00:00
wait(rand()*3);// pendant un moment
motor (1, 1); // puis tout droit
}
lastPos = position;
wait(1); //attend un moment
}
}
else
2012-12-29 10:15:47 +00:00
{ // si cible à proximité
2012-09-13 21:35:43 +00:00
turn(direction(target.position));
fire(target.position); // et tire deux fois
motor(1,1); // avance
wait(1.5); // pendant 1.5 s
}
}
}