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++;
}
Exemple #3
0
/**
 * @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);
}