* Game 74%

* Game 99%

* Fix symbol name
This commit is contained in:
Aetias
2025-07-22 15:54:46 +02:00
committed by GitHub
parent aee9c362bb
commit 383ca6aaa2
31 changed files with 299 additions and 141 deletions
+143 -35
View File
@@ -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();
}
+3 -7
View File
@@ -1,6 +1,7 @@
#include "Message/MessageManager.hpp"
#include "Actor/ActorManager.hpp"
#include "DTCM/UnkStruct_027e0c54.hpp"
#include "DTCM/UnkStruct_027e0ffc.hpp"
#include "Game/Game.hpp"
#include "Player/TouchControl.hpp"
#include "System/SysNew.hpp"
@@ -15,11 +16,6 @@ extern UnkStruct_MsgProc_Base_unk_2C *data_02068e8c;
extern u16 data_02056918[];
extern ActorTypeId data_0205691c[];
struct UnkStruct_027e0ffc {
void func_ov000_020cec60(u16, Vec3p *, Actor *, unk32);
};
extern UnkStruct_027e0ffc *data_027e0ffc;
// non-matching
ARM void MessageManager::func_0203643c(u32 *param_1, MessageManager *param_2, u32 param_3) {
BMGGroups *pBVar2 = param_2->pGroups;
@@ -327,7 +323,7 @@ ARM void MessageManager::func_0203690c(unk32 param_2) {
pActor = gActorManager->GetActor(&actorRef);
if (pActor != NULL) {
data_027e0ffc->func_ov000_020cec60(data_02056918[this->mUnk_10], &pActor->mPos, pActor, 0);
data_027e0ffc.func_ov000_020cec60(data_02056918[this->mUnk_10], &pActor->mPos, pActor, 0);
}
}
}
@@ -354,7 +350,7 @@ ARM void MessageManager::func_02036bbc(void) {
}
}
ARM void MessageManager::func_02036c50(unk32 param_2) {
ARM void MessageManager::func_02036c50(u16 *param_2) {
s32 i;
for (i = 0; i < ARRAY_LEN(this->mUnk_28); i++) {
+1 -1
View File
@@ -53,7 +53,7 @@ THUMB void MsgProc_Type2::func_0203c39c(unk32 param_2, unk32 param_3) {
}
}
ARM void MsgProc_Type2::vfunc_3C(unk32 param_2) {
ARM void MsgProc_Type2::vfunc_3C(u16 *param_2) {
if (this->mUnk_15c > 0 && this->mUnk_122 != 1) {
if (this->func_0203de14(param_2) != 0) {
this->vfunc_40(0, 0);
+3 -2
View File
@@ -7,6 +7,7 @@
#include "Message/MsgProc.hpp"
#include "Player/TouchControl.hpp"
#include "Save/AdventureFlags.hpp"
#include "Unknown/UnkStruct_02068894.hpp"
extern "C" void func_ov000_020d0460(void *);
extern "C" void func_0203efd8(void *, void *);
@@ -174,7 +175,7 @@ ARM void UnkStruct_020397f8::func_02039ca8() {
}
}
ARM void UnkStruct_020397f8::vfunc_3c(unk32 param1) {
ARM void UnkStruct_020397f8::vfunc_3c(u16 *param1) {
if (this->mUnk_15c > 0 && this->func_0203de14(param1) != 0) {
if (this->mUnk_124->mUnk_29 != 3) {
if ((this->mUnk_50 == 0) && func_ov000_02079e04() != 0) {
@@ -814,7 +815,7 @@ ARM void UnkStruct_020397f8::vfunc_60(func_0203b410_param1 *param1, unk32 param2
if (this->mUnk_15e == 7) {
uVar5 = func_0202d5b4(data_02057f08, data_02057eec, data_020691a0, 0xCC00, 1);
func_02032304(data_02068894, data_02057ed8, data_02056af0, 1, param3);
data_02068894.func_02032304(data_02057ed8, data_02056af0, 1, param3);
iVar3 = func_02016fcc(uVar5);
} else {
if (this->func_02032fa4() != 0) {