summaryrefslogtreecommitdiff
path: root/src/Main/Game/Game.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/Main/Game/Game.cpp')
-rw-r--r--src/Main/Game/Game.cpp260
1 files changed, 251 insertions, 9 deletions
diff --git a/src/Main/Game/Game.cpp b/src/Main/Game/Game.cpp
index ceabb272..9e741291 100644
--- a/src/Main/Game/Game.cpp
+++ b/src/Main/Game/Game.cpp
@@ -1,11 +1,253 @@
#include "Game/Game.hpp"
+#include "DTCM/UnkStruct_027e05f8.hpp"
+#include "DTCM/UnkStruct_027e077c.hpp"
+#include "DTCM/UnkStruct_027e0e2c.hpp"
+#include "DTCM/UnkStruct_027e0ffc.hpp"
+#include "Game/GameModeAdventure.hpp"
+#include "Game/GameModeBattle.hpp"
+#include "Message/MessageManager.hpp"
+#include "Message/MsgProc.hpp"
+#include "Player/TouchControl.hpp"
+#include "Render/FadeController.hpp"
+#include "System/OverlayManager.hpp"
+#include "Unknown/UnkStruct_0203dae0.hpp"
+#include "Unknown/UnkStruct_02075dac.hpp"
+#include "Unknown/UnkStruct_020ee734.hpp"
-void Game::EndGameMode() {}
-void Game::StartGameMode() {}
-void Game::func_0202c974() {}
-void Game::func_0202c97c() {}
-void Game::Run() {}
-void Game::func_0202cec8(s32 param1, unk32 param2) {}
-void Game::func_0202cf34() {}
-void Game::func_0202cf44() {}
-Game::~Game() {}
+#define FRAME_COUNTER (*(u32 *) 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_027e0dbc;
+extern unk32 data_02068ed0;
+extern unk32 data_02068e64;
+extern unk32 data_02062d4c;
+extern unk32 data_020683f4;
+extern unk32 data_ov000_020ec7dc;
+extern unk32 data_027e0d54;
+extern bool data_027e0f8c;
+extern unk32 data_ov009_0211e0c0;
+extern unk32 data_ov010_0211e960;
+extern unk32 data_ov007_02102920;
+extern unk32 data_ov012_02134ea0;
+extern unk32 data_ov013_021160b4;
+
+extern "C" GameMode *func_ov008_02112c20(GameModeId modeId);
+extern "C" GameMode *func_ov010_02112c20(GameModeId modeId);
+extern "C" GameMode *func_ov011_0212b934(GameModeId modeId);
+extern "C" GameMode *func_ov007_02100ae0(GameModeId modeId);
+extern "C" GameMode *func_ov013_02114f78(GameModeId modeId);
+const GameModeData gGameModes[] = {
+ {
+ .mUnk_00 = 1,
+ .mUnk_01 = 0,
+ .mUnk_02 = 0,
+ .mUnk_03 = 0,
+ .slot1Overlay = OverlayId_None,
+ .slot2Overlay = OverlayId_None,
+ .slot3Overlay = OverlayId_None,
+ .slot12Overlay = OverlayId_None,
+ .mModeCreateFunc = (GameModeCreateFunc) NULL,
+ .mUnk_18 = NULL,
+ },
+ {
+ .mUnk_00 = 1,
+ .mUnk_01 = 0,
+ .mUnk_02 = 0,
+ .mUnk_03 = 1,
+ .slot1Overlay = OverlayId_01,
+ .slot2Overlay = OverlayId_None,
+ .slot3Overlay = OverlayId_GameStart,
+ .slot12Overlay = OverlayId_None,
+ .mModeCreateFunc = (GameModeCreateFunc) func_ov008_02112c20,
+ .mUnk_18 = NULL,
+ },
+ {
+ .mUnk_00 = 2,
+ .mUnk_01 = 0,
+ .mUnk_02 = 1,
+ .mUnk_03 = 1,
+ .slot1Overlay = OverlayId_03,
+ .slot2Overlay = OverlayId_Load,
+ .slot3Overlay = OverlayId_Adventure,
+ .slot12Overlay = OverlayId_None,
+ .mModeCreateFunc = (GameModeCreateFunc) GameModeAdventure::Create,
+ .mUnk_18 = &data_ov009_0211e0c0,
+ },
+ {
+ .mUnk_00 = 1,
+ .mUnk_01 = 0,
+ .mUnk_02 = 0,
+ .mUnk_03 = 1,
+ .slot1Overlay = OverlayId_01,
+ .slot2Overlay = OverlayId_06,
+ .slot3Overlay = OverlayId_FileSelect,
+ .slot12Overlay = OverlayId_None,
+ .mModeCreateFunc = (GameModeCreateFunc) func_ov010_02112c20,
+ .mUnk_18 = &data_ov010_0211e960,
+ },
+ {
+ .mUnk_00 = 1,
+ .mUnk_01 = 0,
+ .mUnk_02 = 0,
+ .mUnk_03 = 1,
+ .slot1Overlay = OverlayId_01,
+ .slot2Overlay = OverlayId_None,
+ .slot3Overlay = OverlayId_DwcSetup,
+ .slot12Overlay = OverlayId_61,
+ .mModeCreateFunc = (GameModeCreateFunc) func_ov011_0212b934,
+ .mUnk_18 = NULL,
+ },
+ {
+ .mUnk_00 = 1,
+ .mUnk_01 = 0,
+ .mUnk_02 = 0,
+ .mUnk_03 = 1,
+ .slot1Overlay = OverlayId_01,
+ .slot2Overlay = OverlayId_DownloadPlay,
+ .slot3Overlay = OverlayId_None,
+ .slot12Overlay = OverlayId_None,
+ .mModeCreateFunc = (GameModeCreateFunc) func_ov007_02100ae0,
+ .mUnk_18 = &data_ov007_02102920,
+ },
+ {
+ .mUnk_00 = 1,
+ .mUnk_01 = 0,
+ .mUnk_02 = 0,
+ .mUnk_03 = 1,
+ .slot1Overlay = OverlayId_01,
+ .slot2Overlay = OverlayId_Load,
+ .slot3Overlay = OverlayId_Battle,
+ .slot12Overlay = OverlayId_60,
+ .mModeCreateFunc = (GameModeCreateFunc) GameModeBattle::Create,
+ .mUnk_18 = &data_ov012_02134ea0,
+ },
+ {
+ .mUnk_00 = 1,
+ .mUnk_01 = 0,
+ .mUnk_02 = 0,
+ .mUnk_03 = 1,
+ .slot1Overlay = OverlayId_01,
+ .slot2Overlay = OverlayId_None,
+ .slot3Overlay = OverlayId_Contact,
+ .slot12Overlay = OverlayId_None,
+ .mModeCreateFunc = (GameModeCreateFunc) func_ov013_02114f78,
+ .mUnk_18 = &data_ov013_021160b4,
+ },
+};
+
+extern "C" void func_ov000_0207b9c8(unk32 *param0);
+extern "C" void func_ov000_020d6488(unk32 *param0);
+extern "C" void func_0203d14c(unk32 *param0);
+extern "C" void func_020355e4(unk32 *param0, unk32 param1);
+extern "C" void func_02036050(u8 *param0);
+THUMB void Game::EndGameMode() {
+ delete mMode;
+ mMode = NULL;
+ if (gOverlayManager.mLoadedOverlays[0] != -1) {
+ func_ov000_0207b9c8(&data_027e0dbc);
+ data_ov000_020ee734.func_ov000_020d6488();
+ }
+ gMessageManager.func_0203665c();
+ data_027e0cbc.func_0203d5c0();
+ func_0203d14c(&data_02068ed0);
+ func_020355e4(&data_02068e64, 2);
+ func_02036050(&data_027e0c54);
+ gOverlayManager.UnloadGameMode();
+ return;
+}
+
+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_02031024(unk32 *param0);
+extern "C" void Fill16(unk16 value, void *dest, s32 count);
+extern "C" void func_02033d40(unk32 (*param0)[]);
+extern "C" void func_ov000_0207c0f0(unk32 *param0, unk32 param1);
+extern "C" void func_ov000_0207a2e8(unk32 *param0, unk32 param1);
+extern "C" void func_02036014(u8 *param0, unk32 param1);
+extern "C" void func_02035604(unk32 *param0, unk32 param1);
+extern "C" void func_0203d0c0(unk32 *param0, unk32 param1);
+extern "C" void func_ov000_0207b988(unk32 *param0, GameModeId modeId);
+extern "C" void FlushGfxQueue();
+extern "C" void func_0200eec8();
+extern "C" void func_02005778();
+extern "C" void func_02003a54();
+THUMB bool Game::StartGameMode() {
+ func_0202c0cc();
+
+ bool bVar1 = (mModeId == 2) || (mModeId == 6);
+ unk16 uVar3 = bVar1 ? 0x7f72 : 0;
+
+ mUnk_0fe = uVar3;
+ mUnk_0fc = mUnk_0fe;
+ func_0202c128(1, mUnk_0fc);
+ 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;
+
+ func_02031024(&data_020683f4);
+ data_027e077c.Init(0);
+ Fill16(0, &data_027e0d04, 6);
+ func_02033d40(&data_027e0c38);
+ data_027e05f8.Init();
+ if (gOverlayManager.mLoadedOverlays[0] != OverlayId_None) {
+ func_ov000_0207c0f0(&data_ov000_020ec7dc, mModeId);
+ gTouchControl.Init();
+ data_027e0e2c.func_ov000_0207bcb4();
+ data_027e0db0.func_ov000_0207b288(mModeId);
+ func_ov000_0207a2e8(&data_027e0d54, mModeId);
+ data_027e0ffc.func_ov000_020ce704();
+ data_027e0f8c = false;
+ }
+
+ gOverlayManager.LoadGameMode(mModeId);
+ func_02036014(&data_027e0c54, mModeId);
+ func_02035604(&data_02068e64, mModeId);
+ func_0203d0c0(&data_02068ed0, mModeId);
+ data_02075dac.func_0203f904();
+ data_027e0cbc.func_0203d57c();
+ gMessageManager.func_02036490();
+ if (gOverlayManager.mLoadedOverlays[0] != OverlayId_None) {
+ data_ov000_020ee734.func_ov000_020d6438(mModeId);
+ func_ov000_0207b988(&data_027e0dbc, mModeId);
+ }
+
+ mMode = GAME_MODE_DATA(mModeId)->mModeCreateFunc(mModeId);
+ mUnk_102 = 0;
+
+ data_027e0cbc.func_0203d6d0();
+ FlushGfxQueue();
+ func_0200eec8();
+
+ mUnk_0f8 = FRAME_COUNTER;
+ func_02005778();
+ bVar1 = (mModeId == 2) || (mModeId == 6);
+ if (!bVar1) {
+ REG_POWER_CNT |= 0x8000;
+ }
+
+ func_02003a54();
+ u8 unk1 = GAME_MODE_DATA(mModeId)->mUnk_03;
+ if (unk1 != 0) {
+ REG_DISPCNT_SUB |= 0x10000;
+ } else {
+ REG_DISPCNT_SUB &= ~0x10000;
+ }
+
+ gFadeController.func_0202d77c(&mFadeControl);
+ return mFadeControl.func_0202abdc(0x20, 0);
+}
+
+THUMB void Game::func_0202c974() {}
+THUMB void Game::func_0202c97c() {}
+ARM void Game::Run() {}
+THUMB void Game::func_0202cec8(s32 param1, unk32 param2) {}
+THUMB void Game::func_0202cf34() {}
+ARM void Game::func_0202cf44() {}
+ARM Game::~Game() {}