From ea9db85fde9f1b0059379c45e03cac380e567aad Mon Sep 17 00:00:00 2001 From: emilybrooks Date: Wed, 20 Sep 2023 10:07:50 -0700 Subject: Matched 23 functions in m_scene (#98) * ported over from private branch * trying to find original names * matched small functions * matched func_800C5A08_jp * small changes * matched mSc_bank_regist_check * matched mSc_regist_initial_exchange_bank * more cleanup * cleaned up compile errors * renamed struct * remove save struct * named mSc_set_bank_status_after --- src/code/m_actor.c | 49 +++---- src/code/m_scene.c | 366 +++++++++++++++++++++++++++++++++++++++++++++++++++ src/code/m_submenu.c | 10 +- 3 files changed, 396 insertions(+), 29 deletions(-) create mode 100644 src/code/m_scene.c (limited to 'src/code') diff --git a/src/code/m_actor.c b/src/code/m_actor.c index 9ef1551..382d775 100644 --- a/src/code/m_actor.c +++ b/src/code/m_actor.c @@ -17,7 +17,6 @@ #include "sys_matrix.h" #include "ovlmgr.h" #include "gfx.h" -#include "6E9650.h" #include "unknown_structs.h" #include "code_variables.h" #include "macros.h" @@ -103,11 +102,11 @@ s32 Actor_data_bank_dma_end_check(Actor* actor, Game_Play* game_play) { switch (ACTOR_FGNAME_GET_F000(actor->fgName)) { case FGNAME_F000_D: case FGNAME_F000_E: - var_v1 = common_data.unk_1004C->unk_F4(game_play->unk_0110.unk_0000, actor); + var_v1 = common_data.unk_1004C->unk_F4(game_play->objectExchangeBank.status, actor); break; default: - var_v1 = game_play->unk_0110.unk_0000[actor->unk_026].unk_00 > 0; + var_v1 = game_play->objectExchangeBank.status[actor->unk_026].id > 0; break; } @@ -147,23 +146,23 @@ void Actor_delete(Actor* actor) { void Actor_ct(Actor* actor, Game_Play* game_play) { s32 pad[2] UNUSED; - Game_Play_unk_0110_unk_0000* temp; + ObjectStatus* temp; Npc* npc; CommonData_unk_1004C_unk_14_arg0 sp34; - Game_Play_unk_0110* temp_a0; + ObjectExchangeBank* temp_a0; - temp_a0 = &game_play->unk_0110; + temp_a0 = &game_play->objectExchangeBank; - temp = temp_a0->unk_0000; + temp = temp_a0->status; temp += actor->unk_026; - temp->unk_50++; + temp->unk50++; if (actor->part == ACTOR_PART_NPC) { npc = (Npc*)actor; common_data.unk_1004C->unk_14(&sp34, npc->actor.fgName); - npc->unk_708 = mSc_bank_regist_check(temp_a0->unk_0000, sp34.unk_02); - temp_a0->unk_0000[npc->unk_708].unk_50++; + npc->unk_708 = mSc_bank_regist_check(temp_a0, sp34.unk_02); + temp_a0->status[npc->unk_708].unk50++; } actor->world = actor->home; @@ -193,7 +192,7 @@ void Actor_ct(Actor* actor, Game_Play* game_play) { Shape_Info_init(actor, 0.0f, NULL, 0.0f, 0.0f); if (Actor_data_bank_dma_end_check(actor, game_play) == 1) { - gSegments[6] = (uintptr_t)OS_K0_TO_PHYSICAL(temp_a0->unk_0000[actor->unk_026].segment); + gSegments[6] = (uintptr_t)OS_K0_TO_PHYSICAL(temp_a0->status[actor->unk_026].segment); actor->ct(actor, game_play); actor->ct = NULL; } @@ -201,7 +200,7 @@ void Actor_ct(Actor* actor, Game_Play* game_play) { #ifdef NON_MATCHING void Actor_dt(Actor* actor, Game_Play* game_play) { - Game_Play_unk_0110_unk_0000* temp_v0_6; + ObjectStatus* temp_v0_6; s32 new_var; if (actor->save != NULL) { @@ -222,7 +221,7 @@ void Actor_dt(Actor* actor, Game_Play* game_play) { actor->parent->child = NULL; } - temp_v0_6 = game_play->unk_0110.unk_0000; + temp_v0_6 = game_play->objectExchangeBank.status; if (0) {} switch ((actor->fgName & 0xF000) >> 0xC) { @@ -232,13 +231,13 @@ void Actor_dt(Actor* actor, Game_Play* game_play) { break; default: - new_var = game_play->unk_0110.unk_17FC; + new_var = game_play->objectExchangeBank.num; if (actor->unk_026 >= new_var) { temp_v0_6 = &temp_v0_6[(void)0, actor->unk_026]; - if (temp_v0_6->unk_50 > 0) { + if (temp_v0_6->unk50 > 0) { actor->unk_026 = -1; - temp_v0_6->unk_50--; + temp_v0_6->unk50--; } } break; @@ -272,7 +271,7 @@ void Actor_draw(Game_Play* game_play, Actor* actor) { Matrix_scale(actor->scale.x, actor->scale.y, actor->scale.z, MTXMODE_APPLY); { - void* segment = game_play->unk_0110.unk_0000[(void)0, actor->unk_026].segment; + void* segment = game_play->objectExchangeBank.status[(void)0, actor->unk_026].segment; gSegments[6] = (uintptr_t)OS_PHYSICAL_TO_K0(segment); @@ -452,7 +451,8 @@ void Actor_info_call_actor(Game_Play* game_play, ActorInfo* actorInfo) { if (actor->ct != NULL) { if (Actor_data_bank_dma_end_check(actor, game_play) == 1) { - gSegments[6] = (uintptr_t)OS_K0_TO_PHYSICAL(game_play->unk_0110.unk_0000[actor->unk_026].segment); + gSegments[6] = + (uintptr_t)OS_K0_TO_PHYSICAL(game_play->objectExchangeBank.status[actor->unk_026].segment); game_play->state.unk_9D = 0x98; actor->ct(actor, game_play); @@ -488,7 +488,8 @@ void Actor_info_call_actor(Game_Play* game_play, ActorInfo* actorInfo) { actor->flags &= ~ACTOR_FLAG_1000000; if ((actor->flags & (ACTOR_FLAG_40 | ACTOR_FLAG_10)) || (actor->part == ACTOR_PART_NPC)) { - gSegments[6] = (uintptr_t)OS_K0_TO_PHYSICAL(game_play->unk_0110.unk_0000[actor->unk_026].segment); + gSegments[6] = + (uintptr_t)OS_K0_TO_PHYSICAL(game_play->objectExchangeBank.status[actor->unk_026].segment); game_play->state.unk_9D = 0xA1; actor->update(actor, game_play); game_play->state.unk_9D = 0xA2; @@ -692,8 +693,8 @@ s32 func_80057A8C_jp(s32* arg0, ActorProfile* profile UNUSED, ActorOverlay* over sp90 = sp24.unk_02; } - *arg0 = mSc_bank_regist_check(game_play->unk_0110.unk_0000, sp92); - temp_v0 = mSc_bank_regist_check(game_play->unk_0110.unk_0000, sp90); + *arg0 = mSc_bank_regist_check(&game_play->objectExchangeBank, sp92); + temp_v0 = mSc_bank_regist_check(&game_play->objectExchangeBank, sp90); if ((*arg0 < 0) || (temp_v0 < 0)) { if (*arg0 >= 0) { @@ -702,7 +703,7 @@ s32 func_80057A8C_jp(s32* arg0, ActorProfile* profile UNUSED, ActorOverlay* over if (temp_v0 >= 0) { sp90 = 0; } - common_data.unk_1004C->unk_EC(game_play->unk_0110.unk_0000, sp92, sp90); + common_data.unk_1004C->unk_EC(game_play->objectExchangeBank.status, sp92, sp90); actor_free_check(overlayEntry, fgName); ret = 0; } @@ -713,10 +714,10 @@ s32 func_80057B70_jp(s32* arg0, ActorProfile* profile, ActorOverlay* overlayEntr s32 pad UNUSED; s32 ret = 1; - *arg0 = mSc_bank_regist_check(game_play->unk_0110.unk_0000, profile->objectId); + *arg0 = mSc_bank_regist_check(&game_play->objectExchangeBank, profile->objectId); if (*arg0 == -1) { - func_800C6144_jp(game_play->unk_0110.unk_0000, profile->objectId); + func_800C6144_jp(&game_play->objectExchangeBank, profile->objectId); actor_free_check(overlayEntry, fgName); ret = 0; } diff --git a/src/code/m_scene.c b/src/code/m_scene.c new file mode 100644 index 0000000..87df0c3 --- /dev/null +++ b/src/code/m_scene.c @@ -0,0 +1,366 @@ +#include "unk.h" +#include "libc/stdint.h" +#include "m_scene.h" +#include "m_common_data.h" +#include "TwoHeadArena.h" +#include "m_lib.h" +#include "m_submenu.h" +#include "overlays/gamestates/ovl_play/m_play.h" +#include "game.h" +#include "code_variables.h" +#include "m_object.h" +#include "m_player_lib.h" +#include "z_std_dma.h" + +s32 func_800C59B0_jp(ObjectExchangeBank* objectExchangeBank) { + ObjectStatus* objectStatus = &objectExchangeBank->status[objectExchangeBank->unk17FC]; + s32 ret = -1; + s32 statusIndex = objectExchangeBank->unk17FC; + + if (statusIndex < OBJECT_EXCHANGE_BANK_MAX) { + do { + if (objectStatus->id == 0) { + ret = statusIndex; + break; + } + objectStatus++; + statusIndex++; + } while (statusIndex != OBJECT_EXCHANGE_BANK_MAX); + } + + return ret; +} + +s32 func_800C5A08_jp(ObjectExchangeBank* objectExchangeBank) { + ObjectStatus* objectStatus = &objectExchangeBank->status[objectExchangeBank->unk17FC]; + s32 ret = -1; + s32 statusIndex = objectExchangeBank->unk17FC; + + if (statusIndex < OBJECT_EXCHANGE_BANK_MAX) { + do { + if (objectStatus->unk50 == 0) { + ret = statusIndex; + break; + } + objectStatus++; + statusIndex++; + } while (statusIndex < OBJECT_EXCHANGE_BANK_MAX); + } + + return ret; +} + +s32 func_800C5A60_jp(ObjectExchangeBank* objectExchangeBank) { + s32 temp_v0; + s32 var_v1; + + temp_v0 = func_800C59B0_jp(objectExchangeBank); + var_v1 = temp_v0; + + if (temp_v0 == -1) { + var_v1 = func_800C5A08_jp(objectExchangeBank); + } + + return var_v1; +} + +s32 func_800C5AA0_jp(ObjectStatus* objectStatus, ObjectExchangeBank* objectExchangeBank, s16 objectBankIndex) { + s32 ret = 1; + s32 objectSize = gObjectTable[objectBankIndex].vromEnd - gObjectTable[objectBankIndex].vromStart; + u32 temp_t0 = (objectExchangeBank->unk1800 + objectSize + 0xF) & ~0xF; + + if (temp_t0 >= objectExchangeBank->unk1804) { + ret = 0; + + } else { + objectStatus->id = -objectBankIndex; + objectStatus->unk_08 = objectExchangeBank->unk1800; + objectStatus->segment = 0; + objectStatus->vrom = gObjectTable[objectBankIndex].vromStart; + objectStatus->size = objectSize; + objectStatus->unk50 = 0; + objectStatus->unk53 = 1; + objectExchangeBank->unk1800 = temp_t0; + } + + return ret; +} + +void mSc_set_bank_status_after(ObjectStatus* objectStatus) { + objectStatus->id = (objectStatus->id >= 0) ? objectStatus->id : -objectStatus->id; + objectStatus->unk53 = 0; + objectStatus->segment = (void*)objectStatus->unk_08; +} + +void mSc_clear_bank_status(ObjectStatus* objectStatus) { + objectStatus->id = 0; + objectStatus->size = 0; + objectStatus->unk_08 = 0; + objectStatus->segment = 0; +} + +// object_spawn equivalent +s32 func_800C5B74_jp(ObjectExchangeBank* objectExchangeBank, s16 id) { + s32 ret = 0; + + if (objectExchangeBank->num < OBJECT_EXCHANGE_BANK_MAX) { + ObjectStatus* objectStatus = &objectExchangeBank->status[objectExchangeBank->num]; + + if (func_800C5AA0_jp(objectStatus, objectExchangeBank, id) == 1) { + + DmaMgr_RequestSyncDebug((void*)objectStatus->unk_08, objectStatus->vrom, objectStatus->size, "../m_scene.c", + 317); + mSc_set_bank_status_after(objectStatus); + objectStatus->unk50 = 1; + objectExchangeBank->num++; + ret = 1; + } + } + + return ret; +} + +void Object_Exchange_keep_new_Player(s32 arg0) { + func_800B1784_jp(arg0); + func_800B190C_jp(arg0); + func_800B190C_jp(arg0); + func_800B1960_jp(arg0, 0, 0); + func_800B19C4_jp(arg0, 0, 0); + func_800B1960_jp(arg0, 1, 2); + func_800B19C4_jp(arg0, 1, 2); + func_800B1A28_jp(arg0); + func_800B1A28_jp(arg0); + func_800B1A60_jp(arg0); +} + +u32 mSc_secure_exchange_keep_bank(ObjectExchangeBank* objectExchangeBank, s16 id, s32 size) { + ObjectStatus* objectStatus = &objectExchangeBank->status[objectExchangeBank->num]; + u32 ret = 0; + + if (objectExchangeBank->num < OBJECT_EXCHANGE_BANK_MAX) { + ret = (objectExchangeBank->unk1800 + size + 0xF) & ~0xF; + if (ret >= objectExchangeBank->unk1804) { + ret = 0; + + } else { + objectStatus->id = id; + objectStatus->segment = (void*)objectExchangeBank->unk1800; + objectStatus->unk_08 = objectExchangeBank->unk1800; + objectStatus->vrom = 0; + objectStatus->size = size; + objectStatus->unk50 = 0; + objectStatus->unk53 = 3; + objectExchangeBank->unk1800 = ret; + objectExchangeBank->num++; + } + } + + return ret; +} + +#pragma GLOBAL_ASM("asm/jp/nonmatchings/code/m_scene/func_800C5D68_jp.s") + +void func_800C5E10_jp(ObjectExchangeBank* objectExchangeBank) { + s32 temp_s3 = objectExchangeBank->unk181C; + s32 var_s1 = objectExchangeBank->unk17FC; + ObjectStatus* objectStatus = &objectExchangeBank->status[objectExchangeBank->unk17FC]; + + if (var_s1 < OBJECT_EXCHANGE_BANK_MAX) { + do { + if ((objectStatus->id != 0) && (temp_s3 == objectStatus->unk52)) { + mSc_clear_bank_status(objectStatus); + objectStatus++; + } + var_s1++; + } while (var_s1 < OBJECT_EXCHANGE_BANK_MAX); + } +} + +#pragma GLOBAL_ASM("asm/jp/nonmatchings/code/m_scene/func_800C5EA0_jp.s") + +s32 func_800C5F0C_jp(ObjectStatus* objectStatus, ObjectExchangeBank* objectExchangeBank) { + s32 var_v1 = 1; + u32 temp_v0 = (objectExchangeBank->unk1800 + objectStatus->size + 0xF) & ~0xF; + + if (temp_v0 >= (u32)objectExchangeBank->unk1804) { + var_v1 = 0; + + } else { + objectStatus->unk_08 = objectExchangeBank->unk1800; + objectStatus->unk52 = objectExchangeBank->unk181C; + objectStatus->unk53 = 1; + objectStatus->unk14 = 0; + objectExchangeBank->unk1800 = temp_v0; + } + + return var_v1; +} + +#pragma GLOBAL_ASM("asm/jp/nonmatchings/code/m_scene/mSc_dmacopy_data_bank.s") + +s32 mSc_bank_regist_check(ObjectExchangeBank* objectExchangeBank, s16 id) { + ObjectStatus* objectStatus; + s32 i; + s32 ret = -1; + + for (i = 0; i < OBJECT_EXCHANGE_BANK_MAX; i++) { + objectStatus = &objectExchangeBank->status[i]; + + if (((objectStatus->id >= 0) ? objectStatus->id : -objectStatus->id) == id) { + ret = i; + break; + } + } + + return ret; +} + +s32 func_800C6144_jp(ObjectExchangeBank* objectExchangeBank, s16 arg1) { + s32 temp_v0; + s32 ret = 0; + + temp_v0 = func_800C5A60_jp(objectExchangeBank); + + if (temp_v0 != -1) { + ObjectStatus* temp_a0 = &objectExchangeBank->status[temp_v0]; + + if (func_800C5AA0_jp(temp_a0, objectExchangeBank, arg1) == 1) { + temp_a0->unk14 = 0; + temp_a0->unk52 = objectExchangeBank->unk181C; + ret = 1; + } + } + + return ret; +} + +void mSc_regist_initial_exchange_bank(Game_Play* game_play) { + ObjectExchangeBank* objectExchangeBank = &game_play->objectExchangeBank; + s16* var_s1 = game_play->unk_1EB4; + s32 var_s2; + + objectExchangeBank->unk181C = 0; + var_s2 = 0; + objectExchangeBank->unk17FC = objectExchangeBank->num; + + if (game_play->unk_1EA7 > 0) { + do { + func_800C6144_jp(objectExchangeBank, *var_s1); + var_s2 += 1; + var_s1 += 1; + objectExchangeBank->num += 1; + } while (var_s2 < game_play->unk_1EA7); + } + + if (common_data.unk_10001 == 0) { + //! FAKE + u32 temp = ((u32)(objectExchangeBank->unk1804 - objectExchangeBank->unk1800) >> 1); + s32 temp_v0 = (objectExchangeBank->unk1800 + temp + 0xF) & ~0xF; + + objectExchangeBank->unk1814 = objectExchangeBank->unk1804; + objectExchangeBank->unk1810 = temp_v0; + objectExchangeBank->unk180C = temp_v0; + objectExchangeBank->unk1804 = temp_v0; + temp = objectExchangeBank->unk1800; + objectExchangeBank->unk1808 = temp; + + } else { + objectExchangeBank->unk1808 = objectExchangeBank->unk1800; + objectExchangeBank->unk180C = objectExchangeBank->unk1800; + objectExchangeBank->unk1810 = objectExchangeBank->unk1804; + objectExchangeBank->unk1814 = objectExchangeBank->unk1804; + } + + objectExchangeBank->unk17FC = objectExchangeBank->num; +} + +#pragma GLOBAL_ASM("asm/jp/nonmatchings/code/m_scene/func_800C62C4_jp.s") + +#pragma GLOBAL_ASM("asm/jp/nonmatchings/code/m_scene/mSc_dmacopy_all_exchange_bank.s") + +void mSc_data_bank_ct(Game_Play* game_play, ObjectExchangeBank* objectExchangeBank) { + u32 temp_v0; + u32 temp_v1; + + bzero(objectExchangeBank, 0x1824); + objectExchangeBank->unk17F8 = -1; + objectExchangeBank->unk17FC = -1; + temp_v0 = (u32)THA_alloc16(&game_play->state.heap, 0x93400); + temp_v1 = temp_v0 + 0x93400; + objectExchangeBank->unk1800 = temp_v0; + objectExchangeBank->unk1808 = temp_v0; + objectExchangeBank->unk180C = temp_v0; + objectExchangeBank->unk1804 = temp_v1; + objectExchangeBank->unk1810 = temp_v1; + objectExchangeBank->unk1814 = temp_v1; + func_800C5B74_jp(objectExchangeBank, GAMEPLAY_KEEP); + gSegments[4] = (uintptr_t)OS_PHYSICAL_TO_K0(objectExchangeBank->status[0].segment); +} + +void mSc_decide_exchange_bank(ObjectExchangeBank* objectExchangeBank) { + objectExchangeBank->unk17F8 = objectExchangeBank->num; + objectExchangeBank->unk1818 = (void*)objectExchangeBank->unk1800; +} + +#pragma GLOBAL_ASM("asm/jp/nonmatchings/code/m_scene/func_800C6690_jp.s") + +#pragma GLOBAL_ASM("asm/jp/nonmatchings/code/m_scene/Scene_ct.s") + +#pragma GLOBAL_ASM("asm/jp/nonmatchings/code/m_scene/Scene_Proc_Player_Ptr.s") + +void Scene_Proc_Ctrl_Actor_Ptr(Game_Play* game_play, MSceneUnkStruct* arg1) { + void* temp = arg1->unk4; + + game_play->unk_1EA6 = arg1->unk1; + game_play->unk_1EB0 = Lib_SegmentedToVirtual(temp); +} + +void Scene_Proc_Actor_Ptr(Game_Play* game_play, MSceneUnkStruct* arg1) { + void* temp = arg1->unk4; + + game_play->unk_1EA5 = arg1->unk1; + game_play->unk_1EAC = Lib_SegmentedToVirtual(temp); +} + +void Scene_Proc_Object_Exchange_Bank_Ptr(Game_Play* game_play, MSceneUnkStruct* arg1) { + game_play->unk_1EA7 = arg1->unk1; + game_play->unk_1EB4 = Lib_SegmentedToVirtual(arg1->unk4); +} + +void Scene_Proc_Door_Data_Ptr(Game_Play* game_play, MSceneUnkStruct* arg1) { + UNK_PTR temp = arg1->unk4; + + game_play->unk_1E10 = arg1->unk1; + game_play->unk_1E14 = Lib_SegmentedToVirtual(temp); +} + +void Door_info_ct(s8* arg0) { + *arg0 = 0; +} + +void Scene_Proc_Sound(UNK_TYPE arg0 UNUSED, UNK_TYPE arg1 UNUSED) { +} + +#pragma GLOBAL_ASM("asm/jp/nonmatchings/code/m_scene/func_800C6AE0_jp.s") + +#pragma GLOBAL_ASM("asm/jp/nonmatchings/code/m_scene/func_800C6B50_jp.s") + +#pragma GLOBAL_ASM("asm/jp/nonmatchings/code/m_scene/func_800C6BB0_jp.s") + +#pragma GLOBAL_ASM("asm/jp/nonmatchings/code/m_scene/func_800C6BD4_jp.s") + +#pragma GLOBAL_ASM("asm/jp/nonmatchings/code/m_scene/func_800C6BF8_jp.s") + +#pragma GLOBAL_ASM("asm/jp/nonmatchings/code/m_scene/func_800C6C10_jp.s") + +#pragma GLOBAL_ASM("asm/jp/nonmatchings/code/m_scene/func_800C6D14_jp.s") + +#pragma GLOBAL_ASM("asm/jp/nonmatchings/code/m_scene/func_800C6D5C_jp.s") + +void return_emu_game(Game* game) { + mem_copy(&common_data.unk_10754, &common_data.unk_107A0, 0x14); + common_data.unk_10754 = common_data.unk_107A0 + 1; + game->unk_74 = 0; + game_goto_next_game_play(game); + common_data.unk_00014 = common_data.unk_107A0; +} diff --git a/src/code/m_submenu.c b/src/code/m_submenu.c index b40490c..c466fbc 100644 --- a/src/code/m_submenu.c +++ b/src/code/m_submenu.c @@ -8,7 +8,7 @@ #include "ovlmgr.h" #include "game.h" #include "sys_math3d.h" -#include "6E9650.h" +#include "m_scene.h" #include "6DE300.h" #include "6F5550.h" #include "libc/stddef.h" @@ -60,7 +60,7 @@ s32 SubmenuArea_IsPlayer(void) { #ifdef NON_MATCHING // regalloc void mSM_load_player_anime(Game_Play* game_play) { - Game_Play_unk_0110_unk_0000* var_s4; + ObjectStatus* var_s4; s32 var_s0; s32 var_s3; Player* temp_v0; @@ -71,8 +71,8 @@ void mSM_load_player_anime(Game_Play* game_play) { return; } - var_s4 = game_play->unk_0110.unk_0000; - var_s4 += mSc_bank_regist_check(var_s4, 9); + var_s4 = game_play->objectExchangeBank.status; + var_s4 += mSc_bank_regist_check(&game_play->objectExchangeBank, 9); for (var_s3 = 0; var_s3 < 2; var_s3++, var_s4++) { segment = var_s4->segment; @@ -506,7 +506,7 @@ void mSM_move_End(Submenu* submenu) { sp24 = mMsg_Get_base_window_p(); submenu->unk_00 = 0; - mSc_dmacopy_all_exchange_bank(sp28->unk_0110.unk_0000); + mSc_dmacopy_all_exchange_bank(&sp28->objectExchangeBank); SubmenuArea_DoUnlink(SubmenuArea_dlftbl, submenu); load_player(submenu); mSM_load_player_anime(sp28); -- cgit v1.2.3