You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
94 lines
2.7 KiB
94 lines
2.7 KiB
/** |
|
* @file animationinfo.h |
|
* |
|
* Contains the core animation information and related logic |
|
*/ |
|
#pragma once |
|
|
|
#include <stdint.h> |
|
|
|
namespace devilution { |
|
|
|
/** |
|
* @brief Specifies what special logics are applied for a Animation |
|
*/ |
|
enum class AnimationDistributionParams : uint8_t { |
|
None, |
|
/* |
|
* @brief ProcessAnimation will be called after SetNewAnimation (in same game tick as NewPlrAnim) |
|
*/ |
|
ProcessAnimationPending, |
|
/* |
|
* @brief Delay of last Frame is ignored (for example, because only Frame and not delay is checked in game_logic) |
|
*/ |
|
SkipsDelayOfLastFrame, |
|
}; |
|
|
|
/* |
|
* @brief Contains the core animation information and related logic |
|
*/ |
|
class AnimationInfo { |
|
public: |
|
/* |
|
* @brief Pointer to Animation Data |
|
*/ |
|
uint8_t *pData; |
|
/* |
|
* @brief Additional delay of each animation in the current animation |
|
*/ |
|
int DelayLen; |
|
/* |
|
* @brief Increases by one each game tick, counting how close we are to DelayLen |
|
*/ |
|
int DelayCounter; |
|
/* |
|
* @brief Number of frames in current animation |
|
*/ |
|
int NumberOfFrames; |
|
/* |
|
* @brief Current frame of animation |
|
*/ |
|
int CurrentFrame; |
|
|
|
/** |
|
* @brief Calculates the Frame to use for the Animation rendering |
|
* @return The Frame to use for rendering |
|
*/ |
|
int GetFrameToUseForRendering() const; |
|
|
|
/** |
|
* @brief Sets the new Animation with all relevant information for rendering |
|
* @param pData Pointer to Animation Data |
|
* @param numberOfFrames Number of Frames in Animation |
|
* @param delayLen Delay after each Animation sequence |
|
* @param params Specifies what special logics are applied to this Animation |
|
* @param numSkippedFrames Number of Frames that will be skipped (for example with modifier "faster attack") |
|
* @param distributeFramesBeforeFrame Distribute the numSkippedFrames only before this frame |
|
*/ |
|
void SetNewAnimation(uint8_t *pData, int numberOfFrames, int delayLen, AnimationDistributionParams params = AnimationDistributionParams::None, int numSkippedFrames = 0, int distributeFramesBeforeFrame = 0); |
|
|
|
/* |
|
* @brief Process the Animation for a game tick (for example advances the frame) |
|
*/ |
|
void ProcessAnimation(); |
|
|
|
private: |
|
/* |
|
* @brief Specifies how many animations-fractions are displayed between two game ticks. this can be > 0, if animations are skipped or < 0 if the same animation is shown in multiple times (delay specified). |
|
*/ |
|
float TickModifier; |
|
/* |
|
* @brief Number of game ticks after the current animation sequence started |
|
*/ |
|
int TicksSinceSequenceStarted; |
|
/* |
|
* @brief Animation Frames that will be adjusted for the skipped Frames/game ticks |
|
*/ |
|
int RelevantFramesForDistributing; |
|
/** |
|
* @brief Animation Frames that wasn't shown from previous Animation |
|
*/ |
|
int SkippedFramesFromPreviousAnimation; |
|
}; |
|
|
|
} // namespace devilution
|
|
|