bool RequirableType::load(const XmlNode *baseNode, const string &dir, bool add) { bool loadOk = DisplayableType::load(baseNode, dir, add); const FactionType *ft = 0; const TechTree *tt = 0; if (&g_world) { for (int i = 0; i < g_world.getTechTree()->getFactionTypeCount(); ++i) { tt = g_world.getTechTree(); ft = g_world.getTechTree()->getFactionType(i); for (int j = 0; j < ft->getUnitTypeCount(); ++j) { if (m_name == ft->getUnitType(i)->getName()) { break; } } } } else if (g_program.getState()->isCCState()) { MainMenu *charMenu = static_cast<MainMenu*>(g_program.getState()); MenuStateCharacterCreator *charState = static_cast<MenuStateCharacterCreator*>(charMenu->getState()); CharacterCreator *charCreator = charState->getCharacterCreator(); tt = charCreator->getTechTree(); for (int i = 0; i < tt->getFactionTypeCount(); ++i) { ft = tt->getFactionType(i); for (int j = 0; j < ft->getUnitTypeCount(); ++j) { if (m_name == ft->getUnitType(i)->getName()) { break; } } } } else { MainMenu *charMenu = static_cast<MainMenu*>(g_program.getState()); MenuStateCharacterCreator *charState = static_cast<MenuStateCharacterCreator*>(charMenu->getState()); CharacterCreator *charCreator = charState->getCharacterCreator(); tt = charCreator->getTechTree(); for (int i = 0; i < tt->getFactionTypeCount(); ++i) { ft = tt->getFactionType(i); for (int j = 0; j < ft->getUnitTypeCount(); ++j) { if (m_name == ft->getUnitType(i)->getName()) { break; } } } } try { // Unit requirements const XmlNode *unitRequirementsNode = baseNode->getChild("unit-requirements", 0, false); if(unitRequirementsNode) { for(int i = 0; i < unitRequirementsNode->getChildCount(); ++i) { const XmlNode *unitNode = unitRequirementsNode->getChild("unit", i); string name = unitNode->getRestrictedAttribute("name"); bool scope = false; string local = unitNode->getRestrictedAttribute("scope"); if (local == "local") { scope = true; } int value = unitNode->getIntAttribute("amount"); UnitReq unitReq; unitReq.init(ft->getUnitType(name), value, scope); unitReqs.push_back(unitReq); } } } catch (runtime_error e) { g_logger.logXmlError(dir, e.what ()); loadOk = false; } try { // Item requirements const XmlNode *itemRequirementsNode = baseNode->getChild("item-requirements", 0, false); if(itemRequirementsNode) { for(int i = 0; i < itemRequirementsNode->getChildCount(); ++i) { const XmlNode *itemNode = itemRequirementsNode->getChild("item", i); string name = itemNode->getRestrictedAttribute("name"); bool scope = false; string local = itemNode->getRestrictedAttribute("scope"); if (local == "local") { scope = true; } int value = itemNode->getIntAttribute("amount"); ItemReq itemReq; itemReq.init(ft->getItemType(name), value, scope); itemReqs.push_back(itemReq); } } } catch (runtime_error e) { g_logger.logXmlError(dir, e.what ()); loadOk = false; } try { // Upgrade requirements const XmlNode *upgradeRequirementsNode = baseNode->getChild("upgrade-requirements", 0, false); if(upgradeRequirementsNode) { for(int i = 0; i < upgradeRequirementsNode->getChildCount(); ++i) { const XmlNode *upgradeReqNode = upgradeRequirementsNode->getChild("upgrade", i); string name = upgradeReqNode->getRestrictedAttribute("name"); int stage = upgradeReqNode->getIntAttribute("value"); UpgradeReq upgradeReq; upgradeReq.init(ft->getUpgradeType(name), stage); upgradeReqs.push_back(upgradeReq); } } } catch (runtime_error e) { g_logger.logXmlError(dir, e.what ()); loadOk = false; } try { // Resource requirements const XmlNode *resourceRequirementsNode = baseNode->getChild("resource-requirements", 0, false); if(resourceRequirementsNode) { resourceReqs.resize(resourceRequirementsNode->getChildCount()); for(int i = 0; i < resourceRequirementsNode->getChildCount(); ++i) { const XmlNode *resourceNode = resourceRequirementsNode->getChild("resource", i); string name = resourceNode->getAttribute("name")->getRestrictedValue(); int amount = resourceNode->getAttribute("amount")->getIntValue(); int amount_plus = resourceNode->getAttribute("plus")->getIntValue(); fixed amount_multiply = resourceNode->getAttribute("multiply")->getFixedValue(); resourceReqs[i].init(tt->getResourceType(name), amount, amount_plus, amount_multiply); } } } catch (runtime_error e) { g_logger.logXmlError(dir, e.what ()); loadOk = false; } return loadOk; }