void CharacterCore::addModifier(const SpellModifier& modifier, int slotNr, int modifierNr) { Weapon* wep = dynamic_cast<Weapon*>(m_equippedItems.at(ItemType::Equipment_weapon)); if (wep == nullptr) return; if (wep->addModifier(slotNr, modifierNr, modifier, true)) { // check if this spell slot exists. If not, fill the slots if (m_data.equippedWeaponSlots.size() < slotNr + 1) { for (size_t i = m_data.equippedWeaponSlots.size(); i < slotNr + 1; ++i) { std::pair<SpellID, std::vector<SpellModifier>> newSlot; newSlot.first = SpellID::VOID; m_data.equippedWeaponSlots.push_back(newSlot); } } std::pair<SpellID, std::vector<SpellModifier>>& slot = m_data.equippedWeaponSlots.at(slotNr); // check if this modifier slot exist if (slot.second.size() < modifierNr + 1) { g_logger->logInfo("CharacterCore", "Adding empty modifier slots slots to the weapon!"); for (size_t i = slot.second.size(); i < modifierNr + 1; ++i) { slot.second.push_back(EMPTY_SPELLMODIFIER); } } for (auto& it : slot.second) { if (it.type == modifier.type) { it.type = SpellModifierType::VOID;; } } // add the modifier slot.second[modifierNr] = modifier; } reloadWeaponSlots(); }
void CharacterCore::loadEquipmentItems() { clearEquippedItems(); Weapon* eqWeapon = nullptr; Item* eqBack = nullptr; Item* eqBody = nullptr; Item* eqHead = nullptr; Item* eqNeck = nullptr; Item* eqRing1 = nullptr; Item* eqRing2 = nullptr; if (!m_data.equippedWeapon.empty() && g_resourceManager->getItemBean(m_data.equippedWeapon) != nullptr) { eqWeapon = new Weapon(*g_resourceManager->getItemBean(m_data.equippedWeapon)); // add equipped spells and their modifiers for (int slot = 0; slot < m_data.equippedWeaponSlots.size(); slot++) { eqWeapon->addSpell(slot, m_data.equippedWeaponSlots[slot].first, false); for (auto& it : m_data.equippedWeaponSlots[slot].second) { eqWeapon->addModifier(slot, it, false); } } } if (!m_data.equippedBack.empty() && g_resourceManager->getItemBean(m_data.equippedBack) != nullptr) { eqBack = new Item(*g_resourceManager->getItemBean(m_data.equippedBack)); } if (!m_data.equippedBody.empty() && g_resourceManager->getItemBean(m_data.equippedBody) != nullptr) { eqBody = new Item(*g_resourceManager->getItemBean(m_data.equippedBody)); } if (!m_data.equippedHead.empty() && g_resourceManager->getItemBean(m_data.equippedHead) != nullptr) { eqHead = new Item(*g_resourceManager->getItemBean(m_data.equippedHead)); } if (!m_data.equippedNeck.empty() && g_resourceManager->getItemBean(m_data.equippedNeck) != nullptr) { eqNeck = new Item(*g_resourceManager->getItemBean(m_data.equippedNeck)); } if (!m_data.equippedRing1.empty() && g_resourceManager->getItemBean(m_data.equippedRing1) != nullptr) { eqRing1 = new Item(*g_resourceManager->getItemBean(m_data.equippedRing1)); } if (!m_data.equippedRing2.empty() && g_resourceManager->getItemBean(m_data.equippedRing2) != nullptr) { eqRing2 = new Item(*g_resourceManager->getItemBean(m_data.equippedRing2)); } m_equippedItems.insert({ ItemType::Equipment_weapon, eqWeapon }); m_equippedItems.insert({ ItemType::Equipment_back, eqBack }); m_equippedItems.insert({ ItemType::Equipment_body, eqBody }); m_equippedItems.insert({ ItemType::Equipment_head, eqHead }); m_equippedItems.insert({ ItemType::Equipment_neck, eqNeck }); m_equippedItems.insert({ ItemType::Equipment_ring_1, eqRing1 }); m_equippedItems.insert({ ItemType::Equipment_ring_2, eqRing2 }); }
void CharacterCore::reloadWeaponSlots() { Weapon* wep = dynamic_cast<Weapon*>(m_equippedItems.at(ItemType::Equipment_weapon)); if (wep == nullptr) return; wep->reload(); for (int slot = 0; slot < m_data.equippedWeaponSlots.size(); slot++) { wep->addSpell(slot, m_data.equippedWeaponSlots[slot].first, false); for (int i = 0; i < m_data.equippedWeaponSlots[slot].second.size(); ++i) { wep->addModifier(slot, i, m_data.equippedWeaponSlots[slot].second[i], false); } } }
void CharacterCore::addModifier(const SpellModifier& modifier, int slotNr) { Weapon* wep = dynamic_cast<Weapon*>(m_equippedItems.at(ItemType::Equipment_weapon)); if (wep == nullptr) return; if (wep->addModifier(slotNr, modifier, true)) { std::pair<SpellID, std::vector<SpellModifier>>& slot = m_data.equippedWeaponSlots.at(slotNr); // check if this type already exists. if yes, remove it. for (auto& it = slot.second.begin(); it != slot.second.end(); /* don't increment here */) { if (it->type == modifier.type) { it = slot.second.erase(it); } else ++it; } slot.second.push_back(modifier); } reloadWeaponSlots(); }