133 lines
3.1 KiB
Plaintext
133 lines
3.1 KiB
Plaintext
![]() |
extern void object::Attack( )
|
|||
|
{
|
|||
|
int list[], i; // liste des objets cherch<63>s
|
|||
|
object target; // info sur la cible
|
|||
|
point center; // coordonn<6E>es du centre de la zone
|
|||
|
float distCent; // rayon de la zone
|
|||
|
float r; // valeur al<61>atoire
|
|||
|
int ifTarget; // si on a trouv<75> une cible et quel genre
|
|||
|
|
|||
|
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 = -65; // prend les coordonn<6E>e
|
|||
|
center.y = 255; // du centre de la zone
|
|||
|
center.z = 0; // <20> patrouiller
|
|||
|
distCent = 140; // rayon de la zone
|
|||
|
|
|||
|
motor(1,1); // en avant toute
|
|||
|
ifTarget = 0; // pas de cible pr<70>cise
|
|||
|
while ( true ) // r<>p<EFBFBD>te <20> l'infini
|
|||
|
{
|
|||
|
target = radar(list);
|
|||
|
if(target.position.y > 65)
|
|||
|
{
|
|||
|
if(distance2d(position, target.position)<40)
|
|||
|
{
|
|||
|
shoot(target.position);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
head(target.position);
|
|||
|
}
|
|||
|
}
|
|||
|
else Random(center, distCent);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
void object::head(point tarPos)
|
|||
|
{
|
|||
|
float mp;// puissance du moteur
|
|||
|
mp = direction(tarPos)/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);
|
|||
|
}
|
|||
|
|
|||
|
void object::Random(point center, float distCent)
|
|||
|
{
|
|||
|
if (distance2d(position, center) > distCent or topo(position)<2)
|
|||
|
{
|
|||
|
HorsZone(center, distCent);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
DansZone();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
void object::HorsZone(point center, float distCent)
|
|||
|
{ // si la fourmi est en dehors de la zone
|
|||
|
motor(0, 0); //s'arr<72>te
|
|||
|
wait(0.5); //marque un arr<72>t
|
|||
|
motor (-0.5, -0.5);//recule lentement
|
|||
|
wait (1.5); //attend qu'ait recul<75>
|
|||
|
turn(direction(center));
|
|||
|
motor (1, 1); //puis en avant toute
|
|||
|
do
|
|||
|
{
|
|||
|
wait(1); //tant que pas dans la zone
|
|||
|
}
|
|||
|
while (distance2d(position, center) > distCent or topo(position)<2);
|
|||
|
}
|
|||
|
|
|||
|
void object::DansZone()
|
|||
|
{ //si elle est bien dans la zone
|
|||
|
float r = rand();
|
|||
|
if (r > 0.8)
|
|||
|
{ //dans un cas sur dix
|
|||
|
motor (1, 0.8); // tourne <20> droite
|
|||
|
wait(rand()*2); // pendant un moment
|
|||
|
motor (1, 1); // puis tout droit
|
|||
|
}
|
|||
|
if (r < 0.2)
|
|||
|
{ //dans un cas sur dix
|
|||
|
motor (0.8, 1); // tourne <20> gauche
|
|||
|
wait(rand()*2); // pendant un moment
|
|||
|
motor (1, 1); // puis tout droit
|
|||
|
}
|
|||
|
motor(1,1);
|
|||
|
wait(1); //attend un moment
|
|||
|
}
|
|||
|
|
|||
|
void object::shoot(point tarPos)
|
|||
|
{ // si cible <20> proximit<69>
|
|||
|
turn(direction(tarPos));
|
|||
|
fire(tarPos); // tourne vers la cible
|
|||
|
fire(tarPos); // et tire deux fois
|
|||
|
motor(1,1); // avance
|
|||
|
wait(1.5); // pendant 1.5 s
|
|||
|
}
|