Exemple #1
0
void MissionSetMessageIfComplete(struct MissionOptions *options)
{
	if (CanCompleteMission(options))
	{
		GameEvent msg;
		msg.Type = GAME_EVENT_MISSION_COMPLETE;
		GameEventsEnqueue(&gGameEvents, msg);
	}
}
Exemple #2
0
int IsMissionComplete(struct MissionOptions *options)
{
	if (!CanCompleteMission(options))
	{
		return 0;
	}

	// Check that all players are in exit zone
	if (gPlayer1 && !IsTileInExit(&gPlayer1->tileItem, options))
	{
		return 0;
	}
	if (gPlayer2 && !IsTileInExit(&gPlayer2->tileItem, options))
	{
		return 0;
	}
	if (gPrisoner && !IsTileInExit(&gPrisoner->tileItem, options))
	{
		return 0;
	}

	return 1;
}
Exemple #3
0
int IsMissionComplete(struct MissionOptions *options)
{
	int rescuesRequired = 0;
	int i;

	if (!CanCompleteMission(options))
	{
		return 0;
	}

	// Check if dogfight is complete
	if (gCampaign.Entry.Mode == CAMPAIGN_MODE_DOGFIGHT &&
		GetNumPlayersAlive() <= 1)
	{
		return 1;
	}

	// Check that all surviving players are in exit zone
	for (i = 0; i < MAX_PLAYERS; i++)
	{
		if (!IsPlayerAlive(i))
		{
			continue;
		}
		TActor *player = CArrayGet(&gActors, gPlayerIds[i]);
		if (!MapIsTileInExit(&gMap, &player->tileItem))
		{
			return 0;
		}
	}

	// Find number of rescues required
	// TODO: support multiple rescue objectives
	for (i = 0; i < (int)options->missionData->Objectives.size; i++)
	{
		MissionObjective *mobj =
			CArrayGet(&options->missionData->Objectives, i);
		if (mobj->Type == OBJECTIVE_RESCUE)
		{
			rescuesRequired = mobj->Required;
			break;
		}
	}
	// Check that enough prisoners are in exit zone
	if (rescuesRequired > 0)
	{
		int prisonersRescued = 0;
		for (i = 0; i < (int)gActors.size; i++)
		{
			TActor *a = CArrayGet(&gActors, i);
			if (!a->isInUse)
			{
				continue;
			}
			if (a->character == CharacterStoreGetPrisoner(
				&gCampaign.Setting.characters, 0) &&
				MapIsTileInExit(&gMap, &a->tileItem))
			{
				prisonersRescued++;
			}
		}
		if (prisonersRescued < rescuesRequired)
		{
			return 0;
		}
	}

	return 1;
}