| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376 | 
							- /*
 
-  * BattleAnimations.h, part of VCMI engine
 
-  *
 
-  * Authors: listed in file AUTHORS in main folder
 
-  *
 
-  * License: GNU General Public License v2.0 or later
 
-  * Full text of license available in license.txt file, in main folder
 
-  *
 
-  */
 
- #pragma once
 
- #include "../../lib/battle/BattleHexArray.h"
 
- #include "../../lib/filesystem/ResourcePath.h"
 
- #include "../../lib/Color.h"
 
- #include "BattleConstants.h"
 
- VCMI_LIB_NAMESPACE_BEGIN
 
- class CStack;
 
- class CCreature;
 
- class CSpell;
 
- class Point;
 
- VCMI_LIB_NAMESPACE_END
 
- class ColorFilter;
 
- class BattleHero;
 
- class CAnimation;
 
- class BattleInterface;
 
- class CreatureAnimation;
 
- struct StackAttackedInfo;
 
- /// Base class of battle animations
 
- class BattleAnimation
 
- {
 
- protected:
 
- 	BattleInterface & owner;
 
- 	bool initialized;
 
- 	std::vector<BattleAnimation *> & pendingAnimations();
 
- 	std::shared_ptr<CreatureAnimation> stackAnimation(const CStack * stack) const;
 
- 	bool stackFacingRight(const CStack * stack);
 
- 	void setStackFacingRight(const CStack * stack, bool facingRight);
 
- 	virtual bool init() = 0; //to be called - if returned false, call again until returns true
 
- public:
 
- 	ui32 ID; //unique identifier
 
- 	bool isInitialized();
 
- 	bool tryInitialize();
 
- 	virtual void tick(uint32_t msPassed) {} //call every new frame
 
- 	virtual ~BattleAnimation();
 
- 	BattleAnimation(BattleInterface & owner);
 
- };
 
- /// Sub-class which is responsible for managing the battle stack animation.
 
- class BattleStackAnimation : public BattleAnimation
 
- {
 
- public:
 
- 	std::shared_ptr<CreatureAnimation> myAnim; //animation for our stack, managed by BattleInterface
 
- 	const CStack * stack; //id of stack whose animation it is
 
- 	BattleStackAnimation(BattleInterface & owner, const CStack * _stack);
 
- 	void rotateStack(BattleHex hex);
 
- };
 
- class StackActionAnimation : public BattleStackAnimation
 
- {
 
- 	ECreatureAnimType nextGroup;
 
- 	ECreatureAnimType currGroup;
 
- 	AudioPath sound;
 
- public:
 
- 	void setNextGroup( ECreatureAnimType group );
 
- 	void setGroup( ECreatureAnimType group );
 
- 	void setSound( const AudioPath & sound );
 
- 	ECreatureAnimType getGroup() const;
 
- 	StackActionAnimation(BattleInterface & owner, const CStack * _stack);
 
- 	~StackActionAnimation();
 
- 	bool init() override;
 
- };
 
- /// Animation of a defending unit
 
- class DefenceAnimation : public StackActionAnimation
 
- {
 
- public:
 
- 	DefenceAnimation(BattleInterface & owner, const CStack * stack);
 
- };
 
- /// Animation of a hit unit
 
- class HittedAnimation : public StackActionAnimation
 
- {
 
- public:
 
- 	HittedAnimation(BattleInterface & owner, const CStack * stack);
 
- };
 
- /// Animation of a dying unit
 
- class DeathAnimation : public StackActionAnimation
 
- {
 
- public:
 
- 	DeathAnimation(BattleInterface & owner, const CStack * stack, bool ranged);
 
- };
 
- /// Resurrects stack from dead state
 
- class ResurrectionAnimation : public StackActionAnimation
 
- {
 
- public:
 
- 	ResurrectionAnimation(BattleInterface & owner, const CStack * _stack);
 
- };
 
- class ColorTransformAnimation : public BattleStackAnimation
 
- {
 
- 	std::vector<ColorRGBA> effectColors;
 
- 	std::vector<float> transparency;
 
- 	std::vector<float> timePoints;
 
- 	const CSpell * spell;
 
- 	float totalProgress;
 
- 	bool init() override;
 
- 	void tick(uint32_t msPassed) override;
 
- public:
 
- 	ColorTransformAnimation(BattleInterface & owner, const CStack * _stack, const std::string & colorFilterName, const CSpell * spell);
 
- };
 
- /// Base class for all animations that play during stack movement
 
- class StackMoveAnimation : public BattleStackAnimation
 
- {
 
- public:
 
- 	BattleHex nextHex;
 
- 	BattleHex prevHex;
 
- protected:
 
- 	StackMoveAnimation(BattleInterface & owner, const CStack * _stack, BattleHex prevHex, BattleHex nextHex);
 
- };
 
- /// Move animation of a creature
 
- class MovementAnimation : public StackMoveAnimation
 
- {
 
- private:
 
- 	int moveSoundHandler; // sound handler used when moving a unit
 
- 	const BattleHexArray & destTiles; //full path, includes already passed hexes
 
- 	ui32 currentMoveIndex; // index of nextHex in destTiles
 
- 	double begX, begY; // starting position
 
- 	double distanceX, distanceY; // full movement distance, may be negative if creture moves topleft
 
- 	/// progress gain per second
 
- 	double progressPerSecond;
 
- 	/// range 0 -> 1, indicates move progrees. 0 = movement starts, 1 = move ends
 
- 	double progress;
 
- public:
 
- 	bool init() override;
 
- 	void tick(uint32_t msPassed) override;
 
- 	MovementAnimation(BattleInterface & owner, const CStack *_stack, const BattleHexArray & _destTiles, int _distance);
 
- 	~MovementAnimation();
 
- };
 
- /// Move end animation of a creature
 
- class MovementEndAnimation : public StackMoveAnimation
 
- {
 
- public:
 
- 	bool init() override;
 
- 	MovementEndAnimation(BattleInterface & owner, const CStack * _stack, BattleHex destTile);
 
- 	~MovementEndAnimation();
 
- };
 
- /// Move start animation of a creature
 
- class MovementStartAnimation : public StackMoveAnimation
 
- {
 
- public:
 
- 	bool init() override;
 
- 	MovementStartAnimation(BattleInterface & owner, const CStack * _stack);
 
- };
 
- /// Class responsible for animation of stack chaning direction (left <-> right)
 
- class ReverseAnimation : public StackMoveAnimation
 
- {
 
- 	void setupSecondPart();
 
- public:
 
- 	bool init() override;
 
- 	ReverseAnimation(BattleInterface & owner, const CStack * stack, BattleHex dest);
 
- };
 
- /// This class is responsible for managing the battle attack animation
 
- class AttackAnimation : public StackActionAnimation
 
- {
 
- protected:
 
- 	BattleHex dest; //attacked hex
 
- 	const CStack *defendingStack;
 
- 	const CStack *attackingStack;
 
- 	int attackingStackPosBeforeReturn; //for stacks with return_after_strike feature
 
- 	const CCreature * getCreature() const;
 
- 	ECreatureAnimType findValidGroup( const std::vector<ECreatureAnimType> candidates ) const;
 
- public:
 
- 	AttackAnimation(BattleInterface & owner, const CStack *attacker, BattleHex _dest, const CStack *defender);
 
- };
 
- /// Hand-to-hand attack
 
- class MeleeAttackAnimation : public AttackAnimation
 
- {
 
- 	ECreatureAnimType getUpwardsGroup(bool multiAttack) const;
 
- 	ECreatureAnimType getForwardGroup(bool multiAttack) const;
 
- 	ECreatureAnimType getDownwardsGroup(bool multiAttack) const;
 
- 	ECreatureAnimType selectGroup(bool multiAttack);
 
- public:
 
- 	MeleeAttackAnimation(BattleInterface & owner, const CStack * attacker, BattleHex _dest, const CStack * _attacked, bool multiAttack);
 
- 	void tick(uint32_t msPassed) override;
 
- };
 
- class RangedAttackAnimation : public AttackAnimation
 
- {
 
- 	void setAnimationGroup();
 
- 	void initializeProjectile();
 
- 	void emitProjectile();
 
- 	void emitExplosion();
 
- protected:
 
- 	bool projectileEmitted;
 
- 	virtual ECreatureAnimType getUpwardsGroup() const = 0;
 
- 	virtual ECreatureAnimType getForwardGroup() const = 0;
 
- 	virtual ECreatureAnimType getDownwardsGroup() const = 0;
 
- 	virtual void createProjectile(const Point & from, const Point & dest) const = 0;
 
- 	virtual uint32_t getAttackClimaxFrame() const = 0;
 
- public:
 
- 	RangedAttackAnimation(BattleInterface & owner, const CStack * attacker, BattleHex dest, const CStack * defender);
 
- 	~RangedAttackAnimation();
 
- 	bool init() override;
 
- 	void tick(uint32_t msPassed) override;
 
- };
 
- /// Shooting attack
 
- class ShootingAnimation : public RangedAttackAnimation
 
- {
 
- 	ECreatureAnimType getUpwardsGroup() const override;
 
- 	ECreatureAnimType getForwardGroup() const override;
 
- 	ECreatureAnimType getDownwardsGroup() const override;
 
- 	void createProjectile(const Point & from, const Point & dest) const override;
 
- 	uint32_t getAttackClimaxFrame() const override;
 
- public:
 
- 	ShootingAnimation(BattleInterface & owner, const CStack * attacker, BattleHex dest, const CStack * defender);
 
- };
 
- /// Catapult attack
 
- class CatapultAnimation : public ShootingAnimation
 
- {
 
- private:
 
- 	bool explosionEmitted;
 
- 	int catapultDamage;
 
- public:
 
- 	CatapultAnimation(BattleInterface & owner, const CStack * attacker, BattleHex dest, const CStack * defender, int _catapultDmg = 0);
 
- 	void createProjectile(const Point & from, const Point & dest) const override;
 
- 	void tick(uint32_t msPassed) override;
 
- };
 
- class CastAnimation : public RangedAttackAnimation
 
- {
 
- 	const CSpell * spell;
 
- 	ECreatureAnimType getUpwardsGroup() const override;
 
- 	ECreatureAnimType getForwardGroup() const override;
 
- 	ECreatureAnimType getDownwardsGroup() const override;
 
- 	void createProjectile(const Point & from, const Point & dest) const override;
 
- 	uint32_t getAttackClimaxFrame() const override;
 
- public:
 
- 	CastAnimation(BattleInterface & owner, const CStack * attacker, BattleHex dest_, const CStack * defender, const CSpell * spell);
 
- };
 
- class DummyAnimation : public BattleAnimation
 
- {
 
- private:
 
- 	int counter;
 
- 	int howMany;
 
- public:
 
- 	bool init() override;
 
- 	void tick(uint32_t msPassed) override;
 
- 	DummyAnimation(BattleInterface & owner, int howManyFrames);
 
- };
 
- /// Class that plays effect at one or more positions along with (single) sound effect
 
- class EffectAnimation : public BattleAnimation
 
- {
 
- 	std::string soundName;
 
- 	int effectFlags;
 
- 	float transparencyFactor;
 
- 	bool effectFinished;
 
- 	bool reversed;
 
- 	std::shared_ptr<CAnimation>	animation;
 
- 	std::vector<Point> positions;
 
- 	BattleHexArray battlehexes;
 
- 	bool alignToBottom() const;
 
- 	bool waitForSound() const;
 
- 	bool forceOnTop() const;
 
- 	bool screenFill() const;
 
- 	void onEffectFinished();
 
- 	void clearEffect();
 
- 	void playEffect(uint32_t msPassed);
 
- public:
 
- 	enum EEffectFlags
 
- 	{
 
- 		ALIGN_TO_BOTTOM = 1,
 
- 		FORCE_ON_TOP    = 2,
 
- 		SCREEN_FILL     = 4,
 
- 	};
 
- 	/// Create animation with screen-wide effect
 
- 	EffectAnimation(BattleInterface & owner, const AnimationPath & animationName, int effects = 0, float transparencyFactor = 1.f, bool reversed = false);
 
- 	/// Create animation positioned at point(s). Note that positions must be are absolute, including battleint position offset
 
- 	EffectAnimation(BattleInterface & owner, const AnimationPath & animationName, Point pos                   , int effects = 0, bool reversed = false);
 
- 	EffectAnimation(BattleInterface & owner, const AnimationPath & animationName, std::vector<Point> pos      , int effects = 0, bool reversed = false);
 
- 	/// Create animation positioned at certain hex(es)
 
- 	EffectAnimation(BattleInterface & owner, const AnimationPath & animationName, BattleHex hex               , int effects = 0, float transparencyFactor = 1.0f, bool reversed = false);
 
- 	EffectAnimation(BattleInterface & owner, const AnimationPath & animationName, const BattleHexArray & hexes, int effects = 0, bool reversed = false);
 
- 	EffectAnimation(BattleInterface & owner, const AnimationPath & animationName, Point pos, BattleHex hex,     int effects = 0, bool reversed = false);
 
- 	 ~EffectAnimation();
 
- 	bool init() override;
 
- 	void tick(uint32_t msPassed) override;
 
- };
 
- class HeroCastAnimation : public BattleAnimation
 
- {
 
- 	std::shared_ptr<BattleHero> hero;
 
- 	const CStack * target;
 
- 	const CSpell * spell;
 
- 	BattleHex tile;
 
- 	bool projectileEmitted;
 
- 	void initializeProjectile();
 
- 	void emitProjectile();
 
- 	void emitAnimationEvent();
 
- public:
 
- 	HeroCastAnimation(BattleInterface & owner, std::shared_ptr<BattleHero> hero, BattleHex dest, const CStack * defender, const CSpell * spell);
 
- 	void tick(uint32_t msPassed) override;
 
- 	bool init() override;
 
- };
 
 
  |