static void SCP_CampaignActivateStageSets (stage_t *stage) { setState_t *set; int i; scd->testStage = stage; for (i = 0, set = &scd->set[stage->first]; i < stage->num; i++, set++) { if (!set->active && !set->done && !set->num) { const date_t zero = {0, 0}; int i; /* check needed sets */ if (!BEP_Evaluate(set->def->needed, SCP_StageSetDone)) continue; Com_Printf("activate stage set '%s'\n", set->def->name); /* activate it */ set->active = true; set->start = Date_Add(ccs.date, set->def->delay); set->event = Date_Add(set->start, Date_Random(zero, set->def->frame)); for (i = 0; i < set->def->ufos; i++) { const float r = frand(); interestCategory_t category = INTERESTCATEGORY_TERROR_ATTACK; if (r > 0.9f) category = INTERESTCATEGORY_BASE_ATTACK; else if (r > 0.6f) category = INTERESTCATEGORY_INTERCEPT; CP_CreateNewMission(category, true); } } } }
static void SCP_CampaignAddMission (setState_t *set) { actMis_t *mis; mission_t * mission; const nation_t *nation; /* add mission */ if (scd->numActiveMissions >= MAX_ACTMISSIONS) { return; } mis = &scd->activeMissions[scd->numActiveMissions]; OBJZERO(*mis); /* set relevant info */ mis->def = SCP_GetMission(set); if (mis->def == NULL) { return; } mis->cause = set; if (set->def->expire.day) mis->expire = Date_Add(ccs.date, set->def->expire); /* prepare next event (if any) */ set->num++; if (set->def->number && set->num >= set->def->number) { set->active = false; } else { const date_t minTime = {0, 0}; set->event = Date_Add(ccs.date, Date_Random(minTime, set->def->frame)); } mission = CP_CreateNewMission(INTERESTCATEGORY_TERROR_ATTACK, true); mission->mapDef = cgi->Com_GetMapDefinitionByID(mis->def->id); if (!mission->mapDef) { Com_Printf("SCP_CampaignAddMission: Could not get the mapdef '%s'\n", mis->def->id); CP_MissionRemove(mission); return; } Vector2Copy(mis->def->pos, mission->pos); mission->posAssigned = true; 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")); } CP_TerrorMissionStart(mission); mission->finalDate = mis->expire; mis->mission = mission; Com_Printf("spawned map '%s'\n", mis->def->id); scd->numActiveMissions++; }
/** * @brief Start XVI spreading in campaign. * @note This is called when 'a new twist' technology is discovered. */ void CP_StartXVISpreading_f (void) { int numAlienBases; const campaign_t* campaign = ccs.curCampaign; ccs.startXVI = true; /* Spawn a few alien bases depending on difficulty level */ if (campaign->difficulty > 0) numAlienBases = 3; else if (campaign->difficulty < 0) numAlienBases = 1; else numAlienBases = 2; for (int i = 0; i < numAlienBases; i++) CP_CreateNewMission(INTERESTCATEGORY_BUILDING, false); }
/** * @brief Spawns a UFO-Carrier on the geoscape */ void CP_SpawnUFOCarrier_f (void) { CP_CreateNewMission(INTERESTCATEGORY_UFOCARRIER, true); }