Esempio n. 1
0
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;
}