1#include "Player/PlayerAnimFrameCtrl.h"
2
3#include "Library/LiveActor/ActorActionFunction.h"
4
5PlayerAnimFrameCtrl::PlayerAnimFrameCtrl() = default;
6
7void PlayerAnimFrameCtrl::startAction(al::LiveActor* player, const sead::SafeString& name) {
8 mActionName = name;
9 mIsActionRepeat = !al::isActionOneTime(actor: player, actionName: name.cstr());
10 mCurrentFrame = 0.0f;
11 mActionFrameMax = al::getActionFrameMax(actor: player, actionName: name.cstr());
12 mRate = 1.0f;
13 mIsSkipUpdate = true;
14}
15
16void PlayerAnimFrameCtrl::changeActionName(al::LiveActor* player, const sead::SafeString& name) {
17 mActionName = name;
18 mActionFrameMax = al::getActionFrameMax(actor: player, actionName: name.cstr());
19}
20
21void PlayerAnimFrameCtrl::update() {
22 if (mIsSkipUpdate) {
23 mIsSkipUpdate = false;
24 return;
25 }
26
27 mCurrentFrame += mRate;
28 if (mCurrentFrame >= mActionFrameMax) {
29 if (mIsActionRepeat)
30 mCurrentFrame -= mActionFrameMax;
31 else
32 mCurrentFrame = mActionFrameMax;
33 }
34}
35
36void PlayerAnimFrameCtrl::updateSync(al::LiveActor* player) {
37 mIsSkipUpdate = false;
38 mRate = al::getActionFrameRate(actor: player);
39 mCurrentFrame = al::getActionFrame(actor: player) + mRate;
40}
41
42void PlayerAnimFrameCtrl::setFrame(f32 frame) {
43 if (mIsActionRepeat) {
44 // doing modf manually
45 mCurrentFrame = frame - (mActionFrameMax * (u32)(frame / mActionFrameMax));
46 } else if (mCurrentFrame > mActionFrameMax) {
47 mCurrentFrame = mActionFrameMax;
48 }
49
50 mIsSkipUpdate = true;
51}
52
53const char* PlayerAnimFrameCtrl::getActionName() const {
54 return mActionName.cstr();
55}
56
57f32 PlayerAnimFrameCtrl::getCurrentFrame() const {
58 return mCurrentFrame;
59}
60
61f32 PlayerAnimFrameCtrl::getRate() const {
62 return mRate;
63}
64
65bool PlayerAnimFrameCtrl::isActionEnd() const {
66 return !mIsActionRepeat && mCurrentFrame >= mActionFrameMax;
67}
68