bool Weapon::configureEvent(const pugi::xml_node& node) { pugi::xml_attribute attr; if (!(attr = node.attribute("id"))) { std::cout << "[Error - Weapon::configureEvent] Weapon without id." << std::endl; return false; } id = pugi::cast<uint16_t>(attr.value()); if ((attr = node.attribute("level"))) { level = pugi::cast<uint32_t>(attr.value()); } if ((attr = node.attribute("maglv")) || (attr = node.attribute("maglevel"))) { magLevel = pugi::cast<uint32_t>(attr.value()); } if ((attr = node.attribute("mana"))) { mana = pugi::cast<uint32_t>(attr.value()); } if ((attr = node.attribute("manapercent"))) { manaPercent = pugi::cast<uint32_t>(attr.value()); } if ((attr = node.attribute("soul"))) { soul = pugi::cast<uint32_t>(attr.value()); } if ((attr = node.attribute("prem"))) { premium = attr.as_bool(); } if ((attr = node.attribute("breakchance"))) { breakChance = std::min<uint8_t>(100, pugi::cast<uint16_t>(attr.value())); } if ((attr = node.attribute("action"))) { action = getWeaponAction(attr.as_string()); if (action == WEAPONACTION_NONE) { std::cout << "[Warning - Weapon::configureEvent] Unknown action " << attr.as_string() << std::endl; } } if ((attr = node.attribute("enabled"))) { enabled = attr.as_bool(); } if ((attr = node.attribute("unproperly"))) { wieldUnproperly = attr.as_bool(); } std::list<std::string> vocStringList; for (pugi::xml_node vocationNode = node.first_child(); vocationNode; vocationNode = vocationNode.next_sibling()) { if (!(attr = vocationNode.attribute("name"))) { continue; } int32_t vocationId = g_vocations.getVocationId(attr.as_string()); if (vocationId != -1) { vocWeaponMap[vocationId] = true; int32_t promotedVocation = g_vocations.getPromotedVocation(vocationId); if (promotedVocation != 0) { vocWeaponMap[promotedVocation] = true; } if (vocationNode.attribute("showInDescription").as_bool(true)) { vocStringList.push_back(asLowerCaseString(attr.as_string())); } } } range = Item::items[id].shootRange; std::string vocationString; for (const std::string& str : vocStringList) { if (!vocationString.empty()) { if (str != vocStringList.back()) { vocationString.push_back(','); vocationString.push_back(' '); } else { vocationString += " and "; } } vocationString += str; vocationString.push_back('s'); } uint32_t wieldInfo = 0; if (getReqLevel() > 0) { wieldInfo |= WIELDINFO_LEVEL; } if (getReqMagLv() > 0) { wieldInfo |= WIELDINFO_MAGLV; } if (!vocationString.empty()) { wieldInfo |= WIELDINFO_VOCREQ; } if (isPremium()) { wieldInfo |= WIELDINFO_PREMIUM; } if (wieldInfo != 0) { ItemType& it = Item::items.getItemType(id); it.wieldInfo = wieldInfo; it.vocationString = vocationString; it.minReqLevel = getReqLevel(); it.minReqMagicLevel = getReqMagLv(); } configureWeapon(Item::items[id]); return true; }
bool Weapon::configureEvent(xmlNodePtr p) { int32_t intValue; std::string strValue; if (readXMLInteger(p, "id", intValue)) { id = intValue; } else { std::cout << "Error: [Weapon::configureEvent] Weapon without id." << std::endl; return false; } if (readXMLInteger(p, "lvl", intValue) || readXMLInteger(p, "level", intValue)) { level = intValue; } if (readXMLInteger(p, "maglv", intValue) || readXMLInteger(p, "maglevel", intValue)) { magLevel = intValue; } if (readXMLInteger(p, "mana", intValue)) { mana = intValue; } if (readXMLInteger(p, "manapercent", intValue)) { manaPercent = intValue; } if (readXMLInteger(p, "soul", intValue)) { soul = intValue; } if (readXMLInteger(p, "exhaustion", intValue)) { exhaustion = intValue; } if (readXMLInteger(p, "prem", intValue)) { premium = (intValue == 1); } if (readXMLInteger(p, "enabled", intValue)) { enabled = (intValue == 1); } if (readXMLInteger(p, "unproperly", intValue)) { wieldUnproperly = (intValue == 1); } if (readXMLString(p, "ammo", strValue)) { std::cout << "Warning: ammo is not longer used in weapons.xml." << std::endl; } typedef std::list<std::string> STRING_LIST; STRING_LIST vocStringList; xmlNodePtr vocationNode = p->children; while (vocationNode) { if (xmlStrcmp(vocationNode->name, (const xmlChar*)"vocation") == 0) { if (readXMLString(vocationNode, "name", strValue)) { int32_t vocationId = g_vocations.getVocationId(strValue); if (vocationId != -1) { vocWeaponMap[vocationId] = true; int32_t promotedVocation = g_vocations.getPromotedVocation(vocationId); if (promotedVocation != 0) { vocWeaponMap[promotedVocation] = true; } readXMLInteger(vocationNode, "showInDescription", intValue); if (intValue != 0) { toLowerCaseString(strValue); vocStringList.push_back(strValue); } } } } vocationNode = vocationNode->next; } range = Item::items[id].shootRange; std::string vocationString; if (!vocStringList.empty()) { for (STRING_LIST::iterator it = vocStringList.begin(); it != vocStringList.end(); ++it) { if (*it != vocStringList.front()) { if (*it != vocStringList.back()) { vocationString += ", "; } else { vocationString += " and "; } } vocationString += *it; vocationString += "s"; } } uint32_t wieldInfo = 0; if (getReqLevel() > 0) { wieldInfo |= WIELDINFO_LEVEL; } if (getReqMagLv() > 0) { wieldInfo |= WIELDINFO_MAGLV; } if (!vocationString.empty()) { wieldInfo |= WIELDINFO_VOCREQ; } if (isPremium()) { wieldInfo |= WIELDINFO_PREMIUM; } if (wieldInfo != 0) { ItemType& it = Item::items.getItemType(id); it.wieldInfo = wieldInfo; it.vocationString = vocationString; it.minReqLevel = getReqLevel(); it.minReqMagicLevel = getReqMagLv(); } if (configureWeapon(Item::items[getID()])) { return true; } return false; }