/** ** Save a game to file. ** ** @param filename File name to be stored. ** ** @note Later we want to store in a more compact binary format. */ void SaveGame(const std::string &filename) { time_t now; CFile file; char *s; char *s1; std::string fullpath; fullpath = GetSaveDir() + filename; if (file.open(fullpath.c_str(), CL_WRITE_GZ | CL_OPEN_WRITE) == -1) { fprintf(stderr, "Can't save to `%s'\n", filename.c_str()); return; } time(&now); s = ctime(&now); if ((s1 = strchr(s, '\n'))) { *s1 = '\0'; } // Parseable header file.printf("SavedGameInfo({\n"); file.printf("--- generator = \"Generated by Bos Wars Version " VERSION "\",\n"); file.printf("--- comment = \"Visit http://www.boswars.org for more informations\",\n"); file.printf("--- type = \"%s\",\n", "single-player"); file.printf("--- date = \"%s\",\n", s); file.printf("--- map = \"%s\",\n", Map.Info.Description.c_str()); file.printf("--- media-version = \"%s\",\n", "Undefined"); file.printf("--- engine = {%d, %d, %d},\n", StratagusMajorVersion, StratagusMinorVersion, StratagusPatchLevel); file.printf(" SyncHash = %d, \n", SyncHash); file.printf(" SyncRandSeed = %d, \n", SyncRandSeed); file.printf(" SaveFile = \"%s\"\n", CurrentMapPath); file.printf("} )\n\n"); // FIXME: probably not the right place for this file.printf("GameCycle = %lu\n", GameCycle); SaveCcl(&file); Map.Save(&file); SavePlayers(&file); SaveUpgrades(&file); SaveUnits(&file); SaveUserInterface(&file); SaveAi(&file); SaveSelections(&file); SaveGroups(&file); SaveMissiles(&file); SaveTriggers(&file); SaveReplayList(&file); // FIXME: find all state information which must be saved. s = SaveGlobal(Lua, true); if (s != NULL) { file.printf("-- Lua state\n\n%s\n", s); delete[] s; } file.close(); }
/** ** Save a game to file. ** ** @param filename File name to be stored. ** @return -1 if saving failed, 0 if all OK ** ** @note Later we want to store in a more compact binary format. */ int SaveGame(const std::string &filename) { CFile file; std::string fullpath(GetSaveDir()); fullpath += "/"; fullpath += filename; if (file.open(fullpath.c_str(), CL_WRITE_GZ | CL_OPEN_WRITE) == -1) { fprintf(stderr, "Can't save to `%s'\n", filename.c_str()); return -1; } time_t now; char dateStr[64]; time(&now); const struct tm *timeinfo = localtime(&now); strftime(dateStr, sizeof(dateStr), "%c", timeinfo); // Load initial level // Without units file.printf("local oldCreateUnit = CreateUnit\n"); file.printf("local oldSetResourcesHeld = SetResourcesHeld\n"); file.printf("local oldSetTile = SetTile\n"); file.printf("function CreateUnit() end\n"); file.printf("function SetResourcesHeld() end\n"); file.printf("function SetTile() end\n"); file.printf("Load(\"%s\")\n", Map.Info.Filename.c_str()); file.printf("CreateUnit = oldCreateUnit\n"); file.printf("SetResourcesHeld = oldSetResourcesHeld\n"); file.printf("SetTile = oldSetTile\n"); // // Parseable header // file.printf("SavedGameInfo({\n"); file.printf("--- \"comment\", \"Generated by Stratagus Version " VERSION "\",\n"); file.printf("--- \"comment\", \"Visit https://launchpad.net/stratagus for more informations\",\n"); file.printf("--- \"type\", \"%s\",\n", "single-player"); file.printf("--- \"date\", \"%s\",\n", dateStr); file.printf("--- \"map\", \"%s\",\n", Map.Info.Description.c_str()); file.printf("--- \"media-version\", \"%s\"", "Undefined"); file.printf("--- \"engine\", {%d, %d, %d},\n", StratagusMajorVersion, StratagusMinorVersion, StratagusPatchLevel); file.printf(" SyncHash = %d, \n", SyncHash); file.printf(" SyncRandSeed = %d, \n", SyncRandSeed); file.printf(" SaveFile = \"%s\"\n", CurrentMapPath); file.printf("\n--- \"preview\", \"%s.pam\",\n", filename.c_str()); file.printf("} )\n\n"); // FIXME: probably not the right place for this file.printf("GameCycle = %lu\n", GameCycle); file.printf("SetGodMode(%s)\n", GodMode ? "true" : "false"); SaveUnitTypes(file); SaveUpgrades(file); SavePlayers(file); Map.Save(file); UnitManager.Save(file); SaveUserInterface(file); SaveAi(file); SaveSelections(file); SaveGroups(file); SaveMissiles(file); SaveReplayList(file); // FIXME: find all state information which must be saved. const std::string s = SaveGlobal(Lua); if (!s.empty()) { file.printf("-- Lua state\n\n %s\n", s.c_str()); } SaveTriggers(file); //Triggers are saved in SaveGlobal, so load it after Global file.close(); return 0; }