static void doFighters(void) { int i, numTextures; numTextures = sizeof(fighterTextures) / sizeof(char*); for (i = 0 ; i < NUM_FIGHTERS ; i++) { self = &fighters[i]; /* engine position hack, due to camera being fixed */ self->y += 16; addEngineEffect(); self->y -= 16; self->y += self->dy; if (self->y <= -64) { self->x = rand() % (SCREEN_WIDTH - 32); self->y = SCREEN_HEIGHT + (rand() % SCREEN_HEIGHT); self->texture = getTexture(fighterTextures[rand() % numTextures]); self->dy = -(1 + rand() % 3); } } }
void doFighter(void) { if (self->alive == ALIVE_ALIVE) { if (self != player) { separate(); } if (!(self->flags & EF_DISABLED)) { attachRope(); } if (self->thrust > 0.25) { addEngineEffect(); } if (self->health <= 0) { self->health = 0; self->alive = ALIVE_DYING; self->die(); if (self == battle.missionTarget) { battle.missionTarget = NULL; } } else if (self->systemPower <= 0 || (self->flags & EF_DISABLED)) { self->dx *= 0.99; self->dy *= 0.99; self->thrust = 0; self->shield = self->maxShield = 0; self->action = NULL; if ((self->flags & EF_DISABLED) == 0) { playBattleSound(SND_POWER_DOWN, self->x, self->y); self->flags |= EF_DISABLED; self->flags |= EF_SECONDARY_TARGET; if (self->aiFlags & AIF_SURRENDERING) { self->aiFlags |= AIF_SURRENDERED; self->aiFlags &= ~AIF_SURRENDERING; } battle.stats[STAT_ENEMIES_DISABLED]++; updateObjective(self->name, TT_DISABLE); updateObjective(self->groupName, TT_DISABLE); if (self->side != player->side) { runScriptFunction("ENEMIES_DISABLED %d", battle.stats[STAT_ENEMIES_DISABLED]); } } } if (self->target != NULL && self->target->alive != ALIVE_ALIVE) { self->target = NULL; if (self != player) { self->action = doAI; } } if (self->aiFlags & AIF_SUSPICIOUS) { checkSuspicionLevel(); } if (self->aiFlags & AIF_ZAK_SUSPICIOUS) { checkZackariaSuspicionLevel(); } } if (self->alive == ALIVE_ESCAPED) { if (self == player && !game.currentMission->challengeData.isChallenge) { updateObjective("Player", TT_ESCAPED); completeMission(); } if (self->side != player->side && (!(self->flags & EF_DISABLED))) { addHudMessage(colors.red, _("Mission target has escaped.")); battle.stats[STAT_ENEMIES_ESCAPED]++; } if (strcmp(self->defName, "Civilian") == 0) { battle.stats[STAT_CIVILIANS_RESCUED]++; } /* if you did not escape under your own volition, or with the aid of a friend, you've been stolen */ if (!self->owner || self->side == self->owner->side) { updateObjective(self->name, TT_ESCAPED); updateCondition(self->name, TT_ESCAPED); } else { updateObjective(self->name, TT_STOLEN); updateCondition(self->name, TT_STOLEN); } } if (self->alive == ALIVE_DEAD) { if (player->alive == ALIVE_ALIVE && self != player) { if (self->side != player->side) { if (!(self->flags & EF_NO_KILL_INC)) { battle.stats[STAT_ENEMIES_KILLED]++; runScriptFunction("ENEMIES_KILLED %d", battle.stats[STAT_ENEMIES_KILLED]); } } else { if (strcmp(self->name, "Civilian") == 0) { battle.stats[STAT_CIVILIANS_KILLED]++; if (!battle.isEpic || game.currentMission->challengeData.isChallenge) { addHudMessage(colors.red, _("Civilian has been killed")); } runScriptFunction("CIVILIANS_KILLED %d", battle.stats[STAT_CIVILIANS_KILLED]); } else { battle.stats[STAT_ALLIES_KILLED]++; if (!battle.isEpic && !game.currentMission->challengeData.isChallenge) { addHudMessage(colors.red, _("Ally has been killed")); } runScriptFunction("ALLIES_KILLED %d", battle.stats[STAT_ALLIES_KILLED]); } } updateObjective(self->name, TT_DESTROY); updateObjective(self->groupName, TT_DESTROY); if (battle.isEpic && self->killedBy == player) { updateObjective("EPIC_PLAYER_KILLS", TT_DESTROY); } adjustObjectiveTargetValue(self->name, TT_ESCAPED, -1); updateCondition(self->name, TT_DESTROY); updateCondition(self->groupName, TT_DESTROY); /* don't fire if the opposing side is responsible */ if (self->aiFlags & AIF_SURRENDERED && self->killedBy->side == player->side) { updateCondition("SURRENDERED", TT_DESTROY); } } } }