From fce490d951900c593f25329cdfef0f47263d5e43 Mon Sep 17 00:00:00 2001 From: Prakxo <87568477+Prakxo@users.noreply.github.com> Date: Wed, 10 Apr 2024 03:57:33 +0200 Subject: m_scene OK (#165) --- include/6E30B0.h | 5 +- include/m_clip.h | 96 ++++- include/m_common_data.h | 21 +- include/m_field_make.h | 2 +- include/m_player_lib.h | 14 +- include/m_scene.h | 134 ++++-- include/m_scene_table.h | 11 +- include/m_submenu.h | 2 +- include/unknown_structs.h | 7 - linker_scripts/jp/symbol_addrs_code.txt | 28 +- linker_scripts/jp/symbol_addrs_overlays.txt | 2 +- src/code/m_scene.c | 587 +++++++++++++++++++++----- src/overlays/actors/ovl_Tools/ac_tools.c | 2 +- src/overlays/actors/ovl_Weather/ac_weather.h | 2 +- src/overlays/gamestates/ovl_play/m_play.c | 16 +- src/overlays/gamestates/ovl_play/m_play.h | 6 +- src/overlays/gamestates/ovl_select/m_select.c | 2 +- yamls/jp/code.yaml | 2 +- 18 files changed, 730 insertions(+), 209 deletions(-) diff --git a/include/6E30B0.h b/include/6E30B0.h index e08b2b8..62b8c17 100644 --- a/include/6E30B0.h +++ b/include/6E30B0.h @@ -4,12 +4,13 @@ #include "ultra64.h" struct Game; +struct Game_Play; // void func_800BF410_jp(); // void func_800BF480_jp(); -// void func_800BF4F4_jp(); +void mScn_ObtainCarpetBank(struct Game_Play*); // void func_800BF56C_jp(); -// void func_800BF580_jp(); +void mScn_ObtainMyRoomBank(struct Game_Play*); // void func_800BF5A0_jp(); // void func_800BF5F4_jp(); // void func_800BF770_jp(); diff --git a/include/m_clip.h b/include/m_clip.h index f58b2ba..f5c3a3b 100644 --- a/include/m_clip.h +++ b/include/m_clip.h @@ -16,6 +16,7 @@ struct ToolClip; struct ShadowData; struct FurnitureActor; struct WeatherClip; +struct ObjectExchangeBank; typedef UNK_RET (*Clip_unk_040_unk_04)(struct ActorOverlay*, const struct struct_801161E8_jp*, size_t, s32); typedef UNK_RET (*Clip_unk_040_unk_08)(void); @@ -29,6 +30,7 @@ typedef UNK_RET (*Clip_unk_040_unk_C8)(struct Actor*, struct Game_Play*); typedef UNK_RET (*Clip_unk_040_unk_CC)(struct Actor*, struct Game_Play*); typedef UNK_RET (*Clip_unk_040_unk_D0)(void); typedef UNK_RET (*Clip_unk_040_unk_E4)(void); +typedef UNK_RET (*Clip_unk_040_unk_E8)(void); typedef UNK_RET (*Clip_unk_040_unk_EC)(struct ObjectStatus*, s16, s16); typedef UNK_RET (*Clip_unk_040_unk_F0)(struct ObjectStatus*, struct Actor*); typedef s32 (*Clip_unk_040_unk_F4)(struct ObjectStatus*, struct Actor*); @@ -50,7 +52,7 @@ typedef struct Clip_unk_040 { /* 0x0D0 */ Clip_unk_040_unk_D0 unk_D0; /* 0x0D4 */ UNK_TYPE1 unk_D4[0x10]; /* 0x0E4 */ Clip_unk_040_unk_E4 unk_E4; - /* 0x0E8 */ UNK_TYPE1 unk_E8[0x4]; + /* 0x0E8 */ Clip_unk_040_unk_E8 unk_E8; /* 0x0EC */ Clip_unk_040_unk_EC unk_EC; /* 0x0F0 */ Clip_unk_040_unk_F0 unk_F0; /* 0x0F4 */ Clip_unk_040_unk_F4 unk_F4; @@ -58,6 +60,14 @@ typedef struct Clip_unk_040 { /* 0x118 */ Clip_unk_040_unk_118 unk_118; } Clip_unk_040; // size >= 0x11C +typedef UNK_RET (*Clip_unk_060_unk_04)(void); +typedef struct Clip_unk_060 { + /* 0x0 */ UNK_TYPE1 unk_0[0x4]; + /* 0x4 */ Clip_unk_060_unk_04 unk_4; +} Clip_unk_060; // size >= 0x4 + +typedef UNK_RET (*Clip_unk_068)(void); + typedef UNK_RET (*Clip_unk_06C_unk_00)(UNK_TYPE); typedef UNK_RET (*Clip_unk_06C_unk_04)(UNK_TYPE); typedef UNK_RET (*Clip_unk_06C_unk_08)(UNK_TYPE); @@ -68,6 +78,12 @@ typedef struct Clip_unk_078 { /* 0x08 */ Clip_unk_06C_unk_08 unk_08; } Clip_unk_06C; // size >= 0xC +typedef s32 (*Clip_unk_070_unk_0C)(void); +typedef struct Clip_unk_070 { + /* 0x00 */ UNK_TYPE1 unk_0[0xC]; + /* 0x04 */ Clip_unk_070_unk_0C unk_C; +} Clip_unk_070; // size >= 0x10 + typedef UNK_RET (*Clip_unk_074_unk_00)(UNK_TYPE); typedef void (*Clip_unk_074_unk_04)(struct Game_Play* game_play, struct ShadowData* shadowData, s16 unk2); @@ -76,10 +92,18 @@ typedef struct Clip_unk_074 { /* 0x04 */ Clip_unk_074_unk_04 unk_04; } Clip_unk_074; // size >= 0x8 +typedef void (*Clip_unk_07C_unk_4)(struct ObjectExchangeBank*); +typedef struct Clip_unk_07C { + /* 0x00 */ s8 unk_0[0x4]; + /* 0x04 */ Clip_unk_07C_unk_4 unk_4; +} Clip_unk_07C; // size >= 0x8 +typedef void (*Clip_unk_080_unk_24)(void); typedef UNK_RET (*Clip_unk_080_unk_34)(struct FurnitureActor* furnitureActor, struct Actor* myHouseActor, struct Game_Play* game_play, f32 arg0, f32 arg1); typedef struct Clip_unk_080 { - /* 0x00 */ UNK_TYPE1 unk_00[0x34]; + /* 0x00 */ UNK_TYPE1 unk_00[0x24]; + /* 0x24 */ Clip_unk_080_unk_24 unk_24; + /* 0x28 */ UNK_TYPE1 unk_28[0xC]; /* 0x34 */ Clip_unk_080_unk_34 unk_34; // open close proc } Clip_unk_080; // size >= 0x8 @@ -87,6 +111,7 @@ typedef UNK_RET (*Clip_unk_08C_unk_4)(struct ActorOverlay*, size_t); typedef UNK_RET (*Clip_unk_08C_unk_8)(void); typedef UNK_PTR (*Clip_unk_08C_unk_0C)(void); typedef UNK_RET (*Clip_unk_08C_unk_10)(struct Actor*); +typedef void (*Clip_unk_08C_unk_A4)(struct ObjectExchangeBank*); typedef UNK_RET (*Clip_unk_08C_unk_A8)(UNK_PTR, UNK_TYPE, u16 name, struct Actor* actor); typedef UNK_RET (*Clip_unk_08C_unk_AC)(u16); typedef UNK_RET (*Clip_unk_08C_unk_450)(u16); @@ -97,7 +122,8 @@ typedef struct Clip_unk_08C { /* 0x08 */ Clip_unk_08C_unk_8 unk_08; /* 0x0C */ Clip_unk_08C_unk_0C unk_0C; /* 0x10 */ Clip_unk_08C_unk_10 unk_10; - /* 0x014 */ UNK_TYPE1 unk_14[0x94]; + /* 0x014 */ UNK_TYPE1 unk_14[0x90]; + /* 0x0A4 */ Clip_unk_08C_unk_A4 unk_A4; /* 0x0A8 */ Clip_unk_08C_unk_A8 unk_A8; // unload object /* 0x0AC */ Clip_unk_08C_unk_AC unk_AC; // load object /* 0x0B0 */ UNK_TYPE unk_B0; @@ -114,6 +140,39 @@ typedef struct Clip_unk_090 { /* 0x30 */ Clip_unk_090_unk_30 unk_30; } Clip_unk_090; // size >= 0x34 +typedef void (*Clip_unk_09C_unk_C)(void); +typedef struct Clip_unk_09C { + /* 0x00 */ UNK_TYPE1 unk_00[0xC]; + /* 0x0C */ Clip_unk_09C_unk_C unk_C; +} Clip_unk_09C; // size >= 0x10 + +typedef void (*Clip_unk_0A4_unk_4)(void); + +typedef struct Clip_unk_0A4 { + /* 0x00 */ UNK_TYPE1 unk_00[0x04]; + /* 0x04 */ Clip_unk_0A4_unk_4 unk_4; +} Clip_unk_0A4; + +typedef UNK_RET (*Clip_unk_0A8_unk_4)(void*); +typedef struct Clip_unk_0A8 { + /* 0x00 */ UNK_TYPE1 unk_00[0x04]; + /* 0x04 */ Clip_unk_0A8_unk_4 unk_4; +} Clip_unk_0A8; // size >= 0x8 + +typedef void (*Clip_unk_0B4_unk_4)(void); +typedef struct Clip_unk_0B4 { + /* 0x00 */ UNK_TYPE1 unk_00[0x04]; + /* 0x04 */ Clip_unk_0B4_unk_4 unk_4; +} Clip_unk_0B4; // size >= 0x8 + +typedef void (*Clip_unk_0B8_unk_4)(void); +typedef struct Clip_unk_0B8 { + /* 0x00 */ UNK_TYPE1 unk_00[0x04]; + /* 0x04 */ Clip_unk_0B8_unk_4 unk_4; +} Clip_unk_0B8; // size >= 0x8 + +typedef void (*Clip_unk_0D0)(void); + typedef void (*Clip_unk_0D8_unk_00)(struct Game_Play* game_play); typedef struct Clip_unk_0D8 { /* 0x00 */ Clip_unk_0D8_unk_00 unk_00; @@ -121,21 +180,36 @@ typedef struct Clip_unk_0D8 { typedef struct Clip { - /* 0x000 */ UNK_TYPE1 unk000[0x40]; + /* 0x000 */ s8 unk000[0x20]; + /* 0x020 */ s32 unk_020; + /* 0x024 */ s8 unk_024[0x1C]; /* 0x040 */ Clip_unk_040* unk_040; - /* 0x044 */ UNK_TYPE1 unk_044[0x28]; + /* 0x044 */ s8 unk_044[0x1C]; + /* 0x060 */ Clip_unk_060* unk_060; + /* 0x064 */ s8 unk_064[0x4]; + /* 0x068 */ Clip_unk_068 unk_068; /* 0x06C */ Clip_unk_06C* unk_06C; - /* 0x070 */ UNK_TYPE1 unk_070[0x4]; + /* 0x070 */ Clip_unk_070* unk_070; /* 0x074 */ Clip_unk_074* unk_074; /* 0x078 */ struct WeatherClip* weatherClip; - /* 0x07C */ UNK_TYPE1 unk_07C[0x4]; + /* 0x07C */ Clip_unk_07C* unk_07C; /* 0x080 */ Clip_unk_080* unk_080; - /* 0x084 */ UNK_TYPE1 unk_084[0x8]; - /* 0x08C */ Clip_unk_08C* unk_08C; + /* 0x084 */ s8 unk_084[0x8]; + /* 0x08C */ Clip_unk_08C* unk_08C; /* 0x090 */ Clip_unk_090* unk_090; /* 0x094 */ struct ToolClip* toolClip; - /* 0x098 */ UNK_TYPE1 unk_098[0x40]; - /* 0x0D8 */ Clip_unk_0D8* unk_0D8; + /* 0x098 */ s8 unk_098[0x4]; + /* 0x09C */ Clip_unk_09C* unk_09C; + /* 0x0A0 */ s8 unk_0A0[0x4]; + /* 0x0A4 */ Clip_unk_0A4* unk_0A4; + /* 0x0A8 */ Clip_unk_0A8* unk_0A8; + /* 0x0AC */ s8 unk_0AC[0x8]; + /* 0x0B4 */ Clip_unk_0B4* unk_0B4; + /* 0x0B8 */ Clip_unk_0B8* unk_0B8; + /* 0x0BC */ s8 unk_0BC[0x14]; + /* 0x0D0 */ Clip_unk_0D0 unk_0D0; + /* 0x0D4 */ s8 unk_0D4[0x4]; + /* 0x0D8 */ Clip_unk_0D8* unk_0D8; /* 0x0DC */ u8 unk_0DC[0x24]; } Clip; // size = 0x100 diff --git a/include/m_common_data.h b/include/m_common_data.h index a14bc35..affa1b0 100644 --- a/include/m_common_data.h +++ b/include/m_common_data.h @@ -16,6 +16,7 @@ #include "unk.h" #include "m_snowman.h" #include "m_clip.h" +#include "m_scene.h" typedef enum Season { /* 0 */ SPRING, @@ -112,7 +113,7 @@ typedef struct CommonData { /* 0x0F8B2 */ UNK_TYPE1 unk_0F8B2[0x74E]; /* 0x10000 */ u8 unk_10000; // named "game_started" in AC GCN decomp /* 0x10001 */ u8 unk_10001; - /* 0x10002 */ u8 unk_10002[0x1]; + /* 0x10002 */ u8 unk_10002; /* 0x10003 */ u8 playerNumber; /* 0x10004 */ s32 unk_10004; // named "last_scene_no" in AC GCN decomp /* 0x10008 */ s32 unk_10008; @@ -126,13 +127,13 @@ typedef struct CommonData { /* 0x10149 */ u8 unk_10149; /* 0x1014A */ u8 unk_1014A; /* 0x1014B */ u8 unk_1014B; // named "wipeType" in AC GCN decomp - /* 0x1014C */ UNK_TYPE1 unk_1014C[0x2]; + /* 0x1014C */ s16 unk_1014C; /* 0x1014E */ s16 unk_1014E; /* 0x10150 */ UNK_TYPE1 unk_10150[0x10]; /* 0x10160 */ NpcList npclist[ANIMAL_NUM_MAX]; /* 0x104A8 */ u16 houseOwnerName; /* 0x104AA */ u16 lastFieldId; - /* 0x104AC */ UNK_TYPE1 unk_104AC[0x1]; + /* 0x104AC */ u8 unk_104AC; /* 0x104AD */ u8 unk_104AD; /* 0x104AE */ u8 sunlightFlag; /* 0x104AF */ UNK_TYPE1 unk_104AF[0x1]; @@ -151,16 +152,18 @@ typedef struct CommonData { /* 0x1074C */ s32 unk_1074C; /* 0x10750 */ s16 moneyPower; /* 0x10752 */ s16 goodsPower; - /* 0x10754 */ s32 unk_10754; - /* 0x10758 */ UNK_TYPE1 unk_10758[0x48]; - /* 0x107A0 */ UNK_TYPE unk_107A0; - /* 0x107A4 */ UNK_TYPE1 unk_107A4[0x12]; + /* 0x10754 */ DoorData doorData; + /* 0x10768 */ s8 unk_10768[0x38]; + /* 0x107A0 */ DoorData famicomEmuDoorData; + /* 0x107B4 */ s16 unk_107B4; /* 0x107B6 */ s16 unk_107B6; // named "demo_profile" in AC GCN decomp (though it's an array of two s16s in that game) /* 0x107B8 */ UNK_TYPE1 unk_107B8[0x28]; /* 0x107E0 */ s8 playerDecoyFlag; /* 0x107E1 */ UNK_TYPE1 unk_107E1[0x3]; - /* 0x107E4 */ s16 unk_107E4; - /* 0x107E6 */ UNK_TYPE1 unk107E6[0x252]; + /* 0x107E4 */ s16 unk_107E4; + /* 0x107E6 */ UNK_TYPE1 unk107E6[0x212]; + /* 0x109F8 */ u8 unk109F8; + /* 0x109FC */ s8 unk109F9[0x3F]; /* 0x10A38 */ s8 beeStingFlag; /* 0x10A39 */ UNK_TYPE1 unk_10A39[0x1]; /* 0x10A3A */ u8 gokiShockedFlag; diff --git a/include/m_field_make.h b/include/m_field_make.h index b26862f..a287939 100644 --- a/include/m_field_make.h +++ b/include/m_field_make.h @@ -78,7 +78,7 @@ typedef struct FieldMakeBlockInfo { // void func_80086E30_jp(); // void func_80086F08_jp(); // void func_80086FA8_jp(); -// void func_80086FEC_jp(); +void mFM_SetFieldInitData(s32,s32); void func_80087004_jp(void); void func_80087280_jp(void); // void func_80087380_jp(); diff --git a/include/m_player_lib.h b/include/m_player_lib.h index 14e9150..fa473d1 100644 --- a/include/m_player_lib.h +++ b/include/m_player_lib.h @@ -26,14 +26,14 @@ UNK_RET func_800B131C_jp(UNK_TYPE arg0); void func_800B167C_jp(s32 arg0, UNK_RET arg1); // void func_800B16D0_jp(); // void func_800B16F8_jp(); -void func_800B1784_jp(UNK_TYPE); +void func_800B1784_jp(struct Game_Play*); // void func_800B1838_jp(); -void func_800B190C_jp(UNK_TYPE); +void func_800B190C_jp(struct Game_Play*); // void func_800B1944_jp(); -void func_800B1960_jp(UNK_TYPE, UNK_TYPE, UNK_TYPE); -void func_800B19C4_jp(UNK_TYPE, UNK_TYPE, UNK_TYPE); -void func_800B1A28_jp(UNK_TYPE); -void func_800B1A60_jp(UNK_TYPE); +void func_800B1960_jp(struct Game_Play*, UNK_TYPE, UNK_TYPE); +void func_800B19C4_jp(struct Game_Play*, UNK_TYPE, UNK_TYPE); +void func_800B1A28_jp(struct Game_Play*); +void func_800B1A60_jp(struct Game_Play*); void mPlib_Object_Exchange_keep_Player_dt(struct Game_Play* game_play); // void func_800B1AE0_jp(); // void func_800B1B3C_jp(); @@ -69,7 +69,7 @@ void mPlib_change_player_cloth_info_lv2(struct PrivateInfo*, u16); // void func_800B22D0_jp(); // void func_800B22FC_jp(); // void func_800B2350_jp(); -// void func_800B23A4_jp(); +void mPlib_request_main_invade_type1(struct Game_Play*); // void func_800B23DC_jp(); // void func_800B2414_jp(); // void func_800B2450_jp(); diff --git a/include/m_scene.h b/include/m_scene.h index 1cb1da7..c847c8d 100644 --- a/include/m_scene.h +++ b/include/m_scene.h @@ -3,8 +3,11 @@ #include "ultra64.h" #include "z64math.h" +#include "libc/stdint.h" +#include "m_std_dma.h" struct Game_Play; +struct Game; typedef struct ActorEntry { /* 0x0 */ s16 id; @@ -16,11 +19,10 @@ typedef struct ActorEntry { typedef struct ObjectStatus { /* 0x00 */ s16 id; /* 0x04 */ void* segment; - /* 0x08 */ UNK_TYPE unk_08; + /* 0x08 */ void* vram; /* 0x0C */ uintptr_t vrom; /* 0x10 */ size_t size; - /* 0x14 */ UNK_TYPE unk14; - /* 0x18 */ char pad18[0x1C]; + /* 0x14 */ DmaRequest unk14; /* 0x34 */ OSMesgQueue unk34; /* 0x4C */ UNK_TYPE unk4C; /* 0x50 */ s16 unk50; @@ -37,59 +39,119 @@ typedef struct ObjectExchangeBank { /* 0x17FC */ UNK_TYPE unk17FC; /* 0x1800 */ UNK_TYPE unk1800; /* 0x1804 */ UNK_TYPE unk1804; - /* 0x1808 */ UNK_TYPE unk1808; - /* 0x180C */ UNK_TYPE unk180C; - /* 0x1810 */ UNK_TYPE unk1810; - /* 0x1814 */ UNK_TYPE unk1814; + /* 0x1808 */ s32 unk1808[2]; + /* 0x1810 */ s32 unk1810[2]; /* 0x1818 */ UNK_PTR unk1818; /* 0x181C */ UNK_TYPE unk181C; /* 0x1820 */ UNK_TYPE unk1820; } ObjectExchangeBank; // size = 0x1824 -typedef struct { - /* 0x0000 */ u8 unk0; - /* 0x0001 */ u8 unk1; - /* 0x0004 */ UNK_PTR unk4; -} MSceneUnkStruct; +typedef struct DoorData { + /* 0x00 */ s32 nextSceneId; + /* 0x04 */ u8 exitOrientation; + /* 0x05 */ u8 exitType; + /* 0x06 */ u16 params; + /* 0x08 */ s_xyz exitPos; + /* 0x0E */ u16 fgName; + /* 0x10 */ u8 wipeType; + /* 0x11 */ u8 alignment[3]; +} DoorData; // size = 0x14 + +typedef struct DoorInfo { + /* 0x00 */ u8 numDoors; + /* 0x04 */ DoorData* doorDataPtr; +} DoorInfo; // size = 0x8 + +typedef struct SceneDataDoor { + /* 0x00 */ u8 type; + /* 0x01 */ u8 numDoors; + /* 0x04 */ DoorData* doorDataPtr; +} SceneDataDoor; // size = 0x8 + +typedef struct SceneDataActor { + /* 0x00 */ u8 type; + /* 0x01 */ u8 numActors; + /* 0x04 */ ActorEntry* actorDataPtr; +} SceneDataActor; // size = 0x8 + +typedef struct SceneDataCtrlActor { + /* 0x00 */ u8 type; + /* 0x01 */ u8 numCtrlActors; + /* 0x04 */ s16* ctrlActorDataPtr; +} SceneDataCtrlActor; // size = 0x8 + +typedef struct SceneDataObjectBank { + /* 0x00 */ u8 type; + /* 0x01 */ u8 numBanks; + /* 0x04 */ s16* banksDataPtr; +} SceneDataObjectBank; // size = 0x8 + + +typedef struct SceneDataField { + /* 0x00 */ u8 type; + /* 0x01 */ u8 itemType; + /* 0x02 */ u8 bgNum; + /* 0x04 */ u16 bgDispSize; + /* 0x06 */ u8 unk_06; + /* 0x07 */ u8 drawType; +} SceneDataField; // size = 0x8 + +typedef struct SceneDataArrangeFtr { + /* 0x00 */ u8 type; + /* 0x01 */ u8 arrangeFtrNum; +} SceneDataArrangeFtr; // size = 0x2 + +typedef struct SceneDataMisc { + /* 0x01 */ u8 type; +} SceneDataMisc; // size = 0x1 + +typedef union SceneData { + SceneDataMisc misc; + SceneDataActor actor; + SceneDataCtrlActor controlActor; + SceneDataObjectBank objectBank; + SceneDataDoor doorData; + SceneDataField field; + SceneDataArrangeFtr arrangeFtr; +} SceneData; // size = 0x8 s32 func_800C59B0_jp(ObjectExchangeBank* objectExchangeBank); s32 func_800C5A08_jp(ObjectExchangeBank* objectExchangeBank); s32 func_800C5A60_jp(ObjectExchangeBank* objectExchangeBank); s32 func_800C5AA0_jp(ObjectStatus* objectStatus, ObjectExchangeBank* objectExchangeBank, s16 objectBankIndex); -void func_800C5B30_jp(ObjectStatus* objectStatus); +void mSc_set_bank_status_after(ObjectStatus* objectStatus); void mSc_clear_bank_status(ObjectStatus* objectStatus); s32 func_800C5B74_jp(ObjectExchangeBank* objectExchangeBank, s16 id); -void Object_Exchange_keep_new_Player(s32 arg0); +void Object_Exchange_keep_new_Player(struct Game_Play* arg0); u32 mSc_secure_exchange_keep_bank(ObjectExchangeBank* objectExchangeBank, s16 id, s32 size); -void func_800C5D68_jp(ObjectExchangeBank*); +s32 func_800C5D68_jp(ObjectExchangeBank* objectExchangeBank); void func_800C5E10_jp(ObjectExchangeBank* objectExchangeBank); -// void func_800C5EA0_jp(); +void func_800C5EA0_jp(ObjectExchangeBank* objectExchangeBank); s32 func_800C5F0C_jp(ObjectStatus* objectStatus, ObjectExchangeBank* objectExchangeBank); void mSc_dmacopy_data_bank(ObjectExchangeBank* objectExchangeBank); s32 mSc_bank_regist_check(ObjectExchangeBank* objectExchangeBank, s16 id); s32 func_800C6144_jp(ObjectExchangeBank* objectExchangeBank, s16 arg1); void mSc_regist_initial_exchange_bank(struct Game_Play* game_play); -void func_800C62C4_jp(ObjectStatus*, ObjectExchangeBank*, s32); -void mSc_dmacopy_all_exchange_bank(ObjectExchangeBank* objectExchangeBank); +void mSc_dmacopy_all_exchange_bank_sub(ObjectStatus* status, ObjectExchangeBank* objectExchangeBank, s32 idx); +void mSc_dmacopy_all_exchange_bank(ObjectExchangeBank* exchange); void mSc_data_bank_ct(struct Game_Play* game_play, ObjectExchangeBank* objectExchangeBank); void mSc_decide_exchange_bank(ObjectExchangeBank* objectExchangeBank); -// void func_800C6690_jp(); -void Scene_ct(struct Game_Play* game_play, void* arg1); -// void func_800C6960_jp(); -void Scene_Proc_Ctrl_Actor_Ptr(struct Game_Play* game_play, MSceneUnkStruct* arg1); -void Scene_Proc_Actor_Ptr(struct Game_Play* game_play, MSceneUnkStruct* arg1); -void Scene_Proc_Object_Exchange_Bank_Ptr(struct Game_Play* game_play, MSceneUnkStruct* arg1); -void Scene_Proc_Door_Data_Ptr(struct Game_Play* game_play, MSceneUnkStruct* arg1); -void Door_info_ct(s8* arg0); -void Scene_Proc_Sound(UNK_TYPE arg0, UNK_TYPE arg1); -// void func_800C6AE0_jp(); -// void func_800C6B50_jp(); -// void func_800C6BB0_jp(); -// void func_800C6BD4_jp(); -// void func_800C6BF8_jp(); -// void func_800C6C10_jp(); -// void func_800C6D14_jp(); -// void func_800C6D5C_jp(); -// void func_800C6E14_jp(); +void Scene_player_select(s32 sceneNo, s32 npcActor); +void Scene_ct(struct Game_Play* play, SceneData* sceneData); +void Scene_Proc_Player_Ptr(struct Game_Play* play, SceneData* scene_data); +void Scene_Proc_CtrlActor_Ptr(struct Game_Play* play, SceneData* scene_data); +void Scene_Proc_Actor_Ptr(struct Game_Play* play, SceneData* scene_data); +void Scene_Proc_Object_Exchange_Bank_Ptr(struct Game_Play* play, SceneData* scene_data); +void Scene_Proc_Door_Data_Ptr(struct Game_Play* play, SceneData* scene_data); +void Door_info_ct(DoorInfo* door_info); +void Scene_Proc_Sound(struct Game_Play* play, SceneData* scene_data); +void set_item_info(struct Game_Play* play, SceneDataField* field); +void Scene_Proc_Field_ct(struct Game_Play* play, SceneData* scene_data); +void Scene_Proc_ArrangeRoom_ct(struct Game_Play* play, SceneData* data); +void Scene_Proc_ArrangeFurniture_ct(struct Game_Play* play, SceneData* data); +s32 goto_other_scene(struct Game_Play* play, DoorData* door_data, s32 updatePlayer); +s32 goto_next_scene(struct Game_Play* play, s32 nextScene, s32 updatePlayer); +s32 goto_emu_game(struct Game_Play* play, s16 famicomRomId); +void return_emu_game(struct Game* game); #endif diff --git a/include/m_scene_table.h b/include/m_scene_table.h index fd31922..04bb5b7 100644 --- a/include/m_scene_table.h +++ b/include/m_scene_table.h @@ -3,7 +3,13 @@ #include "ultra64.h" #include "z64math.h" -#include "unknown_structs.h" + +typedef struct SceneDmaStatus { + /* 0x00 */ RomOffset vromStart; + /* 0x04 */ RomOffset vromEnd; + /* 0x08 */ char unk08[0xB]; + /* 0x13 */ u8 unk_13; +} SceneDmaStatus; typedef enum SceneTable { /* 00 */ SCENE_TEST1, @@ -43,6 +49,7 @@ typedef enum SceneTable { /* 34 */ SCENE_PLAYERSELECT_SAVE, /* 35 */ SCENE_NUM } SceneTable; -extern Struct_8010EAA0 scene_data_status[]; + +extern SceneDmaStatus scene_data_status[]; #endif diff --git a/include/m_submenu.h b/include/m_submenu.h index 423f3dd..7916acd 100644 --- a/include/m_submenu.h +++ b/include/m_submenu.h @@ -118,7 +118,7 @@ u32 mSM_check_open_inventory_itemlist(InventoryItemList itemlist, s32 arg1) ; // void mSM_Object_Exchange_keep_new(); // void mSM_Object_Exchange_keep_new_MenuTexAndPallet(); -// void mSM_Object_Exchange_keep_new_Menu(); +void mSM_Object_Exchange_keep_new_Menu(struct Game_Play*); // void mSM_Get_ground_tex_p(); // void mSM_Get_ground_pallet_p(); diff --git a/include/unknown_structs.h b/include/unknown_structs.h index b47f318..383f2cd 100644 --- a/include/unknown_structs.h +++ b/include/unknown_structs.h @@ -7,13 +7,6 @@ #include "unk.h" #include "other_types.h" -typedef struct Struct_8010EAA0 { - /* 0x00 */ RomOffset unk_00; - /* 0x04 */ RomOffset unk_04; - /* 0x08 */ char unk08[0xB]; - /* 0x13 */ u8 unk_13; -} Struct_8010EAA0; // size = 0x14 - typedef struct struct_801161E8_jp { /* 0x0 */ UNK_TYPE1 unk_0[0x8]; } struct_801161E8_jp; // size <= 0x8 diff --git a/linker_scripts/jp/symbol_addrs_code.txt b/linker_scripts/jp/symbol_addrs_code.txt index 3f109c6..2cbfd29 100644 --- a/linker_scripts/jp/symbol_addrs_code.txt +++ b/linker_scripts/jp/symbol_addrs_code.txt @@ -1283,7 +1283,7 @@ func_80086DE0_jp = 0x80086DE0; // type:func func_80086E30_jp = 0x80086E30; // type:func func_80086F08_jp = 0x80086F08; // type:func func_80086FA8_jp = 0x80086FA8; // type:func -func_80086FEC_jp = 0x80086FEC; // type:func +mFM_SetFieldInitData = 0x80086FEC; // type:func func_80087004_jp = 0x80087004; // type:func func_80087280_jp = 0x80087280; // type:func func_80087380_jp = 0x80087380; // type:func @@ -2564,7 +2564,7 @@ func_800B22A4_jp = 0x800B22A4; // type:func func_800B22D0_jp = 0x800B22D0; // type:func func_800B22FC_jp = 0x800B22FC; // type:func func_800B2350_jp = 0x800B2350; // type:func -func_800B23A4_jp = 0x800B23A4; // type:func +mPlib_request_main_invade_type1 = 0x800B23A4; // type:func func_800B23DC_jp = 0x800B23DC; // type:func func_800B2414_jp = 0x800B2414; // type:func func_800B2450_jp = 0x800B2450; // type:func @@ -2934,9 +2934,9 @@ mRmTp_DrawFamicomInfo = 0x800BF27C; // type:func mRmTp_MakeFamicom_Fdebug = 0x800BF338; // type:func func_800BF410_jp = 0x800BF410; // type:func func_800BF480_jp = 0x800BF480; // type:func -func_800BF4F4_jp = 0x800BF4F4; // type:func +mScn_ObtainCarpetBank = 0x800BF4F4; // type:func func_800BF56C_jp = 0x800BF56C; // type:func -func_800BF580_jp = 0x800BF580; // type:func +mScn_ObtainMyRoomBank = 0x800BF580; // type:func func_800BF5A0_jp = 0x800BF5A0; // type:func func_800BF5F4_jp = 0x800BF5F4; // type:func func_800BF770_jp = 0x800BF770; // type:func @@ -3091,11 +3091,11 @@ mSc_dmacopy_data_bank = 0x800C5F64; // type:func mSc_bank_regist_check = 0x800C60EC; // type:func func_800C6144_jp = 0x800C6144; // type:func mSc_regist_initial_exchange_bank = 0x800C61CC; // type:func -func_800C62C4_jp = 0x800C62C4; // type:func +mSc_dmacopy_all_exchange_bank_sub = 0x800C62C4; // type:func mSc_dmacopy_all_exchange_bank = 0x800C639C; // type:func mSc_data_bank_ct = 0x800C65E4; // type:func mSc_decide_exchange_bank = 0x800C6678; // type:func -func_800C6690_jp = 0x800C6690; // type:func +Scene_player_select = 0x800C6690; // type:func Scene_ct = 0x800C68C8; // type:func Scene_Proc_Player_Ptr = 0x800C6960; // type:func Scene_Proc_Ctrl_Actor_Ptr = 0x800C69F4; // type:func @@ -3104,14 +3104,14 @@ Scene_Proc_Object_Exchange_Bank_Ptr = 0x800C6A5C; // type:func Scene_Proc_Door_Data_Ptr = 0x800C6A90; // type:func Door_info_ct = 0x800C6AC4; // type:func Scene_Proc_Sound = 0x800C6AD0; // type:func -func_800C6AE0_jp = 0x800C6AE0; // type:func -func_800C6B50_jp = 0x800C6B50; // type:func -func_800C6BB0_jp = 0x800C6BB0; // type:func -func_800C6BD4_jp = 0x800C6BD4; // type:func -func_800C6BF8_jp = 0x800C6BF8; // type:func -func_800C6C10_jp = 0x800C6C10; // type:func -func_800C6D14_jp = 0x800C6D14; // type:func -func_800C6D5C_jp = 0x800C6D5C; // type:func +set_item_info = 0x800C6AE0; // type:func +Scene_Proc_Field_ct = 0x800C6B50; // type:func +Scene_Proc_MyRoom_ct = 0x800C6BB0; // type:func +Scene_Proc_ArrangeRoom_ct = 0x800C6BD4; // type:func +Scene_Proc_ArrangeFurniture_ct = 0x800C6BF8; // type:func +goto_other_scene = 0x800C6C10; // type:func +goto_next_scene = 0x800C6D14; // type:func +goto_emu_game = 0x800C6D5C; // type:func return_emu_game = 0x800C6E14; // type:func Skin_Matrix_PrjMulVector = 0x800C6E80; // type:func Skin_Matrix_MulVector = 0x800C6F68; // type:func diff --git a/linker_scripts/jp/symbol_addrs_overlays.txt b/linker_scripts/jp/symbol_addrs_overlays.txt index 9f8e36d..3a1cdb8 100644 --- a/linker_scripts/jp/symbol_addrs_overlays.txt +++ b/linker_scripts/jp/symbol_addrs_overlays.txt @@ -199,7 +199,7 @@ draw_version = 0x80803E40; // type:func Game_play_draw = 0x80803F48; // type:func play_main = 0x8080407C; // type:func func_80804138_jp = 0x80804138; // type:func -func_808041A4_jp = 0x808041A4; // type:func +VR_Box_ct = 0x808041A4; // type:func Gameplay_Scene_Init = 0x808041C4; // type:func mPl_SceneNo2SoundRoomType = 0x80804240; // type:func Gameplay_Scene_Read = 0x80804288; // type:func diff --git a/src/code/m_scene.c b/src/code/m_scene.c index 9e294c9..4514b2f 100644 --- a/src/code/m_scene.c +++ b/src/code/m_scene.c @@ -1,3 +1,4 @@ +#include "overlays/actors/ovl_Weather/ac_weather.h" #include "unk.h" #include "libc/stdint.h" #include "m_scene.h" @@ -11,6 +12,10 @@ #include "m_object.h" #include "m_player_lib.h" #include "m_std_dma.h" +#include "m_scene_table.h" +#include "6E30B0.h" +#include "m_player_lib.h" +#include "overlays/actors/player_actor/m_player.h" s32 func_800C59B0_jp(ObjectExchangeBank* objectExchangeBank) { ObjectStatus* objectStatus = &objectExchangeBank->status[objectExchangeBank->unk17FC]; @@ -51,36 +56,34 @@ s32 func_800C5A08_jp(ObjectExchangeBank* objectExchangeBank) { } s32 func_800C5A60_jp(ObjectExchangeBank* objectExchangeBank) { - s32 temp_v0; - s32 var_v1; + s32 ret; - temp_v0 = func_800C59B0_jp(objectExchangeBank); - var_v1 = temp_v0; + ret = func_800C59B0_jp(objectExchangeBank); - if (temp_v0 == -1) { - var_v1 = func_800C5A08_jp(objectExchangeBank); + if (ret == -1) { + ret = func_800C5A08_jp(objectExchangeBank); } - return var_v1; + return ret; } 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; + u32 alignedSize = ALIGN16(objectExchangeBank->unk1800 + objectSize); - if (temp_t0 >= objectExchangeBank->unk1804) { + if (alignedSize >= objectExchangeBank->unk1804) { ret = 0; } else { objectStatus->id = -objectBankIndex; - objectStatus->unk_08 = objectExchangeBank->unk1800; + objectStatus->vram = (void*)objectExchangeBank->unk1800; objectStatus->segment = 0; objectStatus->vrom = gObjectTable[objectBankIndex].vromStart; objectStatus->size = objectSize; objectStatus->unk50 = 0; objectStatus->unk53 = 1; - objectExchangeBank->unk1800 = temp_t0; + objectExchangeBank->unk1800 = alignedSize; } return ret; @@ -89,17 +92,16 @@ s32 func_800C5AA0_jp(ObjectStatus* objectStatus, ObjectExchangeBank* objectExcha 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; + objectStatus->segment = objectStatus->vram; } void mSc_clear_bank_status(ObjectStatus* objectStatus) { objectStatus->id = 0; objectStatus->size = 0; - objectStatus->unk_08 = 0; - objectStatus->segment = 0; + objectStatus->vram = NULL; + objectStatus->segment = NULL; } -// object_spawn equivalent s32 func_800C5B74_jp(ObjectExchangeBank* objectExchangeBank, s16 id) { s32 ret = 0; @@ -107,9 +109,7 @@ s32 func_800C5B74_jp(ObjectExchangeBank* objectExchangeBank, s16 id) { 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); + DmaMgr_RequestSyncDebug(objectStatus->vram, objectStatus->vrom, objectStatus->size, "../m_scene.c", 317); mSc_set_bank_status_after(objectStatus); objectStatus->unk50 = 1; objectExchangeBank->num++; @@ -120,7 +120,7 @@ s32 func_800C5B74_jp(ObjectExchangeBank* objectExchangeBank, s16 id) { return ret; } -void Object_Exchange_keep_new_Player(s32 arg0) { +void Object_Exchange_keep_new_Player(Game_Play* arg0) { func_800B1784_jp(arg0); func_800B190C_jp(arg0); func_800B190C_jp(arg0); @@ -138,14 +138,14 @@ u32 mSc_secure_exchange_keep_bank(ObjectExchangeBank* objectExchangeBank, s16 id u32 ret = 0; if (objectExchangeBank->num < OBJECT_EXCHANGE_BANK_MAX) { - ret = (objectExchangeBank->unk1800 + size + 0xF) & ~0xF; + ret = ALIGN16(objectExchangeBank->unk1800 + size); if (ret >= objectExchangeBank->unk1804) { ret = 0; } else { objectStatus->id = id; objectStatus->segment = (void*)objectExchangeBank->unk1800; - objectStatus->unk_08 = objectExchangeBank->unk1800; + objectStatus->vram = (void*)objectExchangeBank->unk1800; objectStatus->vrom = 0; objectStatus->size = size; objectStatus->unk50 = 0; @@ -158,45 +158,116 @@ u32 mSc_secure_exchange_keep_bank(ObjectExchangeBank* objectExchangeBank, s16 id return ret; } -#pragma GLOBAL_ASM("asm/jp/nonmatchings/code/m_scene/func_800C5D68_jp.s") +s32 func_800C5D68_jp(ObjectExchangeBank* objectExchangeBank) { + ObjectStatus* objectStatus; + s32 res = objectExchangeBank->unk181C; + + if (common_data.unk_10001 == 0) { + s32 i; + objectStatus = &objectExchangeBank->status[objectExchangeBank->unk17FC]; + res = (objectExchangeBank->unk181C + 1) % 2; + for (i = objectExchangeBank->unk17FC; i < OBJECT_EXCHANGE_BANK_MAX; i++) { + if ((objectStatus->id != 0) && (res == objectStatus->unk52) && + ((objectStatus->unk50 != 0) || (objectStatus->unk53 != 0))) { + res = objectExchangeBank->unk181C; + break; + } + + objectStatus++; + } + } + + return res; +} void func_800C5E10_jp(ObjectExchangeBank* objectExchangeBank) { s32 temp_s3 = objectExchangeBank->unk181C; - s32 var_s1 = objectExchangeBank->unk17FC; + s32 statusIndex = objectExchangeBank->unk17FC; ObjectStatus* objectStatus = &objectExchangeBank->status[objectExchangeBank->unk17FC]; - if (var_s1 < OBJECT_EXCHANGE_BANK_MAX) { + if (statusIndex < 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); + statusIndex++; + } while (statusIndex < OBJECT_EXCHANGE_BANK_MAX); } } -#pragma GLOBAL_ASM("asm/jp/nonmatchings/code/m_scene/func_800C5EA0_jp.s") +void func_800C5EA0_jp(ObjectExchangeBank* objectExchangeBank) { + if (objectExchangeBank->unk1820 == 1) { + s32 res = func_800C5D68_jp(objectExchangeBank); + if (res != objectExchangeBank->unk181C) { + objectExchangeBank->unk181C = res; + + objectExchangeBank->unk1800 = objectExchangeBank->unk1808[res]; + objectExchangeBank->unk1804 = objectExchangeBank->unk1810[res]; + + func_800C5E10_jp(objectExchangeBank); + } + objectExchangeBank->unk1820 = 0; + } +} s32 func_800C5F0C_jp(ObjectStatus* objectStatus, ObjectExchangeBank* objectExchangeBank) { - s32 var_v1 = 1; - u32 temp_v0 = (objectExchangeBank->unk1800 + objectStatus->size + 0xF) & ~0xF; + s32 res = 1; + u32 alignedRam = ALIGN16(objectExchangeBank->unk1800 + objectStatus->size); - if (temp_v0 >= (u32)objectExchangeBank->unk1804) { - var_v1 = 0; + if (alignedRam >= (u32)objectExchangeBank->unk1804) { + res = 0; } else { - objectStatus->unk_08 = objectExchangeBank->unk1800; + objectStatus->vram = (void*)objectExchangeBank->unk1800; objectStatus->unk52 = objectExchangeBank->unk181C; objectStatus->unk53 = 1; - objectStatus->unk14 = 0; - objectExchangeBank->unk1800 = temp_v0; + objectStatus->unk14.vrom = 0; + objectExchangeBank->unk1800 = alignedRam; } - return var_v1; + return res; } -#pragma GLOBAL_ASM("asm/jp/nonmatchings/code/m_scene/mSc_dmacopy_data_bank.s") +void mSc_dmacopy_data_bank(ObjectExchangeBank* objectExchangeBank) { + s32 i; + OSMesgQueue* msgq; + ObjectStatus* objectStatus = objectExchangeBank->status; + + func_800C5EA0_jp(objectExchangeBank); + + for (i = 0; i < OBJECT_EXCHANGE_BANK_MAX; i++) { + if ((i >= objectExchangeBank->unk17FC) && (objectStatus->id != 0) && + (objectStatus->unk52 != objectExchangeBank->unk181C)) { + if (objectStatus->unk50 != 0) { + if (objectStatus->unk53 != 2) { + func_800C5F0C_jp(objectStatus, objectExchangeBank); + } + } else if (objectStatus->unk53 == 0) { + mSc_clear_bank_status(objectStatus); + } + } + + switch (objectStatus->unk53) { + case 1: + msgq = &objectStatus->unk34; + if (objectStatus->unk14.vrom == 0) { + osCreateMesgQueue(msgq, (OSMesg)&objectStatus->unk4C, 1); + DmaMgr_RequestAsync(&objectStatus->unk14, objectStatus->vram, objectStatus->vrom, + objectStatus->size, 0, msgq, NULL, "../m_scene.c", 613); + objectStatus->unk53 = 2; + } + break; + case 2: + msgq = &objectStatus->unk34; + if (osRecvMesg(msgq, NULL, OS_MESG_NOBLOCK) == 0) { + mSc_set_bank_status_after(objectStatus); + } + break; + } + objectStatus++; + } +} s32 mSc_bank_regist_check(ObjectExchangeBank* objectExchangeBank, s16 id) { ObjectStatus* objectStatus; @@ -216,17 +287,17 @@ s32 mSc_bank_regist_check(ObjectExchangeBank* objectExchangeBank, s16 id) { } s32 func_800C6144_jp(ObjectExchangeBank* objectExchangeBank, s16 arg1) { - s32 temp_v0; + s32 idx; s32 ret = 0; - temp_v0 = func_800C5A60_jp(objectExchangeBank); + idx = func_800C5A60_jp(objectExchangeBank); - if (temp_v0 != -1) { - ObjectStatus* temp_a0 = &objectExchangeBank->status[temp_v0]; + if (idx != -1) { + ObjectStatus* status = &objectExchangeBank->status[idx]; - if (func_800C5AA0_jp(temp_a0, objectExchangeBank, arg1) == 1) { - temp_a0->unk14 = 0; - temp_a0->unk52 = objectExchangeBank->unk181C; + if (func_800C5AA0_jp(status, objectExchangeBank, arg1) == 1) { + status->unk14.vrom = 0; + status->unk52 = objectExchangeBank->unk181C; ret = 1; } } @@ -237,62 +308,146 @@ s32 func_800C6144_jp(ObjectExchangeBank* objectExchangeBank, s16 arg1) { 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; + s32 i; objectExchangeBank->unk181C = 0; - var_s2 = 0; + i = 0; objectExchangeBank->unk17FC = objectExchangeBank->num; if (game_play->unk_1EA7 > 0) { do { func_800C6144_jp(objectExchangeBank, *var_s1); - var_s2 += 1; + i += 1; var_s1 += 1; objectExchangeBank->num += 1; - } while (var_s2 < game_play->unk_1EA7); + } while (i < 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; + u32 size = ((u32)(objectExchangeBank->unk1804 - objectExchangeBank->unk1800) / 2); + s32 ram = ALIGN16(objectExchangeBank->unk1800 + size); - objectExchangeBank->unk1814 = objectExchangeBank->unk1804; - objectExchangeBank->unk1810 = temp_v0; - objectExchangeBank->unk180C = temp_v0; - objectExchangeBank->unk1804 = temp_v0; - temp = objectExchangeBank->unk1800; - objectExchangeBank->unk1808 = temp; + objectExchangeBank->unk1810[1] = objectExchangeBank->unk1804; + objectExchangeBank->unk1810[0] = ram; + objectExchangeBank->unk1808[1] = ram; + objectExchangeBank->unk1804 = ram; + size = objectExchangeBank->unk1800; + objectExchangeBank->unk1808[0] = size; } else { - objectExchangeBank->unk1808 = objectExchangeBank->unk1800; - objectExchangeBank->unk180C = objectExchangeBank->unk1800; - objectExchangeBank->unk1810 = objectExchangeBank->unk1804; - objectExchangeBank->unk1814 = objectExchangeBank->unk1804; + objectExchangeBank->unk1808[0] = objectExchangeBank->unk1800; + objectExchangeBank->unk1808[1] = objectExchangeBank->unk1800; + objectExchangeBank->unk1810[0] = objectExchangeBank->unk1804; + objectExchangeBank->unk1810[1] = objectExchangeBank->unk1804; } objectExchangeBank->unk17FC = objectExchangeBank->num; } -#pragma GLOBAL_ASM("asm/jp/nonmatchings/code/m_scene/func_800C62C4_jp.s") +void mSc_dmacopy_all_exchange_bank_sub(ObjectStatus* status, ObjectExchangeBank* objectExchangeBank, s32 idx) { + if (idx >= objectExchangeBank->unk17FC) { + u32 area = (u32)ALIGN16(objectExchangeBank->unk1800 + status->size); + + if (area >= objectExchangeBank->unk1804) { + objectExchangeBank->unk181C = (objectExchangeBank->unk181C + 1) % 2; + objectExchangeBank->unk1800 = objectExchangeBank->unk1808[objectExchangeBank->unk181C]; + objectExchangeBank->unk1804 = objectExchangeBank->unk1810[objectExchangeBank->unk181C]; + area = (u32)ALIGN16(objectExchangeBank->unk1800 + status->size); + } + status->vram = (void*)objectExchangeBank->unk1800; + status->unk52 = objectExchangeBank->unk181C; + objectExchangeBank->unk1800 = area; + } + DmaMgr_RequestSyncDebug(status->vram, status->vrom, status->size, "../m_scene.c", 828); + mSc_set_bank_status_after(status); +} + +void mSc_dmacopy_all_exchange_bank(ObjectExchangeBank* exchange) { + ObjectStatus* bank; + s32 i; + + bank = &exchange->status[exchange->unk17F8]; + exchange->unk1800 = exchange->unk1808[exchange->unk181C]; + + for (i = exchange->unk17F8; i < OBJECT_EXCHANGE_BANK_MAX; i++) { + if (bank->id != 0 && bank->unk53 != 3) { + if (bank->id < 0) { + mSc_dmacopy_all_exchange_bank_sub(bank, exchange, i); + } else if (bank->unk50 != 0) { + mSc_dmacopy_all_exchange_bank_sub(bank, exchange, i); + } else if (i >= exchange->unk17FC) { + mSc_clear_bank_status(bank); + } else { + bank->id = 0; + } + } + + bank++; + } + + if (common_data.clip.unk_08C != NULL) { + if (common_data.clip.unk_08C->unk_A4 != NULL) { + common_data.clip.unk_08C->unk_A4(exchange); + } + } + if (common_data.clip.unk_040 != NULL) { + common_data.clip.unk_040->unk_E8(); + } + if (common_data.clip.unk_07C != NULL) { + if (common_data.clip.unk_07C->unk_4 != NULL) { + common_data.clip.unk_07C->unk_4(exchange); + } + } + if (common_data.clip.unk_0A8 != NULL) { + if (common_data.clip.unk_0A8->unk_4 != NULL) { + common_data.clip.unk_0A8->unk_4(exchange); + } + } -#pragma GLOBAL_ASM("asm/jp/nonmatchings/code/m_scene/mSc_dmacopy_all_exchange_bank.s") + if (common_data.clip.unk_068 != NULL) { + common_data.clip.unk_068(); + } + if (common_data.clip.unk_060 != NULL) { + common_data.clip.unk_060->unk_4(); + } + if (common_data.clip.unk_070 != NULL) { + common_data.clip.unk_070->unk_C(); + } + if (common_data.clip.weatherClip != NULL) { + common_data.clip.weatherClip->changingWeather(); + } + if (common_data.clip.unk_080 != NULL) { + common_data.clip.unk_080->unk_24(); + } + if (common_data.clip.unk_09C != NULL) { + common_data.clip.unk_09C->unk_C(); + } + if (common_data.clip.unk_0B8 != NULL) { + common_data.clip.unk_0B8->unk_4(); + } + if (common_data.clip.unk_0B4 != NULL) { + common_data.clip.unk_0B4->unk_4(); + } + if (common_data.clip.unk_0D0 != NULL) { + common_data.clip.unk_0D0(); + } +} void mSc_data_bank_ct(Game_Play* game_play, ObjectExchangeBank* objectExchangeBank) { u32 temp_v0; - u32 temp_v1; - bzero(objectExchangeBank, 0x1824); + bzero(objectExchangeBank, sizeof(ObjectExchangeBank)); 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; + objectExchangeBank->unk1808[0] = temp_v0; + objectExchangeBank->unk1808[1] = temp_v0; + + temp_v0 = temp_v0 + 0x93400; + objectExchangeBank->unk1804 = temp_v0; + objectExchangeBank->unk1810[0] = temp_v0; + objectExchangeBank->unk1810[1] = temp_v0; func_800C5B74_jp(objectExchangeBank, GAMEPLAY_KEEP); gSegments[4] = (uintptr_t)OS_PHYSICAL_TO_K0(objectExchangeBank->status[0].segment); } @@ -302,65 +457,291 @@ void mSc_decide_exchange_bank(ObjectExchangeBank* objectExchangeBank) { objectExchangeBank->unk1818 = (void*)objectExchangeBank->unk1800; } -#pragma GLOBAL_ASM("asm/jp/nonmatchings/code/m_scene/func_800C6690_jp.s") +void Scene_player_select(s32 sceneNo, s32 npcActor) { + Animal_c* animal; + s32 metVillagersNum; + s32 i; + u16 npcId; + s32 found; + s32 j; + s32 metVillagersBitfield; + s32 selected; + + metVillagersBitfield = 0; + animal = common_data.animals; + if (sceneNo != common_data.sceneNo) { + return; + } + + metVillagersNum = 0; + { UNUSED s32 scopedTemp; } + + for (i = 0; i < ANIMAL_NUM_MAX; i++) { + if (mNpc_CheckFreeAnimalPersonalID(&animal->id) == FALSE) { + Anmmem_c* memory = animal->memories; -#pragma GLOBAL_ASM("asm/jp/nonmatchings/code/m_scene/Scene_ct.s") + for (j = 0; j < ANIMAL_MEMORY_NUM; j++) { + if (memory->memoryPlayerId.landId == common_data.landInfo.id && + mLd_CheckCmpLandName(memory->memoryPlayerId.landName, common_data.landInfo.name) == TRUE) { + metVillagersBitfield |= 1 << i; + metVillagersNum++; + break; + } -#pragma GLOBAL_ASM("asm/jp/nonmatchings/code/m_scene/Scene_Proc_Player_Ptr.s") + memory++; + } + } -void Scene_Proc_Ctrl_Actor_Ptr(Game_Play* game_play, MSceneUnkStruct* arg1) { - void* temp = arg1->unk4; + animal++; + } + + /* Roll a random villager if none have met a player in town before */ + if (metVillagersNum == 0) { + do { + selected = RANDOM(ANIMAL_NUM_MAX); + } while (mNpc_CheckFreeAnimalPersonalID(&common_data.animals[selected].id)); + if (1) {}; + npcId = common_data.animals[selected].id.npcId; + found = mNpc_SearchAnimalinfo(common_data.animals, npcId, ANIMAL_NUM_MAX); + } else { + /* Pick a random villager which has met a player in town */ - game_play->unk_1EA6 = arg1->unk1; - game_play->unk_1EB0 = Lib_SegmentedToVirtual(temp); + selected = RANDOM(metVillagersNum); + + for (found = 0; found < ANIMAL_NUM_MAX; found++) { + if (metVillagersBitfield & 1) { + if (selected == 0) { + break; + } + selected--; + } + metVillagersBitfield >>= 1; + } + npcId = common_data.animals[found].id.npcId; + } + + mNpc_RegistEventNpc(npcActor, npcId, npcId, common_data.animals[found].cloth); } -void Scene_Proc_Actor_Ptr(Game_Play* game_play, MSceneUnkStruct* arg1) { - void* temp = arg1->unk4; +void Scene_Proc_Player_Ptr(Game_Play* play, SceneData* data); +void Scene_Proc_Ctrl_Actor_Ptr(Game_Play* play, SceneData* data); +void Scene_Proc_Actor_Ptr(Game_Play* play, SceneData* data); +void Scene_Proc_Object_Exchange_Bank_Ptr(Game_Play* play, SceneData* data); +void Scene_Proc_Door_Data_Ptr(Game_Play* play, SceneData* data); +void Scene_Proc_Field_ct(Game_Play* play, SceneData* data); +void Scene_Proc_MyRoom_ct(Game_Play* play, SceneData* data); +void Scene_Proc_ArrangeRoom_ct(Game_Play* play, SceneData* data); +void Scene_Proc_ArrangeFurniture_ct(Game_Play* play, SceneData* data); +void Scene_Proc_Sound(Game_Play* play, SceneData* data); + +typedef void (*SceneDataProc)(Game_Play*, SceneData*); + +void Scene_ct(Game_Play* play, SceneData* sceneData) { + static SceneDataProc Scene_Proc[] = { + &Scene_Proc_Player_Ptr, + &Scene_Proc_Ctrl_Actor_Ptr, + &Scene_Proc_Actor_Ptr, + &Scene_Proc_Object_Exchange_Bank_Ptr, + &Scene_Proc_Door_Data_Ptr, + &Scene_Proc_Field_ct, + &Scene_Proc_MyRoom_ct, + &Scene_Proc_ArrangeRoom_ct, + &Scene_Proc_ArrangeFurniture_ct, + &Scene_Proc_Sound, + NULL, + }; + + while (TRUE) { + u32 type = sceneData->misc.type; + + if (type == 10) { + break; + } + + if (type < 11) { + Scene_Proc[type](play, sceneData); + } + + sceneData++; + } - game_play->unk_1EA5 = arg1->unk1; - game_play->unk_1EAC = Lib_SegmentedToVirtual(temp); + /* Setup player select actors */ + Scene_player_select(SCENE_PLAYERSELECT_2, 0xD01F); // load + Scene_player_select(SCENE_PLAYERSELECT_SAVE, 0xD06A); // save } -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_Player_Ptr(Game_Play* play, SceneData* scene_data) { + static s16 angle_table[] = { + 0x0000, 0x2000, 0x4000, 0x6000, 0x8000, 0xA000, 0xC000, 0xE000, + }; + + ActorEntry* data = Lib_SegmentedToVirtual(scene_data->actor.actorDataPtr); + + play->unk_1EA8 = data; + + if (common_data.doorData.nextSceneId != 0) { + mem_copy((u8*)&data->pos, (u8*)&common_data.doorData.exitPos, sizeof(s_xyz)); + data->rot.y = angle_table[common_data.doorData.exitOrientation]; + } + + data->params = common_data.doorData.params; + Object_Exchange_keep_new_Player(play); + mSM_Object_Exchange_keep_new_Menu(play); } -void Scene_Proc_Door_Data_Ptr(Game_Play* game_play, MSceneUnkStruct* arg1) { - UNK_PTR temp = arg1->unk4; +void Scene_Proc_Ctrl_Actor_Ptr(Game_Play* play, SceneData* scene_data) { + s16* data = scene_data->controlActor.ctrlActorDataPtr; - game_play->unk_1E10 = arg1->unk1; - game_play->unk_1E14 = Lib_SegmentedToVirtual(temp); + play->unk_1EA6 = scene_data->controlActor.numCtrlActors; + play->unk_1EB0 = Lib_SegmentedToVirtual(data); } -void Door_info_ct(s8* arg0) { - *arg0 = 0; +void Scene_Proc_Actor_Ptr(Game_Play* play, SceneData* scene_data) { + ActorEntry* data = scene_data->actor.actorDataPtr; + + play->unk_1EA5 = scene_data->actor.numActors; + play->unk_1EAC = Lib_SegmentedToVirtual(data); } -void Scene_Proc_Sound(UNK_TYPE arg0 UNUSED, UNK_TYPE arg1 UNUSED) { +void Scene_Proc_Object_Exchange_Bank_Ptr(Game_Play* play, SceneData* scene_data) { + + play->unk_1EA7 = scene_data->objectBank.numBanks; + play->unk_1EB4 = Lib_SegmentedToVirtual(scene_data->objectBank.banksDataPtr); } -#pragma GLOBAL_ASM("asm/jp/nonmatchings/code/m_scene/func_800C6AE0_jp.s") +void Scene_Proc_Door_Data_Ptr(Game_Play* play, SceneData* scene_data) { + DoorData* data = scene_data->doorData.doorDataPtr; + + play->sceneDoorInfo.numDoors = scene_data->doorData.numDoors; + play->sceneDoorInfo.doorDataPtr = Lib_SegmentedToVirtual(data); +} -#pragma GLOBAL_ASM("asm/jp/nonmatchings/code/m_scene/func_800C6B50_jp.s") +void Door_info_ct(DoorInfo* door_info) { + door_info->numDoors = 0; +} -#pragma GLOBAL_ASM("asm/jp/nonmatchings/code/m_scene/func_800C6BB0_jp.s") +void Scene_Proc_Sound(UNUSED Game_Play* play, UNUSED SceneData* scene_data) { +} -#pragma GLOBAL_ASM("asm/jp/nonmatchings/code/m_scene/func_800C6BD4_jp.s") +void set_item_info(Game_Play* play, SceneDataField* field) { + s16 bank; -#pragma GLOBAL_ASM("asm/jp/nonmatchings/code/m_scene/func_800C6BF8_jp.s") + static s16 profile_table[4] = { 0x1, 0xB4, 0x4E, 0x52 }; + s32 itemType = field->itemType; -#pragma GLOBAL_ASM("asm/jp/nonmatchings/code/m_scene/func_800C6C10_jp.s") + if (itemType == 0) { + bank = common_data.time.bgitemBank; + common_data.unk_1014E = common_data.time.bgitemProfile; + } else { + bank = -1; + common_data.unk_1014E = profile_table[itemType]; + } -#pragma GLOBAL_ASM("asm/jp/nonmatchings/code/m_scene/func_800C6D14_jp.s") + common_data.unk_1014C = itemType; -#pragma GLOBAL_ASM("asm/jp/nonmatchings/code/m_scene/func_800C6D5C_jp.s") + if (bank != -1) { + func_800C5B74_jp(&play->objectExchangeBank, bank); + } +} + +void Scene_Proc_Field_ct(Game_Play* play, SceneData* scene_data) { + mFM_SetFieldInitData(scene_data->field.bgNum, scene_data->field.bgDispSize); + set_item_info(play, &scene_data->field); + common_data.unk_10002 = scene_data->field.drawType; + common_data.unk_10000 = FALSE; + common_data.unk_104AC = TRUE; + common_data.sunlightFlag = TRUE; +} + +void Scene_Proc_MyRoom_ct(Game_Play* play, UNUSED SceneData* data) { + mScn_ObtainMyRoomBank(play); +} + +void Scene_Proc_ArrangeRoom_ct(Game_Play* play, UNUSED SceneData* data) { + mScn_ObtainCarpetBank(play); +} + +void Scene_Proc_ArrangeFurniture_ct(UNUSED Game_Play* play, SceneData* data) { + common_data.clip.unk_020 = data->arrangeFtr.arrangeFtrNum; +} + +s32 goto_other_scene(Game_Play* play, DoorData* door_data, s32 updatePlayer) { + Player* player = get_player_actor_withoutCheck(play); + s32 res = 0; + + if (player != NULL) { + if (play->unk_1EE3 == 0) { + play->unk_1EE0 = 2; + + if (door_data->wipeType == 0) { + play->unk_1EE1 = 3; + } else { + play->unk_1EE1 = door_data->wipeType; + } + + if (common_data.unk_1014B == 0xFF) { + common_data.unk_1014B = play->unk_1EE1; + } + + common_data.doorData = *door_data; + common_data.doorData.nextSceneId = door_data->nextSceneId + 1; + play->unk_1E18 = door_data->nextSceneId; + + if (updatePlayer) { + mPlib_request_main_invade_type1(play); + } + + restore_fgdata_all(play); + play->state.unk_74 = FALSE; + res = 1; + } else { + res = 2; + } + } + + return res; +} + +s32 goto_next_scene(Game_Play* play, s32 nextScene, s32 updatePlayer) { + s32 res = FALSE; + + if (play->sceneDoorInfo.numDoors != 0) { + res = goto_other_scene(play, play->sceneDoorInfo.doorDataPtr + nextScene, updatePlayer); + } + + return res; +} + +s32 goto_emu_game(Game_Play* play, s16 famicomRomId) { + Player* player = get_player_actor_withoutCheck(play); + s32 res = FALSE; + + if (player != NULL) { + DoorData* door_data; + + play->unk_1EE0 = 3; + play->unk_1EE1 = 3; + res = TRUE; + + door_data = &common_data.famicomEmuDoorData; + door_data->nextSceneId = common_data.sceneNo; + door_data->exitOrientation = 0; + door_data->exitType = 0; + door_data->params = 0; + door_data->exitPos.x = player->actor.world.pos.x; + door_data->exitPos.y = player->actor.world.pos.y; + door_data->exitPos.z = player->actor.world.pos.z; + door_data->fgName = 0; + common_data.unk109F8 = famicomRomId; + } + + return res; +} void return_emu_game(Game* game) { - mem_copy((u8*)&common_data.unk_10754, (u8*)&common_data.unk_107A0, 0x14); - common_data.unk_10754 = common_data.unk_107A0 + 1; - game->unk_74 = 0; + mem_copy((u8*)&common_data.doorData, (u8*)&common_data.famicomEmuDoorData, sizeof(DoorData)); + common_data.doorData.nextSceneId = common_data.famicomEmuDoorData.nextSceneId + 1; + game->unk_74 = FALSE; game_goto_next_game_play(game); - common_data.sceneNo = common_data.unk_107A0; + common_data.sceneNo = common_data.famicomEmuDoorData.nextSceneId; } diff --git a/src/overlays/actors/ovl_Tools/ac_tools.c b/src/overlays/actors/ovl_Tools/ac_tools.c index 4e11d32..6ce732a 100644 --- a/src/overlays/actors/ovl_Tools/ac_tools.c +++ b/src/overlays/actors/ovl_Tools/ac_tools.c @@ -64,7 +64,7 @@ s32 aTOL_check_data_bank(ObjectExchangeBank* objectExchangeBank, ToolName toolNa objectStatus->size = objectSize; objectStatus->unk50 = 0; objectStatus->unk53 = 1; - objectStatus->unk14 = 0; + objectStatus->unk14.vrom = 0; } } else { ret = common_data.clip.toolClip->umbrellaObjectIndex; diff --git a/src/overlays/actors/ovl_Weather/ac_weather.h b/src/overlays/actors/ovl_Weather/ac_weather.h index 73046a5..3a972d4 100644 --- a/src/overlays/actors/ovl_Weather/ac_weather.h +++ b/src/overlays/actors/ovl_Weather/ac_weather.h @@ -26,7 +26,7 @@ typedef struct WeatherPrv { /* 0x2E */ u8 status; } WeatherPrv; // size = 0x30 -typedef void (*ChangingWeatherProc)(); +typedef void (*ChangingWeatherProc)(void); typedef void (*ChangeWeatherProc)(Actor* thisx, s16 status, s16 level); typedef s32 (*GetWeatherPrvvNumProc)(Actor* thisx); typedef void (*RemoveWeatherPrvProc)(Actor* thisx, s32 id); diff --git a/src/overlays/gamestates/ovl_play/m_play.c b/src/overlays/gamestates/ovl_play/m_play.c index 893fe69..33b75c4 100644 --- a/src/overlays/gamestates/ovl_play/m_play.c +++ b/src/overlays/gamestates/ovl_play/m_play.c @@ -806,15 +806,15 @@ void play_main(Game* game) { game_play->state.unk_9D = 0xBE; } -void* func_80804138_jp(Game_Play* game_play, Struct_8010EAA0* arg1) { - u32 sp24 = arg1->unk_04 - arg1->unk_00; - void* sp20 = THA_alloc16(&game_play->state.heap, sp24); +void* func_80804138_jp(Game_Play* game_play, SceneDmaStatus* arg1) { + u32 sceneDataSize = arg1->vromEnd - arg1->vromStart; + void* sp20 = THA_alloc16(&game_play->state.heap, sceneDataSize); - DmaMgr_RequestSyncDebug(sp20, arg1->unk_00, sp24, "../m_play.c", 2302); + DmaMgr_RequestSyncDebug(sp20, arg1->vromStart, sceneDataSize, "../m_play.c", 2302); return sp20; } -void func_808041A4_jp(Game_Play* game_play) { +void VR_Box_ct(Game_Play* game_play) { Global_kankyo_ct(game_play, &game_play->kankyo); } @@ -826,11 +826,11 @@ void Gameplay_Scene_Init(Game_Play* game_play) { game_play->unk_1EB8 = 0; mSc_data_bank_ct(game_play, &game_play->objectExchangeBank); Global_light_ct(&game_play->glight); - Door_info_ct(&game_play->unk_1E10); + Door_info_ct(&game_play->sceneDoorInfo); common_data_clear(); Scene_ct(game_play, game_play->unk_010C); mSc_decide_exchange_bank(&game_play->objectExchangeBank); - func_808041A4_jp(game_play); + VR_Box_ct(game_play); } s32 mPl_SceneNo2SoundRoomType(s32 arg0) { @@ -858,7 +858,7 @@ s32 mPl_SceneNo2SoundRoomType(s32 arg0) { } void Gameplay_Scene_Read(Game_Play* game_play, s16 arg1) { - Struct_8010EAA0* sp1C = &scene_data_status[arg1]; + SceneDmaStatus* sp1C = &scene_data_status[arg1]; sp1C->unk_13 = 0; game_play->unk_2210 = sp1C; diff --git a/src/overlays/gamestates/ovl_play/m_play.h b/src/overlays/gamestates/ovl_play/m_play.h index 4549cff..b86d38c 100644 --- a/src/overlays/gamestates/ovl_play/m_play.h +++ b/src/overlays/gamestates/ovl_play/m_play.h @@ -26,6 +26,7 @@ struct Actor; struct ActorEntry; struct Game_Play; +struct SceneDmaStatus; typedef void (*Game_Play_unk_1C58)(struct Actor*); typedef UNK_RET (*Game_Play_unk_2208)(struct Actor*, struct Game_Play*); @@ -79,8 +80,7 @@ typedef struct Game_Play { /* 0x1DAD */ UNK_TYPE1 unk_1DAD[0x3]; /* 0x1DB0 */ UNK_TYPE1 unk_1DB0[0x10]; /* 0x1DC0 */ PreRender unk_1DC0; - /* 0x1E10 */ s8 unk_1E10; - /* 0x1E14 */ UNK_PTR unk_1E14; + /* 0x1E10 */ DoorInfo sceneDoorInfo; /* 0x1E18 */ s32 unk_1E18; /* 0x1E1C */ MtxF viewProjectionMtxF; /* 0x1E5C */ MtxF billboardMtxF; @@ -107,7 +107,7 @@ typedef struct Game_Play { /* 0x2138 */ CollisionCheck unk_2138; /* 0x2208 */ Game_Play_unk_2208 unk_2208; /* 0x220C */ s32 unk_220C; - /* 0x2210 */ Struct_8010EAA0* unk_2210; + /* 0x2210 */ struct SceneDmaStatus* unk_2210; /* 0x2214 */ UNK_TYPE1 unk_2214[0x1FC]; } Game_Play; // size = 0x2410 diff --git a/src/overlays/gamestates/ovl_select/m_select.c b/src/overlays/gamestates/ovl_select/m_select.c index 1c2195a..163c2ef 100644 --- a/src/overlays/gamestates/ovl_select/m_select.c +++ b/src/overlays/gamestates/ovl_select/m_select.c @@ -54,7 +54,7 @@ void game_next_play(Game* game, s32 scene) { STOP_GAMESTATE(game); SET_NEXT_GAMESTATE(game, play_init, sizeof(Game_Play)); mHm_SetNowHome(); - common_data.unk_10754 = 0; + common_data.doorData.nextSceneId = 0; func_800968C0_jp(); common_data.unk_10140 = 1; } diff --git a/yamls/jp/code.yaml b/yamls/jp/code.yaml index 480fcd6..dba9550 100644 --- a/yamls/jp/code.yaml +++ b/yamls/jp/code.yaml @@ -165,7 +165,7 @@ - [0x730B60, data, code/730B60] - [0x731940, .data, code/m_start_data_init] - [0x731980, .data, code/m_submenu] - - [0x731A20, data, code/731A20] + - [0x731A20, .data, code/m_scene] - [0x731A70, .data, code/m_object] # made-up name - [0x732740, data, code/732740] - [0x732A00, .data, code/m_skin_matrix] -- cgit v1.2.3