示例#1
0
文件: title.c 项目: LibreGames/tbftss
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);
		}
	}
}
示例#2
0
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);
			}
		}
	}
}