OdysseyDecomp/lib/al/Library/Movement/SwingMovement.cpp
2026-04-22 20:18:01 +02:00

80 lines
2.2 KiB
C++

#include "Library/Movement/SwingMovement.h"
#include "Library/Math/MathUtil.h"
#include "Library/Nerve/NerveSetupUtil.h"
#include "Library/Nerve/NerveUtil.h"
#include "Library/Placement/PlacementFunction.h"
namespace {
using namespace al;
NERVE_IMPL(SwingMovement, Move)
NERVE_IMPL(SwingMovement, Stop)
NERVES_MAKE_NOSTRUCT(SwingMovement, Move, Stop)
} // namespace
namespace al {
SwingMovement::SwingMovement() : NerveExecutor("スイング動作計算") {
initNerve(&Move, 0);
}
SwingMovement::SwingMovement(const ActorInitInfo& info) : NerveExecutor("スイング動作計算") {
tryGetArg(&mSwingAngle, info, "SwingAngle");
tryGetArg(&mSwingCycle, info, "SwingCycle");
tryGetArg(&mDelayRate, info, "DelayRate");
tryGetArg(&mStopTime, info, "StopTime");
tryGetArg(&mOffsetRotate, info, "OffsetRotate");
mFrameInCycle = (s32)(((f32)mDelayRate - 25.0f) / 100.0f * (f32)mSwingCycle);
updateRotate();
initNerve(&Move, 0);
}
bool SwingMovement::updateRotate() {
f32 degree = (f32)mFrameInCycle * 360.0f / (f32)mSwingCycle;
f32 swingAngle = sead::Mathf::abs(mSwingAngle);
if (swingAngle < 180.0f) {
mCurrentAngle =
sead::Mathf::sin(sead::Mathf::deg2rad(degree)) * mSwingAngle + mOffsetRotate;
return mFrameInCycle % mSwingCycle == mSwingCycle / 4 ||
mFrameInCycle % mSwingCycle == 3 * mSwingCycle / 4;
}
f32 swingAngleSign = sign(mSwingAngle);
if (swingAngle < 360.0f) {
f32 rad = sead::Mathf::deg2rad(modf(degree + 90.0f + 180.0f, 180.0f) - 90.0f);
mCurrentAngle = swingAngleSign * sead::Mathf::sin(rad) * 180.0f + mOffsetRotate;
} else {
mCurrentAngle = swingAngleSign * wrapAngle(degree * 2) + mOffsetRotate;
}
return false;
}
void SwingMovement::exeMove() {
if (updateRotate())
setNerve(this, &Stop);
mFrameInCycle = wrapValue(mFrameInCycle + 1, mSwingCycle);
}
void SwingMovement::exeStop() {
if (isGreaterEqualStep(this, mStopTime))
setNerve(this, &Move);
}
bool SwingMovement::isLeft() const {
f32 angle = (f32)mFrameInCycle * 360.0f / (f32)mSwingCycle;
return 90.0f <= angle && angle < 270.0f;
}
bool SwingMovement::isStop() const {
return isNerve(this, &Stop);
}
} // namespace al