Files
ss/include/d/lyt/meter/d_lyt_meter_timer.h
T
2025-04-21 21:51:06 +02:00

305 lines
7.9 KiB
C++

#ifndef D_LYT_METER_TIMER_H
#define D_LYT_METER_TIMER_H
#include "common.h"
#include "d/a/d_a_item.h"
#include "d/lyt/d2d.h"
#include "m/m_color.h"
#include "nw4r/lyt/lyt_pane.h"
#include "s/s_State.hpp"
class LytMeterTimerPart1_c : public d2d::dSubPane {
public:
LytMeterTimerPart1_c()
: mActualTearCount(0), mDisplayedTearCount(0), field_0x760(0), mTrial(dAcItem_c::TRIAL_NONE), field_0x780(0) {
sInstance = this;
}
virtual bool build(d2d::ResAccIf_c *resAcc) override;
virtual bool remove() override;
virtual bool execute() override;
virtual nw4r::lyt::Pane *getPane() override {
return mLyt.getLayout()->GetRootPane();
}
virtual d2d::LytBase_c *getLyt() override {
return &mLyt;
}
virtual const char *getName() const override {
return mLyt.getName();
}
virtual ~LytMeterTimerPart1_c() {
sInstance = nullptr;
}
static LytMeterTimerPart1_c *GetInstance() {
return sInstance;
}
void init();
void startInAnim();
void realizeTrial();
void startOutAnim();
void stopInAnim();
void stopFinishedFruit();
void stopOutAnim();
bool isInAnimFinished();
bool isCurrentFruitAnimFinished();
bool isAnyFruitAnimFinished();
bool isLastFruitAnimFinished();
bool isOutAnimFinished();
void startFruitAnim(s32 index);
void resetBowlNuts();
void updateDropLine(nw4r::lyt::Pane *pane);
void createEffect(s32 fruitIndex);
bool incrementTearCount();
bool isAnyFruitAnimAtFrame(f32 f) const;
s32 getActualTearCount() const {
return mActualTearCount;
}
s32 getDisplayedTearCount() const {
return mDisplayedTearCount;
}
s32 getField0x780() const {
return field_0x780;
}
void setField0x780(s32 val) {
field_0x780 = val;
}
private:
void initLoopAnim();
void initBowlNuts();
void initOutAnim();
void initColors();
void initInAnim();
void startNextFruitAnim();
void disableCurrentFruitAnim();
static LytMeterTimerPart1_c *sInstance;
/* 0x008 */ d2d::dLytSub mLyt;
/* 0x09C */ d2d::AnmGroup_c mAnm[26];
/* 0x71C */ s32 mActualTearCount;
/* 0x720 */ s32 mDisplayedTearCount;
/* 0x724 */ nw4r::lyt::Pane *mpPanes[15];
/* 0x760 */ s32 field_0x760;
/* 0x764 */ dAcItem_c::Trial_e mTrial;
/* 0x768 */ mColor mColors1[3];
/* 0x774 */ mColor mColors2[3];
/* 0x780 */ s32 field_0x780;
};
class LytMeterTimerPart2_c : public d2d::dSubPane {
public:
LytMeterTimerPart2_c(): mNumPetals(0), mTrial(dAcItem_c::TRIAL_NONE), mVisible(true), mFlowerLoopFrame(0.0f) {
sInstance = this;
}
virtual bool build(d2d::ResAccIf_c *resAcc) override;
virtual bool remove() override;
virtual bool execute() override;
virtual nw4r::lyt::Pane *getPane() override {
return mLyt.getLayout()->GetRootPane();
}
virtual d2d::LytBase_c *getLyt() override {
return &mLyt;
}
virtual const char *getName() const override {
return mLyt.getName();
}
virtual ~LytMeterTimerPart2_c() {
sInstance = nullptr;
}
static LytMeterTimerPart2_c *GetInstance() {
return sInstance;
}
void setNumPetals(s32 num) {
mNumPetals = num;
}
s32 getNumPetals() const {
return mNumPetals;
}
nw4r::lyt::Pane *i_getPane() const {
return mpPane;
}
void setVisible(bool bVisible) {
mVisible = bVisible;
}
void calc();
void init();
void initDyingAnims();
void initFallOutAnims();
void realizePetalsOnOff();
void syncPetalsTime();
void updatePetalsRate();
void restartPetals();
void finishSingleAnim(u8 idx);
void resetSingleAnim(u8 idx);
void startInAnim();
void startOutAnim();
void stopInAnim();
void stopBloomAnim();
void stopBeforeFallAnim();
void stopChangeSirenAnim();
void stopSirenLoopAnim();
void stopSirenSafeAnim();
void stopFlowerLoopAnim();
void resetFlowerLoopAnim();
void stopDyingAnims();
void stopFinishedDyingAnims();
void stopFallOutAnims();
void stopFinishedFallOutAnims();
void stopOutAnim();
void stopChangeFruitAnim();
bool isInAnimFinished();
bool isBloomAnimFinished();
bool isBeforeFallAnimAtStart();
bool isChangeSirenAnimFinished();
bool isSirenSafeAnimFinished();
bool isFlowerLoopAnimFinished();
bool isOutAnimFinished();
bool isChangeFruitAnimFinished();
void realizeFruitsColor();
void finishDyingAnims();
void setPetalsToStart();
void enableChangeFruitAnim();
void enableBloomAnim();
void enableBeforeFallAnim();
void enableChangeSirenAnim();
void enableSirenLoopAnim();
void enableSafeAnim();
void resumeFlowerLoop();
void startFlowerLoop();
void syncTime();
void syncTimeWithSafe();
/** Played when the finish animation is played and each tear hits the flower */
void createSingleFruitEffect();
/** Played when the whole fruit is finished */
void createFruitCompleteEffect();
void initBeforeFallAnim();
bool isPetalDyingAnimFinished();
bool isFirstFallOutAnimFinished();
void initChangeSirenAnim();
private:
void initBloomAnim();
void initSirenLoopAnim();
void initSirenSafeAnim();
void initFlowerLoopAnim();
void initOutAnim();
void initInAnim();
void initChangeFruitAnim();
void initColors();
static LytMeterTimerPart2_c *sInstance;
/* 0x008 */ d2d::dLytSub mLyt;
/* 0x09C */ d2d::AnmGroup_c mAnm[30];
/* 0x81C */ s32 mNumPetals;
/* 0x820 */ nw4r::lyt::Pane *mpPane;
/* 0x824 */ dAcItem_c::Trial_e mTrial;
/* 0x828 */ mColor mColors1[2];
/* 0x830 */ mColor mColors2[2];
/* 0x838 */ u8 mVisible;
/* 0x83C */ f32 mFlowerLoopFrame;
};
class dLytMeterTimer_c {
public:
dLytMeterTimer_c()
: mStateMgr(*this, sStateID::null),
mpPart1(nullptr),
mpPart2(nullptr),
field_0x48(0),
field_0x49(0),
mActualTime(0),
mLastTime(0),
field_0x54(0),
field_0x55(0),
field_0x56(8),
field_0x57(8),
field_0x58(0),
field_0x59(0),
field_0x5C(0),
field_0x60(0) {}
virtual ~dLytMeterTimer_c() {}
bool build();
bool remove();
bool execute();
bool startIn2();
bool startOut2();
bool getField_0x54() const {
return field_0x54;
}
private:
void startIn();
void gotoChangeSiren();
void gotoSiren();
void gotoChangeSafeBloom();
void gotoChangeSafe();
void gotoSafe();
void gotoChangeFruits6();
void gotoFruits();
void startOut();
void gotoChangeFruits3();
void startSafe();
void doPickup();
bool isInSiren();
s32 getPetalForTimerMaybe(s32 time);
bool checkForPetalChangeMaybe();
STATE_FUNC_DECLARE(dLytMeterTimer_c, ChangeSiren);
STATE_FUNC_DECLARE(dLytMeterTimer_c, Siren);
STATE_FUNC_DECLARE(dLytMeterTimer_c, ChangeSafeBloom);
STATE_FUNC_DECLARE(dLytMeterTimer_c, ChangeSafe);
STATE_FUNC_DECLARE(dLytMeterTimer_c, Safe);
STATE_FUNC_DECLARE(dLytMeterTimer_c, ChangeFruits);
STATE_FUNC_DECLARE(dLytMeterTimer_c, Fruits);
static bool sDoExit;
static bool sDoFinishAnim;
static bool sFinished;
STATE_MGR_DEFINE_UTIL_CHANGESTATE(dLytMeterTimer_c);
STATE_MGR_DEFINE_UTIL_ISSTATE(dLytMeterTimer_c);
/* 0x04 */ UI_STATE_MGR_DECLARE(dLytMeterTimer_c);
/* 0x40 */ LytMeterTimerPart1_c *mpPart1;
/* 0x44 */ LytMeterTimerPart2_c *mpPart2;
/* 0x48 */ u8 field_0x48;
/* 0x49 */ u8 field_0x49;
/* 0x4C */ s32 mActualTime;
/* 0x50 */ s32 mLastTime;
/* 0x54 */ bool field_0x54;
/* 0x55 */ u8 field_0x55;
/* 0x56 */ u8 field_0x56;
/* 0x57 */ u8 field_0x57;
/* 0x58 */ u8 field_0x58;
/* 0x59 */ u8 field_0x59;
/* 0x5C */ s32 field_0x5C;
/* 0x60 */ s32 field_0x60;
};
#endif