diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 31176913..f80167ef 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -5530,9 +5530,9 @@ executeState_Off__18dLytMeterBossKey_cFv = .text:0x800E2D90; // type:function si finalizeState_Off__18dLytMeterBossKey_cFv = .text:0x800E2E10; // type:function size:0x4 build__18dLytMeterBossKey_cFPQ23d2d10ResAccIf_c = .text:0x800E2E20; // type:function size:0x2F4 remove__18dLytMeterBossKey_cFv = .text:0x800E3120; // type:function size:0x58 -fn_800E3180 = .text:0x800E3180; // type:function size:0x21C +execute__18dLytMeterBossKey_cFv = .text:0x800E3180; // type:function size:0x21C draw__18dLytMeterBossKey_cFv = .text:0x800E33A0; // type:function size:0x28 -fn_800E33D0 = .text:0x800E33D0; // type:function size:0x20 +setPosition__18dLytMeterBossKey_cFl = .text:0x800E33D0; // type:function size:0x20 initializeState_Wait__19dLytMeterSmallKey_cFv = .text:0x800E33F0; // type:function size:0x4 executeState_Wait__19dLytMeterSmallKey_cFv = .text:0x800E3400; // type:function size:0x5C finalizeState_Wait__19dLytMeterSmallKey_cFv = .text:0x800E3460; // type:function size:0x4 @@ -5547,9 +5547,9 @@ executeState_Off__19dLytMeterSmallKey_cFv = .text:0x800E36D0; // type:function s finalizeState_Off__19dLytMeterSmallKey_cFv = .text:0x800E3750; // type:function size:0x4 build__19dLytMeterSmallKey_cFPQ23d2d10ResAccIf_c = .text:0x800E3760; // type:function size:0x230 remove__19dLytMeterSmallKey_cFv = .text:0x800E3990; // type:function size:0x58 -fn_800E39F0 = .text:0x800E39F0; // type:function size:0x224 +execute__19dLytMeterSmallKey_cFv = .text:0x800E39F0; // type:function size:0x224 draw__19dLytMeterSmallKey_cFv = .text:0x800E3C20; // type:function size:0x28 -fn_800E3C50 = .text:0x800E3C50; // type:function size:0x20 +setPosition__19dLytMeterSmallKey_cFl = .text:0x800E3C50; // type:function size:0x20 __sinit_\d_lyt_meter_key_cpp = .text:0x800E3C70; // type:function size:0x9EC scope:local __dt__35sFStateID_c<20dLytMeterKakeraKey_c>Fv = .text:0x800E4660; // type:function size:0x58 __dt__33sFStateID_c<18dLytMeterBossKey_c>Fv = .text:0x800E46C0; // type:function size:0x58 @@ -10577,7 +10577,7 @@ StageManager__isAreaTypeHouse = .text:0x80199940; // type:function size:0x2C isAreaTypeSky__11dStageMgr_cCFv = .text:0x80199970; // type:function size:0x2C isAreaTypeOverworldOrSkyloft__11dStageMgr_cCFv = .text:0x801999A0; // type:function size:0x3C isAreaTypeDungeonOrBoss__11dStageMgr_cCFv = .text:0x801999E0; // type:function size:0x3C -StageManager__getSTIFmapNameId = .text:0x80199A20; // type:function size:0x20 +getMapNameId__11dStageMgr_cCFv = .text:0x80199A20; // type:function size:0x20 StageManager__getSTIFbyte4 = .text:0x80199A40; // type:function size:0x20 fn_80199A60 = .text:0x80199A60; // type:function size:0x3C isSTIFbyte4_5or6 = .text:0x80199AA0; // type:function size:0x3C @@ -13581,7 +13581,7 @@ AcItem__getMaxNumberOfSlingshotSeeds = .text:0x802522A0; // type:function size:0 getTotalSeedCapacity__9dAcItem_cFv = .text:0x802522B0; // type:function size:0x38 getKeyPieceCount__9dAcItem_cFv = .text:0x802522F0; // type:function size:0x8 increaseKeyPieceCounter = .text:0x80252300; // type:function size:0xC -getSmallKeyCounter = .text:0x80252310; // type:function size:0x8 +getSmallKeyCount__9dAcItem_cFv = .text:0x80252310; // type:function size:0x8 increaseSmallKeyCounter = .text:0x80252320; // type:function size:0xC getAdditionalPouchSlotCounter = .text:0x80252330; // type:function size:0x8 addToAdditionalAdventurePouchCounter = .text:0x80252340; // type:function size:0xC @@ -31296,34 +31296,34 @@ lbl_80513FF0 = .data:0x80513FF0; // type:object size:0xE data:string lbl_80514000 = .data:0x80514000; // type:object size:0xD data:string __vt__15dLytMeterZBtn_c = .data:0x80514010; // type:object size:0x34 __vt__30sFStateID_c<15dLytMeterZBtn_c> = .data:0x80514150; // type:object size:0x34 -lbl_80514188 = .data:0x80514188; // type:object size:0x18 -lbl_805141A0 = .data:0x805141A0; // type:object size:0xC -lbl_805141AC = .data:0x805141AC; // type:object size:0x1C -lbl_805141C8 = .data:0x805141C8; // type:object size:0x10 -lbl_805141D8 = .data:0x805141D8; // type:object size:0x1C -lbl_805141F4 = .data:0x805141F4; // type:object size:0x10 -lbl_80514204 = .data:0x80514204; // type:object size:0x1C -lbl_80514220 = .data:0x80514220; // type:object size:0x10 -lbl_80514230 = .data:0x80514230; // type:object size:0x1C -lbl_8051424C = .data:0x8051424C; // type:object size:0x10 -lbl_8051425C = .data:0x8051425C; // type:object size:0x1C -lbl_80514278 = .data:0x80514278; // type:object size:0x10 +lbl_80514188 = .data:0x80514188; // type:object size:0x16 data:string +lbl_805141A0 = .data:0x805141A0; // type:object size:0xB data:string +lbl_805141AC = .data:0x805141AC; // type:object size:0x1B data:string +lbl_805141C8 = .data:0x805141C8; // type:object size:0xD data:string +lbl_805141D8 = .data:0x805141D8; // type:object size:0x1B data:string +lbl_805141F4 = .data:0x805141F4; // type:object size:0xD data:string +lbl_80514204 = .data:0x80514204; // type:object size:0x1B data:string +lbl_80514220 = .data:0x80514220; // type:object size:0xD data:string +lbl_80514230 = .data:0x80514230; // type:object size:0x1B data:string +lbl_8051424C = .data:0x8051424C; // type:object size:0xD data:string +lbl_8051425C = .data:0x8051425C; // type:object size:0x1B data:string +lbl_80514278 = .data:0x80514278; // type:object size:0xD data:string lbl_80514288 = .data:0x80514288; // type:object size:0x18 data:string -lbl_805142A0 = .data:0x805142A0; // type:object size:0xC -lbl_805142AC = .data:0x805142AC; // type:object size:0x4C +lbl_805142A0 = .data:0x805142A0; // type:object size:0xA data:string +lbl_805142AC = .data:0x805142AC; // type:object size:0x17 data:string lbl_805142F8 = .data:0x805142F8; // type:object size:0x14 data:string -lbl_8051430C = .data:0x8051430C; // type:object size:0x18 -lbl_80514324 = .data:0x80514324; // type:object size:0x1C -lbl_80514340 = .data:0x80514340; // type:object size:0x10 -lbl_80514350 = .data:0x80514350; // type:object size:0x18 -lbl_80514368 = .data:0x80514368; // type:object size:0x1C -lbl_80514384 = .data:0x80514384; // type:object size:0x34 -lbl_805143B8 = .data:0x805143B8; // type:object size:0x18 -lbl_805143D0 = .data:0x805143D0; // type:object size:0x18 -lbl_805143E8 = .data:0x805143E8; // type:object size:0x1C -lbl_80514404 = .data:0x80514404; // type:object size:0x10 -lbl_80514414 = .data:0x80514414; // type:object size:0x18 -lbl_8051442C = .data:0x8051442C; // type:object size:0x3E4 +lbl_8051430C = .data:0x8051430C; // type:object size:0x15 data:string +lbl_80514324 = .data:0x80514324; // type:object size:0x19 data:string +lbl_80514340 = .data:0x80514340; // type:object size:0xD data:string +lbl_80514350 = .data:0x80514350; // type:object size:0x16 data:string +lbl_80514368 = .data:0x80514368; // type:object size:0x1A data:string +lbl_80514384 = .data:0x80514384; // type:object size:0xE data:string +lbl_805143B8 = .data:0x805143B8; // type:object size:0x15 data:string +lbl_805143D0 = .data:0x805143D0; // type:object size:0x16 data:string +lbl_805143E8 = .data:0x805143E8; // type:object size:0x1B data:string +lbl_80514404 = .data:0x80514404; // type:object size:0xE data:string +lbl_80514414 = .data:0x80514414; // type:object size:0x17 data:string +lbl_8051442C = .data:0x8051442C; // type:object size:0x1B data:string __vt__34sFStateID_c<19dLytMeterSmallKey_c> = .data:0x80514810; // type:object size:0x34 __vt__33sFStateID_c<18dLytMeterBossKey_c> = .data:0x80514844; // type:object size:0x34 __vt__35sFStateID_c<20dLytMeterKakeraKey_c> = .data:0x80514878; // type:object size:0x34 @@ -48637,19 +48637,19 @@ LytMeterZBtn__STATE_WAIT = .bss:0x805AA360; // type:object size:0x30 data:4byte LytMeterZBtn__STATE_ON = .bss:0x805AA3A0; // type:object size:0x30 data:4byte LytMeterZBtn__STATE_ACTIVE = .bss:0x805AA3E0; // type:object size:0x30 data:4byte LytMeterZBtn__STATE_OFF = .bss:0x805AA420; // type:object size:0x30 data:4byte -lbl_805AA450 = .bss:0x805AA450; // type:object size:0x10 -LytMeterKakeraKey__STATE_WAIT = .bss:0x805AA460; // type:object size:0x40 data:4byte -LytMeterKakeraKey__STATE_ON = .bss:0x805AA4A0; // type:object size:0x40 data:4byte -lbl_805AA4E0 = .bss:0x805AA4E0; // type:object size:0x40 data:4byte -LytMeterKakeraKey__STATE_ACTIVE = .bss:0x805AA520; // type:object size:0x40 data:4byte -LytMeterKakeraKey__STATE_OFF = .bss:0x805AA560; // type:object size:0x40 data:4byte -LytMeterBossKey__STATE_WAIT = .bss:0x805AA5A0; // type:object size:0x40 data:4byte -LytMeterBossKey__STATE_ON = .bss:0x805AA5E0; // type:object size:0x40 data:4byte -LytMeterBossKey__STATE_ACTIVE = .bss:0x805AA620; // type:object size:0x40 data:4byte -LytMeterBossKey__STATE_OFF = .bss:0x805AA660; // type:object size:0x40 data:4byte -LytMeterSmallKey__STATE_WAIT = .bss:0x805AA6A0; // type:object size:0x40 data:4byte -LytMeterSmallKey__STATE_ON = .bss:0x805AA6E0; // type:object size:0x40 data:4byte -LytMeterSmallKey__STATE_ACTIVE = .bss:0x805AA720; // type:object size:0x40 data:4byte +lbl_805AA450 = .bss:0x805AA450; // type:object size:0xC +LytMeterKakeraKey__STATE_WAIT = .bss:0x805AA460; // type:object size:0x30 data:4byte +LytMeterKakeraKey__STATE_ON = .bss:0x805AA4A0; // type:object size:0x30 data:4byte +lbl_805AA4E0 = .bss:0x805AA4E0; // type:object size:0x30 data:4byte +LytMeterKakeraKey__STATE_ACTIVE = .bss:0x805AA520; // type:object size:0x30 data:4byte +LytMeterKakeraKey__STATE_OFF = .bss:0x805AA560; // type:object size:0x30 data:4byte +LytMeterBossKey__STATE_WAIT = .bss:0x805AA5A0; // type:object size:0x30 data:4byte +LytMeterBossKey__STATE_ON = .bss:0x805AA5E0; // type:object size:0x30 data:4byte +LytMeterBossKey__STATE_ACTIVE = .bss:0x805AA620; // type:object size:0x30 data:4byte +LytMeterBossKey__STATE_OFF = .bss:0x805AA660; // type:object size:0x30 data:4byte +LytMeterSmallKey__STATE_WAIT = .bss:0x805AA6A0; // type:object size:0x30 data:4byte +LytMeterSmallKey__STATE_ON = .bss:0x805AA6E0; // type:object size:0x30 data:4byte +LytMeterSmallKey__STATE_ACTIVE = .bss:0x805AA720; // type:object size:0x30 data:4byte LytMeterSmallKey__STATE_OFF = .bss:0x805AA760; // type:object size:0x30 data:4byte lbl_805AA790 = .bss:0x805AA790; // type:object size:0xC scope:local StateID_Invisible__21dLytMeterDrinkParts_c = .bss:0x805AA7A0; // type:object size:0x30 data:4byte diff --git a/configure.py b/configure.py index 6dbc967a..c4fca040 100644 --- a/configure.py +++ b/configure.py @@ -388,7 +388,7 @@ config.libs = [ Object(NonMatching, "d/lyt/meter/d_lyt_meter_unk.cpp"), Object(Matching, "d/lyt/meter/d_lyt_meter_a_btn.cpp"), Object(Matching, "d/lyt/meter/d_lyt_meter_z_btn.cpp"), - Object(NonMatching, "d/lyt/meter/d_lyt_meter_key.cpp"), + Object(Matching, "d/lyt/meter/d_lyt_meter_key.cpp"), Object(Matching, "d/lyt/meter/d_lyt_meter_drink.cpp"), Object(Matching, "d/lyt/meter/d_lyt_meter_remocon_bg.cpp"), Object(Matching, "d/lyt/meter/d_lyt_meter_nunchaku_bg.cpp"), diff --git a/include/d/a/d_a_item.h b/include/d/a/d_a_item.h index 45a546b9..b5e28d15 100644 --- a/include/d/a/d_a_item.h +++ b/include/d/a/d_a_item.h @@ -59,7 +59,8 @@ public: static s32 getTotalSeedCapacity(); static s32 getTotalArrowCapacity(); - static bool getKeyPieceCount(); + static u32 getKeyPieceCount(); + static u32 getSmallKeyCount(); static bool isRupee(ITEM_ID item); static bool isKeyPiece(ITEM_ID item); diff --git a/include/d/d_bzs_types.h b/include/d/d_bzs_types.h index bf0a06f5..cf5264b4 100644 --- a/include/d/d_bzs_types.h +++ b/include/d/d_bzs_types.h @@ -189,7 +189,7 @@ struct STIF { /* 0x0F */ u8 field_0x0F; /* 0x10 */ u8 field_0x10; /* 0x11 */ u8 field_0x11; - /* 0x12 */ u8 mapNameId; + /* 0x12 */ s8 mapNameId; /* 0x13 */ u8 field_0x13; }; diff --git a/include/d/d_stage_mgr.h b/include/d/d_stage_mgr.h index 523d180f..d4a3a805 100644 --- a/include/d/d_stage_mgr.h +++ b/include/d/d_stage_mgr.h @@ -54,6 +54,7 @@ public: s32 getSTIFunk1() const; s32 getAreaType() const; + s32 getMapNameId() const; static dStageMgr_c *GetInstance() { return sInstance; diff --git a/include/d/lyt/meter/d_lyt_meter_key.h b/include/d/lyt/meter/d_lyt_meter_key.h index a717ddd3..57a5c05a 100644 --- a/include/d/lyt/meter/d_lyt_meter_key.h +++ b/include/d/lyt/meter/d_lyt_meter_key.h @@ -1,6 +1,7 @@ #ifndef D_LYT_METER_KEY_H #define D_LYT_METER_KEY_H +#include "common.h" #include "d/lyt/d2d.h" #include "m/m_vec.h" #include "nw4r/lyt/lyt_pane.h" @@ -49,8 +50,11 @@ public: bool build(d2d::ResAccIf_c *); bool remove(); + bool execute(); bool draw(); + void setPosition(s32 position); + private: STATE_FUNC_DECLARE(dLytMeterBossKey_c, Wait); STATE_FUNC_DECLARE(dLytMeterBossKey_c, On); @@ -60,8 +64,13 @@ private: /* 0x004 */ UI_STATE_MGR_DECLARE(dLytMeterBossKey_c); /* 0x040 */ d2d::dLytSub mLyt; /* 0x0D4 */ d2d::AnmGroup_c mAnm[5]; - /* 0x214 */ u32 field_0x2D0; - /* 0x218 */ mVec3_c mVecs[4]; + /* 0x214 */ nw4r::lyt::Pane *mpPane; + /* 0x218 */ mVec3_c mPanePositions[4]; + /* 0x248 */ mVec3_c mPosition; + /* 0x254 */ s32 mPosititionIndex; + /* 0x258 */ s32 mOldPosititionIndex; + /* 0x25C */ s32 mMovementFrame; + /* 0x260 */ u8 mShouldBeVisible; }; class dLytMeterSmallKey_c { @@ -74,8 +83,11 @@ public: bool build(d2d::ResAccIf_c *); bool remove(); + bool execute(); bool draw(); + void setPosition(s32 position); + private: STATE_FUNC_DECLARE(dLytMeterSmallKey_c, Wait); STATE_FUNC_DECLARE(dLytMeterSmallKey_c, On); @@ -85,8 +97,14 @@ private: /* 0x004 */ UI_STATE_MGR_DECLARE(dLytMeterSmallKey_c); /* 0x040 */ d2d::dLytSub mLyt; /* 0x0D4 */ d2d::AnmGroup_c mAnm[5]; - /* 0x214 */ u32 field_0x2D0; - /* 0x218 */ mVec3_c mVecs[4]; + /* 0x214 */ nw4r::lyt::Pane *mpPane; + /* 0x218 */ mVec3_c mPanePositions[4]; + /* 0x248 */ mVec3_c mPosition; + /* 0x254 */ s32 mSavedSmallKeyCount; + /* 0x258 */ s32 mPosititionIndex; + /* 0x25C */ s32 mOldPosititionIndex; + /* 0x260 */ s32 mMovementFrame; + /* 0x264 */ u8 mShouldBeVisible; }; #endif diff --git a/src/d/lyt/meter/d_lyt_meter_key.cpp b/src/d/lyt/meter/d_lyt_meter_key.cpp index a34f8304..6feb5957 100644 --- a/src/d/lyt/meter/d_lyt_meter_key.cpp +++ b/src/d/lyt/meter/d_lyt_meter_key.cpp @@ -3,6 +3,7 @@ #include "c/c_lib.h" #include "common.h" #include "d/a/d_a_item.h" +#include "d/d_stage_mgr.h" #include "d/lyt/d2d.h" #include "m/m_vec.h" #include "nw4r/lyt/lyt_pane.h" @@ -207,34 +208,323 @@ void dLytMeterKakeraKey_c::setPosition(s32 position) { mMovementFrame = 0; } +static const d2d::LytBrlanMapping brlanMapBoss[] = { + { "keyBoss_00_in.brlan", "G_inOut_00"}, + { "keyBoss_00_out.brlan", "G_inOut_00"}, + { "keyBoss_00_keyBoss.brlan", "G_keyBoss_00"}, + { "keyBoss_00_loop.brlan", "G_loop_00"}, + {"keyBoss_00_position.brlan", "G_position_00"}, +}; + +#define KEY_BOSS_ANIM_IN 0 +#define KEY_BOSS_ANIM_OUT 1 +#define KEY_BOSS_ANIM_KEYBOSS 2 +#define KEY_BOSS_ANIM_LOOP 3 +#define KEY_BOSS_ANIM_POSITION 4 + +#define KEY_BOSS_NUM_ANIMS 5 + void dLytMeterBossKey_c::initializeState_Wait() {} -void dLytMeterBossKey_c::executeState_Wait() {} +void dLytMeterBossKey_c::executeState_Wait() { + if (mShouldBeVisible) { + mStateMgr.changeState(StateID_On); + } +} void dLytMeterBossKey_c::finalizeState_Wait() {} -void dLytMeterBossKey_c::initializeState_On() {} -void dLytMeterBossKey_c::executeState_On() {} +void dLytMeterBossKey_c::initializeState_On() { + mAnm[KEY_BOSS_ANIM_IN].setAnimEnable(true); + mAnm[KEY_BOSS_ANIM_IN].setFrame(0.0f); +} +void dLytMeterBossKey_c::executeState_On() { + if (mAnm[KEY_BOSS_ANIM_IN].isEndReached()) { + mAnm[KEY_BOSS_ANIM_IN].setAnimEnable(false); + mStateMgr.changeState(StateID_Active); + } +} void dLytMeterBossKey_c::finalizeState_On() {} void dLytMeterBossKey_c::initializeState_Active() {} -void dLytMeterBossKey_c::executeState_Active() {} +void dLytMeterBossKey_c::executeState_Active() { + if (!mShouldBeVisible) { + mStateMgr.changeState(StateID_Off); + } +} void dLytMeterBossKey_c::finalizeState_Active() {} -void dLytMeterBossKey_c::initializeState_Off() {} -void dLytMeterBossKey_c::executeState_Off() {} +void dLytMeterBossKey_c::initializeState_Off() { + mAnm[KEY_BOSS_ANIM_OUT].setAnimEnable(true); + mAnm[KEY_BOSS_ANIM_OUT].setFrame(0.0f); +} +void dLytMeterBossKey_c::executeState_Off() { + if (mAnm[KEY_BOSS_ANIM_OUT].isEndReached()) { + mAnm[KEY_BOSS_ANIM_OUT].setAnimEnable(false); + mStateMgr.changeState(StateID_Wait); + } +} void dLytMeterBossKey_c::finalizeState_Off() {} +bool dLytMeterBossKey_c::build(d2d::ResAccIf_c *resAcc) { + mLyt.setResAcc(resAcc); + mLyt.build("keyBoss_00.brlyt", nullptr); + + for (int i = 0; i < KEY_BOSS_NUM_ANIMS; i++) { + mAnm[i].init(brlanMapBoss[i].mFile, resAcc, mLyt.getLayout(), brlanMapBoss[i].mName); + mAnm[i].bind(false); + mAnm[i].setAnimEnable(false); + } + + mAnm[KEY_BOSS_ANIM_LOOP].setAnimEnable(true); + mpPane = mLyt.findPane("N_keyBoss_00"); + mAnm[KEY_BOSS_ANIM_POSITION].setAnimEnable(true); + + for (int i = 0; i < 4; i++) { + mAnm[KEY_BOSS_ANIM_POSITION].setFrame(i); + mLyt.calc(); + mPanePositions[i].copyFrom(mLyt.findPane("N_keyPosition_00")->GetTranslate()); + } + + mAnm[KEY_BOSS_ANIM_POSITION].setAnimEnable(false); + + mPosititionIndex = 1; + mOldPosititionIndex = 1; + mMovementFrame = 0; + + mPosition.copyFrom(mPanePositions[mPosititionIndex]); + mShouldBeVisible = 0; + mpPane->SetTranslate(mPosition); + + mAnm[KEY_BOSS_ANIM_IN].setFrame(0.0f); + mAnm[KEY_BOSS_ANIM_IN].setAnimEnable(true); + + f32 frame = 0.0f; + if (dStageMgr_c::GetInstance()->getMapNameId() == 11) { + frame = 0.0f; + } else if (dStageMgr_c::GetInstance()->getMapNameId() == 14) { + frame = 1.0f; + } else if (dStageMgr_c::GetInstance()->getMapNameId() == 12) { + frame = 2.0f; + } else if (dStageMgr_c::GetInstance()->getMapNameId() == 16) { + frame = 3.0f; + } else if (dStageMgr_c::GetInstance()->getMapNameId() == 13) { + frame = 4.0f; + } else if (dStageMgr_c::GetInstance()->getMapNameId() == 15) { + frame = 5.0f; + } + + mAnm[KEY_BOSS_ANIM_KEYBOSS].setAnimEnable(true); + mAnm[KEY_BOSS_ANIM_KEYBOSS].setFrame(frame); + + mLyt.getLayout()->Animate(0); + mLyt.calc(); + mAnm[KEY_BOSS_ANIM_IN].setAnimEnable(false); + mAnm[KEY_BOSS_ANIM_KEYBOSS].setAnimEnable(false); + + mStateMgr.changeState(StateID_Wait); + return true; +} + +bool dLytMeterBossKey_c::remove() { + for (int i = 0; i < KEY_BOSS_NUM_ANIMS; i++) { + mAnm[i].unbind(); + mAnm[i].remove(); + } + return true; +} + +bool dLytMeterBossKey_c::execute() { + mStateMgr.executeState(); + + if (mPosition != mPanePositions[mPosititionIndex]) { + if (mMovementFrame < 5) { + mPosition = (mPanePositions[mPosititionIndex] - mPanePositions[mOldPosititionIndex]) * + cLib::easeOut(++mMovementFrame / 5.0f, 3.0f) + + mPanePositions[mOldPosititionIndex]; + } else { + mMovementFrame = 0; + mPosition = mPanePositions[mPosititionIndex]; + } + mpPane->SetTranslate(mPosition); + } + + for (int i = 0; i < KEY_BOSS_NUM_ANIMS; i++) { + if (mAnm[i].isEnabled()) { + mAnm[i].play(); + } + } + mLyt.calc(); + + return true; +} + +bool dLytMeterBossKey_c::draw() { + mLyt.addToDrawList(); + return true; +} + +void dLytMeterBossKey_c::setPosition(s32 position) { + if (mPosititionIndex == position) { + return; + } + + mOldPosititionIndex = mPosititionIndex; + mPosititionIndex = position; + mMovementFrame = 0; +} + +static const d2d::LytBrlanMapping brlanMapSmall[] = { + { "keySmall_00_in.brlan", "G_inOut_00"}, + { "keySmall_00_out.brlan", "G_inOut_00"}, + {"keySmall_00_keySmall.brlan", "G_keySmall_00"}, + { "keySmall_00_loop.brlan", "G_loop_00"}, + {"keySmall_00_position.brlan", "G_position_00"}, +}; + +#define KEY_SMALL_ANIM_IN 0 +#define KEY_SMALL_ANIM_OUT 1 +#define KEY_SMALL_ANIM_KEYSMALL 2 +#define KEY_SMALL_ANIM_LOOP 3 +#define KEY_SMALL_ANIM_POSITION 4 + +#define KEY_SMALL_NUM_ANIMS 5 + void dLytMeterSmallKey_c::initializeState_Wait() {} -void dLytMeterSmallKey_c::executeState_Wait() {} +void dLytMeterSmallKey_c::executeState_Wait() { + if (mShouldBeVisible && dAcItem_c::getSmallKeyCount() != 0) { + mStateMgr.changeState(StateID_On); + } +} void dLytMeterSmallKey_c::finalizeState_Wait() {} -void dLytMeterSmallKey_c::initializeState_On() {} -void dLytMeterSmallKey_c::executeState_On() {} +void dLytMeterSmallKey_c::initializeState_On() { + mAnm[KEY_SMALL_ANIM_IN].setAnimEnable(true); + mAnm[KEY_SMALL_ANIM_IN].setToEnd(); + mSavedSmallKeyCount = dAcItem_c::getSmallKeyCount(); + if (mSavedSmallKeyCount > 0 && mSavedSmallKeyCount <= 5) { + mAnm[KEY_SMALL_ANIM_KEYSMALL].setFrame(mSavedSmallKeyCount - 1); + } + mAnm[KEY_SMALL_ANIM_IN].setFrame(0.0f); +} +void dLytMeterSmallKey_c::executeState_On() { + if (mAnm[KEY_SMALL_ANIM_IN].isEndReached()) { + mAnm[KEY_SMALL_ANIM_IN].setAnimEnable(false); + mStateMgr.changeState(StateID_Active); + } +} void dLytMeterSmallKey_c::finalizeState_On() {} void dLytMeterSmallKey_c::initializeState_Active() {} -void dLytMeterSmallKey_c::executeState_Active() {} +void dLytMeterSmallKey_c::executeState_Active() { + if (mSavedSmallKeyCount != dAcItem_c::getSmallKeyCount()) { + mSavedSmallKeyCount = dAcItem_c::getSmallKeyCount(); + if (mSavedSmallKeyCount > 0 && mSavedSmallKeyCount <= 5) { + mAnm[KEY_SMALL_ANIM_KEYSMALL].setFrame(mSavedSmallKeyCount - 1); + } + } + + if (!mShouldBeVisible || dAcItem_c::getSmallKeyCount() == 0) { + mStateMgr.changeState(StateID_Off); + } +} void dLytMeterSmallKey_c::finalizeState_Active() {} -void dLytMeterSmallKey_c::initializeState_Off() {} -void dLytMeterSmallKey_c::executeState_Off() {} +void dLytMeterSmallKey_c::initializeState_Off() { + mAnm[KEY_SMALL_ANIM_OUT].setAnimEnable(true); + mAnm[KEY_SMALL_ANIM_OUT].setFrame(0.0f); +} +void dLytMeterSmallKey_c::executeState_Off() { + if (mAnm[KEY_SMALL_ANIM_OUT].isEndReached()) { + mAnm[KEY_SMALL_ANIM_OUT].setAnimEnable(false); + mStateMgr.changeState(StateID_Wait); + } +} void dLytMeterSmallKey_c::finalizeState_Off() {} + +bool dLytMeterSmallKey_c::build(d2d::ResAccIf_c *resAcc) { + mLyt.setResAcc(resAcc); + mLyt.build("keySmall_00.brlyt", nullptr); + + for (int i = 0; i < KEY_SMALL_NUM_ANIMS; i++) { + mAnm[i].init(brlanMapSmall[i].mFile, resAcc, mLyt.getLayout(), brlanMapSmall[i].mName); + mAnm[i].bind(false); + mAnm[i].setAnimEnable(false); + } + + mAnm[KEY_SMALL_ANIM_LOOP].setAnimEnable(true); + mAnm[KEY_SMALL_ANIM_KEYSMALL].setAnimEnable(true); + mpPane = mLyt.findPane("N_keyAll_00"); + mAnm[KEY_SMALL_ANIM_POSITION].setAnimEnable(true); + + for (int i = 0; i < 4; i++) { + mAnm[KEY_SMALL_ANIM_POSITION].setFrame(i); + mLyt.calc(); + mPanePositions[i].copyFrom(mLyt.findPane("N_keyPosition_00")->GetTranslate()); + } + + mAnm[KEY_SMALL_ANIM_POSITION].setAnimEnable(false); + + mPosititionIndex = 1; + mOldPosititionIndex = 1; + mMovementFrame = 0; + + mPosition.copyFrom(mPanePositions[mPosititionIndex]); + mShouldBeVisible = 0; + mSavedSmallKeyCount = 0; + mpPane->SetTranslate(mPosition); + + mAnm[KEY_SMALL_ANIM_IN].setFrame(0.0f); + mAnm[KEY_SMALL_ANIM_IN].setAnimEnable(true); + mLyt.calc(); + mAnm[KEY_SMALL_ANIM_IN].setAnimEnable(false); + + mStateMgr.changeState(StateID_Wait); + return true; +} + +bool dLytMeterSmallKey_c::remove() { + for (int i = 0; i < KEY_SMALL_NUM_ANIMS; i++) { + mAnm[i].unbind(); + mAnm[i].remove(); + } + return true; +} + +bool dLytMeterSmallKey_c::execute() { + mStateMgr.executeState(); + + if (mPosition != mPanePositions[mPosititionIndex]) { + if (mMovementFrame < 5) { + mPosition = (mPanePositions[mPosititionIndex] - mPanePositions[mOldPosititionIndex]) * + cLib::easeOut(++mMovementFrame / 5.0f, 3.0f) + + mPanePositions[mOldPosititionIndex]; + } else { + mMovementFrame = 0; + mPosition = mPanePositions[mPosititionIndex]; + } + mpPane->SetTranslate(mPosition); + } + + for (int i = 0; i < KEY_SMALL_NUM_ANIMS; i++) { + if (i != KEY_SMALL_ANIM_KEYSMALL && mAnm[i].isEnabled()) { + mAnm[i].play(); + } + } + mLyt.calc(); + + return true; +} + +bool dLytMeterSmallKey_c::draw() { + mLyt.addToDrawList(); + return true; +} + +void dLytMeterSmallKey_c::setPosition(s32 position) { + if (mPosititionIndex == position) { + return; + } + + mOldPosititionIndex = mPosititionIndex; + mPosititionIndex = position; + mMovementFrame = 0; +}