diff options
author | Jared Adams <jaxad0127@gmail.com> | 2010-07-17 23:10:05 -0600 |
---|---|---|
committer | Jared Adams <jaxad0127@gmail.com> | 2010-07-18 11:45:33 -0600 |
commit | 81d8168bb5796ccb1704bcce9f5327c35e55d281 (patch) | |
tree | 3e7e111eb956757f49579bb4366c24c94712387d /src/playerinfo.cpp | |
parent | 2ae96bdc5517b2147662f19ff6d700657c0d0d42 (diff) | |
download | mana-81d8168bb5796ccb1704bcce9f5327c35e55d281.tar.gz mana-81d8168bb5796ccb1704bcce9f5327c35e55d281.tar.bz2 mana-81d8168bb5796ccb1704bcce9f5327c35e55d281.tar.xz mana-81d8168bb5796ccb1704bcce9f5327c35e55d281.zip |
Move more from LocalPlayer to PlayerInfo
Also cleanup PlayerInfo a bit.
Reviewed-by: Chuck Miller
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 |