/** * Generates a brand new saved game with starting data. * @return A new saved game. */ SavedGame *Ruleset::newSave() const { SavedGame *save = new SavedGame(); // Add countries for (std::vector<std::string>::const_iterator i = _countriesIndex.begin(); i != _countriesIndex.end(); ++i) { save->getCountries()->push_back(new Country(getCountry(*i))); } // Adjust funding to total $6M int missing = ((6000 - save->getCountryFunding()/1000) / (int)save->getCountries()->size()) * 1000; for (std::vector<Country*>::iterator i = save->getCountries()->begin(); i != save->getCountries()->end(); ++i) { (*i)->setFunding((*i)->getFunding().back() + missing); } save->setFunds(save->getCountryFunding()); // Add regions for (std::vector<std::string>::const_iterator i = _regionsIndex.begin(); i != _regionsIndex.end(); ++i) { save->getRegions()->push_back(new Region(getRegion(*i))); } // Set up IDs std::map<std::string, int> ids; for (std::vector<std::string>::const_iterator i = _craftsIndex.begin(); i != _craftsIndex.end(); ++i) { ids[*i] = 1; } save->initIds(ids); // Set up starting base Base *base = new Base(this); base->load(_startingBase, save, true); // Correct IDs for (std::vector<Craft*>::const_iterator i = base->getCrafts()->begin(); i != base->getCrafts()->end(); ++i) { save->getId((*i)->getRules()->getType()); } // Generate soldiers int soldiers = _startingBase["randomSoldiers"].as<int>(0); for (int i = 0; i < soldiers; ++i) { Soldier *soldier = new Soldier(getSoldier("XCOM"), getArmor("STR_NONE_UC"), &_names, save->getId("STR_SOLDIER")); soldier->setCraft(base->getCrafts()->front()); base->getSoldiers()->push_back(soldier); } save->getBases()->push_back(base); // Setup alien strategy save->getAlienStrategy().init(this); save->setTime(_startingTime); return save; }
/** * Loads new battle data from a YAML file. * @param filename YAML filename. */ void NewBattleState::load(const std::string &filename) { std::string s = Options::getMasterUserFolder() + filename + ".cfg"; if (!CrossPlatform::fileExists(s)) { initSave(); } else { try { YAML::Node doc = YAML::LoadFile(s); _cbxMission->setSelected(std::min(doc["mission"].as<size_t>(0), _missionTypes.size() - 1)); cbxMissionChange(0); _cbxCraft->setSelected(std::min(doc["craft"].as<size_t>(0), _crafts.size() - 1)); _slrDarkness->setValue(doc["darkness"].as<size_t>(0)); _cbxTerrain->setSelected(std::min(doc["terrain"].as<size_t>(0), _terrainTypes.size() - 1)); cbxTerrainChange(0); _cbxAlienRace->setSelected(std::min(doc["alienRace"].as<size_t>(0), _alienRaces.size() - 1)); _cbxDifficulty->setSelected(doc["difficulty"].as<size_t>(0)); _slrAlienTech->setValue(doc["alienTech"].as<size_t>(0)); if (doc["base"]) { const Mod *mod = _game->getMod(); SavedGame *save = new SavedGame(); Base *base = new Base(mod); base->load(doc["base"], save, false); save->getBases()->push_back(base); // Add research const std::vector<std::string> &research = mod->getResearchList(); for (std::vector<std::string>::const_iterator i = research.begin(); i != research.end(); ++i) { save->addFinishedResearchSimple(mod->getResearch(*i)); } // Generate items base->getStorageItems()->getContents()->clear(); const std::vector<std::string> &items = mod->getItemsList(); for (std::vector<std::string>::const_iterator i = items.begin(); i != items.end(); ++i) { RuleItem *rule = _game->getMod()->getItem(*i); if (rule->getBattleType() != BT_CORPSE && rule->isRecoverable()) { base->getStorageItems()->addItem(*i, 1); } } // Fix invalid contents if (base->getCrafts()->empty()) { std::string craftType = _crafts[_cbxCraft->getSelected()]; _craft = new Craft(_game->getMod()->getCraft(craftType), base, save->getId(craftType)); base->getCrafts()->push_back(_craft); } else { _craft = base->getCrafts()->front(); for (std::map<std::string, int>::iterator i = _craft->getItems()->getContents()->begin(); i != _craft->getItems()->getContents()->end(); ++i) { RuleItem *rule = _game->getMod()->getItem(i->first); if (!rule) { i->second = 0; } } } _game->setSavedGame(save); } else { initSave(); } } catch (YAML::Exception &e) { Log(LOG_WARNING) << e.what(); initSave(); } } }