From ae7d05fce2107e762e84a287f33f2dbad60abd7d Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Sun, 18 Oct 2015 15:37:01 +0300 Subject: Split horse into two sprites before player and after player. --- src/being/being.cpp | 54 +++++++++++++++++++++++++++++--------------- src/being/being.h | 3 ++- src/resources/db/horsedb.cpp | 37 ++++++++++++++++++++++-------- src/resources/horseinfo.h | 18 ++++++++++----- 4 files changed, 77 insertions(+), 35 deletions(-) (limited to 'src') diff --git a/src/being/being.cpp b/src/being/being.cpp index b8f4ce414..711fcf233 100644 --- a/src/being/being.cpp +++ b/src/being/being.cpp @@ -194,7 +194,8 @@ Being::Being(const BeingId id, #ifdef EATHENA_SUPPORT mChat(nullptr), mHorseInfo(nullptr), - mHorseSprite(nullptr), + mDownHorseSprite(nullptr), + mUpHorseSprite(nullptr), #endif mX(0), mY(0), @@ -1439,8 +1440,10 @@ void Being::setAction(const BeingActionT &action, const int attackId) sprite->play(currentAction); } #ifdef EATHENA_SUPPORT - if (mHorseSprite) - mHorseSprite->play(currentAction); + if (mDownHorseSprite) + mDownHorseSprite->play(currentAction); + if (mUpHorseSprite) + mUpHorseSprite->play(currentAction); #endif mAction = action; } @@ -1510,8 +1513,10 @@ void Being::setDirection(const uint8_t direction) } #ifdef EATHENA_SUPPORT - if (mHorseSprite) - mHorseSprite->setSpriteDirection(dir); + if (mDownHorseSprite) + mDownHorseSprite->setSpriteDirection(dir); + if (mUpHorseSprite) + mUpHorseSprite->setSpriteDirection(dir); #endif recalcSpritesOrder(); } @@ -1603,8 +1608,10 @@ void Being::logic() if (mEmotionSprite) mEmotionSprite->update(time); #ifdef EATHENA_SUPPORT - if (mHorseSprite) - mHorseSprite->update(time); + if (mDownHorseSprite) + mDownHorseSprite->update(time); + if (mUpHorseSprite) + mUpHorseSprite->update(time); #endif if (mAnimationEffect) @@ -2669,19 +2676,23 @@ void Being::draw(Graphics *const graphics, const int px = getActorX() + offsetX; const int py = getActorY() + offsetY; #ifdef EATHENA_SUPPORT - if (mHorseInfo) + if (mDownHorseSprite) { - AnimatedSprite *const sprite = mHorseInfo->sprite; - if (sprite) - { - sprite->draw(graphics, - px + mHorseInfo->offsetX, - py + mHorseInfo->offsetY); - } + mDownHorseSprite->draw(graphics, + px + mHorseInfo->downOffsetX, + py + mHorseInfo->downOffsetY); } #endif ActorSprite::draw1(graphics, px, py); drawSpriteAt(graphics, px, py); +#ifdef EATHENA_SUPPORT + if (mUpHorseSprite) + { + mUpHorseSprite->draw(graphics, + px + mHorseInfo->upOffsetX, + py + mHorseInfo->upOffsetY); + } +#endif } } @@ -4031,14 +4042,21 @@ void Being::setRiding(const bool b) { mHorseInfo = HorseDB::get(1); if (mHorseInfo) - mHorseSprite = mHorseInfo->sprite; + { + mDownHorseSprite = mHorseInfo->downSprite; + mUpHorseSprite = mHorseInfo->upSprite; + } else - mHorseSprite = nullptr; + { + mDownHorseSprite = nullptr; + mUpHorseSprite = nullptr; + } } else { mHorseInfo = nullptr; - mHorseSprite = nullptr; + mDownHorseSprite = nullptr; + mUpHorseSprite = nullptr; } } #endif diff --git a/src/being/being.h b/src/being/being.h index 8253cca55..09da505c5 100644 --- a/src/being/being.h +++ b/src/being/being.h @@ -1087,7 +1087,8 @@ class Being notfinal : public ActorSprite, ChatObject *mChat; HorseInfo *mHorseInfo; #endif - AnimatedSprite *mHorseSprite; + AnimatedSprite *mDownHorseSprite; + AnimatedSprite *mUpHorseSprite; int mX; // position in tiles int mY; // position in tiles diff --git a/src/resources/db/horsedb.cpp b/src/resources/db/horsedb.cpp index a3daf76cc..e01ebe27c 100644 --- a/src/resources/db/horsedb.cpp +++ b/src/resources/db/horsedb.cpp @@ -42,10 +42,14 @@ void HorseDB::load() if (mLoaded) unload(); - mUnknown.sprite = AnimatedSprite::load( + mUnknown.downSprite = AnimatedSprite::load( paths.getStringValue("spriteErrorFile")); - mUnknown.offsetX = 0; - mUnknown.offsetY = 0; + mUnknown.upSprite = AnimatedSprite::load( + paths.getStringValue("spriteErrorFile")); + mUnknown.upOffsetX = 0; + mUnknown.upOffsetY = 0; + mUnknown.downOffsetX = 0; + mUnknown.downOffsetY = 0; logger->log1("Initializing horse database..."); @@ -99,22 +103,33 @@ void HorseDB::loadXmlFile(const std::string &fileName) if (!currentInfo) continue; - currentInfo->offsetX = XML::getProperty(horseNode, "offsetX", 0); - currentInfo->offsetY = XML::getProperty(horseNode, "offsetY", 0); + const int offsetX = XML::getProperty(horseNode, "offsetX", 0); + const int offsetY = XML::getProperty(horseNode, "offsetY", 0); + currentInfo->upOffsetX = XML::getProperty(horseNode, "upOffsetX", offsetX); + currentInfo->upOffsetY = XML::getProperty(horseNode, "upOffsetY", offsetY); + currentInfo->downOffsetX = XML::getProperty(horseNode, "downOffsetX", offsetX); + currentInfo->downOffsetY = XML::getProperty(horseNode, "downOffsetY", offsetY); for_each_xml_child_node(spriteNode, horseNode) { if (!spriteNode->xmlChildrenNode) continue; - if (xmlNameEqual(spriteNode, "sprite")) + if (xmlNameEqual(spriteNode, "downSprite")) + { + currentInfo->downSprite = AnimatedSprite::load( + paths.getStringValue("sprites").append(std::string( + reinterpret_cast( + spriteNode->xmlChildrenNode->content))), + XML::getProperty(spriteNode, "variant", 0)); + } + else if (xmlNameEqual(spriteNode, "upSprite")) { - currentInfo->sprite = AnimatedSprite::load( + currentInfo->upSprite = AnimatedSprite::load( paths.getStringValue("sprites").append(std::string( reinterpret_cast( spriteNode->xmlChildrenNode->content))), XML::getProperty(spriteNode, "variant", 0)); - break; } } mHorseInfos[id] = currentInfo; @@ -125,12 +140,14 @@ void HorseDB::unload() { FOR_EACH (HorseInfos::const_iterator, i, mHorseInfos) { - delete i->second->sprite; + delete i->second->upSprite; + delete i->second->downSprite; delete i->second; } mHorseInfos.clear(); - delete mUnknown.sprite; + delete mUnknown.upSprite; + delete mUnknown.downSprite; mLoaded = false; } diff --git a/src/resources/horseinfo.h b/src/resources/horseinfo.h index 262ecb7e7..860700124 100644 --- a/src/resources/horseinfo.h +++ b/src/resources/horseinfo.h @@ -29,16 +29,22 @@ class AnimatedSprite; struct HorseInfo final { HorseInfo() : - sprite(nullptr), - offsetX(0), - offsetY(0) + downSprite(nullptr), + upSprite(nullptr), + downOffsetX(0), + downOffsetY(0), + upOffsetX(0), + upOffsetY(0) { } A_DELETE_COPY(HorseInfo) - AnimatedSprite *sprite; - int offsetX; - int offsetY; + AnimatedSprite *downSprite; + AnimatedSprite *upSprite; + int downOffsetX; + int downOffsetY; + int upOffsetX; + int upOffsetY; }; #endif // RESOURCES_HORSEINFO_H -- cgit v1.2.3-60-g2f50