/** * @brief Make the UFOs run * @param[in] campaign The campaign data structure * @param[in] deltaTime The time passed since last call */ void UFO_CampaignRunUFOs (const campaign_t* campaign, int deltaTime) { /* now the ufos are flying around, too - cycle backward - ufo might be destroyed */ for (int ufoIdx = ccs.numUFOs - 1; ufoIdx >= 0; ufoIdx--) { aircraft_t* ufo = UFO_GetByIDX(ufoIdx); /* don't run a landed ufo */ if (ufo->landed) continue; /* Every UFO on geoscape should have a mission assigned */ assert(ufo->mission); /* reached target and not following a phalanx aircraft? then we need a new destination */ if (AIR_AircraftMakeMove(deltaTime, ufo) && ufo->status != AIR_UFO) { const vec2_t& end = ufo->route.point[ufo->route.numPoints - 1]; Vector2Copy(end, ufo->pos); GEO_CheckPositionBoundaries(ufo->pos); if (ufo->mission->stage == STAGE_INTERCEPT && ufo->mission->data.aircraft) { /* Attacking an installation: fly over this installation */ UFO_SetRandomDestAround(ufo, ufo->mission->pos); } else UFO_SetRandomDest(ufo); if (CP_CheckNextStageDestination(campaign, ufo)) /* UFO has been removed from game */ continue; /* UFO was destroyed (maybe because the mission was removed) */ if (ufoIdx == ccs.numUFOs) continue; } /* Search the next target? */ UFO_SearchAircraftTarget(campaign, ufo); /* antimatter tanks */ if (ufo->fuel <= 0) ufo->fuel = ufo->stats[AIR_STATS_FUELSIZE]; /* Update delay to launch next projectile */ for (int k = 0; k < ufo->maxWeapons; k++) { aircraftSlot_t* slot = &ufo->weapons[k]; if (slot->delayNextShot > 0) slot->delayNextShot -= deltaTime; } } }
/** * @brief Subverting Mission ends: UFO leave earth. * @note Build Base mission -- Stage 3 */ static void CP_BuildBaseGovernmentLeave (const campaign_t* campaign, mission_t* mission) { nation_t* nation; assert(mission); assert(mission->ufo); mission->stage = STAGE_RETURN_TO_ORBIT; /* Mission is a success: government is subverted => lower happiness */ nation = GEO_GetNation(mission->pos); /** @todo when the mission is created, we should select a position where nation exists, * otherwise subverting a government is meaningless */ if (nation) { const nationInfo_t* stats = NAT_GetCurrentMonthInfo(nation); NAT_SetHappiness(campaign->minhappiness, nation, stats->happiness + HAPPINESS_SUBVERSION_LOSS); } CP_MissionDisableTimeLimit(mission); UFO_SetRandomDest(mission->ufo); /* Display UFO on geoscape if it is detected */ mission->ufo->landed = false; }
/** * @brief Add a UFO to geoscape * @param[in] ufoType The type of ufo (fighter, scout, ...). * @param[in] destination Position where the ufo should go. NULL is randomly chosen * @param[in] mission Pointer to the mission the UFO is involved in * @sa UFO_RemoveFromGeoscape * @sa UFO_RemoveFromGeoscape_f */ aircraft_t *UFO_AddToGeoscape (ufoType_t ufoType, const vec2_t destination, mission_t *mission) { aircraft_t *ufo; const aircraft_t *ufoTemplate; ufoTemplate = UFO_GetTemplateForGeoscape(ufoType); if (ufoTemplate == NULL) return NULL; /* Create ufo */ ufo = UFO_CreateFromTemplate(ufoTemplate); if (ufo == NULL) return NULL; /* Update Stats of UFO */ AII_UpdateAircraftStats(ufo); /* Give it HP */ ufo->damage = ufo->stats[AIR_STATS_DAMAGE]; /* Check for 0 damage which cause invulerable UFOs */ assert(ufo->damage); /* Every ufo on geoscape needs a mission assigned */ assert(mission); /* Initialise ufo data */ UFO_SetRandomPos(ufo); AII_ReloadAircraftWeapons(ufo); /* Load its weapons */ ufo->landed = qfalse; ufo->detected = qfalse; /* Not visible in radars (just for now) */ ufo->mission = mission; if (destination) UFO_SendToDestination(ufo, destination); else UFO_SetRandomDest(ufo); /* Random destination */ return ufo; }