From d6faee7318c0da171deed607c097ca06225121d1 Mon Sep 17 00:00:00 2001 From: rozlette Date: Tue, 24 Dec 2019 01:46:19 -0600 Subject: [PATCH] Port some of z_room from the oot decomp --- include/functions.h | 26 ++--- include/os.h | 3 + include/structs.h | 128 ++++++++++++++----------- linker_scripts/code_script.txt | 2 +- src/code/z_room.c | 152 ++++++++++++++++++++++++++++++ tables/files_with_nonmatching.txt | 1 + tables/functions.py | 26 ++--- 7 files changed, 257 insertions(+), 81 deletions(-) create mode 100644 src/code/z_room.c diff --git a/include/functions.h b/include/functions.h index 392fcd0f33..4fa85953ee 100644 --- a/include/functions.h +++ b/include/functions.h @@ -164,7 +164,7 @@ void func_800860B8(void); // func_800860B8 void func_800860D8(void); // func_800860D8 void func_80086110(void); // func_80086110 void func_80086258(void); // func_80086258 -void func_80086280(void); // func_80086280 +void func_80086280(char* param_1, u32 param_2); // func_80086280 void func_800862B4(void); // func_800862B4 void* StartHeap_AllocMin1(u32 size); // func_800862E0 void StartHeap_FreeNull(void* pvParm1); // func_80086310 @@ -2012,7 +2012,7 @@ void func_8010A194(void); // func_8010A194 void func_8010A208(void); // func_8010A208 void func_8010A238(void); // func_8010A238 void func_8010A2AC(void); // func_8010A2AC -void func_8010A2DC(void); // func_8010A2DC +void func_8010A2DC(GlobalContext* ctxt); // func_8010A2DC void func_8010A33C(GlobalContext* ctxt, s16 param_2); // func_8010A33C void func_8010A410(void); // func_8010A410 void func_8010A430(void); // func_8010A430 @@ -2373,19 +2373,19 @@ void func_8012CEA8(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_ void func_8012CF0C(GraphicsContext* gCtxt, int iParm2, int iParm3, unsigned int uParm4, u8 param_5, u8 param_6); // func_8012CF0C void func_8012D374(void); // func_8012D374 void func_8012D40C(f32* param_1, f32* param_2, s16* param_3); // func_8012D40C -void Room_nop8012D510(GlobalContext* ctxt, LoadedRoom* room, UNK_PTR param_3, UNK_TYPE1 param_4); // func_8012D510 -void Room_DrawType3Mesh(GlobalContext* ctxt, LoadedRoom* room, u32 flags); // func_8012D528 -void Room_DrawType0Mesh(GlobalContext* ctxt, LoadedRoom* room, u32 flags); // func_8012D53C -void Room_DrawType2Mesh(GlobalContext* ctxt, LoadedRoom* room, u32 flags); // func_8012D750 -void func_8012DEE8(GlobalContext* ctxt, LoadedRoom* room, u32 flags); // func_8012DEE8 -void func_8012E254(void); // func_8012E254 -void func_8012E32C(GlobalContext* ctxt, LoadedRoom* room, u32 flags); // func_8012E32C -void Room_DrawType1Mesh(GlobalContext* ctxt, LoadedRoom* room, u32 flags); // func_8012E6A8 +void Room_nop8012D510(GlobalContext* ctxt, Room* room, UNK_PTR param_3, UNK_TYPE1 param_4); // func_8012D510 +void Room_DrawType3Mesh(GlobalContext* ctxt, Room* room, u32 flags); // func_8012D528 +void Room_DrawType0Mesh(GlobalContext* ctxt, Room* room, u32 flags); // func_8012D53C +void Room_DrawType2Mesh(GlobalContext* ctxt, Room* room, u32 flags); // func_8012D750 +void func_8012DEE8(GlobalContext* ctxt, Room* room, u32 flags); // func_8012DEE8 +u32 func_8012E254(int param_1, GlobalContext* ctxt); // func_8012E254 +void func_8012E32C(GlobalContext* ctxt, Room* room, u32 flags); // func_8012E32C +void Room_DrawType1Mesh(GlobalContext* ctxt, Room* room, u32 flags); // func_8012E6A8 void Room_Init(GlobalContext* ctxt, RoomContext* roomCtxt); // func_8012E710 u32 Room_AllocateAndLoad(GlobalContext* ctxt, RoomContext* roomCtxt); // func_8012E750 -unsigned int Room_StartRoomTransition(GlobalContext* ctxt, RoomContext* roomCtxt, s32 index); // func_8012E96C +s32 Room_StartRoomTransition(GlobalContext* ctxt, RoomContext* roomCtxt, s32 index); // func_8012E96C s32 Room_HandleLoadCallbacks(GlobalContext* ctxt, RoomContext* roomCtxt); // func_8012EAA8 -void Room_DrawRoomMesh(GlobalContext* ctxt, LoadedRoom* room, u32 flags); // func_8012EBA8 +void Room_Draw(GlobalContext* ctxt, Room* room, u32 flags); // func_8012EBA8 void func_8012EBF8(GlobalContext* ctxt, RoomContext* roomCtxt); // func_8012EBF8 unsigned int func_8012EC80(GlobalContext* ctxt); // func_8012EC80 void func_8012ED34(s16 param_1); // func_8012ED34 @@ -3891,7 +3891,7 @@ void func_801A3AC0(void); // func_801A3AC0 void func_801A3AEC(void); // func_801A3AEC void func_801A3B48(void); // func_801A3B48 void func_801A3B90(void); // func_801A3B90 -void func_801A3CD8(void); // func_801A3CD8 +void func_801A3CD8(s8 param_1); // func_801A3CD8 void func_801A3CF4(void); // func_801A3CF4 void func_801A3D98(void); // func_801A3D98 void func_801A3E38(void); // func_801A3E38 diff --git a/include/os.h b/include/os.h index a89c91c975..978999ddb1 100644 --- a/include/os.h +++ b/include/os.h @@ -91,6 +91,9 @@ typedef u32 OSIntMask; typedef u32 OSPageMask; +#define OS_MESG_NOBLOCK 0 +#define OS_MESG_BLOCK 1 + typedef void* OSMesg; typedef struct { diff --git a/include/structs.h b/include/structs.h index 3e82d735c4..7883383624 100644 --- a/include/structs.h +++ b/include/structs.h @@ -189,28 +189,6 @@ typedef struct { /* 0xC */ void* appendEnd; } DisplayList; -typedef struct { -/* 0x0 */ u8 type; -/* 0x1 */ u8 count; -/* 0x2 */ UNK_TYPE1 pad2[2]; -/* 0x4 */ u32 paramsStart; -/* 0x8 */ UNK_TYPE1 pad8[4]; -} DisplayMeshHeader; - -typedef struct { -/* 0x0 */ u32 opaqueDl; -/* 0x4 */ u32 translucentDl; -} DisplayMeshType0Params; - -// Size TODO -typedef struct { -/* 0x0 */ UNK_TYPE1 pad0[16]; -} DisplayMeshType1Params; - -typedef struct { -/* 0x0 */ UNK_TYPE1 pad0[16]; -} DisplayMeshType2Params; - typedef struct { /* 0x00 */ u32 vromStart; /* 0x04 */ u32 vramStart; @@ -435,19 +413,6 @@ typedef struct { /* 0x08 */ Lights7 lights; } LightMapper; -typedef struct { -/* 0x00 */ s8 index; -/* 0x01 */ UNK_TYPE1 pad1[2]; -/* 0x03 */ u8 unk3; -/* 0x04 */ s8 unk4; -/* 0x05 */ UNK_TYPE1 pad5[1]; -/* 0x06 */ u8 enablePosLights; -/* 0x07 */ UNK_TYPE1 pad7[1]; -/* 0x08 */ DisplayMeshHeader* meshHeader; -/* 0x0C */ void* vramAddr; -/* 0x10 */ UNK_TYPE1 pad10[4]; -} LoadedRoom; - typedef struct { /* 0x0 */ u32 vromStart; /* 0x4 */ u32 vromEnd; @@ -476,28 +441,31 @@ typedef struct { /* 0x20 */ u16 fracPart[16]; } RSPMatrix; -typedef struct { -/* 0x00 */ LoadedRoom currRoom; -/* 0x14 */ LoadedRoom prevRoom; -/* 0x28 */ void* roomMemPages[2]; // In a scene with transitions, roomMemory is split between two pages that toggle each transition. This is one continuous range, as the second page allocates from the end -/* 0x30 */ u8 activeMemPage; // 0 - First page in memory, 1 - Second page -/* 0x31 */ s8 unk31; -/* 0x32 */ UNK_TYPE1 pad32[2]; -/* 0x34 */ u32 activeRoomVram; -/* 0x38 */ DmaRequest dmaReq; -/* 0x58 */ OSMesgQueue roomDmaCallback; -/* 0x70 */ OSMesg roomDmaCallbackMsg[1]; -/* 0x74 */ UNK_TYPE1 pad74[4]; -/* 0x78 */ s8 unk78; -/* 0x79 */ UNK_TYPE1 pad79[1]; -/* 0x7A */ UNK_TYPE2 unk7A[3]; -} RoomContext; - typedef struct { /* 0x0 */ u32 vromStart; /* 0x4 */ u32 vromEnd; } RoomFileLocation; +typedef struct { +/* 0x0 */ u32 opaqueDl; +/* 0x4 */ u32 translucentDl; +} RoomMeshType0Params; + +// Fields TODO +typedef struct { +/* 0x0 */ u8 type; +/* 0x1 */ u8 format; // 1 = single, 2 = multi +} RoomMeshType1; + +// Size TODO +typedef struct { +/* 0x0 */ UNK_TYPE1 pad0[16]; +} RoomMeshType1Params; + +typedef struct { +/* 0x0 */ UNK_TYPE1 pad0[16]; +} RoomMeshType2Params; + // Extra information in the save context that is not saved typedef struct { /* 0x000 */ UNK_TYPE1 pad0[712]; @@ -961,6 +929,22 @@ typedef struct { /* 0x0C */ Vector3s rot; } PosRot; +typedef struct { +/* 0x0 */ u8 type; +/* 0x1 */ u8 count; +/* 0x2 */ UNK_TYPE1 pad2[2]; +/* 0x4 */ RoomMeshType0Params* paramsStart; +/* 0x8 */ RoomMeshType0Params* paramsEnd; +} RoomMeshType0; + +typedef struct { +/* 0x0 */ u8 type; +/* 0x1 */ u8 count; +/* 0x2 */ UNK_TYPE1 pad2[2]; +/* 0x4 */ RoomMeshType2Params* paramsStart; +/* 0x8 */ RoomMeshType2Params* paramsEnd; +} RoomMeshType2; + // Permanent save context, kept in regular save files typedef struct { /* 0x0000 */ u32 entranceIndex; // bits 0-3 : offset; 4-8: spawn index; 9-15: scene index @@ -1162,7 +1146,7 @@ typedef struct { /* 0xC0 */ UNK_TYPE1 padC0[1]; /* 0xC1 */ u8 unkC1; /* 0xC2 */ u8 unkC2; -/* 0xC3 */ UNK_TYPE1 padC3[1]; +/* 0xC3 */ u8 unkC3; /* 0xC4 */ RGB unkC4; /* 0xC7 */ s8 unkC7; /* 0xC8 */ s8 unkC8; @@ -1191,6 +1175,12 @@ typedef struct { /* 0x11F23 */ UNK_TYPE1 pad11F23[437]; } MessageContext; +typedef union { +/* 0x0 */ RoomMeshType0 type0; +/* 0x0 */ RoomMeshType1 type1; +/* 0x0 */ RoomMeshType2 type2; +} RoomMesh; + // Full save context typedef struct { /* 0x0000 */ SaveContextPerm perm; @@ -1204,6 +1194,36 @@ typedef struct { /* 0xC */ ColTriInit* elemInit; } ColTriGroupInit; +typedef struct { +/* 0x00 */ s8 index; +/* 0x01 */ UNK_TYPE1 pad1[2]; +/* 0x03 */ u8 unk3; +/* 0x04 */ s8 unk4; +/* 0x05 */ UNK_TYPE1 pad5[1]; +/* 0x06 */ u8 enablePosLights; +/* 0x07 */ UNK_TYPE1 pad7[1]; +/* 0x08 */ RoomMesh* mesh; +/* 0x0C */ void* vramAddr; +/* 0x10 */ UNK_TYPE1 pad10[4]; +} Room; + +typedef struct { +/* 0x00 */ Room currRoom; +/* 0x14 */ Room prevRoom; +/* 0x28 */ void* roomMemPages[2]; // In a scene with transitions, roomMemory is split between two pages that toggle each transition. This is one continuous range, as the second page allocates from the end +/* 0x30 */ u8 activeMemPage; // 0 - First page in memory, 1 - Second page +/* 0x31 */ s8 unk31; +/* 0x32 */ UNK_TYPE1 pad32[2]; +/* 0x34 */ u32 activeRoomVram; +/* 0x38 */ DmaRequest dmaReq; +/* 0x58 */ OSMesgQueue roomDmaCallback; +/* 0x70 */ OSMesg roomDmaCallbackMsg[1]; +/* 0x74 */ UNK_TYPE1 pad74[4]; +/* 0x78 */ s8 unk78; +/* 0x79 */ s8 unk79; +/* 0x7A */ UNK_TYPE2 unk7A[3]; +} RoomContext; + typedef struct ActorBgMbarChair ActorBgMbarChair; typedef struct ActorEnBji01 ActorEnBji01; @@ -1518,7 +1538,7 @@ typedef void(*global_context_func)(GlobalContext*); typedef void(*light_map_positional_func)(LightMapper* mapper, void* params, GlobalContext* ctxt); -typedef void(*room_draw_func)(GlobalContext* ctxt, LoadedRoom* room, u32 flags); +typedef void(*room_draw_func)(GlobalContext* ctxt, Room* room, u32 flags); typedef struct { /* 0x00 */ draw_func unk0; diff --git a/linker_scripts/code_script.txt b/linker_scripts/code_script.txt index 6d535e226f..c543ce287d 100644 --- a/linker_scripts/code_script.txt +++ b/linker_scripts/code_script.txt @@ -258,7 +258,7 @@ SECTIONS build/asm/z_prenmi.o(.text) build/asm/code_0x8012A080.o(.text) build/asm/z_rcp.o(.text) - build/asm/z_room.o(.text) + build/src/code/z_room.o(.text) build/asm/code_0x8012EC80.o(.text) build/asm/z_scene.o(.text) build/asm/z_scene_proc.o(.text) diff --git a/src/code/z_room.c b/src/code/z_room.c new file mode 100644 index 0000000000..af829c1de9 --- /dev/null +++ b/src/code/z_room.c @@ -0,0 +1,152 @@ +#include +#include + +void Room_nop8012D510(GlobalContext* ctxt, Room* room, UNK_PTR param_3, UNK_TYPE1 param_4) {} + +void Room_DrawType3Mesh(GlobalContext* ctxt, Room* room, u32 flags) {} + +void Room_DrawType0Mesh(GlobalContext* ctxt, Room* room, u32 flags) { + RoomMeshType0* mesh; + s32 i; + RoomMeshType0Params* meshParams; + GraphicsContext* gCtxt; + UNK_TYPE4 pad; + + gCtxt = ctxt->common.gCtxt; + if (flags & 1) { + func_800BCBF4(&D_801C1D10, ctxt); + gSPSegment(gCtxt->polyOpa.append++, 0x03, room->vramAddr); + func_8012C268(ctxt); + gSPMatrix(gCtxt->polyOpa.append++, &D_801D1DE0, G_MTX_MODELVIEW | G_MTX_LOAD); + } + + if (flags & 2) { + func_800BCC68(&D_801C1D10, ctxt); + gSPSegment(gCtxt->polyXlu.append++, 0x03, room->vramAddr); + func_8012C2DC(ctxt->common.gCtxt); + gSPMatrix(gCtxt->polyXlu.append++, &D_801D1DE0, G_MTX_MODELVIEW | G_MTX_LOAD); + } + + mesh = &room->mesh->type0; + meshParams = (RoomMeshType0Params*)Lib_PtrSegToVirt((u32)mesh->paramsStart); + for (i = 0; i < mesh->count; i++) { + if ((flags & 1) && (meshParams->opaqueDl != NULL)) { + gSPDisplayList(gCtxt->polyOpa.append++, meshParams->opaqueDl); + } + + if ((flags & 2) && (meshParams->translucentDl != NULL)) { + gSPDisplayList(gCtxt->polyXlu.append++, meshParams->translucentDl); + } + + meshParams++; + } +} + +GLOBAL_ASM("asm/nonmatching/z_room/Room_DrawType2Mesh.asm") + +GLOBAL_ASM("asm/nonmatching/z_room/func_8012DEE8.asm") + +GLOBAL_ASM("asm/nonmatching/z_room/func_8012E254.asm") + +GLOBAL_ASM("asm/nonmatching/z_room/func_8012E32C.asm") + +void Room_DrawType1Mesh(GlobalContext* ctxt, Room* room, u32 flags) { + RoomMeshType1* mesh = &room->mesh->type1; + if (mesh->format == 1) { + func_8012DEE8(ctxt,room,flags); + } else if (mesh->format == 2) { + func_8012E32C(ctxt,room,flags); + } else { + func_80086280(D_801DDFAC,0x3c5); + } +} + +void Room_Init(GlobalContext* ctxt, RoomContext* roomCtxt) { + s32 i; + roomCtxt->currRoom.index = -1; + roomCtxt->currRoom.vramAddr = 0; + roomCtxt->unk78 = 1; + roomCtxt->unk79 = 0; + for (i = 0; i < 3; i++) { + roomCtxt->unk7A[i] = 0; + } +} + +GLOBAL_ASM("asm/nonmatching/z_room/Room_AllocateAndLoad.asm") + +#ifdef NONMATCHING +s32 Room_StartRoomTransition(GlobalContext* ctxt, RoomContext* roomCtxt, s32 index) { + u32 size; + + // XXX: this should use a branch-likely + if (roomCtxt->unk31 == 0) { + roomCtxt->prevRoom = roomCtxt->currRoom; + roomCtxt->currRoom.index = index; + roomCtxt->currRoom.vramAddr = NULL; + roomCtxt->unk31 = 1; + + size = ctxt->roomAddrs[index].vromEnd - ctxt->roomAddrs[index].vromStart; + roomCtxt->activeRoomVram = ((s32)roomCtxt->roomMemPages[roomCtxt->activeMemPage] - (size + 8) * roomCtxt->activeMemPage + 8) & 0xfffffff0; + + osCreateMesgQueue(&roomCtxt->roomDmaCallback, roomCtxt->roomDmaCallbackMsg, 1); + Dmamgr_SendRequest(&roomCtxt->dmaReq, roomCtxt->activeRoomVram, ctxt->roomAddrs[index].vromStart, size, + 0, &roomCtxt->roomDmaCallback, NULL); + roomCtxt->activeMemPage ^= 1; + + return 1; + } + + return 0; +} +#else +GLOBAL_ASM("asm/nonmatching/z_room/Room_StartRoomTransition.asm") +#endif + +s32 Room_HandleLoadCallbacks(GlobalContext* ctxt, RoomContext* roomCtxt) { + if (roomCtxt->unk31 == 1) + { + if (!osRecvMesg(&roomCtxt->roomDmaCallback, NULL, OS_MESG_NOBLOCK)) + { + roomCtxt->unk31 = 0; + roomCtxt->currRoom.vramAddr = (void*)(roomCtxt->activeRoomVram); + gRspSegmentPhysAddrs[3] = roomCtxt->activeRoomVram + 0x80000000; + + Scene_ProcessHeader(ctxt, (SceneHeaderEntry*)roomCtxt->currRoom.vramAddr); + func_80123140(ctxt, (ActorPlayer*)ctxt->actorContext.actorTypeLists[2].head); + Actor_SpawnTransitionActors(ctxt, &ctxt->actorContext); + + if (((ctxt->currentScene != 0x13) || (roomCtxt->currRoom.index != 1)) && (ctxt->currentScene != 0x56)) { + ctxt->kankyoContext.unkC3 = 0xff; + ctxt->kankyoContext.unkE0 = 0; + } + func_800FEAB0(); + if (!func_800FE4B8(ctxt)) { + func_800FD858(ctxt); + } + } else { + return 0; + } + } + + return 1; +} + +void Room_Draw(GlobalContext* ctxt, Room* room, u32 flags) { + if (room->vramAddr != NULL) { + gRspSegmentPhysAddrs[3] = (u32)room->vramAddr + 0x80000000; + roomDrawFuncs[room->mesh->type0.type](ctxt,room,flags); + } + return; +} + +void func_8012EBF8(GlobalContext* ctxt, RoomContext* roomCtxt){ + roomCtxt->prevRoom.index = -1; + roomCtxt->prevRoom.vramAddr = NULL; + func_800BA798(ctxt, &ctxt->actorContext); + Actor_SpawnTransitionActors(ctxt, &ctxt->actorContext); + if (-1 < roomCtxt->currRoom.index) { + func_8010A33C(ctxt, roomCtxt->currRoom.index); + func_8010A2DC(ctxt); + } + func_801A3CD8(ctxt->roomContext.currRoom.unk4); +} diff --git a/tables/files_with_nonmatching.txt b/tables/files_with_nonmatching.txt index 88ec5251d4..345f9bd9cf 100644 --- a/tables/files_with_nonmatching.txt +++ b/tables/files_with_nonmatching.txt @@ -7,3 +7,4 @@ z_lib z_actor z_DLF z_lights +z_room diff --git a/tables/functions.py b/tables/functions.py index 3de20c80dd..ed428041da 100644 --- a/tables/functions.py +++ b/tables/functions.py @@ -154,7 +154,7 @@ 0x800860D8:("func_800860D8","void","void"), 0x80086110:("func_80086110","void","void"), 0x80086258:("func_80086258","void","void"), - 0x80086280:("func_80086280","void","void"), + 0x80086280:("func_80086280","void","char* param_1, u32 param_2"), 0x800862B4:("func_800862B4","void","void"), 0x800862E0:("StartHeap_AllocMin1","void*","u32 size"), 0x80086310:("StartHeap_FreeNull","void","void* pvParm1"), @@ -2001,7 +2001,7 @@ 0x8010A208:("func_8010A208","void","void"), 0x8010A238:("func_8010A238","void","void"), 0x8010A2AC:("func_8010A2AC","void","void"), - 0x8010A2DC:("func_8010A2DC","void","void"), + 0x8010A2DC:("func_8010A2DC","void","GlobalContext* ctxt"), 0x8010A33C:("func_8010A33C","void","GlobalContext* ctxt, s16 param_2"), 0x8010A410:("func_8010A410","void","void"), 0x8010A430:("func_8010A430","void","void"), @@ -2362,19 +2362,19 @@ 0x8012CF0C:("func_8012CF0C","void","GraphicsContext* gCtxt, int iParm2, int iParm3, unsigned int uParm4, u8 param_5, u8 param_6"), 0x8012D374:("func_8012D374","void","void"), 0x8012D40C:("func_8012D40C","void","f32* param_1, f32* param_2, s16* param_3"), - 0x8012D510:("Room_nop8012D510","void","GlobalContext* ctxt, LoadedRoom* room, UNK_PTR param_3, UNK_TYPE1 param_4"), - 0x8012D528:("Room_DrawType3Mesh","void","GlobalContext* ctxt, LoadedRoom* room, u32 flags"), - 0x8012D53C:("Room_DrawType0Mesh","void","GlobalContext* ctxt, LoadedRoom* room, u32 flags"), - 0x8012D750:("Room_DrawType2Mesh","void","GlobalContext* ctxt, LoadedRoom* room, u32 flags"), - 0x8012DEE8:("func_8012DEE8","void","GlobalContext* ctxt, LoadedRoom* room, u32 flags"), - 0x8012E254:("func_8012E254","void","void"), - 0x8012E32C:("func_8012E32C","void","GlobalContext* ctxt, LoadedRoom* room, u32 flags"), - 0x8012E6A8:("Room_DrawType1Mesh","void","GlobalContext* ctxt, LoadedRoom* room, u32 flags"), + 0x8012D510:("Room_nop8012D510","void","GlobalContext* ctxt, Room* room, UNK_PTR param_3, UNK_TYPE1 param_4"), + 0x8012D528:("Room_DrawType3Mesh","void","GlobalContext* ctxt, Room* room, u32 flags"), + 0x8012D53C:("Room_DrawType0Mesh","void","GlobalContext* ctxt, Room* room, u32 flags"), + 0x8012D750:("Room_DrawType2Mesh","void","GlobalContext* ctxt, Room* room, u32 flags"), + 0x8012DEE8:("func_8012DEE8","void","GlobalContext* ctxt, Room* room, u32 flags"), + 0x8012E254:("func_8012E254","u32","int param_1, GlobalContext* ctxt"), + 0x8012E32C:("func_8012E32C","void","GlobalContext* ctxt, Room* room, u32 flags"), + 0x8012E6A8:("Room_DrawType1Mesh","void","GlobalContext* ctxt, Room* room, u32 flags"), 0x8012E710:("Room_Init","void","GlobalContext* ctxt, RoomContext* roomCtxt"), 0x8012E750:("Room_AllocateAndLoad","u32","GlobalContext* ctxt, RoomContext* roomCtxt"), - 0x8012E96C:("Room_StartRoomTransition","unsigned int","GlobalContext* ctxt, RoomContext* roomCtxt, s32 index"), + 0x8012E96C:("Room_StartRoomTransition","s32","GlobalContext* ctxt, RoomContext* roomCtxt, s32 index"), 0x8012EAA8:("Room_HandleLoadCallbacks","s32","GlobalContext* ctxt, RoomContext* roomCtxt"), - 0x8012EBA8:("Room_DrawRoomMesh","void","GlobalContext* ctxt, LoadedRoom* room, u32 flags"), + 0x8012EBA8:("Room_Draw","void","GlobalContext* ctxt, Room* room, u32 flags"), 0x8012EBF8:("func_8012EBF8","void","GlobalContext* ctxt, RoomContext* roomCtxt"), 0x8012EC80:("func_8012EC80","unsigned int","GlobalContext* ctxt"), 0x8012ED34:("func_8012ED34","void","s16 param_1"), @@ -3878,7 +3878,7 @@ 0x801A3AEC:("func_801A3AEC","void","void"), 0x801A3B48:("func_801A3B48","void","void"), 0x801A3B90:("func_801A3B90","void","void"), - 0x801A3CD8:("func_801A3CD8","void","void"), + 0x801A3CD8:("func_801A3CD8","void","s8 param_1"), 0x801A3CF4:("func_801A3CF4","void","void"), 0x801A3D98:("func_801A3D98","void","void"), 0x801A3E38:("func_801A3E38","void","void"),