void GAME_SetMode (const cgame_export_t *gametype) { const cgame_export_t *list; if (cls.gametype == gametype) return; list = GAME_GetCurrentType(); if (list) { Com_Printf("Shutdown gametype '%s'\n", list->name); list->Shutdown(); /* we dont need to go back to "main" stack if we are already on this stack */ if (!UI_IsWindowOnStack("main")) UI_InitStack("main", "", qtrue, qtrue); } cls.gametype = gametype; CL_Disconnect(); list = GAME_GetCurrentType(); if (list) { Com_Printf("Change gametype to '%s'\n", list->name); /* inventory structure switched/initialized */ INV_DestroyInventory(&cls.i); INV_InitInventory(list->name, &cls.i, &csi, &inventoryImport); /** @todo this should be in GetCGameAPI */ list->Init(NULL); } }
void GAME_Drop (void) { const cgame_export_t *list = GAME_GetCurrentType(); if (list && list->Drop) { list->Drop(); } else { SV_Shutdown("Drop", qfalse); GAME_SetMode(NULL); UI_InitStack("main", NULL, qfalse, qtrue); } }
static void UI_InitStack_f (void) { const char *mainWindow; const char *optionWindow = NULL; if (Cmd_Argc() < 2) { Com_Printf("Usage: %s <mainwindow> [<optionwindow>]\n", Cmd_Argv(0)); return; } mainWindow = Cmd_Argv(1); if (Cmd_Argc() == 3) { optionWindow = Cmd_Argv(2); } UI_InitStack(mainWindow, optionWindow, true, true); }
/** * @brief Starts a new skirmish game */ static void GAME_SK_Start_f (void) { char map[MAX_VAR]; mapDef_t *md; if (!chrDisplayList.num) { unsigned int i; /** @todo make the teamdef configurable */ const char *ugvTeamDefID = "phalanx_ugv_phoenix"; const char *name = Cvar_GetString("cl_equip"); const equipDef_t *ed = INV_GetEquipmentDefinitionByID(name); const size_t size = GAME_GetCharacterArraySize(); uint32_t maxSoldiers = Cvar_GetInteger("sv_maxsoldiersperplayer"); uint32_t ugvs = Cvar_GetInteger("cl_ugvs"); if (maxSoldiers <= 0) maxSoldiers = size; ugvs = min(ugvs, size - maxSoldiers); Com_Printf("Starting skirmish with %i soldiers and %i ugvs\n", maxSoldiers, ugvs); GAME_AutoTeam(name, maxSoldiers); for (i = 0; i < ugvs; i++) GAME_AppendTeamMember(i + maxSoldiers, ugvTeamDefID, ed); } else { Com_Printf("Using already loaded team with %i members\n", chrDisplayList.num); } assert(cls.currentSelectedMap >= 0); assert(cls.currentSelectedMap < MAX_MAPDEFS); md = Com_GetMapDefByIDX(cls.currentSelectedMap); if (!md) return; GAME_SK_SetMissionParameters(md); assert(md->map); Com_sprintf(map, sizeof(map), "map %s %s %s;", Cvar_GetInteger("mn_serverday") ? "day" : "night", md->map, md->param ? md->param : ""); /* prepare */ UI_InitStack(NULL, "singleplayermission", qtrue, qfalse); Cbuf_AddText(map); }
/** * @brief Loads the given savegame from an xml File. * @return true on load success false on failures * @param[in] file The Filename to load from (without extension) * @param[out] error On failure an errormessage may be set. */ qboolean SAV_GameLoad (const char *file, const char **error) { uLongf len; char filename[MAX_OSPATH]; qFILE f; byte *cbuf, *buf; int i, clen; xmlNode_t *topNode, *node; saveFileHeader_t header; Q_strncpyz(filename, file, sizeof(filename)); /* open file */ FS_OpenFile(va("save/%s.%s", filename, SAVEGAME_EXTENSION), &f, FILE_READ); if (!f.f) { Com_Printf("Couldn't open file '%s'\n", filename); *error = "File not found"; return qfalse; } clen = FS_FileLength(&f); cbuf = (byte *) Mem_PoolAlloc(sizeof(byte) * clen, cp_campaignPool, 0); if (FS_Read(cbuf, clen, &f) != clen) Com_Printf("Warning: Could not read %i bytes from savefile\n", clen); FS_CloseFile(&f); Com_Printf("Loading savegame xml (size %d)\n", clen); memcpy(&header, cbuf, sizeof(header)); /* swap all int values if needed */ header.compressed = LittleLong(header.compressed); header.version = LittleLong(header.version); header.xmlSize = LittleLong(header.xmlSize); /* doing some header verification */ if (!SAV_VerifyHeader(&header)) { /* our header is not valid, we MUST abort loading the game! */ Com_Printf("The Header of the savegame '%s.%s' is corrupted. Loading aborted\n", filename, SAVEGAME_EXTENSION); Mem_Free(cbuf); *error = "Corrupted header"; return qfalse; } Com_Printf("Loading savegame\n" "...version: %i\n" "...game version: %s\n" "...xml Size: %i, compressed? %c\n", header.version, header.gameVersion, header.xmlSize, header.compressed ? 'y' : 'n'); len = header.xmlSize + 50; buf = (byte *) Mem_PoolAlloc(sizeof(byte) * len, cp_campaignPool, 0); if (header.compressed) { /* uncompress data, skipping comment header */ const int res = uncompress(buf, &len, cbuf + sizeof(header), clen - sizeof(header)); Mem_Free(cbuf); if (res != Z_OK) { Mem_Free(buf); *error = _("Error decompressing data"); Com_Printf("Error decompressing data in '%s'.\n", filename); return qfalse; } topNode = XML_Parse((const char*)buf); if (!topNode) { Mem_Free(buf); Com_Printf("Error: Failure in loading the xml data!\n"); *error = "Corrupted xml data"; return qfalse; } } else { /*memcpy(buf, cbuf + sizeof(header), clen - sizeof(header));*/ topNode = XML_Parse((const char*)(cbuf + sizeof(header))); Mem_Free(cbuf); if (!topNode) { Com_Printf("Error: Failure in loading the xml data!\n"); *error = "Corrupted xml data"; return qfalse; } } Mem_Free(buf); /* doing a subsystem run */ GAME_ReloadMode(); node = XML_GetNode(topNode, SAVE_ROOTNODE); if (!node) { Com_Printf("Error: Failure in loading the xml data! (savegame node not found)\n"); mxmlDelete(topNode); *error = "Invalid xml data"; return qfalse; } Com_Printf("Load '%s' %d subsystems\n", filename, saveSubsystemsAmount); for (i = 0; i < saveSubsystemsAmount; i++) { Com_Printf("...Running subsystem '%s'\n", saveSubsystems[i].name); if (!saveSubsystems[i].load(node)) { Com_Printf("...subsystem '%s' returned false - savegame could not be loaded\n", saveSubsystems[i].name); *error = va("Could not load subsystem %s", saveSubsystems[i].name); return qfalse; } else Com_Printf("...subsystem '%s' - loaded.\n", saveSubsystems[i].name); } mxmlDelete(node); mxmlDelete(topNode); if (!SAV_GameActionsAfterLoad()) { Com_Printf("Savegame postprocessing returned false - savegame could not be loaded\n"); *error = "Postprocessing failed"; return qfalse; } Com_Printf("File '%s' successfully loaded from %s xml savegame.\n", filename, header.compressed ? "compressed" : ""); UI_InitStack("geoscape", NULL, qtrue, qtrue); return qtrue; }