diff options
-rw-r--r-- | src/CMakeLists.txt | 2 | ||||
-rw-r--r-- | src/Makefile.am | 2 | ||||
-rw-r--r-- | src/being/being.cpp | 71 | ||||
-rw-r--r-- | src/being/being.h | 7 | ||||
-rw-r--r-- | src/client.cpp | 3 | ||||
-rw-r--r-- | src/resources/db/badgesdb.cpp | 64 | ||||
-rw-r--r-- | src/resources/db/badgesdb.h | 40 |
7 files changed, 178 insertions, 11 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index b3974bf4b..d50299f2b 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -591,6 +591,8 @@ SET(SRCS resources/attack.h resources/db/avatardb.cpp resources/db/avatardb.h + resources/db/badgesdb.cpp + resources/db/badgesdb.h resources/beingcommon.cpp resources/beingcommon.h resources/beinginfo.cpp diff --git a/src/Makefile.am b/src/Makefile.am index c877c37f5..3e4495dc4 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -738,6 +738,8 @@ manaplus_SOURCES += gui/widgets/avatarlistbox.cpp \ resources/attack.h \ resources/db/avatardb.cpp \ resources/db/avatardb.h \ + resources/db/badgesdb.cpp \ + resources/db/badgesdb.h \ resources/beingcommon.cpp \ resources/beingcommon.h \ resources/beinginfo.cpp \ diff --git a/src/being/being.cpp b/src/being/being.cpp index 363ff6c5f..ef5412d0a 100644 --- a/src/being/being.cpp +++ b/src/being/being.cpp @@ -71,6 +71,7 @@ #include "resources/spriteaction.h" #include "resources/db/avatardb.h" +#include "resources/db/badgesdb.h" #include "resources/db/emotedb.h" #include "resources/db/homunculusdb.h" #include "resources/db/horsedb.h" @@ -134,6 +135,7 @@ Being::Being(const BeingId id, mInfo(BeingInfo::unknown), mEmotionSprite(nullptr), mAnimationEffect(nullptr), + mPartyBadge(nullptr), mTeamBadge(nullptr), mSpriteAction(SpriteAction::STAND), mName(), @@ -221,6 +223,7 @@ Being::Being(const BeingId id, mAreaSize(11), mTeamId(0U), mLook(0U), + mBadgesCount(0U), mHairColor(0), mErased(false), mEnemy(false), @@ -290,7 +293,9 @@ Being::~Being() delete2(mText); delete2(mEmotionSprite); delete2(mAnimationEffect); + delete2(mPartyBadge); delete2(mTeamBadge); + mBadgesCount = 0; #ifdef EATHENA_SUPPORT delete2(mChat); #endif @@ -1366,6 +1371,8 @@ void Being::setAction(const BeingActionT &action, const int attackId) mEmotionSprite->play(currentAction); if (mAnimationEffect) mAnimationEffect->play(currentAction); + if (mPartyBadge) + mPartyBadge->play(currentAction); if (mTeamBadge) mTeamBadge->play(currentAction); #ifdef EATHENA_SUPPORT @@ -1431,6 +1438,8 @@ void Being::setDirection(const uint8_t direction) mEmotionSprite->setSpriteDirection(dir); if (mAnimationEffect) mAnimationEffect->setSpriteDirection(dir); + if (mPartyBadge) + mPartyBadge->setSpriteDirection(dir); if (mTeamBadge) mTeamBadge->setSpriteDirection(dir); #ifdef EATHENA_SUPPORT @@ -1537,6 +1546,8 @@ void Being::logic() if (mAnimationEffect->isTerminated()) delete2(mAnimationEffect) } + if (mPartyBadge) + mPartyBadge->update(time); if (mTeamBadge) mTeamBadge->update(time); @@ -1848,18 +1859,30 @@ void Being::drawEmotion(Graphics *const graphics, mEmotionSprite->draw(graphics, px, py); if (mAnimationEffect) mAnimationEffect->draw(graphics, px, py); - if (mTeamBadge && mShowBadges) + if (mShowBadges && mBadgesCount) { + int x; + int y; if (!mShowBadgesTop && mDispName && gui) { Font *const font = gui->getFont(); - mTeamBadge->draw(graphics, - mDispName->getX() - offsetX + mDispName->getWidth(), - mDispName->getY() - offsetY - font->getHeight()); + x = mDispName->getX() - offsetX + mDispName->getWidth(); + y = mDispName->getY() - offsetY - font->getHeight(); } else { - mTeamBadge->draw(graphics, px, py); + x = px + 8 - mBadgesCount * 8; + y = py; + } + if (mTeamBadge) + { + mTeamBadge->draw(graphics, x, y); + x += 16; + } + if (mPartyBadge) + { + mPartyBadge->draw(graphics, x, y); +// x += 16; } } } @@ -3710,15 +3733,45 @@ void Being::setTeamId(const uint16_t teamId) void Being::showBadges(const bool show) { delete2(mTeamBadge); - if (show && mTeamId) + if (show && mTeamId && mShowBadges) { - mTeamBadge = AnimatedSprite::load( - paths.getStringValue("badges") + + const std::string name = paths.getStringValue("badges") + paths.getStringValue(strprintf("team%dbadge", - mTeamId))); + mTeamId)); + if (!name.empty()) + mTeamBadge = AnimatedSprite::load(name); + } + updateBadgesCount(); +} + +void Being::setPartyName(const std::string &name) +{ + if (mPartyName != name) + { + delete2(mPartyBadge); + mPartyName = name; + if (!mPartyName.empty() && mShowBadges) + { + const std::string badge = BadgesDB::getPartyBadge(mPartyName); + if (!badge.empty()) + { + mPartyBadge = AnimatedSprite::load( + paths.getStringValue("badges") + badge); + } + } + updateBadgesCount(); } } +void Being::updateBadgesCount() +{ + mBadgesCount = 0; + if (mTeamBadge) + mBadgesCount ++; + if (mPartyBadge) + mBadgesCount ++; +} + #ifdef EATHENA_SUPPORT void Being::setChat(ChatObject *const obj) { diff --git a/src/being/being.h b/src/being/being.h index e58cbcb90..2f8796ba7 100644 --- a/src/being/being.h +++ b/src/being/being.h @@ -227,8 +227,7 @@ class Being notfinal : public ActorSprite, /** * Sets the name of the party the being is in. Shown in BeingPopup. */ - void setPartyName(const std::string &name) - { mPartyName = name; } + void setPartyName(const std::string &name); const std::string &getPartyName() const A_WARN_UNUSED { return mPartyName; } @@ -955,11 +954,14 @@ class Being notfinal : public ActorSprite, void setDefaultNameColor(const UserColorIdT defaultColor); + void updateBadgesCount(); + static int getDefaultEffectId(const AttackTypeT &type); BeingInfo *mInfo; AnimatedSprite *mEmotionSprite; AnimatedSprite *mAnimationEffect; + AnimatedSprite *mPartyBadge; AnimatedSprite *mTeamBadge; std::string mSpriteAction; @@ -1124,6 +1126,7 @@ class Being notfinal : public ActorSprite, int mAreaSize; uint16_t mTeamId; uint16_t mLook; + uint16_t mBadgesCount; unsigned char mHairColor; bool mErased; bool mEnemy; diff --git a/src/client.cpp b/src/client.cpp index a47abae18..f1a6a2396 100644 --- a/src/client.cpp +++ b/src/client.cpp @@ -98,6 +98,7 @@ #include "resources/spritereference.h" #include "resources/db/avatardb.h" +#include "resources/db/badgesdb.h" #include "resources/db/chardb.h" #include "resources/db/colordb.h" #include "resources/db/deaddb.h" @@ -561,6 +562,7 @@ void Client::gameClear() MonsterDB::unload(); NPCDB::unload(); AvatarDB::unload(); + BadgesDB::unload(); WeaponsDB::unload(); PaletteDB::unload(); PETDB::unload(); @@ -1233,6 +1235,7 @@ int Client::gameExec() HomunculusDB::load(); MonsterDB::load(); AvatarDB::load(); + BadgesDB::load(); WeaponsDB::load(); NPCDB::load(); PETDB::load(); diff --git a/src/resources/db/badgesdb.cpp b/src/resources/db/badgesdb.cpp new file mode 100644 index 000000000..80b480ee0 --- /dev/null +++ b/src/resources/db/badgesdb.cpp @@ -0,0 +1,64 @@ +/* + * The ManaPlus Client + * Copyright (C) 2014-2015 The ManaPlus Developers + * + * This file is part of The ManaPlus Client. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "resources/db/badgesdb.h" + +#include "utils/xmlutils.h" + +#include "debug.h" + +namespace +{ + BadgesInfos mParties; + bool mLoaded = false; +} + +static void loadDB(const std::string &name, BadgesInfos &arr) +{ + readXmlStringMap("badges.xml", + "badges", + name, + "badge", + "name", + "image", + arr); +} + +void BadgesDB::load() +{ + if (mLoaded) + unload(); + + loadDB("party", mParties); +} + +void BadgesDB::unload() +{ + mParties.clear(); + mLoaded = false; +} + +const std::string BadgesDB::getPartyBadge(const std::string &name) +{ + BadgesInfosIter it = mParties.find(name); + if (it == mParties.end()) + return std::string(); + return (*it).second; +} diff --git a/src/resources/db/badgesdb.h b/src/resources/db/badgesdb.h new file mode 100644 index 000000000..2a5bb91f1 --- /dev/null +++ b/src/resources/db/badgesdb.h @@ -0,0 +1,40 @@ +/* + * The ManaPlus Client + * Copyright (C) 2014-2015 The ManaPlus Developers + * + * This file is part of The ManaPlus Client. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef RESOURCES_DB_BADGESDB_H +#define RESOURCES_DB_BADGESDB_H + +#include <map> + +#include "localconsts.h" + +typedef std::map<std::string, std::string> BadgesInfos; +typedef BadgesInfos::const_iterator BadgesInfosIter; + +namespace BadgesDB +{ + void load(); + + void unload(); + + const std::string getPartyBadge(const std::string &name); +} // namespace BadgesDB + +#endif // RESOURCES_DB_BADGESDB_H |