diff options
| author | Aetias <144526980+AetiasHax@users.noreply.github.com> | 2025-07-22 15:54:46 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-07-22 15:54:46 +0200 |
| commit | 383ca6aaa2b322869fe304eb5c277150859bfcc0 (patch) | |
| tree | d89df81f15cf8e2d4c3dbad0f115c3f198119ead /src/Main/Game/Game.cpp | |
| parent | aee9c362bbeb9ae717f4b93cbbd5fa0dd9a71450 (diff) | |
Game 99% (#125)
* Game 74%
* Game 99%
* Fix symbol name
Diffstat (limited to 'src/Main/Game/Game.cpp')
| -rw-r--r-- | src/Main/Game/Game.cpp | 178 |
1 files changed, 143 insertions, 35 deletions
diff --git a/src/Main/Game/Game.cpp b/src/Main/Game/Game.cpp index b88ab53d..d702f191 100644 --- a/src/Main/Game/Game.cpp +++ b/src/Main/Game/Game.cpp @@ -7,6 +7,7 @@ #include "DTCM/UnkStruct_027e05f8.hpp" #include "DTCM/UnkStruct_027e077c.hpp" #include "DTCM/UnkStruct_027e080c.hpp" +#include "DTCM/UnkStruct_027e08e4.hpp" #include "DTCM/UnkStruct_027e08f8.hpp" #include "DTCM/UnkStruct_027e08fc.hpp" #include "DTCM/UnkStruct_027e0c38.hpp" @@ -24,25 +25,23 @@ #include "System/Random.hpp" #include "Unknown/UnkStruct_0203dae0.hpp" #include "Unknown/UnkStruct_02063220.hpp" +#include "Unknown/UnkStruct_02068894.hpp" #include "Unknown/UnkStruct_02075dac.hpp" #include "Unknown/UnkStruct_020ec7dc.hpp" #include "Unknown/UnkStruct_020ee734.hpp" +#include "Unknown/UnkStruct_020eec68.hpp" #include "Unknown/UnkStruct_027e0d54.hpp" #include "Unknown/UnkStruct_027e0dbc.hpp" -#define FRAME_COUNTER (*(u32 *) 0x027ffc3c) +#define FRAME_COUNTER (*(vu32 *) 0x027ffc3c) #define REG_POWER_CNT (*(u16 *) 0x04000304) #define REG_DISPCNT_SUB (*(volatile u32 *) 0x04001000) -#define GAME_MODE_DATA(id) ((GameModeData *) (((u8 *) &gGameModes) + ((id) * sizeof(GameModeData)))) - extern unk32 data_02068ed0; extern unk32 data_02068e64; -extern unk32 data_02062d4c; extern unk32 data_020683f4; extern unk32 data_02063e4c; extern unk32 data_02068780; -extern unk32 data_027e08e4; extern bool data_027e0f8c; extern unk32 data_ov009_0211e0c0; extern unk32 data_ov010_0211e960; @@ -154,6 +153,18 @@ const GameModeData gGameModes[] = { }, }; +extern "C" void func_02005a30(u16, u16, u16, u16, u16); +THUMB void Game::func_0202c678() { + mUnk_0fc = mUnk_0fe; + func_02005a30(mUnk_0fc, 31, 0x7fff, 0, 0); +} + +THUMB void Game::func_0202c69c() { + bool bVar1 = (mModeId == GameModeId_Adventure) || (mModeId == GameModeId_Battle); + mUnk_0fe = bVar1 ? 0x7f72 : 0; + this->func_0202c678(); +} + extern "C" void func_ov000_020d6488(unk32 *param0); extern "C" void func_0203d14c(unk32 *param0); extern "C" void func_020355e4(unk32 *param0, unk32 param1); @@ -173,9 +184,23 @@ THUMB void Game::EndGameMode() { return; } +struct SchedulerTask { + /* 0 */ void (*mFunc)(); + /* 4 */ void *mObject; + /* 8 */ SchedulerTask *mNext; + /* c */ +}; + +SchedulerTask data_02062d40; +unk8 data_02062d4c[0xd4]; + +inline const GameModeData *GetGameMode(GameModeId id) { + return &gGameModes[id]; +} + extern "C" void func_0202c0cc(); extern "C" void func_0202c128(unk32 param1, u16 param2); -extern "C" void func_02017cb0(unk32 *param0, unk32 param1); +extern "C" void func_02017cb0(unk8 *param0, unk32 param1); extern "C" void func_02031024(unk32 *param0); extern "C" void Fill16(int value, unsigned short *dst, int size); extern "C" void func_ov000_0207c0f0(unk32 *param0, unk32 param1); @@ -187,6 +212,7 @@ extern "C" void FlushGfxQueue(); extern "C" void func_0200eec8(); extern "C" void func_02005778(); extern "C" void func_02003a54(); +extern "C" void _ZN18UnkStruct_027e05f8C1Ev(UnkStruct_027e05f8 *); THUMB bool Game::StartGameMode() { func_0202c0cc(); @@ -196,18 +222,19 @@ THUMB bool Game::StartGameMode() { mUnk_0fe = uVar3; mUnk_0fc = mUnk_0fe; func_0202c128(1, mUnk_0fc); - func_02017cb0(&data_02062d4c, 0xc); + func_02017cb0(data_02062d4c, 0xc); mUnk_0f0 = 0; mUnk_0f4 = 0; mUnk_101 = 0; - mUnk_103 = GAME_MODE_DATA(mModeId)->mUnk_03; - mUnk_0f2 = GAME_MODE_DATA(mModeId)->mUnk_00; + mUnk_103 = GetGameMode(mModeId)->mUnk_03; + mUnk_0f2 = GetGameMode(mModeId)->mUnk_00; func_02031024(&data_020683f4); data_027e077c.Init(0); Fill16(0, (u16 *) &data_027e0d04, 6); data_027e0c38.func_02033d40(); - data_027e05f8 = UnkStruct_027e05f8(); + // HACK to rerun the constructor + _ZN18UnkStruct_027e05f8C1Ev(&data_027e05f8); if (gOverlayManager.mLoadedOverlays[0] != OverlayId_None) { data_ov000_020ec7dc.func_ov000_0207c0f0(mModeId); gTouchControl.Init(); @@ -230,7 +257,7 @@ THUMB bool Game::StartGameMode() { data_027e0dbc.func_ov000_0207b988(mModeId); } - mMode = GAME_MODE_DATA(mModeId)->mModeCreateFunc(mModeId); + mMode = GetGameMode(mModeId)->mModeCreateFunc(mModeId); mUnk_102 = 0; data_027e0cbc.func_0203d6d0(); @@ -245,8 +272,7 @@ THUMB bool Game::StartGameMode() { } func_02003a54(); - u8 unk1 = GAME_MODE_DATA(mModeId)->mUnk_03; - if (unk1 != 0) { + if (GetGameMode(mModeId)->mUnk_03 != 0) { REG_DISPCNT_SUB |= 0x10000; } else { REG_DISPCNT_SUB &= ~0x10000; @@ -256,18 +282,22 @@ THUMB bool Game::StartGameMode() { return mFadeControl.func_0202abdc(0x20, 0); } -THUMB void Game::func_0202c974() { - this->func_0202cf34(); +THUMB void Game::func_0202c974(Game *game) { + game->func_0202cf34(); } -THUMB void Game::func_0202c97c() {} +extern "C" void func_0200b934(SchedulerTask *param0); +THUMB void Game::func_0202c97c() { + data_02062d40.mFunc = (void (*)()) &Game::func_0202c974; + data_02062d40.mObject = (void *) &gGame; + func_0200b934(&data_02062d40); +} extern "C" void func_0200a440(); extern "C" void func_020310fc(unk32 *param0); extern "C" void func_02025c7c(unk32 *param0); extern "C" void func_020363c8(u16 *param0, UnkStruct_027e0c54 *param1); extern "C" void func_02025d2c(); -extern "C" void func_0202f2ac(unk32 *param0); extern "C" bool func_0202f328(unk32 *param0); ARM void Game::Run() { bool bVar2; @@ -293,7 +323,7 @@ ARM void Game::Run() { } data_027e05f8.func_0202adf4(this->mUnk_0f2, bVar2); data_027e08f8.func_0202f9a0(0); - bVar6 = data_027e080c.mUnk_04 == 3 || data_027e080c.mUnk_10[0].mUnk_00 == 3; + bVar6 = data_027e080c.mUnk_04 == 3 || data_027e080c.mUnk_08 == 3; data_027e080c.func_0202eebc(this->mUnk_0f2); data_027e0d04.func_0203fe00(); data_027e0c38.func_02033d70(bVar2); @@ -320,7 +350,7 @@ ARM void Game::Run() { data_ov000_020ee734.func_ov000_020d64ac(); } } - if (bVar6) { + if (!bVar6) { gFadeController.ProcessFade((u32) this->mUnk_0f2); if ((this->mUnk_101 == 0) && (ov00Loaded)) { data_027e0e2c.func_ov000_0207be84(bVar2); @@ -352,26 +382,42 @@ ARM void Game::Run() { data_027e103c->func_ov005_02103e58(&this->mUnk_0f0); } func_02025d2c(); - bool unk = (this->mUnk_0f2 >= 1); - bVar2 = (s32) (this->mUnk_0f2 - (FRAME_COUNTER - this->mUnk_0f8) - 1) > 0; - if (unk && bVar2) { + u16 uVar5 = this->mUnk_0f2; + bool bVar6 = false; + if (uVar5 > 1) { + u32 frameCounter = FRAME_COUNTER; + u32 unk_0f8 = this->mUnk_0f8; + s32 iVar7 = frameCounter - unk_0f8; + uVar5 = ((s32) (mUnk_0f2 - iVar7 - 1) > 0); + if (uVar5 != 0) { + bVar6 = true; + } + } + if (bVar6) { do { if ((s32) REG_VCOUNT < 0xb0) { break; } } while ((s32) REG_VCOUNT <= 0xc5); - bVar2 = (u32) this->mUnk_0f2 - (FRAME_COUNTER - this->mUnk_0f8); - while ((0 < bVar2 + -1) ? 1 : 0) { - func_0202f2ac(&data_027e08e4); - bVar2 = (u32) this->mUnk_0f2 - (FRAME_COUNTER - this->mUnk_0f8); + u32 frameCounter = FRAME_COUNTER; + u32 unk_0f8 = this->mUnk_0f8; + s32 iVar7 = frameCounter - unk_0f8; + bool bVar3 = (s32) (this->mUnk_0f2 - iVar7 - 1) > 0; + while (bVar3 > 0) { + data_027e08e4.func_0202f2ac(); + + frameCounter = FRAME_COUNTER; + unk_0f8 = this->mUnk_0f8; + iVar7 = frameCounter - unk_0f8; + bVar3 = (s32) (this->mUnk_0f2 - iVar7 - 1) > 0; } } uVar4 = OS_DisableInterrupts_Irq(); - this->mUnk_100 = 1; + this->mUnk_100 = true; GFX_FIFO_SWAP_BUFFERS = 3; OS_RestoreInterrupts(uVar4); - func_0202f2ac(&data_027e08e4); - this->mUnk_100 = 0; + data_027e08e4.func_0202f2ac(); + this->mUnk_100 = false; this->mUnk_0f8 = FRAME_COUNTER; if (gOverlayManager.mLoadedOverlays[0] != -1) { switch (data_027e0d54.mUnk_0f) { @@ -384,8 +430,8 @@ ARM void Game::Run() { } } } while (nextGameMode == 0); - while (func_0202f328(&data_027e08e4)) { - func_0202f2ac(&data_027e08e4); + while (data_027e08e4.func_0202f328()) { + data_027e08e4.func_0202f2ac(); } FlushGfxQueue(); this->EndGameMode(); @@ -395,7 +441,69 @@ ARM void Game::Run() { } while (true); } -THUMB void Game::func_0202cec8(s32 param1, unk32 param2) {} -THUMB void Game::func_0202cf34() {} -ARM void Game::func_0202cf44() {} -ARM Game::~Game() {} +THUMB bool Game::func_0202cec8(s32 param1, bool param2) { + bool result = false; + if (mFadeControl.func_0202abf4(32, 0)) { + mUnk_102 = param2; + if (param1 != 0) { + mFadeControl.mUnk_20 = false; + } else { + mFadeControl.mUnk_20 = true; + } + gFadeController.func_0202d77c(&mFadeControl); + if (gOverlayManager.mLoadedOverlays[0] != OverlayId_None) { + data_ov000_020eec68.func_ov000_020d716c(32); + data_027e0ffc.mUnk_14 = -1; + } + result = true; + } + return result; +} + +THUMB void Game::func_0202cf34() { + if (mMode) { + mMode->vfunc_18(); + } +} + +extern "C" void func_02017cd0(); +ARM void Game::func_0202cf44() { + while (true) { + if (mUnk_100) { + mUnk_0f4 += 1; + while (REG_GFX_RAM_COUNT_2 != 0) { + } + func_02005778(); + func_02017cd0(); + if (mUnk_0fc != mUnk_0fe) { + this->func_0202c678(); + } + if (data_027e080c.func_0202eef8()) { + data_027e08f8.mUnk_1 = true; + } else { + data_027e0c54.func_02036240(&mUnk_0f0); + data_027e0c38.func_02033d84(&mUnk_0f0); + mMode->vfunc_0c(&mUnk_0f0); + gMessageManager.func_02036c50(&mUnk_0f0); + if ((s32) (data_027e080c.mUnk_04 == 3 || data_027e080c.mUnk_08 == 3) == 0) { + gFadeController.SetScreenBrightness(mUnk_103); + } + data_027e0cbc.func_0203d67c(&mUnk_0f0); + if (gOverlayManager.mLoadedOverlays[0] != OverlayId_None) { + data_027e0db0.func_ov000_0207b43c(); + } + if (mModeId == 2) { + data_027e077c.func_ov009_0211653c(); + } + data_02068894.func_0203235c(); + data_02075dac.func_0203f974(); + } + mUnk_100 = false; + } + data_027e08e4.func_0202f2ac(); + } +} + +ARM Game::~Game() { + mFadeControl.Unregister(); +} |
