217 lines
5.4 KiB
Plaintext
217 lines
5.4 KiB
Plaintext
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);
|
|
}
|
|
|