/** * @brief Intercept mission ends: UFO leave earth. * @param[in] mission Pointer to the mission * @param[in] destroyed true if the UFO actually destroyed the installation, false else * @note Intercept mission -- Stage 3 */ void CP_InterceptMissionLeave (mission_t* mission, bool destroyed) { installation_t* installation; assert(mission->ufo); mission->stage = STAGE_RETURN_TO_ORBIT; /* if the mission was an attack of an installation, destroy it */ installation = mission->data.installation; if (installation) { vec3_t missionPos; Vector2Copy(mission->pos, missionPos); missionPos[2] = installation->pos[2]; if (destroyed && VectorCompareEps(missionPos, installation->pos, UFO_EPSILON)) INS_DestroyInstallation(installation); } CP_MissionDisableTimeLimit(mission); UFO_SetRandomDest(mission->ufo); CP_MissionRemoveFromGeoscape(mission); /* Display UFO on geoscape if it is detected */ mission->ufo->landed = false; }
/** * @brief Set ground mission, and go to ground mission pos. * @note Recon mission -- Stage 1 * @note ground mission can be spawned without UFO * @sa CP_ReconMissionSelect */ void CP_ReconMissionGroundGo (mission_t *mission) { const nation_t *nation; mission->stage = STAGE_MISSION_GOTO; /* maybe the UFO just finished a ground mission and starts a new one? */ if (mission->ufo) { CP_MissionRemoveFromGeoscape(mission); mission->ufo->landed = false; } /* Choose a map */ if (CP_ChooseMap(mission, NULL)) { int counter; for (counter = 0; counter < MAX_POS_LOOP; counter++) { if (!CP_GetRandomPosOnGeoscapeWithParameters(mission->pos, mission->mapDef->terrains, mission->mapDef->cultures, mission->mapDef->populations, NULL)) continue; if (MAP_PositionCloseToBase(mission->pos)) continue; mission->posAssigned = true; break; } if (counter >= MAX_POS_LOOP) { Com_Printf("CP_ReconMissionGroundGo: Error, could not set position.\n"); CP_MissionRemove(mission); return; } } else { Com_Printf("CP_ReconMissionGroundGo: No map found, remove mission.\n"); CP_MissionRemove(mission); return; } nation = MAP_GetNation(mission->pos); if (nation) { Com_sprintf(mission->location, sizeof(mission->location), "%s", _(nation->name)); } else { Com_sprintf(mission->location, sizeof(mission->location), "%s", _("No nation")); } if (mission->ufo) { CP_MissionDisableTimeLimit(mission); UFO_SendToDestination(mission->ufo, mission->pos); } else { /* Go to next stage on next frame */ mission->finalDate = ccs.date; } }
/** * @brief Recon mission ends: UFO leave earth. * @note Recon mission -- Stage 2 */ void CP_ReconMissionLeave (mission_t *mission) { mission->stage = STAGE_RETURN_TO_ORBIT; if (mission->ufo) { CP_MissionDisableTimeLimit(mission); UFO_SetRandomDest(mission->ufo); /* Display UFO on geoscape if it is detected */ mission->ufo->landed = false; } else { /* Go to next stage on next frame */ mission->finalDate = ccs.date; } CP_MissionRemoveFromGeoscape(mission); }