summaryrefslogtreecommitdiff
path: root/src/being
diff options
context:
space:
mode:
Diffstat (limited to 'src/being')
-rw-r--r--src/being/being.cpp73
-rw-r--r--src/being/being.h9
-rw-r--r--src/being/castingeffect.cpp101
-rw-r--r--src/being/castingeffect.h81
4 files changed, 198 insertions, 66 deletions
diff --git a/src/being/being.cpp b/src/being/being.cpp
index 75a18b2f2..04dc00025 100644
--- a/src/being/being.cpp
+++ b/src/being/being.cpp
@@ -36,6 +36,7 @@
#include "being/beingcacheentry.h"
#include "being/beingflag.h"
#include "being/beingspeech.h"
+#include "being/castingeffect.h"
#include "being/localplayer.h"
#include "being/playerinfo.h"
#include "being/playerrelations.h"
@@ -245,11 +246,6 @@ Being::Being(const BeingId id,
mManner(0),
mAreaSize(11),
mCastEndTime(0),
- mCastRectX(0),
- mCastRectSize(0),
- mCastRectY(0),
- mCastAnimationX(0),
- mCastAnimationY(0),
#ifdef EATHENA_SUPPORT
mCreatorId(BeingId_zero),
#endif
@@ -265,8 +261,7 @@ Being::Being(const BeingId id,
mAway(false),
mInactive(false),
mNeedPosUpdate(true),
- mPetAi(true),
- mDrawCast(false)
+ mPetAi(true)
{
for (int f = 0; f < 20; f ++)
{
@@ -1631,8 +1626,6 @@ void Being::setAction(const BeingActionT &restrict action,
mEmotionSprite->play(currentAction);
if (mAnimationEffect)
mAnimationEffect->play(currentAction);
- if (mCastingEffect)
- mCastingEffect->play(currentAction);
for_each_badges()
{
AnimatedSprite *const sprite = mBadges[f];
@@ -1704,8 +1697,6 @@ void Being::setDirection(const uint8_t direction) restrict2
mEmotionSprite->setSpriteDirection(dir);
if (mAnimationEffect)
mAnimationEffect->setSpriteDirection(dir);
- if (mCastingEffect)
- mCastingEffect->setSpriteDirection(dir);
for_each_badges()
{
@@ -1835,7 +1826,6 @@ void Being::logic() restrict2
if (mCastEndTime != 0 && mCastEndTime < tick_time)
{
mCastEndTime = 0;
- mDrawCast = false;
delete2(mCastingEffect);
}
@@ -3548,29 +3538,6 @@ void Being::drawPlayer(Graphics *restrict const graphics,
drawBeingCursor(graphics, px, py);
drawPlayerSpriteAt(graphics, px, py);
#endif
- if (mDrawCast)
- drawCasting(graphics, offsetX, offsetY);
- }
-}
-
-void Being::drawCasting(Graphics *const graphics,
- const int offsetX,
- const int offsetY) const
-{
- graphics->setColor(userPalette->getColorWithAlpha(
- UserColorId::ATTACK_RANGE_BORDER));
-
- graphics->drawRectangle(Rect(
- mCastRectX + offsetX,
- mCastRectY + offsetY,
- mCastRectSize,
- mCastRectSize));
-
- if (mCastingEffect)
- {
- mCastingEffect->draw(graphics,
- mCastAnimationX + offsetX,
- mCastAnimationY + offsetY);
}
}
@@ -5097,14 +5064,9 @@ void Being::addCast(const int dstX,
if (waitTimeTicks <= 0)
{
mCastEndTime = 0;
- mDrawCast = false;
return;
}
mCastEndTime = tick_time + waitTimeTicks;
- mDrawCast = true;
- mCastRectX = (dstX - range) * mapTileSize;
- mCastRectY = (dstY - range) * mapTileSize;
- mCastRectSize = range * mapTileSize * 2 + mapTileSize;
SkillData *const data = skillDialog->getSkillDataByLevel(
skillId,
skillLevel);
@@ -5112,25 +5074,18 @@ void Being::addCast(const int dstX,
if (data)
{
const std::string castingAnimation = data->castingAnimation;
- if (!castingAnimation.empty())
- {
- mCastingEffect = AnimatedSprite::load(
- paths.getStringValue("sprites") + castingAnimation);
- if (mCastingEffect)
- {
- mCastAnimationX = mCastRectX +
- (mCastRectSize - mCastingEffect->getWidth()) / 2;
- mCastAnimationY = mCastRectY +
- (mCastRectSize - mCastingEffect->getHeight()) / 2;
- }
- else
- {
- reportAlways("Skill %d/%d casting animation '%s' load failed",
- skillId,
- skillLevel,
- castingAnimation.c_str());
- }
- }
+ mCastingEffect = new CastingEffect(skillId,
+ skillLevel,
+ castingAnimation,
+ dstX,
+ dstY,
+ range);
+ mCastingEffect->setMap(mMap);
+ }
+ else
+ {
+ reportAlways("Want to draw casting for unknown skill %d",
+ skillId);
}
}
diff --git a/src/being/being.h b/src/being/being.h
index 72e6d2065..737a5efd5 100644
--- a/src/being/being.h
+++ b/src/being/being.h
@@ -50,6 +50,7 @@ static const int DEFAULT_BEING_HEIGHT = 32;
class AnimatedSprite;
class BeingCacheEntry;
+class CastingEffect;
class Color;
class Equipment;
class FlashText;
@@ -1095,7 +1096,7 @@ class Being notfinal : public ActorSprite,
BeingInfo *restrict mInfo;
AnimatedSprite *restrict mEmotionSprite;
AnimatedSprite *restrict mAnimationEffect;
- AnimatedSprite *restrict mCastingEffect;
+ CastingEffect *restrict mCastingEffect;
AnimatedSprite *restrict mBadges[BadgeIndex::BadgeIndexSize];
std::string mSpriteAction;
@@ -1272,11 +1273,6 @@ class Being notfinal : public ActorSprite,
int mManner;
int mAreaSize;
int mCastEndTime;
- int mCastRectX;
- int mCastRectSize;
- int mCastRectY;
- int mCastAnimationX;
- int mCastAnimationY;
#ifdef EATHENA_SUPPORT
BeingId mCreatorId;
#endif
@@ -1293,7 +1289,6 @@ class Being notfinal : public ActorSprite,
bool mInactive;
bool mNeedPosUpdate;
bool mPetAi;
- bool mDrawCast;
};
extern std::list<BeingCacheEntry*> beingInfoCache;
diff --git a/src/being/castingeffect.cpp b/src/being/castingeffect.cpp
new file mode 100644
index 000000000..abacfde48
--- /dev/null
+++ b/src/being/castingeffect.cpp
@@ -0,0 +1,101 @@
+/*
+ * The ManaPlus Client
+ * Copyright (C) 2011-2016 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 "being/castingeffect.h"
+
+#include "configuration.h"
+
+#include "const/resources/map/map.h"
+
+#include "gui/userpalette.h"
+
+#include "render/graphics.h"
+
+#include "resources/sprite/animatedsprite.h"
+
+#include "utils/checkutils.h"
+
+#include "debug.h"
+
+CastingEffect::CastingEffect(const int skillId,
+ const int skillLevel,
+ const std::string &animation,
+ const int x,
+ const int y,
+ const int range) :
+ Actor(),
+ mSprite(animation.empty() ? nullptr :
+ AnimatedSprite::load(paths.getStringValue("sprites") + animation)),
+ mPixelX(x * mapTileSize),
+ mPixelY(y * mapTileSize),
+ mRectX((x - range) * mapTileSize),
+ mRectY((y - range) * mapTileSize),
+ mRectSize(range * mapTileSize * 2 + mapTileSize),
+ mAnimationX(mRectX + (mRectSize - (mSprite ?
+ mSprite->getWidth() : 0)) / 2),
+ mAnimationY(mRectY + (mRectSize - (mSprite ?
+ mSprite->getHeight() : 0)) / 2),
+ mYDiff(range * mapTileSize + 31)
+{
+ if (!mSprite)
+ {
+ reportAlways("Skill %d/%d casting animation '%s' load failed",
+ skillId,
+ skillLevel,
+ animation.c_str());
+ }
+}
+
+CastingEffect::~CastingEffect()
+{
+}
+
+void CastingEffect::draw(Graphics *const graphics,
+ const int offsetX,
+ const int offsetY) const
+{
+ graphics->setColor(userPalette->getColorWithAlpha(
+ UserColorId::ATTACK_RANGE_BORDER));
+
+ graphics->drawRectangle(Rect(
+ mRectX + offsetX,
+ mRectY + offsetY,
+ mRectSize,
+ mRectSize));
+ if (mSprite)
+ {
+ mSprite->draw(graphics,
+ mAnimationX + offsetX,
+ mAnimationY + offsetY);
+ }
+}
+
+void CastingEffect::update(const int time)
+{
+ if (mSprite)
+ mSprite->update(time);
+}
+
+bool CastingEffect::isTerminated() const
+{
+ if (mSprite)
+ return mSprite->isTerminated();
+ return false;
+}
diff --git a/src/being/castingeffect.h b/src/being/castingeffect.h
new file mode 100644
index 000000000..c12305b47
--- /dev/null
+++ b/src/being/castingeffect.h
@@ -0,0 +1,81 @@
+/*
+ * The ManaPlus Client
+ * Copyright (C) 2011-2016 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 BEING_CASTINGEFFECT_H
+#define BEING_CASTINGEFFECT_H
+
+#include "being/actor.h"
+
+#include "enums/being/actortype.h"
+
+#include "enums/simpletypes/beingid.h"
+
+#include "localconsts.h"
+
+class AnimatedSprite;
+class Map;
+
+class CastingEffect final : public Actor
+{
+ public:
+ CastingEffect(const int skillId,
+ const int skillLevel,
+ const std::string &animation,
+ const int x,
+ const int y,
+ const int range);
+
+ A_DELETE_COPY(CastingEffect)
+
+ virtual ~CastingEffect();
+
+ virtual ActorTypeT getType() const noexcept2 A_WARN_UNUSED
+ { return ActorType::Unknown; }
+
+ void draw(Graphics *const graphics,
+ const int offsetX,
+ const int offsetY) const override final A_NONNULL(2);
+
+ virtual int getSortPixelY() const restrict2 override A_WARN_UNUSED
+ { return mPixelY - mYDiff; }
+
+ void update(const int time);
+
+ bool isTerminated() const;
+
+ float getAlpha() const override final A_WARN_UNUSED
+ { return 1.0f; }
+
+ void setAlpha(const float alpha A_UNUSED) override final
+ { }
+
+ protected:
+ AnimatedSprite *mSprite;
+ int mPixelX;
+ int mPixelY;
+ int mRectX;
+ int mRectY;
+ int mRectSize;
+ int mAnimationX;
+ int mAnimationY;
+ int mYDiff;
+};
+
+#endif // BEING_CASTINGEFFECT_H