void MissionSetMessageIfComplete(struct MissionOptions *options) { if (CanCompleteMission(options)) { GameEvent msg; msg.Type = GAME_EVENT_MISSION_COMPLETE; GameEventsEnqueue(&gGameEvents, msg); } }
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; }
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; }