diff --git a/client/battle/BattleAnimationClasses.cpp b/client/battle/BattleAnimationClasses.cpp index ae1f648b3..1042b342c 100644 --- a/client/battle/BattleAnimationClasses.cpp +++ b/client/battle/BattleAnimationClasses.cpp @@ -456,14 +456,18 @@ bool MovementEndAnimation::init() ENGINE->sound().playSound(stack->unitType()->sounds.endMoving); - if(!myAnim->framesInGroup(ECreatureAnimType::MOVE_END)) + auto groupID = ECreatureAnimType::MOVE_END; + if (stack->hasBonus(Selector::typeSubtype(BonusType::FLYING, BonusCustomSubtype::movementTeleporting)) && myAnim->framesInGroup(ECreatureAnimType::TELEPORT_END)) + groupID = ECreatureAnimType::TELEPORT_END; + + if(!myAnim->framesInGroup(groupID)) { delete this; return false; } - myAnim->setType(ECreatureAnimType::MOVE_END); + myAnim->setType(groupID); myAnim->onAnimationReset += [&](){ delete this; }; return true; @@ -497,13 +501,17 @@ bool MovementStartAnimation::init() logAnim->debug("CMovementStartAnimation::init: stack %s", stack->getName()); ENGINE->sound().playSound(stack->unitType()->sounds.startMoving); - if(!myAnim->framesInGroup(ECreatureAnimType::MOVE_START)) + auto groupID = ECreatureAnimType::MOVE_START; + if (stack->hasBonus(Selector::typeSubtype(BonusType::FLYING, BonusCustomSubtype::movementTeleporting)) && myAnim->framesInGroup(ECreatureAnimType::TELEPORT_START)) + groupID = ECreatureAnimType::TELEPORT_START; + + if(!myAnim->framesInGroup(groupID)) { delete this; return false; } - myAnim->setType(ECreatureAnimType::MOVE_START); + myAnim->setType(groupID); myAnim->onAnimationReset += [&](){ delete this; }; return true; } diff --git a/client/battle/BattleConstants.h b/client/battle/BattleConstants.h index 580e864bd..bf17a8791 100644 --- a/client/battle/BattleConstants.h +++ b/client/battle/BattleConstants.h @@ -96,5 +96,8 @@ enum class ECreatureAnimType GROUP_ATTACK_UP = 40, GROUP_ATTACK_FRONT = 41, - GROUP_ATTACK_DOWN = 42 + GROUP_ATTACK_DOWN = 42, + + TELEPORT_START = 50, + TELEPORT_END = 51, }; diff --git a/client/battle/CreatureAnimation.cpp b/client/battle/CreatureAnimation.cpp index 19e00bdd2..0a3351da2 100644 --- a/client/battle/CreatureAnimation.cpp +++ b/client/battle/CreatureAnimation.cpp @@ -110,6 +110,8 @@ float AnimationControls::getCreatureAnimationSpeed(const CCreature * creature, c case ECreatureAnimType::MOVE_START: case ECreatureAnimType::MOVE_END: + case ECreatureAnimType::TELEPORT_START: + case ECreatureAnimType::TELEPORT_END: return speed; case ECreatureAnimType::DEAD: @@ -389,8 +391,10 @@ bool CreatureAnimation::isIdle() const bool CreatureAnimation::isMoving() const { return getType() == ECreatureAnimType::MOVE_START + || getType() == ECreatureAnimType::TELEPORT_START || getType() == ECreatureAnimType::MOVING || getType() == ECreatureAnimType::MOVE_END + || getType() == ECreatureAnimType::TELEPORT_END || getType() == ECreatureAnimType::TURN_L || getType() == ECreatureAnimType::TURN_R; } diff --git a/docs/modders/Animation_Format.md b/docs/modders/Animation_Format.md index c81d5d541..3c94cf839 100644 --- a/docs/modders/Animation_Format.md +++ b/docs/modders/Animation_Format.md @@ -124,7 +124,7 @@ TODO Animation for creatures consist from multiple groups, with each group representing one specific animation. VCMI uses groups as follows: -**Basic animations** +#### Basic animations - [0] Movement: Used for creature movement - [1] Mouse over: Used for random idle movements and when mouse is moved on the creature @@ -134,50 +134,56 @@ representing one specific animation. VCMI uses groups as follows: - [5] Death: Animation that plays when stack dies - [6] Death (ranged): Alternative animation, plays when stack is killed by ranged attack -**Rotation animations** +#### Rotation animations - [7] Turn left: Animation for rotating stack, only contains first part of animation, with stack turning towards viewer - [8] Turn right: Second part of animation for rotating stack - [9] (unused in vcmi, present in H3 files) - [10] (unused in vcmi, present in H3 files) -**Melee attack animations** +#### Melee attack animations - [11] Attack (up): Attacking animation, stack facing upwards - [12] Attack (front): Attacking animation, stack facing front - [13] Attack (down): Attacking animation, stack facing downwards -**Ranged attack animations** +#### Ranged attack animations - [14] Shooting (up): Ranged attack animation, stack facing upwards - [15] Shooting (front): Ranged attack animation, stack facing front - [16] Shooting (down): Ranged attack animation, stack facing downwards -**Special animations** +#### Special animations - [17] Special (up): Special animation, used if dedicated cast or group attack animations were not found - [18] Special (front): Special animation, used if dedicated cast or group attack animations were not found - [19] Special (down): Special animation, used if dedicated cast or group attack animations were not found -**Additional H3 animations** +#### Additional H3 animations - [20] Movement start: Animation that plays before movement animation starts. - [21] Movement end: Animation that plays after movement animation ends. -**Additional VCMI animations** +#### Additional VCMI animations - [22] Dead: Animation that plays when creature is dead. If not present, will consist from last frame from "Death" group - [23] Dead (ranged): Animation that plays when creature is dead after ranged attack. If not present, will consist from last frame from "Death (ranged)" group - [24] Resurrection: Animation that plays when creature is resurrected. If not present, will consist from reversed version of "Death" animation -**Spellcasting animations** +#### Spellcasting animations - [30] Cast (up): Used when creature casts spell facing upwards - [31] Cast (front): Used when creature casts spell facing front - [32] Cast (down): Used when creature casts spell facing downwards -**Group attack animations** +#### Group attack animations - [40] Group Attack (up): Used when creature attacks multiple target, with primary target facing up (Dragon Breath attack, or creatures like Hydra) - [41] Group Attack (front): Used when creature attacks multiple target, with primary target facing front (Dragon Breath attack, or creatures like Hydra) - [42] Group Attack (down): Used when creature attacks multiple target, with primary target facing downwards (Dragon Breath attack, or creatures like Hydra) + +#### Additional H3 animations + +- [50] Teleportation start: Animation that plays on original unit position when unit teleports. If not present, movement start will play instead +- [51] Teleportation end: Animation that plays on destination position when unit teleports. If not present, movement end will play instead +