From 8f24400fc10658db9636e6cdd315504d75c71a5d Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Mon, 20 Jan 2014 21:09:46 +0300 Subject: add attack action for pets. New pets db attributes: attackOffsetX attackOffsetY attaclDirectionType --- src/being/being.cpp | 41 +++++++++++++++++++++++++++++++++++++++-- src/being/being.h | 8 ++++++++ src/being/localplayer.h | 6 ++++++ src/resources/beinginfo.cpp | 3 +++ src/resources/beinginfo.h | 21 +++++++++++++++++++++ src/resources/db/petdb.cpp | 6 ++++++ 6 files changed, 83 insertions(+), 2 deletions(-) diff --git a/src/being/being.cpp b/src/being/being.cpp index aa2b875af..dbe4d7350 100644 --- a/src/being/being.cpp +++ b/src/being/being.cpp @@ -134,6 +134,8 @@ Being::Being(const int id, const Type type, const uint16_t subtype, mAttackSpeed(350), mLevel(0), mAttackRange(1), + mLastAttackX(0), + mLastAttackY(0), mGender(GENDER_UNSPECIFIED), mAction(STAND), mSubType(0xFFFF), @@ -760,6 +762,9 @@ void Being::handleAttack(Being *const victim, const int damage, if (this != player_node) setAction(Being::ATTACK, attackId); + mLastAttackX = victim->getTileX(); + mLastAttackY = victim->getTileY(); + if (mType == PLAYER && mEquippedWeapon) fireMissile(victim, mEquippedWeapon->getMissileParticleFile()); else if (mInfo->getAttack(attackId)) @@ -1720,14 +1725,24 @@ void Being::petLogic() return; } } - if (mAction == STAND) + if (mOwner->getCurrentAction() != ATTACK) + { + if (mAction == ATTACK) + setAction(STAND, 0); + } + else + { + if (mAction == STAND || mAction == ATTACK) + setAction(ATTACK, 0); + } + + if (mAction == STAND || mAction == ATTACK) { int directionType = 0; switch (mOwner->getCurrentAction()) { case STAND: case MOVE: - case ATTACK: case HURT: case SPAWN: default: @@ -1739,6 +1754,9 @@ void Being::petLogic() case DEAD: directionType = mInfo->getDeadDirectionType(); break; + case ATTACK: + directionType = mInfo->getAttackDirectionType(); + break; } int newDir = 0; @@ -1773,6 +1791,21 @@ void Being::petLogic() else if (dstY < dstY0) newDir |= UP; break; + + case 4: + { + const int dstX2 = mOwner->getLastAttackX(); + const int dstY2 = mOwner->getLastAttackY(); + if (dstX > dstX2) + newDir |= LEFT; + else if (dstX < dstX2) + newDir |= RIGHT; + if (dstY > dstY2) + newDir |= UP; + else if (dstY < dstY2) + newDir |= DOWN; + break; + } } if (newDir && newDir != getDirection()) setDirection(newDir); @@ -3337,6 +3370,10 @@ void Being::fixPetSpawnPos(int &dstX, int &dstY) const break; case ATTACK: + offsetX1 = mInfo->getAttackOffsetX(); + offsetY1 = mInfo->getAttackOffsetY(); + break; + case SPAWN: case HURT: case STAND: diff --git a/src/being/being.h b/src/being/being.h index 7314fe1f1..d3dfe2cc1 100644 --- a/src/being/being.h +++ b/src/being/being.h @@ -930,6 +930,12 @@ class Being : public ActorSprite, public ConfigListener int decUsage() { return --mUsageCounter; } + virtual int getLastAttackX() const + { return mLastAttackX; } + + virtual int getLastAttackY() const + { return mLastAttackY; } + protected: /** * Updates name's location. @@ -996,6 +1002,8 @@ class Being : public ActorSprite, public ConfigListener int mLevel; int mAttackRange; + int mLastAttackX; + int mLastAttackY; Gender mGender; Action mAction; /**< Action the being is performing */ uint16_t mSubType; /**< Subtype (graphical view, basically) */ diff --git a/src/being/localplayer.h b/src/being/localplayer.h index 0e6ebe8a4..88a6f6754 100644 --- a/src/being/localplayer.h +++ b/src/being/localplayer.h @@ -503,6 +503,12 @@ class LocalPlayer final : public Being, std::string getGameModifiersString(); + int getLastAttackX() const override final + { return mTarget ? mTarget->getTileX() : mLastAttackX; } + + int getLastAttackY() const override final + { return mTarget ? mTarget->getTileY() : mLastAttackY; } + protected: void updateCoords() override final; diff --git a/src/resources/beinginfo.cpp b/src/resources/beinginfo.cpp index 38c141d63..40ea7af1a 100644 --- a/src/resources/beinginfo.cpp +++ b/src/resources/beinginfo.cpp @@ -70,10 +70,13 @@ BeingInfo::BeingInfo() : mMoveOffsetY(0), mDeadOffsetX(0), mDeadOffsetY(0), + mAttackOffsetX(0), + mAttackOffsetY(0), mThinkTime(50), mDirectionType(1), mSitDirectionType(1), mDeadDirectionType(1), + mAttackDirectionType(1), mStaticMaxHP(false), mTargetSelection(true) { diff --git a/src/resources/beinginfo.h b/src/resources/beinginfo.h index d862f1020..31725d218 100644 --- a/src/resources/beinginfo.h +++ b/src/resources/beinginfo.h @@ -284,6 +284,18 @@ class BeingInfo final int getDeadOffsetY() const A_WARN_UNUSED { return mDeadOffsetY; } + void setAttackOffsetX(const int n) + { mAttackOffsetX = n; } + + int getAttackOffsetX() const A_WARN_UNUSED + { return mAttackOffsetX; } + + void setAttackOffsetY(const int n) + { mAttackOffsetY = n; } + + int getAttackOffsetY() const A_WARN_UNUSED + { return mAttackOffsetY; } + void setThinkTime(const int n) { mThinkTime = n; } @@ -308,6 +320,12 @@ class BeingInfo final int getDeadDirectionType() const A_WARN_UNUSED { return mDeadDirectionType; } + void setAttackDirectionType(const int n) + { mAttackDirectionType = n; } + + int getAttackDirectionType() const A_WARN_UNUSED + { return mAttackDirectionType; } + void setColorsList(const std::string &name); std::string getColor(const int idx) const A_WARN_UNUSED; @@ -348,10 +366,13 @@ class BeingInfo final int mMoveOffsetY; int mDeadOffsetX; int mDeadOffsetY; + int mAttackOffsetX; + int mAttackOffsetY; int mThinkTime; int mDirectionType; int mSitDirectionType; int mDeadDirectionType; + int mAttackDirectionType; bool mStaticMaxHP; bool mTargetSelection; }; diff --git a/src/resources/db/petdb.cpp b/src/resources/db/petdb.cpp index c9f3bdbeb..7af3c5d09 100644 --- a/src/resources/db/petdb.cpp +++ b/src/resources/db/petdb.cpp @@ -132,6 +132,10 @@ void PETDB::loadXmlFile(const std::string &fileName) "deadOffsetX", 0)); currentInfo->setDeadOffsetY(XML::getProperty(petNode, "deadOffsetY", 1)); + currentInfo->setAttackOffsetX(XML::getProperty(petNode, + "attackOffsetX", currentInfo->getTargetOffsetX())); + currentInfo->setAttackOffsetY(XML::getProperty(petNode, + "attackOffsetY", currentInfo->getTargetOffsetY())); currentInfo->setThinkTime(XML::getProperty(petNode, "thinkTime", 500) / 10); @@ -142,6 +146,8 @@ void PETDB::loadXmlFile(const std::string &fileName) "sitDirectionType", 1)); currentInfo->setDeadDirectionType(XML::getProperty(petNode, "deadDirectionType", 1)); + currentInfo->setAttackDirectionType(XML::getProperty(petNode, + "attackDirectionType", 4)); SpriteDisplay display; for_each_xml_child_node(spriteNode, petNode) -- cgit v1.2.3-70-g09d2