It's always the last function

This commit is contained in:
robojumper
2025-04-18 19:36:20 +02:00
parent 0592075008
commit cd7e0d47a9
6 changed files with 1062 additions and 107 deletions
+833 -32
View File
@@ -2,13 +2,21 @@
#include "common.h"
#include "d/a/d_a_item.h"
#include "d/col/c/c_m3d.h"
#include "d/d_sc_game.h"
#include "d/flag/itemflag_manager.h"
#include "d/lyt/d2d.h"
#include "d/lyt/d_lyt_drop_line.h"
#include "d/lyt/meter/d_lyt_meter.h"
#include "d/t/d_t_siren.h"
#include "m/m_vec.h"
#include "nw4r/lyt/lyt_pane.h"
#include "nw4r/math/math_types.h"
#include "toBeSorted/effects_struct.h"
#include "toBeSorted/event_manager.h"
#include "toBeSorted/small_sound_mgr.h"
#include <cstring>
STATE_DEFINE(dLytMeterTimer_c, ChangeSiren);
STATE_DEFINE(dLytMeterTimer_c, Siren);
@@ -18,6 +26,12 @@ STATE_DEFINE(dLytMeterTimer_c, Safe);
STATE_DEFINE(dLytMeterTimer_c, ChangeFruits);
STATE_DEFINE(dLytMeterTimer_c, Fruits);
LytMeterTimerPart1_c *LytMeterTimerPart1_c::sInstance;
LytMeterTimerPart2_c *LytMeterTimerPart2_c::sInstance;
bool dLytMeterTimer_c::sDoExit;
bool dLytMeterTimer_c::sDoFinishAnim;
bool dLytMeterTimer_c::sFinished;
static const d2d::LytBrlanMapping brlanMapPart1[] = {
{ "timer_01_in.brlan", "G_inOut_00"},
{"timer_01_mapPosition.brlan", "G_inOut_00"},
@@ -219,6 +233,19 @@ void LytMeterTimerPart1_c::realizeTrial() {
}
}
void LytMeterTimerPart1_c::startNextFruitAnim() {
if (mActualTearCount > 0 && !mAnm[mActualTearCount - 1 + TIMER_01_ANIM_BOWL_NUT_OFFSET].isEnabled() &&
mAnm[mActualTearCount - 1 + TIMER_01_ANIM_BOWL_NUT_OFFSET].getFrame() == 0.0f) {
mAnm[mActualTearCount - 1 + TIMER_01_ANIM_BOWL_NUT_OFFSET].setAnimEnable(true);
}
}
void LytMeterTimerPart1_c::startFruitAnim(s32 index) {
if (field_0x780 < TIMER_01_NUM_TEARS && !mAnm[index + TIMER_01_ANIM_BOWL_NUT_OFFSET].isEnabled()) {
mAnm[index + TIMER_01_ANIM_BOWL_NUT_OFFSET].setAnimEnable(true);
}
}
void LytMeterTimerPart1_c::startOutAnim() {
mAnm[TIMER_01_ANIM_OUT].setToStart();
mAnm[TIMER_01_ANIM_OUT].setAnimEnable(true);
@@ -228,6 +255,12 @@ void LytMeterTimerPart1_c::stopInAnim() {
mAnm[TIMER_01_ANIM_IN].setAnimEnable(false);
}
void LytMeterTimerPart1_c::disableCurrentFruitAnim() {
if (mActualTearCount > 0 && mAnm[mActualTearCount - 1 + TIMER_01_ANIM_BOWL_NUT_OFFSET].isEnabled()) {
mAnm[mActualTearCount - 1 + TIMER_01_ANIM_BOWL_NUT_OFFSET].setAnimEnable(false);
}
}
void LytMeterTimerPart1_c::stopFinishedFruit() {
for (s32 i = 0; i <= field_0x780; i++) {
if (mAnm[i + TIMER_01_ANIM_BOWL_NUT_OFFSET].isEnabled() && mAnm[i + TIMER_01_ANIM_BOWL_NUT_OFFSET].isStop2()) {
@@ -275,27 +308,39 @@ bool LytMeterTimerPart1_c::isOutAnimFinished() {
}
return false;
}
extern "C" const u16 PARTICLE_RESOURCE_ID_MAPPING_135_;
extern "C" const u16 PARTICLE_RESOURCE_ID_MAPPING_136_;
extern "C" const u16 PARTICLE_RESOURCE_ID_MAPPING_137_;
void LytMeterTimerPart1_c::createEffect(s32 fruitIndex) {
nw4r::math::MTX34 mtx = mpPanes[fruitIndex]->GetGlobalMtx();
mVec3_c pos;
pos.x = mtx._03;
pos.y = mtx._13;
pos.z = 0.0f;
EffectsStruct::fn_800298C0(
PARTICLE_RESOURCE_ID_MAPPING_135_, &pos, nullptr, nullptr, &mColors1[TIMER_01_COLOR_00_CIRCLE],
&mColors2[TIMER_01_COLOR_01_CIRCLE]
);
EffectsStruct::fn_800298C0(
PARTICLE_RESOURCE_ID_MAPPING_136_, &pos, nullptr, nullptr, &mColors1[TIMER_01_COLOR_00_SHADOW],
&mColors2[TIMER_01_COLOR_01_SHADOW]
);
EffectsStruct::fn_800298C0(
PARTICLE_RESOURCE_ID_MAPPING_137_, &pos, nullptr, nullptr, &mColors1[TIMER_01_COLOR_00_RAINBOW_CIRCLE],
&mColors2[TIMER_01_COLOR_01_RAINBOW_CIRCLE]
);
bool LytMeterTimerPart1_c::isAnyFruitAnimAtFrame(f32 f) const {
for (int i = 0; i <= field_0x780; i++) {
if (mAnm[i + TIMER_01_ANIM_BOWL_NUT_OFFSET].isEnabled() &&
f - 1.0f < mAnm[i + TIMER_01_ANIM_BOWL_NUT_OFFSET].getFrame() &&
mAnm[i + TIMER_01_ANIM_BOWL_NUT_OFFSET].getFrame() <= f) {
return true;
}
}
return false;
}
bool LytMeterTimerPart1_c::incrementTearCount() {
mActualTearCount = ItemflagManager::sInstance->getFlagDirect(500);
if (mDisplayedTearCount < mActualTearCount && dLytDropLine_c::finishPartMaybe()) {
startNextFruitAnim();
if (!dLytMeterContainer_c::getfn_800C9FE0()) {
createEffect(mActualTearCount - 1);
SmallSoundManager::GetInstance()->playSound(SE_S_SIREN_SHIZUKU_GET_IN);
}
if (mActualTearCount < TIMER_01_NUM_TEARS) {
field_0x760++;
dLytDropLine_c::setPane(mpPanes[field_0x760]);
}
mDisplayedTearCount++;
}
if (isCurrentFruitAnimFinished()) {
disableCurrentFruitAnim();
return true;
}
return false;
}
void LytMeterTimerPart1_c::initColors() {
@@ -335,6 +380,34 @@ void LytMeterTimerPart1_c::initColors() {
}
}
extern "C" const u16 PARTICLE_RESOURCE_ID_MAPPING_135_;
extern "C" const u16 PARTICLE_RESOURCE_ID_MAPPING_136_;
extern "C" const u16 PARTICLE_RESOURCE_ID_MAPPING_137_;
void LytMeterTimerPart1_c::createEffect(s32 fruitIndex) {
nw4r::math::MTX34 mtx = mpPanes[fruitIndex]->GetGlobalMtx();
mVec3_c pos;
pos.x = mtx._03;
pos.y = mtx._13;
pos.z = 0.0f;
EffectsStruct::fn_800298C0(
PARTICLE_RESOURCE_ID_MAPPING_135_, &pos, nullptr, nullptr, &mColors1[TIMER_01_COLOR_00_CIRCLE],
&mColors2[TIMER_01_COLOR_01_CIRCLE]
);
EffectsStruct::fn_800298C0(
PARTICLE_RESOURCE_ID_MAPPING_136_, &pos, nullptr, nullptr, &mColors1[TIMER_01_COLOR_00_SHADOW],
&mColors2[TIMER_01_COLOR_01_SHADOW]
);
EffectsStruct::fn_800298C0(
PARTICLE_RESOURCE_ID_MAPPING_137_, &pos, nullptr, nullptr, &mColors1[TIMER_01_COLOR_00_RAINBOW_CIRCLE],
&mColors2[TIMER_01_COLOR_01_RAINBOW_CIRCLE]
);
}
void LytMeterTimerPart1_c::updateDropLine(nw4r::lyt::Pane *pane) {
u8 idx = field_0x780;
dLytDropLine_c::update(mpPanes[idx], pane, mTrial, field_0x780 % 2 != 0);
}
static const d2d::LytBrlanMapping brlanMapPart2[] = {
{ "timer_02_in.brlan", "G_inOut_00"},
{"timer_02_mapPosition.brlan", "G_inOut_00"},
@@ -373,6 +446,7 @@ static const d2d::LytBrlanMapping brlanMapPart2[] = {
#define TIMER_02_ANIM_DYING_OFFSET 2
#define TIMER_02_ANIM_FALL_OUT_OFFSET 11
#define TIMER_02_ANIM_CHANGE_FRUIT 20
#define TIMER_02_ANIM_FRUITS_COLOR 21
#define TIMER_02_ANIM_PETAL_ONOFF 22
#define TIMER_02_ANIM_BLOOM 23
#define TIMER_02_ANIM_BEFORE_FALL 24
@@ -463,7 +537,7 @@ void LytMeterTimerPart2_c::initBloomAnim() {
}
void LytMeterTimerPart2_c::initBeforeFallAnim() {
mAnm[TIMER_02_ANIM_BEFORE_FALL].setForwardOnce();
mAnm[TIMER_02_ANIM_BEFORE_FALL].setForwardLoop();
mAnm[TIMER_02_ANIM_BEFORE_FALL].setFrame(0.0f);
mAnm[TIMER_02_ANIM_BEFORE_FALL].setAnimEnable(true);
mLyt.calc();
@@ -603,7 +677,8 @@ void LytMeterTimerPart2_c::syncPetalsTime() {
if (time == 0) {
time = 10000;
}
f32 targetFrame = (s32)(duration - (time / 10000.0f) * duration + 0.5f);
f32 tmp = duration - (time / 10000.0f) * duration;
f32 targetFrame = (s32)(tmp + 0.5f);
mAnm[i + TIMER_02_ANIM_DYING_OFFSET].setRate(1.0f);
mAnm[i + TIMER_02_ANIM_DYING_OFFSET].setFrame(targetFrame);
mAnm[i + TIMER_02_ANIM_DYING_OFFSET].setAnimEnable(true);
@@ -650,6 +725,230 @@ void LytMeterTimerPart2_c::enableChangeFruitAnim() {
mAnm[TIMER_02_ANIM_CHANGE_FRUIT].setAnimEnable(true);
}
void LytMeterTimerPart2_c::syncTime() {
f32 duration = mAnm[TIMER_02_ANIM_FLOWER_LOOP].getAnimDuration() - 1.0f;
s32 time = dTgSiren_c::getTime() % 2000;
if (time == 0) {
time = 2000;
}
mFlowerLoopFrame = duration - (time / 2000.0f) * duration;
mAnm[TIMER_02_ANIM_FLOWER_LOOP].setRate(1.0f);
}
void LytMeterTimerPart2_c::syncTimeWithSafe() {
f32 duration = mAnm[TIMER_02_ANIM_FLOWER_LOOP].getAnimDuration() - 1.0f;
s32 time = dTgSiren_c::getTime() % 2000;
if (time == 0) {
time = 2000;
}
// FPR regswap between 2000.0f and cast constant
// Not sure why the cast needs to be pulled out here
// This way works in other functions, but breaks instructions in this case
// f32 loopFrame = duration - (time / 2000.0f) * duration;
f32 fTime = time;
f32 loopFrame = duration - (fTime / 2000.0f) * duration;
f32 safeDuration = mAnm[TIMER_02_ANIM_SIREN_SAFE].getAnimDuration() - 1.0f;
f32 finalFrame = loopFrame;
if (safeDuration < finalFrame) {
finalFrame = finalFrame - safeDuration;
}
mFlowerLoopFrame = finalFrame;
mAnm[TIMER_02_ANIM_FLOWER_LOOP].setRate(1.0f);
}
void LytMeterTimerPart2_c::stopInAnim() {
mAnm[TIMER_02_ANIM_IN].setAnimEnable(false);
}
void LytMeterTimerPart2_c::stopBloomAnim() {
mAnm[TIMER_02_ANIM_BLOOM].setAnimEnable(false);
}
void LytMeterTimerPart2_c::stopBeforeFallAnim() {
if (mAnm[TIMER_02_ANIM_BEFORE_FALL].isEnabled()) {
mAnm[TIMER_02_ANIM_BEFORE_FALL].setAnimEnable(false);
}
}
void LytMeterTimerPart2_c::stopChangeSirenAnim() {
mAnm[TIMER_02_ANIM_CHANGE_SIREN].setAnimEnable(false);
}
void LytMeterTimerPart2_c::stopSirenLoopAnim() {
mAnm[TIMER_02_ANIM_SIREN_LOOP].setAnimEnable(false);
}
void LytMeterTimerPart2_c::stopSirenSafeAnim() {
mAnm[TIMER_02_ANIM_SIREN_SAFE].setAnimEnable(false);
}
void LytMeterTimerPart2_c::stopFlowerLoopAnim() {
mAnm[TIMER_02_ANIM_FLOWER_LOOP].setAnimEnable(false);
}
void LytMeterTimerPart2_c::resetFlowerLoopAnim() {
mAnm[TIMER_02_ANIM_FLOWER_LOOP].setFrame(0.0f);
mAnm[TIMER_02_ANIM_FLOWER_LOOP].setAnimEnable(true);
mLyt.calc();
mAnm[TIMER_02_ANIM_FLOWER_LOOP].setAnimEnable(false);
}
void LytMeterTimerPart2_c::stopDyingAnims() {
for (int i = 0; i < TIMER_02_NUM_PETALS; i++) {
if (mAnm[i + TIMER_02_ANIM_DYING_OFFSET].isEnabled()) {
mAnm[i + TIMER_02_ANIM_DYING_OFFSET].setAnimEnable(false);
}
}
}
void LytMeterTimerPart2_c::stopFinishedDyingAnims() {
for (int i = 0; i < TIMER_02_NUM_PETALS; i++) {
if (mAnm[i + TIMER_02_ANIM_DYING_OFFSET].isEnabled() && mAnm[i + TIMER_02_ANIM_DYING_OFFSET].isEndReached()) {
mAnm[i + TIMER_02_ANIM_DYING_OFFSET].setAnimEnable(false);
}
}
}
void LytMeterTimerPart2_c::stopFallOutAnims() {
for (int i = 0; i < TIMER_02_NUM_PETALS; i++) {
if (mAnm[i + TIMER_02_ANIM_FALL_OUT_OFFSET].isEnabled()) {
mAnm[i + TIMER_02_ANIM_FALL_OUT_OFFSET].setAnimEnable(false);
}
}
}
void LytMeterTimerPart2_c::stopFinishedFallOutAnims() {
for (int i = 0; i < TIMER_02_NUM_PETALS; i++) {
if (mAnm[i + TIMER_02_ANIM_FALL_OUT_OFFSET].isEnabled() &&
mAnm[i + TIMER_02_ANIM_FALL_OUT_OFFSET].isEndReached()) {
mAnm[i + TIMER_02_ANIM_FALL_OUT_OFFSET].setAnimEnable(false);
// ??? - if one of the fall out anims is finished, stop all others too???
stopFallOutAnims();
}
}
}
void LytMeterTimerPart2_c::stopOutAnim() {
mAnm[TIMER_02_ANIM_OUT].setAnimEnable(false);
}
void LytMeterTimerPart2_c::stopChangeFruitAnim() {
mAnm[TIMER_02_ANIM_CHANGE_FRUIT].setAnimEnable(false);
}
bool LytMeterTimerPart2_c::isInAnimFinished() {
if (mAnm[TIMER_02_ANIM_IN].isEnabled() && mAnm[TIMER_02_ANIM_IN].isEndReached()) {
return true;
}
return false;
}
bool LytMeterTimerPart2_c::isBloomAnimFinished() {
if (mAnm[TIMER_02_ANIM_BLOOM].isEnabled() && mAnm[TIMER_02_ANIM_BLOOM].isEndReached()) {
return true;
}
return false;
}
bool LytMeterTimerPart2_c::isBeforeFallAnimAtStart() {
if (mAnm[TIMER_02_ANIM_BEFORE_FALL].isEnabled() && cM3d_IsZero(mAnm[TIMER_02_ANIM_BEFORE_FALL].getFrame())) {
return true;
}
return false;
}
bool LytMeterTimerPart2_c::isChangeSirenAnimFinished() {
if (mAnm[TIMER_02_ANIM_CHANGE_SIREN].isEnabled() && mAnm[TIMER_02_ANIM_CHANGE_SIREN].isEndReached()) {
return true;
}
return false;
}
bool LytMeterTimerPart2_c::isSirenSafeAnimFinished() {
if (mAnm[TIMER_02_ANIM_SIREN_SAFE].isEnabled() && mAnm[TIMER_02_ANIM_SIREN_SAFE].isEndReached()) {
return true;
}
return false;
}
bool LytMeterTimerPart2_c::isFlowerLoopAnimFinished() {
if (mAnm[TIMER_02_ANIM_FLOWER_LOOP].isEnabled() && mAnm[TIMER_02_ANIM_FLOWER_LOOP].isEndReached()) {
return true;
}
return false;
}
bool LytMeterTimerPart2_c::isPetalDyingAnimFinished() {
if (mNumPetals > 0) {
s32 idx = mNumPetals - 1;
if (mAnm[idx + TIMER_02_ANIM_DYING_OFFSET].isEnabled() &&
mAnm[idx + TIMER_02_ANIM_DYING_OFFSET].isEndReached()) {
return true;
}
}
return false;
}
bool LytMeterTimerPart2_c::isFirstFallOutAnimFinished() {
if (mAnm[TIMER_02_ANIM_FALL_OUT_OFFSET].isEnabled() && mAnm[TIMER_02_ANIM_FALL_OUT_OFFSET].isEndReached()) {
return true;
}
return false;
}
bool LytMeterTimerPart2_c::isOutAnimFinished() {
if (mAnm[TIMER_02_ANIM_OUT].isEnabled() && mAnm[TIMER_02_ANIM_OUT].isEndReached()) {
return true;
}
return false;
}
bool LytMeterTimerPart2_c::isChangeFruitAnimFinished() {
if (mAnm[TIMER_02_ANIM_CHANGE_FRUIT].isEnabled() && mAnm[TIMER_02_ANIM_CHANGE_FRUIT].isEndReached()) {
return true;
}
return false;
}
void LytMeterTimerPart2_c::realizeFruitsColor() {
f32 frame = 0.0f;
switch (mTrial) {
case dAcItem_c::TRIAL_ELDIN: frame = 0.0f; break;
case dAcItem_c::TRIAL_FARON: frame = 1.0f; break;
case dAcItem_c::TRIAL_SKYLOFT: frame = 2.0f; break;
case dAcItem_c::TRIAL_LANAYRU: frame = 3.0f; break;
}
mAnm[TIMER_02_ANIM_FRUITS_COLOR].setForwardOnce();
mAnm[TIMER_02_ANIM_FRUITS_COLOR].setFrame(frame);
mAnm[TIMER_02_ANIM_FRUITS_COLOR].setAnimEnable(true);
mLyt.calc();
mAnm[TIMER_02_ANIM_FRUITS_COLOR].setAnimEnable(false);
}
void LytMeterTimerPart2_c::finishDyingAnims() {
for (s32 i = 0; i < TIMER_02_NUM_PETALS; i++) {
mAnm[i + TIMER_02_ANIM_DYING_OFFSET].setToEnd2();
mAnm[i + TIMER_02_ANIM_DYING_OFFSET].setAnimEnable(true);
}
mLyt.calc();
for (s32 i = 0; i < TIMER_02_NUM_PETALS; i++) {
mAnm[i + TIMER_02_ANIM_DYING_OFFSET].setAnimEnable(false);
}
}
void LytMeterTimerPart2_c::setPetalsToStart() {
for (s32 i = 0; i < TIMER_02_NUM_PETALS; i++) {
mAnm[i + TIMER_02_ANIM_DYING_OFFSET].setToStart();
mAnm[i + TIMER_02_ANIM_FALL_OUT_OFFSET].setToEnd2();
mAnm[i + TIMER_02_ANIM_FALL_OUT_OFFSET].setAnimEnable(true);
}
mLyt.calc();
for (s32 i = 0; i < TIMER_02_NUM_PETALS; i++) {
mAnm[i + TIMER_02_ANIM_FALL_OUT_OFFSET].setAnimEnable(false);
}
}
void LytMeterTimerPart2_c::realizePetalsOnOff() {
mAnm[TIMER_02_ANIM_PETAL_ONOFF].setAnimEnable(true);
mAnm[TIMER_02_ANIM_PETAL_ONOFF].setFrame(9 - mNumPetals);
@@ -657,10 +956,18 @@ void LytMeterTimerPart2_c::realizePetalsOnOff() {
mAnm[TIMER_02_ANIM_PETAL_ONOFF].setAnimEnable(false);
}
void LytMeterTimerPart2_c::finishSingleAnim(u8 idx) {
mAnm[idx].setToEnd2();
}
void LytMeterTimerPart2_c::resetSingleAnim(u8 idx) {
mAnm[idx].setToStart();
}
void LytMeterTimerPart2_c::calc() {
mLyt.calc();
}
void LytMeterTimerPart2_c::initColors() {
switch (mTrial) {
case dAcItem_c::TRIAL_ELDIN:
@@ -690,32 +997,298 @@ void LytMeterTimerPart2_c::initColors() {
}
}
extern "C" const u16 PARTICLE_RESOURCE_ID_MAPPING_174_;
void LytMeterTimerPart2_c::createSingleFruitEffect() {
nw4r::math::MTX34 mtx = mpPane->GetGlobalMtx();
mVec3_c pos;
pos.x = mtx._03;
pos.y = mtx._13;
pos.z = 0.0f;
EffectsStruct::fn_800298C0(
PARTICLE_RESOURCE_ID_MAPPING_174_, &pos, nullptr, nullptr, &mColors1[TIMER_02_COLOR_00_00],
&mColors2[TIMER_02_COLOR_01_00]
);
}
extern "C" const u16 PARTICLE_RESOURCE_ID_MAPPING_206_;
void LytMeterTimerPart2_c::createFruitCompleteEffect() {
nw4r::math::MTX34 mtx = mpPane->GetGlobalMtx();
mVec3_c pos;
pos.x = mtx._03;
pos.y = mtx._13;
pos.z = 0.0f;
EffectsStruct::fn_800298C0(
PARTICLE_RESOURCE_ID_MAPPING_206_, &pos, nullptr, nullptr, &mColors1[TIMER_02_COLOR_00_01],
&mColors2[TIMER_02_COLOR_01_01]
);
}
void dLytMeterTimer_c::initializeState_ChangeSiren() {}
void dLytMeterTimer_c::executeState_ChangeSiren() {}
void dLytMeterTimer_c::executeState_ChangeSiren() {
if (mpPart2->isFlowerLoopAnimFinished()) {
mpPart2->stopFlowerLoopAnim();
mpPart2->resetFlowerLoopAnim();
mpPart2->resetSingleAnim(TIMER_02_ANIM_FLOWER_LOOP);
}
if (mpPart2->isBeforeFallAnimAtStart()) {
mpPart2->stopBeforeFallAnim();
mpPart2->resetSingleAnim(TIMER_02_ANIM_BEFORE_FALL);
}
if (field_0x57 <= 1) {
if (mLastTime < mActualTime && field_0x58 == 1 && mpPart1->getActualTearCount() != TIMER_01_NUM_TEARS) {
gotoChangeSafeBloom();
}
if (!EventManager::isInEvent()) {
mpPart2->setVisible(true);
}
}
if (dLytMeterContainer_c::getfn_800D97A0() && !field_0x54) {
mpPart2->setVisible(true);
}
switch (field_0x57) {
case 0:
if (mpPart2->isPetalDyingAnimFinished()) {
mpPart2->stopFinishedDyingAnims();
field_0x57 = 1;
mpPart2->restartPetals();
}
break;
case 1:
if (mpPart2->isFirstFallOutAnimFinished()) {
dLytMeterContainer_c::setField_0x13B61(1);
field_0x57 = 2;
}
break;
case 2:
if (mpPart2->isFirstFallOutAnimFinished() && field_0x48) {
mpPart2->stopFinishedFallOutAnims();
mpPart2->enableChangeSirenAnim();
}
if (mpPart2->isChangeSirenAnimFinished()) {
mpPart2->stopChangeSirenAnim();
mpPart2->resetSingleAnim(TIMER_02_ANIM_CHANGE_SIREN);
field_0x58 = 1;
gotoSiren();
}
break;
}
}
void dLytMeterTimer_c::finalizeState_ChangeSiren() {}
void dLytMeterTimer_c::initializeState_Siren() {}
void dLytMeterTimer_c::executeState_Siren() {}
void dLytMeterTimer_c::executeState_Siren() {
if (!field_0x58) {
if (mpPart2->isSirenSafeAnimFinished()) {
mpPart2->stopSirenSafeAnim();
}
const char *eventName = EventManager::getCurrentEventName();
if (eventName != nullptr && (!strcmp(eventName, "SirenChaser") || !strcmp(eventName, "SirenChaserL"))) {
gotoChangeSiren();
}
}
}
void dLytMeterTimer_c::finalizeState_Siren() {}
void dLytMeterTimer_c::initializeState_ChangeSafeBloom() {}
void dLytMeterTimer_c::executeState_ChangeSafeBloom() {}
void dLytMeterTimer_c::executeState_ChangeSafeBloom() {
if (mpPart2->isBloomAnimFinished()) {
mpPart2->stopSirenSafeAnim();
mpPart2->stopBloomAnim();
gotoChangeSafe();
} else if (mpPart1->incrementTearCount() == true) {
mpPart2->stopSirenSafeAnim();
mpPart2->initBeforeFallAnim();
mpPart2->setNumPetals(0);
mpPart2->realizePetalsOnOff();
mpPart2->enableSafeAnim();
mpPart2->finishSingleAnim(TIMER_02_ANIM_SIREN_SAFE);
mpPart2->resetSingleAnim(TIMER_02_ANIM_BLOOM);
mpPart2->enableBloomAnim();
mpPart2->stopDyingAnims();
}
}
void dLytMeterTimer_c::finalizeState_ChangeSafeBloom() {}
void dLytMeterTimer_c::initializeState_ChangeSafe() {}
void dLytMeterTimer_c::executeState_ChangeSafe() {}
void dLytMeterTimer_c::executeState_ChangeSafe() {
if (mpPart1->getActualTearCount() != TIMER_01_NUM_TEARS &&
mpPart1->getDisplayedTearCount() < mpPart1->getActualTearCount()) {
gotoChangeSafeBloom();
} else {
if (mLastTime < mActualTime) {
gotoChangeSafeBloom();
} else {
if (mpPart2->isSirenSafeAnimFinished()) {
mpPart2->stopSirenSafeAnim();
gotoSafe();
}
s32 rem = mActualTime % 1000;
s32 quot = mActualTime / 1000;
if (rem == 0 && quot % 2 == 0) {
mpPart2->syncTime();
field_0x59 = true;
field_0x5C = 4;
}
if (field_0x59) {
if (field_0x5C-- == 0) {
mpPart2->resumeFlowerLoop();
field_0x59 = false;
}
}
}
}
}
void dLytMeterTimer_c::finalizeState_ChangeSafe() {}
void dLytMeterTimer_c::initializeState_Safe() {}
void dLytMeterTimer_c::executeState_Safe() {}
void dLytMeterTimer_c::executeState_Safe() {
const char *eventName = EventManager::getCurrentEventName();
if (eventName != nullptr && !strcmp(eventName, "SirenSeekerFind")) {
gotoChangeSiren();
} else if (eventName != nullptr && !strcmp(eventName, "SirenAreaEnter")) {
gotoChangeSiren();
} else {
if (mActualTime == 0) {
gotoChangeSiren();
} else if (!checkForPetalChangeMaybe()) {
if (mLastTime < mActualTime) {
gotoChangeSafeBloom();
} else {
mpPart2->setNumPetals(getPetalForTimerMaybe(mActualTime));
if (mpPart1->getActualTearCount() != TIMER_01_NUM_TEARS) {
if (mpPart2->getNumPetals() == 1 && mActualTime < 9000) {
mpPart2->enableBeforeFallAnim();
} else {
mpPart2->stopBeforeFallAnim();
}
}
if (mLastTime == mActualTime) {
if (mpPart1->getActualTearCount() != TIMER_01_NUM_TEARS) {
mpPart2->stopDyingAnims();
mpPart2->stopFinishedFallOutAnims();
} else {
mpPart2->startFlowerLoop();
}
if (mpPart2->isFlowerLoopAnimFinished()) {
mpPart2->stopFlowerLoopAnim();
}
} else {
s32 quot = mActualTime / 1000;
if (mpPart2->isFlowerLoopAnimFinished()) {
mpPart2->stopFlowerLoopAnim();
}
s32 rem = mActualTime % 1000;
if (rem == 0 && quot % 2 == 0) {
mpPart2->syncTime();
field_0x59 = true;
field_0x5C = 4;
}
if (field_0x59) {
if (field_0x5C-- == 0) {
mpPart2->resumeFlowerLoop();
field_0x59 = false;
}
}
mpPart2->stopFinishedDyingAnims();
mpPart2->stopFinishedFallOutAnims();
if (mActualTime <= 90000) {
mpPart2->syncPetalsTime();
}
}
}
}
}
}
void dLytMeterTimer_c::finalizeState_Safe() {}
void dLytMeterTimer_c::initializeState_ChangeFruits() {}
void dLytMeterTimer_c::executeState_ChangeFruits() {}
void dLytMeterTimer_c::executeState_ChangeFruits() {
switch (field_0x56) {
case 3:
if (mpPart2->isBloomAnimFinished()) {
mpPart2->stopSirenSafeAnim();
mpPart2->stopBloomAnim();
mpPart2->resetSingleAnim(TIMER_02_ANIM_BLOOM);
startSafe();
}
break;
case 4:
if (mpPart2->isSirenSafeAnimFinished()) {
mpPart2->stopSirenSafeAnim();
field_0x56 = 5;
}
break;
case 5:
if (sDoFinishAnim == true) {
doPickup();
}
break;
case 6:
sFinished = true;
if (mpPart2->isFlowerLoopAnimFinished()) {
mpPart2->stopFlowerLoopAnim();
mpPart2->resetFlowerLoopAnim();
mpPart2->resetSingleAnim(TIMER_02_ANIM_FLOWER_LOOP);
}
if (dLytDropLine_c::finishPartMaybe()) {
if (mpPart1->isLastFruitAnimFinished()) {
mpPart2->realizeFruitsColor();
mpPart2->enableChangeFruitAnim();
mpPart2->initChangeSirenAnim();
mpPart2->createFruitCompleteEffect();
} else {
mpPart2->createSingleFruitEffect();
}
}
if (mpPart1->isAnyFruitAnimAtFrame(4.0f)) {
s32 fruit = mpPart1->getField0x780() + 1;
mpPart1->setField0x780(fruit);
if (mpPart1->getField0x780() < TIMER_01_NUM_TEARS) {
mpPart1->updateDropLine(mpPart2->i_getPane());
mpPart1->startFruitAnim(fruit);
mpPart1->createEffect(fruit);
}
}
if (mpPart1->isAnyFruitAnimFinished()) {
mpPart1->stopFinishedFruit();
}
if (mpPart2->isChangeFruitAnimFinished()) {
if (field_0x60 <= 0) {
mpPart2->stopSirenSafeAnim();
mpPart2->stopChangeFruitAnim();
mpPart2->resetSingleAnim(TIMER_02_ANIM_CHANGE_FRUIT);
dLytMeterContainer_c::setField_0x13B64(1);
gotoFruits();
} else {
field_0x60--;
}
}
break;
}
}
void dLytMeterTimer_c::finalizeState_ChangeFruits() {}
void dLytMeterTimer_c::initializeState_Fruits() {}
void dLytMeterTimer_c::executeState_Fruits() {}
void dLytMeterTimer_c::initializeState_Fruits() {
sDoExit = true;
}
void dLytMeterTimer_c::executeState_Fruits() {
if (mpPart2->isFlowerLoopAnimFinished()) {
mpPart2->stopFlowerLoopAnim();
mpPart2->resetFlowerLoopAnim();
mpPart2->resetSingleAnim(TIMER_02_ANIM_FLOWER_LOOP);
}
if (mActualTime == 0) {
gotoChangeSiren();
}
}
void dLytMeterTimer_c::finalizeState_Fruits() {}
bool dLytMeterTimer_c::build() {
@@ -724,7 +1297,7 @@ bool dLytMeterTimer_c::build() {
mpPart1->init();
mpPart2->init();
mpPart1->realizeTrial();
mpPart2->setNumPetals(9);
mpPart2->setNumPetals(TIMER_02_NUM_PETALS);
mpPart2->realizePetalsOnOff();
mpPart2->initFallOutAnims();
mpPart2->initDyingAnims();
@@ -743,3 +1316,231 @@ bool dLytMeterTimer_c::remove() {
mpPart2 = nullptr;
return true;
}
bool dLytMeterTimer_c::execute() {
if (dScGame_c::currentSpawnInfo.getTrial() == SpawnInfo::TRIAL) {
mActualTime = dTgSiren_c::getTime();
if (mActualTime > 500 && isInSiren() && mpPart1->getActualTearCount() != TIMER_01_NUM_TEARS) {
gotoChangeSafeBloom();
}
if (mpPart1->getActualTearCount() == TIMER_01_NUM_TEARS && dLytMeterContainer_c::getField_0x13B63()) {
if (!field_0x55) {
field_0x60 = 20;
}
field_0x55 = true;
}
if (field_0x55) {
if (field_0x54) {
gotoChangeFruits3();
} else if (sDoFinishAnim == true) {
gotoChangeFruits6();
}
}
if (mpPart1->isInAnimFinished() && mpPart2->isInAnimFinished()) {
mpPart1->stopInAnim();
mpPart2->stopInAnim();
}
if (mpPart1->isOutAnimFinished() && mpPart2->isOutAnimFinished()) {
mpPart1->stopOutAnim();
mpPart2->stopOutAnim();
}
mStateMgr.executeState();
mLastTime = mActualTime;
}
return true;
}
bool dLytMeterTimer_c::startIn2() {
startIn();
field_0x48 = 1;
return true;
}
bool dLytMeterTimer_c::startOut2() {
startOut();
field_0x48 = 0;
return true;
}
void dLytMeterTimer_c::startIn() {
mpPart1->stopOutAnim();
mpPart2->stopOutAnim();
mpPart1->startInAnim();
mpPart2->startInAnim();
if (dLytMeterContainer_c::GetMeter()->fn_800D5650()) {
if (mStateMgr.isState(StateID_ChangeSiren)) {
mpPart2->stopFlowerLoopAnim();
mpPart2->resetFlowerLoopAnim();
mpPart2->resetSingleAnim(TIMER_02_ANIM_FLOWER_LOOP);
mpPart2->stopBeforeFallAnim();
mpPart2->resetSingleAnim(TIMER_02_ANIM_BEFORE_FALL);
mpPart2->finishDyingAnims();
mpPart2->setPetalsToStart();
mpPart2->finishSingleAnim(TIMER_02_ANIM_CHANGE_SIREN);
mpPart2->enableChangeSirenAnim();
mpPart2->calc();
mpPart2->stopChangeSirenAnim();
mpPart2->resetSingleAnim(TIMER_02_ANIM_CHANGE_SIREN);
gotoSiren();
} else if (mStateMgr.isState(StateID_ChangeSafeBloom) || mStateMgr.isState(StateID_ChangeSafe)) {
mpPart2->stopSirenSafeAnim();
mpPart2->finishSingleAnim(TIMER_02_ANIM_BLOOM);
mpPart2->enableBloomAnim();
mpPart2->calc();
mpPart2->stopBloomAnim();
mpPart2->setNumPetals(TIMER_02_NUM_PETALS);
mpPart2->realizePetalsOnOff();
mpPart2->initFallOutAnims();
mpPart2->initDyingAnims();
mpPart2->finishSingleAnim(TIMER_02_ANIM_SIREN_SAFE);
mpPart2->enableSafeAnim();
mpPart2->calc();
mpPart2->stopSirenSafeAnim();
gotoSafe();
}
}
}
void dLytMeterTimer_c::gotoChangeSiren() {
if (mStateMgr.isState(StateID_Safe) || mStateMgr.isState(StateID_Siren)) {
if (mpPart2->getNumPetals() > 1) {
// Okay
mpPart2->setNumPetals(mpPart2->getNumPetals());
mpPart2->initDyingAnims();
mpPart2->updatePetalsRate();
} else if (mpPart2->getNumPetals() == 1) {
mpPart2->updatePetalsRate();
}
mpPart2->setVisible(false);
field_0x57 = 0;
mStateMgr.changeState(StateID_ChangeSiren);
}
}
void dLytMeterTimer_c::gotoSiren() {
mpPart2->enableSirenLoopAnim();
field_0x54 = true;
mStateMgr.changeState(StateID_Siren);
}
void dLytMeterTimer_c::gotoChangeSafeBloom() {
if (mStateMgr.isState(StateID_Siren) || mStateMgr.isState(StateID_Safe) || mStateMgr.isState(StateID_ChangeSiren) ||
mStateMgr.isState(StateID_ChangeSafe)) {
if (mpPart1->getActualTearCount() == TIMER_01_NUM_TEARS - 1) {
mpPart2->stopDyingAnims();
}
mpPart2->stopSirenLoopAnim();
field_0x54 = false;
mStateMgr.changeState(StateID_ChangeSafeBloom);
}
}
void dLytMeterTimer_c::gotoChangeSafe() {
mpPart2->setNumPetals(TIMER_02_NUM_PETALS);
mpPart2->realizePetalsOnOff();
mpPart2->initFallOutAnims();
mpPart2->initDyingAnims();
mpPart2->resetSingleAnim(TIMER_02_ANIM_SIREN_SAFE);
mpPart2->enableSafeAnim();
mLastTime = mActualTime;
if ((mLastTime / 1000) % 2 != 0) {
mpPart2->syncTimeWithSafe();
field_0x59 = true;
field_0x5C = 2;
}
mStateMgr.changeState(StateID_ChangeSafe);
}
void dLytMeterTimer_c::gotoSafe() {
mStateMgr.changeState(StateID_Safe);
}
void dLytMeterTimer_c::gotoChangeFruits6() {
if (mStateMgr.isState(StateID_Siren) || mStateMgr.isState(StateID_Safe)) {
mpPart1->resetBowlNuts();
mpPart1->updateDropLine(mpPart2->i_getPane());
mpPart1->startFruitAnim(mpPart1->getField0x780());
mpPart1->createEffect(mpPart1->getField0x780());
field_0x54 = false;
field_0x56 = 6;
mStateMgr.changeState(StateID_ChangeFruits);
}
}
void dLytMeterTimer_c::gotoFruits() {
mStateMgr.changeState(StateID_Fruits);
}
void dLytMeterTimer_c::startOut() {
mpPart1->stopInAnim();
mpPart2->stopInAnim();
mpPart1->startOutAnim();
mpPart2->startOutAnim();
}
void dLytMeterTimer_c::gotoChangeFruits3() {
if (mStateMgr.isState(StateID_Siren) || mStateMgr.isState(StateID_Safe)) {
mpPart2->initBeforeFallAnim();
mpPart2->setNumPetals(0);
mpPart2->realizePetalsOnOff();
mpPart2->enableSafeAnim();
mpPart2->finishSingleAnim(TIMER_02_ANIM_SIREN_SAFE);
mpPart2->resetSingleAnim(TIMER_02_ANIM_BLOOM);
mpPart2->enableBloomAnim();
field_0x54 = false;
field_0x56 = 3;
mStateMgr.changeState(StateID_ChangeFruits);
}
}
void dLytMeterTimer_c::startSafe() {
mpPart2->setNumPetals(TIMER_02_NUM_PETALS);
mpPart2->realizePetalsOnOff();
mpPart2->initFallOutAnims();
mpPart2->initDyingAnims();
mpPart2->resetSingleAnim(TIMER_02_ANIM_SIREN_SAFE);
mpPart2->enableSafeAnim();
mLastTime = mActualTime;
field_0x56 = 4;
}
void dLytMeterTimer_c::doPickup() {
mpPart1->resetBowlNuts();
mpPart1->updateDropLine(mpPart2->i_getPane());
mpPart1->startFruitAnim(mpPart1->getField0x780());
mpPart1->createEffect(mpPart1->getField0x780());
field_0x56 = 6;
}
bool dLytMeterTimer_c::isInSiren() {
if (EventManager::isInEvent()) {
return false;
}
return mStateMgr.isState(StateID_Siren);
}
s32 dLytMeterTimer_c::getPetalForTimerMaybe(s32 time) {
s32 result = time / 10000;
if (time % 10000 != 0) {
result += 1;
}
if (result <= TIMER_02_NUM_PETALS) {
return result;
}
return TIMER_02_NUM_PETALS;
}
bool dLytMeterTimer_c::checkForPetalChangeMaybe() {
if (mLastTime - mActualTime > 10000) {
mpPart2->setNumPetals(getPetalForTimerMaybe(mLastTime));
mLastTime = mActualTime;
return true;
}
return false;
}