AI updates for retreating fighters.
This commit is contained in:
parent
5ffc0e4be4
commit
669ce654f2
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue