AI updates for retreating fighters.

This commit is contained in:
Steve 2015-11-21 17:37:23 +00:00
parent 5ffc0e4be4
commit 669ce654f2
1 changed files with 44 additions and 4 deletions

View File

@ -44,17 +44,18 @@ static int nearTowableCraft(void);
static void moveToTowableCraft(void); static void moveToTowableCraft(void);
static void lookForPlayer(void); static void lookForPlayer(void);
static void fleeEnemies(void); static void fleeEnemies(void);
static int isRetreating(void);
static int getActionChance(int type); static int getActionChance(int type);
static void doFighterAI(void); static void doFighterAI(void);
void doAI(void) void doAI(void)
{ {
if ((self->aiFlags & AIF_GOAL_EXTRACTION) && nearExtractionPoint()) if ((self->aiFlags & AIF_AVOIDS_COMBAT) && nearEnemies())
{ {
return; return;
} }
if ((self->aiFlags & AIF_AVOIDS_COMBAT) && nearEnemies()) if ((self->aiFlags & AIF_GOAL_EXTRACTION) && nearExtractionPoint())
{ {
return; return;
} }
@ -69,6 +70,11 @@ void doAI(void)
return; return;
} }
if ((self->aiFlags & AIF_RETREATS) && (battle.stats[STAT_TIME] % 60 == 0) && isRetreating())
{
return;
}
if (!(self->aiFlags & AIF_AVOIDS_COMBAT)) if (!(self->aiFlags & AIF_AVOIDS_COMBAT))
{ {
doFighterAI(); doFighterAI();
@ -134,8 +140,9 @@ static void doFighterAI(void)
} }
else if (r <= getActionChance(AI_BOOST)) else if (r <= getActionChance(AI_BOOST))
{ {
applyFighterThrust();
self->action = boost; self->action = boost;
self->aiActionTime = FPS; self->aiActionTime = FPS * 0.5;
} }
else if (r <= getActionChance(AI_FALLBACK)) else if (r <= getActionChance(AI_FALLBACK))
{ {
@ -323,6 +330,11 @@ static void boost(void)
self->dy *= 1.001; self->dy *= 1.001;
nextAction(); nextAction();
if (self->action == doAI)
{
applyFighterThrust();
}
} }
static int hasClearShot(void) static int hasClearShot(void)
@ -418,12 +430,33 @@ static void nextAction(void)
} }
} }
static int isRetreating(void)
{
if (!(self->flags & EF_RETREATING))
{
if (battle.numEnemies > 0 && rand() % (battle.numEnemies * 5) == 0)
{
self->flags |= EF_RETREATING;
self->aiFlags |= AIF_AVOIDS_COMBAT;
self->aiFlags |= AIF_UNLIMITED_RANGE;
self->aiFlags |= AIF_GOAL_EXTRACTION;
addHudMessage(colors.red, "%s is retreating!", self->name);
return 1;
}
}
return self->flags & EF_RETREATING;
}
static int nearEnemies(void) static int nearEnemies(void)
{ {
int i, numEnemies; int i, numEnemies;
Entity *e, **candidates; Entity *e, **candidates;
candidates = getAllEntsWithin(self->x - (self->w / 2) - 1000, self->y - (self->h / 2) - 1000, 2000, 2000, self); candidates = getAllEntsWithin(self->x - (self->w / 2) - 500, self->y - (self->h / 2) - 500, 1000, 1000, self);
self->target = NULL; self->target = NULL;
self->targetLocation.x = self->targetLocation.y = 0; self->targetLocation.x = self->targetLocation.y = 0;
@ -457,6 +490,8 @@ static void fleeEnemies(void)
int wantedAngle = 180 + getAngle(self->x, self->y, self->targetLocation.x, self->targetLocation.y); int wantedAngle = 180 + getAngle(self->x, self->y, self->targetLocation.x, self->targetLocation.y);
turnAndFly(wantedAngle); turnAndFly(wantedAngle);
nextAction();
} }
static void moveToPlayer(void) static void moveToPlayer(void)
@ -491,6 +526,7 @@ static int nearExtractionPoint(void)
{ {
self->target = battle.extractionPoint; self->target = battle.extractionPoint;
self->action = moveToExtractionPoint; self->action = moveToExtractionPoint;
self->aiActionTime = FPS / 2;
} }
} }
@ -502,6 +538,8 @@ static void moveToExtractionPoint(void)
faceTarget(self->target); faceTarget(self->target);
applyFighterThrust(); applyFighterThrust();
nextAction();
} }
static int nearItems(void) static int nearItems(void)
@ -533,6 +571,7 @@ static int nearItems(void)
if (self->target != NULL) if (self->target != NULL)
{ {
self->action = moveToItem; self->action = moveToItem;
self->aiActionTime = FPS / 2;
} }
return self->target != NULL; return self->target != NULL;
@ -578,6 +617,7 @@ static int nearTowableCraft(void)
if (self->target != NULL) if (self->target != NULL)
{ {
self->action = moveToTowableCraft; self->action = moveToTowableCraft;
self->aiActionTime = FPS / 2;
} }
return self->target != NULL; return self->target != NULL;