OdysseyDecomp/src/Layout/GaugeAir.cpp
2025-04-05 13:28:03 +02:00

104 lines
2.5 KiB
C++

#include "Layout/GaugeAir.h"
#include "Library/Layout/LayoutActionFunction.h"
#include "Library/Layout/LayoutInitInfo.h"
#include "Library/Math/MathUtil.h"
#include "Library/Nerve/NerveSetupUtil.h"
#include "Library/Nerve/NerveUtil.h"
namespace {
NERVE_IMPL(GaugeAir, Appear);
NERVE_IMPL(GaugeAir, Wait);
NERVE_IMPL(GaugeAir, End);
NERVE_IMPL(GaugeAir, FastEnd);
NERVES_MAKE_NOSTRUCT(GaugeAir, Appear, FastEnd);
NERVES_MAKE_STRUCT(GaugeAir, Wait, End);
} // namespace
GaugeAir::GaugeAir(const char* name, const al::LayoutInitInfo& info) : al::LayoutActor(name) {
al::initLayoutActor(this, info, "GaugeAir", nullptr);
initNerve(&Appear, 0);
kill();
}
bool GaugeAir::isWait() const {
return isAlive() && al::isNerve(this, &NrvGaugeAir.Wait);
}
void GaugeAir::start() {
appear();
mIsActive = false;
exeWait();
al::setNerve(this, &Appear);
}
void GaugeAir::updateStateAnim() {
if (mIsActive && mRate >= 1.0f) {
if (!al::isActionPlaying(this, "Max", "State"))
al::startAction(this, "Max", "State");
return;
}
if (al::isNearZeroOrLess(mRate)) {
if (!al::isActionPlaying(this, "Empty", "State"))
al::startAction(this, "Empty", "State");
return;
}
if (!al::isActionPlaying(this, "Normal", "State"))
al::startAction(this, "Normal", "State");
}
void GaugeAir::endMax() {
if (!isWait())
return;
al::startFreezeAction(this, "Decrease", 0.0f, "Gauge");
updateStateAnim();
al::setNerve(this, &NrvGaugeAir.End);
}
void GaugeAir::fastEnd() {
if (isAlive() && !al::isNerve(this, &FastEnd))
al::setNerve(this, &FastEnd);
}
void GaugeAir::setRate(f32 rate) {
mRate = rate;
if (rate < 0.99f)
mIsActive = true;
}
void GaugeAir::exeAppear() {
if (al::isFirstStep(this))
al::startAction(this, "Appear", nullptr);
if (al::isActionEnd(this, nullptr))
return al::setNerve(this, &NrvGaugeAir.Wait);
}
void GaugeAir::exeWait() {
al::startFreezeAction(this, "Decrease",
al::getActionFrameMax(this, "Decrease", "Gauge") * (1.0f - mRate),
"Gauge");
updateStateAnim();
}
void GaugeAir::exeEnd() {
if (al::isLessStep(this, 30))
return;
if (al::isStep(this, 30))
al::startAction(this, "End", nullptr);
if (al::isActionEnd(this, nullptr))
kill();
}
void GaugeAir::exeFastEnd() {
if (al::isFirstStep(this))
al::startAction(this, "End", nullptr);
if (al::isActionEnd(this, nullptr))
kill();
}