/** * @brief Set base attack mission, and go to base position. * @note Base attack mission -- Stage 1 */ static void CP_BaseAttackGoToBase (mission_t *mission) { base_t *base; mission->stage = STAGE_MISSION_GOTO; base = CP_BaseAttackChooseBase(); if (!base) { Com_Printf("CP_BaseAttackGoToBase: no base found\n"); CP_MissionRemove(mission); return; } mission->data.base = base; mission->mapDef = Com_GetMapDefinitionByID("baseattack"); if (!mission->mapDef) { CP_MissionRemove(mission); Com_Error(ERR_DROP, "Could not find mapdef baseattack"); return; } Vector2Copy(base->pos, mission->pos); mission->posAssigned = qtrue; Com_sprintf(mission->location, sizeof(mission->location), "%s", base->name); 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 Give a random destination to the given UFO, and make him to move there. * @param[in] ufocraft Pointer to the UFO which destination will be changed. * @sa UFO_SetRandomPos */ void UFO_SetRandomDest (aircraft_t* ufocraft) { vec2_t pos; CP_GetRandomPosOnGeoscape(pos, qfalse); UFO_SendToDestination(ufocraft, pos); }
/** * @brief Go to new base position. * @param[in,out] mission Pointer to the mission * @note Build Base mission -- Stage 1 */ static void CP_BuildBaseGoToBase (mission_t* mission) { assert(mission->ufo); mission->stage = STAGE_MISSION_GOTO; AB_SetAlienBasePosition(mission->pos); UFO_SendToDestination(mission->ufo, mission->pos); }
/** * @brief Give a random destination to the given UFO close to a position, and make him to move there. * @param[in] ufocraft Pointer to the UFO which destination will be changed. * @param[in] pos The position the UFO should around. * @sa UFO_SetRandomPos */ void UFO_SetRandomDestAround (aircraft_t* ufocraft, const vec2_t pos) { vec2_t dest; const float spread = 2.0f; float rand1, rand2; gaussrand(&rand1, &rand2); rand1 *= spread; rand2 *= spread; Vector2Set(dest, pos[0] + rand1, pos[1] + rand2); UFO_SendToDestination(ufocraft, dest); }
/** * @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 Set Harvest mission, and go to mission pos. * @note Harvesting attack mission -- Stage 1 * @todo Remove me when CP_XVIMissionGo will be implemented * This function should take a location close to an XVI infection point * see gameplay proposal on wiki */ void CP_HarvestMissionGo (mission_t *mission) { const nation_t *nation; mission->stage = STAGE_MISSION_GOTO; /* Choose a map */ if (CP_ChooseMap(mission, NULL)) { int counter; linkedList_t *nationList = NULL; const qboolean nationTest = CP_ChooseNation(mission, &nationList); for (counter = 0; counter < MAX_POS_LOOP; counter++) { if (!CP_GetRandomPosOnGeoscapeWithParameters(mission->pos, mission->mapDef->terrains, mission->mapDef->cultures, mission->mapDef->populations, nationTest ? nationList : NULL)) continue; if (MAP_PositionCloseToBase(mission->pos)) continue; mission->posAssigned = qtrue; break; } if (counter >= MAX_POS_LOOP) { Com_Printf("CP_HarvestMissionGo: Error, could not set position.\n"); CP_MissionRemove(mission); return; } LIST_Delete(&nationList); } else { Com_Printf("CP_HarvestMissionGo: 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 Set Terror attack mission, and go to Terror attack mission pos. * @note Terror attack mission -- Stage 1 * @note Terror missions can only take place in city: pick one in ccs.cities. */ static void CP_TerrorMissionGo (mission_t *mission) { int counter; mission->stage = STAGE_MISSION_GOTO; /* Choose a map */ for (counter = 0; counter < MAX_POS_LOOP; counter++) { city_t *city = CP_ChooseCity(); if (!city) continue; if (GEO_PositionCloseToBase(city->pos)) continue; if (!CP_ChooseMap(mission, city->pos)) continue; if (CP_TerrorInCity(city)) continue; Vector2Copy(city->pos, mission->pos); mission->data.city = city; mission->posAssigned = true; break; } if (counter >= MAX_POS_LOOP) { Com_DPrintf(DEBUG_CLIENT, "CP_TerrorMissionGo: Could not set position.\n"); CP_MissionRemove(mission); return; } 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 Set Intercept mission: UFO chooses an installation an flies to it. * @note Intercept mission -- Stage 1 */ void CP_InterceptGoToInstallation (mission_t* mission) { installation_t* installation; assert(mission->ufo); mission->stage = STAGE_MISSION_GOTO; installation = CP_InterceptChooseInstallation(mission); if (!installation) { Com_Printf("CP_InterceptGoToInstallation: no installation found\n"); CP_MissionRemove(mission); return; } mission->data.installation = installation; Vector2Copy(installation->pos, mission->pos); mission->posAssigned = true; CP_MissionDisableTimeLimit(mission); UFO_SendToDestination(mission->ufo, mission->pos); }
/** * @brief Go to base position. * @param[in,out] mission Pointer to the mission * @note Supply mission -- Stage 1 */ static void CP_SupplyGoToBase (mission_t *mission) { alienBase_t *alienBase; assert(mission->ufo); mission->stage = STAGE_MISSION_GOTO; /* Maybe base has been destroyed since mission creation ? */ if (!AB_CheckSupplyMissionPossible()) { Com_DPrintf(DEBUG_CLIENT, "No base in game: removing supply mission.\n"); CP_MissionRemove(mission); return; } alienBase = AB_ChooseBaseToSupply(); assert(alienBase); mission->data.alienBase = alienBase; Vector2Copy(alienBase->pos, mission->pos); UFO_SendToDestination(mission->ufo, mission->pos); }
/** * @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; }