/** * Loads the saved battle game from a YAML file. * @param node YAML node. */ void SavedBattleGame::load(const YAML::Node &node, Ruleset *rule, SavedGame* savedGame) { int a; int selectedUnit = 0; node["width"] >> _width; node["length"] >> _length; node["height"] >> _height; node["missionType"] >> _missionType; node["globalshade"] >> _globalShade; node["turn"] >> _turn; node["selectedUnit"] >> selectedUnit; for (YAML::Iterator i = node["mapdatasets"].begin(); i != node["mapdatasets"].end(); ++i) { std::string name; *i >> name; MapDataSet *mds = new MapDataSet(name); _mapDataSets.push_back(mds); } initMap(_width, _length, _height); for (YAML::Iterator i = node["tiles"].begin(); i != node["tiles"].end(); ++i) { Position pos; (*i)["position"][0] >> pos.x; (*i)["position"][1] >> pos.y; (*i)["position"][2] >> pos.z; getTile(pos)->load((*i)); } for (YAML::Iterator i = node["nodes"].begin(); i != node["nodes"].end(); ++i) { Node *n = new Node(); n->load(*i); _nodes.push_back(n); } for (YAML::Iterator i = node["units"].begin(); i != node["units"].end(); ++i) { UnitFaction faction; (*i)["faction"] >> a; faction = (UnitFaction)a; (*i)["soldierId"] >> a; BattleUnit *b; if (a < BattleUnit::MAX_SOLDIER_ID) // Unit is linked to a geoscape soldier { // look up the matching soldier b = new BattleUnit(savedGame->getSoldier(a), faction); } else { std::string type, armor; (*i)["genUnitType"] >> type; (*i)["genUnitArmor"] >> armor; // create a new Unit. b = new BattleUnit(rule->getUnit(type), faction, a, rule->getArmor(armor)); } b->load(*i); _units.push_back(b); if (faction == FACTION_PLAYER) { if (b->getId() == selectedUnit) _selectedUnit = b; } else if (b->getStatus() != STATUS_DEAD) { std::string state; BattleAIState *aiState; (*i)["AI"]["state"] >> state; if (state == "PATROL") { aiState = new PatrolBAIState(this, b, 0); } else if (state == "AGGRO") { aiState = new AggroBAIState(this, b); } else { continue; } aiState->load((*i)["AI"]); b->setAIState(aiState); } }