diff options
Diffstat (limited to 'src/being')
-rw-r--r-- | src/being/being.cpp | 71 | ||||
-rw-r--r-- | src/being/being.h | 7 |
2 files changed, 67 insertions, 11 deletions
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; |