From 58fb3e911bac80204a82aedebb8a746ee7d2521a Mon Sep 17 00:00:00 2001 From: Steve Date: Fri, 1 Apr 2016 11:40:09 +0100 Subject: [PATCH] Tell AI to avoid mines. --- src/battle/ai.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/src/battle/ai.c b/src/battle/ai.c index 9212c17..329232e 100644 --- a/src/battle/ai.c +++ b/src/battle/ai.c @@ -37,6 +37,7 @@ static int nearJumpgate(void); static void moveToJumpgate(void); static int nearEnemies(void); static int nearItems(void); +static int nearMines(void); static void moveToItem(void); static int nearTowableCraft(void); static void moveToTowableCraft(void); @@ -64,6 +65,11 @@ void doAI(void) return; } + if (nearMines()) + { + return; + } + if ((self->aiFlags & AIF_GOAL_JUMPGATE) && nearJumpgate()) { /* near jumpgate, but you might decide to continue to fight, anyway */ @@ -612,6 +618,45 @@ static int nearEnemies(void) return 0; } +static int nearMines(void) +{ + int i, numMines; + Entity *e, **candidates; + + candidates = getAllEntsWithin(self->x - 500, self->y - 500, 1000, 1000, self); + + self->targetLocation.x = self->targetLocation.y = 0; + + numMines = 0; + + for (i = 0, e = candidates[i] ; e != NULL ; e = candidates[++i]) + { + if (e->type == ET_MINE && getDistance(e->x, e->y, self->x, self->y) < 500) + { + self->targetLocation.x += e->x; + self->targetLocation.y += e->y; + numMines++; + } + } + + if (numMines) + { + self->targetLocation.x /= numMines; + self->targetLocation.y /= numMines; + + /* dodge slightly */ + self->targetLocation.x += (rand() % 100 - rand() % 100); + self->targetLocation.y += (rand() % 100 - rand() % 100); + + self->action = fleeEnemies; + self->aiActionTime = FPS * 2; + + return 1; + } + + return 0; +} + static void fleeEnemies(void) { int wantedAngle = 180 + getAngle(self->x, self->y, self->targetLocation.x, self->targetLocation.y);