/** * Shows the selected soldier's info. * @param action Pointer to an action. */ void CraftSoldiersState::lstSoldiersClick(Action *action) { int row = _lstSoldiers->getSelectedRow(); Craft *c = _base->getCrafts()->at(_craft); Soldier *s = _base->getSoldiers()->at(_lstSoldiers->getSelectedRow()); Uint8 color = Palette::blockOffset(13)+10; if (s->getCraft() == c) { s->setCraft(0); _lstSoldiers->setCellText(row, 2, _game->getLanguage()->getString("STR_NONE_UC")); color = Palette::blockOffset(13)+10; } else if (c->getSpaceAvailable() > 0 && s->getWoundRecovery() == 0) { s->setCraft(c); _lstSoldiers->setCellText(row, 2, c->getName(_game->getLanguage())); color = Palette::blockOffset(13); } _lstSoldiers->setRowColor(row, color); std::wstringstream ss; ss << _game->getLanguage()->getString("STR_SPACE_AVAILABLE") << L'\x01' << c->getSpaceAvailable(); _txtAvailable->setText(ss.str()); std::wstringstream ss2; ss2 << _game->getLanguage()->getString("STR_SPACE_USED") << L'\x01' << c->getSpaceUsed(); _txtUsed->setText(ss2.str()); }
/** * 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; }
/** * Shows the selected soldier's info. * @param action Pointer to an action. */ void CraftSoldiersState::lstSoldiersClick(Action *action) { double mx = action->getAbsoluteXMouse(); if ( mx >= _lstSoldiers->getArrowsLeftEdge() && mx < _lstSoldiers->getArrowsRightEdge() ) { return; } int row = _lstSoldiers->getSelectedRow(); if (action->getDetails()->button.button == SDL_BUTTON_LEFT) { Craft *c = _base->getCrafts()->at(_craft); Soldier *s = _base->getSoldiers()->at(_lstSoldiers->getSelectedRow()); Uint8 color = Palette::blockOffset(13)+10; if (s->getCraft() == c) { s->setCraft(0); _lstSoldiers->setCellText(row, 2, tr("STR_NONE_UC")); color = Palette::blockOffset(13)+10; } else if (s->getCraft() && s->getCraft()->getStatus() == "STR_OUT") { color = Palette::blockOffset(15)+6; } else if (c->getSpaceAvailable() > 0 && s->getWoundRecovery() == 0) { s->setCraft(c); _lstSoldiers->setCellText(row, 2, c->getName(_game->getLanguage())); color = Palette::blockOffset(13); } _lstSoldiers->setRowColor(row, color); _txtAvailable->setText(tr("STR_SPACE_AVAILABLE").arg(c->getSpaceAvailable())); _txtUsed->setText(tr("STR_SPACE_USED").arg(c->getSpaceUsed())); } else if (action->getDetails()->button.button == SDL_BUTTON_RIGHT) { _game->pushState(new SoldierInfoState(_game, _base, row)); } }
/** * Loads the base from a YAML file. * @param node YAML node. * @param save Pointer to saved game. */ void Base::load(const YAML::Node &node, SavedGame *save, bool newGame, bool newBattleGame) { Target::load(node); _name = Language::utf8ToWstr(node["name"].as<std::string>("")); if (!newGame || !Options::getBool("customInitialBase") || newBattleGame) { for (YAML::const_iterator i = node["facilities"].begin(); i != node["facilities"].end(); ++i) { std::string type = (*i)["type"].as<std::string>(); BaseFacility *f = new BaseFacility(_rule->getBaseFacility(type), this); f->load(*i); _facilities.push_back(f); } } for (YAML::const_iterator i = node["crafts"].begin(); i != node["crafts"].end(); ++i) { std::string type = (*i)["type"].as<std::string>(); Craft *c = new Craft(_rule->getCraft(type), this); c->load(*i, _rule, save); _crafts.push_back(c); } for (YAML::const_iterator i = node["soldiers"].begin(); i != node["soldiers"].end(); ++i) { Soldier *s = new Soldier(_rule->getSoldier("XCOM"), _rule->getArmor("STR_NONE_UC")); s->load(*i, _rule); if (const YAML::Node &craft = (*i)["craft"]) { std::string type = craft["type"].as<std::string>(); int id = craft["id"].as<int>(); for (std::vector<Craft*>::iterator j = _crafts.begin(); j != _crafts.end(); ++j) { if ((*j)->getRules()->getType() == type && (*j)->getId() == id) { s->setCraft(*j); break; } } } else { s->setCraft(0); } _soldiers.push_back(s); } _items->load(node["items"]); // Some old saves have bad items, better get rid of them to avoid further bugs for (std::map<std::string, int>::iterator i = _items->getContents()->begin(); i != _items->getContents()->end();) { if (std::find(_rule->getItemsList().begin(), _rule->getItemsList().end(), i->first) == _rule->getItemsList().end()) { _items->getContents()->erase(i++); } else { ++i; } } _scientists = node["scientists"].as<int>(_scientists); _engineers = node["engineers"].as<int>(_engineers); _inBattlescape = node["inBattlescape"].as<bool>(_inBattlescape); for (YAML::const_iterator i = node["transfers"].begin(); i != node["transfers"].end(); ++i) { int hours = (*i)["hours"].as<int>(); Transfer *t = new Transfer(hours); t->load(*i, this, _rule); _transfers.push_back(t); } for (YAML::const_iterator i = node["research"].begin(); i != node["research"].end(); ++i) { std::string research = (*i)["project"].as<std::string>(); ResearchProject *r = new ResearchProject(_rule->getResearch(research)); r->load(*i); _research.push_back(r); } for (YAML::const_iterator i = node["productions"].begin(); i != node["productions"].end(); ++i) { std::string item = (*i)["item"].as<std::string>(); Production *p = new Production(_rule->getManufacture(item), 0); p->load(*i); _productions.push_back(p); } _retaliationTarget = node["retaliationTarget"].as<bool>(_retaliationTarget); }
/** * Initializes a new savegame with * everything available. */ void NewBattleState::initSave() { const Mod *mod = _game->getMod(); SavedGame *save = new SavedGame(); Base *base = new Base(mod); const YAML::Node &starter = _game->getMod()->getStartingBase(); base->load(starter, save, true, true); save->getBases()->push_back(base); // Kill everything we don't want in this base for (std::vector<Soldier*>::iterator i = base->getSoldiers()->begin(); i != base->getSoldiers()->end(); ++i) delete (*i); base->getSoldiers()->clear(); for (std::vector<Craft*>::iterator i = base->getCrafts()->begin(); i != base->getCrafts()->end(); ++i) delete (*i); base->getCrafts()->clear(); base->getStorageItems()->getContents()->clear(); _craft = new Craft(mod->getCraft(_crafts[_cbxCraft->getSelected()]), base, 1); base->getCrafts()->push_back(_craft); // Generate soldiers for (int i = 0; i < 30; ++i) { int randomType = RNG::generate(0, _game->getMod()->getSoldiersList().size() - 1); Soldier *soldier = mod->genSoldier(save, _game->getMod()->getSoldiersList().at(randomType)); for (int n = 0; n < 5; ++n) { if (RNG::percent(70)) continue; soldier->promoteRank(); UnitStats* stats = soldier->getCurrentStats(); stats->tu += RNG::generate(0, 5); stats->stamina += RNG::generate(0, 5); stats->health += RNG::generate(0, 5); stats->bravery += RNG::generate(0, 5); stats->reactions += RNG::generate(0, 5); stats->firing += RNG::generate(0, 5); stats->throwing += RNG::generate(0, 5); stats->strength += RNG::generate(0, 5); stats->psiStrength += RNG::generate(0, 5); stats->melee += RNG::generate(0, 5); stats->psiSkill += RNG::generate(0, 20); } UnitStats* stats = soldier->getCurrentStats(); stats->bravery = (int)ceil(stats->bravery / 10.0) * 10; // keep it a multiple of 10 base->getSoldiers()->push_back(soldier); if (i < _craft->getRules()->getSoldiers()) soldier->setCraft(_craft); } // Generate items 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); if (rule->getBattleType() != BT_NONE && !rule->isFixed() && rule->getBigSprite() > -1) { _craft->getItems()->addItem(*i, 1); } } } // 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)); } _game->setSavedGame(save); cbxMissionChange(0); }