OdysseyDecomp/lib/al/Library/Nerve/NerveUtil.cpp
2025-02-02 10:23:19 +01:00

314 lines
10 KiB
C++

#include "Library/Nerve/NerveUtil.h"
#include <math/seadMathCalcCommon.h>
#include "Library/Math/MathUtil.h"
#include "Library/Nerve/IUseNerve.h"
#include "Library/Nerve/NerveAction.h"
#include "Library/Nerve/NerveActionCtrl.h"
#include "Library/Nerve/NerveKeeper.h"
#include "Library/Nerve/NerveStateCtrl.h"
namespace al {
void setNerve(IUseNerve* user, const Nerve* nerve) {
user->getNerveKeeper()->setNerve(nerve);
}
void setNerveAtStep(IUseNerve* user, const Nerve* nerve, s32 step) {
if (user->getNerveKeeper()->getCurrentStep() == step)
user->getNerveKeeper()->setNerve(nerve);
}
bool isStep(const IUseNerve* user, s32 step) {
return user->getNerveKeeper()->getCurrentStep() == step;
}
void setNerveAtGreaterEqualStep(IUseNerve* user, const Nerve* nerve, s32 step) {
if (user->getNerveKeeper()->getCurrentStep() >= step)
user->getNerveKeeper()->setNerve(nerve);
}
bool isNerve(const IUseNerve* user, const Nerve* nerve) {
return user->getNerveKeeper()->getCurrentNerve() == nerve;
}
s32 getNerveStep(const IUseNerve* user) {
return user->getNerveKeeper()->getCurrentStep();
}
const Nerve* getCurrentNerve(const IUseNerve* user) {
return user->getNerveKeeper()->getCurrentNerve();
}
bool isFirstStep(const IUseNerve* user) {
return isStep(user, 0);
}
bool isGreaterStep(const IUseNerve* user, s32 step) {
return user->getNerveKeeper()->getCurrentStep() > step;
}
bool isGreaterEqualStep(const IUseNerve* user, s32 step) {
return user->getNerveKeeper()->getCurrentStep() >= step;
}
bool isLessStep(const IUseNerve* user, s32 step) {
return user->getNerveKeeper()->getCurrentStep() < step;
}
bool isLessEqualStep(const IUseNerve* user, s32 step) {
return user->getNerveKeeper()->getCurrentStep() <= step;
}
bool isInRangeStep(const IUseNerve* user, s32 startStep, s32 endStep) {
NerveKeeper* nerveKeeper = user->getNerveKeeper();
return startStep <= nerveKeeper->getCurrentStep() && nerveKeeper->getCurrentStep() <= endStep;
}
bool isIntervalStep(const IUseNerve* user, s32 interval, s32 offset) {
s32 currentStep = user->getNerveKeeper()->getCurrentStep() - offset;
return currentStep >= 0 && currentStep % interval == 0;
}
bool isIntervalOnOffStep(const IUseNerve* user, s32 interval, s32 offset) {
return ((user->getNerveKeeper()->getCurrentStep() - offset) / interval) % 2 == 0;
}
bool isNewNerve(const IUseNerve* user) {
return isLessStep(user, 0);
}
s32 calcNerveInterval(const IUseNerve* user, s32 interval, s32 offset) {
s32 remain = getNerveStep(user) - offset;
if (interval < 1 || remain < 1)
return 0;
return remain / interval;
}
f32 calcNerveRate(const IUseNerve* user, s32 max) {
if (max < 1)
return 1.0f;
f32 curStep = getNerveStep(user);
return sead::Mathf::clamp(curStep / max, 0.0f, 1.0f);
}
f32 calcNerveRate(const IUseNerve* user, s32 min, s32 max) {
f32 rate = normalize((f32)getNerveStep(user), (f32)min, (f32)max);
return sead::Mathf::clamp(rate, 0.0f, 1.0f);
}
f32 calcNerveEaseInRate(const IUseNerve* user, s32 max) {
return easeIn(calcNerveRate(user, max));
}
f32 calcNerveEaseInRate(const IUseNerve* user, s32 min, s32 max) {
return easeIn(calcNerveRate(user, min, max));
}
f32 calcNerveEaseOutRate(const IUseNerve* user, s32 max) {
return easeOut(calcNerveRate(user, max));
}
f32 calcNerveEaseOutRate(const IUseNerve* user, s32 min, s32 max) {
return easeOut(calcNerveRate(user, min, max));
}
f32 calcNerveEaseInOutRate(const IUseNerve* user, s32 max) {
return easeInOut(calcNerveRate(user, max));
}
f32 calcNerveEaseInOutRate(const IUseNerve* user, s32 min, s32 max) {
return easeInOut(calcNerveRate(user, min, max));
}
f32 calcNerveSquareInRate(const IUseNerve* user, s32 max) {
return squareIn(calcNerveRate(user, max));
}
f32 calcNerveSquareInRate(const IUseNerve* user, s32 min, s32 max) {
return squareIn(calcNerveRate(user, min, max));
}
f32 calcNerveSquareOutRate(const IUseNerve* user, s32 max) {
return squareOut(calcNerveRate(user, max));
}
f32 calcNerveSquareOutRate(const IUseNerve* user, s32 min, s32 max) {
return squareOut(calcNerveRate(user, min, max));
}
f32 calcNerveEaseByTypeRate(const IUseNerve* user, s32 max, s32 type) {
return easeByType(calcNerveRate(user, max), type);
}
f32 calcNerveEaseByTypeRate(const IUseNerve* user, s32 min, s32 max, s32 type) {
return easeByType(calcNerveRate(user, min, max), type);
}
f32 calcNervePowerInRate(const IUseNerve* user, s32 max, f32 power) {
return powerIn(calcNerveRate(user, max), power);
}
f32 calcNervePowerInRate(const IUseNerve* user, s32 min, s32 max, f32 power) {
return powerIn(calcNerveRate(user, min, max), power);
}
f32 calcNervePowerOutRate(const IUseNerve* user, s32 max, f32 power) {
return powerOut(calcNerveRate(user, max), power);
}
f32 calcNervePowerOutRate(const IUseNerve* user, s32 min, s32 max, f32 power) {
return powerOut(calcNerveRate(user, min, max), power);
}
f32 calcNerveJumpRate(const IUseNerve* user, s32 inMax, s32 upDuration, s32 release) {
s32 step = getNerveStep(user);
if (step <= inMax)
return calcNerveEaseOutRate(user, inMax);
s32 startRelease = upDuration + inMax;
if (step <= startRelease)
return 1.0f;
return lerpValue(1.0f, 0.0f, calcNerveEaseInRate(user, startRelease, startRelease + release));
}
f32 calcNerveEaseInValue(const IUseNerve* user, s32 min, s32 max, f32 start, f32 end) {
return lerpValue(start, end, calcNerveEaseInRate(user, min, max));
}
f32 calcNerveStartEndRate(const IUseNerve* user, s32 inMax, s32 upDuration, s32 release) {
s32 step = getNerveStep(user);
if (step <= inMax)
return calcNerveEaseInOutRate(user, inMax);
s32 startRelease = upDuration + inMax;
if (step <= startRelease)
return 1.0f;
return lerpValue(1.0f, 0.0f,
calcNerveEaseInOutRate(user, startRelease, startRelease + release));
}
f32 calcNerveEaseInOutValue(const IUseNerve* user, s32 min, s32 max, f32 start, f32 end) {
return lerpValue(start, end, calcNerveEaseInOutRate(user, min, max));
}
f32 calcNerveValue(const IUseNerve* user, s32 max, f32 start, f32 end) {
return lerpValue(start, end, calcNerveRate(user, max));
}
f32 calcNerveValue(const IUseNerve* user, s32 min, s32 max, f32 start, f32 end) {
return lerpValue(start, end, calcNerveRate(user, min, max));
}
f32 calcNerveEaseInValue(const IUseNerve* user, s32 max, f32 start, f32 end) {
return lerpValue(start, end, calcNerveEaseInRate(user, max));
}
f32 calcNerveEaseOutValue(const IUseNerve* user, s32 max, f32 start, f32 end) {
return lerpValue(start, end, calcNerveEaseOutRate(user, max));
}
f32 calcNerveEaseOutValue(const IUseNerve* user, s32 min, s32 max, f32 start, f32 end) {
return lerpValue(start, end, calcNerveEaseOutRate(user, min, max));
}
f32 calcNerveEaseInOutValue(const IUseNerve* user, s32 max, f32 start, f32 end) {
return lerpValue(start, end, calcNerveEaseInOutRate(user, max));
}
f32 calcNerveSquareInValue(const IUseNerve* user, s32 max, f32 start, f32 end) {
return lerpValue(start, end, calcNerveSquareInRate(user, max));
}
f32 calcNerveSquareInValue(const IUseNerve* user, s32 min, s32 max, f32 start, f32 end) {
return lerpValue(start, end, calcNerveSquareInRate(user, min, max));
}
f32 calcNerveSquareOutValue(const IUseNerve* user, s32 max, f32 start, f32 end) {
return lerpValue(start, end, calcNerveSquareOutRate(user, max));
}
f32 calcNerveSquareOutValue(const IUseNerve* user, s32 min, s32 max, f32 start, f32 end) {
return lerpValue(start, end, calcNerveSquareOutRate(user, min, max));
}
f32 calcNerveEaseByTypeValue(const IUseNerve* user, s32 max, f32 start, f32 end, s32 type) {
return lerpValue(start, end, calcNerveEaseByTypeRate(user, max, type));
}
f32 calcNerveEaseByTypeValue(const IUseNerve* user, s32 min, s32 max, f32 start, f32 end,
s32 type) {
return lerpValue(start, end, calcNerveEaseByTypeRate(user, min, max, type));
}
f32 calcNerveCosCycle(const IUseNerve* user, s32 max) {
if (max == 0)
return 1.0f;
return sead::Mathf::cos((f32)getNerveStep(user) / max * sead::Mathf::pi2());
}
f32 calcNerveSinCycle(const IUseNerve* user, s32 max) {
if (max == 0)
return 1.0f;
return sead::Mathf::sin((f32)getNerveStep(user) / max * sead::Mathf::pi2());
}
f32 calcNerveRepeatRate(const IUseNerve* user, s32 max) {
return (getNerveStep(user) % max) / (f32)max;
}
f32 calcNerveRepeatDegree(const IUseNerve* user, s32 max) {
return calcNerveRepeatRate(user, max) * 360.0f;
}
f32 calcNerveJumpValue(const IUseNerve* user, s32 inMax, s32 upDuration, s32 release, f32 factor) {
return calcNerveJumpRate(user, inMax, upDuration, release) * factor;
}
f32 calcNerveStartEndValue(const IUseNerve* user, s32 inMax, s32 upDuration, s32 release, f32 start,
f32 end) {
return lerpValue(start, end, calcNerveStartEndRate(user, inMax, upDuration, release));
}
void initNerveState(IUseNerve* user, NerveStateBase* state, const Nerve* nerve, const char* name) {
state->init();
user->getNerveKeeper()->getStateCtrl()->addState(state, nerve, name);
}
void addNerveState(IUseNerve* user, NerveStateBase* state, const Nerve* nerve, const char* name) {
user->getNerveKeeper()->getStateCtrl()->addState(state, nerve, name);
}
bool updateNerveState(IUseNerve* user) {
return user->getNerveKeeper()->getStateCtrl()->updateCurrentState();
}
bool updateNerveStateAndNextNerve(IUseNerve* user, const Nerve* nerve) {
if (user->getNerveKeeper()->getStateCtrl()->updateCurrentState()) {
user->getNerveKeeper()->setNerve(nerve);
return true;
}
return false;
}
bool isStateEnd(const IUseNerve* user) {
return user->getNerveKeeper()->getStateCtrl()->isCurrentStateEnd();
}
} // namespace al
namespace alNerveFunction {
void setNerveAction(al::IUseNerve* user, const char* action) {
al::NerveKeeper* keeper = user->getNerveKeeper();
keeper->setNerve(keeper->getActionCtrl()->findNerve(action));
}
} // namespace alNerveFunction