diff options
-rw-r--r-- | src/gui/statuswindow.cpp | 49 | ||||
-rw-r--r-- | src/net/manaserv/attributes.cpp | 104 | ||||
-rw-r--r-- | src/net/manaserv/attributes.h | 7 | ||||
-rw-r--r-- | src/net/manaserv/playerhandler.cpp | 24 |
4 files changed, 144 insertions, 40 deletions
diff --git a/src/gui/statuswindow.cpp b/src/gui/statuswindow.cpp index 6535edf7..022a97c7 100644 --- a/src/gui/statuswindow.cpp +++ b/src/gui/statuswindow.cpp @@ -115,21 +115,22 @@ StatusWindow::StatusWindow(): int max = PlayerInfo::getAttribute(MAX_HP); mHpLabel = new Label(_("HP:")); - mHpBar = new ProgressBar(max ? (float) PlayerInfo::getAttribute(HP) / max: 0, - 80, 15, Theme::PROG_HP); + mHpBar = new ProgressBar(max ? (float) PlayerInfo::getAttribute(HP) / max : + 0, 80, 15, Theme::PROG_HP); max = PlayerInfo::getAttribute(EXP_NEEDED); mXpLabel = new Label(_("Exp:")); - mXpBar = new ProgressBar(max ? (float) PlayerInfo::getAttribute(EXP) / max : 0, - 80, 15, Theme::PROG_EXP); + mXpBar = new ProgressBar(max ? (float) PlayerInfo::getAttribute(EXP) / max : + 0, 80, 15, Theme::PROG_EXP); bool magicBar = Net::getGameHandler()->canUseMagicBar(); if (magicBar) { max = PlayerInfo::getAttribute(MAX_MP); mMpLabel = new Label(_("MP:")); - mMpBar = new ProgressBar(max ? (float) PlayerInfo::getAttribute(MAX_MP) / max : 0, - 80, 15, Net::getPlayerHandler()->canUseMagic() ? + mMpBar = new ProgressBar(max ? + (float) PlayerInfo::getAttribute(MAX_MP) / max : + 0, 80, 15, Net::getPlayerHandler()->canUseMagic() ? Theme::PROG_MP : Theme::PROG_NO_MP); } @@ -140,11 +141,16 @@ StatusWindow::StatusWindow(): place(1, 1, mHpBar, 4); place(5, 1, mXpLabel).setPadding(3); place(6, 1, mXpBar, 5); + + int attributesFirstRow = 2; if (magicBar) { place(0, 2, mMpLabel).setPadding(3); // 5, 2 and 6, 2 Job Progress Bar place(1, 2, mMpBar, 4); + + // We move the attribute row to the next one + attributesFirstRow = 3; } if (Net::getPlayerHandler()->getJobLocation() > 0) @@ -156,35 +162,38 @@ StatusWindow::StatusWindow(): place(5, 0, mJobLvlLabel, 3); place(5, 2, mJobLabel).setPadding(3); place(6, 2, mJobBar, 5); + + // We move the attribute row to the next one + attributesFirstRow = 3; } // ---------------------- // Stats Part // ---------------------- - mAttrCont = new VertContainer(32); + mAttrCont = new VertContainer(28); mAttrScroll = new ScrollArea(mAttrCont); mAttrScroll->setOpaque(false); mAttrScroll->setHorizontalScrollPolicy(ScrollArea::SHOW_NEVER); mAttrScroll->setVerticalScrollPolicy(ScrollArea::SHOW_AUTO); - place(0, 3, mAttrScroll, 5, 3); + place(0, attributesFirstRow, mAttrScroll, 5, 3); - mDAttrCont = new VertContainer(32); + mDAttrCont = new VertContainer(28); mDAttrScroll = new ScrollArea(mDAttrCont); mDAttrScroll->setOpaque(false); mDAttrScroll->setHorizontalScrollPolicy(ScrollArea::SHOW_NEVER); mDAttrScroll->setVerticalScrollPolicy(ScrollArea::SHOW_AUTO); - place(6, 3, mDAttrScroll, 5, 3); + place(6, attributesFirstRow, mDAttrScroll, 5, 3); - getLayout().setRowHeight(3, Layout::AUTO_SET); + getLayout().setRowHeight(attributesFirstRow, Layout::AUTO_SET); - mCharacterPointsLabel = new Label("C"); - place(0, 6, mCharacterPointsLabel, 5); + mCharacterPointsLabel = new Label("Character points: 0"); + place(0, attributesFirstRow + 3, mCharacterPointsLabel, 4); if (Net::getPlayerHandler()->canCorrectAttributes()) { - mCorrectionPointsLabel = new Label("C"); - place(0, 7, mCorrectionPointsLabel, 5); + mCorrectionPointsLabel = new Label("Correction points: 0"); + place(4, attributesFirstRow + 3, mCorrectionPointsLabel, 4); } loadWindowState(); @@ -197,7 +206,7 @@ StatusWindow::StatusWindow(): mMoneyLabel->setCaption(strprintf(_("Money: %s"), - Units::formatCurrency(PlayerInfo::getAttribute(MONEY)).c_str())); + Units::formatCurrency(PlayerInfo::getAttribute(MONEY)).c_str())); mMoneyLabel->adjustSize(); mCharacterPointsLabel->setCaption(strprintf(_("Character points: %d"), PlayerInfo::getAttribute(CHAR_POINTS))); @@ -334,7 +343,8 @@ void StatusWindow::updateHPBar(ProgressBar *bar, bool showMax) float prog = 1.0; if (PlayerInfo::getAttribute(MAX_HP) > 0) - prog = (float) PlayerInfo::getAttribute(HP) / PlayerInfo::getAttribute(MAX_HP); + prog = (float) PlayerInfo::getAttribute(HP) + / PlayerInfo::getAttribute(MAX_HP); bar->setProgress(prog); } @@ -352,7 +362,8 @@ void StatusWindow::updateMPBar(ProgressBar *bar, bool showMax) float prog = 1.0f; if (PlayerInfo::getAttribute(MAX_MP) > 0) - prog = (float) PlayerInfo::getAttribute(MP) / PlayerInfo::getAttribute(MAX_MP); + prog = (float) PlayerInfo::getAttribute(MP) + / PlayerInfo::getAttribute(MAX_MP); if (Net::getPlayerHandler()->canUseMagic()) bar->setProgressPalette(Theme::PROG_MP); @@ -363,7 +374,7 @@ void StatusWindow::updateMPBar(ProgressBar *bar, bool showMax) } void StatusWindow::updateProgressBar(ProgressBar *bar, int value, int max, - bool percent) + bool percent) { if (!bar) return; diff --git a/src/net/manaserv/attributes.cpp b/src/net/manaserv/attributes.cpp index 67c52788..a65dc01f 100644 --- a/src/net/manaserv/attributes.cpp +++ b/src/net/manaserv/attributes.cpp @@ -21,6 +21,7 @@ #include "net/manaserv/attributes.h" #include "log.h" +#include "playerinfo.h" #include "gui/statuswindow.h" @@ -46,20 +47,26 @@ namespace Attributes { unsigned int id; std::string name; std::string description; + /** Whether the attribute value can be modified by the player */ bool modifiable; + /**< Attribute scope. */ + std::string scope; + /** The playerInfo core Id the attribute is linked with or -1 if not */ + int playerInfoId; } Attribute; - // tag -> effect - typedef std::map< std::string, std::string > TagMap; - + /** Map for attributes. */ typedef std::map<unsigned int, Attribute> AttributeMap; - AttributeMap attributes; + static AttributeMap attributes; - TagMap tags; + /** tags = effects on attributes. */ + typedef std::map< std::string, std::string > TagMap; + static TagMap tags; - // List of modifiable attribute names used at character's creation. + /** List of modifiable attribute names used at character's creation. */ static std::vector<std::string> attributeLabels; + /** Characters creation points. */ static unsigned int creationPoints = 0; static unsigned int attributeMinimum = 0; static unsigned int attributeMaximum = 0; @@ -95,11 +102,62 @@ namespace Attributes { for (it = attributes.begin(), it_end = attributes.end(); it != it_end; it++) { - if (it->second.modifiable) + if (it->second.modifiable && + (it->second.scope == "character" || it->second.scope == "being")) attributeLabels.push_back(it->second.name + ":"); } } + /** + * Fills the list of base attribute labels. + */ + static int getPlayerInfoIdFromAttrType(std::string attrType) + { + toLower(attrType); + if (attrType == "level") + return ::LEVEL; + else if (attrType == "hp") + return ::HP; + else if (attrType == "max-hp") + return ::MAX_HP; + else if (attrType == "mp") + return ::MP; + else if (attrType == "max-mp") + return ::MAX_MP; + else if (attrType == "exp") + return ::EXP; + else if (attrType == "exp-needed") + return ::EXP_NEEDED; + else if (attrType == "money") + return ::MONEY; + else if (attrType == "total-weight") + return ::TOTAL_WEIGHT; + else if (attrType == "max-weight") + return ::MAX_WEIGHT; + else if (attrType == "skill-points") + return ::SKILL_POINTS; + else if (attrType == "char-points") + return ::CHAR_POINTS; + else if (attrType == "corr-points") + return ::CORR_POINTS; + else if (attrType == "none") + return -2; // Used to hide the attribute display. + + return -1; // Not linked to a playerinfo stat. + } + + int getPlayerInfoIdFromAttrId(int attrId) + { + AttributeMap::const_iterator it = attributes.find(attrId); + + if (it != attributes.end()) + { + return it->second.playerInfoId; + } + + return -1; + } + static void loadBuiltins() { { @@ -108,6 +166,8 @@ namespace Attributes { a.name = _("Strength"); a.description = ""; a.modifiable = true; + a.scope = "character"; + a.playerInfoId = -1; attributes[a.id] = a; tags.insert(std::make_pair("str", _("Strength %+.1f"))); @@ -119,6 +179,8 @@ namespace Attributes { a.name = _("Agility"); a.description = ""; a.modifiable = true; + a.scope = "character"; + a.playerInfoId = -1; attributes[a.id] = a; tags.insert(std::make_pair("agi", _("Agility %+.1f"))); @@ -130,6 +192,8 @@ namespace Attributes { a.name = _("Dexterity"); a.description = ""; a.modifiable = true; + a.scope = "character"; + a.playerInfoId = -1; attributes[a.id] = a; tags.insert(std::make_pair("dex", _("Dexterity %+.1f"))); @@ -141,6 +205,8 @@ namespace Attributes { a.name = _("Vitality"); a.description = ""; a.modifiable = true; + a.scope = "character"; + a.playerInfoId = -1; attributes[a.id] = a; tags.insert(std::make_pair("vit", _("Vitality %+.1f"))); @@ -152,6 +218,8 @@ namespace Attributes { a.name = _("Intelligence"); a.description = ""; a.modifiable = true; + a.scope = "character"; + a.playerInfoId = -1; attributes[a.id] = a; tags.insert(std::make_pair("int", _("Intelligence %+.1f"))); @@ -163,6 +231,8 @@ namespace Attributes { a.name = _("Willpower"); a.description = ""; a.modifiable = true; + a.scope = "character"; + a.playerInfoId = -1; attributes[a.id] = a; tags.insert(std::make_pair("wil", _("Willpower %+.1f"))); @@ -211,12 +281,15 @@ namespace Attributes { continue; } + // Create the attribute. Attribute a; a.id = id; a.name = name; a.description = XML::getProperty(node, "desc", ""); - a.modifiable = XML::getProperty(node, "modifiable", "false") - == "true"; + a.modifiable = XML::getBoolProperty(node, "modifiable", false); + a.scope = XML::getProperty(node, "scope", "none"); + a.playerInfoId = getPlayerInfoIdFromAttrType( + XML::getProperty(node, "player-info", "")); attributes[id] = a; @@ -319,9 +392,16 @@ namespace Attributes { AttributeMap::const_iterator it, it_end; for (it = attributes.begin(), it_end = attributes.end(); it != it_end; it++) - statusWindow->addAttribute(it->second.id, it->second.name, - it->second.modifiable, - it->second.description); + { + if (it->second.playerInfoId == -1 && + (it->second.scope == "character" || it->second.scope == "being")) + { + statusWindow->addAttribute(it->second.id, + it->second.name, + it->second.modifiable, + it->second.description); + } + } } } // namespace Attributes diff --git a/src/net/manaserv/attributes.h b/src/net/manaserv/attributes.h index 9791d2cb..aced85ec 100644 --- a/src/net/manaserv/attributes.h +++ b/src/net/manaserv/attributes.h @@ -26,6 +26,7 @@ namespace ManaServ { namespace Attributes { + void load(); void unload(); @@ -40,6 +41,12 @@ namespace Attributes { std::vector<std::string>& getLabels(); /** + * Give back the corresponding playerinfo Id from the attribute id + * defined in the xml file. + */ + int getPlayerInfoIdFromAttrId(int attrId); + + /** * Give the attribute points given to a character * at its creation. */ diff --git a/src/net/manaserv/playerhandler.cpp b/src/net/manaserv/playerhandler.cpp index 5bacce49..a579517f 100644 --- a/src/net/manaserv/playerhandler.cpp +++ b/src/net/manaserv/playerhandler.cpp @@ -43,6 +43,7 @@ #include "net/manaserv/messagein.h" #include "net/manaserv/messageout.h" #include "net/manaserv/protocol.h" +#include "net/manaserv/attributes.h" /** * Max. distance we are willing to scroll after a teleport; @@ -112,18 +113,23 @@ void PlayerHandler::handleMessage(Net::MessageIn &msg) { while (msg.getUnreadLength()) { - int attr = msg.readInt16(); + int attrId = msg.readInt16(); double base = msg.readInt32() / 256.0; double value = msg.readInt32() / 256.0; - /* TODO handle HP - if (attr == ATTR_HP) - PlayerInfo::setAttribute(HP, value); - else if (attr == ATTR_MAX_HP) - PlayerInfo::setAttribute(MAX_HP, value);*/ - - PlayerInfo::setStatBase(attr, base); - PlayerInfo::setStatMod(attr, value - base); + // Set the core player attribute the stat + // depending on attribute link. + int playerInfoId = + Attributes::getPlayerInfoIdFromAttrId(attrId); + if (playerInfoId > -1) + { + PlayerInfo::setAttribute(playerInfoId, value); + } + else + { + PlayerInfo::setStatBase(attrId, base); + PlayerInfo::setStatMod(attrId, value - base); + } } } break; |