112 lines
2.5 KiB
Plaintext
112 lines
2.5 KiB
Plaintext
extern void object::Attack( )
|
||
{
|
||
int list[];
|
||
int i;
|
||
object p;
|
||
float dim, dist, prox;
|
||
point nav1, nav2, nav3, nav4, dest, center;
|
||
|
||
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++] = RadarStation;
|
||
// list[i++] = DefenseTower;
|
||
|
||
while ( true )
|
||
{
|
||
p = TargetSearch(list); // cherche cible
|
||
if ( p == null )
|
||
{
|
||
dim = 1+rand()*2;
|
||
nav1.x = position.x+dim;
|
||
nav1.y = position.y+dim;
|
||
nav2.x = position.x+dim;
|
||
nav2.y = position.y-dim;
|
||
nav3.x = position.x-dim;
|
||
nav3.y = position.y-dim;
|
||
nav4.x = position.x-dim;
|
||
nav4.y = position.y+dim;
|
||
|
||
while ( true )
|
||
{
|
||
goto(nav1);
|
||
p = TargetSearch(list);
|
||
if ( p != null ) break;
|
||
|
||
goto(nav2);
|
||
p = TargetSearch(list);
|
||
if ( p != null ) break;
|
||
|
||
goto(nav3);
|
||
p = TargetSearch(list);
|
||
if ( p != null ) break;
|
||
|
||
goto(nav4);
|
||
p = TargetSearch(list);
|
||
if ( p != null ) break;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
dist = distance(p.position, position);
|
||
prox = dist/2; // on se rapproche
|
||
if ( prox < 2.5 )
|
||
{
|
||
dest.x = position.x+(rand()-0.5)*8;
|
||
dest.y = position.y+(rand()-0.5)*8;
|
||
dest.z = position.z;
|
||
}
|
||
else
|
||
{
|
||
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); // va sur la cible
|
||
}
|
||
}
|
||
}
|
||
|
||
// Cherche une cible sur l'<27>le. Si la cible est plus loin,
|
||
// elle est ignor<6F>e.
|
||
|
||
object object::TargetSearch(int[] list)
|
||
{
|
||
object p;
|
||
point center;
|
||
float dist;
|
||
|
||
p = radar(list);
|
||
if ( p == null ) return null;
|
||
|
||
center.x = 0;
|
||
center.y = 100; // sommet de l'<27>le
|
||
center.z = p.position.z;
|
||
dist = distance(p.position, center);
|
||
if ( dist > 80 ) return null; // ignore si trop loin
|
||
|
||
return p;
|
||
}
|