mirror of
https://github.com/MonsterDruide1/OdysseyDecomp
synced 2026-04-23 09:04:21 +00:00
80 lines
2.2 KiB
C++
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
|