From 400126589287ff9c1c8a86a357cfbbb03d655c58 Mon Sep 17 00:00:00 2001 From: robojumper Date: Fri, 28 Nov 2025 11:22:02 +0100 Subject: [PATCH 1/9] d_lyt_mini_game WIP --- config/SOUE01/splits.txt | 3 +- config/SOUE01/symbols.txt | 256 +-- include/d/a/d_a_item.h | 1 + include/d/lyt/d2d.h | 6 + include/d/lyt/d_lyt_mini_game.h | 405 +++- include/toBeSorted/d_d3d.h | 6 +- src/d/d_cursor_hit_check.cpp | 2 +- src/d/lyt/d_lyt_mini_game.cpp | 1694 +++++++++++++++++ src/d/lyt/meter/d_lyt_meter_ganbari_gauge.cpp | 6 +- src/d/lyt/meter/d_lyt_meter_rupy.cpp | 2 +- src/d/lyt/msg_window/d_lyt_msg_window.cpp | 4 +- 11 files changed, 2242 insertions(+), 143 deletions(-) create mode 100644 src/d/lyt/d_lyt_mini_game.cpp diff --git a/config/SOUE01/splits.txt b/config/SOUE01/splits.txt index 714ddd7b..3cf914ad 100644 --- a/config/SOUE01/splits.txt +++ b/config/SOUE01/splits.txt @@ -1618,9 +1618,10 @@ d/lyt/d_lyt_enemy_icon.cpp: d/lyt/d_lyt_mini_game.cpp: .text start:0x8028BCE0 end:0x802969E0 align:16 - .rodata start:0x804EE790 end:0x804EEB68 + .rodata start:0x804EE7D8 end:0x804EEB68 .data start:0x80538E58 end:0x80539B68 .sbss start:0x80575970 end:0x80575990 + .sdata2 start:0x8057C700 end:0x8057C760 d/lyt/d_lyt_meter_suiryu_score.cpp: .text start:0x802969E0 end:0x8029C2C8 align:16 diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index c0285720..9bc6b458 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -555,9 +555,9 @@ create__3d3dFPQ23EGG4Heap = .text:0x80016700; // type:function size:0x160 fn_80016860 = .text:0x80016860; // type:function size:0x28 createLightTextures__3d3dFv = .text:0x80016890; // type:function size:0x98 fn_80016930 = .text:0x80016930; // type:function size:0x2C -fn_80016960__3d3dFR7mVec3_cRC7mVec3_c = .text:0x80016960; // type:function size:0x130 -fn_80016A90__3d3dFRC7mVec3_c = .text:0x80016A90; // type:function size:0xCC -fn_80016B60 = .text:0x80016B60; // type:function size:0xAC +worldToScreen__3d3dFR7mVec3_cRC7mVec3_c = .text:0x80016960; // type:function size:0x130 +isOnScreen__3d3dFRC7mVec3_c = .text:0x80016A90; // type:function size:0xCC +screenToWorld = .text:0x80016B60; // type:function size:0xAC __ct__Q23d3d13AnmMdlWrapperFv = .text:0x80016C10; // type:function size:0x88 __dt__Q23d3d13AnmMdlWrapperFv = .text:0x80016CA0; // type:function size:0xB0 create__Q23d3d13AnmMdlWrapperFR9dAcBase_cPvPvPCcPCcUl = .text:0x80016D50; // type:function size:0x78 @@ -13682,7 +13682,7 @@ AcItem__checkFlagForItem2 = .text:0x80252D90; // type:function size:0x34 AcItem__setItemFlagBasedOnId = .text:0x80252DD0; // type:function size:0x34 AcItem__getTreasureShift = .text:0x80252E10; // type:function size:0x48 AcItem__setTreasureTempCollect = .text:0x80252E60; // type:function size:0x40 -AcItem__checkTreasureTempCollect = .text:0x80252EA0; // type:function size:0x50 +checkTreasureTempCollect__9dAcItem_cFUs = .text:0x80252EA0; // type:function size:0x50 AcItem__setBoundingBox = .text:0x80252EF0; // type:function size:0x88 fn_80252F80 = .text:0x80252F80; // type:function size:0x88 fn_80253010 = .text:0x80253010; // type:function size:0x88 @@ -15224,112 +15224,112 @@ fn_8028BA90 = .text:0x8028BA90; // type:function size:0x30 LytEnemyIcon__initStates = .text:0x8028BAC0; // type:function size:0x128 LytEnemyIcon__dtor = .text:0x8028BBF0; // type:function size:0x58 fn_8028BC50 = .text:0x8028BC50; // type:function size:0x88 -fn_8028BCE0 = .text:0x8028BCE0; // type:function size:0xDC -fn_8028BDC0 = .text:0x8028BDC0; // type:function size:0x58 -fn_8028BE20 = .text:0x8028BE20; // type:function size:0x180 -fn_8028BFA0 = .text:0x8028BFA0; // type:function size:0x28 -fn_8028BFD0 = .text:0x8028BFD0; // type:function size:0x88 -fn_8028C060 = .text:0x8028C060; // type:function size:0x90 -fn_8028C0F0 = .text:0x8028C0F0; // type:function size:0x74 -fn_8028C170 = .text:0x8028C170; // type:function size:0x28 -fn_8028C1A0 = .text:0x8028C1A0; // type:function size:0x54 -fn_8028C200 = .text:0x8028C200; // type:function size:0x54 -fn_8028C260 = .text:0x8028C260; // type:function size:0xC -fn_8028C270 = .text:0x8028C270; // type:function size:0x60 -fn_8028C2D0 = .text:0x8028C2D0; // type:function size:0x60 -fn_8028C330 = .text:0x8028C330; // type:function size:0x60 -fn_8028C390 = .text:0x8028C390; // type:function size:0x114 -fn_8028C4B0 = .text:0x8028C4B0; // type:function size:0x70 -fn_8028C520 = .text:0x8028C520; // type:function size:0x6C -fn_8028C590 = .text:0x8028C590; // type:function size:0x64 -fn_8028C600 = .text:0x8028C600; // type:function size:0x64 -fn_8028C670 = .text:0x8028C670; // type:function size:0x58 -fn_8028C6D0 = .text:0x8028C6D0; // type:function size:0xA4 -fn_8028C780 = .text:0x8028C780; // type:function size:0x48 -fn_8028C7D0 = .text:0x8028C7D0; // type:function size:0x114 -fn_8028C8F0 = .text:0x8028C8F0; // type:function size:0x8C -fn_8028C980 = .text:0x8028C980; // type:function size:0x168 -fn_8028CAF0 = .text:0x8028CAF0; // type:function size:0x3C -fn_8028CB30 = .text:0x8028CB30; // type:function size:0x90 -fn_8028CBC0 = .text:0x8028CBC0; // type:function size:0xB8 -fn_8028CC80 = .text:0x8028CC80; // type:function size:0x90 -fn_8028CD10 = .text:0x8028CD10; // type:function size:0x8C -fn_8028CDA0 = .text:0x8028CDA0; // type:function size:0x80 -fn_8028CE20 = .text:0x8028CE20; // type:function size:0x150 -fn_8028CF70 = .text:0x8028CF70; // type:function size:0xC0 -fn_8028D030 = .text:0x8028D030; // type:function size:0xE0 -fn_8028D110 = .text:0x8028D110; // type:function size:0x48 -fn_8028D160 = .text:0x8028D160; // type:function size:0x38 -fn_8028D1A0 = .text:0x8028D1A0; // type:function size:0x2C -fn_8028D1D0 = .text:0x8028D1D0; // type:function size:0xC0 -fn_8028D290 = .text:0x8028D290; // type:function size:0x80 -fn_8028D310 = .text:0x8028D310; // type:function size:0x80 -fn_8028D390 = .text:0x8028D390; // type:function size:0xC0 -fn_8028D450 = .text:0x8028D450; // type:function size:0xC0 -fn_8028D510 = .text:0x8028D510; // type:function size:0xC0 -fn_8028D5D0 = .text:0x8028D5D0; // type:function size:0x58 -fn_8028D630 = .text:0x8028D630; // type:function size:0xC -fn_8028D640 = .text:0x8028D640; // type:function size:0xC -fn_8028D650 = .text:0x8028D650; // type:function size:0x18 -fn_8028D670 = .text:0x8028D670; // type:function size:0x58 -fn_8028D6D0 = .text:0x8028D6D0; // type:function size:0x44 -fn_8028D720 = .text:0x8028D720; // type:function size:0x44 -fn_8028D770 = .text:0x8028D770; // type:function size:0x44 -fn_8028D7C0 = .text:0x8028D7C0; // type:function size:0x50 -fn_8028D810 = .text:0x8028D810; // type:function size:0x18 -fn_8028D830 = .text:0x8028D830; // type:function size:0x74 -fn_8028D8B0 = .text:0x8028D8B0; // type:function size:0xC8 -fn_8028D980 = .text:0x8028D980; // type:function size:0x74 -fn_8028DA00 = .text:0x8028DA00; // type:function size:0x224 -fn_8028DC30 = .text:0x8028DC30; // type:function size:0x48 -fn_8028DC80 = .text:0x8028DC80; // type:function size:0x100 -fn_8028DD80 = .text:0x8028DD80; // type:function size:0xC0 -fn_8028DE40 = .text:0x8028DE40; // type:function size:0x84 -fn_8028DED0 = .text:0x8028DED0; // type:function size:0x100 -fn_8028DFD0 = .text:0x8028DFD0; // type:function size:0xEC -fn_8028E0C0 = .text:0x8028E0C0; // type:function size:0xAC -fn_8028E170 = .text:0x8028E170; // type:function size:0x60 -fn_8028E1D0 = .text:0x8028E1D0; // type:function size:0xC4 -fn_8028E2A0 = .text:0x8028E2A0; // type:function size:0x54 -fn_8028E300 = .text:0x8028E300; // type:function size:0x14 -fn_8028E320 = .text:0x8028E320; // type:function size:0x198 -fn_8028E4C0 = .text:0x8028E4C0; // type:function size:0x2C -fn_8028E4F0 = .text:0x8028E4F0; // type:function size:0x124 -fn_8028E620 = .text:0x8028E620; // type:function size:0xC -fn_8028E630 = .text:0x8028E630; // type:function size:0x194 -fn_8028E7D0 = .text:0x8028E7D0; // type:function size:0x98 -fn_8028E870 = .text:0x8028E870; // type:function size:0x80 -fn_8028E8F0 = .text:0x8028E8F0; // type:function size:0x80 -fn_8028E970 = .text:0x8028E970; // type:function size:0x80 -fn_8028E9F0 = .text:0x8028E9F0; // type:function size:0x80 -fn_8028EA70 = .text:0x8028EA70; // type:function size:0x13C -fn_8028EBB0 = .text:0x8028EBB0; // type:function size:0x60 -fn_8028EC10 = .text:0x8028EC10; // type:function size:0x8 -fn_8028EC20 = .text:0x8028EC20; // type:function size:0x114 -fn_8028ED40 = .text:0x8028ED40; // type:function size:0x74 -fn_8028EDC0 = .text:0x8028EDC0; // type:function size:0x64 -fn_8028EE30 = .text:0x8028EE30; // type:function size:0xC -fn_8028EE40 = .text:0x8028EE40; // type:function size:0xC -fn_8028EE50 = .text:0x8028EE50; // type:function size:0xC -fn_8028EE60 = .text:0x8028EE60; // type:function size:0xC -fn_8028EE70 = .text:0x8028EE70; // type:function size:0x64 -fn_8028EEE0 = .text:0x8028EEE0; // type:function size:0xC -fn_8028EEF0 = .text:0x8028EEF0; // type:function size:0x44 -fn_8028EF40 = .text:0x8028EF40; // type:function size:0x44 -fn_8028EF90 = .text:0x8028EF90; // type:function size:0x44 -fn_8028EFE0 = .text:0x8028EFE0; // type:function size:0x44 -fn_8028F030 = .text:0x8028F030; // type:function size:0x44 -fn_8028F080 = .text:0x8028F080; // type:function size:0x11C -fn_8028F1A0 = .text:0x8028F1A0; // type:function size:0x94 -fn_8028F240 = .text:0x8028F240; // type:function size:0x80 -fn_8028F2C0 = .text:0x8028F2C0; // type:function size:0xE8 -fn_8028F3B0 = .text:0x8028F3B0; // type:function size:0xB4 -fn_8028F470 = .text:0x8028F470; // type:function size:0xB4 -fn_8028F530 = .text:0x8028F530; // type:function size:0xBC -fn_8028F5F0 = .text:0x8028F5F0; // type:function size:0x74 -fn_8028F670 = .text:0x8028F670; // type:function size:0x1BC -fn_8028F830 = .text:0x8028F830; // type:function size:0x48 -fn_8028F880 = .text:0x8028F880; // type:function size:0x10C +build__26dLytMiniGamePumpkinParts_cFPQ23d2d10ResAccIf_c = .text:0x8028BCE0; // type:function size:0xDC +remove__26dLytMiniGamePumpkinParts_cFv = .text:0x8028BDC0; // type:function size:0x58 +execute__26dLytMiniGamePumpkinParts_cFv = .text:0x8028BE20; // type:function size:0x180 +draw__26dLytMiniGamePumpkinParts_cFv = .text:0x8028BFA0; // type:function size:0x28 +init__26dLytMiniGamePumpkinParts_cFv = .text:0x8028BFD0; // type:function size:0x88 +setPumpkinPos__26dLytMiniGamePumpkinParts_cFRC7mVec3_c = .text:0x8028C060; // type:function size:0x90 +getPoint__26dLytMiniGamePumpkinParts_cFUcb = .text:0x8028C0F0; // type:function size:0x74 +isActive__26dLytMiniGamePumpkinParts_cCFv = .text:0x8028C170; // type:function size:0x28 +startGetPoint__26dLytMiniGamePumpkinParts_cFv = .text:0x8028C1A0; // type:function size:0x54 +startDoubleScore__26dLytMiniGamePumpkinParts_cFv = .text:0x8028C200; // type:function size:0x54 +stopDoubleScore__26dLytMiniGamePumpkinParts_cFv = .text:0x8028C260; // type:function size:0xC +resetGetPoint__26dLytMiniGamePumpkinParts_cFv = .text:0x8028C270; // type:function size:0x60 +resetDoubleScore__26dLytMiniGamePumpkinParts_cFv = .text:0x8028C2D0; // type:function size:0x60 +resetPattern__26dLytMiniGamePumpkinParts_cFv = .text:0x8028C330; // type:function size:0x60 +setPattern__26dLytMiniGamePumpkinParts_cFl = .text:0x8028C390; // type:function size:0x114 +build__21dLytMiniGamePumpkin_cFPQ23d2d10ResAccIf_c = .text:0x8028C4B0; // type:function size:0x70 +remove__21dLytMiniGamePumpkin_cFv = .text:0x8028C520; // type:function size:0x6C +execute__21dLytMiniGamePumpkin_cFv = .text:0x8028C590; // type:function size:0x64 +draw__21dLytMiniGamePumpkin_cFv = .text:0x8028C600; // type:function size:0x64 +init__21dLytMiniGamePumpkin_cFv = .text:0x8028C670; // type:function size:0x58 +getPoint__21dLytMiniGamePumpkin_cFRC7mVec3_clb = .text:0x8028C6D0; // type:function size:0xA4 +calcCombo__21dLytMiniGamePumpkin_cFl = .text:0x8028C780; // type:function size:0x48 +build__18dLytMiniGameBugs_cFPQ23d2d10ResAccIf_c = .text:0x8028C7D0; // type:function size:0x114 +remove__18dLytMiniGameBugs_cFv = .text:0x8028C8F0; // type:function size:0x8C +execute__18dLytMiniGameBugs_cFv = .text:0x8028C980; // type:function size:0x168 +draw__18dLytMiniGameBugs_cFv = .text:0x8028CAF0; // type:function size:0x3C +init__18dLytMiniGameBugs_cFv = .text:0x8028CB30; // type:function size:0x90 +startAllIconsIn__18dLytMiniGameBugs_cFv = .text:0x8028CBC0; // type:function size:0xB8 +startOut__18dLytMiniGameBugs_cFv = .text:0x8028CC80; // type:function size:0x90 +startIn__18dLytMiniGameBugs_cFv = .text:0x8028CD10; // type:function size:0x8C +startOutForced__18dLytMiniGameBugs_cFv = .text:0x8028CDA0; // type:function size:0x80 +collectBug__18dLytMiniGameBugs_cFl = .text:0x8028CE20; // type:function size:0x150 +startBugsFlash__18dLytMiniGameBugs_cFv = .text:0x8028CF70; // type:function size:0xC0 +setBug__18dLytMiniGameBugs_cFll = .text:0x8028D030; // type:function size:0xE0 +isSlotIconOnEndReached__18dLytMiniGameBugs_cCFl = .text:0x8028D110; // type:function size:0x48 +isSlotIconOnEnabled__18dLytMiniGameBugs_cCFl = .text:0x8028D160; // type:function size:0x38 +isSlotBugCollected__18dLytMiniGameBugs_cFl = .text:0x8028D1A0; // type:function size:0x2C +resetBugIconsIn__18dLytMiniGameBugs_cFv = .text:0x8028D1D0; // type:function size:0xC0 +resetIn__18dLytMiniGameBugs_cFv = .text:0x8028D290; // type:function size:0x80 +resetOut__18dLytMiniGameBugs_cFv = .text:0x8028D310; // type:function size:0x80 +resetBugIconsOn__18dLytMiniGameBugs_cFv = .text:0x8028D390; // type:function size:0xC0 +resetBugIconsTex__18dLytMiniGameBugs_cFv = .text:0x8028D450; // type:function size:0xC0 +resetBugIconsFlash__18dLytMiniGameBugs_cFv = .text:0x8028D510; // type:function size:0xC0 +stopBugIconsIn__18dLytMiniGameBugs_cFv = .text:0x8028D5D0; // type:function size:0x58 +stopIn__18dLytMiniGameBugs_cFv = .text:0x8028D630; // type:function size:0xC +stopOut__18dLytMiniGameBugs_cFv = .text:0x8028D640; // type:function size:0xC +stopBugIconOn__18dLytMiniGameBugs_cFl = .text:0x8028D650; // type:function size:0x18 +stopBugIconsFlash__18dLytMiniGameBugs_cFv = .text:0x8028D670; // type:function size:0x58 +isIconInEndReached__18dLytMiniGameBugs_cCFv = .text:0x8028D6D0; // type:function size:0x44 +isInEndReached__18dLytMiniGameBugs_cCFv = .text:0x8028D720; // type:function size:0x44 +isOutEndReached__18dLytMiniGameBugs_cCFv = .text:0x8028D770; // type:function size:0x44 +isSlotOnEndReached__18dLytMiniGameBugs_cCFl = .text:0x8028D7C0; // type:function size:0x50 +isBug0Flashing__18dLytMiniGameBugs_cCFv = .text:0x8028D810; // type:function size:0x18 +areAllBugIconsOn__18dLytMiniGameBugs_cCFv = .text:0x8028D830; // type:function size:0x74 +build__18dLytMiniGameTime_cFPQ23d2d10ResAccIf_c = .text:0x8028D8B0; // type:function size:0xC8 +remove__18dLytMiniGameTime_cFv = .text:0x8028D980; // type:function size:0x74 +execute__18dLytMiniGameTime_cFv = .text:0x8028DA00; // type:function size:0x224 +draw__18dLytMiniGameTime_cFv = .text:0x8028DC30; // type:function size:0x48 +init__18dLytMiniGameTime_cFv = .text:0x8028DC80; // type:function size:0x100 +fn_8028DD80__18dLytMiniGameTime_cFv = .text:0x8028DD80; // type:function size:0xC0 +fn_8028DE40__18dLytMiniGameTime_cFv = .text:0x8028DE40; // type:function size:0x84 +fn_8028DED0__18dLytMiniGameTime_cFv = .text:0x8028DED0; // type:function size:0x100 +fn_8028DFD0__18dLytMiniGameTime_cFv = .text:0x8028DFD0; // type:function size:0xEC +fn_8028E0C0__18dLytMiniGameTime_cFv = .text:0x8028E0C0; // type:function size:0xAC +fn_8028E170__18dLytMiniGameTime_cFv = .text:0x8028E170; // type:function size:0x60 +fn_8028E1D0__18dLytMiniGameTime_cFv = .text:0x8028E1D0; // type:function size:0xC4 +startLoop__18dLytMiniGameTime_cFv = .text:0x8028E2A0; // type:function size:0x54 +setTimerValueInMilliSeconds__18dLytMiniGameTime_cFl = .text:0x8028E300; // type:function size:0x14 +updateLongTimer__18dLytMiniGameTime_cFv = .text:0x8028E320; // type:function size:0x198 +setTimerSecondsValueInMilliSeconds__18dLytMiniGameTime_cFl = .text:0x8028E4C0; // type:function size:0x2C +updateSecondsTimer__18dLytMiniGameTime_cFv = .text:0x8028E4F0; // type:function size:0x124 +saveSecondsTimer__18dLytMiniGameTime_cFv = .text:0x8028E620; // type:function size:0xC +setBestTime__18dLytMiniGameTime_cFl = .text:0x8028E630; // type:function size:0x194 +setShowBestTime__18dLytMiniGameTime_cFb = .text:0x8028E7D0; // type:function size:0x98 +resetIn__18dLytMiniGameTime_cFv = .text:0x8028E870; // type:function size:0x80 +resetOut__18dLytMiniGameTime_cFv = .text:0x8028E8F0; // type:function size:0x80 +resetAlphaIn__18dLytMiniGameTime_cFv = .text:0x8028E970; // type:function size:0x80 +resetAlphaOut__18dLytMiniGameTime_cFv = .text:0x8028E9F0; // type:function size:0x80 +resetDigits__18dLytMiniGameTime_cFv = .text:0x8028EA70; // type:function size:0x13C +fn_8028EBB0__18dLytMiniGameTime_cFv = .text:0x8028EBB0; // type:function size:0x60 +resetShowBestTime__18dLytMiniGameTime_cFv = .text:0x8028EC10; // type:function size:0x8 +resetFinish__18dLytMiniGameTime_cFv = .text:0x8028EC20; // type:function size:0x114 +resetLoop__18dLytMiniGameTime_cFv = .text:0x8028ED40; // type:function size:0x74 +initSignChange__18dLytMiniGameTime_cFv = .text:0x8028EDC0; // type:function size:0x64 +stopIn__18dLytMiniGameTime_cFv = .text:0x8028EE30; // type:function size:0xC +stopOut__18dLytMiniGameTime_cFv = .text:0x8028EE40; // type:function size:0xC +stopAlphaIn__18dLytMiniGameTime_cFv = .text:0x8028EE50; // type:function size:0xC +stopAlphaOut__18dLytMiniGameTime_cFv = .text:0x8028EE60; // type:function size:0xC +stopFinish__18dLytMiniGameTime_cFv = .text:0x8028EE70; // type:function size:0x64 +stopLoop__18dLytMiniGameTime_cFv = .text:0x8028EEE0; // type:function size:0xC +isInEndReached__18dLytMiniGameTime_cCFv = .text:0x8028EEF0; // type:function size:0x44 +isOutEndReached__18dLytMiniGameTime_cCFv = .text:0x8028EF40; // type:function size:0x44 +isAlphaInEndReached__18dLytMiniGameTime_cCFv = .text:0x8028EF90; // type:function size:0x44 +isAlphaOutEndReached__18dLytMiniGameTime_cCFv = .text:0x8028EFE0; // type:function size:0x44 +isFinishEndReached__18dLytMiniGameTime_cCFv = .text:0x8028F030; // type:function size:0x44 +setHighestDigitIndex__18dLytMiniGameTime_cFUc = .text:0x8028F080; // type:function size:0x11C +setSignChange__18dLytMiniGameTime_cFUl = .text:0x8028F1A0; // type:function size:0x94 +fn_8028F240__18dLytMiniGameTime_cFb = .text:0x8028F240; // type:function size:0x80 +setBestHasSixDigits__18dLytMiniGameTime_cFb = .text:0x8028F2C0; // type:function size:0xE8 +setDigit__18dLytMiniGameTime_cFll = .text:0x8028F3B0; // type:function size:0xB4 +setDigitBest__18dLytMiniGameTime_cFll = .text:0x8028F470; // type:function size:0xB4 +build__19dLytMiniGameStart_cFPQ23d2d10ResAccIf_c = .text:0x8028F530; // type:function size:0xBC +remove__19dLytMiniGameStart_cFv = .text:0x8028F5F0; // type:function size:0x74 +execute__19dLytMiniGameStart_cFv = .text:0x8028F670; // type:function size:0x1BC +draw__19dLytMiniGameStart_cFv = .text:0x8028F830; // type:function size:0x48 +init__19dLytMiniGameStart_cFv = .text:0x8028F880; // type:function size:0x10C fn_8028F990 = .text:0x8028F990; // type:function size:0x4C fn_8028F9E0 = .text:0x8028F9E0; // type:function size:0x60 fn_8028FA40 = .text:0x8028FA40; // type:function size:0x4C @@ -15350,11 +15350,11 @@ fn_8028FE10 = .text:0x8028FE10; // type:function size:0x48 fn_8028FE60 = .text:0x8028FE60; // type:function size:0x48 fn_8028FEB0 = .text:0x8028FEB0; // type:function size:0x48 fn_8028FF00 = .text:0x8028FF00; // type:function size:0x48 -fn_8028FF50 = .text:0x8028FF50; // type:function size:0x168 -fn_802900C0 = .text:0x802900C0; // type:function size:0x74 -fn_80290140 = .text:0x80290140; // type:function size:0x2EC -fn_80290430 = .text:0x80290430; // type:function size:0x48 -fn_80290480 = .text:0x80290480; // type:function size:0xF84 +build__19dLytMiniGameScore_cFPQ23d2d10ResAccIf_c = .text:0x8028FF50; // type:function size:0x168 +remove__19dLytMiniGameScore_cFv = .text:0x802900C0; // type:function size:0x74 +execute__19dLytMiniGameScore_cFv = .text:0x80290140; // type:function size:0x2EC +draw__19dLytMiniGameScore_cFv = .text:0x80290430; // type:function size:0x48 +init__19dLytMiniGameScore_cFv = .text:0x80290480; // type:function size:0xF84 fn_80291410 = .text:0x80291410; // type:function size:0x1A0 fn_802915B0 = .text:0x802915B0; // type:function size:0x84 fn_80291640 = .text:0x80291640; // type:function size:0x100 @@ -15404,11 +15404,11 @@ fn_80292C30 = .text:0x80292C30; // type:function size:0x764 fn_802933A0 = .text:0x802933A0; // type:function size:0x6C fn_80293410 = .text:0x80293410; // type:function size:0x34 fn_80293450 = .text:0x80293450; // type:function size:0x2A0 -fn_802936F0 = .text:0x802936F0; // type:function size:0xC8 -fn_802937C0 = .text:0x802937C0; // type:function size:0x74 -fn_80293840 = .text:0x80293840; // type:function size:0xF0 -fn_80293930 = .text:0x80293930; // type:function size:0x48 -fn_80293980 = .text:0x80293980; // type:function size:0xA8 +build__21dLytMiniGameScoreSd_cFPQ23d2d10ResAccIf_c = .text:0x802936F0; // type:function size:0xC8 +remove__21dLytMiniGameScoreSd_cFv = .text:0x802937C0; // type:function size:0x74 +execute__21dLytMiniGameScoreSd_cFv = .text:0x80293840; // type:function size:0xF0 +draw__21dLytMiniGameScoreSd_cFv = .text:0x80293930; // type:function size:0x48 +init__21dLytMiniGameScoreSd_cFv = .text:0x80293980; // type:function size:0xA8 fn_80293A30 = .text:0x80293A30; // type:function size:0x60 fn_80293A90 = .text:0x80293A90; // type:function size:0x60 fn_80293AF0 = .text:0x80293AF0; // type:function size:0xC0 @@ -15424,7 +15424,7 @@ fn_80294010 = .text:0x80294010; // type:function size:0xC fn_80294020 = .text:0x80294020; // type:function size:0xC fn_80294030 = .text:0x80294030; // type:function size:0x44 fn_80294080 = .text:0x80294080; // type:function size:0x44 -LytMiniGame__ctor = .text:0x802940D0; // type:function size:0x380 +dLytMiniGame_c_classInit__Fv = .text:0x802940D0; // type:function size:0x380 fn_80294450 = .text:0x80294450; // type:function size:0x74 fn_802944D0 = .text:0x802944D0; // type:function size:0x74 fn_80294550 = .text:0x80294550; // type:function size:0x74 @@ -15485,7 +15485,7 @@ fn_80296580 = .text:0x80296580; // type:function size:0x130 fn_802966B0 = .text:0x802966B0; // type:function size:0x30 fn_802966E0 = .text:0x802966E0; // type:function size:0x40 decrementLayoutArcRefCount = .text:0x80296720; // type:function size:0x4C -fn_80296770 = .text:0x80296770; // type:function size:0x270 +__dt__14dLytMiniGame_cFv = .text:0x80296770; // type:function size:0x270 LytMeterSuiryuScoreBase__stateNoneEnter = .text:0x802969E0; // type:function size:0x4 LytMeterSuiryuScoreBase__stateNoneUpdate = .text:0x802969F0; // type:function size:0x4 LytMeterSuiryuScoreBase__stateNoneLeave = .text:0x80296A00; // type:function size:0x4 @@ -42447,12 +42447,12 @@ lbl_80575959 = .sbss:0x80575959; // type:object size:0x1 data:byte lbl_8057595C = .sbss:0x8057595C; // type:object size:0x4 data:4byte lbl_80575960 = .sbss:0x80575960; // type:object size:0x8 data:4byte lbl_80575968 = .sbss:0x80575968; // type:object size:0x8 data:4byte -lbl_80575970 = .sbss:0x80575970; // type:object size:0x4 data:4byte -lbl_80575974 = .sbss:0x80575974; // type:object size:0x4 data:4byte -lbl_80575978 = .sbss:0x80575978; // type:object size:0x4 data:4byte -lbl_8057597C = .sbss:0x8057597C; // type:object size:0x4 data:4byte -lbl_80575980 = .sbss:0x80575980; // type:object size:0x4 data:4byte -lbl_80575984 = .sbss:0x80575984; // type:object size:0x4 data:4byte +sInstance__21dLytMiniGamePumpkin_c = .sbss:0x80575970; // type:object size:0x4 data:4byte +sInstance__18dLytMiniGameBugs_c = .sbss:0x80575974; // type:object size:0x4 data:4byte +sInstance__18dLytMiniGameTime_c = .sbss:0x80575978; // type:object size:0x4 data:4byte +sInstance__19dLytMiniGameStart_c = .sbss:0x8057597C; // type:object size:0x4 data:4byte +sInstance__19dLytMiniGameScore_c = .sbss:0x80575980; // type:object size:0x4 data:4byte +sInstance__21dLytMiniGameScoreSd_c = .sbss:0x80575984; // type:object size:0x4 data:4byte sInstance__14dLytMiniGame_c = .sbss:0x80575988; // type:object size:0x8 data:4byte lbl_80575990 = .sbss:0x80575990; // type:object size:0x8 data:4byte lbl_80575998 = .sbss:0x80575998; // type:object size:0x8 data:4byte diff --git a/include/d/a/d_a_item.h b/include/d/a/d_a_item.h index ed78c6c4..b08a0fa7 100644 --- a/include/d/a/d_a_item.h +++ b/include/d/a/d_a_item.h @@ -53,6 +53,7 @@ public: return checkFlag(flag); } static void setFlag(s32 id); + static bool checkTreasureTempCollect(u16 itemId); void setItemPosition(const mVec3_c &); void getItemFromBWheelItem(); diff --git a/include/d/lyt/d2d.h b/include/d/lyt/d2d.h index 7030b9b4..d650ee9e 100644 --- a/include/d/lyt/d2d.h +++ b/include/d/lyt/d2d.h @@ -5,6 +5,7 @@ #include "m/m2d.h" #include "nw4r/lyt/lyt_pane.h" #include "nw4r/lyt/lyt_picture.h" +#include "nw4r/lyt/lyt_types.h" class dTextBox_c; class dWindow_c; @@ -260,6 +261,11 @@ struct AnmGroupBase_c { return (mFlags & ANMGROUP_FLAG_ENABLE) != 0; } + // Not sure + inline u8 isEnabled_() const { + return (mFlags & ANMGROUP_FLAG_ENABLE); + } + inline bool isStop() const { return mpFrameCtrl->isStop(); } diff --git a/include/d/lyt/d_lyt_mini_game.h b/include/d/lyt/d_lyt_mini_game.h index bfb19692..8d3f1f9c 100644 --- a/include/d/lyt/d_lyt_mini_game.h +++ b/include/d/lyt/d_lyt_mini_game.h @@ -2,9 +2,381 @@ #define D_LYT_MINI_GAME_H #include "common.h" +#include "d/d_base.h" +#include "d/lyt/d2d.h" +#include "m/m_vec.h" -class dLytMiniGame_c { +/** 2D UI - Mini Game - Pumpkin score popup */ +class dLytMiniGamePumpkinParts_c { public: + dLytMiniGamePumpkinParts_c() {} + virtual ~dLytMiniGamePumpkinParts_c() {} + + bool build(d2d::ResAccIf_c *resAcc); + bool remove(); + bool execute(); + bool draw(); + void init(); + + void setPumpkinPos(const mVec3_c &pos); + void getPoint(u8 combo, bool doubleScore); + bool isActive() const; + +private: + void resetPattern(); + void setPattern(s32 pat); + void startGetPoint(); + void startDoubleScore(); + void stopDoubleScore(); + void resetGetPoint(); + void resetDoubleScore(); + + /* 0x004 */ d2d::LytBase_c mLyt; + /* 0x094 */ d2d::AnmGroup_c mAnm[3]; + /* 0x154 */ bool field_0x154; + /* 0x158 */ mVec3_c mPumpkinWorldPos; + /* 0x164 */ mVec3_c mPumpkinScreenPos; + /* 0x170 */ mVec2_c field_0x170; + /* 0x178 */ bool mHasPlayedDoubleScoreSound; +}; + +/** 2D UI - Mini Game - Pumpkin score popups */ +class dLytMiniGamePumpkin_c { +public: + dLytMiniGamePumpkin_c() {} + virtual ~dLytMiniGamePumpkin_c() {} + + bool build(d2d::ResAccIf_c *resAcc); + bool remove(); + bool execute(); + bool draw(); + void init(); + + void getPoint(const mVec3_c &pumpkinPos, s32 unk, bool doubleScore); + void calcCombo(s32 unk); + +private: + static dLytMiniGamePumpkin_c *sInstance; + + /* 0x004 */ dLytMiniGamePumpkinParts_c mParts[3]; + /* 0x478 */ s32 field_0x478; + /* 0x47C */ s32 mCombo; +}; + +/** 2D UI - Mini Game - Bug Heaven */ +class dLytMiniGameBugs_c { +public: + dLytMiniGameBugs_c() {} + virtual ~dLytMiniGameBugs_c() {} + + bool build(d2d::ResAccIf_c *resAcc); + bool remove(); + bool execute(); + bool draw(); + void init(); + + enum BugIndex_e { + DEKU_HORNET, + BLESSED_BUTTERFLY, + GERUDO_DRAGONFLY, + STARRY_FIREFLY, + WOODLAND_RHINO_BEETLE, + VOLCANIC_LADYBUG, + SAND_CICADA, + SKY_STAG_BEETLE, + FARON_GRASSHOPPER, + SKYLOFT_MANTIS, + LANAYRU_ANT, + ELDIN_ROLLER, + }; + +private: + void startAllIconsIn(); + void startOut(); + void startIn(); + void startOutForced(); + void collectBug(s32 slot); + void startBugsFlash(); + void setBug(s32 slot, s32 bugIndex); + bool isSlotIconOnEndReached(s32 slot) const; + bool isSlotIconOnEnabled(s32 slot) const; + bool isSlotBugCollected(s32 slot); + void resetBugIconsIn(); + void resetIn(); + void resetOut(); + void resetBugIconsOn(); + void resetBugIconsTex(); + void resetBugIconsFlash(); + void stopBugIconsIn(); + void stopIn(); + void stopOut(); + void stopBugIconOn(s32); + void stopBugIconsFlash(); + bool isIconInEndReached() const; + bool isInEndReached() const; + bool isOutEndReached() const; + bool isSlotOnEndReached(s32 slot) const; + bool isBug0Flashing() const; + bool areAllBugIconsOn() const; + + const d2d::AnmGroup_c &getAnm(s32 idx) const { + return mAnm[idx]; + } + + d2d::AnmGroup_c &getAnm(s32 idx) { + return mAnm[idx]; + } + + static dLytMiniGameBugs_c *sInstance; + + /* 0x004 */ d2d::LytBase_c mLyt; + /* 0x094 */ d2d::AnmGroup_c mAnm[42]; + /* 0xB14 */ s32 mBugItemIds[10]; + /* 0xB3C */ bool mBugIconsInEnded; + /* 0xB3D */ bool mInTriggered; + /* 0xB3E */ bool mBugCollected[10]; + /* 0xB48 */ bool mBugIconsFlashStarted; + /* 0xB49 */ u8 mBugsNumLevel; ///< 0 = 5 bugs, 1 = 10 bugs + /* 0xB4A */ u8 mBugsNum; + /* 0xB4B */ bool field_0xB4B; + /* 0xB4C */ bool field_0xB4C; +}; + +/** 2D UI - Mini Game - Time */ +class dLytMiniGameTime_c { +public: + dLytMiniGameTime_c() {} + virtual ~dLytMiniGameTime_c() {} + + bool build(d2d::ResAccIf_c *resAcc); + bool remove(); + bool execute(); + bool draw(); + void init(); + +private: + enum TimerVariant_e { + TIMER_LONG, + TIMER_SECONDS, + }; + + void fn_8028DD80(); + void fn_8028DE40(); + void fn_8028DED0(); + void fn_8028DFD0(); + void fn_8028E0C0(); + void fn_8028E170(); + void fn_8028E1D0(); + void startLoop(); + void setTimerValueInMilliSeconds(s32 time); + void updateLongTimer(); + void setTimerSecondsValueInMilliSeconds(s32 time); + void updateSecondsTimer(); + void saveSecondsTimer(); + void setBestTime(s32 time); + void setShowBestTime(bool show); + void resetIn(); + void resetOut(); + void resetAlphaIn(); + void resetAlphaOut(); + void resetDigits(); + void fn_8028EBB0(); + void resetShowBestTime(); + void resetFinish(); + void resetLoop(); + void initSignChange(); + void stopIn(); + void stopOut(); + void stopAlphaIn(); + void stopAlphaOut(); + void stopFinish(); + void stopLoop(); + bool isInEndReached() const; + bool isOutEndReached() const; + bool isAlphaInEndReached() const; + bool isAlphaOutEndReached() const; + bool isFinishEndReached() const; + void setHighestDigitIndex(u8); + void setSignChange(u32); + void fn_8028F240(bool); + void setBestHasSixDigits(bool); + void setDigit(s32 digitIndex, s32 number); + void setDigitBest(s32 digitIndex, s32 number); + + static dLytMiniGameTime_c *sInstance; + + /* 0x004 */ d2d::LytBase_c mLyt; + /* 0x094 */ d2d::AnmGroup_c mAnm[29]; + /* 0x7D4 */ u8 field_0x7D4; + /* 0x7D8 */ s32 mCurrentTimerValueMilliSeconds; + /* 0x7DC */ s32 mCurrentTimerValueSeconds; + /* 0x7E0 */ s32 mLastTimerValueSeconds; + /* 0x7E4 */ u8 mTimerVariant; + /* 0x7E4 */ s32 mHighestDigitIndex; + /* 0x7EC */ bool field_0x7EC; + /* 0x7ED */ bool field_0x7ED; + /* 0x7EE */ bool field_0x7EE; + /* 0x7F0 */ UNKWORD field_0x7F0; + /* 0x7F4 */ u8 field_0x7F4; + /* 0x7F5 */ bool mIsVisible; +}; + +/** 2D UI - Mini Game - Start Popup */ +class dLytMiniGameStart_c { +public: + dLytMiniGameStart_c() {} + virtual ~dLytMiniGameStart_c() {} + + bool build(d2d::ResAccIf_c *resAcc); + bool remove(); + bool execute(); + bool draw(); + void init(); + +private: + static dLytMiniGameStart_c *sInstance; + + void fn_8028F990(); + void fn_8028F9E0(); + void fn_8028FA40(); + void fn_8028FA90(); + void fn_8028FAE0(); + void fn_8028FB40(); + void fn_8028FBA0(); + void fn_8028FC00(); + void fn_8028FC20(); + void fn_8028FC80(); + void fn_8028FCE0(); + void fn_8028FD40(); + void fn_8028FD50(); + void fn_8028FD60(); + void fn_8028FD70(); + void fn_8028FDC0(); + void fn_8028FE10(); + void fn_8028FE60(); + void fn_8028FEB0(); + void fn_8028FF00(); + + /* 0x004 */ d2d::LytBase_c mLyt; + /* 0x094 */ d2d::AnmGroup_c mAnm[3]; +}; + +/** 2D UI - Mini Game - Score counter */ +class dLytMiniGameScore_c { +public: + dLytMiniGameScore_c() {} + virtual ~dLytMiniGameScore_c() {} + + bool build(d2d::ResAccIf_c *resAcc); + bool remove(); + bool execute(); + bool draw(); + void init(); + +private: + static dLytMiniGameScore_c *sInstance; + + void fn_80291410(); + void fn_802915B0(); + void fn_80291640(); + void fn_80291740(); + void fn_80291830(); + void fn_80291900(); + void fn_80291960(); + void fn_80291A30(); + void fn_80291B40(); + void fn_80291BA0(); + void fn_80291BC0(); + void fn_80291D40(); + void fn_80291E50(); + void fn_80291E90(); + void fn_80291ED0(); + void fn_80291EF0(); + void fn_80292030(); + void fn_80292040(); + void fn_802920B0(); + void fn_80292110(); + void fn_802921A0(); + void fn_80292240(); + void fn_80292250(); + void fn_802922F0(); + void fn_80292380(); + void fn_80292400(); + void fn_80292480(); + void fn_80292500(); + void fn_80292590(); + void fn_80292610(); + void fn_80292710(); + void fn_80292880(); + void fn_80292910(); + void fn_80292920(); + void fn_80292930(); + void fn_80292940(); + void fn_80292950(); + void fn_802929C0(); + void fn_80292A40(); + void fn_80292A50(); + void fn_80292AA0(); + void fn_80292AF0(); + void fn_80292B40(); + void fn_80292B90(); + void fn_80292BE0(); + void fn_80292C30(); + void fn_802933A0(); + void fn_80293410(); + void fn_80293450(); + + /* 0x004 */ d2d::LytBase_c mLyt; + /* 0x094 */ d2d::AnmGroup_c mAnm[26]; +}; + +/** 2D UI - Mini Game - Fun Fun Island score */ +class dLytMiniGameScoreSd_c { +public: + dLytMiniGameScoreSd_c() {} + virtual ~dLytMiniGameScoreSd_c() {} + + bool build(d2d::ResAccIf_c *resAcc); + bool remove(); + bool execute(); + bool draw(); + void init(); + + void fn_80293A30(); + void fn_80293A90(); + void fn_80293AF0(); + void fn_80293BB0(); + void fn_80293C60(); + void fn_80293D40(); + void fn_80293DC0(); + void fn_80293E40(); + void fn_80293ED0(); + void fn_80293F50(); + void fn_80293FB0(); + void fn_80294010(); + void fn_80294020(); + void fn_80294030(); + void fn_80294080(); + +private: + static dLytMiniGameScoreSd_c *sInstance; + + /* 0x004 */ d2d::LytBase_c mLyt; + /* 0x094 */ d2d::AnmGroup_c mAnm[5]; +}; + +class dLytMiniGame_c : public dBase_c { +public: + dLytMiniGame_c() + : field_0x0068(0), + field_0x0069(0), + field_0x006A(0), + field_0x006B(0), + field_0x006C(0), + field_0x006D(0), + field_0x1510(1) {} + virtual ~dLytMiniGame_c() {} + static dLytMiniGame_c *GetInstance() { return sInstance; } @@ -38,10 +410,35 @@ public: } private: - u8 _0x0000[0x3866 - 0x0000]; - bool field_0x3866; - static dLytMiniGame_c *sInstance; + + /* 0x0068 */ u8 field_0x0068; + /* 0x0069 */ u8 field_0x0069; + /* 0x006A */ u8 field_0x006A; + /* 0x006B */ u8 field_0x006B; + /* 0x006C */ u8 field_0x006C; + /* 0x006D */ u8 field_0x006D; + + /* 0x0070 */ d2d::ResAccIf_c mResAcc1; + /* 0x03E0 */ d2d::ResAccIf_c mResAcc2; + /* 0x0750 */ d2d::ResAccIf_c mResAcc3; + /* 0x0AC0 */ d2d::ResAccIf_c mResAcc4; + /* 0x0E30 */ d2d::ResAccIf_c mResAcc5; + /* 0x11A0 */ d2d::ResAccIf_c mResAcc6; + + /* 0x1510 */ UNKWORD field_0x1510; + + /* 0x1514 */ dLytMiniGameScore_c mScore; + /* 0x1D64 */ dLytMiniGameScoreSd_c mScoreSd; + /* 0x1F40 */ dLytMiniGameStart_c mStart; + /* 0x209C */ dLytMiniGameTime_c mTime; + /* 0x2894 */ dLytMiniGameBugs_c mBugs; + /* 0x33E4 */ dLytMiniGamePumpkin_c mPumpkin; + + // TODO + u8 _0x___[0x14E]; + + bool field_0x3866; }; #endif diff --git a/include/toBeSorted/d_d3d.h b/include/toBeSorted/d_d3d.h index c609b45e..ebfeafd2 100644 --- a/include/toBeSorted/d_d3d.h +++ b/include/toBeSorted/d_d3d.h @@ -20,9 +20,9 @@ namespace d3d { bool create(EGG::Heap *); -f32 fn_80016960(mVec3_c &, const mVec3_c &pos); -bool fn_80016A90(const mVec3_c &pos); -void fn_80016B60(mVec3_c &, const mVec3_c &pos); +f32 worldToScreen(mVec3_c &result, const mVec3_c &worldPos); +bool isOnScreen(const mVec3_c &worldPos); +void screenToWorld(mVec3_c &result, const mVec3_c &screenPos); void createLightTextures(); class AnmMdlWrapper : public m3d::mdlAnmChr { diff --git a/src/d/d_cursor_hit_check.cpp b/src/d/d_cursor_hit_check.cpp index 013d14cb..a5397396 100644 --- a/src/d/d_cursor_hit_check.cpp +++ b/src/d/d_cursor_hit_check.cpp @@ -124,7 +124,7 @@ bool dCursorHitCheckCC_c::checkHit(s32 x, s32 y) { ); mVec3_c v; - d3d::fn_80016B60(v, pos); + d3d::screenToWorld(v, pos); nw4r::g3d::Camera cam = dStageMgr_c::GetInstance()->getCamera(0); diff --git a/src/d/lyt/d_lyt_mini_game.cpp b/src/d/lyt/d_lyt_mini_game.cpp new file mode 100644 index 00000000..9a6b73b7 --- /dev/null +++ b/src/d/lyt/d_lyt_mini_game.cpp @@ -0,0 +1,1694 @@ +#include "d/lyt/d_lyt_mini_game.h" + +#include "common.h" +#include "d/a/d_a_item.h" +#include "d/a/d_a_itembase.h" +#include "d/d_lang.h" +#include "d/lyt/d2d.h" +#include "d/snd/d_snd_small_effect_mgr.h" +#include "d/snd/d_snd_wzsound.h" +#include "m/m_vec.h" +#include "toBeSorted/d_d3d.h" + +static const d2d::LytBrlanMapping brlanMapPumpkin[] = { + { "miniGamePumpkin_00_getPoint.brlan", "G_scoreAll_00"}, + { "miniGamePumpkin_00_doubleScore.brlan", "G_doubleScore_00"}, + {"miniGamePumpkin_00_scorePattern.brlan", "G_pattern_00"}, +}; + +#define PUMPKIN_ANIM_GET_POINT 0 +#define PUMPKIN_ANIM_DOUBLE_SCORE 1 +#define PUMPKIN_ANIM_PATTERN 2 + +#define PUMPKIN_NUM_ANIMS 3 + +bool dLytMiniGamePumpkinParts_c::build(d2d::ResAccIf_c *resAcc) { + mLyt.setResAcc(resAcc); + mLyt.build("miniGamePumpkin_00.brlyt", nullptr); + + for (int i = 0; i < PUMPKIN_NUM_ANIMS; i++) { + mAnm[i].init(brlanMapPumpkin[i].mFile, resAcc, mLyt.getLayout(), brlanMapPumpkin[i].mName); + mAnm[i].bind(false); + mAnm[i].setRate(1.0f); + } + + mPumpkinWorldPos.set(0.0f, 0.0f, 0.0f); + mPumpkinScreenPos.set(0.0f, 0.0f, 0.0f); + field_0x170.set(0.0f, 0.0f); + + return true; +} + +bool dLytMiniGamePumpkinParts_c::remove() { + for (int i = 0; i < PUMPKIN_NUM_ANIMS; i++) { + mAnm[i].unbind(); + mAnm[i].remove(); + } + + return true; +} + +bool dLytMiniGamePumpkinParts_c::execute() { + if (mAnm[PUMPKIN_ANIM_GET_POINT].isEnabled() && mAnm[PUMPKIN_ANIM_GET_POINT].isStop2()) { + mAnm[PUMPKIN_ANIM_GET_POINT].setAnimEnable(false); + field_0x154 = false; + } + + if (mAnm[PUMPKIN_ANIM_DOUBLE_SCORE].isEnabled() && mAnm[PUMPKIN_ANIM_DOUBLE_SCORE].isStop2()) { + mAnm[PUMPKIN_ANIM_DOUBLE_SCORE].setAnimEnable(false); + mHasPlayedDoubleScoreSound = false; + } + + if (mAnm[PUMPKIN_ANIM_DOUBLE_SCORE].isEnabled() && 20.0f <= mAnm[PUMPKIN_ANIM_DOUBLE_SCORE].getFrame() && + !mHasPlayedDoubleScoreSound) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MG_PUMP_SHOT_DOUBLE); + mHasPlayedDoubleScoreSound = true; + } + + for (int i = 0; i < PUMPKIN_NUM_ANIMS; i++) { + if (mAnm[i].isEnabled()) { + mAnm[i].play(); + } + } + + if (field_0x154) { + d3d::worldToScreen(mPumpkinScreenPos, mPumpkinWorldPos); + mVec3_c tmp = mPumpkinScreenPos; + tmp.z = 0.0f; + field_0x170.set(tmp.x, tmp.y); + mLyt.getLayout()->GetRootPane()->SetTranslate(tmp); + } + + mLyt.calc(); + + return true; +} + +bool dLytMiniGamePumpkinParts_c::draw() { + mLyt.addToDrawList(); + return true; +} + +void dLytMiniGamePumpkinParts_c::init() { + resetPattern(); + resetDoubleScore(); + resetGetPoint(); + mAnm[PUMPKIN_ANIM_GET_POINT].setToStart(); + mAnm[PUMPKIN_ANIM_GET_POINT].setAnimEnable(true); + mLyt.calc(); + mAnm[PUMPKIN_ANIM_GET_POINT].setAnimEnable(false); +} + +void dLytMiniGamePumpkinParts_c::setPumpkinPos(const mVec3_c &pos) { + mPumpkinWorldPos = pos; + d3d::worldToScreen(mPumpkinScreenPos, mPumpkinWorldPos); + mVec3_c tmp = mPumpkinScreenPos; + tmp.z = 0.0f; + field_0x170.set(tmp.x, tmp.y); + mLyt.getLayout()->GetRootPane()->SetTranslate(tmp); + mLyt.calc(); +} + +void dLytMiniGamePumpkinParts_c::getPoint(u8 combo, bool doubleScore) { + startGetPoint(); + setPattern(combo); + if (doubleScore) { + startDoubleScore(); + } else { + stopDoubleScore(); + } + field_0x154 = true; +} + +bool dLytMiniGamePumpkinParts_c::isActive() const { + return mAnm[PUMPKIN_ANIM_GET_POINT].isEnabled() || mAnm[PUMPKIN_ANIM_DOUBLE_SCORE].isEnabled(); +} + +void dLytMiniGamePumpkinParts_c::startGetPoint() { + mAnm[PUMPKIN_ANIM_GET_POINT].setToStart(); + mAnm[PUMPKIN_ANIM_GET_POINT].setAnimEnable(true); +} + +void dLytMiniGamePumpkinParts_c::startDoubleScore() { + mAnm[PUMPKIN_ANIM_DOUBLE_SCORE].setToStart(); + mAnm[PUMPKIN_ANIM_DOUBLE_SCORE].setAnimEnable(true); +} + +void dLytMiniGamePumpkinParts_c::stopDoubleScore() { + mAnm[PUMPKIN_ANIM_DOUBLE_SCORE].setAnimEnable(false); +} + +void dLytMiniGamePumpkinParts_c::resetGetPoint() { + mAnm[PUMPKIN_ANIM_GET_POINT].setForwardOnce(); + mAnm[PUMPKIN_ANIM_GET_POINT].setToStart(); + mAnm[PUMPKIN_ANIM_GET_POINT].setAnimEnable(false); +} + +void dLytMiniGamePumpkinParts_c::resetDoubleScore() { + mAnm[PUMPKIN_ANIM_DOUBLE_SCORE].setForwardOnce(); + mAnm[PUMPKIN_ANIM_DOUBLE_SCORE].setToStart(); + mAnm[PUMPKIN_ANIM_DOUBLE_SCORE].setAnimEnable(false); +} + +void dLytMiniGamePumpkinParts_c::resetPattern() { + mAnm[PUMPKIN_ANIM_PATTERN].setForwardOnce(); + mAnm[PUMPKIN_ANIM_PATTERN].setFrame(0.0f); + mAnm[PUMPKIN_ANIM_PATTERN].setRate(0.0f); + mAnm[PUMPKIN_ANIM_PATTERN].setAnimEnable(false); +} + +void dLytMiniGamePumpkinParts_c::setPattern(s32 pat) { + u32 frame = 0; + switch (pat) { + case 0: + frame = 0; + dSndSmallEffectMgr_c::GetInstance()->playMinigameScoreUpSound(10); + break; + case 1: + frame = 1; + dSndSmallEffectMgr_c::GetInstance()->playMinigameScoreUpSound(20); + break; + case 2: + frame = 2; + dSndSmallEffectMgr_c::GetInstance()->playMinigameScoreUpSound(30); + break; + case 3: + frame = 3; + dSndSmallEffectMgr_c::GetInstance()->playMinigameScoreUpSound(40); + break; + case 4: + frame = 4; + dSndSmallEffectMgr_c::GetInstance()->playMinigameScoreUpSound(50); + break; + } + mAnm[PUMPKIN_ANIM_PATTERN].setFrame(frame); + mAnm[PUMPKIN_ANIM_PATTERN].setAnimEnable(true); + mLyt.calc(); + mAnm[PUMPKIN_ANIM_PATTERN].setAnimEnable(false); +} + +bool dLytMiniGamePumpkin_c::build(d2d::ResAccIf_c *resAcc) { + for (int i = 0; i < (int)ARRAY_LENGTH(mParts); i++) { + mParts[i].build(resAcc); + } + sInstance = this; + return true; +} + +bool dLytMiniGamePumpkin_c::remove() { + if (sInstance == nullptr) { + return true; + } + for (int i = 0; i < (int)ARRAY_LENGTH(mParts); i++) { + mParts[i].remove(); + } + sInstance = nullptr; + return true; +} + +bool dLytMiniGamePumpkin_c::execute() { + if (sInstance == nullptr) { + return true; + } + for (int i = 0; i < (int)ARRAY_LENGTH(mParts); i++) { + mParts[i].execute(); + } + return true; +} + +bool dLytMiniGamePumpkin_c::draw() { + if (sInstance == nullptr) { + return true; + } + for (int i = 0; i < (int)ARRAY_LENGTH(mParts); i++) { + mParts[i].draw(); + } + return true; +} + +void dLytMiniGamePumpkin_c::init() { + if (sInstance == nullptr) { + return; + } + for (int i = 0; i < (int)ARRAY_LENGTH(mParts); i++) { + mParts[i].init(); + } + return; +} + +void dLytMiniGamePumpkin_c::getPoint(const mVec3_c &pumpkinPos, s32 unk, bool doubleScore) { + if (sInstance == nullptr) { + return; + } + calcCombo(unk); + for (int i = 0; i < (int)ARRAY_LENGTH(mParts); i++) { + if (!mParts[i].isActive()) { + mParts[i].setPumpkinPos(pumpkinPos); + mParts[i].getPoint(mCombo, doubleScore); + return; + } + } +} + +void dLytMiniGamePumpkin_c::calcCombo(s32 unk) { + if (unk < field_0x478) { + mCombo = 0; + } else if (field_0x478 < unk) { + mCombo++; + } + if (mCombo >= 5) { + mCombo = 4; + } + field_0x478 = unk; +} + +static const d2d::LytBrlanMapping brlanMapBugs[] = { + { "miniGameBugs_00_alphaIn.brlan", "G_inOut_00"}, + { "miniGameBugs_00_in.brlan", "G_bugIcon_00"}, + { "miniGameBugs_00_in.brlan", "G_bugIcon_01"}, + { "miniGameBugs_00_in.brlan", "G_bugIcon_02"}, + { "miniGameBugs_00_in.brlan", "G_bugIcon_03"}, + { "miniGameBugs_00_in.brlan", "G_bugIcon_04"}, + { "miniGameBugs_00_in.brlan", "G_bugIcon_05"}, + { "miniGameBugs_00_in.brlan", "G_bugIcon_06"}, + { "miniGameBugs_00_in.brlan", "G_bugIcon_07"}, + { "miniGameBugs_00_in.brlan", "G_bugIcon_08"}, + { "miniGameBugs_00_in.brlan", "G_bugIcon_09"}, + { "miniGameBugs_00_iconOn.brlan", "G_bugIcon_00"}, + { "miniGameBugs_00_iconOn.brlan", "G_bugIcon_01"}, + { "miniGameBugs_00_iconOn.brlan", "G_bugIcon_02"}, + { "miniGameBugs_00_iconOn.brlan", "G_bugIcon_03"}, + { "miniGameBugs_00_iconOn.brlan", "G_bugIcon_04"}, + { "miniGameBugs_00_iconOn.brlan", "G_bugIcon_05"}, + { "miniGameBugs_00_iconOn.brlan", "G_bugIcon_06"}, + { "miniGameBugs_00_iconOn.brlan", "G_bugIcon_07"}, + { "miniGameBugs_00_iconOn.brlan", "G_bugIcon_08"}, + { "miniGameBugs_00_iconOn.brlan", "G_bugIcon_09"}, + { "miniGameBugs_00_bugs.brlan", "G_texAnim_00"}, + { "miniGameBugs_00_bugs.brlan", "G_texAnim_01"}, + { "miniGameBugs_00_bugs.brlan", "G_texAnim_02"}, + { "miniGameBugs_00_bugs.brlan", "G_texAnim_03"}, + { "miniGameBugs_00_bugs.brlan", "G_texAnim_04"}, + { "miniGameBugs_00_bugs.brlan", "G_texAnim_05"}, + { "miniGameBugs_00_bugs.brlan", "G_texAnim_06"}, + { "miniGameBugs_00_bugs.brlan", "G_texAnim_07"}, + { "miniGameBugs_00_bugs.brlan", "G_texAnim_08"}, + { "miniGameBugs_00_bugs.brlan", "G_texAnim_09"}, + {"miniGameBugs_00_iconFlash.brlan", "G_bugIcon_00"}, + {"miniGameBugs_00_iconFlash.brlan", "G_bugIcon_01"}, + {"miniGameBugs_00_iconFlash.brlan", "G_bugIcon_02"}, + {"miniGameBugs_00_iconFlash.brlan", "G_bugIcon_03"}, + {"miniGameBugs_00_iconFlash.brlan", "G_bugIcon_04"}, + {"miniGameBugs_00_iconFlash.brlan", "G_bugIcon_05"}, + {"miniGameBugs_00_iconFlash.brlan", "G_bugIcon_06"}, + {"miniGameBugs_00_iconFlash.brlan", "G_bugIcon_07"}, + {"miniGameBugs_00_iconFlash.brlan", "G_bugIcon_08"}, + {"miniGameBugs_00_iconFlash.brlan", "G_bugIcon_09"}, + { "miniGameBugs_00_alphaOut.brlan", "G_inOut_00"}, +}; + +#define BUGS_ANIM_IN 0 +#define BUGS_ANIM_ICON_IN_OFFSET 1 +#define BUGS_ANIM_ICON_ON_OFFSET 11 +#define BUGS_ANIM_ICON_TEX_ANIM_OFFSET 21 +#define BUGS_ANIM_ICON_FLASH_OFFSET 31 +#define BUGS_ANIM_OUT 41 + +#define BUGS_NUM_ANIMS 42 +#define BUGS_NUM_BUGS 10 + +bool dLytMiniGameBugs_c::build(d2d::ResAccIf_c *resAcc) { + mLyt.setResAcc(resAcc); + mLyt.build("miniGameBugs_00.brlyt", nullptr); + + for (int i = 0; i < BUGS_NUM_ANIMS; i++) { + mAnm[i].init(brlanMapBugs[i].mFile, resAcc, mLyt.getLayout(), brlanMapBugs[i].mName); + mAnm[i].bind(false); + mAnm[i].setRate(1.0f); + } + + sInstance = this; + + for (int i = 0; i < BUGS_NUM_BUGS; i++) { + mBugCollected[i] = 0; + } + + for (int i = 0; i < BUGS_NUM_BUGS; i++) { + mBugItemIds[i] = ITEM_DEKU_HORNET; + } + + return true; +} + +bool dLytMiniGameBugs_c::remove() { + if (sInstance == nullptr) { + return true; + } + if (isBug0Flashing()) { + stopBugIconsFlash(); + } + for (int i = 0; i < BUGS_NUM_ANIMS; i++) { + mAnm[i].unbind(); + mAnm[i].remove(); + } + + sInstance = nullptr; + return true; +} + +bool dLytMiniGameBugs_c::execute() { + if (sInstance == nullptr) { + return true; + } + + if (areAllBugIconsOn()) { + startBugsFlash(); + } + + if (isIconInEndReached()) { + stopBugIconsIn(); + mBugIconsInEnded = true; + } + + if (isInEndReached()) { + stopIn(); + for (int i = 0; i < BUGS_NUM_BUGS; i++) { + if (mBugCollected[i] == true) { + collectBug(i); + } + } + } + + if (isOutEndReached()) { + stopOut(); + } + + for (int i = 0; i < BUGS_NUM_BUGS; i++) { + if (isSlotOnEndReached(i)) { + stopBugIconOn(i); + } + } + + for (int i = 0; i < BUGS_NUM_ANIMS; i++) { + if (mAnm[i].isEnabled()) { + mAnm[i].play(); + } + } + + mLyt.calc(); + + return true; +} + +bool dLytMiniGameBugs_c::draw() { + if (sInstance == nullptr) { + return true; + } + mLyt.addToDrawList(); + return true; +} + +void dLytMiniGameBugs_c::init() { + if (sInstance == nullptr) { + return; + } + + switch (mBugsNumLevel) { + case 0: mBugsNum = 5; break; + case 1: mBugsNum = 10; break; + } + + resetBugIconsTex(); + resetBugIconsOn(); + resetBugIconsFlash(); + resetIn(); + resetOut(); + resetBugIconsIn(); +} + +void dLytMiniGameBugs_c::startAllIconsIn() { + if (sInstance == nullptr) { + return; + } + + if (mInTriggered != true) { + for (int i = 0; i < mBugsNum; i++) { + mAnm[i + BUGS_ANIM_ICON_IN_OFFSET].setToStart(); + mAnm[i + BUGS_ANIM_ICON_IN_OFFSET].setAnimEnable(true); + } + mInTriggered = true; + field_0xB4B = true; + } +} + +void dLytMiniGameBugs_c::startOut() { + if (sInstance == nullptr) { + return; + } + + if (mBugIconsInEnded && mInTriggered && field_0xB4B) { + mAnm[BUGS_ANIM_OUT].setToStart(); + mAnm[BUGS_ANIM_OUT].setAnimEnable(true); + mInTriggered = false; + field_0xB4B = false; + } +} + +void dLytMiniGameBugs_c::startIn() { + if (sInstance == nullptr) { + return; + } + + if (mBugIconsInEnded && mInTriggered != true && field_0xB4B) { + mAnm[BUGS_ANIM_IN].setToStart(); + mAnm[BUGS_ANIM_IN].setAnimEnable(true); + mInTriggered = true; + } +} + +void dLytMiniGameBugs_c::startOutForced() { + if (sInstance == nullptr) { + return; + } + + if (mBugIconsInEnded && mInTriggered) { + mAnm[BUGS_ANIM_OUT].setToStart(); + mAnm[BUGS_ANIM_OUT].setAnimEnable(true); + mInTriggered = false; + } +} + +void dLytMiniGameBugs_c::collectBug(s32 slot) { + if (sInstance == nullptr) { + return; + } + + if (mBugCollected[slot] == false) { + mBugCollected[slot] = true; + if (dAcItem_c::checkTreasureTempCollect(mBugItemIds[slot])) { + field_0xB4C = false; + } + if (field_0xB4C) { + return; + } + } + + if (isSlotIconOnEndReached(slot) || isSlotIconOnEnabled(slot)) { + return; + } + + mAnm[slot + BUGS_ANIM_ICON_ON_OFFSET].setToStart(); + mAnm[slot + BUGS_ANIM_ICON_ON_OFFSET].setAnimEnable(true); + + u8 bugsCount = 0; + for (int i = 0; i < mBugsNum; i++) { + if (mBugCollected[i]) { + bugsCount++; + } + } + + if (bugsCount != mBugsNum) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MG_MUSHITORI_GET); + } + field_0xB4C = true; +} + +void dLytMiniGameBugs_c::startBugsFlash() { + if (sInstance == nullptr) { + return; + } + + if (!mBugIconsFlashStarted) { + mBugIconsFlashStarted = true; + return; + } + + if (!isBug0Flashing()) { + for (int i = 0; i < mBugsNum; i++) { + s32 idx = i + BUGS_ANIM_ICON_FLASH_OFFSET; + mAnm[idx].setToStart(); + mAnm[idx].setAnimEnable(true); + } + } +} + +// corresponds to BugIndex_e +static const s32 sBugItemIds[] = { + ITEM_DEKU_HORNET, ITEM_BLESSED_BUTTERFLY, ITEM_GERUDO_DRAGONFLY, ITEM_STARRY_FIREFLY, + ITEM_WOODLAND_RHINO_BEETLE, ITEM_VOLCANIC_LADYBUG, ITEM_SAND_CICADA, ITEM_SKY_STAG_BEETLE, + ITEM_FARON_GRASSHOPPER, ITEM_SKYLOFT_MANTIS, ITEM_LANAYRU_ANT, ITEM_ELDIN_ROLLER, +}; + +void dLytMiniGameBugs_c::setBug(s32 slot, s32 bugIndex) { + if (sInstance == nullptr) { + return; + } + + f32 frame = static_cast(bugIndex); + mAnm[slot + BUGS_ANIM_ICON_TEX_ANIM_OFFSET].setFrame(frame); + mAnm[slot + BUGS_ANIM_ICON_TEX_ANIM_OFFSET].setAnimEnable(true); + mLyt.calc(); + mAnm[slot + BUGS_ANIM_ICON_TEX_ANIM_OFFSET].setAnimEnable(false); + mBugItemIds[slot] = sBugItemIds[bugIndex]; +} + +bool dLytMiniGameBugs_c::isSlotIconOnEndReached(s32 slot) const { + if (sInstance == nullptr) { + return false; + } + s32 idx = slot + BUGS_ANIM_ICON_ON_OFFSET; + return mAnm[idx].isEndReached(); +} + +bool dLytMiniGameBugs_c::isSlotIconOnEnabled(s32 slot) const { + if (sInstance == nullptr) { + return false; + } + s32 idx = slot + BUGS_ANIM_ICON_ON_OFFSET; + return mAnm[idx].isEnabled_(); +} + +bool dLytMiniGameBugs_c::isSlotBugCollected(s32 slot) { + if (sInstance == nullptr) { + return false; + } + return mBugCollected[slot] == true; +} + +void dLytMiniGameBugs_c::resetBugIconsIn() { + for (int i = 0; i < BUGS_NUM_BUGS; i++) { + s32 idx = i + BUGS_ANIM_ICON_IN_OFFSET; + mAnm[idx].setForwardOnce(); + mAnm[idx].setToStart(); + mAnm[idx].setAnimEnable(true); + } + + mLyt.calc(); + + for (int i = 0; i < BUGS_NUM_BUGS; i++) { + s32 idx = i + BUGS_ANIM_ICON_IN_OFFSET; + mAnm[idx].setAnimEnable(false); + } +} + +void dLytMiniGameBugs_c::resetIn() { + mAnm[BUGS_ANIM_IN].setForwardOnce(); + mAnm[BUGS_ANIM_IN].setToStart(); + mAnm[BUGS_ANIM_IN].setAnimEnable(true); + mLyt.calc(); + mAnm[BUGS_ANIM_IN].setAnimEnable(false); +} + +void dLytMiniGameBugs_c::resetOut() { + mAnm[BUGS_ANIM_OUT].setForwardOnce(); + mAnm[BUGS_ANIM_OUT].setToStart(); + mAnm[BUGS_ANIM_OUT].setAnimEnable(true); + mLyt.calc(); + mAnm[BUGS_ANIM_OUT].setAnimEnable(false); +} + +void dLytMiniGameBugs_c::resetBugIconsOn() { + for (int i = 0; i < BUGS_NUM_BUGS; i++) { + s32 idx = i + BUGS_ANIM_ICON_ON_OFFSET; + mAnm[idx].setForwardOnce(); + mAnm[idx].setToStart(); + mAnm[idx].setAnimEnable(true); + } + + mLyt.calc(); + + for (int i = 0; i < BUGS_NUM_BUGS; i++) { + s32 idx = i + BUGS_ANIM_ICON_ON_OFFSET; + mAnm[idx].setAnimEnable(false); + } +} + +void dLytMiniGameBugs_c::resetBugIconsTex() { + for (int i = 0; i < BUGS_NUM_BUGS; i++) { + s32 idx = i + BUGS_ANIM_ICON_TEX_ANIM_OFFSET; + mAnm[idx].setForwardOnce(); + mAnm[idx].setToStart(); + mAnm[idx].setAnimEnable(true); + } + + mLyt.calc(); + + for (int i = 0; i < BUGS_NUM_BUGS; i++) { + s32 idx = i + BUGS_ANIM_ICON_TEX_ANIM_OFFSET; + mAnm[idx].setAnimEnable(false); + } +} + +void dLytMiniGameBugs_c::resetBugIconsFlash() { + for (int i = 0; i < BUGS_NUM_BUGS; i++) { + s32 idx = i + BUGS_ANIM_ICON_FLASH_OFFSET; + mAnm[idx].setForwardLoop(); + mAnm[idx].setToStart(); + mAnm[idx].setAnimEnable(true); + } + + mLyt.calc(); + + for (int i = 0; i < BUGS_NUM_BUGS; i++) { + s32 idx = i + BUGS_ANIM_ICON_FLASH_OFFSET; + mAnm[idx].setAnimEnable(false); + } +} + +void dLytMiniGameBugs_c::stopBugIconsIn() { + for (int i = 0; i < BUGS_NUM_BUGS; i++) { + s32 idx = i + BUGS_ANIM_ICON_IN_OFFSET; + mAnm[idx].setAnimEnable(false); + } +} + +void dLytMiniGameBugs_c::stopIn() { + mAnm[BUGS_ANIM_IN].setAnimEnable(false); +} + +void dLytMiniGameBugs_c::stopOut() { + mAnm[BUGS_ANIM_OUT].setAnimEnable(false); +} + +void dLytMiniGameBugs_c::stopBugIconOn(s32 slot) { + mAnm[slot + BUGS_ANIM_ICON_ON_OFFSET].setAnimEnable(false); +} + +void dLytMiniGameBugs_c::stopBugIconsFlash() { + for (int i = 0; i < BUGS_NUM_BUGS; i++) { + s32 idx = i + BUGS_ANIM_ICON_FLASH_OFFSET; + mAnm[idx].setAnimEnable(false); + } +} + +bool dLytMiniGameBugs_c::isIconInEndReached() const { + s32 idx = 0 + BUGS_ANIM_ICON_IN_OFFSET; + if (mAnm[idx].isEnabled() && mAnm[idx].isEndReached()) { + return true; + } + return false; +} + +bool dLytMiniGameBugs_c::isInEndReached() const { + s32 idx = BUGS_ANIM_IN; + if (mAnm[idx].isEnabled() && mAnm[idx].isEndReached()) { + return true; + } + return false; +} + +bool dLytMiniGameBugs_c::isOutEndReached() const { + s32 idx = BUGS_ANIM_OUT; + if (mAnm[idx].isEnabled() && mAnm[idx].isEndReached()) { + return true; + } + return false; +} + +bool dLytMiniGameBugs_c::isSlotOnEndReached(s32 slot) const { + s32 idx = slot + BUGS_ANIM_ICON_ON_OFFSET; + if (mAnm[idx].isEnabled() && mAnm[idx].isEndReached()) { + return true; + } + return false; +} + +bool dLytMiniGameBugs_c::isBug0Flashing() const { + s32 idx = 0 + BUGS_ANIM_ICON_FLASH_OFFSET; + return mAnm[idx].isEnabled_(); +} + +bool dLytMiniGameBugs_c::areAllBugIconsOn() const { + bool ret = true; + for (int i = 0; i < mBugsNum; i++) { + if (!isSlotIconOnEndReached(i)) { + ret = false; + break; + } + } + return ret; +} + +static const d2d::LytBrlanMapping brlanMapTime[] = { + { "miniGameTime_00_in.brlan", "G_inOut_00"}, + { "miniGameTime_00_alphaIn.brlan", "G_alphaInOut_00"}, + { "miniGameTime_00_out.brlan", "G_inOut_00"}, + { "miniGameTime_00_signChange.brlan", "G_signChange_00"}, + { "miniGameTime_00_0to9.brlan", "G_0to9_00"}, + { "miniGameTime_00_0to9.brlan", "G_0to9_01"}, + { "miniGameTime_00_0to9.brlan", "G_0to9_02"}, + { "miniGameTime_00_0to9.brlan", "G_0to9_03"}, + { "miniGameTime_00_0to9.brlan", "G_0to9_04"}, + { "miniGameTime_00_0to9.brlan", "G_0to9_05"}, + { "miniGameTime_00_0to9.brlan", "G_0to9B_00"}, + { "miniGameTime_00_0to9.brlan", "G_0to9B_01"}, + { "miniGameTime_00_0to9.brlan", "G_0to9B_02"}, + { "miniGameTime_00_0to9.brlan", "G_0to9B_03"}, + { "miniGameTime_00_0to9.brlan", "G_0to9B_04"}, + { "miniGameTime_00_0to9.brlan", "G_0to9B_05"}, + {"miniGameTime_00_setPosition.brlan", "G_setPosi_00"}, + {"miniGameTime_00_setPosition.brlan", "G_setPosiB_00"}, + {"miniGameTime_00_setPosition.brlan", "G_0to9B_05"}, + {"miniGameTime_00_bScoreOnOff.brlan", "G_bestScore_00"}, + { "miniGameTime_00_finishTime.brlan", "G_finish_00"}, + { "miniGameTime_00_finishTime.brlan", "G_finish_01"}, + { "miniGameTime_00_finishTime.brlan", "G_finish_02"}, + { "miniGameTime_00_finishTime.brlan", "G_finish_03"}, + { "miniGameTime_00_finishTime.brlan", "G_finish_04"}, + { "miniGameTime_00_finishTime.brlan", "G_finish_05"}, + { "miniGameTime_00_finishTime.brlan", "G_finishW_00"}, + { "miniGameTime_00_loopTime.brlan", "G_loopTime_00"}, + { "miniGameTime_00_alphaOut.brlan", "G_alphaInOut_00"}, +}; + +#define TIME_ANIM_IN 0 +#define TIME_ANIM_ALPHA_IN 1 +#define TIME_ANIM_OUT 2 +#define TIME_ANIM_SIGN_CHANGE 3 +#define TIME_ANIM_0_TO_9_OFFSET 4 +#define TIME_ANIM_0_TO_9_B_OFFSET 10 +#define TIME_ANIM_SET_POSITION 16 +#define TIME_ANIM_SET_POSITION_B 17 +#define TIME_ANIM_SET_POSITION_0_TO_9_B 18 +#define TIME_ANIM_BEST_SCORE_ON_OFF 19 +#define TIME_ANIM_FINISH_OFFSET 20 +#define TIME_ANIM_FINISH_W 26 +#define TIME_ANIM_LOOP_TIME 27 +#define TIME_ANIM_ALPHA_OUT 28 + +#define TIME_NUM_ANIMS 29 + +#define TIME_NUM_DIGITS 6 + +bool dLytMiniGameTime_c::build(d2d::ResAccIf_c *resAcc) { + mLyt.setResAcc(resAcc); + mLyt.build("miniGameTime_00.brlyt", nullptr); + + for (int i = 0; i < TIME_NUM_ANIMS; i++) { + mAnm[i].init(brlanMapTime[i].mFile, resAcc, mLyt.getLayout(), brlanMapTime[i].mName); + mAnm[i].bind(false); + mAnm[i].setRate(1.0f); + mAnm[i].setAnimEnable(false); + } + + sInstance = this; + return true; +} + +bool dLytMiniGameTime_c::remove() { + if (sInstance == nullptr) { + return true; + } + for (int i = 0; i < TIME_NUM_ANIMS; i++) { + mAnm[i].unbind(); + mAnm[i].remove(); + } + + sInstance = nullptr; + return true; +} + +bool dLytMiniGameTime_c::execute() { + if (sInstance == nullptr) { + return true; + } + + if (mIsVisible) { + switch (mTimerVariant) { + case TIMER_LONG: updateLongTimer(); break; + case TIMER_SECONDS: updateSecondsTimer(); break; + } + + if (isInEndReached()) { + stopIn(); + field_0x7EC = true; + } + + if (isOutEndReached()) { + stopOut(); + stopLoop(); + resetLoop(); + mIsVisible = false; + } + + if (isAlphaInEndReached()) { + stopAlphaIn(); + if (field_0x7EE) { + startLoop(); + } + } + + if (isAlphaOutEndReached()) { + stopAlphaOut(); + if (field_0x7EE) { + stopLoop(); + resetLoop(); + } + mIsVisible = false; + } + + if (isFinishEndReached()) { + stopFinish(); + startLoop(); + } + + for (int i = 0; i < TIME_NUM_ANIMS; i++) { + if (mAnm[i].isEnabled()) { + mAnm[i].play(); + } + } + mLyt.calc(); + } + + if (mTimerVariant == TIMER_SECONDS) { + if (mCurrentTimerValueSeconds <= 10 && mLastTimerValueSeconds != mCurrentTimerValueSeconds) { + dSndSmallEffectMgr_c::GetInstance()->playMinigameTimeUpSound(mCurrentTimerValueSeconds); + } + saveSecondsTimer(); + } + + if (field_0x7F0 == 0) { + if (mCurrentTimerValueSeconds >= 590 && mLastTimerValueSeconds != mCurrentTimerValueSeconds && + mCurrentTimerValueSeconds != 600) { + dSndSmallEffectMgr_c::GetInstance()->playMinigameTimeUpSound(600 - mCurrentTimerValueSeconds); + } + saveSecondsTimer(); + } + + return true; +} + +bool dLytMiniGameTime_c::draw() { + if (sInstance == nullptr) { + return true; + } + if (mIsVisible) { + mLyt.addToDrawList(); + } + return true; +} + +void dLytMiniGameTime_c::init() { + if (sInstance == nullptr) { + return; + } + + switch (field_0x7F0) { + case 0: mTimerVariant = TIMER_LONG; break; + case 1: mTimerVariant = TIMER_SECONDS; break; + case 2: mTimerVariant = TIMER_SECONDS; break; + case 3: mTimerVariant = TIMER_LONG; break; + case 4: mTimerVariant = TIMER_LONG; break; + case 5: mTimerVariant = TIMER_LONG; break; + } + + resetAlphaIn(); + resetAlphaOut(); + resetOut(); + resetDigits(); + fn_8028EBB0(); + resetShowBestTime(); + resetFinish(); + resetLoop(); + initSignChange(); + resetIn(); +} + +void dLytMiniGameTime_c::fn_8028DD80() { + if (sInstance == nullptr) { + return; + } + + if (field_0x7ED == true) { + return; + } + + mAnm[TIME_ANIM_ALPHA_IN].setToEnd2(); + mAnm[TIME_ANIM_ALPHA_IN].setAnimEnable(true); + + mAnm[TIME_ANIM_IN].setToStart(); + mAnm[TIME_ANIM_IN].setAnimEnable(true); + + mLyt.calc(); + + mAnm[TIME_ANIM_ALPHA_IN].setAnimEnable(false); + + field_0x7ED = true; + field_0x7F4 = true; + mIsVisible = true; +} + +void dLytMiniGameTime_c::fn_8028DE40() { + if (sInstance == nullptr) { + return; + } + + if (field_0x7EC && field_0x7ED) { + mAnm[TIME_ANIM_OUT].setToStart(); + mAnm[TIME_ANIM_OUT].setAnimEnable(true); + + field_0x7ED = false; + field_0x7F4 = false; + } +} + +void dLytMiniGameTime_c::fn_8028DED0() { + if (sInstance == nullptr) { + return; + } + + if (field_0x7EC && field_0x7ED != true && field_0x7F4) { + if (!mAnm[TIME_ANIM_ALPHA_IN].isEnabled()) { + if (mAnm[TIME_ANIM_ALPHA_OUT].isEnabled()) { + mAnm[TIME_ANIM_ALPHA_OUT].setAnimEnable(false); + // TODO maybe these inlines are wrong + f32 frame = mAnm[TIME_ANIM_ALPHA_OUT].getLastFrame(); + f32 t = mAnm[TIME_ANIM_ALPHA_IN].getLastFrame(); + frame -= mAnm[TIME_ANIM_ALPHA_OUT].getFrame(); + if (t <= frame) { + frame = t - 1.0f; + } + mAnm[TIME_ANIM_ALPHA_IN].setFrame(frame); + } else { + mAnm[TIME_ANIM_ALPHA_IN].setToStart(); + } + + mAnm[TIME_ANIM_ALPHA_IN].setAnimEnable(true); + field_0x7ED = true; + } + + mIsVisible = true; + } +} + +void dLytMiniGameTime_c::fn_8028DFD0() { + if (sInstance == nullptr) { + return; + } + + if (field_0x7EC && field_0x7ED) { + if (!mAnm[TIME_ANIM_ALPHA_OUT].isEnabled()) { + if (mAnm[TIME_ANIM_ALPHA_IN].isEnabled()) { + mAnm[TIME_ANIM_ALPHA_IN].setAnimEnable(false); + // TODO maybe these inlines are wrong + f32 frame = mAnm[TIME_ANIM_ALPHA_IN].getLastFrame(); + f32 t = mAnm[TIME_ANIM_ALPHA_OUT].getLastFrame(); + frame -= mAnm[TIME_ANIM_ALPHA_IN].getFrame(); + if (t <= frame) { + frame = t - 1.0f; + } + mAnm[TIME_ANIM_ALPHA_OUT].setFrame(frame); + } else { + mAnm[TIME_ANIM_ALPHA_OUT].setToStart(); + } + + mAnm[TIME_ANIM_ALPHA_OUT].setAnimEnable(true); + field_0x7ED = false; + } + } +} + +void dLytMiniGameTime_c::fn_8028E0C0() { + if (sInstance == nullptr) { + return; + } + + mAnm[TIME_ANIM_IN].setToEnd2(); + mAnm[TIME_ANIM_IN].setAnimEnable(true); + + mAnm[TIME_ANIM_ALPHA_IN].setToStart(); + mAnm[TIME_ANIM_ALPHA_IN].setAnimEnable(true); + + mLyt.calc(); + + mAnm[TIME_ANIM_IN].setAnimEnable(false); + mIsVisible = true; +} + +void dLytMiniGameTime_c::fn_8028E170() { + if (sInstance == nullptr) { + return; + } + + mAnm[TIME_ANIM_ALPHA_OUT].setToStart(); + mAnm[TIME_ANIM_ALPHA_OUT].setAnimEnable(true); +} + +void dLytMiniGameTime_c::fn_8028E1D0() { + if (sInstance == nullptr) { + return; + } + + for (int i = 0; i <= mHighestDigitIndex; i++) { + mAnm[i + TIME_ANIM_FINISH_OFFSET].setToStart(); + mAnm[i + TIME_ANIM_FINISH_OFFSET].setAnimEnable(true); + } + + mAnm[TIME_ANIM_FINISH_W].setToStart(); + mAnm[TIME_ANIM_FINISH_W].setAnimEnable(true); +} + +void dLytMiniGameTime_c::startLoop() { + if (sInstance == nullptr) { + return; + } + + mAnm[TIME_ANIM_LOOP_TIME].setFrame(0.0f); + mAnm[TIME_ANIM_LOOP_TIME].setAnimEnable(true); +} + +void dLytMiniGameTime_c::setTimerValueInMilliSeconds(s32 a) { + if (sInstance == nullptr) { + return; + } + mCurrentTimerValueMilliSeconds = a; +} + +void dLytMiniGameTime_c::updateLongTimer() { + s32 msec = mCurrentTimerValueMilliSeconds % 1000; + s32 sec = mCurrentTimerValueMilliSeconds / 1000; + s32 csec = msec / 10; + s32 min = sec / 60; + s32 sec1 = sec % 60; + + mCurrentTimerValueSeconds = sec1 + min * 60; + + s32 digits[6]; + // ten-minutes + digits[5] = min / 10; + // minutes + digits[4] = min % 10; + // ten-seconds + digits[3] = sec1 / 10; + // seconds + digits[2] = sec1 % 10; + // tenths-of-a-second + digits[1] = csec / 10; + // hundredths-of-a-second + digits[0] = csec % 10; + + if (digits[5] != 0) { + mHighestDigitIndex = 5; + fn_8028F240(true); + } else { + mHighestDigitIndex = 4; + fn_8028F240(false); + } + + for (int i = 0; i <= mHighestDigitIndex; i++) { + setDigit(i, digits[i]); + } +} + +void dLytMiniGameTime_c::setTimerSecondsValueInMilliSeconds(s32 time) { + if (sInstance == nullptr) { + return; + } + mCurrentTimerValueSeconds = time / 1000; +} + +void dLytMiniGameTime_c::updateSecondsTimer() { + if (mCurrentTimerValueSeconds > 999) { + mCurrentTimerValueSeconds = 999; + } + s32 seconds = mCurrentTimerValueSeconds % 100; + + s32 digits[3]; + // 100-seconds + digits[2] = mCurrentTimerValueSeconds / 100; + // ten-seconds + digits[1] = seconds / 10; + // seconds + digits[0] = seconds % 10; + + if (mCurrentTimerValueSeconds < 10) { + mHighestDigitIndex = 0; + } else if (mCurrentTimerValueSeconds < 100) { + mHighestDigitIndex = 1; + } else { + mHighestDigitIndex = 2; + } + setHighestDigitIndex(mHighestDigitIndex); + for (int i = 0; i <= mHighestDigitIndex; i++) { + setDigit(i + 2, digits[i]); + } +} + +void dLytMiniGameTime_c::saveSecondsTimer() { + mLastTimerValueSeconds = mCurrentTimerValueSeconds; +} + +void dLytMiniGameTime_c::setBestTime(s32 time) { + if (sInstance == nullptr) { + return; + } + + s32 offset = 1; + + s32 msec = time % 1000; + s32 sec = time / 1000; + s32 csec = msec / 10; + s32 min = sec / 60; + s32 sec1 = sec % 60; + + s32 digits[6]; + // ten-minutes + digits[5] = min / 10; + // minutes + digits[4] = min % 10; + // ten-seconds + digits[3] = sec1 / 10; + // seconds + digits[2] = sec1 % 10; + // tenths-of-a-second + digits[1] = csec / 10; + // hundredths-of-a-second + digits[0] = csec % 10; + + if (digits[5] != 0) { + offset = 0; + setBestHasSixDigits(true); + } else { + setBestHasSixDigits(false); + } + + for (int i = 0; i < 6 - offset; i++) { + setDigitBest(i, digits[i]); + } +} + +void dLytMiniGameTime_c::setShowBestTime(bool show) { + if (sInstance == nullptr) { + return; + } + + f32 frame = 1.0f; + if (show) { + frame = 0.0f; + } + mAnm[TIME_ANIM_BEST_SCORE_ON_OFF].setFrame(frame); + mAnm[TIME_ANIM_BEST_SCORE_ON_OFF].setAnimEnable(true); + + mLyt.getLayout()->Animate(0); + mLyt.calc(); + + mAnm[TIME_ANIM_BEST_SCORE_ON_OFF].setAnimEnable(false); +} + +void dLytMiniGameTime_c::resetIn() { + mAnm[TIME_ANIM_IN].setForwardOnce(); + mAnm[TIME_ANIM_IN].setToStart(); + mAnm[TIME_ANIM_IN].setAnimEnable(true); + + mLyt.calc(); + + mAnm[TIME_ANIM_IN].setAnimEnable(false); +} + +void dLytMiniGameTime_c::resetOut() { + mAnm[TIME_ANIM_OUT].setForwardOnce(); + mAnm[TIME_ANIM_OUT].setToStart(); + mAnm[TIME_ANIM_OUT].setAnimEnable(true); + + mLyt.calc(); + + mAnm[TIME_ANIM_OUT].setAnimEnable(false); +} + +void dLytMiniGameTime_c::resetAlphaIn() { + mAnm[TIME_ANIM_ALPHA_IN].setForwardOnce(); + mAnm[TIME_ANIM_ALPHA_IN].setToStart(); + mAnm[TIME_ANIM_ALPHA_IN].setAnimEnable(true); + + mLyt.calc(); + + mAnm[TIME_ANIM_ALPHA_IN].setAnimEnable(false); +} + +void dLytMiniGameTime_c::resetAlphaOut() { + mAnm[TIME_ANIM_ALPHA_OUT].setForwardOnce(); + mAnm[TIME_ANIM_ALPHA_OUT].setToStart(); + mAnm[TIME_ANIM_ALPHA_OUT].setAnimEnable(true); + + mLyt.calc(); + + mAnm[TIME_ANIM_ALPHA_OUT].setAnimEnable(false); +} + +void dLytMiniGameTime_c::resetDigits() { + for (int i = 0; i < TIME_NUM_DIGITS; i++) { + s32 idx = i + TIME_ANIM_0_TO_9_OFFSET; + mAnm[idx].setForwardOnce(); + mAnm[idx].setToStart(); + mAnm[idx].setAnimEnable(true); + } + + for (int i = 0; i < TIME_NUM_DIGITS; i++) { + s32 idx = i + TIME_ANIM_0_TO_9_B_OFFSET; + mAnm[idx].setForwardOnce(); + mAnm[idx].setToStart(); + mAnm[idx].setAnimEnable(true); + } + + mLyt.calc(); + + for (int i = 0; i < TIME_NUM_DIGITS; i++) { + s32 idx = i + TIME_ANIM_0_TO_9_OFFSET; + mAnm[idx].setAnimEnable(false); + } + + for (int i = 0; i < TIME_NUM_DIGITS; i++) { + s32 idx = i + TIME_ANIM_0_TO_9_B_OFFSET; + mAnm[idx].setAnimEnable(false); + } +} + +void dLytMiniGameTime_c::fn_8028EBB0() { + switch (mTimerVariant) { + case TIMER_LONG: + fn_8028F240(false); + setBestHasSixDigits(false); + break; + case TIMER_SECONDS: setHighestDigitIndex(0); break; + } +} + +void dLytMiniGameTime_c::resetShowBestTime() { + setShowBestTime(false); +} + +void dLytMiniGameTime_c::resetFinish() { + for (int i = 0; i < TIME_NUM_DIGITS; i++) { + mAnm[i + TIME_ANIM_FINISH_OFFSET].setForwardOnce(); + mAnm[i + TIME_ANIM_FINISH_OFFSET].setToStart(); + mAnm[i + TIME_ANIM_FINISH_OFFSET].setAnimEnable(true); + mLyt.calc(); + } + + mAnm[TIME_ANIM_FINISH_W].setForwardOnce(); + mAnm[TIME_ANIM_FINISH_W].setToStart(); + mAnm[TIME_ANIM_FINISH_W].setAnimEnable(true); + + mLyt.calc(); + + mAnm[TIME_ANIM_FINISH_W].setAnimEnable(false); + + for (int i = 0; i < TIME_NUM_DIGITS; i++) { + mAnm[i + TIME_ANIM_FINISH_OFFSET].setAnimEnable(false); + } +} + +void dLytMiniGameTime_c::resetLoop() { + mAnm[TIME_ANIM_LOOP_TIME].setForwardLoop(); + mAnm[TIME_ANIM_LOOP_TIME].setFrame(0.0f); + mAnm[TIME_ANIM_LOOP_TIME].setAnimEnable(true); + + mLyt.calc(); + + mAnm[TIME_ANIM_LOOP_TIME].setAnimEnable(false); +} + +void dLytMiniGameTime_c::initSignChange() { + if (getCurrentLanguage1() == D_LANG_FR) { + setSignChange(2); + field_0x7D4 = 3; + } else { + setSignChange(1); + field_0x7D4 = 3; + } +} + +void dLytMiniGameTime_c::stopIn() { + mAnm[TIME_ANIM_IN].setAnimEnable(false); +} + +void dLytMiniGameTime_c::stopOut() { + mAnm[TIME_ANIM_OUT].setAnimEnable(false); +} + +void dLytMiniGameTime_c::stopAlphaIn() { + mAnm[TIME_ANIM_ALPHA_IN].setAnimEnable(false); +} + +void dLytMiniGameTime_c::stopAlphaOut() { + mAnm[TIME_ANIM_ALPHA_OUT].setAnimEnable(false); +} + +void dLytMiniGameTime_c::stopFinish() { + mAnm[TIME_ANIM_FINISH_W].setAnimEnable(false); + + for (int i = 0; i < TIME_NUM_DIGITS; i++) { + mAnm[i + TIME_ANIM_FINISH_OFFSET].setAnimEnable(false); + } +} + +void dLytMiniGameTime_c::stopLoop() { + mAnm[TIME_ANIM_LOOP_TIME].setAnimEnable(false); +} + +bool dLytMiniGameTime_c::isInEndReached() const { + if (mAnm[TIME_ANIM_IN].isEnabled() && mAnm[TIME_ANIM_IN].isEndReached()) { + return true; + } + return false; +} + +bool dLytMiniGameTime_c::isOutEndReached() const { + if (mAnm[TIME_ANIM_OUT].isEnabled() && mAnm[TIME_ANIM_OUT].isEndReached()) { + return true; + } + return false; +} + +bool dLytMiniGameTime_c::isAlphaInEndReached() const { + if (mAnm[TIME_ANIM_ALPHA_IN].isEnabled() && mAnm[TIME_ANIM_ALPHA_IN].isEndReached()) { + return true; + } + return false; +} + +bool dLytMiniGameTime_c::isAlphaOutEndReached() const { + if (mAnm[TIME_ANIM_ALPHA_OUT].isEnabled() && mAnm[TIME_ANIM_ALPHA_OUT].isEndReached()) { + return true; + } + return false; +} + +bool dLytMiniGameTime_c::isFinishEndReached() const { + if (mAnm[TIME_ANIM_FINISH_OFFSET].isEnabled() && mAnm[TIME_ANIM_FINISH_OFFSET].isEndReached()) { + return true; + } + return false; +} + +void dLytMiniGameTime_c::setHighestDigitIndex(u8 arg) { + f32 frame = arg + field_0x7D4 + 2; + + mAnm[TIME_ANIM_SET_POSITION].setForwardOnce(); + mAnm[TIME_ANIM_SET_POSITION].setFrame(frame); + mAnm[TIME_ANIM_SET_POSITION].setAnimEnable(true); + + mAnm[TIME_ANIM_SET_POSITION_B].setForwardOnce(); + mAnm[TIME_ANIM_SET_POSITION_B].setFrame(frame); + mAnm[TIME_ANIM_SET_POSITION_B].setAnimEnable(true); + + mAnm[TIME_ANIM_SET_POSITION_0_TO_9_B].setForwardOnce(); + mAnm[TIME_ANIM_SET_POSITION_0_TO_9_B].setFrame(frame); + mAnm[TIME_ANIM_SET_POSITION_0_TO_9_B].setAnimEnable(true); + + mLyt.calc(); + + mAnm[TIME_ANIM_SET_POSITION].setAnimEnable(false); + mAnm[TIME_ANIM_SET_POSITION_B].setAnimEnable(false); + mAnm[TIME_ANIM_SET_POSITION_0_TO_9_B].setAnimEnable(false); +} + +void dLytMiniGameTime_c::setSignChange(u32 arg) { + f32 frame = arg; + + mAnm[TIME_ANIM_SIGN_CHANGE].setFrame(frame); + mAnm[TIME_ANIM_SIGN_CHANGE].setAnimEnable(true); + + mLyt.getLayout()->Animate(0); + mLyt.calc(); + + mAnm[TIME_ANIM_SIGN_CHANGE].setAnimEnable(false); +} + +void dLytMiniGameTime_c::fn_8028F240(bool b) { + f32 frame = 0.0f; + if (b) { + frame = 1.0f; + } + + mAnm[TIME_ANIM_SET_POSITION].setForwardOnce(); + mAnm[TIME_ANIM_SET_POSITION].setFrame(frame); + mAnm[TIME_ANIM_SET_POSITION].setAnimEnable(true); + + mLyt.calc(); + + mAnm[TIME_ANIM_SET_POSITION].setAnimEnable(false); +} + +void dLytMiniGameTime_c::setBestHasSixDigits(bool b) { + f32 frame = 0.0f; + if (b) { + frame = 1.0f; + } + + mAnm[TIME_ANIM_SET_POSITION_B].setForwardOnce(); + mAnm[TIME_ANIM_SET_POSITION_B].setFrame(frame); + mAnm[TIME_ANIM_SET_POSITION_B].setAnimEnable(true); + + mAnm[TIME_ANIM_SET_POSITION_0_TO_9_B].setForwardOnce(); + mAnm[TIME_ANIM_SET_POSITION_0_TO_9_B].setFrame(frame); + mAnm[TIME_ANIM_SET_POSITION_0_TO_9_B].setAnimEnable(true); + + mLyt.getLayout()->Animate(0); + mLyt.calc(); + + mAnm[TIME_ANIM_SET_POSITION_0_TO_9_B].setAnimEnable(false); + mAnm[TIME_ANIM_SET_POSITION_B].setAnimEnable(false); +} + +void dLytMiniGameTime_c::setDigit(s32 digitIndex, s32 number) { + s32 idx = digitIndex + TIME_ANIM_0_TO_9_OFFSET; + f32 frame = number; + + mAnm[idx].setFrame(frame); + mAnm[idx].setAnimEnable(true); + + mLyt.getLayout()->Animate(0); + mLyt.calc(); + + mAnm[idx].setAnimEnable(false); +} + +void dLytMiniGameTime_c::setDigitBest(s32 digitIndex, s32 number) { + s32 idx = digitIndex + TIME_ANIM_0_TO_9_B_OFFSET; + f32 frame = number; + + mAnm[idx].setFrame(frame); + mAnm[idx].setAnimEnable(true); + + mLyt.getLayout()->Animate(0); + mLyt.calc(); + + mAnm[idx].setAnimEnable(false); +} + +static const d2d::LytBrlanMapping brlanMapStart[] = { + {"start_00_321start.brlan", "G_321start_00"}, + { "start_00_finish.brlan", "G_finish_00"}, + { "start_00_finish.brlan", "G_timeUp_00"}, +}; + +#define START_NUM_ANIMS 3 + +bool dLytMiniGameStart_c::build(d2d::ResAccIf_c *resAcc) { + mLyt.setResAcc(resAcc); + mLyt.build("start_00.brlyt", nullptr); + + for (int i = 0; i < START_NUM_ANIMS; i++) { + mAnm[i].init(brlanMapStart[i].mFile, resAcc, mLyt.getLayout(), brlanMapStart[i].mName); + mAnm[i].bind(false); + mAnm[i].setRate(1.0f); + } + + sInstance = this; + return true; +} + +bool dLytMiniGameStart_c::remove() { + if (sInstance == nullptr) { + return true; + } + for (int i = 0; i < START_NUM_ANIMS; i++) { + mAnm[i].unbind(); + mAnm[i].remove(); + } + + sInstance = nullptr; + return true; +} + +bool dLytMiniGameStart_c::execute() { + if (sInstance == nullptr) { + return true; + } + + for (int i = 0; i < START_NUM_ANIMS; i++) { + if (mAnm[i].isEnabled()) { + mAnm[i].play(); + } + } + + mLyt.calc(); + + return true; +} + +bool dLytMiniGameStart_c::draw() { + if (sInstance == nullptr) { + return true; + } + mLyt.addToDrawList(); + return true; +} + +void dLytMiniGameStart_c::init() { + // TODO - ... +} + +static const d2d::LytBrlanMapping brlanMapScore[] = { + { "miniGameScore_00_in.brlan", "G_inOut_00"}, + { "miniGameScore_00_alphaIn.brlan", "G_alphaInOut_00"}, + { "miniGameScore_00_out.brlan", "G_inOut_00"}, + { "miniGameScore_00_0to9.brlan", "G_0to9_00"}, + { "miniGameScore_00_0to9.brlan", "G_0to9_01"}, + { "miniGameScore_00_0to9.brlan", "G_0to9_02"}, + { "miniGameScore_00_0to9.brlan", "G_0to9_03"}, + { "miniGameScore_00_0to9.brlan", "G_0to9_04"}, + {"miniGameScore_00_setPosition00.brlan", "G_setPosition_00"}, + { "miniGameScore_00_getScore.brlan", "G_getScore_00"}, + { "miniGameScore_00_getScore.brlan", "G_getScore_01"}, + { "miniGameScore_00_getScore.brlan", "G_getScore_02"}, + { "miniGameScore_00_getScore.brlan", "G_getScore_03"}, + { "miniGameScore_00_getScore.brlan", "G_getScore_04"}, + { "miniGameScore_00_getScore.brlan", "G_getTextF_00"}, + { "miniGameScore_00_finishScore.brlan", "G_getScore_00"}, + { "miniGameScore_00_finishScore.brlan", "G_getScore_01"}, + { "miniGameScore_00_finishScore.brlan", "G_getScore_02"}, + { "miniGameScore_00_finishScore.brlan", "G_getScore_03"}, + { "miniGameScore_00_finishScore.brlan", "G_getScore_04"}, + { "miniGameScore_00_finishScore.brlan", "G_getScoreW_00"}, + { "miniGameScore_00_finishScore.brlan", "G_getScoreX_00"}, + { "miniGameScore_00_finishScore.brlan", "G_getTextF_00"}, + { "miniGameScore_00_loopScore.brlan", "G_loopScore_00"}, + { "miniGameScore_00_rupeeChange.brlan", "G_rupyChange_00"}, + { "miniGameScore_00_alphaOut.brlan", "G_alphaInOut_00"}, +}; + +#define SCORE_NUM_ANIMS 26 + +bool dLytMiniGameScore_c::build(d2d::ResAccIf_c *resAcc) { + mLyt.setResAcc(resAcc); + mLyt.build("miniGameScore_00.brlyt", nullptr); + + for (int i = 0; i < SCORE_NUM_ANIMS; i++) { + mAnm[i].init(brlanMapScore[i].mFile, resAcc, mLyt.getLayout(), brlanMapScore[i].mName); + mAnm[i].bind(false); + mAnm[i].setRate(1.0f); + } + + sInstance = this; + return true; +} + +bool dLytMiniGameScore_c::remove() { + if (sInstance == nullptr) { + return true; + } + for (int i = 0; i < SCORE_NUM_ANIMS; i++) { + mAnm[i].unbind(); + mAnm[i].remove(); + } + + sInstance = nullptr; + return true; +} + +bool dLytMiniGameScore_c::execute() { + if (sInstance == nullptr) { + return true; + } + + for (int i = 0; i < SCORE_NUM_ANIMS; i++) { + if (mAnm[i].isEnabled()) { + mAnm[i].play(); + } + } + + mLyt.calc(); + + return true; +} + +bool dLytMiniGameScore_c::draw() { + if (sInstance == nullptr) { + return true; + } + mLyt.addToDrawList(); + return true; +} + +void dLytMiniGameScore_c::init() { + // TODO - ... +} + +static const d2d::LytBrlanMapping brlanMapScoreSd[] = { + { "miniGameScoreSd_00_0to9.brlan", "G_0to9_00"}, + { "miniGameScoreSd_00_0to9.brlan", "G_0to9_01"}, + {"miniGameScoreSd_00_setPosition00.brlan", "G_setPosition_00"}, + { "miniGameScoreSd_00_scoreUp.brlan", "G_animAll_00"}, + { "miniGameScoreSd_00_scoreDown.brlan", "G_animAll_00"}, +}; + +#define SCORE_SD_NUM_ANIMS 5 + +bool dLytMiniGameScoreSd_c::build(d2d::ResAccIf_c *resAcc) { + mLyt.setResAcc(resAcc); + mLyt.build("miniGameScoreSd_00.brlyt", nullptr); + + for (int i = 0; i < SCORE_SD_NUM_ANIMS; i++) { + mAnm[i].init(brlanMapScoreSd[i].mFile, resAcc, mLyt.getLayout(), brlanMapScoreSd[i].mName); + mAnm[i].bind(false); + mAnm[i].setRate(1.0f); + } + + sInstance = this; + return true; +} + +bool dLytMiniGameScoreSd_c::remove() { + if (sInstance == nullptr) { + return true; + } + for (int i = 0; i < SCORE_SD_NUM_ANIMS; i++) { + mAnm[i].unbind(); + mAnm[i].remove(); + } + + sInstance = nullptr; + return true; +} + +bool dLytMiniGameScoreSd_c::execute() { + if (sInstance == nullptr) { + return true; + } + + for (int i = 0; i < SCORE_SD_NUM_ANIMS; i++) { + if (mAnm[i].isEnabled()) { + mAnm[i].play(); + } + } + + mLyt.calc(); + + return true; +} + +bool dLytMiniGameScoreSd_c::draw() { + if (sInstance == nullptr) { + return true; + } + mLyt.addToDrawList(); + return true; +} + +void dLytMiniGameScoreSd_c::init() { + // TODO - ... +} + +SPECIAL_BASE_PROFILE(LYT_MINI_GAME, dLytMiniGame_c, fProfile::LYT_MINI_GAME, 0x2B7, 1); diff --git a/src/d/lyt/meter/d_lyt_meter_ganbari_gauge.cpp b/src/d/lyt/meter/d_lyt_meter_ganbari_gauge.cpp index cf7423f0..448c8cbe 100644 --- a/src/d/lyt/meter/d_lyt_meter_ganbari_gauge.cpp +++ b/src/d/lyt/meter/d_lyt_meter_ganbari_gauge.cpp @@ -439,7 +439,7 @@ bool dLytMeterGanbariGauge_c::execute() { mVec3_c diff = dAcPy_c::GetLink()->mPositionCopy3 - dScGame_c::getCamera(0)->getPositionMaybe(); f32 len = diff.mag(); mVec3_c v; - d3d::fn_80016960(v, dAcPy_c::GetLink()->mPositionCopy3); + d3d::worldToScreen(v, dAcPy_c::GetLink()->mPositionCopy3); if (!EventManager::isInEvent()) { field_0x524 = v; } @@ -602,7 +602,7 @@ bool dLytMeterGanbariGauge_c::execute() { if (!EventManager::isInEvent() && !dAcPy_c::GetLink()->hasvt_0x1C0() && !dAcPy_c::GetLink()->checkActionFlagsCont(0x10) && - (d3d::fn_80016A90(dAcPy_c::GetLink()->mPositionCopy3) || fn_80104710(false) || isCrawling()) && + (d3d::isOnScreen(dAcPy_c::GetLink()->mPositionCopy3) || fn_80104710(false) || isCrawling()) && *mStateMgrWheel.getStateID() != StateID_Full && *mStateMgrMain.getStateID() == StateID_InvisibleWait && !field_0x530) { mStateMgrMain.changeState(StateID_In); @@ -611,7 +611,7 @@ bool dLytMeterGanbariGauge_c::execute() { mStateMgrMain.changeState(StateID_OutWait); } else if ((EventManager::isInEvent() || dAcPy_c::GetLink()->hasvt_0x1C0() || dAcPy_c::GetLink()->checkActionFlagsCont(0x10) || - (!d3d::fn_80016A90(dAcPy_c::GetLink()->mPositionCopy3) && !fn_80104710(false) && !isCrawling())) && + (!d3d::isOnScreen(dAcPy_c::GetLink()->mPositionCopy3) && !fn_80104710(false) && !isCrawling())) && *mStateMgrMain.getStateID() == StateID_Wait) { mStateMgrMain.changeState(StateID_CameraOut); } else if (field_0x530 && *mStateMgrMain.getStateID() == StateID_Wait) { diff --git a/src/d/lyt/meter/d_lyt_meter_rupy.cpp b/src/d/lyt/meter/d_lyt_meter_rupy.cpp index c5987f56..940494e2 100644 --- a/src/d/lyt/meter/d_lyt_meter_rupy.cpp +++ b/src/d/lyt/meter/d_lyt_meter_rupy.cpp @@ -474,7 +474,7 @@ bool dLytMeterRupy_c::updateDisplayedAmount(bool suppressSound) { newNumDigits = 3; setDigit(0, newNumDisplayed / 100); s32 rem = (newNumDisplayed % 100); - setDigit(1, rem / 10); // x + setDigit(1, rem / 10); setDigit(2, rem % 10); } else if (newNumDisplayed >= 10) { newNumDigits = 2; diff --git a/src/d/lyt/msg_window/d_lyt_msg_window.cpp b/src/d/lyt/msg_window/d_lyt_msg_window.cpp index cd26b754..8e65ddcc 100644 --- a/src/d/lyt/msg_window/d_lyt_msg_window.cpp +++ b/src/d/lyt/msg_window/d_lyt_msg_window.cpp @@ -264,8 +264,8 @@ void dLytMsgWindow_c::initializeState_In() { param = 2; } else if (mpTagProcessor->getField_0x90D() == 3) { param = 1; - } else if (obj != nullptr && d3d::fn_80016A90(obj->mPositionCopy2)) { - d3d::fn_80016960(field_0x768, obj->mPositionCopy2); + } else if (obj != nullptr && d3d::isOnScreen(obj->mPositionCopy2)) { + d3d::worldToScreen(field_0x768, obj->mPositionCopy2); mVec3_c v = field_0x768; v.z = 0.f; field_0x768 = v; From f6d4e45c1a48c26556e32a155172a3fde727f7ba Mon Sep 17 00:00:00 2001 From: robojumper Date: Sun, 30 Nov 2025 22:38:23 +0100 Subject: [PATCH 2/9] 55% --- config/SOUE01/symbols.txt | 76 +- include/d/lyt/d_lyt_mini_game.h | 147 +-- include/d/snd/d_snd_small_effect_mgr.h | 2 +- include/m/m_vec.h | 4 + src/d/lyt/d_lyt_mini_game.cpp | 1196 +++++++++++++++++++++++- src/d/snd/d_snd_small_effect_mgr.cpp | 2 +- 6 files changed, 1281 insertions(+), 146 deletions(-) diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 9bc6b458..dfdaa3d3 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -15287,9 +15287,9 @@ fn_8028DD80__18dLytMiniGameTime_cFv = .text:0x8028DD80; // type:function size:0x fn_8028DE40__18dLytMiniGameTime_cFv = .text:0x8028DE40; // type:function size:0x84 fn_8028DED0__18dLytMiniGameTime_cFv = .text:0x8028DED0; // type:function size:0x100 fn_8028DFD0__18dLytMiniGameTime_cFv = .text:0x8028DFD0; // type:function size:0xEC -fn_8028E0C0__18dLytMiniGameTime_cFv = .text:0x8028E0C0; // type:function size:0xAC -fn_8028E170__18dLytMiniGameTime_cFv = .text:0x8028E170; // type:function size:0x60 -fn_8028E1D0__18dLytMiniGameTime_cFv = .text:0x8028E1D0; // type:function size:0xC4 +startAlphaIn__18dLytMiniGameTime_cFv = .text:0x8028E0C0; // type:function size:0xAC +startAlphaOut__18dLytMiniGameTime_cFv = .text:0x8028E170; // type:function size:0x60 +startFinish__18dLytMiniGameTime_cFv = .text:0x8028E1D0; // type:function size:0xC4 startLoop__18dLytMiniGameTime_cFv = .text:0x8028E2A0; // type:function size:0x54 setTimerValueInMilliSeconds__18dLytMiniGameTime_cFl = .text:0x8028E300; // type:function size:0x14 updateLongTimer__18dLytMiniGameTime_cFv = .text:0x8028E320; // type:function size:0x198 @@ -15303,7 +15303,7 @@ resetOut__18dLytMiniGameTime_cFv = .text:0x8028E8F0; // type:function size:0x80 resetAlphaIn__18dLytMiniGameTime_cFv = .text:0x8028E970; // type:function size:0x80 resetAlphaOut__18dLytMiniGameTime_cFv = .text:0x8028E9F0; // type:function size:0x80 resetDigits__18dLytMiniGameTime_cFv = .text:0x8028EA70; // type:function size:0x13C -fn_8028EBB0__18dLytMiniGameTime_cFv = .text:0x8028EBB0; // type:function size:0x60 +resetPosition__18dLytMiniGameTime_cFv = .text:0x8028EBB0; // type:function size:0x60 resetShowBestTime__18dLytMiniGameTime_cFv = .text:0x8028EC10; // type:function size:0x8 resetFinish__18dLytMiniGameTime_cFv = .text:0x8028EC20; // type:function size:0x114 resetLoop__18dLytMiniGameTime_cFv = .text:0x8028ED40; // type:function size:0x74 @@ -15321,7 +15321,7 @@ isAlphaOutEndReached__18dLytMiniGameTime_cCFv = .text:0x8028EFE0; // type:functi isFinishEndReached__18dLytMiniGameTime_cCFv = .text:0x8028F030; // type:function size:0x44 setHighestDigitIndex__18dLytMiniGameTime_cFUc = .text:0x8028F080; // type:function size:0x11C setSignChange__18dLytMiniGameTime_cFUl = .text:0x8028F1A0; // type:function size:0x94 -fn_8028F240__18dLytMiniGameTime_cFb = .text:0x8028F240; // type:function size:0x80 +setTimePosition__18dLytMiniGameTime_cFb = .text:0x8028F240; // type:function size:0x80 setBestHasSixDigits__18dLytMiniGameTime_cFb = .text:0x8028F2C0; // type:function size:0xE8 setDigit__18dLytMiniGameTime_cFll = .text:0x8028F3B0; // type:function size:0xB4 setDigitBest__18dLytMiniGameTime_cFll = .text:0x8028F470; // type:function size:0xB4 @@ -15330,43 +15330,43 @@ remove__19dLytMiniGameStart_cFv = .text:0x8028F5F0; // type:function size:0x74 execute__19dLytMiniGameStart_cFv = .text:0x8028F670; // type:function size:0x1BC draw__19dLytMiniGameStart_cFv = .text:0x8028F830; // type:function size:0x48 init__19dLytMiniGameStart_cFv = .text:0x8028F880; // type:function size:0x10C -fn_8028F990 = .text:0x8028F990; // type:function size:0x4C -fn_8028F9E0 = .text:0x8028F9E0; // type:function size:0x60 -fn_8028FA40 = .text:0x8028FA40; // type:function size:0x4C -fn_8028FA90 = .text:0x8028FA90; // type:function size:0x4C -fn_8028FAE0 = .text:0x8028FAE0; // type:function size:0x58 -fn_8028FB40 = .text:0x8028FB40; // type:function size:0x58 -fn_8028FBA0 = .text:0x8028FBA0; // type:function size:0x58 -fn_8028FC00 = .text:0x8028FC00; // type:function size:0x20 -fn_8028FC20 = .text:0x8028FC20; // type:function size:0x54 -fn_8028FC80 = .text:0x8028FC80; // type:function size:0x54 -fn_8028FCE0 = .text:0x8028FCE0; // type:function size:0x54 -fn_8028FD40 = .text:0x8028FD40; // type:function size:0xC -fn_8028FD50 = .text:0x8028FD50; // type:function size:0xC -fn_8028FD60 = .text:0x8028FD60; // type:function size:0xC -fn_8028FD70 = .text:0x8028FD70; // type:function size:0x48 -fn_8028FDC0 = .text:0x8028FDC0; // type:function size:0x48 -fn_8028FE10 = .text:0x8028FE10; // type:function size:0x48 -fn_8028FE60 = .text:0x8028FE60; // type:function size:0x48 -fn_8028FEB0 = .text:0x8028FEB0; // type:function size:0x48 -fn_8028FF00 = .text:0x8028FF00; // type:function size:0x48 +startCountdown__19dLytMiniGameStart_cFv = .text:0x8028F990; // type:function size:0x4C +startCountdown120__19dLytMiniGameStart_cFv = .text:0x8028F9E0; // type:function size:0x60 +startFinish__19dLytMiniGameStart_cFv = .text:0x8028FA40; // type:function size:0x4C +startTimeup__19dLytMiniGameStart_cFv = .text:0x8028FA90; // type:function size:0x4C +isCountdownEndReached__19dLytMiniGameStart_cCFv = .text:0x8028FAE0; // type:function size:0x58 +isFinishEndReached__19dLytMiniGameStart_cCFv = .text:0x8028FB40; // type:function size:0x58 +isTimeupEndReached__19dLytMiniGameStart_cCFv = .text:0x8028FBA0; // type:function size:0x58 +resetPlayedSounds__19dLytMiniGameStart_cFv = .text:0x8028FC00; // type:function size:0x20 +resetCountdown__19dLytMiniGameStart_cFv = .text:0x8028FC20; // type:function size:0x54 +resetFinish__19dLytMiniGameStart_cFv = .text:0x8028FC80; // type:function size:0x54 +resetStart__19dLytMiniGameStart_cFv = .text:0x8028FCE0; // type:function size:0x54 +stopCountdown__19dLytMiniGameStart_cFv = .text:0x8028FD40; // type:function size:0xC +stopFinish__19dLytMiniGameStart_cFv = .text:0x8028FD50; // type:function size:0xC +stopTimeup__19dLytMiniGameStart_cFv = .text:0x8028FD60; // type:function size:0xC +checkCountdown3__19dLytMiniGameStart_cFv = .text:0x8028FD70; // type:function size:0x48 +checkCountdown2__19dLytMiniGameStart_cFv = .text:0x8028FDC0; // type:function size:0x48 +checkCountdown1__19dLytMiniGameStart_cFv = .text:0x8028FE10; // type:function size:0x48 +checkStart__19dLytMiniGameStart_cFv = .text:0x8028FE60; // type:function size:0x48 +checkFinish__19dLytMiniGameStart_cFv = .text:0x8028FEB0; // type:function size:0x48 +checkTimeup__19dLytMiniGameStart_cFv = .text:0x8028FF00; // type:function size:0x48 build__19dLytMiniGameScore_cFPQ23d2d10ResAccIf_c = .text:0x8028FF50; // type:function size:0x168 remove__19dLytMiniGameScore_cFv = .text:0x802900C0; // type:function size:0x74 execute__19dLytMiniGameScore_cFv = .text:0x80290140; // type:function size:0x2EC draw__19dLytMiniGameScore_cFv = .text:0x80290430; // type:function size:0x48 init__19dLytMiniGameScore_cFv = .text:0x80290480; // type:function size:0xF84 -fn_80291410 = .text:0x80291410; // type:function size:0x1A0 -fn_802915B0 = .text:0x802915B0; // type:function size:0x84 -fn_80291640 = .text:0x80291640; // type:function size:0x100 -fn_80291740 = .text:0x80291740; // type:function size:0xEC -fn_80291830 = .text:0x80291830; // type:function size:0xD0 -fn_80291900 = .text:0x80291900; // type:function size:0x60 -fn_80291960 = .text:0x80291960; // type:function size:0xD0 -fn_80291A30 = .text:0x80291A30; // type:function size:0x110 -fn_80291B40 = .text:0x80291B40; // type:function size:0x54 -fn_80291BA0 = .text:0x80291BA0; // type:function size:0x14 -fn_80291BC0 = .text:0x80291BC0; // type:function size:0x178 -fn_80291D40 = .text:0x80291D40; // type:function size:0x10C +fn_80291410__19dLytMiniGameScore_cFv = .text:0x80291410; // type:function size:0x1A0 +fn_802915B0__19dLytMiniGameScore_cFv = .text:0x802915B0; // type:function size:0x84 +fn_80291640__19dLytMiniGameScore_cFv = .text:0x80291640; // type:function size:0x100 +fn_80291740__19dLytMiniGameScore_cFv = .text:0x80291740; // type:function size:0xEC +startAlphaIn__19dLytMiniGameScore_cFv = .text:0x80291830; // type:function size:0xD0 +startAlphaOut__19dLytMiniGameScore_cFv = .text:0x80291900; // type:function size:0x60 +fn_80291960__19dLytMiniGameScore_cFv = .text:0x80291960; // type:function size:0xD0 +fn_80291A30__19dLytMiniGameScore_cFv = .text:0x80291A30; // type:function size:0x110 +startLoop__19dLytMiniGameScore_cFv = .text:0x80291B40; // type:function size:0x54 +fn_80291BA0__19dLytMiniGameScore_cFl = .text:0x80291BA0; // type:function size:0x14 +fn_80291BC0__19dLytMiniGameScore_cFv = .text:0x80291BC0; // type:function size:0x178 +fn_80291D40__19dLytMiniGameScore_cFl = .text:0x80291D40; // type:function size:0x10C fn_80291E50 = .text:0x80291E50; // type:function size:0x34 fn_80291E90 = .text:0x80291E90; // type:function size:0x34 fn_80291ED0 = .text:0x80291ED0; // type:function size:0x14 @@ -20849,7 +20849,7 @@ holdFinisherPromptSound__20dSndSmallEffectMgr_cFPCQ34nw4r4math4VEC3 = .text:0x80 playDowsingPingSound__20dSndSmallEffectMgr_cFff = .text:0x8037E860; // type:function size:0x148 holdDowsingNearestSound__20dSndSmallEffectMgr_cFv = .text:0x8037E9B0; // type:function size:0xC playSirenCountdownSound__20dSndSmallEffectMgr_cFl = .text:0x8037E9C0; // type:function size:0x90 -playMinigameCountdownSound__20dSndSmallEffectMgr_cFv = .text:0x8037EA50; // type:function size:0x8 +playMinigameCountdownSound__20dSndSmallEffectMgr_cFl = .text:0x8037EA50; // type:function size:0x8 playMinigameTimeUpSound__20dSndSmallEffectMgr_cFl = .text:0x8037EA60; // type:function size:0x14 playMinigameStartSound__20dSndSmallEffectMgr_cFv = .text:0x8037EA80; // type:function size:0x8 playMinigameFinishSound__20dSndSmallEffectMgr_cFv = .text:0x8037EA90; // type:function size:0x40 diff --git a/include/d/lyt/d_lyt_mini_game.h b/include/d/lyt/d_lyt_mini_game.h index 8d3f1f9c..af1502b4 100644 --- a/include/d/lyt/d_lyt_mini_game.h +++ b/include/d/lyt/d_lyt_mini_game.h @@ -4,7 +4,9 @@ #include "common.h" #include "d/d_base.h" #include "d/lyt/d2d.h" +#include "d/lyt/d_textbox.h" #include "m/m_vec.h" +#include "nw4r/lyt/lyt_pane.h" /** 2D UI - Mini Game - Pumpkin score popup */ class dLytMiniGamePumpkinParts_c { @@ -119,14 +121,6 @@ private: bool isBug0Flashing() const; bool areAllBugIconsOn() const; - const d2d::AnmGroup_c &getAnm(s32 idx) const { - return mAnm[idx]; - } - - d2d::AnmGroup_c &getAnm(s32 idx) { - return mAnm[idx]; - } - static dLytMiniGameBugs_c *sInstance; /* 0x004 */ d2d::LytBase_c mLyt; @@ -164,9 +158,9 @@ private: void fn_8028DE40(); void fn_8028DED0(); void fn_8028DFD0(); - void fn_8028E0C0(); - void fn_8028E170(); - void fn_8028E1D0(); + void startAlphaIn(); + void startAlphaOut(); + void startFinish(); void startLoop(); void setTimerValueInMilliSeconds(s32 time); void updateLongTimer(); @@ -180,7 +174,7 @@ private: void resetAlphaIn(); void resetAlphaOut(); void resetDigits(); - void fn_8028EBB0(); + void resetPosition(); void resetShowBestTime(); void resetFinish(); void resetLoop(); @@ -198,7 +192,7 @@ private: bool isFinishEndReached() const; void setHighestDigitIndex(u8); void setSignChange(u32); - void fn_8028F240(bool); + void setTimePosition(bool); void setBestHasSixDigits(bool); void setDigit(s32 digitIndex, s32 number); void setDigitBest(s32 digitIndex, s32 number); @@ -221,7 +215,7 @@ private: /* 0x7F5 */ bool mIsVisible; }; -/** 2D UI - Mini Game - Start Popup */ +/** 2D UI - Mini Game - Start / Finish Popup */ class dLytMiniGameStart_c { public: dLytMiniGameStart_c() {} @@ -234,31 +228,33 @@ public: void init(); private: - static dLytMiniGameStart_c *sInstance; + void startCountdown(); + void startCountdown120(); + void startFinish(); + void startTimeup(); + bool isCountdownEndReached() const; + bool isFinishEndReached() const; + bool isTimeupEndReached() const; + void resetPlayedSounds(); + void resetCountdown(); + void resetFinish(); + void resetStart(); + void stopCountdown(); + void stopFinish(); + void stopTimeup(); + bool checkCountdown3(); + bool checkCountdown2(); + bool checkCountdown1(); + bool checkStart(); + bool checkFinish(); + bool checkTimeup(); - void fn_8028F990(); - void fn_8028F9E0(); - void fn_8028FA40(); - void fn_8028FA90(); - void fn_8028FAE0(); - void fn_8028FB40(); - void fn_8028FBA0(); - void fn_8028FC00(); - void fn_8028FC20(); - void fn_8028FC80(); - void fn_8028FCE0(); - void fn_8028FD40(); - void fn_8028FD50(); - void fn_8028FD60(); - void fn_8028FD70(); - void fn_8028FDC0(); - void fn_8028FE10(); - void fn_8028FE60(); - void fn_8028FEB0(); - void fn_8028FF00(); + static dLytMiniGameStart_c *sInstance; /* 0x004 */ d2d::LytBase_c mLyt; /* 0x094 */ d2d::AnmGroup_c mAnm[3]; + /* 0x154 */ bool mPlayedSounds[6]; + /* 0x15A */ bool mIsVisible; }; /** 2D UI - Mini Game - Score counter */ @@ -274,29 +270,27 @@ public: void init(); private: - static dLytMiniGameScore_c *sInstance; - void fn_80291410(); void fn_802915B0(); void fn_80291640(); void fn_80291740(); - void fn_80291830(); - void fn_80291900(); + void startAlphaIn(); + void startAlphaOut(); void fn_80291960(); void fn_80291A30(); - void fn_80291B40(); - void fn_80291BA0(); + void startLoop(); + void fn_80291BA0(s32 score); void fn_80291BC0(); - void fn_80291D40(); - void fn_80291E50(); + void fn_80291D40(s32 arg); + bool fn_80291E50() const; void fn_80291E90(); void fn_80291ED0(); void fn_80291EF0(); - void fn_80292030(); + void fn_80292030(s32); void fn_80292040(); void fn_802920B0(); void fn_80292110(); - void fn_802921A0(); + void setDigit(s32 digitIndex, s32 number); void fn_80292240(); void fn_80292250(); void fn_802922F0(); @@ -310,24 +304,61 @@ private: void fn_80292880(); void fn_80292910(); void fn_80292920(); - void fn_80292930(); + bool fn_80292930() const; void fn_80292940(); void fn_80292950(); void fn_802929C0(); void fn_80292A40(); - void fn_80292A50(); - void fn_80292AA0(); - void fn_80292AF0(); - void fn_80292B40(); - void fn_80292B90(); - void fn_80292BE0(); + bool fn_80292A50() const; + bool fn_80292AA0() const; + bool fn_80292AF0() const; + bool fn_80292B40() const; + bool fn_80292B90() const; + bool fn_80292BE0() const; void fn_80292C30(); - void fn_802933A0(); + void fn_802933A0(s32 variant); void fn_80293410(); - void fn_80293450(); + void fn_80293450(s32); + + static dLytMiniGameScore_c *sInstance; /* 0x004 */ d2d::LytBase_c mLyt; /* 0x094 */ d2d::AnmGroup_c mAnm[26]; + + /* 0x714 */ nw4r::lyt::Pane *mpPanes[20]; + + /* 0x764 */ f32 mFloats[26]; + + /* 0x7CC */ dTextBox_c *mpTextBoxes[3]; + + /* 0x7D8 */ s32 field_0x7D8; + + /* 0x7DC */ UNKWORD field_0x7DC; + /* 0x7E0 */ s32 field_0x7E0; + /* 0x7E4 */ UNKWORD field_0x7E4; + + /* 0x7E8 */ f32 field_0x7E8; + /* 0x7EC */ u8 _0x7EC[0x7FC - 0x7EC]; + + /* 0x7FC */ s32 field_0x7FC; + /* 0x800 */ s32 field_0x800; + /* 0x804 */ bool field_0x804; + /* 0x808 */ s32 field_0x808; + /* 0x80C */ s32 field_0x80C; + /* 0x810 */ s32 field_0x810; + /* 0x814 */ bool field_0x814; + /* 0x815 */ bool field_0x815; + /* 0x816 */ bool field_0x816; + /* 0x818 */ s32 field_0x818; + /* 0x81C */ s32 field_0x81C; + /* 0x820 */ bool field_0x820; + /* 0x824 */ s32 field_0x824; + /* 0x829 */ bool field_0x828; + /* 0x829 */ bool field_0x829; + /* 0x82C */ UNKWORD field_0x82C; + /* 0x830 */ s32 field_0x830; + /* 0x834 */ f32 field_0x834[3][2]; + /* 0x84C */ bool mIsVisible; }; /** 2D UI - Mini Game - Fun Fun Island score */ @@ -342,6 +373,9 @@ public: bool draw(); void init(); +private: + static dLytMiniGameScoreSd_c *sInstance; + void fn_80293A30(); void fn_80293A90(); void fn_80293AF0(); @@ -358,9 +392,6 @@ public: void fn_80294030(); void fn_80294080(); -private: - static dLytMiniGameScoreSd_c *sInstance; - /* 0x004 */ d2d::LytBase_c mLyt; /* 0x094 */ d2d::AnmGroup_c mAnm[5]; }; @@ -436,7 +467,7 @@ private: /* 0x33E4 */ dLytMiniGamePumpkin_c mPumpkin; // TODO - u8 _0x___[0x14E]; + u8 _0x___[0xA]; bool field_0x3866; }; diff --git a/include/d/snd/d_snd_small_effect_mgr.h b/include/d/snd/d_snd_small_effect_mgr.h index a47fc559..8631e6fe 100644 --- a/include/d/snd/d_snd_small_effect_mgr.h +++ b/include/d/snd/d_snd_small_effect_mgr.h @@ -56,7 +56,7 @@ public: bool holdDowsingNearestSound(); bool playSirenCountdownSound(s32 timer); - bool playMinigameCountdownSound(); + bool playMinigameCountdownSound(s32 timer); ///< timer is unused bool playMinigameTimeUpSound(s32 timer); bool playMinigameStartSound(); bool playMinigameFinishSound(); diff --git a/include/m/m_vec.h b/include/m/m_vec.h index 212ac47d..dedc21f4 100644 --- a/include/m/m_vec.h +++ b/include/m/m_vec.h @@ -318,6 +318,10 @@ public: return mVec2_c(x * f, y * f); } + mVec2_c operator/(f32 f) const { + return mVec2_c(x / f, y / f); + } + mVec2_c operator+(const mVec2_c &v) const { return mVec2_c(x + v.x, y + v.y); } diff --git a/src/d/lyt/d_lyt_mini_game.cpp b/src/d/lyt/d_lyt_mini_game.cpp index 9a6b73b7..8d45db0b 100644 --- a/src/d/lyt/d_lyt_mini_game.cpp +++ b/src/d/lyt/d_lyt_mini_game.cpp @@ -4,10 +4,14 @@ #include "d/a/d_a_item.h" #include "d/a/d_a_itembase.h" #include "d/d_lang.h" +#include "d/d_message.h" #include "d/lyt/d2d.h" #include "d/snd/d_snd_small_effect_mgr.h" #include "d/snd/d_snd_wzsound.h" #include "m/m_vec.h" +#include "nw4r/lyt/lyt_pane.h" +#include "nw4r/math/math_arithmetic.h" +#include "nw4r/math/math_types.h" #include "toBeSorted/d_d3d.h" static const d2d::LytBrlanMapping brlanMapPumpkin[] = { @@ -906,7 +910,7 @@ void dLytMiniGameTime_c::init() { resetAlphaOut(); resetOut(); resetDigits(); - fn_8028EBB0(); + resetPosition(); resetShowBestTime(); resetFinish(); resetLoop(); @@ -1008,7 +1012,7 @@ void dLytMiniGameTime_c::fn_8028DFD0() { } } -void dLytMiniGameTime_c::fn_8028E0C0() { +void dLytMiniGameTime_c::startAlphaIn() { if (sInstance == nullptr) { return; } @@ -1025,7 +1029,7 @@ void dLytMiniGameTime_c::fn_8028E0C0() { mIsVisible = true; } -void dLytMiniGameTime_c::fn_8028E170() { +void dLytMiniGameTime_c::startAlphaOut() { if (sInstance == nullptr) { return; } @@ -1034,7 +1038,7 @@ void dLytMiniGameTime_c::fn_8028E170() { mAnm[TIME_ANIM_ALPHA_OUT].setAnimEnable(true); } -void dLytMiniGameTime_c::fn_8028E1D0() { +void dLytMiniGameTime_c::startFinish() { if (sInstance == nullptr) { return; } @@ -1057,42 +1061,41 @@ void dLytMiniGameTime_c::startLoop() { mAnm[TIME_ANIM_LOOP_TIME].setAnimEnable(true); } -void dLytMiniGameTime_c::setTimerValueInMilliSeconds(s32 a) { +void dLytMiniGameTime_c::setTimerValueInMilliSeconds(s32 time) { if (sInstance == nullptr) { return; } - mCurrentTimerValueMilliSeconds = a; + mCurrentTimerValueMilliSeconds = time; } void dLytMiniGameTime_c::updateLongTimer() { - s32 msec = mCurrentTimerValueMilliSeconds % 1000; - s32 sec = mCurrentTimerValueMilliSeconds / 1000; - s32 csec = msec / 10; - s32 min = sec / 60; - s32 sec1 = sec % 60; + s32 seconds; + s32 timeSeconds = mCurrentTimerValueMilliSeconds / 1000; + s32 centiSeconds = (mCurrentTimerValueMilliSeconds % 1000) / 10; + seconds = timeSeconds % 60; - mCurrentTimerValueSeconds = sec1 + min * 60; + mCurrentTimerValueSeconds = seconds + (timeSeconds / 60) * 60; s32 digits[6]; // ten-minutes - digits[5] = min / 10; + digits[5] = (timeSeconds / 60) / 10; // minutes - digits[4] = min % 10; + digits[4] = (timeSeconds / 60) % 10; // ten-seconds - digits[3] = sec1 / 10; + digits[3] = seconds / 10; // seconds - digits[2] = sec1 % 10; + digits[2] = seconds % 10; // tenths-of-a-second - digits[1] = csec / 10; + digits[1] = centiSeconds / 10; // hundredths-of-a-second - digits[0] = csec % 10; + digits[0] = centiSeconds % 10; if (digits[5] != 0) { mHighestDigitIndex = 5; - fn_8028F240(true); + setTimePosition(true); } else { mHighestDigitIndex = 4; - fn_8028F240(false); + setTimePosition(false); } for (int i = 0; i <= mHighestDigitIndex; i++) { @@ -1144,26 +1147,25 @@ void dLytMiniGameTime_c::setBestTime(s32 time) { } s32 offset = 1; + s32 seconds; - s32 msec = time % 1000; - s32 sec = time / 1000; - s32 csec = msec / 10; - s32 min = sec / 60; - s32 sec1 = sec % 60; + s32 timeSeconds = time / 1000; + s32 centiSeconds = time % 1000 / 10; + seconds = timeSeconds % 60; s32 digits[6]; // ten-minutes - digits[5] = min / 10; + digits[5] = (timeSeconds / 60) / 10; // minutes - digits[4] = min % 10; + digits[4] = (timeSeconds / 60) % 10; // ten-seconds - digits[3] = sec1 / 10; + digits[3] = seconds / 10; // seconds - digits[2] = sec1 % 10; + digits[2] = seconds % 10; // tenths-of-a-second - digits[1] = csec / 10; + digits[1] = centiSeconds / 10; // hundredths-of-a-second - digits[0] = csec % 10; + digits[0] = centiSeconds % 10; if (digits[5] != 0) { offset = 0; @@ -1263,10 +1265,10 @@ void dLytMiniGameTime_c::resetDigits() { } } -void dLytMiniGameTime_c::fn_8028EBB0() { +void dLytMiniGameTime_c::resetPosition() { switch (mTimerVariant) { case TIMER_LONG: - fn_8028F240(false); + setTimePosition(false); setBestHasSixDigits(false); break; case TIMER_SECONDS: setHighestDigitIndex(0); break; @@ -1415,7 +1417,7 @@ void dLytMiniGameTime_c::setSignChange(u32 arg) { mAnm[TIME_ANIM_SIGN_CHANGE].setAnimEnable(false); } -void dLytMiniGameTime_c::fn_8028F240(bool b) { +void dLytMiniGameTime_c::setTimePosition(bool b) { f32 frame = 0.0f; if (b) { frame = 1.0f; @@ -1483,6 +1485,10 @@ static const d2d::LytBrlanMapping brlanMapStart[] = { { "start_00_finish.brlan", "G_timeUp_00"}, }; +#define START_ANIM_COUNTDOWN 0 +#define START_ANIM_FINISH 1 +#define START_ANIM_TIMEUP 2 + #define START_NUM_ANIMS 3 bool dLytMiniGameStart_c::build(d2d::ResAccIf_c *resAcc) { @@ -1517,13 +1523,55 @@ bool dLytMiniGameStart_c::execute() { return true; } - for (int i = 0; i < START_NUM_ANIMS; i++) { - if (mAnm[i].isEnabled()) { - mAnm[i].play(); + if (mIsVisible) { + if (checkCountdown3()) { + dSndSmallEffectMgr_c::GetInstance()->playMinigameCountdownSound(3); } - } - mLyt.calc(); + if (checkCountdown2()) { + dSndSmallEffectMgr_c::GetInstance()->playMinigameCountdownSound(2); + } + + if (checkCountdown1()) { + dSndSmallEffectMgr_c::GetInstance()->playMinigameCountdownSound(1); + } + + if (checkStart()) { + dSndSmallEffectMgr_c::GetInstance()->playMinigameStartSound(); + } + + if (checkFinish()) { + dSndSmallEffectMgr_c::GetInstance()->playMinigameFinishSound(); + } + + if (checkTimeup()) { + dSndSmallEffectMgr_c::GetInstance()->playMinigameFinishSound(); + } + + if (isCountdownEndReached()) { + stopCountdown(); + mIsVisible = false; + } + + if (isFinishEndReached()) { + stopFinish(); + resetPlayedSounds(); + mIsVisible = false; + } + + if (isTimeupEndReached()) { + stopFinish(); + resetPlayedSounds(); + mIsVisible = false; + } + + for (int i = 0; i < START_NUM_ANIMS; i++) { + if (mAnm[i].isEnabled()) { + mAnm[i].play(); + } + } + mLyt.calc(); + } return true; } @@ -1532,12 +1580,193 @@ bool dLytMiniGameStart_c::draw() { if (sInstance == nullptr) { return true; } - mLyt.addToDrawList(); + + if (mIsVisible) { + mLyt.addToDrawList(); + } return true; } void dLytMiniGameStart_c::init() { - // TODO - ... + if (sInstance == nullptr) { + return; + } + + mAnm[START_ANIM_COUNTDOWN].setForwardOnce(); + mAnm[START_ANIM_COUNTDOWN].setToEnd2(); + mAnm[START_ANIM_COUNTDOWN].setAnimEnable(true); + + mAnm[START_ANIM_FINISH].setForwardOnce(); + mAnm[START_ANIM_FINISH].setToEnd2(); + mAnm[START_ANIM_FINISH].setAnimEnable(true); + + mAnm[START_ANIM_TIMEUP].setForwardOnce(); + mAnm[START_ANIM_TIMEUP].setToEnd2(); + mAnm[START_ANIM_TIMEUP].setAnimEnable(true); + + mLyt.calc(); + + mAnm[START_ANIM_COUNTDOWN].setAnimEnable(false); + mAnm[START_ANIM_FINISH].setAnimEnable(false); + mAnm[START_ANIM_TIMEUP].setAnimEnable(false); + + resetPlayedSounds(); +} + +void dLytMiniGameStart_c::startCountdown() { + if (sInstance == nullptr) { + return; + } + + resetCountdown(); + mAnm[START_ANIM_COUNTDOWN].setAnimEnable(true); + mIsVisible = true; +} + +void dLytMiniGameStart_c::startCountdown120() { + if (sInstance == nullptr) { + return; + } + + resetCountdown(); + mAnm[START_ANIM_COUNTDOWN].setAnimEnable(true); + mAnm[START_ANIM_COUNTDOWN].setFrame(120.0f); + mIsVisible = true; +} + +void dLytMiniGameStart_c::startFinish() { + if (sInstance == nullptr) { + return; + } + + resetFinish(); + mAnm[START_ANIM_FINISH].setAnimEnable(true); + mIsVisible = true; +} + +void dLytMiniGameStart_c::startTimeup() { + if (sInstance == nullptr) { + return; + } + + resetStart(); + mAnm[START_ANIM_TIMEUP].setAnimEnable(true); + mIsVisible = true; +} + +bool dLytMiniGameStart_c::isCountdownEndReached() const { + if (sInstance == nullptr) { + return false; + } + if (mAnm[START_ANIM_COUNTDOWN].isEnabled() && mAnm[START_ANIM_COUNTDOWN].isEndReached()) { + return true; + } + return false; +} + +bool dLytMiniGameStart_c::isFinishEndReached() const { + if (sInstance == nullptr) { + return false; + } + if (mAnm[START_ANIM_FINISH].isEnabled() && mAnm[START_ANIM_FINISH].isEndReached()) { + return true; + } + return false; +} + +bool dLytMiniGameStart_c::isTimeupEndReached() const { + if (sInstance == nullptr) { + return false; + } + if (mAnm[START_ANIM_TIMEUP].isEnabled() && mAnm[START_ANIM_TIMEUP].isEndReached()) { + return true; + } + return false; +} + +void dLytMiniGameStart_c::resetPlayedSounds() { + for (int i = 0; i < 6; i++) { + mPlayedSounds[i] = false; + } +} + +void dLytMiniGameStart_c::resetCountdown() { + mAnm[START_ANIM_COUNTDOWN].setForwardOnce(); + mAnm[START_ANIM_COUNTDOWN].setFrame(0.0f); + mAnm[START_ANIM_COUNTDOWN].setAnimEnable(false); +} + +void dLytMiniGameStart_c::resetFinish() { + mAnm[START_ANIM_FINISH].setForwardOnce(); + mAnm[START_ANIM_FINISH].setFrame(0.0f); + mAnm[START_ANIM_FINISH].setAnimEnable(false); +} + +void dLytMiniGameStart_c::resetStart() { + mAnm[START_ANIM_TIMEUP].setForwardOnce(); + mAnm[START_ANIM_TIMEUP].setFrame(0.0f); + mAnm[START_ANIM_TIMEUP].setAnimEnable(false); +} + +void dLytMiniGameStart_c::stopCountdown() { + mAnm[START_ANIM_COUNTDOWN].setAnimEnable(false); +} + +void dLytMiniGameStart_c::stopFinish() { + mAnm[START_ANIM_FINISH].setAnimEnable(false); +} + +void dLytMiniGameStart_c::stopTimeup() { + mAnm[START_ANIM_TIMEUP].setAnimEnable(false); +} + +bool dLytMiniGameStart_c::checkCountdown3() { + if (mAnm[START_ANIM_COUNTDOWN].isEnabled() && !mPlayedSounds[0] && 32.0f <= mAnm[START_ANIM_COUNTDOWN].getFrame()) { + mPlayedSounds[0] = true; + return true; + } + return false; +} + +bool dLytMiniGameStart_c::checkCountdown2() { + if (mAnm[START_ANIM_COUNTDOWN].isEnabled() && !mPlayedSounds[1] && 62.0f <= mAnm[START_ANIM_COUNTDOWN].getFrame()) { + mPlayedSounds[1] = true; + return true; + } + return false; +} + +bool dLytMiniGameStart_c::checkCountdown1() { + if (mAnm[START_ANIM_COUNTDOWN].isEnabled() && !mPlayedSounds[2] && 92.0f <= mAnm[START_ANIM_COUNTDOWN].getFrame()) { + mPlayedSounds[2] = true; + return true; + } + return false; +} + +bool dLytMiniGameStart_c::checkStart() { + if (mAnm[START_ANIM_COUNTDOWN].isEnabled() && !mPlayedSounds[3] && + 122.0f <= mAnm[START_ANIM_COUNTDOWN].getFrame()) { + mPlayedSounds[3] = true; + return true; + } + return false; +} + +bool dLytMiniGameStart_c::checkFinish() { + if (mAnm[START_ANIM_FINISH].isEnabled() && !mPlayedSounds[4] && 0.0f <= mAnm[START_ANIM_FINISH].getFrame()) { + mPlayedSounds[4] = true; + return true; + } + return false; +} + +bool dLytMiniGameStart_c::checkTimeup() { + if (mAnm[START_ANIM_TIMEUP].isEnabled() && !mPlayedSounds[5] && 0.0f <= mAnm[START_ANIM_TIMEUP].getFrame()) { + mPlayedSounds[5] = true; + return true; + } + return false; } static const d2d::LytBrlanMapping brlanMapScore[] = { @@ -1569,7 +1798,43 @@ static const d2d::LytBrlanMapping brlanMapScore[] = { { "miniGameScore_00_alphaOut.brlan", "G_alphaInOut_00"}, }; +#define SCORE_ANIM_IN 0 +#define SCORE_ANIM_ALPHA_IN 1 +#define SCORE_ANIM_OUT 2 +#define SCORE_ANIM_0_TO_9_OFFSET 3 + +#define SCORE_ANIM_SET_POSITION 8 + +#define SCORE_ANIM_GET_SCORE_OFFSET 9 +#define SCORE_ANIM_GET_SCORE_GET_TEXT_F 14 +#define SCORE_ANIM_FINISH_SCORE_OFFSET 15 +#define SCORE_ANIM_FINISH_SCORE_GET_SCORE_W 20 +#define SCORE_ANIM_FINISH_SCORE_GET_SCORE_X 21 +#define SCORE_ANIM_FINISH_SCORE_GET_SCORE_F 22 + +#define SCORE_ANIM_LOOP_SCORE 23 +#define SCORE_ANIM_RUPEE_CHANGE 24 +#define SCORE_ANIM_ALPHA_OUT 25 + #define SCORE_NUM_ANIMS 26 +#define SCORE_NUM_DIGITS 5 + +static const char *sScoreTextBoxes[] = { + "T_unitText_00", + "T_unitTextS_00", + "T_unitTextF_00", +}; + +#define SCORE_NUM_TEXTBOXES 3 + +static const char *sScorePanes[] = { + "N_center_00", "N_positionAll_00", "N_position_00", "N_unit_00", "N_bg_00", + "P_bgBase_00", "P_bgFrameS_00", "P_bgFrameS_01", "P_bgFrameS_02", "P_bgFrame_00", + "P_bgFrame_01", "P_bgFrame_02", "P_target_00", "P_rupy_00", "P_question_00", + "P_position_00", "P_position_01", "P_position_02", "P_position_03", "P_position_04", +}; + +#define SCORE_NUM_PANES 20 bool dLytMiniGameScore_c::build(d2d::ResAccIf_c *resAcc) { mLyt.setResAcc(resAcc); @@ -1579,6 +1844,21 @@ bool dLytMiniGameScore_c::build(d2d::ResAccIf_c *resAcc) { mAnm[i].init(brlanMapScore[i].mFile, resAcc, mLyt.getLayout(), brlanMapScore[i].mName); mAnm[i].bind(false); mAnm[i].setRate(1.0f); + mAnm[i].setAnimEnable(false); + } + + for (int i = 0; i < SCORE_NUM_TEXTBOXES; i++) { + mpTextBoxes[i] = mLyt.getTextBox(sScoreTextBoxes[i]); + } + + for (int i = 0; i < SCORE_NUM_PANES; i++) { + mpPanes[i] = mLyt.findPane(sScorePanes[i]); + } + + for (int i = 0; i < 3; i++) { + const nw4r::math::VEC3 &translate = mpPanes[i + 2]->GetTranslate(); + field_0x834[i][0] = translate.x; + field_0x834[i][1] = translate.y; } sInstance = this; @@ -1603,13 +1883,100 @@ bool dLytMiniGameScore_c::execute() { return true; } - for (int i = 0; i < SCORE_NUM_ANIMS; i++) { - if (mAnm[i].isEnabled()) { - mAnm[i].play(); + if (field_0x804) { + if (field_0x80C-- == 0) { + field_0x804 = false; + field_0x829 = false; + } else { + fn_80292030(field_0x810); } } - mLyt.calc(); + if (mIsVisible) { + fn_80291BC0(); + if (!field_0x816) { + switch (field_0x818) { + case 0: + if (fn_80291E50()) { + fn_80291960(); + } + break; + case 2: + if (field_0x829) { + if (fn_80291E50()) { + fn_80291960(); + } + fn_80291E90(); + field_0x829 = false; + } + break; + case 1: + if (field_0x7D8 != 1) { + if (fn_80291E50()) { + fn_80291960(); + } + } + break; + case 3: + case 4: + if (fn_80291E50()) { + fn_80291960(); + } + break; + } + } + + if (fn_80292A50()) { + fn_80292910(); + field_0x814 = true; + } + + if (fn_80292AA0()) { + fn_80292920(); + fn_80292A40(); + fn_80292880(); + mIsVisible = false; + } + + if (fn_80292AF0()) { + fn_80292930(); + if (field_0x816) { + startLoop(); + } + } + + if (fn_80292B40()) { + fn_80292940(); + if (field_0x816) { + fn_80292A40(); + fn_80292880(); + } + mIsVisible = false; + } + + if (fn_80292B90()) { + fn_80292950(); + } + + if (fn_80292BE0()) { + fn_802929C0(); + startLoop(); + } + + for (int i = 0; i < SCORE_NUM_ANIMS; i++) { + if (mAnm[i].isEnabled()) { + mAnm[i].play(); + } + } + + mLyt.calc(); + } + + if (!field_0x816 && field_0x818 == 0 && fn_80291E50()) { + dSndSmallEffectMgr_c::GetInstance()->playMinigameScoreUpSound(field_0x7D8); + } + + fn_80292240(); return true; } @@ -1618,14 +1985,747 @@ bool dLytMiniGameScore_c::draw() { if (sInstance == nullptr) { return true; } - mLyt.addToDrawList(); + if (mIsVisible) { + mLyt.addToDrawList(); + } return true; } void dLytMiniGameScore_c::init() { - // TODO - ... + if (sInstance == nullptr) { + return; + } + + // TODO here are floats (0.0f) initialized on the stack + // in an interesting order. Those stack slots are used in + // the TODOs below, but I haven't figured out how it really works yet. + // An array of 10 floats seems the most reasonable + // (5 mVec2_c-s already cause too much stack space to be used) + + f32 temp[10]; + for (int i = 9; i >= 0; i--) { + temp[i] = 0.0f; + } + + mAnm[SCORE_ANIM_IN].setForwardOnce(); + mAnm[SCORE_ANIM_IN].setToEnd2(); + mAnm[SCORE_ANIM_IN].setAnimEnable(true); + mLyt.calc(); + mAnm[SCORE_ANIM_IN].setAnimEnable(false); + + switch (field_0x818) { + case 0: + field_0x82C = 0; + field_0x81C = 21; + field_0x7E4 = 4; + dMessage_c::getGlobalTagProcessor()->setNumericArg0(field_0x7D8); + fn_802933A0(1); + fn_80293410(); + switch (field_0x830) { + case 1: + mpTextBoxes[0]->SetTextPositionH(0); + mpTextBoxes[1]->SetTextPositionH(0); + mpTextBoxes[2]->SetTextPositionH(0); + break; + case 2: + mpTextBoxes[0]->SetTextPositionH(2); + mpTextBoxes[1]->SetTextPositionH(2); + mpTextBoxes[2]->SetTextPositionH(2); + break; + } + + field_0x7E8 = mpTextBoxes[0]->GetLineWidth(nullptr); + for (int i = 0; i < field_0x7E4; i++) { + mAnm[SCORE_ANIM_SET_POSITION].setFrame(field_0x81C + i); + mAnm[SCORE_ANIM_SET_POSITION].setAnimEnable(true); + mLyt.calc(); + mAnm[SCORE_ANIM_SET_POSITION].setAnimEnable(false); + + // TODO + nw4r::lyt::Pane *p1 = mpPanes[15]; + nw4r::lyt::Pane *p2 = mpPanes[i + 15]; + mFloats[field_0x81C + i] = field_0x7E8 + (p2->GetSize().width * (p2->GetScale().x / 2.0f)) + + (p1->GetSize().width * (p1->GetScale().x / 2.0f)) + + (p1->GetParent()->GetTranslate().x + p1->GetTranslate().x) - + (p2->GetParent()->GetTranslate().x + p2->GetTranslate().x); + mFloats[field_0x81C + i] += field_0x7FC; + mFloats[field_0x81C + i] += field_0x800; + } + + fn_80293450(field_0x81C); + break; + case 1: + field_0x830 = 0; + field_0x82C = 0; + field_0x81C = 11; + field_0x7E4 = 2; + + for (int i = 0; i < field_0x7E4; i++) { + mAnm[SCORE_ANIM_SET_POSITION].setFrame(field_0x81C + i); + mAnm[SCORE_ANIM_SET_POSITION].setAnimEnable(true); + mLyt.calc(); + mAnm[SCORE_ANIM_SET_POSITION].setAnimEnable(false); + + // init+0x474 + + /* + // Cleaned up m2c output to make the stack operations easier to understand. + // This looks like 5x2 f32, which matches the initialization sequence at the start + // of the function. Note that the stack vars aren't ever read; they're only written. + // There are some unused results here (e.g. the height * scale.y...), but I don't know + // why... + + nw4r::lyt::Pane *p1 = this->unk750; + nw4r::lyt::Pane *p2 = this->unk74C; + + sp8 = p2->mScale.x; // unused + spC = p2->mScale.y; // unused + + sp10 = p2->mParent->mTranslate.x + p2->mTranslate.x; + sp14 = p2->mTranslate.y; // unused + + sp18 = p1->mParent->mTranslate.x + p1->mTranslate.x; + sp1C = p1->mTranslate.y; // unused + + sp20 = p2->mSize.width * p2->mScale.x; + sp24 = p2->mSize.height * p2->mScale.y; // unused + + sp28 = p1->mSize.width * p1->mScale.x; + sp2C = p1->mSize.height * p1->mScale.y; // unused + + this->mFloats[field_0x81C + i] = (f32) ((sp20 * 0.5f) + ((sp28 * 0.5f) + (sp18 - sp10))); + */ + + nw4r::lyt::Pane *p1 = mpPanes[15]; + nw4r::lyt::Pane *p2 = mpPanes[14]; + + // TODO + mFloats[field_0x81C + i] = (p2->GetSize().width * p2->GetScale().x / 2.0f) + + (p1->GetSize().width * p1->GetScale().x / 2.0f) + + (p1->GetParent()->GetTranslate().x + p1->GetTranslate().x) - + (p2->GetParent()->GetTranslate().x + p2->GetTranslate().x); + } + + for (int i = 0; i < field_0x7E4; i++) { + mAnm[SCORE_ANIM_SET_POSITION].setFrame(field_0x81C + i + 2); + mAnm[SCORE_ANIM_SET_POSITION].setAnimEnable(true); + mLyt.calc(); + mAnm[SCORE_ANIM_SET_POSITION].setAnimEnable(false); + + // TODO + nw4r::lyt::Pane *p1 = mpPanes[15]; + nw4r::lyt::Pane *p2 = mpPanes[14]; + mFloats[field_0x81C + i + 2] = (p2->GetSize().width * p2->GetScale().x / 2.0f) + + (p1->GetSize().width * p1->GetScale().x / 2.0f) + + (p1->GetParent()->GetTranslate().x + p1->GetTranslate().x) - + (p2->GetParent()->GetTranslate().x + p2->GetTranslate().x); + } + + mAnm[SCORE_ANIM_RUPEE_CHANGE].setFrame(5.0f); + mAnm[SCORE_ANIM_RUPEE_CHANGE].setAnimEnable(true); + mLyt.calc(); + mAnm[SCORE_ANIM_RUPEE_CHANGE].setAnimEnable(false); + + for (int i = 0; i < field_0x7E4; i++) { + mAnm[SCORE_ANIM_SET_POSITION].setFrame(field_0x81C + i + 4); + mAnm[SCORE_ANIM_SET_POSITION].setAnimEnable(true); + mLyt.calc(); + mAnm[SCORE_ANIM_SET_POSITION].setAnimEnable(false); + + // TODO + nw4r::lyt::Pane *p1 = mpPanes[15]; + nw4r::lyt::Pane *p2 = mpPanes[14]; + mFloats[field_0x81C + i + 4] = (p2->GetSize().width * p2->GetScale().x / 2.0f) + + (p1->GetSize().width * p1->GetScale().x / 2.0f) + + (p1->GetParent()->GetTranslate().x + p1->GetTranslate().x) - + (p2->GetParent()->GetTranslate().x + p2->GetTranslate().x); + } + + mAnm[SCORE_ANIM_RUPEE_CHANGE].setFrame(4.0f); + mAnm[SCORE_ANIM_RUPEE_CHANGE].setAnimEnable(true); + mLyt.calc(); + mAnm[SCORE_ANIM_RUPEE_CHANGE].setAnimEnable(false); + + for (int i = 0; i < field_0x7E4; i++) { + mAnm[SCORE_ANIM_SET_POSITION].setFrame(field_0x81C + i + 6); + mAnm[SCORE_ANIM_SET_POSITION].setAnimEnable(true); + mLyt.calc(); + mAnm[SCORE_ANIM_SET_POSITION].setAnimEnable(false); + + // TODO + nw4r::lyt::Pane *p1 = mpPanes[15]; + nw4r::lyt::Pane *p2 = mpPanes[13]; + mFloats[field_0x81C + i + 6] = (p2->GetSize().width * p2->GetScale().x / 2.0f) + + (p1->GetSize().width * p1->GetScale().x / 2.0f) + + (p1->GetParent()->GetTranslate().x + p1->GetTranslate().x) - + (p2->GetParent()->GetTranslate().x + p2->GetTranslate().x); + } + fn_80293450(field_0x81C); + break; + case 2: + field_0x830 = 0; + field_0x82C = 0; + field_0x81C = 6; + field_0x7E4 = 5; + + for (int i = 0; i < field_0x7E4; i++) { + mAnm[SCORE_ANIM_SET_POSITION].setFrame(field_0x81C + i); + mAnm[SCORE_ANIM_SET_POSITION].setAnimEnable(true); + mLyt.calc(); + mAnm[SCORE_ANIM_SET_POSITION].setAnimEnable(false); + + // TODO + nw4r::lyt::Pane *p1 = mpPanes[15]; + nw4r::lyt::Pane *p2 = mpPanes[14]; + mFloats[field_0x81C + i + 8] = (p2->GetSize().width * p2->GetScale().x / 2.0f) + + (p1->GetSize().width * p1->GetScale().x / 2.0f) + + (p1->GetParent()->GetTranslate().x + p1->GetTranslate().x) - + (p2->GetParent()->GetTranslate().x + p2->GetTranslate().x); + } + + fn_80293450(field_0x81C); + break; + case 3: + field_0x82C = 0; + field_0x81C = 21; + field_0x7E4 = 4; + dMessage_c::getGlobalTagProcessor()->setNumericArg0(field_0x7D8); + fn_802933A0(1); + fn_80293410(); + switch (field_0x830) { + case 1: + mpTextBoxes[0]->SetTextPositionH(0); + mpTextBoxes[1]->SetTextPositionH(0); + mpTextBoxes[2]->SetTextPositionH(0); + break; + case 2: + mpTextBoxes[0]->SetTextPositionH(2); + mpTextBoxes[1]->SetTextPositionH(2); + mpTextBoxes[2]->SetTextPositionH(2); + break; + } + + field_0x7E8 = mpTextBoxes[0]->GetLineWidth(nullptr); + for (int i = 0; i < field_0x7E4; i++) { + mAnm[SCORE_ANIM_SET_POSITION].setFrame(field_0x81C + i); + mAnm[SCORE_ANIM_SET_POSITION].setAnimEnable(true); + mLyt.calc(); + mAnm[SCORE_ANIM_SET_POSITION].setAnimEnable(false); + + // TODO + nw4r::lyt::Pane *p1 = mpPanes[15]; + nw4r::lyt::Pane *p2 = mpPanes[i + 15]; + mFloats[field_0x81C + i] = field_0x7E8 + (p2->GetSize().width * p2->GetScale().x / 2.0f) + + (p1->GetSize().width * p1->GetScale().x / 2.0f) + + (p1->GetParent()->GetTranslate().x + p1->GetTranslate().x) - + (p2->GetParent()->GetTranslate().x + p2->GetTranslate().x); + mFloats[field_0x81C + i] += field_0x7FC; + mFloats[field_0x81C + i] += field_0x800; + } + + fn_80293450(field_0x81C); + break; + case 4: + field_0x830 = 0; + field_0x82C = 0; + field_0x81C = 19; + field_0x7E4 = 2; + + for (int i = 0; i < field_0x7E4; i++) { + mAnm[SCORE_ANIM_SET_POSITION].setFrame(field_0x81C + i); + mAnm[SCORE_ANIM_SET_POSITION].setAnimEnable(true); + mLyt.calc(); + mAnm[SCORE_ANIM_SET_POSITION].setAnimEnable(false); + + // TODO + nw4r::lyt::Pane *p1 = mpPanes[15]; + nw4r::lyt::Pane *p2 = mpPanes[12]; + + mFloats[field_0x81C + i + 8] = (p2->GetSize().width * p2->GetScale().x / 2.0f) + + (p1->GetSize().width * p1->GetScale().x / 2.0f) + + (p1->GetParent()->GetTranslate().x + p1->GetTranslate().x) - + (p2->GetParent()->GetTranslate().x + p2->GetTranslate().x); + } + + fn_80293450(field_0x81C); + break; + } + + fn_802922F0(); + fn_80292500(); + fn_80292590(); + fn_80292610(); + fn_80292710(); + fn_80292880(); + fn_80291BA0(0); + fn_80292400(); + fn_80292480(); + fn_80292380(); + fn_80292250(); + field_0x7DC = 0; + field_0x804 = false; + field_0x808 = 0; + field_0x80C = 0; + field_0x810 = 0; } +void dLytMiniGameScore_c::fn_80291410() { + if (sInstance == nullptr) { + return; + } + + if (field_0x815 == true) { + return; + } + + mAnm[SCORE_ANIM_ALPHA_IN].setToEnd2(); + mAnm[SCORE_ANIM_ALPHA_IN].setAnimEnable(true); + mAnm[SCORE_ANIM_IN].setToStart(); + mAnm[SCORE_ANIM_IN].setAnimEnable(true); + + mLyt.getLayout()->Animate(0); + mLyt.calc(); + + mAnm[SCORE_ANIM_ALPHA_IN].setAnimEnable(false); + field_0x815 = true; + field_0x820 = true; + mIsVisible = true; + + if (field_0x818 == 1) { + fn_80291BA0(1); + fn_802920B0(); + mAnm[SCORE_ANIM_SET_POSITION].setFrame(field_0x81C); + mAnm[SCORE_ANIM_SET_POSITION].setAnimEnable(true); + fn_80292C30(); + mAnm[SCORE_ANIM_0_TO_9_OFFSET].setFrame(1.0f); + mAnm[SCORE_ANIM_0_TO_9_OFFSET].setAnimEnable(true); + + mLyt.getLayout()->Animate(0); + mLyt.calc(); + + mAnm[SCORE_ANIM_SET_POSITION].setAnimEnable(false); + mAnm[SCORE_ANIM_0_TO_9_OFFSET].setAnimEnable(false); + } +} + +void dLytMiniGameScore_c::fn_802915B0() { + if (sInstance == nullptr) { + return; + } + + + if (field_0x814 && field_0x815) { + mAnm[SCORE_ANIM_OUT].setToStart(); + mAnm[SCORE_ANIM_OUT].setAnimEnable(true); + + field_0x815 = false; + field_0x820 = false; + } +} + +void dLytMiniGameScore_c::fn_80291640() { + if (sInstance == nullptr) { + return; + } + + if (field_0x814 && field_0x815 != true && field_0x820) { + if (!mAnm[SCORE_ANIM_ALPHA_IN].isEnabled()) { + if (mAnm[SCORE_ANIM_ALPHA_OUT].isEnabled()) { + mAnm[SCORE_ANIM_ALPHA_OUT].setAnimEnable(false); + // TODO maybe these inlines are wrong + f32 frame = mAnm[SCORE_ANIM_ALPHA_OUT].getLastFrame(); + f32 t = mAnm[SCORE_ANIM_ALPHA_IN].getLastFrame(); + frame -= mAnm[SCORE_ANIM_ALPHA_OUT].getFrame(); + if (t <= frame) { + frame = t - 1.0f; + } + mAnm[SCORE_ANIM_ALPHA_IN].setFrame(frame); + } else { + mAnm[SCORE_ANIM_ALPHA_IN].setToStart(); + } + + mAnm[SCORE_ANIM_ALPHA_IN].setAnimEnable(true); + field_0x815 = true; + } + + mIsVisible = true; + } +} + +void dLytMiniGameScore_c::fn_80291740() { + if (sInstance == nullptr) { + return; + } + + if (field_0x814 && field_0x815) { + if (!mAnm[SCORE_ANIM_ALPHA_OUT].isEnabled()) { + if (mAnm[SCORE_ANIM_ALPHA_IN].isEnabled()) { + mAnm[SCORE_ANIM_ALPHA_IN].setAnimEnable(false); + // TODO maybe these inlines are wrong + f32 frame = mAnm[SCORE_ANIM_ALPHA_IN].getLastFrame(); + f32 t = mAnm[SCORE_ANIM_ALPHA_OUT].getLastFrame(); + frame -= mAnm[SCORE_ANIM_ALPHA_IN].getFrame(); + if (t <= frame) { + frame = t - 1.0f; + } + mAnm[SCORE_ANIM_ALPHA_OUT].setFrame(frame); + } else { + mAnm[SCORE_ANIM_ALPHA_OUT].setToStart(); + } + + mAnm[SCORE_ANIM_ALPHA_OUT].setAnimEnable(true); + field_0x815 = false; + } + } +} + +void dLytMiniGameScore_c::startAlphaIn() { + if (sInstance == nullptr) { + return; + } + + mAnm[SCORE_ANIM_ALPHA_OUT].setAnimEnable(false); + + mAnm[SCORE_ANIM_IN].setToEnd2(); + mAnm[SCORE_ANIM_IN].setAnimEnable(true); + + mAnm[SCORE_ANIM_ALPHA_IN].setToStart(); + mAnm[SCORE_ANIM_ALPHA_IN].setAnimEnable(true); + + mLyt.getLayout()->Animate(0); + mLyt.calc(); + + mAnm[SCORE_ANIM_IN].setAnimEnable(false); + mIsVisible = true; +} + +void dLytMiniGameScore_c::startAlphaOut() { + if (sInstance == nullptr) { + return; + } + + mAnm[SCORE_ANIM_ALPHA_OUT].setToStart(); + mAnm[SCORE_ANIM_ALPHA_OUT].setAnimEnable(true); +} + +void dLytMiniGameScore_c::fn_80291960() { + if (sInstance == nullptr) { + return; + } + + if (!mIsVisible) { + return; + } + + for (int i = 0; i <= field_0x7E0; i++) { + mAnm[i + SCORE_ANIM_GET_SCORE_OFFSET].setToStart(); + mAnm[i + SCORE_ANIM_GET_SCORE_OFFSET].setAnimEnable(true); + } + + mAnm[SCORE_ANIM_GET_SCORE_GET_TEXT_F].setToStart(); + mAnm[SCORE_ANIM_GET_SCORE_GET_TEXT_F].setAnimEnable(true); +} + +void dLytMiniGameScore_c::fn_80291A30() { + if (sInstance == nullptr) { + return; + } + + fn_802920B0(); + + for (int i = 0; i <= field_0x7E0; i++) { + mAnm[i + SCORE_ANIM_FINISH_SCORE_OFFSET].setToStart(); + mAnm[i + SCORE_ANIM_FINISH_SCORE_OFFSET].setAnimEnable(true); + } + + mAnm[SCORE_ANIM_FINISH_SCORE_GET_SCORE_W].setToStart(); + mAnm[SCORE_ANIM_FINISH_SCORE_GET_SCORE_W].setAnimEnable(true); + + mAnm[SCORE_ANIM_FINISH_SCORE_GET_SCORE_X].setToStart(); + mAnm[SCORE_ANIM_FINISH_SCORE_GET_SCORE_X].setAnimEnable(true); + + mAnm[SCORE_ANIM_FINISH_SCORE_GET_SCORE_F].setToStart(); + mAnm[SCORE_ANIM_FINISH_SCORE_GET_SCORE_F].setAnimEnable(true); +} + +void dLytMiniGameScore_c::startLoop() { + if (sInstance == nullptr) { + return; + } + + mAnm[SCORE_ANIM_LOOP_SCORE].setFrame(0.0f); + mAnm[SCORE_ANIM_LOOP_SCORE].setAnimEnable(true); +} + +void dLytMiniGameScore_c::fn_80291BA0(s32 score) { + if (sInstance == nullptr) { + return; + } + field_0x7D8 = score; +} + +void dLytMiniGameScore_c::fn_80291BC0() { + s32 digits[5]; + + digits[4] = field_0x7D8 / 10000; + + s32 v = field_0x7D8; + v %= 10000; + digits[3] = v / 1000; + v %= 1000; + digits[2] = v / 100; + v %= 100; + digits[1] = v / 10; + v %= 10; + digits[0] = v; + + fn_802920B0(); + fn_80292110(); + + if (field_0x818 == 1) { + if (field_0x828) { + fn_80291EF0(); + } + } else if (field_0x818 == 2) { + fn_80292040(); + } + + fn_80292C30(); + + for (int i = 0; i <= field_0x7E0; i++) { + setDigit(i, digits[i]); + } +} + +void dLytMiniGameScore_c::fn_80291D40(s32 arg) { + if (sInstance == nullptr) { + return; + } + + s32 diff = arg - field_0x7D8; + switch (diff) { + case 1: + field_0x80C = 1; + field_0x810 = 1; + break; + case 5: + field_0x80C = 5; + field_0x810 = 1; + break; + case 20: + field_0x80C = 10; + field_0x810 = 2; + break; + case 100: + field_0x80C = 20; + field_0x810 = 5; + break; + case 300: + field_0x80C = 25; + field_0x810 = 12; + break; + case 0: + return; + } + + if (arg < field_0x7D8) { + field_0x80C = nw4r::math::FAbs(diff); + field_0x810 = -1; + } + field_0x808 = arg; + field_0x804 = true; + field_0x829 = true; +} + +bool dLytMiniGameScore_c::fn_80291E50() const { + +} + +void dLytMiniGameScore_c::fn_80291E90() { + +} + +void dLytMiniGameScore_c::fn_80291ED0() { + +} + +void dLytMiniGameScore_c::fn_80291EF0() { + +} + +void dLytMiniGameScore_c::fn_80292030(s32) { + +} + +void dLytMiniGameScore_c::fn_80292040() { + +} + +void dLytMiniGameScore_c::fn_802920B0() { + +} + +void dLytMiniGameScore_c::fn_80292110() { + +} + +void dLytMiniGameScore_c::setDigit(s32 digitIndex, s32 number) { + +} + +void dLytMiniGameScore_c::fn_80292240() { + +} + +void dLytMiniGameScore_c::fn_80292250() { + +} + +void dLytMiniGameScore_c::fn_802922F0() { + +} + +void dLytMiniGameScore_c::fn_80292380() { + +} + +void dLytMiniGameScore_c::fn_80292400() { + +} + +void dLytMiniGameScore_c::fn_80292480() { + +} + +void dLytMiniGameScore_c::fn_80292500() { + +} + +void dLytMiniGameScore_c::fn_80292590() { + +} + +void dLytMiniGameScore_c::fn_80292610() { + +} + +void dLytMiniGameScore_c::fn_80292710() { + +} + +void dLytMiniGameScore_c::fn_80292880() { + +} + +void dLytMiniGameScore_c::fn_80292910() { + +} + +void dLytMiniGameScore_c::fn_80292920() { + +} + +bool dLytMiniGameScore_c::fn_80292930() const { + +} + +void dLytMiniGameScore_c::fn_80292940() { + +} + +void dLytMiniGameScore_c::fn_80292950() { + +} + +void dLytMiniGameScore_c::fn_802929C0() { + +} + +void dLytMiniGameScore_c::fn_80292A40() { + +} + +bool dLytMiniGameScore_c::fn_80292A50() const { + +} + +bool dLytMiniGameScore_c::fn_80292AA0() const { + +} + +bool dLytMiniGameScore_c::fn_80292AF0() const { + +} + +bool dLytMiniGameScore_c::fn_80292B40() const { + +} + +bool dLytMiniGameScore_c::fn_80292B90() const { + +} + +bool dLytMiniGameScore_c::fn_80292BE0() const { + +} + +void dLytMiniGameScore_c::fn_80292C30() { + s32 t = 0; + if (field_0x828) { + t = field_0x824 == 4 ? 4 : field_0x824 == 0 ? 6 : 0; + } + + switch (field_0x818) { + case 0: { + dMessage_c::getGlobalTagProcessor()->setNumericArg0(field_0x7D8); + fn_802933A0(1); + field_0x7E8 = mpTextBoxes[0]->GetLineWidth(nullptr); + + // TODO + nw4r::lyt::Pane *p1 = mpPanes[15]; + nw4r::lyt::Pane *p2 = mpPanes[field_0x7E0 + 15]; + mFloats[field_0x81C + field_0x7E0] = field_0x7E8 + (p2->GetSize().width * (p2->GetScale().x / 2.0f)) + + (p1->GetSize().width * (p1->GetScale().x / 2.0f)) + + (p1->GetParent()->GetTranslate().x + p1->GetTranslate().x) - + (p2->GetParent()->GetTranslate().x + p2->GetTranslate().x); + mFloats[field_0x81C + field_0x7E0] += field_0x7FC; + mFloats[field_0x81C + field_0x7E0] += field_0x800; + + break; + } + case 3: { + dMessage_c::getGlobalTagProcessor()->setNumericArg0(field_0x7D8); + fn_802933A0(0); + field_0x7E8 = mpTextBoxes[0]->GetLineWidth(nullptr); + + // TODO + nw4r::lyt::Pane *p1 = mpPanes[15]; + nw4r::lyt::Pane *p2 = mpPanes[field_0x7E0 + 15]; + mFloats[field_0x81C + field_0x7E0] = field_0x7E8 + (p2->GetSize().width * (p2->GetScale().x / 2.0f)) + + (p1->GetSize().width * (p1->GetScale().x / 2.0f)) + + (p1->GetParent()->GetTranslate().x + p1->GetTranslate().x) - + (p2->GetParent()->GetTranslate().x + p2->GetTranslate().x); + mFloats[field_0x81C + field_0x7E0] += field_0x7FC; + mFloats[field_0x81C + field_0x7E0] += field_0x800; + + break; + } + } +} + +void dLytMiniGameScore_c::fn_802933A0(s32 variant) { + +} + +void dLytMiniGameScore_c::fn_80293410() { + +} + +void dLytMiniGameScore_c::fn_80293450(s32) { + +} + + static const d2d::LytBrlanMapping brlanMapScoreSd[] = { { "miniGameScoreSd_00_0to9.brlan", "G_0to9_00"}, { "miniGameScoreSd_00_0to9.brlan", "G_0to9_01"}, @@ -1691,4 +2791,4 @@ void dLytMiniGameScoreSd_c::init() { // TODO - ... } -SPECIAL_BASE_PROFILE(LYT_MINI_GAME, dLytMiniGame_c, fProfile::LYT_MINI_GAME, 0x2B7, 1); +SPECIAL_BASE_PROFILE(LYT_MINI_GAME, dLytMiniGame_c, fProfile::LYT_MINI_GAME, 0x2B4, 0x6F9); diff --git a/src/d/snd/d_snd_small_effect_mgr.cpp b/src/d/snd/d_snd_small_effect_mgr.cpp index b970a325..0728448f 100644 --- a/src/d/snd/d_snd_small_effect_mgr.cpp +++ b/src/d/snd/d_snd_small_effect_mgr.cpp @@ -483,7 +483,7 @@ bool dSndSmallEffectMgr_c::playSirenCountdownSound(s32 timer) { return ok; } -bool dSndSmallEffectMgr_c::playMinigameCountdownSound() { +bool dSndSmallEffectMgr_c::playMinigameCountdownSound(s32 timer) { return playSoundInternal(SE_S_MG_COUNT_DOWN_1); } From ba810ccc9e8fd2f43518293339977cf62c9fb7f2 Mon Sep 17 00:00:00 2001 From: robojumper Date: Tue, 2 Dec 2025 23:13:37 +0100 Subject: [PATCH 3/9] 71% --- config/SOUE01/symbols.txt | 126 ++--- include/d/lyt/d_lyt_mini_game.h | 167 ++++--- src/d/lyt/d_lyt_mini_game.cpp | 801 ++++++++++++++++++++++---------- 3 files changed, 729 insertions(+), 365 deletions(-) diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index dfdaa3d3..618d614a 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -15361,78 +15361,78 @@ fn_80291640__19dLytMiniGameScore_cFv = .text:0x80291640; // type:function size:0 fn_80291740__19dLytMiniGameScore_cFv = .text:0x80291740; // type:function size:0xEC startAlphaIn__19dLytMiniGameScore_cFv = .text:0x80291830; // type:function size:0xD0 startAlphaOut__19dLytMiniGameScore_cFv = .text:0x80291900; // type:function size:0x60 -fn_80291960__19dLytMiniGameScore_cFv = .text:0x80291960; // type:function size:0xD0 -fn_80291A30__19dLytMiniGameScore_cFv = .text:0x80291A30; // type:function size:0x110 +startGetScore__19dLytMiniGameScore_cFv = .text:0x80291960; // type:function size:0xD0 +startFinish__19dLytMiniGameScore_cFv = .text:0x80291A30; // type:function size:0x110 startLoop__19dLytMiniGameScore_cFv = .text:0x80291B40; // type:function size:0x54 -fn_80291BA0__19dLytMiniGameScore_cFl = .text:0x80291BA0; // type:function size:0x14 +setScore__19dLytMiniGameScore_cFl = .text:0x80291BA0; // type:function size:0x14 fn_80291BC0__19dLytMiniGameScore_cFv = .text:0x80291BC0; // type:function size:0x178 fn_80291D40__19dLytMiniGameScore_cFl = .text:0x80291D40; // type:function size:0x10C -fn_80291E50 = .text:0x80291E50; // type:function size:0x34 -fn_80291E90 = .text:0x80291E90; // type:function size:0x34 -fn_80291ED0 = .text:0x80291ED0; // type:function size:0x14 -fn_80291EF0 = .text:0x80291EF0; // type:function size:0x138 -fn_80292030 = .text:0x80292030; // type:function size:0xC -fn_80292040 = .text:0x80292040; // type:function size:0x68 -fn_802920B0 = .text:0x802920B0; // type:function size:0x54 -fn_80292110 = .text:0x80292110; // type:function size:0x8C -fn_802921A0 = .text:0x802921A0; // type:function size:0x9C -fn_80292240 = .text:0x80292240; // type:function size:0xC -fn_80292250 = .text:0x80292250; // type:function size:0x98 -fn_802922F0 = .text:0x802922F0; // type:function size:0x90 -fn_80292380 = .text:0x80292380; // type:function size:0x80 -fn_80292400 = .text:0x80292400; // type:function size:0x80 -fn_80292480 = .text:0x80292480; // type:function size:0x80 -fn_80292500 = .text:0x80292500; // type:function size:0x90 -fn_80292590 = .text:0x80292590; // type:function size:0x80 -fn_80292610 = .text:0x80292610; // type:function size:0x100 -fn_80292710 = .text:0x80292710; // type:function size:0x170 -fn_80292880 = .text:0x80292880; // type:function size:0x8C -fn_80292910 = .text:0x80292910; // type:function size:0xC -fn_80292920 = .text:0x80292920; // type:function size:0xC -fn_80292930 = .text:0x80292930; // type:function size:0xC -fn_80292940 = .text:0x80292940; // type:function size:0xC -fn_80292950 = .text:0x80292950; // type:function size:0x64 -fn_802929C0 = .text:0x802929C0; // type:function size:0x7C -fn_80292A40 = .text:0x80292A40; // type:function size:0xC -fn_80292A50 = .text:0x80292A50; // type:function size:0x44 -fn_80292AA0 = .text:0x80292AA0; // type:function size:0x44 -fn_80292AF0 = .text:0x80292AF0; // type:function size:0x44 -fn_80292B40 = .text:0x80292B40; // type:function size:0x44 -fn_80292B90 = .text:0x80292B90; // type:function size:0x44 -fn_80292BE0 = .text:0x80292BE0; // type:function size:0x44 -fn_80292C30 = .text:0x80292C30; // type:function size:0x764 -fn_802933A0 = .text:0x802933A0; // type:function size:0x6C -fn_80293410 = .text:0x80293410; // type:function size:0x34 -fn_80293450 = .text:0x80293450; // type:function size:0x2A0 +hasIncreasedScore__19dLytMiniGameScore_cCFv = .text:0x80291E50; // type:function size:0x34 +hasDecreasedScore__19dLytMiniGameScore_cCFv = .text:0x80291E90; // type:function size:0x34 +fn_80291ED0__19dLytMiniGameScore_cFl = .text:0x80291ED0; // type:function size:0x14 +fn_80291EF0__19dLytMiniGameScore_cFv = .text:0x80291EF0; // type:function size:0x138 +increaseScore__19dLytMiniGameScore_cFl = .text:0x80292030; // type:function size:0xC +fn_80292040__19dLytMiniGameScore_cFv = .text:0x80292040; // type:function size:0x68 +calcNumDigits__19dLytMiniGameScore_cFv = .text:0x802920B0; // type:function size:0x54 +realizePosition__19dLytMiniGameScore_cFv = .text:0x80292110; // type:function size:0x8C +setDigit__19dLytMiniGameScore_cFll = .text:0x802921A0; // type:function size:0x9C +saveScore__19dLytMiniGameScore_cFv = .text:0x80292240; // type:function size:0xC +resetIn__19dLytMiniGameScore_cFv = .text:0x80292250; // type:function size:0x98 +resetDigits__19dLytMiniGameScore_cFv = .text:0x802922F0; // type:function size:0x90 +resetOut__19dLytMiniGameScore_cFv = .text:0x80292380; // type:function size:0x80 +resetAlphaIn__19dLytMiniGameScore_cFv = .text:0x80292400; // type:function size:0x80 +resetAlphaOut__19dLytMiniGameScore_cFv = .text:0x80292480; // type:function size:0x80 +resetSetPosition__19dLytMiniGameScore_cFv = .text:0x80292500; // type:function size:0x90 +resetRupeeChange__19dLytMiniGameScore_cFv = .text:0x80292590; // type:function size:0x80 +resetGetScore__19dLytMiniGameScore_cFv = .text:0x80292610; // type:function size:0x100 +resetFinish__19dLytMiniGameScore_cFv = .text:0x80292710; // type:function size:0x170 +resetLoop__19dLytMiniGameScore_cFv = .text:0x80292880; // type:function size:0x8C +stopIn__19dLytMiniGameScore_cFv = .text:0x80292910; // type:function size:0xC +stopOut__19dLytMiniGameScore_cFv = .text:0x80292920; // type:function size:0xC +stopAlphaIn__19dLytMiniGameScore_cFv = .text:0x80292930; // type:function size:0xC +stopAlphaOut__19dLytMiniGameScore_cFv = .text:0x80292940; // type:function size:0xC +stopGetScore__19dLytMiniGameScore_cFv = .text:0x80292950; // type:function size:0x64 +stopFinish__19dLytMiniGameScore_cFv = .text:0x802929C0; // type:function size:0x7C +stopLoop__19dLytMiniGameScore_cFv = .text:0x80292A40; // type:function size:0xC +isInEndReached__19dLytMiniGameScore_cCFv = .text:0x80292A50; // type:function size:0x44 +isOutEndReached__19dLytMiniGameScore_cCFv = .text:0x80292AA0; // type:function size:0x44 +isAlphaInEndReached__19dLytMiniGameScore_cCFv = .text:0x80292AF0; // type:function size:0x44 +isAlphaOutEndReached__19dLytMiniGameScore_cCFv = .text:0x80292B40; // type:function size:0x44 +isGetScoreEndReached__19dLytMiniGameScore_cCFv = .text:0x80292B90; // type:function size:0x44 +isFinishEndReached__19dLytMiniGameScore_cCFv = .text:0x80292BE0; // type:function size:0x44 +fn_80292C30__19dLytMiniGameScore_cFv = .text:0x80292C30; // type:function size:0x764 +loadTextVariant__19dLytMiniGameScore_cFl = .text:0x802933A0; // type:function size:0x6C +fn_80293410__19dLytMiniGameScore_cFv = .text:0x80293410; // type:function size:0x34 +fn_80293450__19dLytMiniGameScore_cFl = .text:0x80293450; // type:function size:0x2A0 build__21dLytMiniGameScoreSd_cFPQ23d2d10ResAccIf_c = .text:0x802936F0; // type:function size:0xC8 remove__21dLytMiniGameScoreSd_cFv = .text:0x802937C0; // type:function size:0x74 execute__21dLytMiniGameScoreSd_cFv = .text:0x80293840; // type:function size:0xF0 draw__21dLytMiniGameScoreSd_cFv = .text:0x80293930; // type:function size:0x48 init__21dLytMiniGameScoreSd_cFv = .text:0x80293980; // type:function size:0xA8 -fn_80293A30 = .text:0x80293A30; // type:function size:0x60 -fn_80293A90 = .text:0x80293A90; // type:function size:0x60 -fn_80293AF0 = .text:0x80293AF0; // type:function size:0xC0 -fn_80293BB0 = .text:0x80293BB0; // type:function size:0xA8 -fn_80293C60 = .text:0x80293C60; // type:function size:0xE0 -fn_80293D40 = .text:0x80293D40; // type:function size:0x80 -fn_80293DC0 = .text:0x80293DC0; // type:function size:0x80 -fn_80293E40 = .text:0x80293E40; // type:function size:0x88 -fn_80293ED0 = .text:0x80293ED0; // type:function size:0x74 -fn_80293F50 = .text:0x80293F50; // type:function size:0x54 -fn_80293FB0 = .text:0x80293FB0; // type:function size:0x54 -fn_80294010 = .text:0x80294010; // type:function size:0xC -fn_80294020 = .text:0x80294020; // type:function size:0xC -fn_80294030 = .text:0x80294030; // type:function size:0x44 -fn_80294080 = .text:0x80294080; // type:function size:0x44 +fn_80293A30__21dLytMiniGameScoreSd_cFv = .text:0x80293A30; // type:function size:0x60 +fn_80293A90__21dLytMiniGameScoreSd_cFv = .text:0x80293A90; // type:function size:0x60 +fn_80293AF0__21dLytMiniGameScoreSd_cFl = .text:0x80293AF0; // type:function size:0xC0 +fn_80293BB0__21dLytMiniGameScoreSd_cFv = .text:0x80293BB0; // type:function size:0xA8 +fn_80293C60__21dLytMiniGameScoreSd_cFv = .text:0x80293C60; // type:function size:0xE0 +fn_80293D40__21dLytMiniGameScoreSd_cFv = .text:0x80293D40; // type:function size:0x80 +fn_80293DC0__21dLytMiniGameScoreSd_cFv = .text:0x80293DC0; // type:function size:0x80 +fn_80293E40__21dLytMiniGameScoreSd_cFv = .text:0x80293E40; // type:function size:0x88 +fn_80293ED0__21dLytMiniGameScoreSd_cFv = .text:0x80293ED0; // type:function size:0x74 +fn_80293F50__21dLytMiniGameScoreSd_cFv = .text:0x80293F50; // type:function size:0x54 +fn_80293FB0__21dLytMiniGameScoreSd_cFv = .text:0x80293FB0; // type:function size:0x54 +fn_80294010__21dLytMiniGameScoreSd_cFv = .text:0x80294010; // type:function size:0xC +fn_80294020__21dLytMiniGameScoreSd_cFv = .text:0x80294020; // type:function size:0xC +fn_80294030__21dLytMiniGameScoreSd_cCFv = .text:0x80294030; // type:function size:0x44 +fn_80294080__21dLytMiniGameScoreSd_cCFv = .text:0x80294080; // type:function size:0x44 dLytMiniGame_c_classInit__Fv = .text:0x802940D0; // type:function size:0x380 -fn_80294450 = .text:0x80294450; // type:function size:0x74 -fn_802944D0 = .text:0x802944D0; // type:function size:0x74 -fn_80294550 = .text:0x80294550; // type:function size:0x74 -fn_802945D0 = .text:0x802945D0; // type:function size:0x74 -fn_80294650 = .text:0x80294650; // type:function size:0x74 -fn_802946D0 = .text:0x802946D0; // type:function size:0x6C -fn_80294740 = .text:0x80294740; // type:function size:0x74 -fn_802947C0 = .text:0x802947C0; // type:function size:0x68 +__dt__19dLytMiniGameScore_cFv = .text:0x80294450; // type:function size:0x74 +__dt__21dLytMiniGameScoreSd_cFv = .text:0x802944D0; // type:function size:0x74 +__dt__19dLytMiniGameStart_cFv = .text:0x80294550; // type:function size:0x74 +__dt__18dLytMiniGameTime_cFv = .text:0x802945D0; // type:function size:0x74 +__dt__18dLytMiniGameBugs_cFv = .text:0x80294650; // type:function size:0x74 +__ct__26dLytMiniGamePumpkinParts_cFv = .text:0x802946D0; // type:function size:0x6C +__dt__26dLytMiniGamePumpkinParts_cFv = .text:0x80294740; // type:function size:0x74 +__dt__21dLytMiniGamePumpkin_cFv = .text:0x802947C0; // type:function size:0x68 LytMiniGame__init = .text:0x80294830; // type:function size:0xA94 LytMiniGame__destructRes = .text:0x802952D0; // type:function size:0x31C fn_802955F0 = .text:0x802955F0; // type:function size:0xD4 diff --git a/include/d/lyt/d_lyt_mini_game.h b/include/d/lyt/d_lyt_mini_game.h index af1502b4..1e2a25cf 100644 --- a/include/d/lyt/d_lyt_mini_game.h +++ b/include/d/lyt/d_lyt_mini_game.h @@ -11,7 +11,7 @@ /** 2D UI - Mini Game - Pumpkin score popup */ class dLytMiniGamePumpkinParts_c { public: - dLytMiniGamePumpkinParts_c() {} + dLytMiniGamePumpkinParts_c() : field_0x154(false), mHasPlayedDoubleScoreSound(false) {} virtual ~dLytMiniGamePumpkinParts_c() {} bool build(d2d::ResAccIf_c *resAcc); @@ -45,7 +45,7 @@ private: /** 2D UI - Mini Game - Pumpkin score popups */ class dLytMiniGamePumpkin_c { public: - dLytMiniGamePumpkin_c() {} + dLytMiniGamePumpkin_c() : field_0x478(10), mCombo(0) {} virtual ~dLytMiniGamePumpkin_c() {} bool build(d2d::ResAccIf_c *resAcc); @@ -68,7 +68,14 @@ private: /** 2D UI - Mini Game - Bug Heaven */ class dLytMiniGameBugs_c { public: - dLytMiniGameBugs_c() {} + dLytMiniGameBugs_c() + : mBugIconsInEnded(false), + mInTriggered(false), + mBugIconsFlashStarted(false), + mBugsNumLevel(1), + mBugsNum(10), + field_0xB4B(false), + field_0xB4C(true) {} virtual ~dLytMiniGameBugs_c() {} bool build(d2d::ResAccIf_c *resAcc); @@ -139,7 +146,19 @@ private: /** 2D UI - Mini Game - Time */ class dLytMiniGameTime_c { public: - dLytMiniGameTime_c() {} + dLytMiniGameTime_c() + : field_0x7D4(0), + mCurrentTimerValueMilliSeconds(0), + mCurrentTimerValueSeconds(0), + mLastTimerValueSeconds(0), + mTimerVariant(0), + mHighestDigitIndex(0), + field_0x7EC(false), + field_0x7ED(false), + field_0x7EE(false), + field_0x7F0(0), + field_0x7F4(0), + mIsVisible(false) {} virtual ~dLytMiniGameTime_c() {} bool build(d2d::ResAccIf_c *resAcc); @@ -218,7 +237,7 @@ private: /** 2D UI - Mini Game - Start / Finish Popup */ class dLytMiniGameStart_c { public: - dLytMiniGameStart_c() {} + dLytMiniGameStart_c() : mIsVisible(false) {} virtual ~dLytMiniGameStart_c() {} bool build(d2d::ResAccIf_c *resAcc); @@ -260,7 +279,34 @@ private: /** 2D UI - Mini Game - Score counter */ class dLytMiniGameScore_c { public: - dLytMiniGameScore_c() {} + dLytMiniGameScore_c() + : mScore(0), + mLastScore(0), + mHighestDigitIndex(0), + field_0x7E4(0), + field_0x7E8(0.0f), + field_0x7EC(-2), + field_0x7F0(0), + field_0x7F4(0), + field_0x7F8(-1), + field_0x7FC(1), + field_0x800(0), + field_0x804(false), + field_0x808(0), + field_0x80C(0), + field_0x810(0), + field_0x814(false), + field_0x815(false), + field_0x816(false), + field_0x818(0), + field_0x81C(0), + field_0x820(false), + field_0x824(0), + field_0x828(false), + field_0x829(false), + field_0x82C(0), + field_0x830(1), + mIsVisible(false) {} virtual ~dLytMiniGameScore_c() {} bool build(d2d::ResAccIf_c *resAcc); @@ -276,47 +322,47 @@ private: void fn_80291740(); void startAlphaIn(); void startAlphaOut(); - void fn_80291960(); - void fn_80291A30(); + void startGetScore(); + void startFinish(); void startLoop(); - void fn_80291BA0(s32 score); + void setScore(s32 score); void fn_80291BC0(); void fn_80291D40(s32 arg); - bool fn_80291E50() const; - void fn_80291E90(); - void fn_80291ED0(); + bool hasIncreasedScore() const; + bool hasDecreasedScore() const; + void fn_80291ED0(s32); void fn_80291EF0(); - void fn_80292030(s32); + void increaseScore(s32); void fn_80292040(); - void fn_802920B0(); - void fn_80292110(); + s32 calcNumDigits(); + void realizePosition(); void setDigit(s32 digitIndex, s32 number); - void fn_80292240(); - void fn_80292250(); - void fn_802922F0(); - void fn_80292380(); - void fn_80292400(); - void fn_80292480(); - void fn_80292500(); - void fn_80292590(); - void fn_80292610(); - void fn_80292710(); - void fn_80292880(); - void fn_80292910(); - void fn_80292920(); - bool fn_80292930() const; - void fn_80292940(); - void fn_80292950(); - void fn_802929C0(); - void fn_80292A40(); - bool fn_80292A50() const; - bool fn_80292AA0() const; - bool fn_80292AF0() const; - bool fn_80292B40() const; - bool fn_80292B90() const; - bool fn_80292BE0() const; + void saveScore(); + void resetIn(); + void resetDigits(); + void resetOut(); + void resetAlphaIn(); + void resetAlphaOut(); + void resetSetPosition(); + void resetRupeeChange(); + void resetGetScore(); + void resetFinish(); + void resetLoop(); + void stopIn(); + void stopOut(); + void stopAlphaIn(); + void stopAlphaOut(); + void stopGetScore(); + void stopFinish(); + void stopLoop(); + bool isInEndReached() const; + bool isOutEndReached() const; + bool isAlphaInEndReached() const; + bool isAlphaOutEndReached() const; + bool isGetScoreEndReached() const; + bool isFinishEndReached() const; void fn_80292C30(); - void fn_802933A0(s32 variant); + void loadTextVariant(s32 variant); void fn_80293410(); void fn_80293450(s32); @@ -331,15 +377,16 @@ private: /* 0x7CC */ dTextBox_c *mpTextBoxes[3]; - /* 0x7D8 */ s32 field_0x7D8; - - /* 0x7DC */ UNKWORD field_0x7DC; - /* 0x7E0 */ s32 field_0x7E0; + /* 0x7D8 */ s32 mScore; + /* 0x7DC */ s32 mLastScore; + /* 0x7E0 */ s32 mHighestDigitIndex; /* 0x7E4 */ UNKWORD field_0x7E4; /* 0x7E8 */ f32 field_0x7E8; - /* 0x7EC */ u8 _0x7EC[0x7FC - 0x7EC]; - + /* 0x7EC */ s32 field_0x7EC; + /* 0x7F0 */ s32 field_0x7F0; + /* 0x7F4 */ s32 field_0x7F4; + /* 0x7F8 */ s32 field_0x7F8; /* 0x7FC */ s32 field_0x7FC; /* 0x800 */ s32 field_0x800; /* 0x804 */ bool field_0x804; @@ -364,7 +411,7 @@ private: /** 2D UI - Mini Game - Fun Fun Island score */ class dLytMiniGameScoreSd_c { public: - dLytMiniGameScoreSd_c() {} + dLytMiniGameScoreSd_c() : field_0x1D4(0), mIsVisible(false) {} virtual ~dLytMiniGameScoreSd_c() {} bool build(d2d::ResAccIf_c *resAcc); @@ -378,7 +425,7 @@ private: void fn_80293A30(); void fn_80293A90(); - void fn_80293AF0(); + void fn_80293AF0(s32); void fn_80293BB0(); void fn_80293C60(); void fn_80293D40(); @@ -389,11 +436,14 @@ private: void fn_80293FB0(); void fn_80294010(); void fn_80294020(); - void fn_80294030(); - void fn_80294080(); + bool fn_80294030() const; + bool fn_80294080() const; /* 0x004 */ d2d::LytBase_c mLyt; /* 0x094 */ d2d::AnmGroup_c mAnm[5]; + /* 0x1D4 */ s32 field_0x1D4; + /* 0x1D8 */ bool mIsVisible; + /* 0x1D9 */ bool field_0x1D9; }; class dLytMiniGame_c : public dBase_c { @@ -405,7 +455,12 @@ public: field_0x006B(0), field_0x006C(0), field_0x006D(0), - field_0x1510(1) {} + field_0x1510(1), + field_0x3864(0), + field_0x3865(0), + field_0x3866(false), + field_0x3867(0), + field_0x3868(0) {} virtual ~dLytMiniGame_c() {} static dLytMiniGame_c *GetInstance() { @@ -465,11 +520,11 @@ private: /* 0x209C */ dLytMiniGameTime_c mTime; /* 0x2894 */ dLytMiniGameBugs_c mBugs; /* 0x33E4 */ dLytMiniGamePumpkin_c mPumpkin; - - // TODO - u8 _0x___[0xA]; - - bool field_0x3866; + /* 0x3864 */ u8 field_0x3864; + /* 0x3865 */ u8 field_0x3865; + /* 0x3866 */ bool field_0x3866; + /* 0x3867 */ u8 field_0x3867; + /* 0x3868 */ u8 field_0x3868; }; #endif diff --git a/src/d/lyt/d_lyt_mini_game.cpp b/src/d/lyt/d_lyt_mini_game.cpp index 8d45db0b..292d8863 100644 --- a/src/d/lyt/d_lyt_mini_game.cpp +++ b/src/d/lyt/d_lyt_mini_game.cpp @@ -10,6 +10,7 @@ #include "d/snd/d_snd_wzsound.h" #include "m/m_vec.h" #include "nw4r/lyt/lyt_pane.h" +#include "nw4r/lyt/lyt_types.h" #include "nw4r/math/math_arithmetic.h" #include "nw4r/math/math_types.h" #include "toBeSorted/d_d3d.h" @@ -1284,6 +1285,7 @@ void dLytMiniGameTime_c::resetFinish() { mAnm[i + TIME_ANIM_FINISH_OFFSET].setForwardOnce(); mAnm[i + TIME_ANIM_FINISH_OFFSET].setToStart(); mAnm[i + TIME_ANIM_FINISH_OFFSET].setAnimEnable(true); + // NOTE: Unnecessary calc here? mLyt.calc(); } @@ -1834,6 +1836,13 @@ static const char *sScorePanes[] = { "P_position_00", "P_position_01", "P_position_02", "P_position_03", "P_position_04", }; +#define SCORE_PANE_CENTER 0 +#define SCORE_PANE_POSITION_ALL 1 +#define SCORE_PANE_POSITION 2 +#define SCORE_PANE_UNIT 3 + +#define SCORE_PANE_P_POSITION_0 15 + #define SCORE_NUM_PANES 20 bool dLytMiniGameScore_c::build(d2d::ResAccIf_c *resAcc) { @@ -1888,7 +1897,7 @@ bool dLytMiniGameScore_c::execute() { field_0x804 = false; field_0x829 = false; } else { - fn_80292030(field_0x810); + increaseScore(field_0x810); } } @@ -1897,69 +1906,73 @@ bool dLytMiniGameScore_c::execute() { if (!field_0x816) { switch (field_0x818) { case 0: - if (fn_80291E50()) { - fn_80291960(); + if (hasIncreasedScore()) { + startGetScore(); } break; case 2: if (field_0x829) { - if (fn_80291E50()) { - fn_80291960(); + if (hasIncreasedScore()) { + startGetScore(); } - fn_80291E90(); + + if (hasDecreasedScore()) { + // nothing + } + field_0x829 = false; } break; case 1: - if (field_0x7D8 != 1) { - if (fn_80291E50()) { - fn_80291960(); + if (mScore != 1) { + if (hasIncreasedScore()) { + startGetScore(); } } break; case 3: case 4: - if (fn_80291E50()) { - fn_80291960(); + if (hasIncreasedScore()) { + startGetScore(); } break; } } - if (fn_80292A50()) { - fn_80292910(); + if (isInEndReached()) { + stopIn(); field_0x814 = true; } - if (fn_80292AA0()) { - fn_80292920(); - fn_80292A40(); - fn_80292880(); + if (isOutEndReached()) { + stopOut(); + stopLoop(); + resetLoop(); mIsVisible = false; } - if (fn_80292AF0()) { - fn_80292930(); + if (isAlphaInEndReached()) { + stopAlphaIn(); if (field_0x816) { startLoop(); } } - if (fn_80292B40()) { - fn_80292940(); + if (isAlphaOutEndReached()) { + stopAlphaOut(); if (field_0x816) { - fn_80292A40(); - fn_80292880(); + stopLoop(); + resetLoop(); } mIsVisible = false; } - if (fn_80292B90()) { - fn_80292950(); + if (isGetScoreEndReached()) { + stopGetScore(); } - if (fn_80292BE0()) { - fn_802929C0(); + if (isFinishEndReached()) { + stopFinish(); startLoop(); } @@ -1972,11 +1985,11 @@ bool dLytMiniGameScore_c::execute() { mLyt.calc(); } - if (!field_0x816 && field_0x818 == 0 && fn_80291E50()) { - dSndSmallEffectMgr_c::GetInstance()->playMinigameScoreUpSound(field_0x7D8); + if (!field_0x816 && field_0x818 == 0 && hasIncreasedScore()) { + dSndSmallEffectMgr_c::GetInstance()->playMinigameScoreUpSound(mScore); } - fn_80292240(); + saveScore(); return true; } @@ -1991,21 +2004,45 @@ bool dLytMiniGameScore_c::draw() { return true; } +// TODO this is totally arbitrary and makes no sense but it sort of looks like it generates close-ish code +// Assume the TODO also covers all the calls to `calc` below +struct PaneCalc { + PaneCalc() { + for (int i = 4; i >= 0; i--) { + work[i][1] = work[i][0] = 0.0f; + } + } + + void calc(nw4r::lyt::Pane *p1, nw4r::lyt::Pane *p2) { + nw4r::lyt::Pane *pp1 = p1->GetParent(); + nw4r::lyt::Pane *pp2 = p2->GetParent(); + + work[0][0] = p1->GetScale().x; + work[0][1] = p1->GetScale().y; + + work[1][0] = p1->GetTranslate().x + pp1->GetTranslate().x; + work[1][1] = p1->GetTranslate().y; + + work[2][0] = p2->GetTranslate().x + pp2->GetTranslate().x; + work[2][1] = p2->GetTranslate().y; + + work[3][0] = p1->GetSize().width * p1->GetScale().x; + work[3][1] = p1->GetSize().height * p1->GetScale().y; + + work[4][0] = p2->GetSize().width * p2->GetScale().x; + work[4][1] = p2->GetSize().height * p2->GetScale().y; + } + + f32 work[5][2]; +}; + void dLytMiniGameScore_c::init() { if (sInstance == nullptr) { return; } - // TODO here are floats (0.0f) initialized on the stack - // in an interesting order. Those stack slots are used in - // the TODOs below, but I haven't figured out how it really works yet. - // An array of 10 floats seems the most reasonable - // (5 mVec2_c-s already cause too much stack space to be used) - - f32 temp[10]; - for (int i = 9; i >= 0; i--) { - temp[i] = 0.0f; - } + // maybe? + PaneCalc calc; mAnm[SCORE_ANIM_IN].setForwardOnce(); mAnm[SCORE_ANIM_IN].setToEnd2(); @@ -2018,8 +2055,8 @@ void dLytMiniGameScore_c::init() { field_0x82C = 0; field_0x81C = 21; field_0x7E4 = 4; - dMessage_c::getGlobalTagProcessor()->setNumericArg0(field_0x7D8); - fn_802933A0(1); + dMessage_c::getGlobalTagProcessor()->setNumericArg0(mScore); + loadTextVariant(1); fn_80293410(); switch (field_0x830) { case 1: @@ -2041,13 +2078,9 @@ void dLytMiniGameScore_c::init() { mLyt.calc(); mAnm[SCORE_ANIM_SET_POSITION].setAnimEnable(false); - // TODO - nw4r::lyt::Pane *p1 = mpPanes[15]; - nw4r::lyt::Pane *p2 = mpPanes[i + 15]; - mFloats[field_0x81C + i] = field_0x7E8 + (p2->GetSize().width * (p2->GetScale().x / 2.0f)) + - (p1->GetSize().width * (p1->GetScale().x / 2.0f)) + - (p1->GetParent()->GetTranslate().x + p1->GetTranslate().x) - - (p2->GetParent()->GetTranslate().x + p2->GetTranslate().x); + calc.calc(mpPanes[i + 15], mpPanes[15]); + mFloats[field_0x81C + i] = + calc.work[3][0] / 2.0f + calc.work[4][0] / 2.0f + (calc.work[1][0] - calc.work[2][0]); mFloats[field_0x81C + i] += field_0x7FC; mFloats[field_0x81C + i] += field_0x800; } @@ -2066,44 +2099,9 @@ void dLytMiniGameScore_c::init() { mLyt.calc(); mAnm[SCORE_ANIM_SET_POSITION].setAnimEnable(false); - // init+0x474 - - /* - // Cleaned up m2c output to make the stack operations easier to understand. - // This looks like 5x2 f32, which matches the initialization sequence at the start - // of the function. Note that the stack vars aren't ever read; they're only written. - // There are some unused results here (e.g. the height * scale.y...), but I don't know - // why... - - nw4r::lyt::Pane *p1 = this->unk750; - nw4r::lyt::Pane *p2 = this->unk74C; - - sp8 = p2->mScale.x; // unused - spC = p2->mScale.y; // unused - - sp10 = p2->mParent->mTranslate.x + p2->mTranslate.x; - sp14 = p2->mTranslate.y; // unused - - sp18 = p1->mParent->mTranslate.x + p1->mTranslate.x; - sp1C = p1->mTranslate.y; // unused - - sp20 = p2->mSize.width * p2->mScale.x; - sp24 = p2->mSize.height * p2->mScale.y; // unused - - sp28 = p1->mSize.width * p1->mScale.x; - sp2C = p1->mSize.height * p1->mScale.y; // unused - - this->mFloats[field_0x81C + i] = (f32) ((sp20 * 0.5f) + ((sp28 * 0.5f) + (sp18 - sp10))); - */ - - nw4r::lyt::Pane *p1 = mpPanes[15]; - nw4r::lyt::Pane *p2 = mpPanes[14]; - - // TODO - mFloats[field_0x81C + i] = (p2->GetSize().width * p2->GetScale().x / 2.0f) + - (p1->GetSize().width * p1->GetScale().x / 2.0f) + - (p1->GetParent()->GetTranslate().x + p1->GetTranslate().x) - - (p2->GetParent()->GetTranslate().x + p2->GetTranslate().x); + calc.calc(mpPanes[14], mpPanes[15]); + mFloats[field_0x81C + i] = + calc.work[3][0] / 2.0f + calc.work[4][0] / 2.0f + (calc.work[1][0] - calc.work[2][0]); } for (int i = 0; i < field_0x7E4; i++) { @@ -2112,13 +2110,9 @@ void dLytMiniGameScore_c::init() { mLyt.calc(); mAnm[SCORE_ANIM_SET_POSITION].setAnimEnable(false); - // TODO - nw4r::lyt::Pane *p1 = mpPanes[15]; - nw4r::lyt::Pane *p2 = mpPanes[14]; - mFloats[field_0x81C + i + 2] = (p2->GetSize().width * p2->GetScale().x / 2.0f) + - (p1->GetSize().width * p1->GetScale().x / 2.0f) + - (p1->GetParent()->GetTranslate().x + p1->GetTranslate().x) - - (p2->GetParent()->GetTranslate().x + p2->GetTranslate().x); + calc.calc(mpPanes[14], mpPanes[15]); + mFloats[field_0x81C + i + 2] = + calc.work[3][0] / 2.0f + calc.work[4][0] / 2.0f + (calc.work[1][0] - calc.work[2][0]); } mAnm[SCORE_ANIM_RUPEE_CHANGE].setFrame(5.0f); @@ -2132,13 +2126,9 @@ void dLytMiniGameScore_c::init() { mLyt.calc(); mAnm[SCORE_ANIM_SET_POSITION].setAnimEnable(false); - // TODO - nw4r::lyt::Pane *p1 = mpPanes[15]; - nw4r::lyt::Pane *p2 = mpPanes[14]; - mFloats[field_0x81C + i + 4] = (p2->GetSize().width * p2->GetScale().x / 2.0f) + - (p1->GetSize().width * p1->GetScale().x / 2.0f) + - (p1->GetParent()->GetTranslate().x + p1->GetTranslate().x) - - (p2->GetParent()->GetTranslate().x + p2->GetTranslate().x); + calc.calc(mpPanes[14], mpPanes[15]); + mFloats[field_0x81C + i + 4] = + calc.work[3][0] / 2.0f + calc.work[4][0] / 2.0f + (calc.work[1][0] - calc.work[2][0]); } mAnm[SCORE_ANIM_RUPEE_CHANGE].setFrame(4.0f); @@ -2152,13 +2142,9 @@ void dLytMiniGameScore_c::init() { mLyt.calc(); mAnm[SCORE_ANIM_SET_POSITION].setAnimEnable(false); - // TODO - nw4r::lyt::Pane *p1 = mpPanes[15]; - nw4r::lyt::Pane *p2 = mpPanes[13]; - mFloats[field_0x81C + i + 6] = (p2->GetSize().width * p2->GetScale().x / 2.0f) + - (p1->GetSize().width * p1->GetScale().x / 2.0f) + - (p1->GetParent()->GetTranslate().x + p1->GetTranslate().x) - - (p2->GetParent()->GetTranslate().x + p2->GetTranslate().x); + calc.calc(mpPanes[13], mpPanes[15]); + mFloats[field_0x81C + i + 6] = + calc.work[3][0] / 2.0f + calc.work[4][0] / 2.0f + (calc.work[1][0] - calc.work[2][0]); } fn_80293450(field_0x81C); break; @@ -2174,13 +2160,9 @@ void dLytMiniGameScore_c::init() { mLyt.calc(); mAnm[SCORE_ANIM_SET_POSITION].setAnimEnable(false); - // TODO - nw4r::lyt::Pane *p1 = mpPanes[15]; - nw4r::lyt::Pane *p2 = mpPanes[14]; - mFloats[field_0x81C + i + 8] = (p2->GetSize().width * p2->GetScale().x / 2.0f) + - (p1->GetSize().width * p1->GetScale().x / 2.0f) + - (p1->GetParent()->GetTranslate().x + p1->GetTranslate().x) - - (p2->GetParent()->GetTranslate().x + p2->GetTranslate().x); + calc.calc(mpPanes[14], mpPanes[15]); + mFloats[field_0x81C + i + 6] = + calc.work[3][0] / 2.0f + calc.work[4][0] / 2.0f + (calc.work[1][0] - calc.work[2][0]); } fn_80293450(field_0x81C); @@ -2189,8 +2171,8 @@ void dLytMiniGameScore_c::init() { field_0x82C = 0; field_0x81C = 21; field_0x7E4 = 4; - dMessage_c::getGlobalTagProcessor()->setNumericArg0(field_0x7D8); - fn_802933A0(1); + dMessage_c::getGlobalTagProcessor()->setNumericArg0(mScore); + loadTextVariant(0); fn_80293410(); switch (field_0x830) { case 1: @@ -2212,13 +2194,9 @@ void dLytMiniGameScore_c::init() { mLyt.calc(); mAnm[SCORE_ANIM_SET_POSITION].setAnimEnable(false); - // TODO - nw4r::lyt::Pane *p1 = mpPanes[15]; - nw4r::lyt::Pane *p2 = mpPanes[i + 15]; - mFloats[field_0x81C + i] = field_0x7E8 + (p2->GetSize().width * p2->GetScale().x / 2.0f) + - (p1->GetSize().width * p1->GetScale().x / 2.0f) + - (p1->GetParent()->GetTranslate().x + p1->GetTranslate().x) - - (p2->GetParent()->GetTranslate().x + p2->GetTranslate().x); + calc.calc(mpPanes[i + 15], mpPanes[15]); + mFloats[field_0x81C + i] = + calc.work[3][0] / 2.0f + calc.work[4][0] / 2.0f + (calc.work[1][0] - calc.work[2][0]); mFloats[field_0x81C + i] += field_0x7FC; mFloats[field_0x81C + i] += field_0x800; } @@ -2237,32 +2215,28 @@ void dLytMiniGameScore_c::init() { mLyt.calc(); mAnm[SCORE_ANIM_SET_POSITION].setAnimEnable(false); - // TODO - nw4r::lyt::Pane *p1 = mpPanes[15]; - nw4r::lyt::Pane *p2 = mpPanes[12]; - - mFloats[field_0x81C + i + 8] = (p2->GetSize().width * p2->GetScale().x / 2.0f) + - (p1->GetSize().width * p1->GetScale().x / 2.0f) + - (p1->GetParent()->GetTranslate().x + p1->GetTranslate().x) - - (p2->GetParent()->GetTranslate().x + p2->GetTranslate().x); + calc.calc(mpPanes[12], mpPanes[15]); + // NOTE: 2.0 instead of 2.0f, so this division can't be an inline... + mFloats[field_0x81C + i] = + calc.work[3][0] / 2.0 + calc.work[4][0] / 2.0f + (calc.work[1][0] - calc.work[2][0]); } fn_80293450(field_0x81C); break; } - fn_802922F0(); - fn_80292500(); - fn_80292590(); - fn_80292610(); - fn_80292710(); - fn_80292880(); - fn_80291BA0(0); - fn_80292400(); - fn_80292480(); - fn_80292380(); - fn_80292250(); - field_0x7DC = 0; + resetDigits(); + resetSetPosition(); + resetRupeeChange(); + resetGetScore(); + resetFinish(); + resetLoop(); + setScore(0); + resetAlphaIn(); + resetAlphaOut(); + resetOut(); + resetIn(); + mLastScore = 0; field_0x804 = false; field_0x808 = 0; field_0x80C = 0; @@ -2292,14 +2266,14 @@ void dLytMiniGameScore_c::fn_80291410() { mIsVisible = true; if (field_0x818 == 1) { - fn_80291BA0(1); - fn_802920B0(); + setScore(1); + calcNumDigits(); mAnm[SCORE_ANIM_SET_POSITION].setFrame(field_0x81C); mAnm[SCORE_ANIM_SET_POSITION].setAnimEnable(true); fn_80292C30(); mAnm[SCORE_ANIM_0_TO_9_OFFSET].setFrame(1.0f); mAnm[SCORE_ANIM_0_TO_9_OFFSET].setAnimEnable(true); - + mLyt.getLayout()->Animate(0); mLyt.calc(); @@ -2313,7 +2287,6 @@ void dLytMiniGameScore_c::fn_802915B0() { return; } - if (field_0x814 && field_0x815) { mAnm[SCORE_ANIM_OUT].setToStart(); mAnm[SCORE_ANIM_OUT].setAnimEnable(true); @@ -2408,7 +2381,7 @@ void dLytMiniGameScore_c::startAlphaOut() { mAnm[SCORE_ANIM_ALPHA_OUT].setAnimEnable(true); } -void dLytMiniGameScore_c::fn_80291960() { +void dLytMiniGameScore_c::startGetScore() { if (sInstance == nullptr) { return; } @@ -2417,7 +2390,7 @@ void dLytMiniGameScore_c::fn_80291960() { return; } - for (int i = 0; i <= field_0x7E0; i++) { + for (int i = 0; i <= mHighestDigitIndex; i++) { mAnm[i + SCORE_ANIM_GET_SCORE_OFFSET].setToStart(); mAnm[i + SCORE_ANIM_GET_SCORE_OFFSET].setAnimEnable(true); } @@ -2426,14 +2399,14 @@ void dLytMiniGameScore_c::fn_80291960() { mAnm[SCORE_ANIM_GET_SCORE_GET_TEXT_F].setAnimEnable(true); } -void dLytMiniGameScore_c::fn_80291A30() { +void dLytMiniGameScore_c::startFinish() { if (sInstance == nullptr) { return; } - fn_802920B0(); + calcNumDigits(); - for (int i = 0; i <= field_0x7E0; i++) { + for (int i = 0; i <= mHighestDigitIndex; i++) { mAnm[i + SCORE_ANIM_FINISH_SCORE_OFFSET].setToStart(); mAnm[i + SCORE_ANIM_FINISH_SCORE_OFFSET].setAnimEnable(true); } @@ -2457,19 +2430,19 @@ void dLytMiniGameScore_c::startLoop() { mAnm[SCORE_ANIM_LOOP_SCORE].setAnimEnable(true); } -void dLytMiniGameScore_c::fn_80291BA0(s32 score) { +void dLytMiniGameScore_c::setScore(s32 score) { if (sInstance == nullptr) { return; } - field_0x7D8 = score; + mScore = score; } void dLytMiniGameScore_c::fn_80291BC0() { s32 digits[5]; - digits[4] = field_0x7D8 / 10000; - - s32 v = field_0x7D8; + digits[4] = mScore / 10000; + + s32 v = mScore; v %= 10000; digits[3] = v / 1000; v %= 1000; @@ -2479,8 +2452,8 @@ void dLytMiniGameScore_c::fn_80291BC0() { v %= 10; digits[0] = v; - fn_802920B0(); - fn_80292110(); + calcNumDigits(); + realizePosition(); if (field_0x818 == 1) { if (field_0x828) { @@ -2492,7 +2465,7 @@ void dLytMiniGameScore_c::fn_80291BC0() { fn_80292C30(); - for (int i = 0; i <= field_0x7E0; i++) { + for (int i = 0; i <= mHighestDigitIndex; i++) { setDigit(i, digits[i]); } } @@ -2502,7 +2475,7 @@ void dLytMiniGameScore_c::fn_80291D40(s32 arg) { return; } - s32 diff = arg - field_0x7D8; + s32 diff = arg - mScore; switch (diff) { case 1: field_0x80C = 1; @@ -2524,11 +2497,10 @@ void dLytMiniGameScore_c::fn_80291D40(s32 arg) { field_0x80C = 25; field_0x810 = 12; break; - case 0: - return; + case 0: return; } - if (arg < field_0x7D8) { + if (arg < mScore) { field_0x80C = nw4r::math::FAbs(diff); field_0x810 = -1; } @@ -2537,136 +2509,322 @@ void dLytMiniGameScore_c::fn_80291D40(s32 arg) { field_0x829 = true; } -bool dLytMiniGameScore_c::fn_80291E50() const { - +bool dLytMiniGameScore_c::hasIncreasedScore() const { + if (sInstance == nullptr) { + return false; + } + return mLastScore < mScore; } -void dLytMiniGameScore_c::fn_80291E90() { - +bool dLytMiniGameScore_c::hasDecreasedScore() const { + if (sInstance == nullptr) { + return false; + } + return mScore < mLastScore; } -void dLytMiniGameScore_c::fn_80291ED0() { - +void dLytMiniGameScore_c::fn_80291ED0(s32 arg) { + if (sInstance == nullptr) { + return; + } + field_0x824 = arg; } void dLytMiniGameScore_c::fn_80291EF0() { + f32 f1 = 0.0f; + switch (field_0x824) { + case 0: f1 = 4.0; break; + case 1: f1 = 0.0; break; + case 2: f1 = 1.0; break; + case 3: f1 = 2.0; break; + case 4: f1 = 5.0; break; + case 6: f1 = 3.0; break; + } + f32 f2 = 0.0f; + if (field_0x824 == 4) { + f2 = 2.0; + } else if (field_0x824 == 0) { + f2 = 4.0; + } + + f32 frame = mAnm[SCORE_ANIM_SET_POSITION].getFrame(); + mAnm[SCORE_ANIM_SET_POSITION].setFrame(frame + 2.0f + f2); + mAnm[SCORE_ANIM_SET_POSITION].setAnimEnable(true); + + mAnm[SCORE_ANIM_RUPEE_CHANGE].setFrame(f1); + mAnm[SCORE_ANIM_RUPEE_CHANGE].setAnimEnable(true); + + mLyt.calc(); + + mAnm[SCORE_ANIM_RUPEE_CHANGE].setAnimEnable(false); + mAnm[SCORE_ANIM_SET_POSITION].setAnimEnable(false); } -void dLytMiniGameScore_c::fn_80292030(s32) { - +void dLytMiniGameScore_c::increaseScore(s32 arg) { + setScore(mScore + arg); } void dLytMiniGameScore_c::fn_80292040() { + mAnm[SCORE_ANIM_RUPEE_CHANGE].setFrame(6.0f); + mAnm[SCORE_ANIM_RUPEE_CHANGE].setAnimEnable(true); + mLyt.calc(); + + mAnm[SCORE_ANIM_RUPEE_CHANGE].setAnimEnable(false); } -void dLytMiniGameScore_c::fn_802920B0() { - +s32 dLytMiniGameScore_c::calcNumDigits() { + s32 num; + if (mScore >= 10000) { + num = 4; + } else if (mScore >= 1000) { + num = 3; + } else if (mScore >= 100) { + num = 2; + } else if (mScore >= 10) { + num = 1; + } else { + num = 0; + } + mHighestDigitIndex = num; + return num; } -void dLytMiniGameScore_c::fn_80292110() { +void dLytMiniGameScore_c::realizePosition() { + mAnm[SCORE_ANIM_SET_POSITION].setFrame(field_0x81C + mHighestDigitIndex); + mAnm[SCORE_ANIM_SET_POSITION].setAnimEnable(true); + mLyt.calc(); + + mAnm[SCORE_ANIM_SET_POSITION].setAnimEnable(false); } void dLytMiniGameScore_c::setDigit(s32 digitIndex, s32 number) { + s32 idx = digitIndex + SCORE_ANIM_0_TO_9_OFFSET; + f32 frame = number; + mAnm[idx].setFrame(frame); + mAnm[idx].setAnimEnable(true); + + mLyt.calc(); + + mAnm[idx].setAnimEnable(false); } -void dLytMiniGameScore_c::fn_80292240() { - +void dLytMiniGameScore_c::saveScore() { + mLastScore = mScore; } -void dLytMiniGameScore_c::fn_80292250() { +void dLytMiniGameScore_c::resetIn() { + mAnm[SCORE_ANIM_IN].setForwardOnce(); + mAnm[SCORE_ANIM_IN].setToStart(); + mAnm[SCORE_ANIM_IN].setAnimEnable(true); + mLyt.getLayout()->Animate(0); + mLyt.calc(); + + mAnm[SCORE_ANIM_IN].setAnimEnable(false); } -void dLytMiniGameScore_c::fn_802922F0() { - +void dLytMiniGameScore_c::resetDigits() { + // NOTE: includes SCORE_ANIM_SET_POSITION + for (int i = 0; i <= SCORE_NUM_DIGITS; i++) { + s32 idx = i + SCORE_ANIM_0_TO_9_OFFSET; + mAnm[idx].setForwardOnce(); + mAnm[idx].setFrame(0.0f); + mAnm[idx].setAnimEnable(false); + } } -void dLytMiniGameScore_c::fn_80292380() { +void dLytMiniGameScore_c::resetOut() { + mAnm[SCORE_ANIM_OUT].setForwardOnce(); + mAnm[SCORE_ANIM_OUT].setToStart(); + mAnm[SCORE_ANIM_OUT].setAnimEnable(true); + mLyt.calc(); + + mAnm[SCORE_ANIM_OUT].setAnimEnable(false); } -void dLytMiniGameScore_c::fn_80292400() { +void dLytMiniGameScore_c::resetAlphaIn() { + mAnm[SCORE_ANIM_ALPHA_IN].setForwardOnce(); + mAnm[SCORE_ANIM_ALPHA_IN].setToStart(); + mAnm[SCORE_ANIM_ALPHA_IN].setAnimEnable(true); + mLyt.calc(); + + mAnm[SCORE_ANIM_ALPHA_IN].setAnimEnable(false); } -void dLytMiniGameScore_c::fn_80292480() { +void dLytMiniGameScore_c::resetAlphaOut() { + mAnm[SCORE_ANIM_ALPHA_OUT].setForwardOnce(); + mAnm[SCORE_ANIM_ALPHA_OUT].setToStart(); + mAnm[SCORE_ANIM_ALPHA_OUT].setAnimEnable(true); + mLyt.calc(); + + mAnm[SCORE_ANIM_ALPHA_OUT].setAnimEnable(false); } -void dLytMiniGameScore_c::fn_80292500() { +void dLytMiniGameScore_c::resetSetPosition() { + mAnm[SCORE_ANIM_SET_POSITION].setForwardOnce(); + mAnm[SCORE_ANIM_SET_POSITION].setFrame(field_0x81C); + mAnm[SCORE_ANIM_SET_POSITION].setAnimEnable(true); + mLyt.calc(); + + mAnm[SCORE_ANIM_SET_POSITION].setAnimEnable(false); } -void dLytMiniGameScore_c::fn_80292590() { +void dLytMiniGameScore_c::resetRupeeChange() { + mAnm[SCORE_ANIM_RUPEE_CHANGE].setForwardOnce(); + mAnm[SCORE_ANIM_RUPEE_CHANGE].setToEnd2(); + mAnm[SCORE_ANIM_RUPEE_CHANGE].setAnimEnable(true); + mLyt.calc(); + + mAnm[SCORE_ANIM_RUPEE_CHANGE].setAnimEnable(false); } -void dLytMiniGameScore_c::fn_80292610() { +void dLytMiniGameScore_c::resetGetScore() { + for (int i = 0; i < SCORE_NUM_DIGITS; i++) { + mAnm[i + SCORE_ANIM_GET_SCORE_OFFSET].setForwardOnce(); + mAnm[i + SCORE_ANIM_GET_SCORE_OFFSET].setToStart(); + mAnm[i + SCORE_ANIM_GET_SCORE_OFFSET].setAnimEnable(true); + } + mAnm[SCORE_ANIM_GET_SCORE_GET_TEXT_F].setForwardOnce(); + mAnm[SCORE_ANIM_GET_SCORE_GET_TEXT_F].setToStart(); + mAnm[SCORE_ANIM_GET_SCORE_GET_TEXT_F].setAnimEnable(true); + + mLyt.calc(); + + mAnm[SCORE_ANIM_GET_SCORE_GET_TEXT_F].setAnimEnable(false); + + for (int i = 0; i < SCORE_NUM_DIGITS; i++) { + mAnm[i + SCORE_ANIM_GET_SCORE_OFFSET].setAnimEnable(false); + } } -void dLytMiniGameScore_c::fn_80292710() { +void dLytMiniGameScore_c::resetFinish() { + for (int i = 0; i < SCORE_NUM_DIGITS; i++) { + mAnm[i + SCORE_ANIM_FINISH_SCORE_OFFSET].setForwardOnce(); + mAnm[i + SCORE_ANIM_FINISH_SCORE_OFFSET].setToStart(); + mAnm[i + SCORE_ANIM_FINISH_SCORE_OFFSET].setAnimEnable(true); + } + mAnm[SCORE_ANIM_FINISH_SCORE_GET_SCORE_W].setForwardOnce(); + mAnm[SCORE_ANIM_FINISH_SCORE_GET_SCORE_W].setToStart(); + mAnm[SCORE_ANIM_FINISH_SCORE_GET_SCORE_W].setAnimEnable(true); + + mAnm[SCORE_ANIM_FINISH_SCORE_GET_SCORE_X].setForwardOnce(); + mAnm[SCORE_ANIM_FINISH_SCORE_GET_SCORE_X].setToStart(); + mAnm[SCORE_ANIM_FINISH_SCORE_GET_SCORE_X].setAnimEnable(true); + + mAnm[SCORE_ANIM_FINISH_SCORE_GET_SCORE_F].setForwardOnce(); + mAnm[SCORE_ANIM_FINISH_SCORE_GET_SCORE_F].setToStart(); + mAnm[SCORE_ANIM_FINISH_SCORE_GET_SCORE_F].setAnimEnable(true); + + mLyt.calc(); + + mAnm[SCORE_ANIM_FINISH_SCORE_GET_SCORE_F].setAnimEnable(false); + mAnm[SCORE_ANIM_FINISH_SCORE_GET_SCORE_X].setAnimEnable(false); + mAnm[SCORE_ANIM_FINISH_SCORE_GET_SCORE_W].setAnimEnable(false); + + for (int i = 0; i < SCORE_NUM_DIGITS; i++) { + mAnm[i + SCORE_ANIM_FINISH_SCORE_OFFSET].setAnimEnable(false); + } } -void dLytMiniGameScore_c::fn_80292880() { +void dLytMiniGameScore_c::resetLoop() { + mAnm[SCORE_ANIM_LOOP_SCORE].setForwardLoop(); + mAnm[SCORE_ANIM_LOOP_SCORE].setFrame(0.0f); + mAnm[SCORE_ANIM_LOOP_SCORE].setAnimEnable(true); + mLyt.getLayout()->Animate(0); + mLyt.calc(); + + mAnm[SCORE_ANIM_LOOP_SCORE].setAnimEnable(false); } -void dLytMiniGameScore_c::fn_80292910() { - +void dLytMiniGameScore_c::stopIn() { + mAnm[SCORE_ANIM_IN].setAnimEnable(false); } -void dLytMiniGameScore_c::fn_80292920() { - +void dLytMiniGameScore_c::stopOut() { + mAnm[SCORE_ANIM_OUT].setAnimEnable(false); } -bool dLytMiniGameScore_c::fn_80292930() const { - +void dLytMiniGameScore_c::stopAlphaIn() { + mAnm[SCORE_ANIM_ALPHA_IN].setAnimEnable(false); } -void dLytMiniGameScore_c::fn_80292940() { - +void dLytMiniGameScore_c::stopAlphaOut() { + mAnm[SCORE_ANIM_ALPHA_OUT].setAnimEnable(false); } -void dLytMiniGameScore_c::fn_80292950() { - +void dLytMiniGameScore_c::stopGetScore() { + for (int i = 0; i < SCORE_NUM_DIGITS; i++) { + mAnm[i + SCORE_ANIM_GET_SCORE_OFFSET].setAnimEnable(false); + } + mAnm[SCORE_ANIM_GET_SCORE_GET_TEXT_F].setAnimEnable(false); } -void dLytMiniGameScore_c::fn_802929C0() { +void dLytMiniGameScore_c::stopFinish() { + for (int i = 0; i < SCORE_NUM_DIGITS; i++) { + mAnm[i + SCORE_ANIM_FINISH_SCORE_OFFSET].setAnimEnable(false); + } + mAnm[SCORE_ANIM_FINISH_SCORE_GET_SCORE_W].setAnimEnable(false); + mAnm[SCORE_ANIM_FINISH_SCORE_GET_SCORE_X].setAnimEnable(false); + mAnm[SCORE_ANIM_FINISH_SCORE_GET_SCORE_F].setAnimEnable(false); } -void dLytMiniGameScore_c::fn_80292A40() { - +void dLytMiniGameScore_c::stopLoop() { + mAnm[SCORE_ANIM_LOOP_SCORE].setAnimEnable(false); } -bool dLytMiniGameScore_c::fn_80292A50() const { - +bool dLytMiniGameScore_c::isInEndReached() const { + if (mAnm[SCORE_ANIM_IN].isEnabled() && mAnm[SCORE_ANIM_IN].isEndReached()) { + return true; + } + return false; } -bool dLytMiniGameScore_c::fn_80292AA0() const { - +bool dLytMiniGameScore_c::isOutEndReached() const { + if (mAnm[SCORE_ANIM_OUT].isEnabled() && mAnm[SCORE_ANIM_OUT].isEndReached()) { + return true; + } + return false; } -bool dLytMiniGameScore_c::fn_80292AF0() const { - +bool dLytMiniGameScore_c::isAlphaInEndReached() const { + if (mAnm[SCORE_ANIM_ALPHA_IN].isEnabled() && mAnm[SCORE_ANIM_ALPHA_IN].isEndReached()) { + return true; + } + return false; } -bool dLytMiniGameScore_c::fn_80292B40() const { - +bool dLytMiniGameScore_c::isAlphaOutEndReached() const { + if (mAnm[SCORE_ANIM_ALPHA_OUT].isEnabled() && mAnm[SCORE_ANIM_ALPHA_OUT].isEndReached()) { + return true; + } + return false; } -bool dLytMiniGameScore_c::fn_80292B90() const { - +bool dLytMiniGameScore_c::isGetScoreEndReached() const { + if (mAnm[SCORE_ANIM_GET_SCORE_OFFSET].isEnabled() && mAnm[SCORE_ANIM_GET_SCORE_OFFSET].isEndReached()) { + return true; + } + return false; } -bool dLytMiniGameScore_c::fn_80292BE0() const { - +bool dLytMiniGameScore_c::isFinishEndReached() const { + if (mAnm[SCORE_ANIM_FINISH_SCORE_OFFSET].isEnabled() && mAnm[SCORE_ANIM_FINISH_SCORE_OFFSET].isEndReached()) { + return true; + } + return false; } void dLytMiniGameScore_c::fn_80292C30() { @@ -2675,57 +2833,113 @@ void dLytMiniGameScore_c::fn_80292C30() { t = field_0x824 == 4 ? 4 : field_0x824 == 0 ? 6 : 0; } + PaneCalc calc; + switch (field_0x818) { case 0: { - dMessage_c::getGlobalTagProcessor()->setNumericArg0(field_0x7D8); - fn_802933A0(1); + dMessage_c::getGlobalTagProcessor()->setNumericArg0(mScore); + loadTextVariant(1); field_0x7E8 = mpTextBoxes[0]->GetLineWidth(nullptr); // TODO - nw4r::lyt::Pane *p1 = mpPanes[15]; - nw4r::lyt::Pane *p2 = mpPanes[field_0x7E0 + 15]; - mFloats[field_0x81C + field_0x7E0] = field_0x7E8 + (p2->GetSize().width * (p2->GetScale().x / 2.0f)) + - (p1->GetSize().width * (p1->GetScale().x / 2.0f)) + - (p1->GetParent()->GetTranslate().x + p1->GetTranslate().x) - - (p2->GetParent()->GetTranslate().x + p2->GetTranslate().x); - mFloats[field_0x81C + field_0x7E0] += field_0x7FC; - mFloats[field_0x81C + field_0x7E0] += field_0x800; + calc.calc(mpPanes[mHighestDigitIndex + 15], mpPanes[15]); + mFloats[field_0x81C + mHighestDigitIndex] = + calc.work[3][0] / 2.0f + calc.work[4][0] / 2.0f + (calc.work[1][0] - calc.work[2][0]); + mFloats[field_0x81C + mHighestDigitIndex] += field_0x7FC; + mFloats[field_0x81C + mHighestDigitIndex] += field_0x800; break; } case 3: { - dMessage_c::getGlobalTagProcessor()->setNumericArg0(field_0x7D8); - fn_802933A0(0); + dMessage_c::getGlobalTagProcessor()->setNumericArg0(mScore); + loadTextVariant(0); field_0x7E8 = mpTextBoxes[0]->GetLineWidth(nullptr); // TODO - nw4r::lyt::Pane *p1 = mpPanes[15]; - nw4r::lyt::Pane *p2 = mpPanes[field_0x7E0 + 15]; - mFloats[field_0x81C + field_0x7E0] = field_0x7E8 + (p2->GetSize().width * (p2->GetScale().x / 2.0f)) + - (p1->GetSize().width * (p1->GetScale().x / 2.0f)) + - (p1->GetParent()->GetTranslate().x + p1->GetTranslate().x) - - (p2->GetParent()->GetTranslate().x + p2->GetTranslate().x); - mFloats[field_0x81C + field_0x7E0] += field_0x7FC; - mFloats[field_0x81C + field_0x7E0] += field_0x800; + calc.calc(mpPanes[mHighestDigitIndex + 15], mpPanes[15]); + mFloats[field_0x81C + mHighestDigitIndex] = + calc.work[3][0] / 2.0f + calc.work[4][0] / 2.0f + (calc.work[1][0] - calc.work[2][0]); + mFloats[field_0x81C + mHighestDigitIndex] += field_0x7FC; + mFloats[field_0x81C + mHighestDigitIndex] += field_0x800; break; } } + + f32 f = mFloats[mHighestDigitIndex + t + field_0x81C]; + + if (field_0x830 != 0) { + nw4r::lyt::Size size = mpTextBoxes[0]->GetSize(); + switch (field_0x830) { + case 1: { + mVec3_c pos( + f / 2.0f + size.width / 2.0f - field_0x7E8 + 0.0f + (f32)field_0x7F4 - (f32)field_0x800, + field_0x834[1][1] + (f32)field_0x7EC + (f32)field_0x7F8, 0.0f + ); + mpPanes[SCORE_PANE_UNIT]->SetTranslate(pos); + break; + } + case 2: { + mVec3_c pos( + (f32)field_0x7E8 - f / 2.0f - size.width / 2.0f + 0.0 + (f32)field_0x7F4 + (f32)field_0x800, + field_0x834[1][1] + (f32)field_0x7EC + (f32)field_0x7F8, 0.0f + ); + mpPanes[SCORE_PANE_UNIT]->SetTranslate(pos); + break; + } + } + } + + // TODO - ... + + fn_80293450(mHighestDigitIndex + t + field_0x81C); + nw4r::math::MTX34 mtx = mpPanes[SCORE_PANE_CENTER]->GetGlobalMtx(); + mVec3_c pos(mtx._03, mtx._13, 0.0f); + mpPanes[SCORE_PANE_POSITION_ALL]->SetTranslate(pos); } -void dLytMiniGameScore_c::fn_802933A0(s32 variant) { - +void dLytMiniGameScore_c::loadTextVariant(s32 variant) { + for (int i = 0; i < SCORE_NUM_TEXTBOXES; i++) { + mLyt.loadTextVariant(mpTextBoxes[i], variant); + } } void dLytMiniGameScore_c::fn_80293410() { - + (void)getCurrentLanguage1(); + field_0x830 = 1; } -void dLytMiniGameScore_c::fn_80293450(s32) { +void dLytMiniGameScore_c::fn_80293450(s32 idx) { + // TODO - aaaaaaaaaaaaa + f32 tmp = field_0x7F0 + mFloats[idx]; + mpPanes[11]->SetSize(nw4r::lyt::Size(tmp, mpPanes[11]->GetSize().height)); + mpPanes[11]->SetTranslate(mVec3_c(0.0f, 0.0f, 0.0f)); + + tmp /= 2.0f; + + mpPanes[9]->SetTranslate(mVec3_c(-tmp - mpPanes[9]->GetSize().width, 0.0f, 0.0f)); + mpPanes[10]->SetTranslate(mVec3_c(tmp + mpPanes[10]->GetSize().width, 0.0f, 0.0f)); + + tmp = field_0x7F0 + mFloats[idx]; + + mpPanes[8]->SetSize(nw4r::lyt::Size(tmp, mpPanes[8]->GetSize().height)); + mpPanes[8]->SetTranslate(mVec3_c(-2.0f, -2.0f, 0.0f)); + + tmp /= 2.0f; + + mpPanes[6]->SetTranslate(mVec3_c(-tmp - mpPanes[6]->GetSize().width - 2.0f, -2.0f, 0.0f)); + mpPanes[7]->SetTranslate(mVec3_c(tmp + mpPanes[7]->GetSize().width - 2.0f, -2.0f, 0.0f)); + + mpPanes[5]->SetSize(nw4r::lyt::Size( + mpPanes[10]->GetSize().width + mpPanes[11]->GetSize().width + mpPanes[9]->GetSize().width - 36.0f, + mpPanes[5]->GetSize().height + )); + + mpPanes[5]->SetTranslate(mVec3_c(0.0f, 0.0f, 0.0f)); + mpPanes[4]->SetTranslate(mVec3_c(field_0x834[2][0], field_0x834[2][1], 0.0f)); } - static const d2d::LytBrlanMapping brlanMapScoreSd[] = { { "miniGameScoreSd_00_0to9.brlan", "G_0to9_00"}, { "miniGameScoreSd_00_0to9.brlan", "G_0to9_01"}, @@ -2734,6 +2948,12 @@ static const d2d::LytBrlanMapping brlanMapScoreSd[] = { { "miniGameScoreSd_00_scoreDown.brlan", "G_animAll_00"}, }; +#define SCORE_SD_ANIM_0_TO_9_0 0 +#define SCORE_SD_ANIM_0_TO_9_1 1 +#define SCORE_SD_ANIM_SET_POSITION 2 +#define SCORE_SD_ANIM_SCORE_UP 3 +#define SCORE_SD_ANIM_SCORE_DOWN 4 + #define SCORE_SD_NUM_ANIMS 5 bool dLytMiniGameScoreSd_c::build(d2d::ResAccIf_c *resAcc) { @@ -2744,6 +2964,7 @@ bool dLytMiniGameScoreSd_c::build(d2d::ResAccIf_c *resAcc) { mAnm[i].init(brlanMapScoreSd[i].mFile, resAcc, mLyt.getLayout(), brlanMapScoreSd[i].mName); mAnm[i].bind(false); mAnm[i].setRate(1.0f); + mAnm[i].setAnimEnable(false); } sInstance = this; @@ -2768,13 +2989,25 @@ bool dLytMiniGameScoreSd_c::execute() { return true; } - for (int i = 0; i < SCORE_SD_NUM_ANIMS; i++) { - if (mAnm[i].isEnabled()) { - mAnm[i].play(); + if (mIsVisible) { + if (fn_80294030()) { + fn_80294010(); + mIsVisible = false; } - } - mLyt.calc(); + if (fn_80294080()) { + fn_80294020(); + mIsVisible = false; + } + + for (int i = 0; i < SCORE_SD_NUM_ANIMS; i++) { + if (mAnm[i].isEnabled()) { + mAnm[i].play(); + } + } + + mLyt.calc(); + } return true; } @@ -2783,12 +3016,88 @@ bool dLytMiniGameScoreSd_c::draw() { if (sInstance == nullptr) { return true; } - mLyt.addToDrawList(); + if (mIsVisible) { + mLyt.addToDrawList(); + } return true; } void dLytMiniGameScoreSd_c::init() { - // TODO - ... + if (sInstance == nullptr) { + return; + } + + fn_80293D40(); + fn_80293DC0(); + fn_80293E40(); + fn_80293ED0(); + fn_80293AF0(0); + + mAnm[SCORE_SD_ANIM_SCORE_UP].setToEnd2(); + mAnm[SCORE_SD_ANIM_SCORE_UP].setAnimEnable(true); + mLyt.calc(); + mAnm[SCORE_SD_ANIM_SCORE_UP].setAnimEnable(false); } +void dLytMiniGameScoreSd_c::fn_80293A30() { + +} + +void dLytMiniGameScoreSd_c::fn_80293A90() { + +} + +void dLytMiniGameScoreSd_c::fn_80293AF0(s32) { + +} + +void dLytMiniGameScoreSd_c::fn_80293BB0() { + +} + +void dLytMiniGameScoreSd_c::fn_80293C60() { + +} + +void dLytMiniGameScoreSd_c::fn_80293D40() { + +} + +void dLytMiniGameScoreSd_c::fn_80293DC0() { + +} + +void dLytMiniGameScoreSd_c::fn_80293E40() { + +} + +void dLytMiniGameScoreSd_c::fn_80293ED0() { + +} + +void dLytMiniGameScoreSd_c::fn_80293F50() { + +} + +void dLytMiniGameScoreSd_c::fn_80293FB0() { + +} + +void dLytMiniGameScoreSd_c::fn_80294010() { + +} + +void dLytMiniGameScoreSd_c::fn_80294020() { + +} + +bool dLytMiniGameScoreSd_c::fn_80294030() const { + +} + +bool dLytMiniGameScoreSd_c::fn_80294080() const { + +} + + SPECIAL_BASE_PROFILE(LYT_MINI_GAME, dLytMiniGame_c, fProfile::LYT_MINI_GAME, 0x2B4, 0x6F9); From f8c9af7dc612f635253eb4b75d8b4e802a8e15cd Mon Sep 17 00:00:00 2001 From: robojumper Date: Thu, 4 Dec 2025 00:31:49 +0100 Subject: [PATCH 4/9] 82% --- config/SOUE01/splits.txt | 1 + config/SOUE01/symbols.txt | 50 +- include/d/lyt/d_lyt_mini_game.h | 139 ++++-- include/d/snd/d_snd_small_effect_mgr.h | 2 +- src/d/lyt/d_lyt_mini_game.cpp | 618 ++++++++++++++++++++++--- src/d/snd/d_snd_small_effect_mgr.cpp | 2 +- 6 files changed, 689 insertions(+), 123 deletions(-) diff --git a/config/SOUE01/splits.txt b/config/SOUE01/splits.txt index 3cf914ad..e4f60c69 100644 --- a/config/SOUE01/splits.txt +++ b/config/SOUE01/splits.txt @@ -1620,6 +1620,7 @@ d/lyt/d_lyt_mini_game.cpp: .text start:0x8028BCE0 end:0x802969E0 align:16 .rodata start:0x804EE7D8 end:0x804EEB68 .data start:0x80538E58 end:0x80539B68 + .sdata start:0x80573B90 end:0x80573BB0 .sbss start:0x80575970 end:0x80575990 .sdata2 start:0x8057C700 end:0x8057C760 diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 618d614a..9de06218 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -15409,21 +15409,21 @@ remove__21dLytMiniGameScoreSd_cFv = .text:0x802937C0; // type:function size:0x74 execute__21dLytMiniGameScoreSd_cFv = .text:0x80293840; // type:function size:0xF0 draw__21dLytMiniGameScoreSd_cFv = .text:0x80293930; // type:function size:0x48 init__21dLytMiniGameScoreSd_cFv = .text:0x80293980; // type:function size:0xA8 -fn_80293A30__21dLytMiniGameScoreSd_cFv = .text:0x80293A30; // type:function size:0x60 -fn_80293A90__21dLytMiniGameScoreSd_cFv = .text:0x80293A90; // type:function size:0x60 -fn_80293AF0__21dLytMiniGameScoreSd_cFl = .text:0x80293AF0; // type:function size:0xC0 -fn_80293BB0__21dLytMiniGameScoreSd_cFv = .text:0x80293BB0; // type:function size:0xA8 -fn_80293C60__21dLytMiniGameScoreSd_cFv = .text:0x80293C60; // type:function size:0xE0 -fn_80293D40__21dLytMiniGameScoreSd_cFv = .text:0x80293D40; // type:function size:0x80 -fn_80293DC0__21dLytMiniGameScoreSd_cFv = .text:0x80293DC0; // type:function size:0x80 -fn_80293E40__21dLytMiniGameScoreSd_cFv = .text:0x80293E40; // type:function size:0x88 -fn_80293ED0__21dLytMiniGameScoreSd_cFv = .text:0x80293ED0; // type:function size:0x74 -fn_80293F50__21dLytMiniGameScoreSd_cFv = .text:0x80293F50; // type:function size:0x54 -fn_80293FB0__21dLytMiniGameScoreSd_cFv = .text:0x80293FB0; // type:function size:0x54 -fn_80294010__21dLytMiniGameScoreSd_cFv = .text:0x80294010; // type:function size:0xC -fn_80294020__21dLytMiniGameScoreSd_cFv = .text:0x80294020; // type:function size:0xC -fn_80294030__21dLytMiniGameScoreSd_cCFv = .text:0x80294030; // type:function size:0x44 -fn_80294080__21dLytMiniGameScoreSd_cCFv = .text:0x80294080; // type:function size:0x44 +setScoreUp__21dLytMiniGameScoreSd_cFl = .text:0x80293A30; // type:function size:0x60 +setScoreDown__21dLytMiniGameScoreSd_cFl = .text:0x80293A90; // type:function size:0x60 +setScoreInternal__21dLytMiniGameScoreSd_cFl = .text:0x80293AF0; // type:function size:0xC0 +setHighestDigitIndex__21dLytMiniGameScoreSd_cFl = .text:0x80293BB0; // type:function size:0xA8 +setDigit__21dLytMiniGameScoreSd_cFll = .text:0x80293C60; // type:function size:0xE0 +resetScoreUp__21dLytMiniGameScoreSd_cFv = .text:0x80293D40; // type:function size:0x80 +resetScoreDown__21dLytMiniGameScoreSd_cFv = .text:0x80293DC0; // type:function size:0x80 +resetDigits__21dLytMiniGameScoreSd_cFv = .text:0x80293E40; // type:function size:0x88 +resetPosition__21dLytMiniGameScoreSd_cFv = .text:0x80293ED0; // type:function size:0x74 +startScoreUp__21dLytMiniGameScoreSd_cFv = .text:0x80293F50; // type:function size:0x54 +startScoreDown__21dLytMiniGameScoreSd_cFv = .text:0x80293FB0; // type:function size:0x54 +stopScoreUp__21dLytMiniGameScoreSd_cFv = .text:0x80294010; // type:function size:0xC +stopScoreDown__21dLytMiniGameScoreSd_cFv = .text:0x80294020; // type:function size:0xC +isScoreUpEndReached__21dLytMiniGameScoreSd_cCFv = .text:0x80294030; // type:function size:0x44 +isScoreDownEndReached__21dLytMiniGameScoreSd_cCFv = .text:0x80294080; // type:function size:0x44 dLytMiniGame_c_classInit__Fv = .text:0x802940D0; // type:function size:0x380 __dt__19dLytMiniGameScore_cFv = .text:0x80294450; // type:function size:0x74 __dt__21dLytMiniGameScoreSd_cFv = .text:0x802944D0; // type:function size:0x74 @@ -15433,10 +15433,10 @@ __dt__18dLytMiniGameBugs_cFv = .text:0x80294650; // type:function size:0x74 __ct__26dLytMiniGamePumpkinParts_cFv = .text:0x802946D0; // type:function size:0x6C __dt__26dLytMiniGamePumpkinParts_cFv = .text:0x80294740; // type:function size:0x74 __dt__21dLytMiniGamePumpkin_cFv = .text:0x802947C0; // type:function size:0x68 -LytMiniGame__init = .text:0x80294830; // type:function size:0xA94 -LytMiniGame__destructRes = .text:0x802952D0; // type:function size:0x31C -fn_802955F0 = .text:0x802955F0; // type:function size:0xD4 -fn_802956D0 = .text:0x802956D0; // type:function size:0x6C +create__14dLytMiniGame_cFv = .text:0x80294830; // type:function size:0xA94 +doDelete__14dLytMiniGame_cFv = .text:0x802952D0; // type:function size:0x31C +execute__14dLytMiniGame_cFv = .text:0x802955F0; // type:function size:0xD4 +draw__14dLytMiniGame_cFv = .text:0x802956D0; // type:function size:0x6C scoreRelatedExecute__14dLytMiniGame_cFv = .text:0x80295740; // type:function size:0x8C scoreRelated__14dLytMiniGame_cFv = .text:0x802957D0; // type:function size:0x78 setDisplayedPoints__14dLytMiniGame_cFl = .text:0x80295850; // type:function size:0xA8 @@ -15480,11 +15480,11 @@ fn_802962A0 = .text:0x802962A0; // type:function size:0x88 fn_80296330 = .text:0x80296330; // type:function size:0xA4 fn_802963E0 = .text:0x802963E0; // type:function size:0x98 fn_80296480 = .text:0x80296480; // type:function size:0x98 -fn_80296520 = .text:0x80296520; // type:function size:0x58 -fn_80296580 = .text:0x80296580; // type:function size:0x130 -fn_802966B0 = .text:0x802966B0; // type:function size:0x30 -fn_802966E0 = .text:0x802966E0; // type:function size:0x40 -decrementLayoutArcRefCount = .text:0x80296720; // type:function size:0x4C +init__14dLytMiniGame_cFv = .text:0x80296520; // type:function size:0x58 +loadData__14dLytMiniGame_cFPCcl = .text:0x80296580; // type:function size:0x130 +isLoading__14dLytMiniGame_cCFPCc = .text:0x802966B0; // type:function size:0x30 +attachLoadedData__14dLytMiniGame_cFPCcRQ23d2d10ResAccIf_c = .text:0x802966E0; // type:function size:0x40 +unloadData__14dLytMiniGame_cFPCc = .text:0x80296720; // type:function size:0x4C __dt__14dLytMiniGame_cFv = .text:0x80296770; // type:function size:0x270 LytMeterSuiryuScoreBase__stateNoneEnter = .text:0x802969E0; // type:function size:0x4 LytMeterSuiryuScoreBase__stateNoneUpdate = .text:0x802969F0; // type:function size:0x4 @@ -20855,7 +20855,7 @@ playMinigameStartSound__20dSndSmallEffectMgr_cFv = .text:0x8037EA80; // type:fun playMinigameFinishSound__20dSndSmallEffectMgr_cFv = .text:0x8037EA90; // type:function size:0x40 playMinigameFinishWhistleSound__20dSndSmallEffectMgr_cFv = .text:0x8037EAD0; // type:function size:0x40 playMinigameScoreUpSound__20dSndSmallEffectMgr_cFl = .text:0x8037EB10; // type:function size:0x11C -playMinigameScoreDownSound__20dSndSmallEffectMgr_cFv = .text:0x8037EC30; // type:function size:0x8 +playMinigameScoreDownSound__20dSndSmallEffectMgr_cFl = .text:0x8037EC30; // type:function size:0x8 playMinigameMusasabiSound__20dSndSmallEffectMgr_cFl = .text:0x8037EC40; // type:function size:0x3C playSkbSound__20dSndSmallEffectMgr_cFUl = .text:0x8037EC80; // type:function size:0xB0 playDemoSound__20dSndSmallEffectMgr_cFUlPQ34nw4r3snd11SoundHandle = .text:0x8037ED30; // type:function size:0x68 diff --git a/include/d/lyt/d_lyt_mini_game.h b/include/d/lyt/d_lyt_mini_game.h index 1e2a25cf..6ec7bc2d 100644 --- a/include/d/lyt/d_lyt_mini_game.h +++ b/include/d/lyt/d_lyt_mini_game.h @@ -145,18 +145,28 @@ private: /** 2D UI - Mini Game - Time */ class dLytMiniGameTime_c { +public: + enum Variant_e { + TIME_VARIANT_0, + TIME_VARIANT_1, + TIME_VARIANT_2, + TIME_VARIANT_3, + TIME_VARIANT_4, + TIME_VARIANT_5, + }; + public: dLytMiniGameTime_c() : field_0x7D4(0), mCurrentTimerValueMilliSeconds(0), mCurrentTimerValueSeconds(0), mLastTimerValueSeconds(0), - mTimerVariant(0), + mTimeFormat(0), mHighestDigitIndex(0), field_0x7EC(false), field_0x7ED(false), field_0x7EE(false), - field_0x7F0(0), + mVariant(0), field_0x7F4(0), mIsVisible(false) {} virtual ~dLytMiniGameTime_c() {} @@ -167,8 +177,16 @@ public: bool draw(); void init(); + void setVariant(s32 var) { + mVariant = var; + } + + void setField_0x7EE(bool v) { + field_0x7EE = v; + } + private: - enum TimerVariant_e { + enum TimeFormat_e { TIMER_LONG, TIMER_SECONDS, }; @@ -224,12 +242,12 @@ private: /* 0x7D8 */ s32 mCurrentTimerValueMilliSeconds; /* 0x7DC */ s32 mCurrentTimerValueSeconds; /* 0x7E0 */ s32 mLastTimerValueSeconds; - /* 0x7E4 */ u8 mTimerVariant; + /* 0x7E4 */ u8 mTimeFormat; /* 0x7E4 */ s32 mHighestDigitIndex; /* 0x7EC */ bool field_0x7EC; /* 0x7ED */ bool field_0x7ED; /* 0x7EE */ bool field_0x7EE; - /* 0x7F0 */ UNKWORD field_0x7F0; + /* 0x7F0 */ s32 mVariant; /* 0x7F4 */ u8 field_0x7F4; /* 0x7F5 */ bool mIsVisible; }; @@ -278,6 +296,15 @@ private: /** 2D UI - Mini Game - Score counter */ class dLytMiniGameScore_c { +public: + enum Variant_e { + SCORE_VARIANT_0, + SCORE_VARIANT_1, + SCORE_VARIANT_2, + SCORE_VARIANT_3, + SCORE_VARIANT_4, + }; + public: dLytMiniGameScore_c() : mScore(0), @@ -298,7 +325,7 @@ public: field_0x814(false), field_0x815(false), field_0x816(false), - field_0x818(0), + mVariant(SCORE_VARIANT_0), field_0x81C(0), field_0x820(false), field_0x824(0), @@ -315,6 +342,14 @@ public: bool draw(); void init(); + void setVariant(s32 var) { + mVariant = var; + } + + void setField_0x816(bool v) { + field_0x816 = v; + } + private: void fn_80291410(); void fn_802915B0(); @@ -396,7 +431,7 @@ private: /* 0x814 */ bool field_0x814; /* 0x815 */ bool field_0x815; /* 0x816 */ bool field_0x816; - /* 0x818 */ s32 field_0x818; + /* 0x818 */ s32 mVariant; /* 0x81C */ s32 field_0x81C; /* 0x820 */ bool field_0x820; /* 0x824 */ s32 field_0x824; @@ -423,21 +458,21 @@ public: private: static dLytMiniGameScoreSd_c *sInstance; - void fn_80293A30(); - void fn_80293A90(); - void fn_80293AF0(s32); - void fn_80293BB0(); - void fn_80293C60(); - void fn_80293D40(); - void fn_80293DC0(); - void fn_80293E40(); - void fn_80293ED0(); - void fn_80293F50(); - void fn_80293FB0(); - void fn_80294010(); - void fn_80294020(); - bool fn_80294030() const; - bool fn_80294080() const; + void setScoreUp(s32 score); + void setScoreDown(s32 score); + void setScoreInternal(s32 score); + void setHighestDigitIndex(s32); + void setDigit(s32 digitIndex, s32 number); + void resetScoreUp(); + void resetScoreDown(); + void resetDigits(); + void resetPosition(); + void startScoreUp(); + void startScoreDown(); + void stopScoreUp(); + void stopScoreDown(); + bool isScoreUpEndReached() const; + bool isScoreDownEndReached() const; /* 0x004 */ d2d::LytBase_c mLyt; /* 0x094 */ d2d::AnmGroup_c mAnm[5]; @@ -447,6 +482,37 @@ private: }; class dLytMiniGame_c : public dBase_c { +public: + enum Variant_e { + VARIANT_0, + VARIANT_1, + VARIANT_2, + VARIANT_3, + VARIANT_4, + VARIANT_5, + VARIANT_6, + VARIANT_7, + VARIANT_8, + VARIANT_9, + VARIANT_10, + VARIANT_11, + VARIANT_12, + VARIANT_13, + VARIANT_14, + VARIANT_15, + VARIANT_16, + }; + +private: + enum Slot_e { + SLOT_MINI_GAME, + SLOT_MINI_GAME_SCORE, + SLOT_MINI_GAME_TIME, + SLOT_MINI_GAME_BUGS, + SLOT_MINI_GAME_PUMPKIN, + SLOT_MINI_GAME_SCORE_SD, + }; + public: dLytMiniGame_c() : field_0x0068(0), @@ -455,7 +521,7 @@ public: field_0x006B(0), field_0x006C(0), field_0x006D(0), - field_0x1510(1), + mVariant(1), field_0x3864(0), field_0x3865(0), field_0x3866(false), @@ -463,6 +529,11 @@ public: field_0x3868(0) {} virtual ~dLytMiniGame_c() {} + virtual int create() override; + virtual int doDelete() override; + virtual int execute() override; + virtual int draw() override; + static dLytMiniGame_c *GetInstance() { return sInstance; } @@ -498,6 +569,14 @@ public: private: static dLytMiniGame_c *sInstance; + bool isLoading(const char *name) const; + bool loadData(const char *name, s32 slot); + void unloadData(const char *name); + void attachLoadedData(const char *name, d2d::ResAccIf_c &resAcc); + + + void init(); + /* 0x0068 */ u8 field_0x0068; /* 0x0069 */ u8 field_0x0069; /* 0x006A */ u8 field_0x006A; @@ -505,14 +584,14 @@ private: /* 0x006C */ u8 field_0x006C; /* 0x006D */ u8 field_0x006D; - /* 0x0070 */ d2d::ResAccIf_c mResAcc1; - /* 0x03E0 */ d2d::ResAccIf_c mResAcc2; - /* 0x0750 */ d2d::ResAccIf_c mResAcc3; - /* 0x0AC0 */ d2d::ResAccIf_c mResAcc4; - /* 0x0E30 */ d2d::ResAccIf_c mResAcc5; - /* 0x11A0 */ d2d::ResAccIf_c mResAcc6; + /* 0x0070 */ d2d::ResAccIf_c mResAccStart; + /* 0x03E0 */ d2d::ResAccIf_c mResAccScore; + /* 0x0750 */ d2d::ResAccIf_c mResAccTime; + /* 0x0AC0 */ d2d::ResAccIf_c mResAccBugs; + /* 0x0E30 */ d2d::ResAccIf_c mResAccPumpkin; + /* 0x11A0 */ d2d::ResAccIf_c mResAccScoreSd; - /* 0x1510 */ UNKWORD field_0x1510; + /* 0x1510 */ s32 mVariant; /* 0x1514 */ dLytMiniGameScore_c mScore; /* 0x1D64 */ dLytMiniGameScoreSd_c mScoreSd; diff --git a/include/d/snd/d_snd_small_effect_mgr.h b/include/d/snd/d_snd_small_effect_mgr.h index 8631e6fe..08b524cd 100644 --- a/include/d/snd/d_snd_small_effect_mgr.h +++ b/include/d/snd/d_snd_small_effect_mgr.h @@ -62,7 +62,7 @@ public: bool playMinigameFinishSound(); bool playMinigameFinishWhistleSound(); bool playMinigameScoreUpSound(s32 param); - bool playMinigameScoreDownSound(); + bool playMinigameScoreDownSound(s32 score); bool playMinigameMusasabiSound(s32 count); bool playSkbSound(u32 soundId); diff --git a/src/d/lyt/d_lyt_mini_game.cpp b/src/d/lyt/d_lyt_mini_game.cpp index 292d8863..2fdeb81f 100644 --- a/src/d/lyt/d_lyt_mini_game.cpp +++ b/src/d/lyt/d_lyt_mini_game.cpp @@ -8,6 +8,7 @@ #include "d/lyt/d2d.h" #include "d/snd/d_snd_small_effect_mgr.h" #include "d/snd/d_snd_wzsound.h" +#include "f/f_base.h" #include "m/m_vec.h" #include "nw4r/lyt/lyt_pane.h" #include "nw4r/lyt/lyt_types.h" @@ -819,7 +820,7 @@ bool dLytMiniGameTime_c::execute() { } if (mIsVisible) { - switch (mTimerVariant) { + switch (mTimeFormat) { case TIMER_LONG: updateLongTimer(); break; case TIMER_SECONDS: updateSecondsTimer(); break; } @@ -865,14 +866,14 @@ bool dLytMiniGameTime_c::execute() { mLyt.calc(); } - if (mTimerVariant == TIMER_SECONDS) { + if (mTimeFormat == TIMER_SECONDS) { if (mCurrentTimerValueSeconds <= 10 && mLastTimerValueSeconds != mCurrentTimerValueSeconds) { dSndSmallEffectMgr_c::GetInstance()->playMinigameTimeUpSound(mCurrentTimerValueSeconds); } saveSecondsTimer(); } - if (field_0x7F0 == 0) { + if (mVariant == TIME_VARIANT_0) { if (mCurrentTimerValueSeconds >= 590 && mLastTimerValueSeconds != mCurrentTimerValueSeconds && mCurrentTimerValueSeconds != 600) { dSndSmallEffectMgr_c::GetInstance()->playMinigameTimeUpSound(600 - mCurrentTimerValueSeconds); @@ -898,13 +899,13 @@ void dLytMiniGameTime_c::init() { return; } - switch (field_0x7F0) { - case 0: mTimerVariant = TIMER_LONG; break; - case 1: mTimerVariant = TIMER_SECONDS; break; - case 2: mTimerVariant = TIMER_SECONDS; break; - case 3: mTimerVariant = TIMER_LONG; break; - case 4: mTimerVariant = TIMER_LONG; break; - case 5: mTimerVariant = TIMER_LONG; break; + switch (mVariant) { + case TIME_VARIANT_0: mTimeFormat = TIMER_LONG; break; + case TIME_VARIANT_1: mTimeFormat = TIMER_SECONDS; break; + case TIME_VARIANT_2: mTimeFormat = TIMER_SECONDS; break; + case TIME_VARIANT_3: mTimeFormat = TIMER_LONG; break; + case TIME_VARIANT_4: mTimeFormat = TIMER_LONG; break; + case TIME_VARIANT_5: mTimeFormat = TIMER_LONG; break; } resetAlphaIn(); @@ -1267,7 +1268,7 @@ void dLytMiniGameTime_c::resetDigits() { } void dLytMiniGameTime_c::resetPosition() { - switch (mTimerVariant) { + switch (mTimeFormat) { case TIMER_LONG: setTimePosition(false); setBestHasSixDigits(false); @@ -1904,13 +1905,13 @@ bool dLytMiniGameScore_c::execute() { if (mIsVisible) { fn_80291BC0(); if (!field_0x816) { - switch (field_0x818) { - case 0: + switch (mVariant) { + case SCORE_VARIANT_0: if (hasIncreasedScore()) { startGetScore(); } break; - case 2: + case SCORE_VARIANT_2: if (field_0x829) { if (hasIncreasedScore()) { startGetScore(); @@ -1923,15 +1924,15 @@ bool dLytMiniGameScore_c::execute() { field_0x829 = false; } break; - case 1: + case SCORE_VARIANT_1: if (mScore != 1) { if (hasIncreasedScore()) { startGetScore(); } } break; - case 3: - case 4: + case SCORE_VARIANT_3: + case SCORE_VARIANT_4: if (hasIncreasedScore()) { startGetScore(); } @@ -1985,7 +1986,7 @@ bool dLytMiniGameScore_c::execute() { mLyt.calc(); } - if (!field_0x816 && field_0x818 == 0 && hasIncreasedScore()) { + if (!field_0x816 && mVariant == SCORE_VARIANT_0 && hasIncreasedScore()) { dSndSmallEffectMgr_c::GetInstance()->playMinigameScoreUpSound(mScore); } @@ -2050,8 +2051,8 @@ void dLytMiniGameScore_c::init() { mLyt.calc(); mAnm[SCORE_ANIM_IN].setAnimEnable(false); - switch (field_0x818) { - case 0: + switch (mVariant) { + case SCORE_VARIANT_0: field_0x82C = 0; field_0x81C = 21; field_0x7E4 = 4; @@ -2087,7 +2088,7 @@ void dLytMiniGameScore_c::init() { fn_80293450(field_0x81C); break; - case 1: + case SCORE_VARIANT_1: field_0x830 = 0; field_0x82C = 0; field_0x81C = 11; @@ -2148,7 +2149,7 @@ void dLytMiniGameScore_c::init() { } fn_80293450(field_0x81C); break; - case 2: + case SCORE_VARIANT_2: field_0x830 = 0; field_0x82C = 0; field_0x81C = 6; @@ -2167,7 +2168,7 @@ void dLytMiniGameScore_c::init() { fn_80293450(field_0x81C); break; - case 3: + case SCORE_VARIANT_3: field_0x82C = 0; field_0x81C = 21; field_0x7E4 = 4; @@ -2203,7 +2204,7 @@ void dLytMiniGameScore_c::init() { fn_80293450(field_0x81C); break; - case 4: + case SCORE_VARIANT_4: field_0x830 = 0; field_0x82C = 0; field_0x81C = 19; @@ -2265,7 +2266,7 @@ void dLytMiniGameScore_c::fn_80291410() { field_0x820 = true; mIsVisible = true; - if (field_0x818 == 1) { + if (mVariant == SCORE_VARIANT_1) { setScore(1); calcNumDigits(); mAnm[SCORE_ANIM_SET_POSITION].setFrame(field_0x81C); @@ -2455,11 +2456,11 @@ void dLytMiniGameScore_c::fn_80291BC0() { calcNumDigits(); realizePosition(); - if (field_0x818 == 1) { + if (mVariant == SCORE_VARIANT_1) { if (field_0x828) { fn_80291EF0(); } - } else if (field_0x818 == 2) { + } else if (mVariant == SCORE_VARIANT_2) { fn_80292040(); } @@ -2835,8 +2836,8 @@ void dLytMiniGameScore_c::fn_80292C30() { PaneCalc calc; - switch (field_0x818) { - case 0: { + switch (mVariant) { + case SCORE_VARIANT_0: { dMessage_c::getGlobalTagProcessor()->setNumericArg0(mScore); loadTextVariant(1); field_0x7E8 = mpTextBoxes[0]->GetLineWidth(nullptr); @@ -2850,7 +2851,7 @@ void dLytMiniGameScore_c::fn_80292C30() { break; } - case 3: { + case SCORE_VARIANT_3: { dMessage_c::getGlobalTagProcessor()->setNumericArg0(mScore); loadTextVariant(0); field_0x7E8 = mpTextBoxes[0]->GetLineWidth(nullptr); @@ -2948,14 +2949,15 @@ static const d2d::LytBrlanMapping brlanMapScoreSd[] = { { "miniGameScoreSd_00_scoreDown.brlan", "G_animAll_00"}, }; -#define SCORE_SD_ANIM_0_TO_9_0 0 -#define SCORE_SD_ANIM_0_TO_9_1 1 +#define SCORE_SD_ANIM_0_TO_9_OFFSET 0 #define SCORE_SD_ANIM_SET_POSITION 2 #define SCORE_SD_ANIM_SCORE_UP 3 #define SCORE_SD_ANIM_SCORE_DOWN 4 #define SCORE_SD_NUM_ANIMS 5 +#define SCORE_SD_NUM_DIGITS 2 + bool dLytMiniGameScoreSd_c::build(d2d::ResAccIf_c *resAcc) { mLyt.setResAcc(resAcc); mLyt.build("miniGameScoreSd_00.brlyt", nullptr); @@ -2990,13 +2992,13 @@ bool dLytMiniGameScoreSd_c::execute() { } if (mIsVisible) { - if (fn_80294030()) { - fn_80294010(); + if (isScoreUpEndReached()) { + stopScoreUp(); mIsVisible = false; } - if (fn_80294080()) { - fn_80294020(); + if (isScoreDownEndReached()) { + stopScoreDown(); mIsVisible = false; } @@ -3027,11 +3029,11 @@ void dLytMiniGameScoreSd_c::init() { return; } - fn_80293D40(); - fn_80293DC0(); - fn_80293E40(); - fn_80293ED0(); - fn_80293AF0(0); + resetScoreUp(); + resetScoreDown(); + resetDigits(); + resetPosition(); + setScoreInternal(0); mAnm[SCORE_SD_ANIM_SCORE_UP].setToEnd2(); mAnm[SCORE_SD_ANIM_SCORE_UP].setAnimEnable(true); @@ -3039,65 +3041,549 @@ void dLytMiniGameScoreSd_c::init() { mAnm[SCORE_SD_ANIM_SCORE_UP].setAnimEnable(false); } -void dLytMiniGameScoreSd_c::fn_80293A30() { - +void dLytMiniGameScoreSd_c::setScoreUp(s32 score) { + if (sInstance == nullptr) { + return; + } + setScoreInternal(score); + startScoreUp(); + dSndSmallEffectMgr_c::GetInstance()->playMinigameScoreUpSound(score); + mIsVisible = true; } -void dLytMiniGameScoreSd_c::fn_80293A90() { - +void dLytMiniGameScoreSd_c::setScoreDown(s32 score) { + if (sInstance == nullptr) { + return; + } + setScoreInternal(score); + startScoreUp(); + dSndSmallEffectMgr_c::GetInstance()->playMinigameScoreDownSound(score); + mIsVisible = true; } -void dLytMiniGameScoreSd_c::fn_80293AF0(s32) { +void dLytMiniGameScoreSd_c::setScoreInternal(s32 score) { + s32 digits[2]; + digits[1] = score / 10; + digits[0] = score % 10; + + s32 num = 0; + if (digits[1] != 0) { + num = 1; + } else if (digits[0] != 0) { + num = 0; + } + setHighestDigitIndex(num); + for (int i = 0; i <= num; i++) { + setDigit(i, digits[i]); + } + field_0x1D4 = score; } -void dLytMiniGameScoreSd_c::fn_80293BB0() { +void dLytMiniGameScoreSd_c::setHighestDigitIndex(s32 num) { + f32 frame = num + 6.0f; + mAnm[SCORE_SD_ANIM_SET_POSITION].setRate(0.0f); + mAnm[SCORE_SD_ANIM_SET_POSITION].setFrame(frame); + mAnm[SCORE_SD_ANIM_SET_POSITION].setAnimEnable(true); + + mLyt.calc(); + + mAnm[SCORE_SD_ANIM_SET_POSITION].setAnimEnable(false); } -void dLytMiniGameScoreSd_c::fn_80293C60() { +void dLytMiniGameScoreSd_c::setDigit(s32 digitIndex, s32 number) { + u8 idx = digitIndex + SCORE_SD_ANIM_0_TO_9_OFFSET; + f32 frame = 0.0f; + switch (number) { + case 0: frame = 0.0f; break; + case 1: frame = 1.0f; break; + case 2: frame = 2.0f; break; + case 4: frame = 3.0f; break; + case 6: frame = 4.0f; break; + case 8: frame = 5.0f; break; + } + mAnm[idx].setFrame(frame); + mAnm[idx].setAnimEnable(true); + + mLyt.calc(); + + mAnm[idx].setAnimEnable(false); } -void dLytMiniGameScoreSd_c::fn_80293D40() { +void dLytMiniGameScoreSd_c::resetScoreUp() { + mAnm[SCORE_SD_ANIM_SCORE_UP].setForwardOnce(); + mAnm[SCORE_SD_ANIM_SCORE_UP].setToEnd2(); + mAnm[SCORE_SD_ANIM_SCORE_UP].setAnimEnable(true); + mLyt.calc(); + + mAnm[SCORE_SD_ANIM_SCORE_UP].setAnimEnable(false); } -void dLytMiniGameScoreSd_c::fn_80293DC0() { +void dLytMiniGameScoreSd_c::resetScoreDown() { + mAnm[SCORE_SD_ANIM_SCORE_DOWN].setForwardOnce(); + mAnm[SCORE_SD_ANIM_SCORE_DOWN].setToEnd2(); + mAnm[SCORE_SD_ANIM_SCORE_DOWN].setAnimEnable(true); + mLyt.calc(); + + mAnm[SCORE_SD_ANIM_SCORE_DOWN].setAnimEnable(false); } -void dLytMiniGameScoreSd_c::fn_80293E40() { - +void dLytMiniGameScoreSd_c::resetDigits() { + // NOTE: includes SCORE_SD_ANIM_SET_POSITION + for (int i = 0; i <= SCORE_SD_NUM_DIGITS; i++) { + mAnm[i + SCORE_SD_ANIM_0_TO_9_OFFSET].setForwardOnce(); + mAnm[i + SCORE_SD_ANIM_0_TO_9_OFFSET].setFrame(0.0f); + mAnm[i + SCORE_SD_ANIM_0_TO_9_OFFSET].setAnimEnable(false); + } } -void dLytMiniGameScoreSd_c::fn_80293ED0() { +void dLytMiniGameScoreSd_c::resetPosition() { + mAnm[SCORE_SD_ANIM_SET_POSITION].setForwardOnce(); + mAnm[SCORE_SD_ANIM_SET_POSITION].setFrame(6.0f); + mAnm[SCORE_SD_ANIM_SET_POSITION].setAnimEnable(true); + mLyt.calc(); + + mAnm[SCORE_SD_ANIM_SET_POSITION].setAnimEnable(false); } -void dLytMiniGameScoreSd_c::fn_80293F50() { - +void dLytMiniGameScoreSd_c::startScoreUp() { + mAnm[SCORE_SD_ANIM_SCORE_UP].setToStart(); + mAnm[SCORE_SD_ANIM_SCORE_UP].setAnimEnable(true); } -void dLytMiniGameScoreSd_c::fn_80293FB0() { - +void dLytMiniGameScoreSd_c::startScoreDown() { + mAnm[SCORE_SD_ANIM_SCORE_DOWN].setToStart(); + mAnm[SCORE_SD_ANIM_SCORE_DOWN].setAnimEnable(true); } -void dLytMiniGameScoreSd_c::fn_80294010() { - +void dLytMiniGameScoreSd_c::stopScoreUp() { + mAnm[SCORE_SD_ANIM_SCORE_UP].setAnimEnable(false); } -void dLytMiniGameScoreSd_c::fn_80294020() { - +void dLytMiniGameScoreSd_c::stopScoreDown() { + mAnm[SCORE_SD_ANIM_SCORE_DOWN].setAnimEnable(false); } -bool dLytMiniGameScoreSd_c::fn_80294030() const { - +bool dLytMiniGameScoreSd_c::isScoreUpEndReached() const { + s32 idx = SCORE_SD_ANIM_SCORE_UP; + if (mAnm[idx].isEnabled() && mAnm[idx].isStop2()) { + return true; + } + return false; } -bool dLytMiniGameScoreSd_c::fn_80294080() const { - +bool dLytMiniGameScoreSd_c::isScoreDownEndReached() const { + s32 idx = SCORE_SD_ANIM_SCORE_DOWN; + if (mAnm[idx].isEnabled() && mAnm[idx].isStop2()) { + return true; + } + return false; } - SPECIAL_BASE_PROFILE(LYT_MINI_GAME, dLytMiniGame_c, fProfile::LYT_MINI_GAME, 0x2B4, 0x6F9); + +static const char *sMiniGame = "MiniGame"; +static const char *sMiniGameScore = "MiniGameScore"; +static const char *sMiniGameTime = "MiniGameTime"; +static const char *sMiniGameBugs = "MiniGameBugs"; +static const char *sMiniGamePumpkin = "MiniGamePumpkin"; +static const char *sMiniGameSd = "MiniGameSd"; + +int dLytMiniGame_c::create() { + mVariant = mParams; + switch (mVariant) { + case VARIANT_1: { + if (loadData(sMiniGame, SLOT_MINI_GAME) || loadData(sMiniGameScore, SLOT_MINI_GAME_SCORE)) { + return NOT_READY; + } + if (isLoading(sMiniGame) || isLoading(sMiniGameScore)) { + return NOT_READY; + } + + attachLoadedData(sMiniGame, mResAccStart); + attachLoadedData(sMiniGameScore, mResAccScore); + mScore.setVariant(dLytMiniGameScore_c::SCORE_VARIANT_0); + mScore.build(&mResAccScore); + mStart.build(&mResAccStart); + break; + } + case VARIANT_2: { + if (loadData(sMiniGame, SLOT_MINI_GAME) || loadData(sMiniGameSd, SLOT_MINI_GAME_SCORE_SD) || + loadData(sMiniGameScore, SLOT_MINI_GAME_SCORE)) { + return NOT_READY; + } + if (isLoading(sMiniGame) || isLoading(sMiniGameSd) || isLoading(sMiniGameScore)) { + return NOT_READY; + } + + attachLoadedData(sMiniGame, mResAccStart); + attachLoadedData(sMiniGameSd, mResAccScoreSd); + attachLoadedData(sMiniGameScore, mResAccScore); + mScore.setVariant(dLytMiniGameScore_c::SCORE_VARIANT_1); + mScore.build(&mResAccScore); + mScoreSd.build(&mResAccScoreSd); + mStart.build(&mResAccStart); + break; + } + case VARIANT_3: { + if (loadData(sMiniGame, SLOT_MINI_GAME) || loadData(sMiniGameScore, SLOT_MINI_GAME_SCORE)) { + return NOT_READY; + } + if (isLoading(sMiniGame) || isLoading(sMiniGameScore)) { + return NOT_READY; + } + + attachLoadedData(sMiniGame, mResAccStart); + attachLoadedData(sMiniGameScore, mResAccScore); + mScore.setVariant(dLytMiniGameScore_c::SCORE_VARIANT_2); + mScore.build(&mResAccScore); + mStart.build(&mResAccStart); + break; + } + case VARIANT_4: { + if (loadData(sMiniGame, SLOT_MINI_GAME) || loadData(sMiniGameBugs, SLOT_MINI_GAME_BUGS) || + loadData(sMiniGameTime, SLOT_MINI_GAME_TIME)) { + return NOT_READY; + } + if (isLoading(sMiniGame) || isLoading(sMiniGameBugs) || isLoading(sMiniGameTime)) { + return NOT_READY; + } + + attachLoadedData(sMiniGame, mResAccStart); + attachLoadedData(sMiniGameBugs, mResAccBugs); + attachLoadedData(sMiniGameTime, mResAccTime); + mTime.setVariant(dLytMiniGameTime_c::TIME_VARIANT_0); + mTime.build(&mResAccTime); + mBugs.build(&mResAccBugs); + mStart.build(&mResAccStart); + break; + } + case VARIANT_5: { + if (loadData(sMiniGame, SLOT_MINI_GAME) || loadData(sMiniGameScore, SLOT_MINI_GAME_SCORE) || + loadData(sMiniGameTime, SLOT_MINI_GAME_TIME)) { + return NOT_READY; + } + if (isLoading(sMiniGame) || isLoading(sMiniGameScore) || isLoading(sMiniGameTime)) { + return NOT_READY; + } + + attachLoadedData(sMiniGame, mResAccStart); + attachLoadedData(sMiniGameScore, mResAccScore); + attachLoadedData(sMiniGameTime, mResAccTime); + mTime.setVariant(dLytMiniGameTime_c::TIME_VARIANT_1); + mTime.build(&mResAccTime); + mScore.setVariant(dLytMiniGameScore_c::SCORE_VARIANT_4); + mScore.build(&mResAccScore); + mStart.build(&mResAccStart); + break; + } + case VARIANT_6: { + if (loadData(sMiniGame, SLOT_MINI_GAME) || loadData(sMiniGamePumpkin, SLOT_MINI_GAME_PUMPKIN) || + loadData(sMiniGameScore, SLOT_MINI_GAME_SCORE) || loadData(sMiniGameTime, SLOT_MINI_GAME_TIME)) { + return NOT_READY; + } + if (isLoading(sMiniGame) || isLoading(sMiniGamePumpkin) || isLoading(sMiniGameScore) || + isLoading(sMiniGameTime)) { + return NOT_READY; + } + + attachLoadedData(sMiniGame, mResAccStart); + attachLoadedData(sMiniGamePumpkin, mResAccPumpkin); + attachLoadedData(sMiniGameScore, mResAccScore); + attachLoadedData(sMiniGameTime, mResAccTime); + mTime.setVariant(dLytMiniGameTime_c::TIME_VARIANT_2); + mTime.build(&mResAccTime); + mScore.setVariant(dLytMiniGameScore_c::SCORE_VARIANT_3); + mScore.build(&mResAccScore); + mStart.build(&mResAccStart); + mPumpkin.build(&mResAccPumpkin); + break; + } + case VARIANT_7: { + if (loadData(sMiniGame, SLOT_MINI_GAME) || loadData(sMiniGameTime, SLOT_MINI_GAME_TIME)) { + return NOT_READY; + } + if (isLoading(sMiniGame) || isLoading(sMiniGameTime)) { + return NOT_READY; + } + + attachLoadedData(sMiniGame, mResAccStart); + attachLoadedData(sMiniGameTime, mResAccTime); + mTime.setVariant(dLytMiniGameTime_c::TIME_VARIANT_3); + mTime.build(&mResAccTime); + mStart.build(&mResAccStart); + break; + } + case VARIANT_8: { + if (loadData(sMiniGame, SLOT_MINI_GAME) || loadData(sMiniGameTime, SLOT_MINI_GAME_TIME)) { + return NOT_READY; + } + if (isLoading(sMiniGame) || isLoading(sMiniGameTime)) { + return NOT_READY; + } + + attachLoadedData(sMiniGame, mResAccStart); + attachLoadedData(sMiniGameTime, mResAccTime); + mTime.setVariant(dLytMiniGameTime_c::TIME_VARIANT_4); + mTime.build(&mResAccTime); + mStart.build(&mResAccStart); + break; + } + case VARIANT_9: { + if (loadData(sMiniGame, SLOT_MINI_GAME) || loadData(sMiniGameTime, SLOT_MINI_GAME_TIME)) { + return NOT_READY; + } + if (isLoading(sMiniGame) || isLoading(sMiniGameTime)) { + return NOT_READY; + } + + attachLoadedData(sMiniGame, mResAccStart); + attachLoadedData(sMiniGameTime, mResAccTime); + mTime.setVariant(dLytMiniGameTime_c::TIME_VARIANT_5); + mTime.build(&mResAccTime); + mStart.build(&mResAccStart); + break; + } + case VARIANT_10: { + if (loadData(sMiniGameScore, SLOT_MINI_GAME_SCORE)) { + return NOT_READY; + } + if (isLoading(sMiniGameScore)) { + return NOT_READY; + } + attachLoadedData(sMiniGameScore, mResAccScore); + mScore.setVariant(dLytMiniGameScore_c::SCORE_VARIANT_0); + mScore.setField_0x816(true); + mScore.build(&mResAccScore); + break; + } + case VARIANT_11: { + if (loadData(sMiniGameScore, SLOT_MINI_GAME_SCORE)) { + return NOT_READY; + } + if (isLoading(sMiniGameScore)) { + return NOT_READY; + } + attachLoadedData(sMiniGameScore, mResAccScore); + mScore.setVariant(dLytMiniGameScore_c::SCORE_VARIANT_2); + mScore.setField_0x816(true); + mScore.build(&mResAccScore); + break; + } + case VARIANT_12: { + if (loadData(sMiniGameTime, SLOT_MINI_GAME_TIME)) { + return NOT_READY; + } + if (isLoading(sMiniGameTime)) { + return NOT_READY; + } + attachLoadedData(sMiniGameTime, mResAccTime); + mTime.setVariant(dLytMiniGameTime_c::TIME_VARIANT_0); + mTime.setField_0x7EE(true); + mTime.build(&mResAccTime); + break; + } + case VARIANT_13: { + if (loadData(sMiniGameScore, SLOT_MINI_GAME_SCORE)) { + return NOT_READY; + } + if (isLoading(sMiniGameScore)) { + return NOT_READY; + } + attachLoadedData(sMiniGameScore, mResAccScore); + mScore.setVariant(dLytMiniGameScore_c::SCORE_VARIANT_3); + mScore.setField_0x816(true); + mScore.build(&mResAccScore); + break; + } + case VARIANT_14: { + if (loadData(sMiniGameTime, SLOT_MINI_GAME_TIME)) { + return NOT_READY; + } + if (isLoading(sMiniGameTime)) { + return NOT_READY; + } + attachLoadedData(sMiniGameTime, mResAccTime); + mTime.setVariant(dLytMiniGameTime_c::TIME_VARIANT_3); + mTime.setField_0x7EE(true); + mTime.build(&mResAccTime); + break; + } + case VARIANT_15: { + if (loadData(sMiniGameTime, SLOT_MINI_GAME_TIME)) { + return NOT_READY; + } + if (isLoading(sMiniGameTime)) { + return NOT_READY; + } + attachLoadedData(sMiniGameTime, mResAccTime); + mTime.setVariant(dLytMiniGameTime_c::TIME_VARIANT_4); + mTime.setField_0x7EE(true); + mTime.build(&mResAccTime); + break; + } + case VARIANT_16: { + if (loadData(sMiniGameTime, SLOT_MINI_GAME_TIME)) { + return NOT_READY; + } + if (isLoading(sMiniGameTime)) { + return NOT_READY; + } + attachLoadedData(sMiniGameTime, mResAccTime); + mTime.setVariant(dLytMiniGameTime_c::TIME_VARIANT_5); + mTime.setField_0x7EE(true); + mTime.build(&mResAccTime); + break; + } + } + + init(); + + sInstance = this; + return SUCCEEDED; +} + +int dLytMiniGame_c::doDelete() { + mScore.remove(); + mScoreSd.remove(); + mStart.remove(); + mTime.remove(); + mBugs.remove(); + mPumpkin.remove(); + + switch (mVariant) { + case VARIANT_1: { + mResAccStart.detach(); + mResAccScore.detach(); + unloadData(sMiniGame); + unloadData(sMiniGameScore); + break; + } + case VARIANT_2: { + mResAccStart.detach(); + mResAccScoreSd.detach(); + mResAccScore.detach(); + unloadData(sMiniGame); + unloadData(sMiniGameSd); + unloadData(sMiniGameScore); + break; + } + case VARIANT_3: { + mResAccStart.detach(); + mResAccScore.detach(); + unloadData(sMiniGame); + unloadData(sMiniGameScore); + break; + } + case VARIANT_4: { + mResAccStart.detach(); + mResAccBugs.detach(); + mResAccTime.detach(); + unloadData(sMiniGame); + unloadData(sMiniGameBugs); + unloadData(sMiniGameTime); + break; + } + case VARIANT_5: { + mResAccStart.detach(); + mResAccScore.detach(); + mResAccTime.detach(); + unloadData(sMiniGame); + unloadData(sMiniGameScore); + unloadData(sMiniGameTime); + break; + } + case VARIANT_6: { + mResAccStart.detach(); + mResAccPumpkin.detach(); + mResAccScore.detach(); + mResAccTime.detach(); + unloadData(sMiniGame); + unloadData(sMiniGamePumpkin); + unloadData(sMiniGameScore); + unloadData(sMiniGameTime); + break; + } + case VARIANT_7: { + mResAccStart.detach(); + mResAccTime.detach(); + unloadData(sMiniGame); + unloadData(sMiniGameTime); + break; + } + case VARIANT_8: { + mResAccStart.detach(); + mResAccTime.detach(); + unloadData(sMiniGame); + unloadData(sMiniGameTime); + break; + } + case VARIANT_9: { + mResAccStart.detach(); + mResAccTime.detach(); + unloadData(sMiniGame); + unloadData(sMiniGameTime); + break; + } + case VARIANT_10: { + mResAccScore.detach(); + unloadData(sMiniGameScore); + break; + } + case VARIANT_11: { + mResAccScore.detach(); + unloadData(sMiniGameScore); + break; + } + case VARIANT_12: { + mResAccTime.detach(); + unloadData(sMiniGameTime); + break; + } + case VARIANT_13: { + mResAccScore.detach(); + unloadData(sMiniGameScore); + break; + } + case VARIANT_14: { + mResAccTime.detach(); + unloadData(sMiniGameTime); + break; + } + case VARIANT_15: { + mResAccTime.detach(); + unloadData(sMiniGameTime); + break; + } + case VARIANT_16: { + mResAccTime.detach(); + unloadData(sMiniGameTime); + break; + } + } + + sInstance = nullptr; + return SUCCEEDED; +} + +int dLytMiniGame_c::execute() { + return SUCCEEDED; +} + +int dLytMiniGame_c::draw() { + return SUCCEEDED; +} + +void dLytMiniGame_c::init() { + mScore.init(); + mScoreSd.init(); + mStart.init(); + mTime.init(); + mBugs.init(); + mPumpkin.init(); +} diff --git a/src/d/snd/d_snd_small_effect_mgr.cpp b/src/d/snd/d_snd_small_effect_mgr.cpp index 0728448f..c1301d31 100644 --- a/src/d/snd/d_snd_small_effect_mgr.cpp +++ b/src/d/snd/d_snd_small_effect_mgr.cpp @@ -544,7 +544,7 @@ bool dSndSmallEffectMgr_c::playMinigameScoreUpSound(s32 param) { return playSoundInternal(soundId); } -bool dSndSmallEffectMgr_c::playMinigameScoreDownSound() { +bool dSndSmallEffectMgr_c::playMinigameScoreDownSound(s32 score) { return playSoundInternal(SE_S_MG_SCORE_DOWN); } From 22cff3e05dbcb408d3a792b81547c38ec9b425e9 Mon Sep 17 00:00:00 2001 From: robojumper Date: Thu, 4 Dec 2025 22:49:27 +0100 Subject: [PATCH 5/9] 95% --- config/SOUE01/splits.txt | 2 +- config/SOUE01/symbols.txt | 108 ++-- include/d/d_sc_game.h | 9 + include/d/d_stage_mgr.h | 5 + include/d/lyt/d_lyt_mini_game.h | 193 +++--- include/d/lyt/meter/d_lyt_meter.h | 18 +- include/d/lyt/meter/d_lyt_meter_rupy.h | 3 +- include/toBeSorted/minigame_mgr.h | 3 + src/REL/d/t/d_t_sword_battle_game.cpp | 14 +- src/d/d_message.cpp | 44 +- src/d/lyt/d_lyt_mini_game.cpp | 788 ++++++++++++++++++++++--- src/d/lyt/meter/d_lyt_meter.cpp | 2 +- 12 files changed, 971 insertions(+), 218 deletions(-) diff --git a/config/SOUE01/splits.txt b/config/SOUE01/splits.txt index e4f60c69..aaf32c1b 100644 --- a/config/SOUE01/splits.txt +++ b/config/SOUE01/splits.txt @@ -1620,7 +1620,7 @@ d/lyt/d_lyt_mini_game.cpp: .text start:0x8028BCE0 end:0x802969E0 align:16 .rodata start:0x804EE7D8 end:0x804EEB68 .data start:0x80538E58 end:0x80539B68 - .sdata start:0x80573B90 end:0x80573BB0 + .sdata start:0x80573B88 end:0x80573BB0 .sbss start:0x80575970 end:0x80575990 .sdata2 start:0x8057C700 end:0x8057C760 diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 9de06218..271f147c 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -4500,7 +4500,7 @@ executeState__85sStateMgr_c<16dLytMeterParts_c,20sStateMethodUsr_FI_c,12sFStateF isNotSilentRealmOrLoftwing__15dLytMeterMain_cFv = .text:0x800C9F20; // type:function size:0x44 fn_800C9F70__15dLytMeterMain_cFv = .text:0x800C9F70; // type:function size:0x70 fn_800C9FE0__15dLytMeterMain_cFv = .text:0x800C9FE0; // type:function size:0x60 -fn_800CA040__15dLytMeterMain_cFv = .text:0x800CA040; // type:function size:0x60 +isPopupOpen__15dLytMeterMain_cFv = .text:0x800CA040; // type:function size:0x60 setUiMode__15dLytMeterMain_cCFUs = .text:0x800CA0A0; // type:function size:0x1C getUiMode__15dLytMeterMain_cFv = .text:0x800CA0C0; // type:function size:0x38 __ct__15dLytMeterMain_cFv = .text:0x800CA100; // type:function size:0x1C0 @@ -13142,7 +13142,7 @@ checkBambooCuttingMinigameState2 = .text:0x8023BCE0; // type:function size:0x4 checkMinigameThrillDigger = .text:0x8023BCF0; // type:function size:0x4 checkMinigameThrillDigger2 = .text:0x8023BD00; // type:function size:0x8 checkFunFunIslandMinigameState = .text:0x8023BD10; // type:function size:0x4 -checkFunFunIslandMinigameState2 = .text:0x8023BD20; // type:function size:0x8 +checkInFunFunIsland__15MinigameManagerFv = .text:0x8023BD20; // type:function size:0x8 checkMinigameHouseCleaning = .text:0x8023BD30; // type:function size:0x4 checkMinigameHouseCleaning2 = .text:0x8023BD40; // type:function size:0x8 checkTrialTimeAttackMinigameState = .text:0x8023BD50; // type:function size:0x4 @@ -15254,13 +15254,13 @@ init__18dLytMiniGameBugs_cFv = .text:0x8028CB30; // type:function size:0x90 startAllIconsIn__18dLytMiniGameBugs_cFv = .text:0x8028CBC0; // type:function size:0xB8 startOut__18dLytMiniGameBugs_cFv = .text:0x8028CC80; // type:function size:0x90 startIn__18dLytMiniGameBugs_cFv = .text:0x8028CD10; // type:function size:0x8C -startOutForced__18dLytMiniGameBugs_cFv = .text:0x8028CDA0; // type:function size:0x80 +startOutTemp__18dLytMiniGameBugs_cFv = .text:0x8028CDA0; // type:function size:0x80 collectBug__18dLytMiniGameBugs_cFl = .text:0x8028CE20; // type:function size:0x150 startBugsFlash__18dLytMiniGameBugs_cFv = .text:0x8028CF70; // type:function size:0xC0 setBug__18dLytMiniGameBugs_cFll = .text:0x8028D030; // type:function size:0xE0 isSlotIconOnEndReached__18dLytMiniGameBugs_cCFl = .text:0x8028D110; // type:function size:0x48 isSlotIconOnEnabled__18dLytMiniGameBugs_cCFl = .text:0x8028D160; // type:function size:0x38 -isSlotBugCollected__18dLytMiniGameBugs_cFl = .text:0x8028D1A0; // type:function size:0x2C +isSlotBugCollected__18dLytMiniGameBugs_cCFl = .text:0x8028D1A0; // type:function size:0x2C resetBugIconsIn__18dLytMiniGameBugs_cFv = .text:0x8028D1D0; // type:function size:0xC0 resetIn__18dLytMiniGameBugs_cFv = .text:0x8028D290; // type:function size:0x80 resetOut__18dLytMiniGameBugs_cFv = .text:0x8028D310; // type:function size:0x80 @@ -15284,9 +15284,9 @@ execute__18dLytMiniGameTime_cFv = .text:0x8028DA00; // type:function size:0x224 draw__18dLytMiniGameTime_cFv = .text:0x8028DC30; // type:function size:0x48 init__18dLytMiniGameTime_cFv = .text:0x8028DC80; // type:function size:0x100 fn_8028DD80__18dLytMiniGameTime_cFv = .text:0x8028DD80; // type:function size:0xC0 -fn_8028DE40__18dLytMiniGameTime_cFv = .text:0x8028DE40; // type:function size:0x84 -fn_8028DED0__18dLytMiniGameTime_cFv = .text:0x8028DED0; // type:function size:0x100 -fn_8028DFD0__18dLytMiniGameTime_cFv = .text:0x8028DFD0; // type:function size:0xEC +startOut__18dLytMiniGameTime_cFv = .text:0x8028DE40; // type:function size:0x84 +startIn__18dLytMiniGameTime_cFv = .text:0x8028DED0; // type:function size:0x100 +startOutTemp__18dLytMiniGameTime_cFv = .text:0x8028DFD0; // type:function size:0xEC startAlphaIn__18dLytMiniGameTime_cFv = .text:0x8028E0C0; // type:function size:0xAC startAlphaOut__18dLytMiniGameTime_cFv = .text:0x8028E170; // type:function size:0x60 startFinish__18dLytMiniGameTime_cFv = .text:0x8028E1D0; // type:function size:0xC4 @@ -15356,9 +15356,9 @@ execute__19dLytMiniGameScore_cFv = .text:0x80290140; // type:function size:0x2EC draw__19dLytMiniGameScore_cFv = .text:0x80290430; // type:function size:0x48 init__19dLytMiniGameScore_cFv = .text:0x80290480; // type:function size:0xF84 fn_80291410__19dLytMiniGameScore_cFv = .text:0x80291410; // type:function size:0x1A0 -fn_802915B0__19dLytMiniGameScore_cFv = .text:0x802915B0; // type:function size:0x84 -fn_80291640__19dLytMiniGameScore_cFv = .text:0x80291640; // type:function size:0x100 -fn_80291740__19dLytMiniGameScore_cFv = .text:0x80291740; // type:function size:0xEC +startOut__19dLytMiniGameScore_cFv = .text:0x802915B0; // type:function size:0x84 +startIn__19dLytMiniGameScore_cFv = .text:0x80291640; // type:function size:0x100 +startOutTemp__19dLytMiniGameScore_cFv = .text:0x80291740; // type:function size:0xEC startAlphaIn__19dLytMiniGameScore_cFv = .text:0x80291830; // type:function size:0xD0 startAlphaOut__19dLytMiniGameScore_cFv = .text:0x80291900; // type:function size:0x60 startGetScore__19dLytMiniGameScore_cFv = .text:0x80291960; // type:function size:0xD0 @@ -15440,46 +15440,46 @@ draw__14dLytMiniGame_cFv = .text:0x802956D0; // type:function size:0x6C scoreRelatedExecute__14dLytMiniGame_cFv = .text:0x80295740; // type:function size:0x8C scoreRelated__14dLytMiniGame_cFv = .text:0x802957D0; // type:function size:0x78 setDisplayedPoints__14dLytMiniGame_cFl = .text:0x80295850; // type:function size:0xA8 -fn_80295900 = .text:0x80295900; // type:function size:0x38 -fn_80295940__14dLytMiniGame_cFv = .text:0x80295940; // type:function size:0x38 -fn_80295980__14dLytMiniGame_cFv = .text:0x80295980; // type:function size:0x98 -fn_80295A20 = .text:0x80295A20; // type:function size:0x90 -fn_80295AB0__14dLytMiniGame_cFv = .text:0x80295AB0; // type:function size:0x20 -fn_80295AD0__14dLytMiniGame_cFv = .text:0x80295AD0; // type:function size:0x20 -fn_80295AF0 = .text:0x80295AF0; // type:function size:0x2C -fn_80295B20 = .text:0x80295B20; // type:function size:0x8 -fn_80295B30 = .text:0x80295B30; // type:function size:0x8 +fn_80295900__14dLytMiniGame_cFl = .text:0x80295900; // type:function size:0x38 +startCountdown__14dLytMiniGame_cFv = .text:0x80295940; // type:function size:0x38 +startFinish__14dLytMiniGame_cFv = .text:0x80295980; // type:function size:0x98 +fn_80295A20__14dLytMiniGame_cFv = .text:0x80295A20; // type:function size:0x90 +isStartCountdownDone__14dLytMiniGame_cFv = .text:0x80295AB0; // type:function size:0x20 +isFinishAnimDone__14dLytMiniGame_cFv = .text:0x80295AD0; // type:function size:0x20 +isTimeupAnimDone__14dLytMiniGame_cFv = .text:0x80295AF0; // type:function size:0x2C +fn_80295B20__14dLytMiniGame_cFl = .text:0x80295B20; // type:function size:0x8 +fn_80295B30__14dLytMiniGame_cFl = .text:0x80295B30; // type:function size:0x8 timeRelatedExecute__14dLytMiniGame_cFv = .text:0x80295B40; // type:function size:0xA8 timeRelated__14dLytMiniGame_cFv = .text:0x80295BF0; // type:function size:0x24 setDisplayedTime__14dLytMiniGame_cFl = .text:0x80295C20; // type:function size:0x4C setHighscore__14dLytMiniGame_cFl = .text:0x80295C70; // type:function size:0x38 -fn_80295CB0__14dLytMiniGame_cFb = .text:0x80295CB0; // type:function size:0x38 -fn_80295CF0 = .text:0x80295CF0; // type:function size:0x8 -fn_80295D00 = .text:0x80295D00; // type:function size:0xC -fn_80295D10 = .text:0x80295D10; // type:function size:0xC -fn_80295D20 = .text:0x80295D20; // type:function size:0x8 -fn_80295D30 = .text:0x80295D30; // type:function size:0x8 -fn_80295D40 = .text:0x80295D40; // type:function size:0x8 -fn_80295D50 = .text:0x80295D50; // type:function size:0x8 -fn_80295D60 = .text:0x80295D60; // type:function size:0x8 -fn_80295D70 = .text:0x80295D70; // type:function size:0x8 -fn_80295D80 = .text:0x80295D80; // type:function size:0x4 -fn_80295D90 = .text:0x80295D90; // type:function size:0x4 -fn_80295DA0 = .text:0x80295DA0; // type:function size:0x8 -fn_80295DB0 = .text:0x80295DB0; // type:function size:0x60 -fn_80295E10 = .text:0x80295E10; // type:function size:0x34 -fn_80295E50 = .text:0x80295E50; // type:function size:0x54 -fn_80295EB0 = .text:0x80295EB0; // type:function size:0x54 -fn_80295F10 = .text:0x80295F10; // type:function size:0x80 -fn_80295F90 = .text:0x80295F90; // type:function size:0x70 -fn_80296000 = .text:0x80296000; // type:function size:0x6C -fn_80296070 = .text:0x80296070; // type:function size:0xE0 -fn_80296150 = .text:0x80296150; // type:function size:0xB8 -fn_80296210 = .text:0x80296210; // type:function size:0x88 -fn_802962A0 = .text:0x802962A0; // type:function size:0x88 -fn_80296330 = .text:0x80296330; // type:function size:0xA4 -fn_802963E0 = .text:0x802963E0; // type:function size:0x98 -fn_80296480 = .text:0x80296480; // type:function size:0x98 +setShowBestTime__14dLytMiniGame_cFb = .text:0x80295CB0; // type:function size:0x38 +startBugsAllIconsIn__14dLytMiniGame_cFv = .text:0x80295CF0; // type:function size:0x8 +set5Bugs__14dLytMiniGame_cFv = .text:0x80295D00; // type:function size:0xC +set10Bugs__14dLytMiniGame_cFv = .text:0x80295D10; // type:function size:0xC +reInitBugs__14dLytMiniGame_cFv = .text:0x80295D20; // type:function size:0x8 +setBug__14dLytMiniGame_cFll = .text:0x80295D30; // type:function size:0x8 +collectBug__14dLytMiniGame_cFl = .text:0x80295D40; // type:function size:0x8 +startBugsFlash__14dLytMiniGame_cFv = .text:0x80295D50; // type:function size:0x8 +isBugIconOnEndReached__14dLytMiniGame_cCFl = .text:0x80295D60; // type:function size:0x8 +isBugCollected__14dLytMiniGame_cCFl = .text:0x80295D70; // type:function size:0x8 +fn_80295D80__14dLytMiniGame_cFv = .text:0x80295D80; // type:function size:0x4 +fn_80295D90__14dLytMiniGame_cFl = .text:0x80295D90; // type:function size:0x4 +getPumpkin__14dLytMiniGame_cFRC7mVec3_clb = .text:0x80295DA0; // type:function size:0x8 +fn_80295DB0__14dLytMiniGame_cFv = .text:0x80295DB0; // type:function size:0x60 +isInEvent__14dLytMiniGame_cCFv = .text:0x80295E10; // type:function size:0x34 +isPopupOpen__14dLytMiniGame_cCFv = .text:0x80295E50; // type:function size:0x54 +isPopupOpenExceptHelp__14dLytMiniGame_cCFv = .text:0x80295EB0; // type:function size:0x54 +isFadingOut__14dLytMiniGame_cCFv = .text:0x80295F10; // type:function size:0x80 +fn_80295F90__14dLytMiniGame_cFv = .text:0x80295F90; // type:function size:0x70 +fn_80296000__14dLytMiniGame_cFv = .text:0x80296000; // type:function size:0x6C +fn_80296070__14dLytMiniGame_cFv = .text:0x80296070; // type:function size:0xE0 +fn_80296150__14dLytMiniGame_cFv = .text:0x80296150; // type:function size:0xB8 +fn_80296210__14dLytMiniGame_cFv = .text:0x80296210; // type:function size:0x88 +fn_802962A0__14dLytMiniGame_cFv = .text:0x802962A0; // type:function size:0x88 +fn_80296330__14dLytMiniGame_cFv = .text:0x80296330; // type:function size:0xA4 +fn_802963E0__14dLytMiniGame_cFv = .text:0x802963E0; // type:function size:0x98 +fn_80296480__14dLytMiniGame_cFv = .text:0x80296480; // type:function size:0x98 init__14dLytMiniGame_cFv = .text:0x80296520; // type:function size:0x58 loadData__14dLytMiniGame_cFPCcl = .text:0x80296580; // type:function size:0x130 isLoading__14dLytMiniGame_cCFPCc = .text:0x802966B0; // type:function size:0x30 @@ -36891,14 +36891,14 @@ jumptable_805399B4 = .data:0x805399B4; // type:object size:0x44 scope:local jumptable_805399F8 = .data:0x805399F8; // type:object size:0x38 scope:local jumptable_80539A30 = .data:0x80539A30; // type:object size:0x38 scope:local jumptable_80539A68 = .data:0x80539A68; // type:object size:0x34 scope:local -LytMiniGame__vtable = .data:0x80539A9C; // type:object size:0x4C -lbl_80539AE8 = .data:0x80539AE8; // type:object size:0xC -lbl_80539AF4 = .data:0x80539AF4; // type:object size:0xC -lbl_80539B00 = .data:0x80539B00; // type:object size:0xC -lbl_80539B0C = .data:0x80539B0C; // type:object size:0xC -lbl_80539B18 = .data:0x80539B18; // type:object size:0xC -lbl_80539B24 = .data:0x80539B24; // type:object size:0xC -lbl_80539B30 = .data:0x80539B30; // type:object size:0x38 +__vt__14dLytMiniGame_c = .data:0x80539A9C; // type:object size:0x4C +__vt__21dLytMiniGameScoreSd_c = .data:0x80539AE8; // type:object size:0xC +__vt__19dLytMiniGameScore_c = .data:0x80539AF4; // type:object size:0xC +__vt__19dLytMiniGameStart_c = .data:0x80539B00; // type:object size:0xC +__vt__18dLytMiniGameTime_c = .data:0x80539B0C; // type:object size:0xC +__vt__18dLytMiniGameBugs_c = .data:0x80539B18; // type:object size:0xC +__vt__21dLytMiniGamePumpkin_c = .data:0x80539B24; // type:object size:0xC +__vt__26dLytMiniGamePumpkinParts_c = .data:0x80539B30; // type:object size:0xC lbl_80539B68 = .data:0x80539B68; // type:object size:0x1C data:string lbl_80539B84 = .data:0x80539B84; // type:object size:0xE data:string lbl_80539B94 = .data:0x80539B94; // type:object size:0x23 data:string diff --git a/include/d/d_sc_game.h b/include/d/d_sc_game.h index d1a905b7..b1ba5573 100644 --- a/include/d/d_sc_game.h +++ b/include/d/d_sc_game.h @@ -11,6 +11,7 @@ #include "f/f_profile_name.h" #include "m/m2d.h" #include "m/m_angle.h" +#include "m/m_fader_base.h" #include "m/m_vec.h" #include "s/s_FPhase.h" #include "s/s_State.hpp" @@ -210,6 +211,14 @@ public: return mFader.isSettled(); } + bool isFadingOut() const { + return mFader.isStatus(mFaderBase_c::FADING_OUT); + } + + bool isFadingIn() const { + return mFader.isStatus(mFaderBase_c::FADING_IN); + } + f32 targetingScreenFn_801BBEC0() const { return mScreen1.fn_801BBEC0(); } diff --git a/include/d/d_stage_mgr.h b/include/d/d_stage_mgr.h index f7a00405..de4d0b47 100644 --- a/include/d/d_stage_mgr.h +++ b/include/d/d_stage_mgr.h @@ -11,6 +11,7 @@ #include "egg/gfx/eggScreen.h" #include "m/m_allocator.h" #include "m/m_dvd.h" +#include "m/m_fader_base.h" #include "nw4r/g3d/g3d_camera.h" #include "s/s_FPhase.h" #include "s/s_State.hpp" @@ -176,6 +177,10 @@ public: return mFader.isSettled(); } + bool isFadingOut() const { + return mFader.isStatus(mFaderBase_c::FADING_OUT); + } + bool isInLastBoss() const { return mIsInLastBoss; } diff --git a/include/d/lyt/d_lyt_mini_game.h b/include/d/lyt/d_lyt_mini_game.h index 6ec7bc2d..b8dfb374 100644 --- a/include/d/lyt/d_lyt_mini_game.h +++ b/include/d/lyt/d_lyt_mini_game.h @@ -99,17 +99,22 @@ public: ELDIN_ROLLER, }; -private: void startAllIconsIn(); - void startOut(); - void startIn(); - void startOutForced(); + void setBugsNumLevel(u8 level) { + mBugsNumLevel = level; + } + void setBug(s32 slot, s32 bugIndex); void collectBug(s32 slot); void startBugsFlash(); - void setBug(s32 slot, s32 bugIndex); bool isSlotIconOnEndReached(s32 slot) const; + bool isSlotBugCollected(s32 slot) const; + + void startOut(); + void startIn(); + void startOutTemp(); + +private: bool isSlotIconOnEnabled(s32 slot) const; - bool isSlotBugCollected(s32 slot); void resetBugIconsIn(); void resetIn(); void resetOut(); @@ -147,12 +152,12 @@ private: class dLytMiniGameTime_c { public: enum Variant_e { - TIME_VARIANT_0, - TIME_VARIANT_1, - TIME_VARIANT_2, - TIME_VARIANT_3, - TIME_VARIANT_4, - TIME_VARIANT_5, + TIME_VARIANT_INSECT_CAPTURE, + TIME_VARIANT_SPIRAL_CHARGE_TUTORIAL, + TIME_VARIANT_PUMPKIN_ARCHERY, + TIME_VARIANT_ROLLERCOASTER, + TIME_VARIANT_BOSS_RUSH, + TIME_VARIANT_TRIAL_TIME_ATTACK, }; public: @@ -185,27 +190,29 @@ public: field_0x7EE = v; } + void fn_8028DD80(); + void startOut(); + void startIn(); + void startOutTemp(); + void startFinish(); + void startAlphaIn(); + void startAlphaOut(); + + void setTimerValueInMilliSeconds(s32 time); + void setTimerSecondsValueInMilliSeconds(s32 time); + void setBestTime(s32 time); + void setShowBestTime(bool show); + private: enum TimeFormat_e { TIMER_LONG, TIMER_SECONDS, }; - void fn_8028DD80(); - void fn_8028DE40(); - void fn_8028DED0(); - void fn_8028DFD0(); - void startAlphaIn(); - void startAlphaOut(); - void startFinish(); void startLoop(); - void setTimerValueInMilliSeconds(s32 time); void updateLongTimer(); - void setTimerSecondsValueInMilliSeconds(s32 time); void updateSecondsTimer(); void saveSecondsTimer(); - void setBestTime(s32 time); - void setShowBestTime(bool show); void resetIn(); void resetOut(); void resetAlphaIn(); @@ -264,7 +271,6 @@ public: bool draw(); void init(); -private: void startCountdown(); void startCountdown120(); void startFinish(); @@ -272,6 +278,8 @@ private: bool isCountdownEndReached() const; bool isFinishEndReached() const; bool isTimeupEndReached() const; + +private: void resetPlayedSounds(); void resetCountdown(); void resetFinish(); @@ -298,11 +306,11 @@ private: class dLytMiniGameScore_c { public: enum Variant_e { - SCORE_VARIANT_0, - SCORE_VARIANT_1, - SCORE_VARIANT_2, - SCORE_VARIANT_3, - SCORE_VARIANT_4, + SCORE_VARIANT_BAMBOO_CUTTING, + SCORE_VARIANT_FUN_FUN_ISLAND, + SCORE_VARIANT_THRILL_DIGGER, + SCORE_VARIANT_PUMPKIN_ARCHERY, + SCORE_VARIANT_SPIRAL_CHARGE_TUTORIAL, }; public: @@ -325,7 +333,7 @@ public: field_0x814(false), field_0x815(false), field_0x816(false), - mVariant(SCORE_VARIANT_0), + mVariant(SCORE_VARIANT_BAMBOO_CUTTING), field_0x81C(0), field_0x820(false), field_0x824(0), @@ -350,22 +358,31 @@ public: field_0x816 = v; } -private: + void setField_0x828(bool v) { + field_0x828 = v; + } + + s32 getScore() const { + return mScore; + } + + void startIn(); + void startOut(); + void startOutTemp(); + void setScore(s32 score); void fn_80291410(); - void fn_802915B0(); - void fn_80291640(); - void fn_80291740(); void startAlphaIn(); void startAlphaOut(); - void startGetScore(); + void fn_80291D40(s32 score); + void fn_80291ED0(s32); void startFinish(); + +private: + void startGetScore(); void startLoop(); - void setScore(s32 score); void fn_80291BC0(); - void fn_80291D40(s32 arg); bool hasIncreasedScore() const; bool hasDecreasedScore() const; - void fn_80291ED0(s32); void fn_80291EF0(); void increaseScore(s32); void fn_80292040(); @@ -455,11 +472,12 @@ public: bool draw(); void init(); + void setScoreUp(s32 score); + void setScoreDown(s32 score); + private: static dLytMiniGameScoreSd_c *sInstance; - void setScoreUp(s32 score); - void setScoreDown(s32 score); void setScoreInternal(s32 score); void setHighestDigitIndex(s32); void setDigit(s32 digitIndex, s32 number); @@ -485,15 +503,18 @@ class dLytMiniGame_c : public dBase_c { public: enum Variant_e { VARIANT_0, - VARIANT_1, - VARIANT_2, - VARIANT_3, - VARIANT_4, - VARIANT_5, - VARIANT_6, - VARIANT_7, - VARIANT_8, - VARIANT_9, + VARIANT_BAMBOO_CUTTING, + VARIANT_FUN_FUN_ISLAND, + VARIANT_THRILL_DIGGER, + VARIANT_INSECT_CAPTURE, + VARIANT_SPIRAL_CHARGE_TUTORIAL, + VARIANT_PUMPKIN_ARCHERY, + VARIANT_ROLLERCOASTER, + VARIANT_BOSS_RUSH, + VARIANT_TRIAL_TIME_ATTACK, + // These are created by dFlow_c and correspond to above entries. + // They also cause things to behave a bit differently. What is the purpose + // of these special variants? VARIANT_10, VARIANT_11, VARIANT_12, @@ -515,12 +536,12 @@ private: public: dLytMiniGame_c() - : field_0x0068(0), - field_0x0069(0), - field_0x006A(0), - field_0x006B(0), - field_0x006C(0), - field_0x006D(0), + : field_0x0068(false), + field_0x0069(false), + field_0x006A(false), + field_0x006B(false), + field_0x006C(false), + field_0x006D(false), mVariant(1), field_0x3864(0), field_0x3865(0), @@ -539,28 +560,35 @@ public: } /** Updates some window */ - void fn_80295940(); + void startCountdown(); /** ??? */ - void fn_80295980(); + void startFinish(); + void fn_80295A20(); /** Checks to see if in BAMBOO_CUTTING .. BOSS_RUSH and returns some boolean (start?) */ - bool fn_80295AB0(); + bool isStartCountdownDone(); /** Checks to see if in BAMBOO_CUTTING .. BOSS_RUSH and returns some boolean (end?) */ - bool fn_80295AD0(); + bool isFinishAnimDone(); + bool isTimeupAnimDone(); + + void fn_80295B20(s32); + void fn_80295B30(s32); void setHighscore(s32 time); /** GUESS: sets the start for the high score? */ - void fn_80295CB0(bool); + void setShowBestTime(bool); void timeRelatedExecute(); void scoreRelatedExecute(); void setDisplayedTime(s32 time); - void setDisplayedPoints(s32 time); + void setDisplayedPoints(s32 points); void timeRelated(); void scoreRelated(); + void fn_80295900(s32); + /** GUESS: Assumption based on function caller */ void setComplete() { field_0x3866 = true; @@ -573,16 +601,45 @@ private: bool loadData(const char *name, s32 slot); void unloadData(const char *name); void attachLoadedData(const char *name, d2d::ResAccIf_c &resAcc); - void init(); - /* 0x0068 */ u8 field_0x0068; - /* 0x0069 */ u8 field_0x0069; - /* 0x006A */ u8 field_0x006A; - /* 0x006B */ u8 field_0x006B; - /* 0x006C */ u8 field_0x006C; - /* 0x006D */ u8 field_0x006D; + void startBugsAllIconsIn(); + void set5Bugs(); + void set10Bugs(); + void reInitBugs(); + void setBug(s32 slot, s32 bugIndex); + void collectBug(s32 slot); + void startBugsFlash(); + bool isBugIconOnEndReached(s32 slot) const; + bool isBugCollected(s32 slot) const; + void fn_80295D80(); + void fn_80295D90(s32 points); + void getPumpkin(const mVec3_c &pumpkinPos, s32 unk, bool doubleScore); + bool fn_80295DB0(); + bool isInEvent() const; + bool isPopupOpen() const; + bool isPopupOpenExceptHelp() const; + bool isFadingOut() const; + + void fn_80295F90(); + void fn_80296000(); + void fn_80296070(); + void fn_80296150(); + void fn_80296210(); + void fn_802962A0(); + void fn_80296330(); + + // These two do the same thing + void fn_802963E0(); + void fn_80296480(); + + /* 0x0068 */ bool field_0x0068; + /* 0x0069 */ bool field_0x0069; + /* 0x006A */ bool field_0x006A; + /* 0x006B */ bool field_0x006B; + /* 0x006C */ bool field_0x006C; + /* 0x006D */ bool field_0x006D; /* 0x0070 */ d2d::ResAccIf_c mResAccStart; /* 0x03E0 */ d2d::ResAccIf_c mResAccScore; diff --git a/include/d/lyt/meter/d_lyt_meter.h b/include/d/lyt/meter/d_lyt_meter.h index 48fef6cb..8c6dfc28 100644 --- a/include/d/lyt/meter/d_lyt_meter.h +++ b/include/d/lyt/meter/d_lyt_meter.h @@ -93,7 +93,7 @@ public: bool fn_800C9F70(); bool fn_800C9FE0(); - bool fn_800CA040(); + bool isPopupOpen(); bool isInMapEvent(); bool fn_800D5380(u8); @@ -402,6 +402,14 @@ public: } } + static s32 getRupeeDifference() { + if (sInstance != nullptr) { + return sInstance->mMain.mRupy.getRupeeDifference(); + } else { + return 0; + } + } + static void setField_0x13B61(u8 val) { if (sInstance != nullptr) { sInstance->field_0x13B61 = val; @@ -452,6 +460,14 @@ public: } } + static bool isPopupOpen() { + if (sInstance != nullptr) { + return sInstance->mMain.isPopupOpen(); + } else { + return false; + } + } + static bool getfn_800D97A0() { if (sInstance != nullptr) { return sInstance->fn_800D97A0(); diff --git a/include/d/lyt/meter/d_lyt_meter_rupy.h b/include/d/lyt/meter/d_lyt_meter_rupy.h index 65b04517..d295d749 100644 --- a/include/d/lyt/meter/d_lyt_meter_rupy.h +++ b/include/d/lyt/meter/d_lyt_meter_rupy.h @@ -117,10 +117,11 @@ public: mSize = size; } + s32 getRupeeDifference() const; + private: bool updateDisplayedAmount(bool suppressSound); bool hasChangeInRupees() const; - s32 getRupeeDifference() const; void setDigit(s32 index, s32 digit); void executeDigitJump(); void executeDigitBlink(s32 amount); diff --git a/include/toBeSorted/minigame_mgr.h b/include/toBeSorted/minigame_mgr.h index 10bb4be3..941d3ed6 100644 --- a/include/toBeSorted/minigame_mgr.h +++ b/include/toBeSorted/minigame_mgr.h @@ -34,6 +34,9 @@ public: static bool checkInBossRush() { return isInMinigameState(BOSS_RUSH); } + static bool checkInFunFunIsland() { + return isInMinigameState(FUN_FUN_ISLAND); + } private: MinigameManager() {} diff --git a/src/REL/d/t/d_t_sword_battle_game.cpp b/src/REL/d/t/d_t_sword_battle_game.cpp index 5cb2f84a..a5555a1c 100644 --- a/src/REL/d/t/d_t_sword_battle_game.cpp +++ b/src/REL/d/t/d_t_sword_battle_game.cpp @@ -68,12 +68,12 @@ int dTgSwordBattleGame_c::actorExecuteInEvent() { } break; case 'cndn': { if (advance) { - dLytMiniGame_c::GetInstance()->fn_80295940(); + dLytMiniGame_c::GetInstance()->startCountdown(); - } else if (dLytMiniGame_c::GetInstance()->fn_80295AB0()) { + } else if (dLytMiniGame_c::GetInstance()->isStartCountdownDone()) { dLytMiniGame_c::GetInstance()->timeRelatedExecute(); dLytMiniGame_c::GetInstance()->setHighscore(getBossHighscore()); - dLytMiniGame_c::GetInstance()->fn_80295CB0(true); + dLytMiniGame_c::GetInstance()->setShowBestTime(true); mTimer.initUpCounter(); field_0x1A8 = true; field_0x1AC = true; @@ -83,8 +83,8 @@ int dTgSwordBattleGame_c::actorExecuteInEvent() { } break; case 'fnsh': { if (advance) { - dLytMiniGame_c::GetInstance()->fn_80295980(); - } else if (dLytMiniGame_c::GetInstance()->fn_80295AD0()) { + dLytMiniGame_c::GetInstance()->startFinish(); + } else if (dLytMiniGame_c::GetInstance()->isFinishAnimDone()) { mEventRelated.advanceNext(); } ret = SUCCEEDED; @@ -112,7 +112,7 @@ int dTgSwordBattleGame_c::actorExecuteInEvent() { setInBossRushFlag(); setCurrentBossNumber(mBossNumber + 1); if (MinigameManager::endMinigame(MinigameManager::BOSS_RUSH)) { - dLytMiniGame_c::GetInstance()->fn_80295980(); + dLytMiniGame_c::GetInstance()->startFinish(); dLytMiniGame_c::GetInstance()->timeRelated(); } } @@ -163,7 +163,7 @@ void dTgSwordBattleGame_c::finalizeState_Manage() {} void dTgSwordBattleGame_c::init() { if (MinigameManager::GetInstance()->checkInBossRush()) { - createBase(fProfile::LYT_MINI_GAME, this, 8, OTHER); + createBase(fProfile::LYT_MINI_GAME, this, dLytMiniGame_c::VARIANT_BOSS_RUSH, OTHER); } mTimer.vt_0x0C(); diff --git a/src/d/d_message.cpp b/src/d/d_message.cpp index a031544e..7a3e7574 100644 --- a/src/d/d_message.cpp +++ b/src/d/d_message.cpp @@ -437,9 +437,7 @@ bool dFlow_c::handleEventInternal(const MsbFlowInfo *element) { dMessage_c::getInstance()->setInMapEvent(true); dMessage_c::getInstance()->clearLightPillarRelatedArgs(); if (dLytControlGame_c::getInstance()->isStateNotNormalOrInEvent()) { - dLytControlGame_c::getInstance()->openMapEvent( - mapEvent, arg1, arg2 - ); + dLytControlGame_c::getInstance()->openMapEvent(mapEvent, arg1, arg2); } } else { dLytMap_c::GetInstance()->queueMapEvent(mapEvent, arg1, arg2); @@ -1196,28 +1194,52 @@ void dFlow_c::createLytMiniGame() { if (dLytMiniGame_c::GetInstance() == nullptr) { switch (dMessage_c::getInstance()->getMiniGameVariant()) { case 0: - dBase_c::createBase(fProfile::LYT_MINI_GAME, dLytControlGame_c::getInstance(), 11, fBase_c::OTHER); + dBase_c::createBase( + fProfile::LYT_MINI_GAME, dLytControlGame_c::getInstance(), dLytMiniGame_c::VARIANT_11, + fBase_c::OTHER + ); break; case 1: - dBase_c::createBase(fProfile::LYT_MINI_GAME, dLytControlGame_c::getInstance(), 10, fBase_c::OTHER); + dBase_c::createBase( + fProfile::LYT_MINI_GAME, dLytControlGame_c::getInstance(), dLytMiniGame_c::VARIANT_10, + fBase_c::OTHER + ); break; case 2: - dBase_c::createBase(fProfile::LYT_MINI_GAME, dLytControlGame_c::getInstance(), 12, fBase_c::OTHER); + dBase_c::createBase( + fProfile::LYT_MINI_GAME, dLytControlGame_c::getInstance(), dLytMiniGame_c::VARIANT_12, + fBase_c::OTHER + ); break; case 3: - dBase_c::createBase(fProfile::LYT_MINI_GAME, dLytControlGame_c::getInstance(), 14, fBase_c::OTHER); + dBase_c::createBase( + fProfile::LYT_MINI_GAME, dLytControlGame_c::getInstance(), dLytMiniGame_c::VARIANT_14, + fBase_c::OTHER + ); break; case 4: - dBase_c::createBase(fProfile::LYT_MINI_GAME, dLytControlGame_c::getInstance(), 13, fBase_c::OTHER); + dBase_c::createBase( + fProfile::LYT_MINI_GAME, dLytControlGame_c::getInstance(), dLytMiniGame_c::VARIANT_13, + fBase_c::OTHER + ); break; case 5: - dBase_c::createBase(fProfile::LYT_MINI_GAME, dLytControlGame_c::getInstance(), 2, fBase_c::OTHER); + dBase_c::createBase( + fProfile::LYT_MINI_GAME, dLytControlGame_c::getInstance(), dLytMiniGame_c::VARIANT_FUN_FUN_ISLAND, + fBase_c::OTHER + ); break; case 6: - dBase_c::createBase(fProfile::LYT_MINI_GAME, dLytControlGame_c::getInstance(), 16, fBase_c::OTHER); + dBase_c::createBase( + fProfile::LYT_MINI_GAME, dLytControlGame_c::getInstance(), dLytMiniGame_c::VARIANT_16, + fBase_c::OTHER + ); break; case 7: - dBase_c::createBase(fProfile::LYT_MINI_GAME, dLytControlGame_c::getInstance(), 15, fBase_c::OTHER); + dBase_c::createBase( + fProfile::LYT_MINI_GAME, dLytControlGame_c::getInstance(), dLytMiniGame_c::VARIANT_15, + fBase_c::OTHER + ); break; } } diff --git a/src/d/lyt/d_lyt_mini_game.cpp b/src/d/lyt/d_lyt_mini_game.cpp index 2fdeb81f..11f79c97 100644 --- a/src/d/lyt/d_lyt_mini_game.cpp +++ b/src/d/lyt/d_lyt_mini_game.cpp @@ -5,7 +5,11 @@ #include "d/a/d_a_itembase.h" #include "d/d_lang.h" #include "d/d_message.h" +#include "d/d_rawarchive.h" +#include "d/d_sc_game.h" +#include "d/d_stage_mgr.h" #include "d/lyt/d2d.h" +#include "d/lyt/meter/d_lyt_meter.h" #include "d/snd/d_snd_small_effect_mgr.h" #include "d/snd/d_snd_wzsound.h" #include "f/f_base.h" @@ -14,7 +18,18 @@ #include "nw4r/lyt/lyt_types.h" #include "nw4r/math/math_arithmetic.h" #include "nw4r/math/math_types.h" +#include "toBeSorted/arc_managers/layout_arc_manager.h" #include "toBeSorted/d_d3d.h" +#include "toBeSorted/event_manager.h" +#include "toBeSorted/minigame_mgr.h" + +dLytMiniGamePumpkin_c *dLytMiniGamePumpkin_c::sInstance; +dLytMiniGameBugs_c *dLytMiniGameBugs_c::sInstance; +dLytMiniGameTime_c *dLytMiniGameTime_c::sInstance; +dLytMiniGameStart_c *dLytMiniGameStart_c::sInstance; +dLytMiniGameScore_c *dLytMiniGameScore_c::sInstance; +dLytMiniGameScoreSd_c *dLytMiniGameScoreSd_c::sInstance; +dLytMiniGame_c *dLytMiniGame_c::sInstance; static const d2d::LytBrlanMapping brlanMapPumpkin[] = { { "miniGamePumpkin_00_getPoint.brlan", "G_scoreAll_00"}, @@ -472,7 +487,7 @@ void dLytMiniGameBugs_c::startIn() { } } -void dLytMiniGameBugs_c::startOutForced() { +void dLytMiniGameBugs_c::startOutTemp() { if (sInstance == nullptr) { return; } @@ -574,7 +589,7 @@ bool dLytMiniGameBugs_c::isSlotIconOnEnabled(s32 slot) const { return mAnm[idx].isEnabled_(); } -bool dLytMiniGameBugs_c::isSlotBugCollected(s32 slot) { +bool dLytMiniGameBugs_c::isSlotBugCollected(s32 slot) const { if (sInstance == nullptr) { return false; } @@ -873,7 +888,7 @@ bool dLytMiniGameTime_c::execute() { saveSecondsTimer(); } - if (mVariant == TIME_VARIANT_0) { + if (mVariant == TIME_VARIANT_INSECT_CAPTURE) { if (mCurrentTimerValueSeconds >= 590 && mLastTimerValueSeconds != mCurrentTimerValueSeconds && mCurrentTimerValueSeconds != 600) { dSndSmallEffectMgr_c::GetInstance()->playMinigameTimeUpSound(600 - mCurrentTimerValueSeconds); @@ -900,12 +915,12 @@ void dLytMiniGameTime_c::init() { } switch (mVariant) { - case TIME_VARIANT_0: mTimeFormat = TIMER_LONG; break; - case TIME_VARIANT_1: mTimeFormat = TIMER_SECONDS; break; - case TIME_VARIANT_2: mTimeFormat = TIMER_SECONDS; break; - case TIME_VARIANT_3: mTimeFormat = TIMER_LONG; break; - case TIME_VARIANT_4: mTimeFormat = TIMER_LONG; break; - case TIME_VARIANT_5: mTimeFormat = TIMER_LONG; break; + case TIME_VARIANT_INSECT_CAPTURE: mTimeFormat = TIMER_LONG; break; + case TIME_VARIANT_SPIRAL_CHARGE_TUTORIAL: mTimeFormat = TIMER_SECONDS; break; + case TIME_VARIANT_PUMPKIN_ARCHERY: mTimeFormat = TIMER_SECONDS; break; + case TIME_VARIANT_ROLLERCOASTER: mTimeFormat = TIMER_LONG; break; + case TIME_VARIANT_BOSS_RUSH: mTimeFormat = TIMER_LONG; break; + case TIME_VARIANT_TRIAL_TIME_ATTACK: mTimeFormat = TIMER_LONG; break; } resetAlphaIn(); @@ -944,7 +959,7 @@ void dLytMiniGameTime_c::fn_8028DD80() { mIsVisible = true; } -void dLytMiniGameTime_c::fn_8028DE40() { +void dLytMiniGameTime_c::startOut() { if (sInstance == nullptr) { return; } @@ -958,7 +973,7 @@ void dLytMiniGameTime_c::fn_8028DE40() { } } -void dLytMiniGameTime_c::fn_8028DED0() { +void dLytMiniGameTime_c::startIn() { if (sInstance == nullptr) { return; } @@ -987,7 +1002,7 @@ void dLytMiniGameTime_c::fn_8028DED0() { } } -void dLytMiniGameTime_c::fn_8028DFD0() { +void dLytMiniGameTime_c::startOutTemp() { if (sInstance == nullptr) { return; } @@ -1563,7 +1578,7 @@ bool dLytMiniGameStart_c::execute() { } if (isTimeupEndReached()) { - stopFinish(); + stopTimeup(); resetPlayedSounds(); mIsVisible = false; } @@ -1906,12 +1921,12 @@ bool dLytMiniGameScore_c::execute() { fn_80291BC0(); if (!field_0x816) { switch (mVariant) { - case SCORE_VARIANT_0: + case SCORE_VARIANT_BAMBOO_CUTTING: if (hasIncreasedScore()) { startGetScore(); } break; - case SCORE_VARIANT_2: + case SCORE_VARIANT_THRILL_DIGGER: if (field_0x829) { if (hasIncreasedScore()) { startGetScore(); @@ -1924,15 +1939,15 @@ bool dLytMiniGameScore_c::execute() { field_0x829 = false; } break; - case SCORE_VARIANT_1: + case SCORE_VARIANT_FUN_FUN_ISLAND: if (mScore != 1) { if (hasIncreasedScore()) { startGetScore(); } } break; - case SCORE_VARIANT_3: - case SCORE_VARIANT_4: + case SCORE_VARIANT_PUMPKIN_ARCHERY: + case SCORE_VARIANT_SPIRAL_CHARGE_TUTORIAL: if (hasIncreasedScore()) { startGetScore(); } @@ -1986,7 +2001,7 @@ bool dLytMiniGameScore_c::execute() { mLyt.calc(); } - if (!field_0x816 && mVariant == SCORE_VARIANT_0 && hasIncreasedScore()) { + if (!field_0x816 && mVariant == SCORE_VARIANT_BAMBOO_CUTTING && hasIncreasedScore()) { dSndSmallEffectMgr_c::GetInstance()->playMinigameScoreUpSound(mScore); } @@ -2052,7 +2067,7 @@ void dLytMiniGameScore_c::init() { mAnm[SCORE_ANIM_IN].setAnimEnable(false); switch (mVariant) { - case SCORE_VARIANT_0: + case SCORE_VARIANT_BAMBOO_CUTTING: field_0x82C = 0; field_0x81C = 21; field_0x7E4 = 4; @@ -2088,7 +2103,7 @@ void dLytMiniGameScore_c::init() { fn_80293450(field_0x81C); break; - case SCORE_VARIANT_1: + case SCORE_VARIANT_FUN_FUN_ISLAND: field_0x830 = 0; field_0x82C = 0; field_0x81C = 11; @@ -2149,7 +2164,7 @@ void dLytMiniGameScore_c::init() { } fn_80293450(field_0x81C); break; - case SCORE_VARIANT_2: + case SCORE_VARIANT_THRILL_DIGGER: field_0x830 = 0; field_0x82C = 0; field_0x81C = 6; @@ -2168,7 +2183,7 @@ void dLytMiniGameScore_c::init() { fn_80293450(field_0x81C); break; - case SCORE_VARIANT_3: + case SCORE_VARIANT_PUMPKIN_ARCHERY: field_0x82C = 0; field_0x81C = 21; field_0x7E4 = 4; @@ -2204,7 +2219,7 @@ void dLytMiniGameScore_c::init() { fn_80293450(field_0x81C); break; - case SCORE_VARIANT_4: + case SCORE_VARIANT_SPIRAL_CHARGE_TUTORIAL: field_0x830 = 0; field_0x82C = 0; field_0x81C = 19; @@ -2266,7 +2281,7 @@ void dLytMiniGameScore_c::fn_80291410() { field_0x820 = true; mIsVisible = true; - if (mVariant == SCORE_VARIANT_1) { + if (mVariant == SCORE_VARIANT_FUN_FUN_ISLAND) { setScore(1); calcNumDigits(); mAnm[SCORE_ANIM_SET_POSITION].setFrame(field_0x81C); @@ -2283,7 +2298,7 @@ void dLytMiniGameScore_c::fn_80291410() { } } -void dLytMiniGameScore_c::fn_802915B0() { +void dLytMiniGameScore_c::startOut() { if (sInstance == nullptr) { return; } @@ -2297,7 +2312,7 @@ void dLytMiniGameScore_c::fn_802915B0() { } } -void dLytMiniGameScore_c::fn_80291640() { +void dLytMiniGameScore_c::startIn() { if (sInstance == nullptr) { return; } @@ -2326,7 +2341,7 @@ void dLytMiniGameScore_c::fn_80291640() { } } -void dLytMiniGameScore_c::fn_80291740() { +void dLytMiniGameScore_c::startOutTemp() { if (sInstance == nullptr) { return; } @@ -2456,11 +2471,11 @@ void dLytMiniGameScore_c::fn_80291BC0() { calcNumDigits(); realizePosition(); - if (mVariant == SCORE_VARIANT_1) { + if (mVariant == SCORE_VARIANT_FUN_FUN_ISLAND) { if (field_0x828) { fn_80291EF0(); } - } else if (mVariant == SCORE_VARIANT_2) { + } else if (mVariant == SCORE_VARIANT_THRILL_DIGGER) { fn_80292040(); } @@ -2471,12 +2486,12 @@ void dLytMiniGameScore_c::fn_80291BC0() { } } -void dLytMiniGameScore_c::fn_80291D40(s32 arg) { +void dLytMiniGameScore_c::fn_80291D40(s32 score) { if (sInstance == nullptr) { return; } - s32 diff = arg - mScore; + s32 diff = score - mScore; switch (diff) { case 1: field_0x80C = 1; @@ -2501,11 +2516,11 @@ void dLytMiniGameScore_c::fn_80291D40(s32 arg) { case 0: return; } - if (arg < mScore) { + if (score < mScore) { field_0x80C = nw4r::math::FAbs(diff); field_0x810 = -1; } - field_0x808 = arg; + field_0x808 = score; field_0x804 = true; field_0x829 = true; } @@ -2837,7 +2852,7 @@ void dLytMiniGameScore_c::fn_80292C30() { PaneCalc calc; switch (mVariant) { - case SCORE_VARIANT_0: { + case SCORE_VARIANT_BAMBOO_CUTTING: { dMessage_c::getGlobalTagProcessor()->setNumericArg0(mScore); loadTextVariant(1); field_0x7E8 = mpTextBoxes[0]->GetLineWidth(nullptr); @@ -2851,7 +2866,7 @@ void dLytMiniGameScore_c::fn_80292C30() { break; } - case SCORE_VARIANT_3: { + case SCORE_VARIANT_PUMPKIN_ARCHERY: { dMessage_c::getGlobalTagProcessor()->setNumericArg0(mScore); loadTextVariant(0); field_0x7E8 = mpTextBoxes[0]->GetLineWidth(nullptr); @@ -2891,7 +2906,24 @@ void dLytMiniGameScore_c::fn_80292C30() { } } - // TODO - ... + // TODO - this uses similar annoying calculations and stack as above but + // I can't be bothered right now. Let's at least give this code + // a chance to be equivalent, even if it's not matching... + + nw4r::lyt::Pane *p = mpPanes[SCORE_PANE_P_POSITION_0]; + f32 fVar2 = p->GetSize().width * p->GetScale().x; + f32 fVar1 = field_0x834[0][1]; + f32 fVar3 = p->GetParent()->GetTranslate().x + p->GetTranslate().x; + f32 local_e0 = 0.0; + if (field_0x830 == 0) { + local_e0 = ((-fVar3 + f * 0.5) - fVar2 * 0.5) + 0.0; + } else if (field_0x830 == 1) { + local_e0 = (((((-fVar3 + f * 0.5) - fVar2 * 0.5) - field_0x7E8) + 0.0) - (f32)field_0x7FC) - (f32)field_0x804; + } else if (field_0x830 == 2) { + local_e0 = ((-fVar3 + f * 0.5) - fVar2 * 0.5) + 0.0; + } + mVec3_c translate(local_e0 + (f32)field_0x7F4, fVar1 + field_0x7F8, 0.0f); + mpPanes[SCORE_PANE_POSITION]->SetTranslate(translate); fn_80293450(mHighestDigitIndex + t + field_0x81C); nw4r::math::MTX34 mtx = mpPanes[SCORE_PANE_CENTER]->GetGlobalMtx(); @@ -3056,7 +3088,7 @@ void dLytMiniGameScoreSd_c::setScoreDown(s32 score) { return; } setScoreInternal(score); - startScoreUp(); + startScoreDown(); dSndSmallEffectMgr_c::GetInstance()->playMinigameScoreDownSound(score); mIsVisible = true; } @@ -3197,7 +3229,7 @@ static const char *sMiniGameSd = "MiniGameSd"; int dLytMiniGame_c::create() { mVariant = mParams; switch (mVariant) { - case VARIANT_1: { + case VARIANT_BAMBOO_CUTTING: { if (loadData(sMiniGame, SLOT_MINI_GAME) || loadData(sMiniGameScore, SLOT_MINI_GAME_SCORE)) { return NOT_READY; } @@ -3207,12 +3239,12 @@ int dLytMiniGame_c::create() { attachLoadedData(sMiniGame, mResAccStart); attachLoadedData(sMiniGameScore, mResAccScore); - mScore.setVariant(dLytMiniGameScore_c::SCORE_VARIANT_0); + mScore.setVariant(dLytMiniGameScore_c::SCORE_VARIANT_BAMBOO_CUTTING); mScore.build(&mResAccScore); mStart.build(&mResAccStart); break; } - case VARIANT_2: { + case VARIANT_FUN_FUN_ISLAND: { if (loadData(sMiniGame, SLOT_MINI_GAME) || loadData(sMiniGameSd, SLOT_MINI_GAME_SCORE_SD) || loadData(sMiniGameScore, SLOT_MINI_GAME_SCORE)) { return NOT_READY; @@ -3224,13 +3256,13 @@ int dLytMiniGame_c::create() { attachLoadedData(sMiniGame, mResAccStart); attachLoadedData(sMiniGameSd, mResAccScoreSd); attachLoadedData(sMiniGameScore, mResAccScore); - mScore.setVariant(dLytMiniGameScore_c::SCORE_VARIANT_1); + mScore.setVariant(dLytMiniGameScore_c::SCORE_VARIANT_FUN_FUN_ISLAND); mScore.build(&mResAccScore); mScoreSd.build(&mResAccScoreSd); mStart.build(&mResAccStart); break; } - case VARIANT_3: { + case VARIANT_THRILL_DIGGER: { if (loadData(sMiniGame, SLOT_MINI_GAME) || loadData(sMiniGameScore, SLOT_MINI_GAME_SCORE)) { return NOT_READY; } @@ -3240,12 +3272,12 @@ int dLytMiniGame_c::create() { attachLoadedData(sMiniGame, mResAccStart); attachLoadedData(sMiniGameScore, mResAccScore); - mScore.setVariant(dLytMiniGameScore_c::SCORE_VARIANT_2); + mScore.setVariant(dLytMiniGameScore_c::SCORE_VARIANT_THRILL_DIGGER); mScore.build(&mResAccScore); mStart.build(&mResAccStart); break; } - case VARIANT_4: { + case VARIANT_INSECT_CAPTURE: { if (loadData(sMiniGame, SLOT_MINI_GAME) || loadData(sMiniGameBugs, SLOT_MINI_GAME_BUGS) || loadData(sMiniGameTime, SLOT_MINI_GAME_TIME)) { return NOT_READY; @@ -3257,13 +3289,13 @@ int dLytMiniGame_c::create() { attachLoadedData(sMiniGame, mResAccStart); attachLoadedData(sMiniGameBugs, mResAccBugs); attachLoadedData(sMiniGameTime, mResAccTime); - mTime.setVariant(dLytMiniGameTime_c::TIME_VARIANT_0); + mTime.setVariant(dLytMiniGameTime_c::TIME_VARIANT_INSECT_CAPTURE); mTime.build(&mResAccTime); mBugs.build(&mResAccBugs); mStart.build(&mResAccStart); break; } - case VARIANT_5: { + case VARIANT_SPIRAL_CHARGE_TUTORIAL: { if (loadData(sMiniGame, SLOT_MINI_GAME) || loadData(sMiniGameScore, SLOT_MINI_GAME_SCORE) || loadData(sMiniGameTime, SLOT_MINI_GAME_TIME)) { return NOT_READY; @@ -3275,14 +3307,14 @@ int dLytMiniGame_c::create() { attachLoadedData(sMiniGame, mResAccStart); attachLoadedData(sMiniGameScore, mResAccScore); attachLoadedData(sMiniGameTime, mResAccTime); - mTime.setVariant(dLytMiniGameTime_c::TIME_VARIANT_1); + mTime.setVariant(dLytMiniGameTime_c::TIME_VARIANT_SPIRAL_CHARGE_TUTORIAL); mTime.build(&mResAccTime); - mScore.setVariant(dLytMiniGameScore_c::SCORE_VARIANT_4); + mScore.setVariant(dLytMiniGameScore_c::SCORE_VARIANT_SPIRAL_CHARGE_TUTORIAL); mScore.build(&mResAccScore); mStart.build(&mResAccStart); break; } - case VARIANT_6: { + case VARIANT_PUMPKIN_ARCHERY: { if (loadData(sMiniGame, SLOT_MINI_GAME) || loadData(sMiniGamePumpkin, SLOT_MINI_GAME_PUMPKIN) || loadData(sMiniGameScore, SLOT_MINI_GAME_SCORE) || loadData(sMiniGameTime, SLOT_MINI_GAME_TIME)) { return NOT_READY; @@ -3296,15 +3328,15 @@ int dLytMiniGame_c::create() { attachLoadedData(sMiniGamePumpkin, mResAccPumpkin); attachLoadedData(sMiniGameScore, mResAccScore); attachLoadedData(sMiniGameTime, mResAccTime); - mTime.setVariant(dLytMiniGameTime_c::TIME_VARIANT_2); + mTime.setVariant(dLytMiniGameTime_c::TIME_VARIANT_PUMPKIN_ARCHERY); mTime.build(&mResAccTime); - mScore.setVariant(dLytMiniGameScore_c::SCORE_VARIANT_3); + mScore.setVariant(dLytMiniGameScore_c::SCORE_VARIANT_PUMPKIN_ARCHERY); mScore.build(&mResAccScore); mStart.build(&mResAccStart); mPumpkin.build(&mResAccPumpkin); break; } - case VARIANT_7: { + case VARIANT_ROLLERCOASTER: { if (loadData(sMiniGame, SLOT_MINI_GAME) || loadData(sMiniGameTime, SLOT_MINI_GAME_TIME)) { return NOT_READY; } @@ -3314,12 +3346,12 @@ int dLytMiniGame_c::create() { attachLoadedData(sMiniGame, mResAccStart); attachLoadedData(sMiniGameTime, mResAccTime); - mTime.setVariant(dLytMiniGameTime_c::TIME_VARIANT_3); + mTime.setVariant(dLytMiniGameTime_c::TIME_VARIANT_ROLLERCOASTER); mTime.build(&mResAccTime); mStart.build(&mResAccStart); break; } - case VARIANT_8: { + case VARIANT_BOSS_RUSH: { if (loadData(sMiniGame, SLOT_MINI_GAME) || loadData(sMiniGameTime, SLOT_MINI_GAME_TIME)) { return NOT_READY; } @@ -3329,12 +3361,12 @@ int dLytMiniGame_c::create() { attachLoadedData(sMiniGame, mResAccStart); attachLoadedData(sMiniGameTime, mResAccTime); - mTime.setVariant(dLytMiniGameTime_c::TIME_VARIANT_4); + mTime.setVariant(dLytMiniGameTime_c::TIME_VARIANT_BOSS_RUSH); mTime.build(&mResAccTime); mStart.build(&mResAccStart); break; } - case VARIANT_9: { + case VARIANT_TRIAL_TIME_ATTACK: { if (loadData(sMiniGame, SLOT_MINI_GAME) || loadData(sMiniGameTime, SLOT_MINI_GAME_TIME)) { return NOT_READY; } @@ -3344,7 +3376,7 @@ int dLytMiniGame_c::create() { attachLoadedData(sMiniGame, mResAccStart); attachLoadedData(sMiniGameTime, mResAccTime); - mTime.setVariant(dLytMiniGameTime_c::TIME_VARIANT_5); + mTime.setVariant(dLytMiniGameTime_c::TIME_VARIANT_TRIAL_TIME_ATTACK); mTime.build(&mResAccTime); mStart.build(&mResAccStart); break; @@ -3357,7 +3389,7 @@ int dLytMiniGame_c::create() { return NOT_READY; } attachLoadedData(sMiniGameScore, mResAccScore); - mScore.setVariant(dLytMiniGameScore_c::SCORE_VARIANT_0); + mScore.setVariant(dLytMiniGameScore_c::SCORE_VARIANT_BAMBOO_CUTTING); mScore.setField_0x816(true); mScore.build(&mResAccScore); break; @@ -3370,7 +3402,7 @@ int dLytMiniGame_c::create() { return NOT_READY; } attachLoadedData(sMiniGameScore, mResAccScore); - mScore.setVariant(dLytMiniGameScore_c::SCORE_VARIANT_2); + mScore.setVariant(dLytMiniGameScore_c::SCORE_VARIANT_THRILL_DIGGER); mScore.setField_0x816(true); mScore.build(&mResAccScore); break; @@ -3383,7 +3415,7 @@ int dLytMiniGame_c::create() { return NOT_READY; } attachLoadedData(sMiniGameTime, mResAccTime); - mTime.setVariant(dLytMiniGameTime_c::TIME_VARIANT_0); + mTime.setVariant(dLytMiniGameTime_c::TIME_VARIANT_INSECT_CAPTURE); mTime.setField_0x7EE(true); mTime.build(&mResAccTime); break; @@ -3396,7 +3428,7 @@ int dLytMiniGame_c::create() { return NOT_READY; } attachLoadedData(sMiniGameScore, mResAccScore); - mScore.setVariant(dLytMiniGameScore_c::SCORE_VARIANT_3); + mScore.setVariant(dLytMiniGameScore_c::SCORE_VARIANT_PUMPKIN_ARCHERY); mScore.setField_0x816(true); mScore.build(&mResAccScore); break; @@ -3409,7 +3441,7 @@ int dLytMiniGame_c::create() { return NOT_READY; } attachLoadedData(sMiniGameTime, mResAccTime); - mTime.setVariant(dLytMiniGameTime_c::TIME_VARIANT_3); + mTime.setVariant(dLytMiniGameTime_c::TIME_VARIANT_ROLLERCOASTER); mTime.setField_0x7EE(true); mTime.build(&mResAccTime); break; @@ -3422,7 +3454,7 @@ int dLytMiniGame_c::create() { return NOT_READY; } attachLoadedData(sMiniGameTime, mResAccTime); - mTime.setVariant(dLytMiniGameTime_c::TIME_VARIANT_4); + mTime.setVariant(dLytMiniGameTime_c::TIME_VARIANT_BOSS_RUSH); mTime.setField_0x7EE(true); mTime.build(&mResAccTime); break; @@ -3435,7 +3467,7 @@ int dLytMiniGame_c::create() { return NOT_READY; } attachLoadedData(sMiniGameTime, mResAccTime); - mTime.setVariant(dLytMiniGameTime_c::TIME_VARIANT_5); + mTime.setVariant(dLytMiniGameTime_c::TIME_VARIANT_TRIAL_TIME_ATTACK); mTime.setField_0x7EE(true); mTime.build(&mResAccTime); break; @@ -3457,14 +3489,14 @@ int dLytMiniGame_c::doDelete() { mPumpkin.remove(); switch (mVariant) { - case VARIANT_1: { + case VARIANT_BAMBOO_CUTTING: { mResAccStart.detach(); mResAccScore.detach(); unloadData(sMiniGame); unloadData(sMiniGameScore); break; } - case VARIANT_2: { + case VARIANT_FUN_FUN_ISLAND: { mResAccStart.detach(); mResAccScoreSd.detach(); mResAccScore.detach(); @@ -3473,14 +3505,14 @@ int dLytMiniGame_c::doDelete() { unloadData(sMiniGameScore); break; } - case VARIANT_3: { + case VARIANT_THRILL_DIGGER: { mResAccStart.detach(); mResAccScore.detach(); unloadData(sMiniGame); unloadData(sMiniGameScore); break; } - case VARIANT_4: { + case VARIANT_INSECT_CAPTURE: { mResAccStart.detach(); mResAccBugs.detach(); mResAccTime.detach(); @@ -3489,7 +3521,7 @@ int dLytMiniGame_c::doDelete() { unloadData(sMiniGameTime); break; } - case VARIANT_5: { + case VARIANT_SPIRAL_CHARGE_TUTORIAL: { mResAccStart.detach(); mResAccScore.detach(); mResAccTime.detach(); @@ -3498,7 +3530,7 @@ int dLytMiniGame_c::doDelete() { unloadData(sMiniGameTime); break; } - case VARIANT_6: { + case VARIANT_PUMPKIN_ARCHERY: { mResAccStart.detach(); mResAccPumpkin.detach(); mResAccScore.detach(); @@ -3509,21 +3541,21 @@ int dLytMiniGame_c::doDelete() { unloadData(sMiniGameTime); break; } - case VARIANT_7: { + case VARIANT_ROLLERCOASTER: { mResAccStart.detach(); mResAccTime.detach(); unloadData(sMiniGame); unloadData(sMiniGameTime); break; } - case VARIANT_8: { + case VARIANT_BOSS_RUSH: { mResAccStart.detach(); mResAccTime.detach(); unloadData(sMiniGame); unloadData(sMiniGameTime); break; } - case VARIANT_9: { + case VARIANT_TRIAL_TIME_ATTACK: { mResAccStart.detach(); mResAccTime.detach(); unloadData(sMiniGame); @@ -3572,13 +3604,577 @@ int dLytMiniGame_c::doDelete() { } int dLytMiniGame_c::execute() { + switch (mVariant) { + case VARIANT_BAMBOO_CUTTING: + case VARIANT_10: fn_80295F90(); break; + case VARIANT_FUN_FUN_ISLAND: fn_80296000(); break; + case VARIANT_THRILL_DIGGER: + case VARIANT_11: fn_80296070(); break; + case VARIANT_INSECT_CAPTURE: + case VARIANT_12: fn_80296150(); break; + case VARIANT_SPIRAL_CHARGE_TUTORIAL: fn_80296210(); break; + case VARIANT_PUMPKIN_ARCHERY: + case VARIANT_13: fn_802962A0(); break; + case VARIANT_ROLLERCOASTER: + case VARIANT_14: fn_80296330(); break; + case VARIANT_BOSS_RUSH: + case VARIANT_15: fn_802963E0(); break; + case VARIANT_TRIAL_TIME_ATTACK: + case VARIANT_16: fn_80296480(); break; + } + + mScore.execute(); + mScoreSd.execute(); + mTime.execute(); + mBugs.execute(); + mPumpkin.execute(); + + if (!isPopupOpenExceptHelp()) { + mStart.execute(); + } + return SUCCEEDED; } int dLytMiniGame_c::draw() { + mPumpkin.draw(); + mScoreSd.draw(); + mBugs.draw(); + mScore.draw(); + mTime.draw(); + + if (!isPopupOpenExceptHelp()) { + mStart.draw(); + } + return SUCCEEDED; } +void dLytMiniGame_c::scoreRelatedExecute() { + switch (mVariant) { + case VARIANT_BAMBOO_CUTTING: + case VARIANT_THRILL_DIGGER: + case VARIANT_SPIRAL_CHARGE_TUTORIAL: + case VARIANT_PUMPKIN_ARCHERY: mScore.fn_80291410(); break; + case VARIANT_FUN_FUN_ISLAND: + if (fn_80295DB0()) { + mScore.startAlphaIn(); + } else { + mScore.fn_80291410(); + mScore.setField_0x828(false); + } + break; + case VARIANT_10: + case VARIANT_11: + case VARIANT_13: mScore.startAlphaIn(); + } +} + +void dLytMiniGame_c::scoreRelated() { + switch (mVariant) { + case VARIANT_FUN_FUN_ISLAND: + if (fn_80295DB0()) { + mScore.startAlphaOut(); + } else { + mScore.startOut(); + } + break; + case VARIANT_10: + case VARIANT_11: + case VARIANT_13: mScore.startAlphaOut(); break; + } +} + +void dLytMiniGame_c::setDisplayedPoints(s32 points) { + switch (mVariant) { + case VARIANT_BAMBOO_CUTTING: + case VARIANT_SPIRAL_CHARGE_TUTORIAL: + case VARIANT_PUMPKIN_ARCHERY: mScore.setScore(points); break; + case VARIANT_FUN_FUN_ISLAND: + fn_80295DB0(); + mScore.setScore(points); + break; + case VARIANT_THRILL_DIGGER: mScore.fn_80291D40(points); break; + case VARIANT_10: + case VARIANT_13: mScore.setScore(points); break; + case VARIANT_11: + mScore.setScore(points); + field_0x3864 = 1; + field_0x3865 = 0; + break; + } +} + +void dLytMiniGame_c::fn_80295900(s32 arg) { + mScore.fn_80291ED0(arg); + mScore.setField_0x828(true); +} + +void dLytMiniGame_c::startCountdown() { + switch (mVariant) { + case VARIANT_BAMBOO_CUTTING: + case VARIANT_FUN_FUN_ISLAND: + case VARIANT_THRILL_DIGGER: + case VARIANT_INSECT_CAPTURE: + case VARIANT_SPIRAL_CHARGE_TUTORIAL: + case VARIANT_PUMPKIN_ARCHERY: + case VARIANT_ROLLERCOASTER: + case VARIANT_TRIAL_TIME_ATTACK: mStart.startCountdown(); break; + case VARIANT_BOSS_RUSH: mStart.startCountdown120(); break; + } +} + +void dLytMiniGame_c::startFinish() { + switch (mVariant) { + case VARIANT_BAMBOO_CUTTING: + case VARIANT_FUN_FUN_ISLAND: + case VARIANT_THRILL_DIGGER: + case VARIANT_PUMPKIN_ARCHERY: + mStart.startFinish(); + mScore.startFinish(); + break; + case VARIANT_INSECT_CAPTURE: + case VARIANT_ROLLERCOASTER: + case VARIANT_BOSS_RUSH: + case VARIANT_TRIAL_TIME_ATTACK: + mStart.startFinish(); + mTime.startFinish(); + break; + case VARIANT_SPIRAL_CHARGE_TUTORIAL: + mStart.startFinish(); + mScore.startFinish(); + break; + } +} + +void dLytMiniGame_c::fn_80295A20() { + switch (mVariant) { + case VARIANT_BAMBOO_CUTTING: + case VARIANT_FUN_FUN_ISLAND: + case VARIANT_THRILL_DIGGER: + // case VARIANT_PUMPKIN_ARCHERY: + mStart.startTimeup(); + mScore.startFinish(); + break; + case VARIANT_INSECT_CAPTURE: + case VARIANT_ROLLERCOASTER: + case VARIANT_BOSS_RUSH: + case VARIANT_TRIAL_TIME_ATTACK: + mStart.startTimeup(); + mTime.startFinish(); + break; + case VARIANT_SPIRAL_CHARGE_TUTORIAL: + mStart.startTimeup(); + mScore.startFinish(); + break; + } +} + +bool dLytMiniGame_c::isStartCountdownDone() { + switch (mVariant) { + case VARIANT_BAMBOO_CUTTING: + case VARIANT_FUN_FUN_ISLAND: + case VARIANT_THRILL_DIGGER: + case VARIANT_INSECT_CAPTURE: + case VARIANT_SPIRAL_CHARGE_TUTORIAL: + case VARIANT_PUMPKIN_ARCHERY: + case VARIANT_ROLLERCOASTER: + case VARIANT_BOSS_RUSH: + case VARIANT_TRIAL_TIME_ATTACK: return mStart.isCountdownEndReached(); + } + return false; +} + +bool dLytMiniGame_c::isFinishAnimDone() { + switch (mVariant) { + case VARIANT_BAMBOO_CUTTING: + case VARIANT_FUN_FUN_ISLAND: + case VARIANT_THRILL_DIGGER: + case VARIANT_INSECT_CAPTURE: + case VARIANT_SPIRAL_CHARGE_TUTORIAL: + case VARIANT_PUMPKIN_ARCHERY: + case VARIANT_ROLLERCOASTER: + case VARIANT_BOSS_RUSH: + case VARIANT_TRIAL_TIME_ATTACK: return mStart.isFinishEndReached(); + } + return false; +} + +bool dLytMiniGame_c::isTimeupAnimDone() { + switch (mVariant) { + case VARIANT_BAMBOO_CUTTING: + case VARIANT_FUN_FUN_ISLAND: + case VARIANT_THRILL_DIGGER: + case VARIANT_INSECT_CAPTURE: + case VARIANT_SPIRAL_CHARGE_TUTORIAL: + // case VARIANT_PUMPKIN_ARCHERY: + case VARIANT_ROLLERCOASTER: + case VARIANT_BOSS_RUSH: + case VARIANT_TRIAL_TIME_ATTACK: return mStart.isTimeupEndReached(); + } + return false; +} + +void dLytMiniGame_c::fn_80295B20(s32 score) { + mScoreSd.setScoreUp(score); +} + +void dLytMiniGame_c::fn_80295B30(s32 score) { + mScoreSd.setScoreDown(score); +} + +void dLytMiniGame_c::timeRelatedExecute() { + switch (mVariant) { + case VARIANT_INSECT_CAPTURE: + case VARIANT_PUMPKIN_ARCHERY: + case VARIANT_ROLLERCOASTER: + case VARIANT_BOSS_RUSH: + case VARIANT_TRIAL_TIME_ATTACK: mTime.fn_8028DD80(); break; + case VARIANT_SPIRAL_CHARGE_TUTORIAL: + if (!dScGame_c::GetInstance()->isFadingIn()) { + mTime.fn_8028DD80(); + } + break; + case VARIANT_12: + case VARIANT_14: + case VARIANT_15: + case VARIANT_16: mTime.startAlphaIn(); break; + } +} + +void dLytMiniGame_c::timeRelated() { + switch (mVariant) { + case VARIANT_12: + case VARIANT_14: + case VARIANT_15: + case VARIANT_16: mTime.startAlphaOut(); break; + } +} + +void dLytMiniGame_c::setDisplayedTime(s32 time) { + switch (mVariant) { + case VARIANT_INSECT_CAPTURE: + case VARIANT_ROLLERCOASTER: + case VARIANT_BOSS_RUSH: + case VARIANT_TRIAL_TIME_ATTACK: mTime.setTimerValueInMilliSeconds(time); break; + case VARIANT_PUMPKIN_ARCHERY: mTime.setTimerSecondsValueInMilliSeconds(time); break; + case VARIANT_SPIRAL_CHARGE_TUTORIAL: mTime.setTimerSecondsValueInMilliSeconds(time); break; + case VARIANT_12: + case VARIANT_14: + case VARIANT_15: + case VARIANT_16: mTime.setTimerValueInMilliSeconds(time); break; + } +} + +void dLytMiniGame_c::setHighscore(s32 time) { + switch (mVariant) { + case VARIANT_INSECT_CAPTURE: + case VARIANT_ROLLERCOASTER: + case VARIANT_BOSS_RUSH: + case VARIANT_TRIAL_TIME_ATTACK: + // case VARIANT_SPIRAL_CHARGE_TUTORIAL: + case VARIANT_PUMPKIN_ARCHERY: + case VARIANT_12: + case VARIANT_14: + case VARIANT_15: + case VARIANT_16: mTime.setBestTime(time); break; + } +} + +void dLytMiniGame_c::setShowBestTime(bool show) { + switch (mVariant) { + case VARIANT_INSECT_CAPTURE: + case VARIANT_ROLLERCOASTER: + case VARIANT_BOSS_RUSH: + case VARIANT_TRIAL_TIME_ATTACK: + // case VARIANT_SPIRAL_CHARGE_TUTORIAL: + case VARIANT_PUMPKIN_ARCHERY: + case VARIANT_12: + case VARIANT_14: + case VARIANT_15: + case VARIANT_16: mTime.setShowBestTime(show); break; + } +} + +void dLytMiniGame_c::startBugsAllIconsIn() { + mBugs.startAllIconsIn(); +} + +void dLytMiniGame_c::set5Bugs() { + mBugs.setBugsNumLevel(0); +} + +void dLytMiniGame_c::set10Bugs() { + mBugs.setBugsNumLevel(1); +} + +void dLytMiniGame_c::reInitBugs() { + mBugs.init(); +} + +void dLytMiniGame_c::setBug(s32 slot, s32 bugIndex) { + mBugs.setBug(slot, bugIndex); +} + +void dLytMiniGame_c::collectBug(s32 slot) { + mBugs.collectBug(slot); +} + +void dLytMiniGame_c::startBugsFlash() { + mBugs.startBugsFlash(); +} + +bool dLytMiniGame_c::isBugIconOnEndReached(s32 slot) const { + return mBugs.isSlotIconOnEndReached(slot); +} + +bool dLytMiniGame_c::isBugCollected(s32 slot) const { + return mBugs.isSlotBugCollected(slot); +} + +void dLytMiniGame_c::fn_80295D80() { + scoreRelatedExecute(); +} + +void dLytMiniGame_c::fn_80295D90(s32 points) { + setDisplayedPoints(points); +} + +void dLytMiniGame_c::getPumpkin(const mVec3_c &pumpkinPos, s32 unk, bool doubleScore) { + mPumpkin.getPoint(pumpkinPos, unk, doubleScore); +} + +// cannot be const... +bool dLytMiniGame_c::fn_80295DB0() { + bool ret = false; + switch (mVariant) { + case VARIANT_10: + case VARIANT_11: + case VARIANT_12: + case VARIANT_13: + case VARIANT_14: + case VARIANT_15: + case VARIANT_16: ret = true; break; + case VARIANT_FUN_FUN_ISLAND: + if (!MinigameManager::GetInstance()->checkInFunFunIsland()) { + ret = true; + } + break; + } + return ret; +} + +bool dLytMiniGame_c::isInEvent() const { + bool ret = false; + if (EventManager::isInEvent()) { + ret = true; + } + return ret; +} + +bool dLytMiniGame_c::isPopupOpen() const { + bool ret = false; + if (dLytMeter_c::isPopupOpen()) { + ret = true; + } + return ret; +} + +bool dLytMiniGame_c::isPopupOpenExceptHelp() const { + bool ret = false; + if (isPopupOpen()) { + ret = true; + } + + if (dLytMeter_c::GetInstance()->isHelpOpen()) { + ret = false; + } + + return ret; +} + +bool dLytMiniGame_c::isFadingOut() const { + bool ret = false; + if (dStageMgr_c::GetInstance()->isFadingOut() || dScGame_c::GetInstance()->isFadingOut()) { + ret = true; + } + return ret; +} + +void dLytMiniGame_c::fn_80295F90() { + if (fn_80295DB0()) { + // nothing + } else { + if (isPopupOpen()) { + mScore.startOutTemp(); + } else { + mScore.startIn(); + } + + if (isFadingOut()) { + mScore.startOut(); + } + } +} + +void dLytMiniGame_c::fn_80296000() { + if (fn_80295DB0()) { + mScore.setField_0x816(true); + } else { + mScore.setField_0x816(false); + if (isPopupOpen()) { + mScore.startOutTemp(); + } else { + mScore.startIn(); + } + } +} + +void dLytMiniGame_c::fn_80296070() { + if (fn_80295DB0()) { + if (field_0x3864 == 1) { + s32 score = mScore.getScore(); + s32 rupeeDiff = dLytMeter_c::getRupeeDifference(); + if (score != 0) { + if (rupeeDiff != 0) { + field_0x3865 = 1; + } + + if (field_0x3865 == 1 && rupeeDiff < score) { + mScore.setScore(rupeeDiff); + } + } + } + } else { + if (isPopupOpen()) { + mScore.startOutTemp(); + } else { + mScore.startIn(); + } + + if (isFadingOut()) { + mScore.startOut(); + } + } +} + +void dLytMiniGame_c::fn_80296150() { + if (fn_80295DB0()) { + // nothing + } else { + if (isInEvent() || isPopupOpen()) { + if (!field_0x3866) { + mBugs.startOutTemp(); + mTime.startOutTemp(); + } else { + mBugs.startIn(); + mTime.startIn(); + } + } else { + mBugs.startIn(); + mTime.startIn(); + } + + if (isFadingOut()) { + mBugs.startOut(); + mTime.startOut(); + } + } +} + +void dLytMiniGame_c::fn_80296210() { + if (isInEvent() || isPopupOpen()) { + mScore.startOutTemp(); + mTime.startOutTemp(); + } else { + mScore.startIn(); + mTime.startIn(); + } + + if (isFadingOut()) { + mScore.startOut(); + mTime.startOut(); + } +} + +void dLytMiniGame_c::fn_802962A0() { + if (!fn_80295DB0()) { + if (isPopupOpen()) { + mScore.startOutTemp(); + mTime.startOutTemp(); + } else { + mScore.startIn(); + mTime.startIn(); + } + + if (isFadingOut()) { + mScore.startOut(); + mTime.startOut(); + } + } +} + +void dLytMiniGame_c::fn_80296330() { + if (fn_80295DB0()) { + // nothing + } else { + if (isInEvent() || isPopupOpen()) { + if (!field_0x3866) { + mTime.startOutTemp(); + } else { + mTime.startIn(); + } + } else { + mTime.startIn(); + } + + if (isFadingOut() && field_0x3866 == 1) { + mTime.startOut(); + } + } +} + +// These two do the same thing +void dLytMiniGame_c::fn_802963E0() { + if (fn_80295DB0()) { + // nothing + } else { + if (isInEvent() || isPopupOpen()) { + if (!field_0x3866) { + mTime.startOutTemp(); + } else { + mTime.startIn(); + } + } else { + mTime.startIn(); + } + + if (isFadingOut()) { + mTime.startOut(); + } + } +} + +void dLytMiniGame_c::fn_80296480() { + if (fn_80295DB0()) { + // nothing + } else { + if (isInEvent() || isPopupOpen()) { + if (!field_0x3866) { + mTime.startOutTemp(); + } else { + mTime.startIn(); + } + } else { + mTime.startIn(); + } + + if (isFadingOut()) { + mTime.startOut(); + } + } +} + void dLytMiniGame_c::init() { mScore.init(); mScoreSd.init(); @@ -3587,3 +4183,47 @@ void dLytMiniGame_c::init() { mBugs.init(); mPumpkin.init(); } + +bool dLytMiniGame_c::loadData(const char *name, s32 slot) { + bool loadRequest = false; + switch (slot) { + case SLOT_MINI_GAME: loadRequest = field_0x0068; break; + case SLOT_MINI_GAME_SCORE: loadRequest = field_0x0069; break; + case SLOT_MINI_GAME_TIME: loadRequest = field_0x006A; break; + case SLOT_MINI_GAME_BUGS: loadRequest = field_0x006B; break; + case SLOT_MINI_GAME_PUMPKIN: loadRequest = field_0x006C; break; + case SLOT_MINI_GAME_SCORE_SD: loadRequest = field_0x006D; break; + } + + if (!loadRequest) { + LayoutArcManager::GetInstance()->loadLayoutArcFromDisk(name, nullptr); + switch (slot) { + case SLOT_MINI_GAME: field_0x0068 = true; break; + case SLOT_MINI_GAME_SCORE: field_0x0069 = true; break; + case SLOT_MINI_GAME_TIME: field_0x006A = true; break; + case SLOT_MINI_GAME_BUGS: field_0x006B = true; break; + case SLOT_MINI_GAME_PUMPKIN: field_0x006C = true; break; + case SLOT_MINI_GAME_SCORE_SD: field_0x006D = true; break; + } + return true; + } + return false; +} + +bool dLytMiniGame_c::isLoading(const char *name) const { + return LayoutArcManager::GetInstance()->ensureLoaded1(name) != D_ARC_RESULT_OK; +} + +void dLytMiniGame_c::attachLoadedData(const char *name, d2d::ResAccIf_c &resAcc) { + resAcc.attach(LayoutArcManager::GetInstance()->getLoadedData(name), ""); +} + +void dLytMiniGame_c::unloadData(const char *name) { + s32 res = LayoutArcManager::GetInstance()->ensureLoaded2(name); + if (res == D_ARC_RESULT_ERROR_NOT_FOUND) { + return; + } + if (res == D_ARC_RESULT_OK) { + LayoutArcManager::GetInstance()->decrement(name); + } +} diff --git a/src/d/lyt/meter/d_lyt_meter.cpp b/src/d/lyt/meter/d_lyt_meter.cpp index c8db7a82..bb0accb9 100644 --- a/src/d/lyt/meter/d_lyt_meter.cpp +++ b/src/d/lyt/meter/d_lyt_meter.cpp @@ -581,7 +581,7 @@ bool dLytMeterMain_c::fn_800C9FE0() { return false; } -bool dLytMeterMain_c::fn_800CA040() { +bool dLytMeterMain_c::isPopupOpen() { if (mHelpOpen || isInModeMap() || isInModePause()) { return true; } From 83a1e0256e969a2c96c5007c4c26512d3c910b48 Mon Sep 17 00:00:00 2001 From: robojumper Date: Thu, 4 Dec 2025 22:53:07 +0100 Subject: [PATCH 6/9] Small cleanup --- include/d/lyt/d_lyt_mini_game.h | 42 ++++++++++++++++----------------- src/d/lyt/d_lyt_mini_game.cpp | 36 ++++++++++++++-------------- 2 files changed, 39 insertions(+), 39 deletions(-) diff --git a/include/d/lyt/d_lyt_mini_game.h b/include/d/lyt/d_lyt_mini_game.h index b8dfb374..cf877a76 100644 --- a/include/d/lyt/d_lyt_mini_game.h +++ b/include/d/lyt/d_lyt_mini_game.h @@ -536,18 +536,18 @@ private: public: dLytMiniGame_c() - : field_0x0068(false), - field_0x0069(false), - field_0x006A(false), - field_0x006B(false), - field_0x006C(false), - field_0x006D(false), - mVariant(1), - field_0x3864(0), - field_0x3865(0), + : mLoadRequestStart(false), + mLoadRequestScore(false), + mLoadRequestTime(false), + mLoadRequestBugs(false), + mLoadRequestPumpkin(false), + mLoadRequestScoreSd(false), + mVariant(VARIANT_BAMBOO_CUTTING), + field_0x3864(false), + field_0x3865(false), field_0x3866(false), - field_0x3867(0), - field_0x3868(0) {} + field_0x3867(false), + field_0x3868(false) {} virtual ~dLytMiniGame_c() {} virtual int create() override; @@ -634,12 +634,12 @@ private: void fn_802963E0(); void fn_80296480(); - /* 0x0068 */ bool field_0x0068; - /* 0x0069 */ bool field_0x0069; - /* 0x006A */ bool field_0x006A; - /* 0x006B */ bool field_0x006B; - /* 0x006C */ bool field_0x006C; - /* 0x006D */ bool field_0x006D; + /* 0x0068 */ bool mLoadRequestStart; + /* 0x0069 */ bool mLoadRequestScore; + /* 0x006A */ bool mLoadRequestTime; + /* 0x006B */ bool mLoadRequestBugs; + /* 0x006C */ bool mLoadRequestPumpkin; + /* 0x006D */ bool mLoadRequestScoreSd; /* 0x0070 */ d2d::ResAccIf_c mResAccStart; /* 0x03E0 */ d2d::ResAccIf_c mResAccScore; @@ -656,11 +656,11 @@ private: /* 0x209C */ dLytMiniGameTime_c mTime; /* 0x2894 */ dLytMiniGameBugs_c mBugs; /* 0x33E4 */ dLytMiniGamePumpkin_c mPumpkin; - /* 0x3864 */ u8 field_0x3864; - /* 0x3865 */ u8 field_0x3865; + /* 0x3864 */ bool field_0x3864; + /* 0x3865 */ bool field_0x3865; /* 0x3866 */ bool field_0x3866; - /* 0x3867 */ u8 field_0x3867; - /* 0x3868 */ u8 field_0x3868; + /* 0x3867 */ bool field_0x3867; + /* 0x3868 */ bool field_0x3868; }; #endif diff --git a/src/d/lyt/d_lyt_mini_game.cpp b/src/d/lyt/d_lyt_mini_game.cpp index 11f79c97..a348099f 100644 --- a/src/d/lyt/d_lyt_mini_game.cpp +++ b/src/d/lyt/d_lyt_mini_game.cpp @@ -3699,8 +3699,8 @@ void dLytMiniGame_c::setDisplayedPoints(s32 points) { case VARIANT_13: mScore.setScore(points); break; case VARIANT_11: mScore.setScore(points); - field_0x3864 = 1; - field_0x3865 = 0; + field_0x3864 = true; + field_0x3865 = false; break; } } @@ -4032,15 +4032,15 @@ void dLytMiniGame_c::fn_80296000() { void dLytMiniGame_c::fn_80296070() { if (fn_80295DB0()) { - if (field_0x3864 == 1) { + if (field_0x3864 == true) { s32 score = mScore.getScore(); s32 rupeeDiff = dLytMeter_c::getRupeeDifference(); if (score != 0) { if (rupeeDiff != 0) { - field_0x3865 = 1; + field_0x3865 = true; } - if (field_0x3865 == 1 && rupeeDiff < score) { + if (field_0x3865 == true && rupeeDiff < score) { mScore.setScore(rupeeDiff); } } @@ -4128,7 +4128,7 @@ void dLytMiniGame_c::fn_80296330() { mTime.startIn(); } - if (isFadingOut() && field_0x3866 == 1) { + if (isFadingOut() && field_0x3866 == true) { mTime.startOut(); } } @@ -4187,23 +4187,23 @@ void dLytMiniGame_c::init() { bool dLytMiniGame_c::loadData(const char *name, s32 slot) { bool loadRequest = false; switch (slot) { - case SLOT_MINI_GAME: loadRequest = field_0x0068; break; - case SLOT_MINI_GAME_SCORE: loadRequest = field_0x0069; break; - case SLOT_MINI_GAME_TIME: loadRequest = field_0x006A; break; - case SLOT_MINI_GAME_BUGS: loadRequest = field_0x006B; break; - case SLOT_MINI_GAME_PUMPKIN: loadRequest = field_0x006C; break; - case SLOT_MINI_GAME_SCORE_SD: loadRequest = field_0x006D; break; + case SLOT_MINI_GAME: loadRequest = mLoadRequestStart; break; + case SLOT_MINI_GAME_SCORE: loadRequest = mLoadRequestScore; break; + case SLOT_MINI_GAME_TIME: loadRequest = mLoadRequestTime; break; + case SLOT_MINI_GAME_BUGS: loadRequest = mLoadRequestBugs; break; + case SLOT_MINI_GAME_PUMPKIN: loadRequest = mLoadRequestPumpkin; break; + case SLOT_MINI_GAME_SCORE_SD: loadRequest = mLoadRequestScoreSd; break; } if (!loadRequest) { LayoutArcManager::GetInstance()->loadLayoutArcFromDisk(name, nullptr); switch (slot) { - case SLOT_MINI_GAME: field_0x0068 = true; break; - case SLOT_MINI_GAME_SCORE: field_0x0069 = true; break; - case SLOT_MINI_GAME_TIME: field_0x006A = true; break; - case SLOT_MINI_GAME_BUGS: field_0x006B = true; break; - case SLOT_MINI_GAME_PUMPKIN: field_0x006C = true; break; - case SLOT_MINI_GAME_SCORE_SD: field_0x006D = true; break; + case SLOT_MINI_GAME: mLoadRequestStart = true; break; + case SLOT_MINI_GAME_SCORE: mLoadRequestScore = true; break; + case SLOT_MINI_GAME_TIME: mLoadRequestTime = true; break; + case SLOT_MINI_GAME_BUGS: mLoadRequestBugs = true; break; + case SLOT_MINI_GAME_PUMPKIN: mLoadRequestPumpkin = true; break; + case SLOT_MINI_GAME_SCORE_SD: mLoadRequestScoreSd = true; break; } return true; } From 17c3ad4bb041a4dc3dc2f464a105327200a9d52f Mon Sep 17 00:00:00 2001 From: robojumper Date: Fri, 5 Dec 2025 12:52:22 +0100 Subject: [PATCH 7/9] Documentation, cleanup --- config/SOUE01/symbols.txt | 34 ++--- include/d/d_message.h | 30 ++-- include/d/lyt/d_lyt_mini_game.h | 71 +++++----- src/REL/d/t/d_t_sword_battle_game.cpp | 6 +- src/d/d_message.cpp | 110 +++++++-------- src/d/lyt/d_lyt_mini_game.cpp | 192 +++++++++++++------------- 6 files changed, 226 insertions(+), 217 deletions(-) diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 271f147c..bbcf250a 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -15437,22 +15437,22 @@ create__14dLytMiniGame_cFv = .text:0x80294830; // type:function size:0xA94 doDelete__14dLytMiniGame_cFv = .text:0x802952D0; // type:function size:0x31C execute__14dLytMiniGame_cFv = .text:0x802955F0; // type:function size:0xD4 draw__14dLytMiniGame_cFv = .text:0x802956D0; // type:function size:0x6C -scoreRelatedExecute__14dLytMiniGame_cFv = .text:0x80295740; // type:function size:0x8C -scoreRelated__14dLytMiniGame_cFv = .text:0x802957D0; // type:function size:0x78 +scoreRelatedInit__14dLytMiniGame_cFv = .text:0x80295740; // type:function size:0x8C +endScoreResult__14dLytMiniGame_cFv = .text:0x802957D0; // type:function size:0x78 setDisplayedPoints__14dLytMiniGame_cFl = .text:0x80295850; // type:function size:0xA8 fn_80295900__14dLytMiniGame_cFl = .text:0x80295900; // type:function size:0x38 startCountdown__14dLytMiniGame_cFv = .text:0x80295940; // type:function size:0x38 startFinish__14dLytMiniGame_cFv = .text:0x80295980; // type:function size:0x98 -fn_80295A20__14dLytMiniGame_cFv = .text:0x80295A20; // type:function size:0x90 +startTimeup__14dLytMiniGame_cFv = .text:0x80295A20; // type:function size:0x90 isStartCountdownDone__14dLytMiniGame_cFv = .text:0x80295AB0; // type:function size:0x20 isFinishAnimDone__14dLytMiniGame_cFv = .text:0x80295AD0; // type:function size:0x20 isTimeupAnimDone__14dLytMiniGame_cFv = .text:0x80295AF0; // type:function size:0x2C -fn_80295B20__14dLytMiniGame_cFl = .text:0x80295B20; // type:function size:0x8 -fn_80295B30__14dLytMiniGame_cFl = .text:0x80295B30; // type:function size:0x8 -timeRelatedExecute__14dLytMiniGame_cFv = .text:0x80295B40; // type:function size:0xA8 -timeRelated__14dLytMiniGame_cFv = .text:0x80295BF0; // type:function size:0x24 +setScoreUp__14dLytMiniGame_cFl = .text:0x80295B20; // type:function size:0x8 +setScoreDown__14dLytMiniGame_cFl = .text:0x80295B30; // type:function size:0x8 +timeRelatedInit__14dLytMiniGame_cFv = .text:0x80295B40; // type:function size:0xA8 +endTimeResult__14dLytMiniGame_cFv = .text:0x80295BF0; // type:function size:0x24 setDisplayedTime__14dLytMiniGame_cFl = .text:0x80295C20; // type:function size:0x4C -setHighscore__14dLytMiniGame_cFl = .text:0x80295C70; // type:function size:0x38 +setBestTime__14dLytMiniGame_cFl = .text:0x80295C70; // type:function size:0x38 setShowBestTime__14dLytMiniGame_cFb = .text:0x80295CB0; // type:function size:0x38 startBugsAllIconsIn__14dLytMiniGame_cFv = .text:0x80295CF0; // type:function size:0x8 set5Bugs__14dLytMiniGame_cFv = .text:0x80295D00; // type:function size:0xC @@ -15471,15 +15471,15 @@ isInEvent__14dLytMiniGame_cCFv = .text:0x80295E10; // type:function size:0x34 isPopupOpen__14dLytMiniGame_cCFv = .text:0x80295E50; // type:function size:0x54 isPopupOpenExceptHelp__14dLytMiniGame_cCFv = .text:0x80295EB0; // type:function size:0x54 isFadingOut__14dLytMiniGame_cCFv = .text:0x80295F10; // type:function size:0x80 -fn_80295F90__14dLytMiniGame_cFv = .text:0x80295F90; // type:function size:0x70 -fn_80296000__14dLytMiniGame_cFv = .text:0x80296000; // type:function size:0x6C -fn_80296070__14dLytMiniGame_cFv = .text:0x80296070; // type:function size:0xE0 -fn_80296150__14dLytMiniGame_cFv = .text:0x80296150; // type:function size:0xB8 -fn_80296210__14dLytMiniGame_cFv = .text:0x80296210; // type:function size:0x88 -fn_802962A0__14dLytMiniGame_cFv = .text:0x802962A0; // type:function size:0x88 -fn_80296330__14dLytMiniGame_cFv = .text:0x80296330; // type:function size:0xA4 -fn_802963E0__14dLytMiniGame_cFv = .text:0x802963E0; // type:function size:0x98 -fn_80296480__14dLytMiniGame_cFv = .text:0x80296480; // type:function size:0x98 +executeBambooCutting__14dLytMiniGame_cFv = .text:0x80295F90; // type:function size:0x70 +executeFunFunIsland__14dLytMiniGame_cFv = .text:0x80296000; // type:function size:0x6C +executeThrillDigger__14dLytMiniGame_cFv = .text:0x80296070; // type:function size:0xE0 +executeInsectCapture__14dLytMiniGame_cFv = .text:0x80296150; // type:function size:0xB8 +executeSpiralChargeTutorial__14dLytMiniGame_cFv = .text:0x80296210; // type:function size:0x88 +executePumpkinArchery__14dLytMiniGame_cFv = .text:0x802962A0; // type:function size:0x88 +executeRollercoaster__14dLytMiniGame_cFv = .text:0x80296330; // type:function size:0xA4 +executeBossRush__14dLytMiniGame_cFv = .text:0x802963E0; // type:function size:0x98 +executeTrialTimeAttack__14dLytMiniGame_cFv = .text:0x80296480; // type:function size:0x98 init__14dLytMiniGame_cFv = .text:0x80296520; // type:function size:0x58 loadData__14dLytMiniGame_cFPCcl = .text:0x80296580; // type:function size:0x130 isLoading__14dLytMiniGame_cCFPCc = .text:0x802966B0; // type:function size:0x30 diff --git a/include/d/d_message.h b/include/d/d_message.h index 2c17253a..1bbf91df 100644 --- a/include/d/d_message.h +++ b/include/d/d_message.h @@ -202,6 +202,20 @@ protected: }; class dMessage_c : public dBase_c { +public: + enum Minigame_e { + MG_THRILL_DIGGER = 0, + MG_BAMBOO_CUTTING, + MG_INSECT_CAPTURE, + MG_ROLLERCOASTER, + MG_PUMPKIN_ARCHERY, + MG_FUN_FUN_ISLAND, + MG_TRIAL_TIME_ATTACK, + MG_BOSS_RUSH, + + MG_NONE, + }; + public: dMessage_c(); virtual ~dMessage_c() { @@ -276,23 +290,23 @@ public: } void setMiniGameVariant(s32 v) { - mMiniGameVariant = v; + mMinigameVariant = v; } s32 getMiniGameVariant() const { - return mMiniGameVariant; + return mMinigameVariant; } void setField_0x344(s32 v) { field_0x344 = v; } - u8 getField_0x340() const { - return field_0x340; + bool hasSetMinigameResult() const { + return mHasSetMinigameResult; } - void setField_0x340(u8 v) { - field_0x340 = v; + void setHasSetMinigameResult(bool v) { + mHasSetMinigameResult = v; } static bool isValidTextLabel(const char *name); @@ -376,8 +390,8 @@ private: /* 0x334 */ u32 mMinigameResultPoints; /* 0x338 */ u32 mMinigameTime; - /* 0x33C */ s32 mMiniGameVariant; - /* 0x340 */ u8 field_0x340; + /* 0x33C */ s32 mMinigameVariant; + /* 0x340 */ bool mHasSetMinigameResult; /* 0x344 */ s32 field_0x344; }; diff --git a/include/d/lyt/d_lyt_mini_game.h b/include/d/lyt/d_lyt_mini_game.h index cf877a76..70172130 100644 --- a/include/d/lyt/d_lyt_mini_game.h +++ b/include/d/lyt/d_lyt_mini_game.h @@ -170,7 +170,7 @@ public: mHighestDigitIndex(0), field_0x7EC(false), field_0x7ED(false), - field_0x7EE(false), + mResultMode(false), mVariant(0), field_0x7F4(0), mIsVisible(false) {} @@ -186,8 +186,8 @@ public: mVariant = var; } - void setField_0x7EE(bool v) { - field_0x7EE = v; + void setResultMode(bool v) { + mResultMode = v; } void fn_8028DD80(); @@ -253,7 +253,7 @@ private: /* 0x7E4 */ s32 mHighestDigitIndex; /* 0x7EC */ bool field_0x7EC; /* 0x7ED */ bool field_0x7ED; - /* 0x7EE */ bool field_0x7EE; + /* 0x7EE */ bool mResultMode; /* 0x7F0 */ s32 mVariant; /* 0x7F4 */ u8 field_0x7F4; /* 0x7F5 */ bool mIsVisible; @@ -332,7 +332,7 @@ public: field_0x810(0), field_0x814(false), field_0x815(false), - field_0x816(false), + mResultMode(false), mVariant(SCORE_VARIANT_BAMBOO_CUTTING), field_0x81C(0), field_0x820(false), @@ -354,8 +354,8 @@ public: mVariant = var; } - void setField_0x816(bool v) { - field_0x816 = v; + void setResultMode(bool v) { + mResultMode = v; } void setField_0x828(bool v) { @@ -447,7 +447,7 @@ private: /* 0x810 */ s32 field_0x810; /* 0x814 */ bool field_0x814; /* 0x815 */ bool field_0x815; - /* 0x816 */ bool field_0x816; + /* 0x816 */ bool mResultMode; /* 0x818 */ s32 mVariant; /* 0x81C */ s32 field_0x81C; /* 0x820 */ bool field_0x820; @@ -515,13 +515,13 @@ public: // These are created by dFlow_c and correspond to above entries. // They also cause things to behave a bit differently. What is the purpose // of these special variants? - VARIANT_10, - VARIANT_11, - VARIANT_12, - VARIANT_13, - VARIANT_14, - VARIANT_15, - VARIANT_16, + VARIANT_BAMBOO_CUTTING_RESULT, + VARIANT_THRILL_DIGGER_RESULT, + VARIANT_INSECT_CAPTURE_RESULT, + VARIANT_PUMPKIN_ARCHERY_RESULT, + VARIANT_ROLLERCOASTER_RESULT, + VARIANT_BOSS_RUSH_RESULT, + VARIANT_TRIAL_TIME_ATTACK_RESULT, }; private: @@ -559,33 +559,28 @@ public: return sInstance; } - /** Updates some window */ void startCountdown(); - /** ??? */ void startFinish(); - void fn_80295A20(); - /** Checks to see if in BAMBOO_CUTTING .. BOSS_RUSH and returns some boolean (start?) */ + void startTimeup(); + bool isStartCountdownDone(); - /** Checks to see if in BAMBOO_CUTTING .. BOSS_RUSH and returns some boolean (end?) */ bool isFinishAnimDone(); bool isTimeupAnimDone(); - void fn_80295B20(s32); - void fn_80295B30(s32); + void setScoreUp(s32 score); + void setScoreDown(s32); - void setHighscore(s32 time); - - /** GUESS: sets the start for the high score? */ + void setBestTime(s32 time); void setShowBestTime(bool); - void timeRelatedExecute(); - void scoreRelatedExecute(); + void timeRelatedInit(); + void scoreRelatedInit(); void setDisplayedTime(s32 time); void setDisplayedPoints(s32 points); - void timeRelated(); - void scoreRelated(); + void endTimeResult(); + void endScoreResult(); void fn_80295900(s32); @@ -622,17 +617,17 @@ private: bool isPopupOpenExceptHelp() const; bool isFadingOut() const; - void fn_80295F90(); - void fn_80296000(); - void fn_80296070(); - void fn_80296150(); - void fn_80296210(); - void fn_802962A0(); - void fn_80296330(); + void executeBambooCutting(); + void executeFunFunIsland(); + void executeThrillDigger(); + void executeInsectCapture(); + void executeSpiralChargeTutorial(); + void executePumpkinArchery(); + void executeRollercoaster(); // These two do the same thing - void fn_802963E0(); - void fn_80296480(); + void executeBossRush(); + void executeTrialTimeAttack(); /* 0x0068 */ bool mLoadRequestStart; /* 0x0069 */ bool mLoadRequestScore; diff --git a/src/REL/d/t/d_t_sword_battle_game.cpp b/src/REL/d/t/d_t_sword_battle_game.cpp index a5555a1c..81a63897 100644 --- a/src/REL/d/t/d_t_sword_battle_game.cpp +++ b/src/REL/d/t/d_t_sword_battle_game.cpp @@ -71,8 +71,8 @@ int dTgSwordBattleGame_c::actorExecuteInEvent() { dLytMiniGame_c::GetInstance()->startCountdown(); } else if (dLytMiniGame_c::GetInstance()->isStartCountdownDone()) { - dLytMiniGame_c::GetInstance()->timeRelatedExecute(); - dLytMiniGame_c::GetInstance()->setHighscore(getBossHighscore()); + dLytMiniGame_c::GetInstance()->timeRelatedInit(); + dLytMiniGame_c::GetInstance()->setBestTime(getBossHighscore()); dLytMiniGame_c::GetInstance()->setShowBestTime(true); mTimer.initUpCounter(); field_0x1A8 = true; @@ -113,7 +113,7 @@ int dTgSwordBattleGame_c::actorExecuteInEvent() { setCurrentBossNumber(mBossNumber + 1); if (MinigameManager::endMinigame(MinigameManager::BOSS_RUSH)) { dLytMiniGame_c::GetInstance()->startFinish(); - dLytMiniGame_c::GetInstance()->timeRelated(); + dLytMiniGame_c::GetInstance()->endTimeResult(); } } } break; diff --git a/src/d/d_message.cpp b/src/d/d_message.cpp index 7a3e7574..ee053763 100644 --- a/src/d/d_message.cpp +++ b/src/d/d_message.cpp @@ -480,17 +480,17 @@ bool dFlow_c::handleEventInternal(const MsbFlowInfo *element) { break; } case EVENT_LYT_MINI_GAME: { - if (dMessage_c::getInstance()->getField_0x340() != 0) { - // cancel something minigame related if running + if (dMessage_c::getInstance()->hasSetMinigameResult()) { + // clear old result clearMinigame(); } - // start something minigame related + // create new result dMessage_c::getInstance()->setMiniGameVariant(params1n2); createLytMiniGame(); break; } case EVENT_LYT_MINI_GAME_END: - // cancel something minigame related + // hide score/time clearMinigame(); break; case EVENT_46: dMessage_c::getInstance()->setField_0x344(params1n2); break; @@ -1193,51 +1193,51 @@ void dFlow_c::clear() { void dFlow_c::createLytMiniGame() { if (dLytMiniGame_c::GetInstance() == nullptr) { switch (dMessage_c::getInstance()->getMiniGameVariant()) { - case 0: + case dMessage_c::MG_THRILL_DIGGER: dBase_c::createBase( - fProfile::LYT_MINI_GAME, dLytControlGame_c::getInstance(), dLytMiniGame_c::VARIANT_11, - fBase_c::OTHER + fProfile::LYT_MINI_GAME, dLytControlGame_c::getInstance(), + dLytMiniGame_c::VARIANT_THRILL_DIGGER_RESULT, fBase_c::OTHER ); break; - case 1: + case dMessage_c::MG_BAMBOO_CUTTING: dBase_c::createBase( - fProfile::LYT_MINI_GAME, dLytControlGame_c::getInstance(), dLytMiniGame_c::VARIANT_10, - fBase_c::OTHER + fProfile::LYT_MINI_GAME, dLytControlGame_c::getInstance(), + dLytMiniGame_c::VARIANT_BAMBOO_CUTTING_RESULT, fBase_c::OTHER ); break; - case 2: + case dMessage_c::MG_INSECT_CAPTURE: dBase_c::createBase( - fProfile::LYT_MINI_GAME, dLytControlGame_c::getInstance(), dLytMiniGame_c::VARIANT_12, - fBase_c::OTHER + fProfile::LYT_MINI_GAME, dLytControlGame_c::getInstance(), + dLytMiniGame_c::VARIANT_INSECT_CAPTURE_RESULT, fBase_c::OTHER ); break; - case 3: + case dMessage_c::MG_ROLLERCOASTER: dBase_c::createBase( - fProfile::LYT_MINI_GAME, dLytControlGame_c::getInstance(), dLytMiniGame_c::VARIANT_14, - fBase_c::OTHER + fProfile::LYT_MINI_GAME, dLytControlGame_c::getInstance(), + dLytMiniGame_c::VARIANT_ROLLERCOASTER_RESULT, fBase_c::OTHER ); break; - case 4: + case dMessage_c::MG_PUMPKIN_ARCHERY: dBase_c::createBase( - fProfile::LYT_MINI_GAME, dLytControlGame_c::getInstance(), dLytMiniGame_c::VARIANT_13, - fBase_c::OTHER + fProfile::LYT_MINI_GAME, dLytControlGame_c::getInstance(), + dLytMiniGame_c::VARIANT_PUMPKIN_ARCHERY_RESULT, fBase_c::OTHER ); break; - case 5: + case dMessage_c::MG_FUN_FUN_ISLAND: dBase_c::createBase( fProfile::LYT_MINI_GAME, dLytControlGame_c::getInstance(), dLytMiniGame_c::VARIANT_FUN_FUN_ISLAND, fBase_c::OTHER ); break; - case 6: + case dMessage_c::MG_TRIAL_TIME_ATTACK: dBase_c::createBase( - fProfile::LYT_MINI_GAME, dLytControlGame_c::getInstance(), dLytMiniGame_c::VARIANT_16, - fBase_c::OTHER + fProfile::LYT_MINI_GAME, dLytControlGame_c::getInstance(), + dLytMiniGame_c::VARIANT_TRIAL_TIME_ATTACK_RESULT, fBase_c::OTHER ); break; - case 7: + case dMessage_c::MG_BOSS_RUSH: dBase_c::createBase( - fProfile::LYT_MINI_GAME, dLytControlGame_c::getInstance(), dLytMiniGame_c::VARIANT_15, + fProfile::LYT_MINI_GAME, dLytControlGame_c::getInstance(), dLytMiniGame_c::VARIANT_BOSS_RUSH_RESULT, fBase_c::OTHER ); break; @@ -1246,28 +1246,28 @@ void dFlow_c::createLytMiniGame() { } void dFlow_c::clearMinigame() { - if (dMessage_c::getInstance()->getField_0x340()) { + if (dMessage_c::getInstance()->hasSetMinigameResult()) { switch (dMessage_c::getInstance()->getMiniGameVariant()) { - case 0: - case 1: - case 4: - case 5: + case dMessage_c::MG_THRILL_DIGGER: + case dMessage_c::MG_BAMBOO_CUTTING: + case dMessage_c::MG_PUMPKIN_ARCHERY: + case dMessage_c::MG_FUN_FUN_ISLAND: if (dLytMiniGame_c::GetInstance() != nullptr) { - dLytMiniGame_c::GetInstance()->scoreRelated(); + dLytMiniGame_c::GetInstance()->endScoreResult(); } break; - case 2: - case 3: - case 6: - case 7: + case dMessage_c::MG_INSECT_CAPTURE: + case dMessage_c::MG_ROLLERCOASTER: + case dMessage_c::MG_TRIAL_TIME_ATTACK: + case dMessage_c::MG_BOSS_RUSH: if (dLytMiniGame_c::GetInstance() != nullptr) { - dLytMiniGame_c::GetInstance()->timeRelated(); + dLytMiniGame_c::GetInstance()->endTimeResult(); } break; } } - dMessage_c::getInstance()->setField_0x340(0); - dMessage_c::getInstance()->setMiniGameVariant(8); + dMessage_c::getInstance()->setHasSetMinigameResult(false); + dMessage_c::getInstance()->setMiniGameVariant(dMessage_c::MG_NONE); } SPECIAL_BASE_PROFILE(MESSAGE, dMessage_c, fProfile::MESSAGE, 0x2A8, 0); @@ -1755,29 +1755,29 @@ void dMessage_c::clearLightPillarRelatedArgs() { } void dMessage_c::executeMinigame() { - if (mMiniGameVariant == 8) { + if (mMinigameVariant == MG_NONE) { return; } - if (!dMessage_c::getInstance()->getField_0x340()) { - switch (mMiniGameVariant) { - case 0: - case 1: - case 4: - case 5: + if (!dMessage_c::getInstance()->hasSetMinigameResult()) { + switch (mMinigameVariant) { + case MG_THRILL_DIGGER: + case MG_BAMBOO_CUTTING: + case MG_PUMPKIN_ARCHERY: + case MG_FUN_FUN_ISLAND: if (dLytMiniGame_c::GetInstance() != nullptr) { - dLytMiniGame_c::GetInstance()->scoreRelatedExecute(); + dLytMiniGame_c::GetInstance()->scoreRelatedInit(); dLytMiniGame_c::GetInstance()->setDisplayedPoints(mMinigameResultPoints); - sInstance->field_0x340 = 1; + sInstance->mHasSetMinigameResult = true; } break; - case 2: - case 3: - case 6: - case 7: + case MG_INSECT_CAPTURE: + case MG_ROLLERCOASTER: + case MG_TRIAL_TIME_ATTACK: + case MG_BOSS_RUSH: if (dLytMiniGame_c::GetInstance() != nullptr) { - dLytMiniGame_c::GetInstance()->timeRelatedExecute(); + dLytMiniGame_c::GetInstance()->timeRelatedInit(); dLytMiniGame_c::GetInstance()->setDisplayedTime(mMinigameTime); - sInstance->field_0x340 = 1; + sInstance->mHasSetMinigameResult = true; } break; } @@ -1796,8 +1796,8 @@ void dMessage_c::init() { void dMessage_c::reset() { init(); - mMiniGameVariant = 8; - field_0x340 = 0; + mMinigameVariant = MG_NONE; + mHasSetMinigameResult = false; mMinigameResultPoints = 0; mMinigameTime = 0; } diff --git a/src/d/lyt/d_lyt_mini_game.cpp b/src/d/lyt/d_lyt_mini_game.cpp index a348099f..c2ad20a9 100644 --- a/src/d/lyt/d_lyt_mini_game.cpp +++ b/src/d/lyt/d_lyt_mini_game.cpp @@ -854,14 +854,14 @@ bool dLytMiniGameTime_c::execute() { if (isAlphaInEndReached()) { stopAlphaIn(); - if (field_0x7EE) { + if (mResultMode) { startLoop(); } } if (isAlphaOutEndReached()) { stopAlphaOut(); - if (field_0x7EE) { + if (mResultMode) { stopLoop(); resetLoop(); } @@ -1919,7 +1919,7 @@ bool dLytMiniGameScore_c::execute() { if (mIsVisible) { fn_80291BC0(); - if (!field_0x816) { + if (!mResultMode) { switch (mVariant) { case SCORE_VARIANT_BAMBOO_CUTTING: if (hasIncreasedScore()) { @@ -1969,14 +1969,14 @@ bool dLytMiniGameScore_c::execute() { if (isAlphaInEndReached()) { stopAlphaIn(); - if (field_0x816) { + if (mResultMode) { startLoop(); } } if (isAlphaOutEndReached()) { stopAlphaOut(); - if (field_0x816) { + if (mResultMode) { stopLoop(); resetLoop(); } @@ -2001,7 +2001,7 @@ bool dLytMiniGameScore_c::execute() { mLyt.calc(); } - if (!field_0x816 && mVariant == SCORE_VARIANT_BAMBOO_CUTTING && hasIncreasedScore()) { + if (!mResultMode && mVariant == SCORE_VARIANT_BAMBOO_CUTTING && hasIncreasedScore()) { dSndSmallEffectMgr_c::GetInstance()->playMinigameScoreUpSound(mScore); } @@ -3381,7 +3381,7 @@ int dLytMiniGame_c::create() { mStart.build(&mResAccStart); break; } - case VARIANT_10: { + case VARIANT_BAMBOO_CUTTING_RESULT: { if (loadData(sMiniGameScore, SLOT_MINI_GAME_SCORE)) { return NOT_READY; } @@ -3390,11 +3390,11 @@ int dLytMiniGame_c::create() { } attachLoadedData(sMiniGameScore, mResAccScore); mScore.setVariant(dLytMiniGameScore_c::SCORE_VARIANT_BAMBOO_CUTTING); - mScore.setField_0x816(true); + mScore.setResultMode(true); mScore.build(&mResAccScore); break; } - case VARIANT_11: { + case VARIANT_THRILL_DIGGER_RESULT: { if (loadData(sMiniGameScore, SLOT_MINI_GAME_SCORE)) { return NOT_READY; } @@ -3403,11 +3403,11 @@ int dLytMiniGame_c::create() { } attachLoadedData(sMiniGameScore, mResAccScore); mScore.setVariant(dLytMiniGameScore_c::SCORE_VARIANT_THRILL_DIGGER); - mScore.setField_0x816(true); + mScore.setResultMode(true); mScore.build(&mResAccScore); break; } - case VARIANT_12: { + case VARIANT_INSECT_CAPTURE_RESULT: { if (loadData(sMiniGameTime, SLOT_MINI_GAME_TIME)) { return NOT_READY; } @@ -3416,11 +3416,11 @@ int dLytMiniGame_c::create() { } attachLoadedData(sMiniGameTime, mResAccTime); mTime.setVariant(dLytMiniGameTime_c::TIME_VARIANT_INSECT_CAPTURE); - mTime.setField_0x7EE(true); + mTime.setResultMode(true); mTime.build(&mResAccTime); break; } - case VARIANT_13: { + case VARIANT_PUMPKIN_ARCHERY_RESULT: { if (loadData(sMiniGameScore, SLOT_MINI_GAME_SCORE)) { return NOT_READY; } @@ -3429,11 +3429,11 @@ int dLytMiniGame_c::create() { } attachLoadedData(sMiniGameScore, mResAccScore); mScore.setVariant(dLytMiniGameScore_c::SCORE_VARIANT_PUMPKIN_ARCHERY); - mScore.setField_0x816(true); + mScore.setResultMode(true); mScore.build(&mResAccScore); break; } - case VARIANT_14: { + case VARIANT_ROLLERCOASTER_RESULT: { if (loadData(sMiniGameTime, SLOT_MINI_GAME_TIME)) { return NOT_READY; } @@ -3442,11 +3442,11 @@ int dLytMiniGame_c::create() { } attachLoadedData(sMiniGameTime, mResAccTime); mTime.setVariant(dLytMiniGameTime_c::TIME_VARIANT_ROLLERCOASTER); - mTime.setField_0x7EE(true); + mTime.setResultMode(true); mTime.build(&mResAccTime); break; } - case VARIANT_15: { + case VARIANT_BOSS_RUSH_RESULT: { if (loadData(sMiniGameTime, SLOT_MINI_GAME_TIME)) { return NOT_READY; } @@ -3455,11 +3455,11 @@ int dLytMiniGame_c::create() { } attachLoadedData(sMiniGameTime, mResAccTime); mTime.setVariant(dLytMiniGameTime_c::TIME_VARIANT_BOSS_RUSH); - mTime.setField_0x7EE(true); + mTime.setResultMode(true); mTime.build(&mResAccTime); break; } - case VARIANT_16: { + case VARIANT_TRIAL_TIME_ATTACK_RESULT: { if (loadData(sMiniGameTime, SLOT_MINI_GAME_TIME)) { return NOT_READY; } @@ -3468,7 +3468,7 @@ int dLytMiniGame_c::create() { } attachLoadedData(sMiniGameTime, mResAccTime); mTime.setVariant(dLytMiniGameTime_c::TIME_VARIANT_TRIAL_TIME_ATTACK); - mTime.setField_0x7EE(true); + mTime.setResultMode(true); mTime.build(&mResAccTime); break; } @@ -3562,37 +3562,37 @@ int dLytMiniGame_c::doDelete() { unloadData(sMiniGameTime); break; } - case VARIANT_10: { + case VARIANT_BAMBOO_CUTTING_RESULT: { mResAccScore.detach(); unloadData(sMiniGameScore); break; } - case VARIANT_11: { + case VARIANT_THRILL_DIGGER_RESULT: { mResAccScore.detach(); unloadData(sMiniGameScore); break; } - case VARIANT_12: { + case VARIANT_INSECT_CAPTURE_RESULT: { mResAccTime.detach(); unloadData(sMiniGameTime); break; } - case VARIANT_13: { + case VARIANT_PUMPKIN_ARCHERY_RESULT: { mResAccScore.detach(); unloadData(sMiniGameScore); break; } - case VARIANT_14: { + case VARIANT_ROLLERCOASTER_RESULT: { mResAccTime.detach(); unloadData(sMiniGameTime); break; } - case VARIANT_15: { + case VARIANT_BOSS_RUSH_RESULT: { mResAccTime.detach(); unloadData(sMiniGameTime); break; } - case VARIANT_16: { + case VARIANT_TRIAL_TIME_ATTACK_RESULT: { mResAccTime.detach(); unloadData(sMiniGameTime); break; @@ -3606,21 +3606,21 @@ int dLytMiniGame_c::doDelete() { int dLytMiniGame_c::execute() { switch (mVariant) { case VARIANT_BAMBOO_CUTTING: - case VARIANT_10: fn_80295F90(); break; - case VARIANT_FUN_FUN_ISLAND: fn_80296000(); break; + case VARIANT_BAMBOO_CUTTING_RESULT: executeBambooCutting(); break; + case VARIANT_FUN_FUN_ISLAND: executeFunFunIsland(); break; case VARIANT_THRILL_DIGGER: - case VARIANT_11: fn_80296070(); break; + case VARIANT_THRILL_DIGGER_RESULT: executeThrillDigger(); break; case VARIANT_INSECT_CAPTURE: - case VARIANT_12: fn_80296150(); break; - case VARIANT_SPIRAL_CHARGE_TUTORIAL: fn_80296210(); break; + case VARIANT_INSECT_CAPTURE_RESULT: executeInsectCapture(); break; + case VARIANT_SPIRAL_CHARGE_TUTORIAL: executeSpiralChargeTutorial(); break; case VARIANT_PUMPKIN_ARCHERY: - case VARIANT_13: fn_802962A0(); break; + case VARIANT_PUMPKIN_ARCHERY_RESULT: executePumpkinArchery(); break; case VARIANT_ROLLERCOASTER: - case VARIANT_14: fn_80296330(); break; + case VARIANT_ROLLERCOASTER_RESULT: executeRollercoaster(); break; case VARIANT_BOSS_RUSH: - case VARIANT_15: fn_802963E0(); break; + case VARIANT_BOSS_RUSH_RESULT: executeBossRush(); break; case VARIANT_TRIAL_TIME_ATTACK: - case VARIANT_16: fn_80296480(); break; + case VARIANT_TRIAL_TIME_ATTACK_RESULT: executeTrialTimeAttack(); break; } mScore.execute(); @@ -3650,7 +3650,7 @@ int dLytMiniGame_c::draw() { return SUCCEEDED; } -void dLytMiniGame_c::scoreRelatedExecute() { +void dLytMiniGame_c::scoreRelatedInit() { switch (mVariant) { case VARIANT_BAMBOO_CUTTING: case VARIANT_THRILL_DIGGER: @@ -3664,13 +3664,13 @@ void dLytMiniGame_c::scoreRelatedExecute() { mScore.setField_0x828(false); } break; - case VARIANT_10: - case VARIANT_11: - case VARIANT_13: mScore.startAlphaIn(); + case VARIANT_BAMBOO_CUTTING_RESULT: + case VARIANT_THRILL_DIGGER_RESULT: + case VARIANT_PUMPKIN_ARCHERY_RESULT: mScore.startAlphaIn(); } } -void dLytMiniGame_c::scoreRelated() { +void dLytMiniGame_c::endScoreResult() { switch (mVariant) { case VARIANT_FUN_FUN_ISLAND: if (fn_80295DB0()) { @@ -3679,9 +3679,9 @@ void dLytMiniGame_c::scoreRelated() { mScore.startOut(); } break; - case VARIANT_10: - case VARIANT_11: - case VARIANT_13: mScore.startAlphaOut(); break; + case VARIANT_BAMBOO_CUTTING_RESULT: + case VARIANT_THRILL_DIGGER_RESULT: + case VARIANT_PUMPKIN_ARCHERY_RESULT: mScore.startAlphaOut(); break; } } @@ -3694,10 +3694,10 @@ void dLytMiniGame_c::setDisplayedPoints(s32 points) { fn_80295DB0(); mScore.setScore(points); break; - case VARIANT_THRILL_DIGGER: mScore.fn_80291D40(points); break; - case VARIANT_10: - case VARIANT_13: mScore.setScore(points); break; - case VARIANT_11: + case VARIANT_THRILL_DIGGER: mScore.fn_80291D40(points); break; + case VARIANT_BAMBOO_CUTTING_RESULT: + case VARIANT_PUMPKIN_ARCHERY_RESULT: mScore.setScore(points); break; + case VARIANT_THRILL_DIGGER_RESULT: mScore.setScore(points); field_0x3864 = true; field_0x3865 = false; @@ -3747,7 +3747,7 @@ void dLytMiniGame_c::startFinish() { } } -void dLytMiniGame_c::fn_80295A20() { +void dLytMiniGame_c::startTimeup() { switch (mVariant) { case VARIANT_BAMBOO_CUTTING: case VARIANT_FUN_FUN_ISLAND: @@ -3815,15 +3815,15 @@ bool dLytMiniGame_c::isTimeupAnimDone() { return false; } -void dLytMiniGame_c::fn_80295B20(s32 score) { +void dLytMiniGame_c::setScoreUp(s32 score) { mScoreSd.setScoreUp(score); } -void dLytMiniGame_c::fn_80295B30(s32 score) { +void dLytMiniGame_c::setScoreDown(s32 score) { mScoreSd.setScoreDown(score); } -void dLytMiniGame_c::timeRelatedExecute() { +void dLytMiniGame_c::timeRelatedInit() { switch (mVariant) { case VARIANT_INSECT_CAPTURE: case VARIANT_PUMPKIN_ARCHERY: @@ -3835,19 +3835,19 @@ void dLytMiniGame_c::timeRelatedExecute() { mTime.fn_8028DD80(); } break; - case VARIANT_12: - case VARIANT_14: - case VARIANT_15: - case VARIANT_16: mTime.startAlphaIn(); break; + case VARIANT_INSECT_CAPTURE_RESULT: + case VARIANT_ROLLERCOASTER_RESULT: + case VARIANT_BOSS_RUSH_RESULT: + case VARIANT_TRIAL_TIME_ATTACK_RESULT: mTime.startAlphaIn(); break; } } -void dLytMiniGame_c::timeRelated() { +void dLytMiniGame_c::endTimeResult() { switch (mVariant) { - case VARIANT_12: - case VARIANT_14: - case VARIANT_15: - case VARIANT_16: mTime.startAlphaOut(); break; + case VARIANT_INSECT_CAPTURE_RESULT: + case VARIANT_ROLLERCOASTER_RESULT: + case VARIANT_BOSS_RUSH_RESULT: + case VARIANT_TRIAL_TIME_ATTACK_RESULT: mTime.startAlphaOut(); break; } } @@ -3856,17 +3856,17 @@ void dLytMiniGame_c::setDisplayedTime(s32 time) { case VARIANT_INSECT_CAPTURE: case VARIANT_ROLLERCOASTER: case VARIANT_BOSS_RUSH: - case VARIANT_TRIAL_TIME_ATTACK: mTime.setTimerValueInMilliSeconds(time); break; - case VARIANT_PUMPKIN_ARCHERY: mTime.setTimerSecondsValueInMilliSeconds(time); break; - case VARIANT_SPIRAL_CHARGE_TUTORIAL: mTime.setTimerSecondsValueInMilliSeconds(time); break; - case VARIANT_12: - case VARIANT_14: - case VARIANT_15: - case VARIANT_16: mTime.setTimerValueInMilliSeconds(time); break; + case VARIANT_TRIAL_TIME_ATTACK: mTime.setTimerValueInMilliSeconds(time); break; + case VARIANT_PUMPKIN_ARCHERY: mTime.setTimerSecondsValueInMilliSeconds(time); break; + case VARIANT_SPIRAL_CHARGE_TUTORIAL: mTime.setTimerSecondsValueInMilliSeconds(time); break; + case VARIANT_INSECT_CAPTURE_RESULT: + case VARIANT_ROLLERCOASTER_RESULT: + case VARIANT_BOSS_RUSH_RESULT: + case VARIANT_TRIAL_TIME_ATTACK_RESULT: mTime.setTimerValueInMilliSeconds(time); break; } } -void dLytMiniGame_c::setHighscore(s32 time) { +void dLytMiniGame_c::setBestTime(s32 time) { switch (mVariant) { case VARIANT_INSECT_CAPTURE: case VARIANT_ROLLERCOASTER: @@ -3874,10 +3874,10 @@ void dLytMiniGame_c::setHighscore(s32 time) { case VARIANT_TRIAL_TIME_ATTACK: // case VARIANT_SPIRAL_CHARGE_TUTORIAL: case VARIANT_PUMPKIN_ARCHERY: - case VARIANT_12: - case VARIANT_14: - case VARIANT_15: - case VARIANT_16: mTime.setBestTime(time); break; + case VARIANT_INSECT_CAPTURE_RESULT: + case VARIANT_ROLLERCOASTER_RESULT: + case VARIANT_BOSS_RUSH_RESULT: + case VARIANT_TRIAL_TIME_ATTACK_RESULT: mTime.setBestTime(time); break; } } @@ -3889,10 +3889,10 @@ void dLytMiniGame_c::setShowBestTime(bool show) { case VARIANT_TRIAL_TIME_ATTACK: // case VARIANT_SPIRAL_CHARGE_TUTORIAL: case VARIANT_PUMPKIN_ARCHERY: - case VARIANT_12: - case VARIANT_14: - case VARIANT_15: - case VARIANT_16: mTime.setShowBestTime(show); break; + case VARIANT_INSECT_CAPTURE_RESULT: + case VARIANT_ROLLERCOASTER_RESULT: + case VARIANT_BOSS_RUSH_RESULT: + case VARIANT_TRIAL_TIME_ATTACK_RESULT: mTime.setShowBestTime(show); break; } } @@ -3933,7 +3933,7 @@ bool dLytMiniGame_c::isBugCollected(s32 slot) const { } void dLytMiniGame_c::fn_80295D80() { - scoreRelatedExecute(); + scoreRelatedInit(); } void dLytMiniGame_c::fn_80295D90(s32 points) { @@ -3948,13 +3948,13 @@ void dLytMiniGame_c::getPumpkin(const mVec3_c &pumpkinPos, s32 unk, bool doubleS bool dLytMiniGame_c::fn_80295DB0() { bool ret = false; switch (mVariant) { - case VARIANT_10: - case VARIANT_11: - case VARIANT_12: - case VARIANT_13: - case VARIANT_14: - case VARIANT_15: - case VARIANT_16: ret = true; break; + case VARIANT_BAMBOO_CUTTING_RESULT: + case VARIANT_THRILL_DIGGER_RESULT: + case VARIANT_INSECT_CAPTURE_RESULT: + case VARIANT_PUMPKIN_ARCHERY_RESULT: + case VARIANT_ROLLERCOASTER_RESULT: + case VARIANT_BOSS_RUSH_RESULT: + case VARIANT_TRIAL_TIME_ATTACK_RESULT: ret = true; break; case VARIANT_FUN_FUN_ISLAND: if (!MinigameManager::GetInstance()->checkInFunFunIsland()) { ret = true; @@ -4001,7 +4001,7 @@ bool dLytMiniGame_c::isFadingOut() const { return ret; } -void dLytMiniGame_c::fn_80295F90() { +void dLytMiniGame_c::executeBambooCutting() { if (fn_80295DB0()) { // nothing } else { @@ -4017,11 +4017,11 @@ void dLytMiniGame_c::fn_80295F90() { } } -void dLytMiniGame_c::fn_80296000() { +void dLytMiniGame_c::executeFunFunIsland() { if (fn_80295DB0()) { - mScore.setField_0x816(true); + mScore.setResultMode(true); } else { - mScore.setField_0x816(false); + mScore.setResultMode(false); if (isPopupOpen()) { mScore.startOutTemp(); } else { @@ -4030,7 +4030,7 @@ void dLytMiniGame_c::fn_80296000() { } } -void dLytMiniGame_c::fn_80296070() { +void dLytMiniGame_c::executeThrillDigger() { if (fn_80295DB0()) { if (field_0x3864 == true) { s32 score = mScore.getScore(); @@ -4058,7 +4058,7 @@ void dLytMiniGame_c::fn_80296070() { } } -void dLytMiniGame_c::fn_80296150() { +void dLytMiniGame_c::executeInsectCapture() { if (fn_80295DB0()) { // nothing } else { @@ -4082,7 +4082,7 @@ void dLytMiniGame_c::fn_80296150() { } } -void dLytMiniGame_c::fn_80296210() { +void dLytMiniGame_c::executeSpiralChargeTutorial() { if (isInEvent() || isPopupOpen()) { mScore.startOutTemp(); mTime.startOutTemp(); @@ -4097,7 +4097,7 @@ void dLytMiniGame_c::fn_80296210() { } } -void dLytMiniGame_c::fn_802962A0() { +void dLytMiniGame_c::executePumpkinArchery() { if (!fn_80295DB0()) { if (isPopupOpen()) { mScore.startOutTemp(); @@ -4114,7 +4114,7 @@ void dLytMiniGame_c::fn_802962A0() { } } -void dLytMiniGame_c::fn_80296330() { +void dLytMiniGame_c::executeRollercoaster() { if (fn_80295DB0()) { // nothing } else { @@ -4135,7 +4135,7 @@ void dLytMiniGame_c::fn_80296330() { } // These two do the same thing -void dLytMiniGame_c::fn_802963E0() { +void dLytMiniGame_c::executeBossRush() { if (fn_80295DB0()) { // nothing } else { @@ -4155,7 +4155,7 @@ void dLytMiniGame_c::fn_802963E0() { } } -void dLytMiniGame_c::fn_80296480() { +void dLytMiniGame_c::executeTrialTimeAttack() { if (fn_80295DB0()) { // nothing } else { From e36bab167b77aed9e56069ad2f0b831f84889ea1 Mon Sep 17 00:00:00 2001 From: robojumper Date: Fri, 5 Dec 2025 15:49:53 +0100 Subject: [PATCH 8/9] One more function name --- config/SOUE01/symbols.txt | 2 +- include/d/lyt/d_lyt_mini_game.h | 2 +- src/d/lyt/d_lyt_mini_game.cpp | 26 ++++++++++++++------------ 3 files changed, 16 insertions(+), 14 deletions(-) diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index bbcf250a..4e1d59e5 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -15466,7 +15466,7 @@ isBugCollected__14dLytMiniGame_cCFl = .text:0x80295D70; // type:function size:0x fn_80295D80__14dLytMiniGame_cFv = .text:0x80295D80; // type:function size:0x4 fn_80295D90__14dLytMiniGame_cFl = .text:0x80295D90; // type:function size:0x4 getPumpkin__14dLytMiniGame_cFRC7mVec3_clb = .text:0x80295DA0; // type:function size:0x8 -fn_80295DB0__14dLytMiniGame_cFv = .text:0x80295DB0; // type:function size:0x60 +isDisplayingResult__14dLytMiniGame_cFv = .text:0x80295DB0; // type:function size:0x60 isInEvent__14dLytMiniGame_cCFv = .text:0x80295E10; // type:function size:0x34 isPopupOpen__14dLytMiniGame_cCFv = .text:0x80295E50; // type:function size:0x54 isPopupOpenExceptHelp__14dLytMiniGame_cCFv = .text:0x80295EB0; // type:function size:0x54 diff --git a/include/d/lyt/d_lyt_mini_game.h b/include/d/lyt/d_lyt_mini_game.h index 70172130..36006a03 100644 --- a/include/d/lyt/d_lyt_mini_game.h +++ b/include/d/lyt/d_lyt_mini_game.h @@ -611,7 +611,7 @@ private: void fn_80295D80(); void fn_80295D90(s32 points); void getPumpkin(const mVec3_c &pumpkinPos, s32 unk, bool doubleScore); - bool fn_80295DB0(); + bool isDisplayingResult(); bool isInEvent() const; bool isPopupOpen() const; bool isPopupOpenExceptHelp() const; diff --git a/src/d/lyt/d_lyt_mini_game.cpp b/src/d/lyt/d_lyt_mini_game.cpp index c2ad20a9..2ebd7250 100644 --- a/src/d/lyt/d_lyt_mini_game.cpp +++ b/src/d/lyt/d_lyt_mini_game.cpp @@ -3657,7 +3657,7 @@ void dLytMiniGame_c::scoreRelatedInit() { case VARIANT_SPIRAL_CHARGE_TUTORIAL: case VARIANT_PUMPKIN_ARCHERY: mScore.fn_80291410(); break; case VARIANT_FUN_FUN_ISLAND: - if (fn_80295DB0()) { + if (isDisplayingResult()) { mScore.startAlphaIn(); } else { mScore.fn_80291410(); @@ -3673,7 +3673,7 @@ void dLytMiniGame_c::scoreRelatedInit() { void dLytMiniGame_c::endScoreResult() { switch (mVariant) { case VARIANT_FUN_FUN_ISLAND: - if (fn_80295DB0()) { + if (isDisplayingResult()) { mScore.startAlphaOut(); } else { mScore.startOut(); @@ -3691,7 +3691,7 @@ void dLytMiniGame_c::setDisplayedPoints(s32 points) { case VARIANT_SPIRAL_CHARGE_TUTORIAL: case VARIANT_PUMPKIN_ARCHERY: mScore.setScore(points); break; case VARIANT_FUN_FUN_ISLAND: - fn_80295DB0(); + isDisplayingResult(); mScore.setScore(points); break; case VARIANT_THRILL_DIGGER: mScore.fn_80291D40(points); break; @@ -3945,7 +3945,7 @@ void dLytMiniGame_c::getPumpkin(const mVec3_c &pumpkinPos, s32 unk, bool doubleS } // cannot be const... -bool dLytMiniGame_c::fn_80295DB0() { +bool dLytMiniGame_c::isDisplayingResult() { bool ret = false; switch (mVariant) { case VARIANT_BAMBOO_CUTTING_RESULT: @@ -4002,7 +4002,7 @@ bool dLytMiniGame_c::isFadingOut() const { } void dLytMiniGame_c::executeBambooCutting() { - if (fn_80295DB0()) { + if (isDisplayingResult()) { // nothing } else { if (isPopupOpen()) { @@ -4018,7 +4018,7 @@ void dLytMiniGame_c::executeBambooCutting() { } void dLytMiniGame_c::executeFunFunIsland() { - if (fn_80295DB0()) { + if (isDisplayingResult()) { mScore.setResultMode(true); } else { mScore.setResultMode(false); @@ -4031,7 +4031,7 @@ void dLytMiniGame_c::executeFunFunIsland() { } void dLytMiniGame_c::executeThrillDigger() { - if (fn_80295DB0()) { + if (isDisplayingResult()) { if (field_0x3864 == true) { s32 score = mScore.getScore(); s32 rupeeDiff = dLytMeter_c::getRupeeDifference(); @@ -4059,7 +4059,7 @@ void dLytMiniGame_c::executeThrillDigger() { } void dLytMiniGame_c::executeInsectCapture() { - if (fn_80295DB0()) { + if (isDisplayingResult()) { // nothing } else { if (isInEvent() || isPopupOpen()) { @@ -4098,7 +4098,9 @@ void dLytMiniGame_c::executeSpiralChargeTutorial() { } void dLytMiniGame_c::executePumpkinArchery() { - if (!fn_80295DB0()) { + if (isDisplayingResult()) { + // nothing + } else { if (isPopupOpen()) { mScore.startOutTemp(); mTime.startOutTemp(); @@ -4115,7 +4117,7 @@ void dLytMiniGame_c::executePumpkinArchery() { } void dLytMiniGame_c::executeRollercoaster() { - if (fn_80295DB0()) { + if (isDisplayingResult()) { // nothing } else { if (isInEvent() || isPopupOpen()) { @@ -4136,7 +4138,7 @@ void dLytMiniGame_c::executeRollercoaster() { // These two do the same thing void dLytMiniGame_c::executeBossRush() { - if (fn_80295DB0()) { + if (isDisplayingResult()) { // nothing } else { if (isInEvent() || isPopupOpen()) { @@ -4156,7 +4158,7 @@ void dLytMiniGame_c::executeBossRush() { } void dLytMiniGame_c::executeTrialTimeAttack() { - if (fn_80295DB0()) { + if (isDisplayingResult()) { // nothing } else { if (isInEvent() || isPopupOpen()) { From d428d4eddf82ab875d80a1c4c07435e3867e9ef5 Mon Sep 17 00:00:00 2001 From: robojumper Date: Mon, 8 Dec 2025 16:25:35 +0100 Subject: [PATCH 9/9] Review --- include/d/lyt/d_lyt_mini_game.h | 4 ++-- include/m/m_vec.h | 4 ---- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/include/d/lyt/d_lyt_mini_game.h b/include/d/lyt/d_lyt_mini_game.h index 36006a03..919b936e 100644 --- a/include/d/lyt/d_lyt_mini_game.h +++ b/include/d/lyt/d_lyt_mini_game.h @@ -250,7 +250,7 @@ private: /* 0x7DC */ s32 mCurrentTimerValueSeconds; /* 0x7E0 */ s32 mLastTimerValueSeconds; /* 0x7E4 */ u8 mTimeFormat; - /* 0x7E4 */ s32 mHighestDigitIndex; + /* 0x7E8 */ s32 mHighestDigitIndex; /* 0x7EC */ bool field_0x7EC; /* 0x7ED */ bool field_0x7ED; /* 0x7EE */ bool mResultMode; @@ -452,7 +452,7 @@ private: /* 0x81C */ s32 field_0x81C; /* 0x820 */ bool field_0x820; /* 0x824 */ s32 field_0x824; - /* 0x829 */ bool field_0x828; + /* 0x828 */ bool field_0x828; /* 0x829 */ bool field_0x829; /* 0x82C */ UNKWORD field_0x82C; /* 0x830 */ s32 field_0x830; diff --git a/include/m/m_vec.h b/include/m/m_vec.h index dedc21f4..212ac47d 100644 --- a/include/m/m_vec.h +++ b/include/m/m_vec.h @@ -318,10 +318,6 @@ public: return mVec2_c(x * f, y * f); } - mVec2_c operator/(f32 f) const { - return mVec2_c(x / f, y / f); - } - mVec2_c operator+(const mVec2_c &v) const { return mVec2_c(x + v.x, y + v.y); }