static void GAME_SCP_Frame (float secondsSinceLastFrame)
{
	if (!scd->initialized && CP_IsRunning()) {
		SCP_Parse();

		SCP_CampaignActivateFirstStage();

		scd->initialized = true;
	}

	GAME_CP_Frame(secondsSinceLastFrame);
}
예제 #2
0
bool SCP_Load (xmlNode_t *parent)
{
	xmlNode_t *node;
	xmlNode_t *snode;

	node = cgi->XML_GetNode(parent, SAVE_STATICCAMPAIGN);
	if (!node) {
		return false;
	}

	SCP_Parse();

	/* read static campaign data */
	for (snode = cgi->XML_GetNode(node, SAVE_STATICCAMPAIGN_STAGE); snode;
			snode = cgi->XML_GetNextNode(snode, node, SAVE_STATICCAMPAIGN_STAGE)) {
		xmlNode_t *stateNode;
		const char *id = cgi->XML_GetString(snode, SAVE_STATICCAMPAIGN_STAGENAME);
		stageState_t *state = SCP_CampaignActivateStage(id);
		if (!state) {
			Com_Printf("......error: unable to load campaign, unknown stage '%s'\n", id);
			return false;
		}

		cgi->XML_GetDate(snode, SAVE_STATICCAMPAIGN_STAGEDATE, &state->start.day, &state->start.sec);
		int num = 0;
		for (stateNode = cgi->XML_GetNode(snode, SAVE_STATICCAMPAIGN_SETSTATE); stateNode;
				stateNode = cgi->XML_GetNextNode(stateNode, snode, SAVE_STATICCAMPAIGN_SETSTATE)) {
			num++;
			setState_t *set;
			int j;
			const char *name = cgi->XML_GetString(stateNode, SAVE_STATICCAMPAIGN_SETSTATENAME);
			for (j = 0, set = &scd->set[state->def->first]; j < state->def->num; j++, set++)
				if (Q_streq(name, set->def->name))
					break;
			if (j >= state->def->num) {
				Com_Printf("......error: Set '%s' not found (%i/%i)\n", name, num, state->def->num);
				return false;
			}

			set->active = cgi->XML_GetBool(stateNode, SAVE_STATICCAMPAIGN_SETSTATEACTIVE, false);
			set->num = cgi->XML_GetInt(stateNode, SAVE_STATICCAMPAIGN_SETSTATENUM, 0);
			set->done = cgi->XML_GetInt(stateNode, SAVE_STATICCAMPAIGN_SETSTATEDONE, 0);

			cgi->XML_GetDate(stateNode, SAVE_STATICCAMPAIGN_SETSTATESTARTDATE, &set->start.day, &set->start.sec);
			cgi->XML_GetDate(stateNode, SAVE_STATICCAMPAIGN_SETSTATEEVENTDATE, &set->event.day, &set->event.sec);
		}

		if (num != state->def->num)
			Com_Printf("......warning: Different number of sets: savegame: %i, scripts: %i\n", num, state->def->num);
	}

	for (snode = cgi->XML_GetNode(node, SAVE_STATICCAMPAIGN_ACTIVEMISSION); snode;
			snode = cgi->XML_GetNextNode(snode, node, SAVE_STATICCAMPAIGN_ACTIVEMISSION)) {
		int j;
		const char *name = cgi->XML_GetString(snode, SAVE_STATICCAMPAIGN_STAGESETNAME);
		actMis_t *mis = &scd->activeMissions[scd->numActiveMissions++];
		mis->def = NULL;
		mis->cause = NULL;

		for (j = 0; j < scd->numStageSets; j++)
			if (Q_streq(name, scd->stageSets[j].name)) {
				mis->cause = &scd->set[j];
				break;
			}
		if (j >= scd->numStageSets) {
			Com_Printf("......error: Stage set '%s' not found\n", name);
			return false;
		}

		/* get mission definition */
		name = cgi->XML_GetString(snode, SAVE_STATICCAMPAIGN_MISSIONNAME);
		for (j = 0; j < scd->numMissions; j++)
			if (Q_streq(name, scd->missions[j].id)) {
				mis->def = &scd->missions[j];
				break;
			}

		/* ignore incomplete info */
		if (!mis->cause || !mis->def) {
			Com_Printf("......error: Incomplete mission info for mission %s\n", name);
			return false;
		}

		mis->def->count = cgi->XML_GetInt(snode, SAVE_STATICCAMPAIGN_MISSIONCOUNT, 0);

		name = cgi->XML_GetString(snode, SAVE_STATICCAMPAIGN_MISSIONID);
		mis->mission = CP_GetMissionByIDSilent(name);
		if (!mis->mission) {
			Com_Printf("......error: Could not find mission for %s\n", name);
			return false;
		}

		/* read time */
		cgi->XML_GetDate(snode, SAVE_STATICCAMPAIGN_MISSIONEXPIREDATE, &mis->expire.day, &mis->expire.sec);
	}

	return true;
}