/** * Shows the Select Armor window. * @param action Pointer to an action. */ void CraftArmorState::lstSoldiersClick(Action *action) { Soldier *s = _base->getSoldiers()->at(_lstSoldiers->getSelectedRow()); if (!(s->getCraft() && s->getCraft()->getStatus() == "STR_OUT")) { if (action->getDetails()->button.button == SDL_BUTTON_LEFT) { _game->pushState(new SoldierArmorState(_base, _lstSoldiers->getSelectedRow())); } else if (action->getDetails()->button.button == SDL_BUTTON_RIGHT) { SavedGame *save; save = _game->getSavedGame(); Armor *a = _game->getMod()->getArmor(save->getLastSelectedArmor()); if (a && (a->getUnits().empty() || std::find(a->getUnits().begin(), a->getUnits().end(), s->getRules()->getType()) != a->getUnits().end())) { if (save->getMonthsPassed() != -1) { if (_base->getStorageItems()->getItem(a->getStoreItem()) > 0 || a->getStoreItem() == Armor::NONE) { if (s->getArmor()->getStoreItem() != Armor::NONE) { _base->getStorageItems()->addItem(s->getArmor()->getStoreItem()); } if (a->getStoreItem() != Armor::NONE) { _base->getStorageItems()->removeItem(a->getStoreItem()); } s->setArmor(a); _lstSoldiers->setCellText(_lstSoldiers->getSelectedRow(), 2, tr(a->getType())); } } else { s->setArmor(a); _lstSoldiers->setCellText(_lstSoldiers->getSelectedRow(), 2, tr(a->getType())); } } } } }
/** * Loads the UFO from a YAML file. * @param node YAML node. * @param ruleset The game rules. Use to access the trajectory rules. * @param game The game data. Used to find the UFO's mission. */ void Ufo::load(const YAML::Node &node, const Ruleset &ruleset, SavedGame &game) { MovingTarget::load(node); _id = node["id"].as<int>(_id); _crashId = node["crashId"].as<int>(_crashId); _landId = node["landId"].as<int>(_landId); _damage = node["damage"].as<int>(_damage); _altitude = node["altitude"].as<std::string>(_altitude); _direction = node["direction"].as<std::string>(_direction); _detected = node["detected"].as<bool>(_detected); _hyperDetected = node["hyperDetected"].as<bool>(_hyperDetected); _secondsRemaining = node["secondsRemaining"].as<size_t>(_secondsRemaining); _inBattlescape = node["inBattlescape"].as<bool>(_inBattlescape); double lon = _lon; double lat = _lat; if (const YAML::Node &dest = node["dest"]) { lon = dest["lon"].as<double>(); lat = dest["lat"].as<double>(); } _dest = new Waypoint(); _dest->setLongitude(lon); _dest->setLatitude(lat); if (const YAML::Node &status = node["status"]) { _status = (UfoStatus)status.as<int>(); } else { if (_damage >= _rules->getMaxDamage()) { _status = DESTROYED; } else if (_damage >= _rules->getMaxDamage() / 2) { _status = CRASHED; } else if (_altitude == "STR_GROUND") { _status = LANDED; } else { _status = FLYING; } } if (game.getMonthsPassed() != -1) { int missionID = node["mission"].as<int>(); std::vector<AlienMission *>::const_iterator found = std::find_if (game.getAlienMissions().begin(), game.getAlienMissions().end(), matchMissionID(missionID)); if (found == game.getAlienMissions().end()) { // Corrupt save file. throw Exception("Unknown mission, save file is corrupt."); } _mission = *found; std::string tid = node["trajectory"].as<std::string>(); _trajectory = ruleset.getUfoTrajectory(tid); _trajectoryPoint = node["trajectoryPoint"].as<size_t>(_trajectoryPoint); } _fireCountdown = node["fireCountdown"].as<int>(_fireCountdown); _escapeCountdown = node["escapeCountdown"].as<int>(_escapeCountdown); if (_inBattlescape) setSpeed(0); }