diff options
Diffstat (limited to 'src/playerinfo.cpp')
-rw-r--r-- | src/playerinfo.cpp | 223 |
1 files changed, 194 insertions, 29 deletions
diff --git a/src/playerinfo.cpp b/src/playerinfo.cpp index 203c26cc..e63db6cf 100644 --- a/src/playerinfo.cpp +++ b/src/playerinfo.cpp @@ -20,19 +20,59 @@ #include "playerinfo.h" +#include "client.h" +#include "equipment.h" #include "event.h" #include "eventmanager.h" +#include "inventory.h" +#include "listener.h" +#include "log.h" -PlayerInfoBackend PlayerInfo::mData; +#include "resources/itemdb.h" +#include "resources/iteminfo.h" -void PlayerInfo::setBackend(const PlayerInfoBackend &backend) +namespace PlayerInfo { + +class PlayerInfoListener; + +PlayerInfoListener *mListener = 0; + +PlayerInfoBackend mData; + +Inventory *mInventory = 0; +Equipment *mEquipment = 0; + +std::map<int, Special> mSpecials; +char mSpecialRechargeUpdateNeeded = 0; + +bool mTrading = false; +int mLevelProgress = 0; + +// --- Triggers --------------------------------------------------------------- + +void triggerAttr(int id) { - mData = backend; + Mana::Event event("UpdateAttribute"); + event.setInt("id", id); + event.setInt("value", mData.mAttributes.find(id)->second); + Mana::EventManager::trigger("Attributes", event); } -// ------------------------------- Attributes -------------------------------------- +void triggerStat(int id) +{ + StatMap::iterator it = mData.mStats.find(id); + Mana::Event event("UpdateStat"); + event.setInt("id", id); + event.setInt("base", it->second.base); + event.setInt("mod", it->second.mod); + event.setInt("exp", it->second.exp); + event.setInt("expneeded", it->second.expneed); + Mana::EventManager::trigger("Attributes", event); +} -int PlayerInfo::getAttribute(int id) +// --- Attributes ------------------------------------------------------------- + +int getAttribute(int id) { IntMap::const_iterator it = mData.mAttributes.find(id); if (it != mData.mAttributes.end()) @@ -41,16 +81,16 @@ int PlayerInfo::getAttribute(int id) return 0; } -void PlayerInfo::setAttribute(int id, int value, bool notify) +void setAttribute(int id, int value, bool notify) { mData.mAttributes[id] = value; if (notify) triggerAttr(id); } -// ------------------------------- Stats -------------------------------------- +// --- Stats ------------------------------------------------------------------ -int PlayerInfo::getStatBase(int id) +int getStatBase(int id) { StatMap::const_iterator it = mData.mStats.find(id); if (it != mData.mStats.end()) @@ -59,14 +99,14 @@ int PlayerInfo::getStatBase(int id) return 0; } -void PlayerInfo::setStatBase(int id, int value, bool notify) +void setStatBase(int id, int value, bool notify) { mData.mStats[id].base = value; if (notify) triggerStat(id); } -int PlayerInfo::getStatMod(int id) +int getStatMod(int id) { StatMap::const_iterator it = mData.mStats.find(id); @@ -76,14 +116,14 @@ int PlayerInfo::getStatMod(int id) return 0; } -void PlayerInfo::setStatMod(int id, int value, bool notify) +void setStatMod(int id, int value, bool notify) { mData.mStats[id].mod = value; if (notify) triggerStat(id); } -int PlayerInfo::getStatEffective(int id) +int getStatEffective(int id) { StatMap::const_iterator it = mData.mStats.find(id); if (it != mData.mStats.end()) @@ -92,7 +132,7 @@ int PlayerInfo::getStatEffective(int id) return 0; } -std::pair<int, int> PlayerInfo::getStatExperience(int id) +std::pair<int, int> getStatExperience(int id) { StatMap::const_iterator it = mData.mStats.find(id); int a, b; @@ -109,7 +149,7 @@ std::pair<int, int> PlayerInfo::getStatExperience(int id) return std::pair<int, int>(a, b); } -void PlayerInfo::setStatExperience(int id, int have, int need, bool notify) +void setStatExperience(int id, int have, int need, bool notify) { mData.mStats[id].exp = have; mData.mStats[id].expneed = need; @@ -117,24 +157,149 @@ void PlayerInfo::setStatExperience(int id, int have, int need, bool notify) triggerStat(id); } -// ------------------------------- Triggers -------------------------------------- +// --- Inventory / Equipment -------------------------------------------------- -void PlayerInfo::triggerAttr(int id) +Inventory *getInventory() { - Mana::Event event("UpdateAttribute"); - event.setInt("id", id); - event.setInt("value", mData.mAttributes.find(id)->second); - Mana::EventManager::trigger("Attributes", event); + return mInventory; } -void PlayerInfo::triggerStat(int id) +void clearInventory() { - StatMap::iterator it = mData.mStats.find(id); - Mana::Event event("UpdateStat"); - event.setInt("id", id); - event.setInt("base", it->second.base); - event.setInt("mod", it->second.mod); - event.setInt("exp", it->second.exp); - event.setInt("expneeded", it->second.expneed); - Mana::EventManager::trigger("Attributes", event); + mEquipment->clear(); + mInventory->clear(); +} + +void setInventoryItem(int index, int id, int amount) +{ + bool equipment = false; + int itemType = ItemDB::get(id).getType(); + if (itemType != ITEM_UNUSABLE && itemType != ITEM_USABLE) + equipment = true; + mInventory->setItem(index, id, amount, equipment); +} + +Equipment *getEquipment() +{ + return mEquipment; +} + +Item *getEquipment(unsigned int slot) +{ + return mEquipment->getEquipment(slot); } + +void setEquipmentBackend(Equipment::Backend *backend) +{ + mEquipment->setBackend(backend); +} + +// --- Specials --------------------------------------------------------------- + +void setSpecialStatus(int id, int current, int max, int recharge) +{ + logger->log("SpecialUpdate Skill #%d -- (%d/%d) -> %d", id, current, max, + recharge); + mSpecials[id].currentMana = current; + mSpecials[id].neededMana = max; + mSpecials[id].recharge = recharge; +} + +const SpecialsMap &getSpecialStatus() +{ + return mSpecials; +} + +// --- Misc ------------------------------------------------------------------- + +void setBackend(const PlayerInfoBackend &backend) +{ + mData = backend; +} + +void logic() +{ + if ((mSpecialRechargeUpdateNeeded%11) == 0) + { + mSpecialRechargeUpdateNeeded = 0; + for (SpecialsMap::iterator it = mSpecials.begin(), + it_end = mSpecials.end(); it != it_end; it++) + { + it->second.currentMana += it->second.recharge; + if (it->second.currentMana > it->second.neededMana) + { + it->second.currentMana = it->second.neededMana; + } + } + } + mSpecialRechargeUpdateNeeded++; +} + +bool isTrading() +{ + return mTrading; +} + +void setTrading(bool trading) +{ + bool notify = mTrading != trading; + mTrading = trading; + + if (notify) + { + Mana::Event event("Trading"); + event.setInt("trading", trading); + Mana::EventManager::trigger("Status", event); + } +} + +class PlayerInfoListener : Mana::Listener +{ +public: + PlayerInfoListener() + { + listen("Client"); + listen("Game"); + } + + void event(const std::string &channel, const Mana::Event &event) + { + if (channel == "Client") + { + if (event.getName() == "StateChange") + { + int newState = event.getInt("newState"); + + if (newState == STATE_GAME) + { + if (mInventory == 0) + { + mInventory = new Inventory(Inventory::INVENTORY); + mEquipment = new Equipment(); + } + } + } + } + else if (channel == "Game") + { + if (event.getName() == "Destructed") + { + delete mInventory; + delete mEquipment; + + mInventory = 0; + mEquipment = 0; + } + } + } +}; + +void init() +{ + if (mListener) + return; + + mListener = new PlayerInfoListener(); +} + +} // namespace PlayerInfo |