From 0977134ffdad9ea0e79106fc633ebafd18209765 Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Sun, 15 Nov 2015 17:04:31 +0300 Subject: Add support for different per skill casting animations. --- src/being/being.cpp | 26 ++++++++++++++++++++++++-- src/being/being.h | 4 ++++ src/gui/widgets/skillinfo.cpp | 4 ++++ src/gui/widgets/skillinfo.h | 4 ++++ src/gui/windows/skilldialog.cpp | 9 +++++++++ 5 files changed, 45 insertions(+), 2 deletions(-) diff --git a/src/being/being.cpp b/src/being/being.cpp index 5a4da79fc..31b0ddcc9 100644 --- a/src/being/being.cpp +++ b/src/being/being.cpp @@ -1342,6 +1342,24 @@ std::string Being::getAttackAction(const Attack *const attack1) const return attack1->mAction; } +std::string Being::getCastAction(const SkillInfo *const skill) const +{ + if (!skill) + return getCastAction(); + + if (mHorseId != 0) + return skill->castingRideAction; + if (mMap) + { + const unsigned char mask = mMap->getBlockMask(mX, mY); + if (mask & BlockMask::AIR) + return skill->castingSkyAction; + else if (mask & BlockMask::WATER) + return skill->castingWaterAction; + } + return skill->castingAction; +} + #define getSpriteAction(func, action) \ std::string Being::get##func##Action() const \ { \ @@ -1359,9 +1377,9 @@ std::string Being::getAttackAction(const Attack *const attack1) const } getSpriteAction(Attack, ATTACK) +getSpriteAction(Cast, CAST) getSpriteAction(Dead, DEAD) getSpriteAction(Spawn, SPAWN) -getSpriteAction(Cast, CAST) std::string Being::getStandAction() const { @@ -1447,7 +1465,11 @@ void Being::setAction(const BeingActionT &action, const int attackId) } break; case BeingAction::CAST: - currentAction = getCastAction(); + if (skillDialog) + { + const SkillInfo *const info = skillDialog->getSkill(attackId); + currentAction = getCastAction(info); + } break; case BeingAction::HURT: if (mInfo) diff --git a/src/being/being.h b/src/being/being.h index a31f39be5..461a8626f 100644 --- a/src/being/being.h +++ b/src/being/being.h @@ -68,6 +68,7 @@ class Text; struct ChatObject; struct HorseInfo; +struct SkillInfo; struct ParticleInfo; extern volatile int cur_time; @@ -599,6 +600,9 @@ class Being notfinal : public ActorSprite, std::string getCastAction() const A_WARN_UNUSED; + std::string getCastAction(const SkillInfo *const skill) const + A_WARN_UNUSED; + std::string getMoveAction() const A_WARN_UNUSED; std::string getDeadAction() const A_WARN_UNUSED; diff --git a/src/gui/widgets/skillinfo.cpp b/src/gui/widgets/skillinfo.cpp index 5e64103a9..2047ea31c 100644 --- a/src/gui/widgets/skillinfo.cpp +++ b/src/gui/widgets/skillinfo.cpp @@ -38,6 +38,10 @@ SkillInfo::SkillInfo() : skillEffect(), useButton(), errorText(), + castingAction(), + castingRideAction(), + castingSkyAction(), + castingWaterAction(), dataMap(), model(nullptr), data(nullptr), diff --git a/src/gui/widgets/skillinfo.h b/src/gui/widgets/skillinfo.h index 7b8faa7e4..95099db2c 100644 --- a/src/gui/widgets/skillinfo.h +++ b/src/gui/widgets/skillinfo.h @@ -49,6 +49,10 @@ struct SkillInfo final std::string skillEffect; std::string useButton; std::string errorText; + std::string castingAction; + std::string castingRideAction; + std::string castingSkyAction; + std::string castingWaterAction; SkillDataMap dataMap; SkillModel *model; SkillData *data; diff --git a/src/gui/windows/skilldialog.cpp b/src/gui/windows/skilldialog.cpp index 60eb32b64..7a46cf313 100644 --- a/src/gui/windows/skilldialog.cpp +++ b/src/gui/windows/skilldialog.cpp @@ -52,6 +52,7 @@ #include "utils/timer.h" #include "resources/beingcommon.h" +#include "resources/spriteaction.h" #include "debug.h" @@ -339,6 +340,14 @@ void SkillDialog::loadXmlFile(const std::string &fileName) node, "castingSrcEffectId", -1); skill->castingDstEffectId = XML::getProperty( node, "castingDstEffectId", -1); + skill->castingAction = XML::getProperty(node, + "castingAction", SpriteAction::CAST); + skill->castingRideAction = XML::getProperty(node, + "castingRideAction", SpriteAction::CASTRIDE); + skill->castingSkyAction = XML::getProperty(node, + "castingSkyAction", SpriteAction::CASTSKY); + skill->castingWaterAction = XML::getProperty(node, + "castingWaterAction", SpriteAction::CASTWATER); skill->useTextParameter = XML::getBoolProperty( node, "useTextParameter", false); skill->visible = skill->alwaysVisible; -- cgit v1.2.3-60-g2f50