AI fighers will now attempt to avoid combat if they take too much damage in a short space of time.

This commit is contained in:
Steve 2015-12-20 15:13:41 +00:00
parent 817c5c22ee
commit 1849a20831
5 changed files with 44 additions and 6 deletions

View File

@ -51,7 +51,7 @@ static void moveToLeader(void);
void doAI(void)
{
if ((self->aiFlags & AIF_AVOIDS_COMBAT) && nearEnemies())
if ((self->aiFlags & (AIF_AVOIDS_COMBAT | AIF_EVADE)) && nearEnemies())
{
return;
}
@ -130,7 +130,14 @@ static void doFighterAI(void)
{
if (!lookForLeader())
{
applyFighterBrakes();
if (self->aiFlags & AIF_MOVES_TO_PLAYER && player != NULL)
{
moveToPlayer();
}
else
{
applyFighterBrakes();
}
}
}
else if (self->aiFlags & AIF_MOVES_TO_PLAYER && player != NULL)
@ -244,7 +251,7 @@ static void huntTarget(void)
static void huntAndAttackTarget(void)
{
int dist = getDistance(self->x, self->y, self->target->x, self->target->y);
int range = self->aiFlags & AIF_LONG_RANGE_FIRE ? 1250 : 625;
int range = self->aiFlags & AIF_LONG_RANGE_FIRE ? (SCREEN_WIDTH * 1.5) : SCREEN_HEIGHT;
faceTarget(self->target);
@ -267,7 +274,7 @@ static void huntAndAttackTarget(void)
static int attackSecondaryTarget(Entity *e)
{
if (self->target->aiFlags & AIF_AVOIDS_COMBAT || self->target->flags & EF_SECONDARY_TARGET)
if (self->target->aiFlags & (AIF_AVOIDS_COMBAT | AIF_EVADE) || self->target->flags & EF_SECONDARY_TARGET)
{
return rand() % 4 == 0;
}

View File

@ -113,6 +113,13 @@ void doEntities(void)
e->shieldHit = MAX(e->shieldHit - 5, 0);
e->systemHit = MAX(e->systemHit - 25, 0);
e->aiDamageTimer = MAX(e->aiDamageTimer - 1, 0);
if (!e->aiDamageTimer)
{
e->aiDamagePerSec = 0;
e->aiFlags &= ~AIF_EVADE;
}
switch (e->type)
{
case ET_FIGHTER:
@ -213,8 +220,8 @@ void doEntities(void)
prev = e;
}
battle.numAllies = numAllies;
battle.numEnemies = numEnemies;
battle.numAllies = numActiveAllies;
battle.numEnemies = numActiveEnemies;
if (!battle.numInitialEnemies)
{

View File

@ -383,6 +383,9 @@ void damageFighter(Entity *e, int amount, long flags)
{
int prevShield = e->shield;
e->aiDamageTimer = FPS;
e->aiDamagePerSec += amount;
if (flags & BF_SYSTEM_DAMAGE)
{
e->systemPower = MAX(0, e->systemPower - amount);
@ -438,6 +441,23 @@ void damageFighter(Entity *e, int amount, long flags)
playBattleSound(SND_SHIELD_HIT, e->x, e->y);
}
/*
* Sometimes run away if you take too much damage in a short space of time
*/
if (e->type == ET_FIGHTER && e != player && e->aiDamagePerSec >= (e->maxHealth + e->maxShield) * 0.1 && (!(e->aiFlags & AIF_EVADE)))
{
if (rand() % 3)
{
e->action = doAI;
e->aiFlags |= AIF_EVADE;
e->aiActionTime = e->aiEvadeTimer = FPS * 3;
}
else
{
e->aiDamagePerSec = 0;
}
}
}
static void die(void)

View File

@ -102,6 +102,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#define AIF_INSTANT_DIE (2 << 11)
#define AIF_LONG_RANGE_FIRE (2 << 12)
#define AIF_MOVES_TO_LEADER (2 << 13)
#define AIF_EVADE (2 << 14)
/* player abilities */
#define BOOST_RECHARGE_TIME (FPS * 7)

View File

@ -119,6 +119,9 @@ struct Entity {
int thinkTime;
int aiActionTime;
int aiAggression;
int aiDamagePerSec;
int aiDamageTimer;
int aiEvadeTimer;
int separationRadius;
Weapon guns[MAX_FIGHTER_GUNS];
int missiles;