diff --git a/src/battle/ai.c b/src/battle/ai.c index e7eeaa7..80bf1d1 100644 --- a/src/battle/ai.c +++ b/src/battle/ai.c @@ -90,7 +90,7 @@ static void doFighterAI(void) int r; /* don't hold a grudge against current target */ - if ((self->target != NULL && self->target->health <= 0) || rand() % 2 == 0) + if ((self->target != NULL && self->target->health <= 0) || rand() % 5 == 0) { self->action = doAI; self->target = NULL; @@ -127,10 +127,10 @@ static void doFighterAI(void) if (r <= getActionChance(AI_EVADE)) { - self->targetLocation.x = self->target->x + rand() % 500 - rand() % 500; - self->targetLocation.y = self->target->y + rand() % 500 - rand() % 500; + self->targetLocation.x = self->target->x + (rand() % 150 - rand() % 150); + self->targetLocation.y = self->target->y + (rand() % 150 - rand() % 150); self->action = evade; - self->aiActionTime = FPS * 2; + self->aiActionTime = FPS; } else if (r <= getActionChance(AI_BOOST)) { @@ -355,6 +355,9 @@ static void preAttack(void) { if (!self->reload) { + /* force weapon selection, otherwise we'll keep using lasers / mag */ + canAttack(self->target); + if (self->guns[0].type && (self->missiles.ammo == 0 || rand() % 50 > 0)) { fireGuns(self); @@ -395,7 +398,7 @@ static void turnAndFly(int wantedAngle) static void evade(void) { - int wantedAngle = 180 + getAngle(self->x, self->y, self->targetLocation.x, self->targetLocation.y); + int wantedAngle = getAngle(self->x, self->y, self->targetLocation.x, self->targetLocation.y); turnAndFly(wantedAngle); } @@ -476,26 +479,21 @@ static void moveToPlayer(void) static int nearExtractionPoint(void) { - int i; - Entity *e, **candidates; - - candidates = getAllEntsWithin(self->x - (self->w / 2), self->y - (self->h / 2), GRID_CELL_WIDTH, GRID_CELL_HEIGHT, self); + int dist; self->target = NULL; - for (i = 0, e = candidates[i] ; e != NULL ; e = candidates[++i]) + if (battle.extractionPoint) { - if (e->type == ET_EXTRACTION_POINT) + dist = getDistance(self->x, self->y, battle.extractionPoint->x, battle.extractionPoint->y); + + if (dist <= 2000 || self->aiFlags & AIF_UNLIMITED_RANGE) { - self->target = e; + self->target = battle.extractionPoint; + self->action = moveToExtractionPoint; } } - if (self->target != NULL) - { - self->action = moveToExtractionPoint; - } - return self->target != NULL; } diff --git a/src/battle/entities.c b/src/battle/entities.c index 020c460..9fc8b8b 100644 --- a/src/battle/entities.c +++ b/src/battle/entities.c @@ -59,15 +59,6 @@ void doEntities(void) removeFromGrid(e); - if (e->action != NULL) - { - if (--e->thinkTime <= 0) - { - e->thinkTime = 0; - e->action(); - } - } - switch (e->type) { case ET_FIGHTER: @@ -92,14 +83,27 @@ void doEntities(void) break; } - doRope(e); - - restrictToGrid(e); - - e->x += e->dx; - e->y += e->dy; - - if (e->alive == ALIVE_DEAD || e->alive == ALIVE_ESCAPED) + if (e->alive == ALIVE_ALIVE || e->alive == ALIVE_DYING) + { + if (e->action != NULL) + { + if (--e->thinkTime <= 0) + { + e->thinkTime = 0; + e->action(); + } + } + + doRope(e); + + restrictToGrid(e); + + e->x += e->dx; + e->y += e->dy; + + addToGrid(e); + } + else { if (e == battle.entityTail) { @@ -124,13 +128,9 @@ void doEntities(void) free(e); e = prev; } - else - { - addToGrid(e); - } } - if (e->type == ET_FIGHTER && (battle.epic || e->active)) + if (e->type == ET_FIGHTER && (battle.epic || e->active) && !(e->flags & EF_NO_EPIC)) { if (e->side == SIDE_ALLIES) { @@ -309,7 +309,7 @@ static void activateEpicFighters(int n, int side) { for (e = battle.entityHead.next ; e != NULL ; e = e->next) { - if (!e->active && e->type == ET_FIGHTER && ((side == SIDE_ALLIES && e->side == SIDE_ALLIES) || (side != SIDE_ALLIES && e->side != SIDE_ALLIES))) + if (!e->active && e->type == ET_FIGHTER && !(e->flags & EF_NO_EPIC) && ((side == SIDE_ALLIES && e->side == SIDE_ALLIES) || (side != SIDE_ALLIES && e->side != SIDE_ALLIES))) { e->active = 1; diff --git a/src/battle/player.c b/src/battle/player.c index 5e89c24..7f9ee15 100644 --- a/src/battle/player.c +++ b/src/battle/player.c @@ -113,7 +113,7 @@ void doPlayer(void) if (app.keyboard[SDL_SCANCODE_RETURN] && player->missiles.ammo && player->target) { - if (getDistance(player->x, player->y, player->target->x, player->target->y) <= 1000) + if (getDistance(player->x, player->y, player->target->x, player->target->y) <= SCREEN_WIDTH) { fireMissile(player); } @@ -125,7 +125,7 @@ void doPlayer(void) app.keyboard[SDL_SCANCODE_RETURN] = 0; } - if (!player->target || player->target->health <= 0 || player->target->systemPower <= 0 || app.keyboard[SDL_SCANCODE_T]) + if (!player->target || player->target->systemPower <= 0 || app.keyboard[SDL_SCANCODE_T]) { selectTarget();