diff --git a/patches/patches.h b/patches/patches.h index 0a38df9..93d4523 100644 --- a/patches/patches.h +++ b/patches/patches.h @@ -51,6 +51,7 @@ void View_ApplyInterpolate(View* view, s32 mask, bool reset_interpolation_state) void set_camera_skipped(bool skipped); void clear_camera_skipped(); bool camera_was_skipped(); +void room_load_hook(PlayState* play, Room* room); void recomp_crash(const char* err); diff --git a/patches/play_patches.c b/patches/play_patches.c index 6fb040e..8db002a 100644 --- a/patches/play_patches.c +++ b/patches/play_patches.c @@ -48,3 +48,34 @@ void Play_Main(GameState* thisx) { CutsceneManager_Update(); CutsceneManager_ClearWaiting(); } + +// @recomp Patched to add load a hook for loading rooms. +s32 Room_HandleLoadCallbacks(PlayState* play, RoomContext* roomCtx) { + if (roomCtx->status == 1) { + if (osRecvMesg(&roomCtx->loadQueue, NULL, OS_MESG_NOBLOCK) == 0) { + roomCtx->status = 0; + roomCtx->curRoom.segment = roomCtx->activeRoomVram; + gSegments[3] = OS_K0_TO_PHYSICAL(roomCtx->activeRoomVram); + + // @recomp Call the room load hook. + room_load_hook(play, &roomCtx->curRoom); + + Scene_ExecuteCommands(play, roomCtx->curRoom.segment); + func_80123140(play, GET_PLAYER(play)); + Actor_SpawnTransitionActors(play, &play->actorCtx); + + if (((play->sceneId != SCENE_IKANA) || (roomCtx->curRoom.num != 1)) && (play->sceneId != SCENE_IKNINSIDE)) { + play->envCtx.lightSettingOverride = LIGHT_SETTING_OVERRIDE_NONE; + play->envCtx.lightBlendOverride = LIGHT_BLEND_OVERRIDE_NONE; + } + func_800FEAB0(); + if (Environment_GetStormState(play) == STORM_STATE_OFF) { + Environment_StopStormNatureAmbience(play); + } + } else { + return 0; + } + } + + return 1; +} diff --git a/patches/room_patches.c b/patches/room_patches.c new file mode 100644 index 0000000..ada09e3 --- /dev/null +++ b/patches/room_patches.c @@ -0,0 +1,30 @@ +#include "patches.h" + +void room_load_hook(PlayState* play, Room* room) { + if (play->sceneId == SCENE_00KEIKOKU && room->num == 0) { + // Patch the branch commands that cause Clock Town geometry to disappear when forcing gbi branches. + extern Gfx Z2_00KEIKOKU_room_00DL_00D490[]; + extern Gfx Z2_00KEIKOKU_room_00DL_00CD70[]; + extern Gfx Z2_00KEIKOKU_room_00DL_00D9C8[]; + Gfx* command = (Gfx*)SEGMENTED_TO_K0(Z2_00KEIKOKU_room_00DL_00D490 + 1); + + if ((command[0].words.w0 >> 24) == G_RDPHALF_1 && (command[1].words.w0 >> 24) == G_BRANCH_Z) { + gSPNoOp(command + 0); + gSPNoOp(command + 1); + } + + command = (Gfx*)SEGMENTED_TO_K0(Z2_00KEIKOKU_room_00DL_00CD70 + 1); + + if ((command[0].words.w0 >> 24) == G_RDPHALF_1 && (command[1].words.w0 >> 24) == G_BRANCH_Z) { + gSPNoOp(command + 0); + gSPNoOp(command + 1); + } + + command = (Gfx*)SEGMENTED_TO_K0(Z2_00KEIKOKU_room_00DL_00D9C8 + 1); + + if ((command[0].words.w0 >> 24) == G_RDPHALF_1 && (command[1].words.w0 >> 24) == G_BRANCH_Z) { + gSPNoOp(command + 0); + gSPNoOp(command + 1); + } + } +} \ No newline at end of file