static void GAME_SCP_Frame (float secondsSinceLastFrame) { if (!scd->initialized && CP_IsRunning()) { SCP_Parse(); SCP_CampaignActivateFirstStage(); scd->initialized = true; } GAME_CP_Frame(secondsSinceLastFrame); }
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; }