Separate gun AI.
This commit is contained in:
parent
833043ba7d
commit
deafab786e
|
@ -45,6 +45,7 @@ static void fleeEnemies(void);
|
||||||
static int isRetreating(void);
|
static int isRetreating(void);
|
||||||
static int getActionChance(int type);
|
static int getActionChance(int type);
|
||||||
static void doFighterAI(void);
|
static void doFighterAI(void);
|
||||||
|
static void doGunAI(void);
|
||||||
|
|
||||||
void doAI(void)
|
void doAI(void)
|
||||||
{
|
{
|
||||||
|
@ -83,7 +84,14 @@ void doAI(void)
|
||||||
|
|
||||||
if (!(self->aiFlags & AIF_AVOIDS_COMBAT))
|
if (!(self->aiFlags & AIF_AVOIDS_COMBAT))
|
||||||
{
|
{
|
||||||
doFighterAI();
|
if (!(self->flags & EF_STATIC))
|
||||||
|
{
|
||||||
|
doFighterAI();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
doGunAI();
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -112,7 +120,7 @@ static void doFighterAI(void)
|
||||||
{
|
{
|
||||||
findTarget();
|
findTarget();
|
||||||
|
|
||||||
if (self->target == NULL)
|
if (!self->target)
|
||||||
{
|
{
|
||||||
if (self->aiFlags & AIF_MOVES_TO_PLAYER && player != NULL)
|
if (self->aiFlags & AIF_MOVES_TO_PLAYER && player != NULL)
|
||||||
{
|
{
|
||||||
|
@ -161,6 +169,41 @@ static void doFighterAI(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void doGunAI(void)
|
||||||
|
{
|
||||||
|
int r;
|
||||||
|
|
||||||
|
/* don't hold a grudge against current target */
|
||||||
|
if ((self->target != NULL && self->target->health <= 0) || rand() % 5 == 0)
|
||||||
|
{
|
||||||
|
self->action = doAI;
|
||||||
|
self->target = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!self->target || self->target->systemPower <= 0)
|
||||||
|
{
|
||||||
|
findTarget();
|
||||||
|
|
||||||
|
if (!self->target)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
r = rand() % 100;
|
||||||
|
|
||||||
|
if (r <= 50)
|
||||||
|
{
|
||||||
|
self->action = huntTarget;
|
||||||
|
self->aiActionTime = FPS * 3;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
self->action = huntAndAttackTarget;
|
||||||
|
self->aiActionTime = FPS;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static int getActionChance(int type)
|
static int getActionChance(int type)
|
||||||
{
|
{
|
||||||
switch (type)
|
switch (type)
|
||||||
|
@ -231,7 +274,7 @@ static void findTarget(void)
|
||||||
|
|
||||||
if (dist < closest)
|
if (dist < closest)
|
||||||
{
|
{
|
||||||
if (self->target == NULL || ((self->target->aiFlags & AIF_AVOIDS_COMBAT) == 0) || ((self->target->aiFlags & AIF_AVOIDS_COMBAT) && rand() % 10) == 0)
|
if (!self->target || ((self->target->aiFlags & AIF_AVOIDS_COMBAT) == 0) || ((self->target->aiFlags & AIF_AVOIDS_COMBAT) && rand() % 10) == 0)
|
||||||
{
|
{
|
||||||
self->target = e;
|
self->target = e;
|
||||||
closest = dist;
|
closest = dist;
|
||||||
|
@ -325,6 +368,11 @@ static int hasClearShot(void)
|
||||||
|
|
||||||
for (e = battle.entityHead.next ; e != NULL ; e = e->next)
|
for (e = battle.entityHead.next ; e != NULL ; e = e->next)
|
||||||
{
|
{
|
||||||
|
if (self->owner != NULL && self->owner == e->owner)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if (e->active && e != self && e != self->owner && e != self->target && (getDistance(self->x, self->y, e->x, e->y) < dist))
|
if (e->active && e != self && e != self->owner && e != self->target && (getDistance(self->x, self->y, e->x, e->y) < dist))
|
||||||
{
|
{
|
||||||
if (isInFOV(e, 8))
|
if (isInFOV(e, 8))
|
||||||
|
|
Loading…
Reference in New Issue