summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mana.files17
-rw-r--r--src/client.cpp12
-rw-r--r--src/game.cpp12
-rw-r--r--src/gui/outfitwindow.cpp12
-rw-r--r--src/gui/specialswindow.cpp2
-rw-r--r--src/gui/specialswindow.h2
-rw-r--r--src/gui/trade.cpp2
-rw-r--r--src/gui/widgets/itemshortcutcontainer.cpp10
-rw-r--r--src/itemshortcut.cpp4
-rw-r--r--src/localplayer.cpp60
-rw-r--r--src/localplayer.h52
-rw-r--r--src/net/manaserv/inventoryhandler.cpp10
-rw-r--r--src/net/manaserv/playerhandler.cpp2
-rw-r--r--src/net/manaserv/tradehandler.cpp9
-rw-r--r--src/net/tmwa/buysellhandler.cpp2
-rw-r--r--src/net/tmwa/inventoryhandler.cpp4
-rw-r--r--src/net/tmwa/inventoryhandler.h10
-rw-r--r--src/net/tmwa/tradehandler.cpp15
-rw-r--r--src/playerinfo.cpp223
-rw-r--r--src/playerinfo.h192
20 files changed, 432 insertions, 220 deletions
diff --git a/mana.files b/mana.files
index 966e871e..42b79487 100644
--- a/mana.files
+++ b/mana.files
@@ -12,6 +12,9 @@
./data/graphics/images/CMakeLists.txt
./data/graphics/images/Makefile.am
./data/graphics/Makefile.am
+./data/graphics/sprites/CMakeLists.txt
+./data/graphics/sprites/error.xml
+./data/graphics/sprites/Makefile.am
./data/help/about.txt
./data/help/changes.txt
./data/help/CMakeLists.txt
@@ -74,6 +77,10 @@
./src/emoteshortcut.cpp
./src/emoteshortcut.h
./src/equipment.h
+./src/event.cpp
+./src/event.h
+./src/eventmanager.cpp
+./src/eventmanager.h
./src/flooritem.cpp
./src/flooritem.h
./src/game.cpp
@@ -302,6 +309,8 @@
./src/joystick.h
./src/keyboardconfig.cpp
./src/keyboardconfig.h
+./src/listener.cpp
+./src/listener.h
./src/localplayer.cpp
./src/localplayer.h
./src/log.cpp
@@ -335,6 +344,7 @@
./src/net/manaserv/chathandler.h
./src/net/manaserv/connection.cpp
./src/net/manaserv/connection.h
+./src/net/manaserv/defines.h
./src/net/manaserv/effecthandler.cpp
./src/net/manaserv/effecthandler.h
./src/net/manaserv/gamehandler.cpp
@@ -443,6 +453,8 @@
./src/particle.h
./src/party.cpp
./src/party.h
+./src/playerinfo.cpp
+./src/playerinfo.h
./src/playerrelations.cpp
./src/playerrelations.h
./src/position.cpp
@@ -490,6 +502,8 @@
./src/resources/resourcemanager.h
./src/resources/soundeffect.cpp
./src/resources/soundeffect.h
+./src/resources/specialdb.cpp
+./src/resources/specialdb.h
./src/resources/spritedef.cpp
./src/resources/spritedef.h
./src/resources/wallpaper.cpp
@@ -534,9 +548,12 @@
./src/utils/stringutils.h
./src/utils/xml.cpp
./src/utils/xml.h
+./src/variabledata.h
./src/vector.cpp
./src/vector.h
./src/winver.h
+./tools/dyecmd/CMakeLists.txt
+./tools/dyecmd/src/CMakeLists.txt
./tools/dyecmd/src/dyecmd.cpp
./tools/dyecmd/src/dye.cpp
./tools/dyecmd/src/dye.h
diff --git a/src/client.cpp b/src/client.cpp
index ea35f76d..a2f70900 100644
--- a/src/client.cpp
+++ b/src/client.cpp
@@ -25,6 +25,8 @@
#include "chatlog.h"
#include "configuration.h"
#include "emoteshortcut.h"
+#include "event.h"
+#include "eventmanager.h"
#include "game.h"
#include "itemshortcut.h"
#include "keyboardconfig.h"
@@ -427,6 +429,9 @@ Client::Client(const Options &options):
SDL_initFramerate(&mFpsManager);
config.addListener("fpslimit", this);
optionChanged("fpslimit");
+
+ // Initialize PlayerInfo
+ PlayerInfo::init();
}
Client::~Client()
@@ -587,6 +592,13 @@ int Client::exec()
if (mState != mOldState)
{
+ {
+ Mana::Event event("StateChange");
+ event.setInt("oldState", mOldState);
+ event.setInt("newState", mState);
+ Mana::EventManager::trigger("Client", event);
+ }
+
Net::GeneralHandler *generalHandler = Net::getGeneralHandler();
if (generalHandler)
generalHandler->stateChanged(mOldState, mState);
diff --git a/src/game.cpp b/src/game.cpp
index c867bda9..4d101fd5 100644
--- a/src/game.cpp
+++ b/src/game.cpp
@@ -28,6 +28,8 @@
#include "commandhandler.h"
#include "configuration.h"
#include "effectmanager.h"
+#include "event.h"
+#include "eventmanager.h"
#include "emoteshortcut.h"
#include "graphics.h"
#include "itemshortcut.h"
@@ -147,10 +149,10 @@ static void createGuiWindows()
// Create dialogs
chatWindow = new ChatWindow;
tradeWindow = new TradeWindow;
- equipmentWindow = new EquipmentWindow(player_node->mEquipment.get());
+ equipmentWindow = new EquipmentWindow(PlayerInfo::getEquipment());
statusWindow = new StatusWindow;
miniStatusWindow = new MiniStatusWindow;
- inventoryWindow = new InventoryWindow(player_node->getInventory());
+ inventoryWindow = new InventoryWindow(PlayerInfo::getInventory());
skillDialog = new SkillDialog;
minimap = new Minimap;
helpWindow = new HelpWindow;
@@ -250,6 +252,9 @@ Game::Game():
joystick = new Joystick(0);
setupWindow->setInGame(true);
+
+ Mana::Event event("Constructed");
+ Mana::EventManager::trigger("Game", event);
}
Game::~Game()
@@ -269,6 +274,9 @@ Game::~Game()
del_0(mCurrentMap)
mInstance = 0;
+
+ Mana::Event event("Destructed");
+ Mana::EventManager::trigger("Game", event);
}
static bool saveScreenshot()
diff --git a/src/gui/outfitwindow.cpp b/src/gui/outfitwindow.cpp
index 89bf47da..51b4b5c5 100644
--- a/src/gui/outfitwindow.cpp
+++ b/src/gui/outfitwindow.cpp
@@ -22,12 +22,12 @@
#include "outfitwindow.h"
#include "configuration.h"
-#include "localplayer.h"
+#include "equipment.h"
#include "graphics.h"
#include "inventory.h"
-#include "equipment.h"
#include "item.h"
#include "log.h"
+#include "playerinfo.h"
#include "gui/chat.h"
@@ -168,7 +168,7 @@ void OutfitWindow::wearOutfit(int outfit)
Item *item;
for (int i = 0; i < OUTFIT_ITEM_COUNT; i++)
{
- item = player_node->getInventory()->findItem(mItems[outfit][i]);
+ item = PlayerInfo::getInventory()->findItem(mItems[outfit][i]);
if (item && !item->isEquipped() && item->getQuantity())
{
if (item->isEquipment())
@@ -206,7 +206,7 @@ void OutfitWindow::draw(gcn::Graphics *graphics)
}
Item *item =
- player_node->getInventory()->findItem(mItems[mCurrentOutfit][i]);
+ PlayerInfo::getInventory()->findItem(mItems[mCurrentOutfit][i]);
if (item)
{
// Draw item icon.
@@ -245,7 +245,7 @@ void OutfitWindow::mouseDragged(gcn::MouseEvent &event)
const int itemId = mItems[mCurrentOutfit][index];
if (itemId < 0)
return;
- Item *item = player_node->getInventory()->findItem(itemId);
+ Item *item = PlayerInfo::getInventory()->findItem(itemId);
if (item)
{
mItemMoved = item;
@@ -319,7 +319,7 @@ int OutfitWindow::getIndexFromGrid(int pointX, int pointY) const
void OutfitWindow::unequipNotInOutfit(int outfit)
{
- Inventory *inventory = player_node->getInventory();
+ Inventory *inventory = PlayerInfo::getInventory();
if (!inventory)
return;
diff --git a/src/gui/specialswindow.cpp b/src/gui/specialswindow.cpp
index 4f9a9652..c751d6cb 100644
--- a/src/gui/specialswindow.cpp
+++ b/src/gui/specialswindow.cpp
@@ -123,7 +123,7 @@ void SpecialsWindow::action(const gcn::ActionEvent &event)
void SpecialsWindow::draw(gcn::Graphics *graphics)
{
// update the progress bars
- std::map<int, Special> specialData = player_node->getSpecialStatus();
+ std::map<int, Special> specialData = PlayerInfo::getSpecialStatus();
bool foundNew = false;
unsigned int found = 0; // number of entries in specialData which match mEntries
diff --git a/src/gui/specialswindow.h b/src/gui/specialswindow.h
index 634727e5..85abe3a4 100644
--- a/src/gui/specialswindow.h
+++ b/src/gui/specialswindow.h
@@ -25,7 +25,7 @@
#include "guichanfwd.h"
-#include "localplayer.h"
+#include "playerinfo.h"
#include "gui/widgets/window.h"
diff --git a/src/gui/trade.cpp b/src/gui/trade.cpp
index d500999e..4a86c235 100644
--- a/src/gui/trade.cpp
+++ b/src/gui/trade.cpp
@@ -286,7 +286,7 @@ void TradeWindow::action(const gcn::ActionEvent &event)
{
setVisible(false);
reset();
- player_node->setTrading(false);
+ PlayerInfo::setTrading(false);
Net::getTradeHandler()->cancel();
}
diff --git a/src/gui/widgets/itemshortcutcontainer.cpp b/src/gui/widgets/itemshortcutcontainer.cpp
index 83efd4d4..b3cefc5f 100644
--- a/src/gui/widgets/itemshortcutcontainer.cpp
+++ b/src/gui/widgets/itemshortcutcontainer.cpp
@@ -27,7 +27,7 @@
#include "item.h"
#include "itemshortcut.h"
#include "keyboardconfig.h"
-#include "localplayer.h"
+#include "playerinfo.h"
#include "gui/inventorywindow.h"
#include "gui/itempopup.h"
@@ -94,7 +94,7 @@ void ItemShortcutContainer::draw(gcn::Graphics *graphics)
continue;
Item *item =
- player_node->getInventory()->findItem(itemShortcut->getItem(i));
+ PlayerInfo::getInventory()->findItem(itemShortcut->getItem(i));
if (item)
{
@@ -151,7 +151,7 @@ void ItemShortcutContainer::mouseDragged(gcn::MouseEvent &event)
if (itemId < 0)
return;
- Item *item = player_node->getInventory()->findItem(itemId);
+ Item *item = PlayerInfo::getInventory()->findItem(itemId);
if (item)
{
@@ -187,7 +187,7 @@ void ItemShortcutContainer::mousePressed(gcn::MouseEvent &event)
}
else if (event.getButton() == gcn::MouseEvent::RIGHT)
{
- Item *item = player_node->getInventory()->
+ Item *item = PlayerInfo::getInventory()->
findItem(itemShortcut->getItem(index));
if (!item)
@@ -240,7 +240,7 @@ void ItemShortcutContainer::mouseMoved(gcn::MouseEvent &event)
if (itemId < 0)
return;
- Item *item = player_node->getInventory()->findItem(itemId);
+ Item *item = PlayerInfo::getInventory()->findItem(itemId);
if (item)
{
diff --git a/src/itemshortcut.cpp b/src/itemshortcut.cpp
index 88b04347..064fdbc6 100644
--- a/src/itemshortcut.cpp
+++ b/src/itemshortcut.cpp
@@ -23,7 +23,7 @@
#include "inventory.h"
#include "item.h"
#include "itemshortcut.h"
-#include "localplayer.h"
+#include "playerinfo.h"
#include "net/inventoryhandler.h"
#include "net/net.h"
@@ -66,7 +66,7 @@ void ItemShortcut::useItem(int index)
{
if (mItems[index])
{
- Item *item = player_node->getInventory()->findItem(mItems[index]);
+ Item *item = PlayerInfo::getInventory()->findItem(mItems[index]);
if (item && item->getQuantity())
{
if (item->isEquipment())
diff --git a/src/localplayer.cpp b/src/localplayer.cpp
index 511b5ed6..b2061643 100644
--- a/src/localplayer.cpp
+++ b/src/localplayer.cpp
@@ -24,22 +24,20 @@
#include "client.h"
#include "configuration.h"
#include "effectmanager.h"
-#include "equipment.h"
#include "flooritem.h"
#include "graphics.h"
#include "guild.h"
-#include "inventory.h"
#include "item.h"
#include "log.h"
#include "map.h"
#include "particle.h"
+#include "playerinfo.h"
#include "simpleanimation.h"
#include "sound.h"
#include "statuseffect.h"
#include "text.h"
#include "gui/gui.h"
-#include "gui/inventorywindow.h"
#include "gui/ministatus.h"
#include "gui/okdialog.h"
#include "gui/skilldialog.h"
@@ -59,7 +57,6 @@
#include "resources/animation.h"
#include "resources/imageset.h"
-#include "resources/itemdb.h"
#include "resources/iteminfo.h"
#include "resources/resourcemanager.h"
@@ -79,19 +76,16 @@ LocalPlayer *player_node = NULL;
LocalPlayer::LocalPlayer(int id, int subtype):
Being(id, PLAYER, subtype, 0),
- mEquipment(new Equipment),
mAttackRange(0),
mTargetTime(-1),
mLastTarget(-1),
- mSpecialRechargeUpdateNeeded(0),
mTarget(NULL),
mPlayerFollowed(""),
mPickUpTarget(NULL),
- mTrading(false), mGoingToTarget(false), mKeepAttacking(false),
+ mGoingToTarget(false), mKeepAttacking(false),
mLastAction(-1),
mWalkingDir(0),
mPathSetByMouse(false),
- mInventory(new Inventory(Inventory::INVENTORY)),
mLocalWalkTime(-1),
mMessageTime(0),
mAwayDialog(0),
@@ -108,8 +102,6 @@ LocalPlayer::LocalPlayer(int id, int subtype):
LocalPlayer::~LocalPlayer()
{
- delete mInventory;
-
config.removeListener("showownname", this);
delete mAwayDialog;
@@ -146,21 +138,7 @@ void LocalPlayer::logic()
mMessageTime--;
}
- if ((mSpecialRechargeUpdateNeeded%11) == 0)
- {
- mSpecialRechargeUpdateNeeded = 0;
- for (std::map<int, Special>::iterator i = mSpecials.begin();
- i != mSpecials.end();
- i++)
- {
- i->second.currentMana += i->second.recharge;
- if (i->second.currentMana > i->second.neededMana)
- {
- i->second.currentMana = i->second.neededMana;
- }
- }
- }
- mSpecialRechargeUpdateNeeded++;
+ PlayerInfo::logic();
// Targeting allowed 4 times a second
if (get_elapsed_time(mLastTarget) >= 250)
@@ -659,21 +637,6 @@ void LocalPlayer::inviteToGuild(Being *being)
}
}
-void LocalPlayer::clearInventory()
-{
- mEquipment->clear();
- mInventory->clear();
-}
-
-void LocalPlayer::setInvItem(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);
-}
-
void LocalPlayer::pickUp(FloorItem *item)
{
if (!item)
@@ -927,20 +890,6 @@ void LocalPlayer::emote(Uint8 emotion)
Net::getPlayerHandler()->emote(emotion);
}
-void LocalPlayer::useSpecial(int special)
-{
- Net::getSpecialHandler()->use(special);
-}
-
-void LocalPlayer::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;
-}
-
void LocalPlayer::attack(Being *target, bool keep)
{
if (Net::getNetworkType() == ServerInfo::MANASERV)
@@ -1081,7 +1030,8 @@ int LocalPlayer::getAttackRange()
}
else
{
- Item *weapon = mEquipment->getEquipment(EQUIP_FIGHT1_SLOT);
+ // TODO: Fix this to be more generic
+ Item *weapon = PlayerInfo::getEquipment(EQUIP_FIGHT1_SLOT);
if (weapon)
{
const ItemInfo info = weapon->getInfo();
diff --git a/src/localplayer.h b/src/localplayer.h
index e42e305f..2bcf90f8 100644
--- a/src/localplayer.h
+++ b/src/localplayer.h
@@ -33,22 +33,12 @@
#include <vector>
class ChatTab;
-class Equipment;
class FloorItem;
class ImageSet;
-class Inventory;
class Item;
class Map;
class OkDialog;
-
-struct Special
-{
- int currentMana;
- int neededMana;
- int recharge;
-};
-
class AwayListener : public gcn::ActionListener
{
public:
@@ -93,11 +83,6 @@ class LocalPlayer : public Being, public ActorSpriteListener
virtual void nextTile(unsigned char dir);
/**
- * Returns the player's inventory.
- */
- Inventory *getInventory() const { return mInventory; }
-
- /**
* Check the player has permission to invite users to specific guild
*/
bool checkInviteRights(const std::string &guildName);
@@ -107,9 +92,6 @@ class LocalPlayer : public Being, public ActorSpriteListener
*/
void inviteToGuild(Being *being);
- void clearInventory();
- void setInvItem(int index, int id, int amount);
-
void pickUp(FloorItem *item);
/**
@@ -127,26 +109,6 @@ class LocalPlayer : public Being, public ActorSpriteListener
* Gets the attack range.
*/
int getAttackRange();
-
- /**
- * Returns true when the player is ready to accept a trade offer.
- * Returns false otherwise.
- */
- bool tradeRequestOk() const { return !mTrading; }
-
- /**
- * Sets the trading state of the player, i.e. whether or not he is
- * currently involved into some trade.
- */
- void setTrading(bool trading) { mTrading = trading; }
-
- void useSpecial(int id);
-
- void setSpecialStatus(int id, int current, int max, int recharge);
-
- const std::map<int, Special> &getSpecialStatus() const
- { return mSpecials; }
-
void attack(Being *target = NULL, bool keep = false);
void setGMLevel(int level);
@@ -275,11 +237,7 @@ class LocalPlayer : public Being, public ActorSpriteListener
*/
bool getCheckNameSetting() const { return mUpdateName; }
- /** Keeps the Equipment related values */
- const std::auto_ptr<Equipment> mEquipment;
-
protected:
-
/** Whether or not the name settings have changed */
bool mUpdateName;
@@ -292,11 +250,6 @@ class LocalPlayer : public Being, public ActorSpriteListener
int mTargetTime; /** How long the being has been targeted **/
int mLastTarget; /** Time stamp of last targeting action, -1 if none. */
- // Character status:
- int mLevelProgress;
- std::map<int, Special> mSpecials;
- char mSpecialRechargeUpdateNeeded;
-
int mGMLevel;
Being *mTarget;
@@ -308,7 +261,6 @@ class LocalPlayer : public Being, public ActorSpriteListener
FloorItem *mPickUpTarget;
- bool mTrading;
bool mGoingToTarget;
bool mKeepAttacking; /** Whether or not to continue to attack */
int mLastAction; /**< Time stamp of the last action, -1 if none. */
@@ -317,13 +269,11 @@ class LocalPlayer : public Being, public ActorSpriteListener
std::vector<int> mStatusEffectIcons;
- Inventory *mInventory;
-
int mLocalWalkTime; /**< Timestamp used to control keyboard walk
messages flooding */
typedef std::pair<std::string, int> MessagePair;
- /** Queued exp messages*/
+ /** Queued messages*/
std::list<MessagePair> mMessages;
int mMessageTime;
AwayListener *mAwayListener;
diff --git a/src/net/manaserv/inventoryhandler.cpp b/src/net/manaserv/inventoryhandler.cpp
index bf5682c7..3f8aa8b5 100644
--- a/src/net/manaserv/inventoryhandler.cpp
+++ b/src/net/manaserv/inventoryhandler.cpp
@@ -61,8 +61,8 @@ void InventoryHandler::handleMessage(Net::MessageIn &msg)
switch (msg.getId())
{
case GPMSG_INVENTORY_FULL:
- player_node->clearInventory();
- player_node->mEquipment->setBackend(&mEquips);
+ PlayerInfo::clearInventory();
+ PlayerInfo::getEquipment()->setBackend(&mEquips);
// no break!
case GPMSG_INVENTORY:
@@ -83,7 +83,7 @@ void InventoryHandler::handleMessage(Net::MessageIn &msg)
else if (slot >= 32 && slot < 32 + getSize(Inventory::INVENTORY))
{
int amount = id ? msg.readInt8() : 0;
- player_node->setInvItem(slot - 32, id, amount);
+ PlayerInfo::setInventoryItem(slot - 32, id, amount);
}
};
break;
@@ -131,7 +131,7 @@ bool InventoryHandler::canSplit(const Item *item)
void InventoryHandler::splitItem(const Item *item, int amount)
{
- int newIndex = player_node->getInventory()->getFreeSlot();
+ int newIndex = PlayerInfo::getInventory()->getFreeSlot();
if (newIndex > Inventory::NO_SLOT_INDEX)
{
MessageOut msg(PGMSG_MOVE_ITEM);
@@ -150,7 +150,7 @@ void InventoryHandler::moveItem(int oldIndex, int newIndex)
MessageOut msg(PGMSG_MOVE_ITEM);
msg.writeInt8(oldIndex);
msg.writeInt8(newIndex);
- msg.writeInt8(player_node->getInventory()->getItem(oldIndex)
+ msg.writeInt8(PlayerInfo::getInventory()->getItem(oldIndex)
->getQuantity());
gameServerConnection->send(msg);
}
diff --git a/src/net/manaserv/playerhandler.cpp b/src/net/manaserv/playerhandler.cpp
index cef75472..bc03cc25 100644
--- a/src/net/manaserv/playerhandler.cpp
+++ b/src/net/manaserv/playerhandler.cpp
@@ -241,7 +241,7 @@ void PlayerHandler::handleMessage(Net::MessageIn &msg)
int current = msg.readInt32();
int max = msg.readInt32();
int recharge = msg.readInt32();
- player_node->setSpecialStatus(id, current, max, recharge);
+ PlayerInfo::setSpecialStatus(id, current, max, recharge);
}
} break;
/*
diff --git a/src/net/manaserv/tradehandler.cpp b/src/net/manaserv/tradehandler.cpp
index b6169ac9..d5505075 100644
--- a/src/net/manaserv/tradehandler.cpp
+++ b/src/net/manaserv/tradehandler.cpp
@@ -24,6 +24,7 @@
#include "actorspritemanager.h"
#include "item.h"
#include "localplayer.h"
+#include "playerinfo.h"
#include "gui/confirmdialog.h"
#include "gui/trade.h"
@@ -110,7 +111,7 @@ void TradeHandler::handleMessage(Net::MessageIn &msg)
respond(false);
break;
}
- player_node->setTrading(true);
+ PlayerInfo::setTrading(true);
tradePartnerName = being->getName();
tradePartnerID = being->getId();
ConfirmDialog *dlg = new ConfirmDialog(_("Request for Trade"),
@@ -149,14 +150,14 @@ void TradeHandler::handleMessage(Net::MessageIn &msg)
localChatTab->chatLog(_("Trade canceled."), BY_SERVER);
tradeWindow->setVisible(false);
tradeWindow->reset();
- player_node->setTrading(false);
+ PlayerInfo::setTrading(false);
break;
case GPMSG_TRADE_COMPLETE:
localChatTab->chatLog(_("Trade completed."), BY_SERVER);
tradeWindow->setVisible(false);
tradeWindow->reset();
- player_node->setTrading(false);
+ PlayerInfo::setTrading(false);
break;
}
}
@@ -177,7 +178,7 @@ void TradeHandler::respond(bool accept)
gameServerConnection->send(msg);
if (!accept)
- player_node->setTrading(false);
+ PlayerInfo::setTrading(false);
}
void TradeHandler::addItem(Item *item, int amount)
diff --git a/src/net/tmwa/buysellhandler.cpp b/src/net/tmwa/buysellhandler.cpp
index cd12939b..d0c8fd40 100644
--- a/src/net/tmwa/buysellhandler.cpp
+++ b/src/net/tmwa/buysellhandler.cpp
@@ -99,7 +99,7 @@ void BuySellHandler::handleMessage(Net::MessageIn &msg)
int value = msg.readInt32();
msg.readInt32(); // OCvalue
- Item *item = player_node->getInventory()->getItem(index);
+ Item *item = PlayerInfo::getInventory()->getItem(index);
if (item && !(item->isEquipped()))
dialog->addItem(item, value);
diff --git a/src/net/tmwa/inventoryhandler.cpp b/src/net/tmwa/inventoryhandler.cpp
index fd979dc6..41049c3d 100644
--- a/src/net/tmwa/inventoryhandler.cpp
+++ b/src/net/tmwa/inventoryhandler.cpp
@@ -126,7 +126,7 @@ void InventoryHandler::handleMessage(Net::MessageIn &msg)
int number, flag;
int index, amount, itemId, equipType, arrow;
int identified, cards[4], itemType;
- Inventory *inventory = player_node->getInventory();
+ Inventory *inventory = PlayerInfo::getInventory();
switch (msg.getId())
{
@@ -136,7 +136,7 @@ void InventoryHandler::handleMessage(Net::MessageIn &msg)
{
// Clear inventory - this will be a complete refresh
mEquips.clear();
- player_node->mEquipment->setBackend(&mEquips);
+ PlayerInfo::getEquipment()->setBackend(&mEquips);
inventory->clear();
}
diff --git a/src/net/tmwa/inventoryhandler.h b/src/net/tmwa/inventoryhandler.h
index 82738afe..8e6e12ca 100644
--- a/src/net/tmwa/inventoryhandler.h
+++ b/src/net/tmwa/inventoryhandler.h
@@ -24,7 +24,7 @@
#include "equipment.h"
#include "inventory.h"
-#include "localplayer.h"
+#include "playerinfo.h"
#include "gui/inventorywindow.h"
@@ -51,7 +51,7 @@ class EquipBackend : public Equipment::Backend {
{
return NULL;
}
- return player_node->getInventory()->getItem(invyIndex);
+ return PlayerInfo::getInventory()->getItem(invyIndex);
}
void clear()
@@ -60,7 +60,7 @@ class EquipBackend : public Equipment::Backend {
{
if (mEquipment[i] != -1)
{
- Item* item = player_node->getInventory()->getItem(i);
+ Item* item = PlayerInfo::getInventory()->getItem(i);
if (item)
{
item->setEquipped(false);
@@ -74,7 +74,7 @@ class EquipBackend : public Equipment::Backend {
void setEquipment(int index, int inventoryIndex)
{
// Unequip existing item
- Item* item = player_node->getInventory()->getItem(mEquipment[index]);
+ Item* item = PlayerInfo::getInventory()->getItem(mEquipment[index]);
if (item)
{
item->setEquipped(false);
@@ -82,7 +82,7 @@ class EquipBackend : public Equipment::Backend {
mEquipment[index] = inventoryIndex;
- item = player_node->getInventory()->getItem(inventoryIndex);
+ item = PlayerInfo::getInventory()->getItem(inventoryIndex);
if (item)
{
item->setEquipped(true);
diff --git a/src/net/tmwa/tradehandler.cpp b/src/net/tmwa/tradehandler.cpp
index 9089f8e6..2c82f1e2 100644
--- a/src/net/tmwa/tradehandler.cpp
+++ b/src/net/tmwa/tradehandler.cpp
@@ -24,6 +24,7 @@
#include "inventory.h"
#include "item.h"
#include "localplayer.h"
+#include "playerinfo.h"
#include "playerrelations.h"
#include "gui/confirmdialog.h"
@@ -96,14 +97,14 @@ void TradeHandler::handleMessage(Net::MessageIn &msg)
if (player_relations.hasPermission(tradePartnerName,
PlayerRelation::TRADE))
{
- if (!player_node->tradeRequestOk() || confirmDlg)
+ if (PlayerInfo::isTrading() || confirmDlg)
{
Net::getTradeHandler()->respond(false);
break;
}
tradePartnerName = tradePartnerNameTemp;
- player_node->setTrading(true);
+ PlayerInfo::setTrading(true);
confirmDlg = new ConfirmDialog(_("Request for Trade"),
strprintf(_("%s wants to trade with you, do you "
"accept?"), tradePartnerName.c_str()));
@@ -147,7 +148,7 @@ void TradeHandler::handleMessage(Net::MessageIn &msg)
// otherwise ignore silently
tradeWindow->setVisible(false);
- player_node->setTrading(false);
+ PlayerInfo::setTrading(false);
break;
default: // Shouldn't happen as well, but to be sure
localChatTab->chatLog(_("Unhandled trade cancel packet."),
@@ -177,7 +178,7 @@ void TradeHandler::handleMessage(Net::MessageIn &msg)
// Trade: New Item add response (was 0x00ea, now 01b1)
{
const int index = msg.readInt16() - INVENTORY_OFFSET;
- Item *item = player_node->getInventory()->getItem(index);
+ Item *item = PlayerInfo::getInventory()->getItem(index);
if (!item)
{
tradeWindow->receivedOk(true);
@@ -224,14 +225,14 @@ void TradeHandler::handleMessage(Net::MessageIn &msg)
localChatTab->chatLog(_("Trade canceled."), BY_SERVER);
tradeWindow->setVisible(false);
tradeWindow->reset();
- player_node->setTrading(false);
+ PlayerInfo::setTrading(false);
break;
case SMSG_TRADE_COMPLETE:
localChatTab->chatLog(_("Trade completed."), BY_SERVER);
tradeWindow->setVisible(false);
tradeWindow->reset();
- player_node->setTrading(false);
+ PlayerInfo::setTrading(false);
break;
}
}
@@ -245,7 +246,7 @@ void TradeHandler::request(Being *being)
void TradeHandler::respond(bool accept)
{
if (!accept)
- player_node->setTrading(false);
+ PlayerInfo::setTrading(false);
MessageOut outMsg(CMSG_TRADE_RESPONSE);
outMsg.writeInt8(accept ? 3 : 4);
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
diff --git a/src/playerinfo.h b/src/playerinfo.h
index 421e93bc..1c722a7c 100644
--- a/src/playerinfo.h
+++ b/src/playerinfo.h
@@ -24,6 +24,9 @@
#include <map>
#include <string>
+/**
+ * Standard attributes for players.
+ */
enum Attribute
{
LEVEL,
@@ -36,6 +39,9 @@ enum Attribute
CHAR_POINTS, CORR_POINTS
};
+/**
+ * Stat information storage structure.
+ */
struct Stat
{
int base;
@@ -47,59 +53,161 @@ struct Stat
typedef std::map<int, int> IntMap;
typedef std::map<int, Stat> StatMap;
+/**
+ * Backend for core player information.
+ */
struct PlayerInfoBackend
{
- public:
IntMap mAttributes;
StatMap mStats;
};
+class Equipment;
+class Inventory;
+class Item;
+
/**
- * A database like class which holds global info about the localplayer
+ * Special information storage structure.
*/
-class PlayerInfo
+struct Special
{
- // NOTE: All agruements for 'bool notify' is to determine if
- // a event is to be triggered
- public:
- static void setBackend(const PlayerInfoBackend &backend);
-
- /**
- * Attributes for things like money and exp
- */
- static int getAttribute(int id);
-
- static void setAttribute(int id, int value, bool notify = true);
-
-
- /**
- * Stats are modifiable attributes basicilly, like str, crit, trade
- */
-
- static int getStatBase(int id);
-
- static void setStatBase(int id, int value, bool notify = true);
-
- static int getStatMod(int id);
-
- static void setStatMod(int id, int value, bool notify = true);
-
- // Base + mod
- static int getStatEffective(int id);
-
- static void setStatLevel(int id, int value, bool notify = true);
-
- static std::pair<int, int> getStatExperience(int id);
-
- static void setStatExperience(int id, int have, int need, bool notify = true);
+ int currentMana;
+ int neededMana;
+ int recharge;
+};
- private:
- // Triggers send events for action.
- static void triggerAttr(int id);
+typedef std::map<int, Special> SpecialsMap;
- static void triggerStat(int id);
+/**
+ * A database like namespace which holds global info about the localplayer
+ *
+ * NOTE: 'bool notify' is used to determine if a event is to be triggered.
+ */
+namespace PlayerInfo
+{
- static PlayerInfoBackend mData;
-};
+// --- Attributes -------------------------------------------------------------
+
+ /**
+ * Returns the value of the given attribute.
+ */
+ int getAttribute(int id);
+
+ /**
+ * Changes the value of the given attribute.
+ */
+ void setAttribute(int id, int value, bool notify = true);
+
+// --- Stats ------------------------------------------------------------------
+
+ /**
+ * Returns the base value of the given stat.
+ */
+ int getStatBase(int id);
+
+ /**
+ * Changes the base value of the given stat.
+ */
+ void setStatBase(int id, int value, bool notify = true);
+
+ /**
+ * Returns the modifier for the given stat.
+ */
+ int getStatMod(int id);
+
+ /**
+ * Changes the modifier for the given stat.
+ */
+ void setStatMod(int id, int value, bool notify = true);
+
+ /**
+ * Returns the current effective value of the given stat. Effective is base
+ * + mod
+ */
+ int getStatEffective(int id);
+
+ /**
+ * Changes the level of the given stat.
+ */
+ void setStatLevel(int id, int value, bool notify = true);
+
+ /**
+ * Returns the experience of the given stat.
+ */
+ std::pair<int, int> getStatExperience(int id);
+
+ /**
+ * Changes the experience of the given stat.
+ */
+ void setStatExperience(int id, int have, int need, bool notify = true);
+
+// --- Inventory / Equipment --------------------------------------------------
+
+ /**
+ * Returns the player's inventory.
+ */
+ Inventory *getInventory();
+
+ /**
+ * Clears the player's inventory and equipment.
+ */
+ void clearInventory();
+
+ /**
+ * Changes the inventory item at the given slot.
+ */
+ void setInventoryItem(int index, int id, int amount);
+
+ /**
+ * Returns the player's equipment.
+ */
+ Equipment *getEquipment();
+
+ /**
+ * Returns the player's equipment at the given slot.
+ */
+ Item *getEquipment(unsigned int slot);
+
+// --- Specials ---------------------------------------------------------------
+
+ /**
+ * Changes the status of the given special.
+ */
+ void setSpecialStatus(int id, int current, int max, int recharge);
+
+ /**
+ * Returns the status of the given special.
+ */
+ const SpecialsMap &getSpecialStatus();
+
+// --- Misc -------------------------------------------------------------------
+
+ /**
+ * Changes the internal PlayerInfoBackend reference;
+ */
+ void setBackend(const PlayerInfoBackend &backend);
+
+ /**
+ * Does necessary updates every tick.
+ */
+ void logic();
+
+ /**
+ * Returns true if the player is involved in a trade at the moment, false
+ * otherwise.
+ */
+ bool isTrading();
+
+ /**
+ * Sets whether the player is currently involved in trade or not.
+ */
+ void setTrading(bool trading);
+
+ /**
+ * Initializes some internals.
+ */
+ void init();
+
+} // namespace PlayerInfo
#endif