diff --git a/src/battle/fighters.c b/src/battle/fighters.c index c05c544..b85f38d 100644 --- a/src/battle/fighters.c +++ b/src/battle/fighters.c @@ -223,6 +223,8 @@ void doFighter(void) playBattleSound(SND_POWER_DOWN, self->x, self->y); self->flags |= EF_DISABLED; + self->flags |= EF_SECONDARY_TARGET; + battle.stats[STAT_ENEMIES_DISABLED]++; updateObjective(self->name, TT_DISABLE); diff --git a/src/battle/player.c b/src/battle/player.c index 950e789..fd7ad49 100644 --- a/src/battle/player.c +++ b/src/battle/player.c @@ -34,6 +34,7 @@ static void faceMouse(void); static void handleMouse(void); static void preFireMissile(void); static void applyRestrictions(void); +static int isPriorityMissionTarget(Entity *e, int dist, int closest); static int selectedPlayerIndex; static int availableGuns[BT_MAX]; @@ -472,9 +473,14 @@ static void selectTarget(void) near = NULL; memset(targets, 0, sizeof(Entity*) * MAX_SELECTABLE_TARGETS); + if (player->target && (!player->target->health || !player->target->systemPower)) + { + player->target = NULL; + } + for (e = battle.entityHead.next ; e != NULL ; e = e->next) { - if (e->active && e != player && (e->flags & EF_TAKES_DAMAGE) && e->side != player->side && e->alive == ALIVE_ALIVE && (!(e->flags & EF_DISABLED)) && i < MAX_SELECTABLE_TARGETS) + if (e->active && e != player && (e->flags & EF_TAKES_DAMAGE) && e->side != player->side && e->alive == ALIVE_ALIVE && e->systemPower > 0 && i < MAX_SELECTABLE_TARGETS) { dist = getDistance(self->x, self->y, e->x, e->y); if (dist < closest) @@ -543,7 +549,7 @@ static void selectMissionTarget(void) } else if (battle.missionTarget->type != ET_WAYPOINT) { - if (dist < closest) + if (isPriorityMissionTarget(e, dist, closest)) { battle.missionTarget = e; closest = dist; @@ -557,6 +563,24 @@ static void selectMissionTarget(void) } } +static int isPriorityMissionTarget(Entity *e, int dist, int closest) +{ + /* battle.missionTarget is secondary, e is not */ + if ((battle.missionTarget->flags & EF_SECONDARY_TARGET) > (e->flags & EF_SECONDARY_TARGET)) + { + return 1; + } + + /* battle.missionTarget is not secondary, e is */ + if ((battle.missionTarget->flags & EF_SECONDARY_TARGET) < (e->flags & EF_SECONDARY_TARGET)) + { + return 0; + } + + /* normal distance check */ + return dist < closest; +} + static void cycleRadarZoom(void) { battle.radarRange++;