From 027086067ad998fe9db0b1e0bf6c2a2ff949a0a6 Mon Sep 17 00:00:00 2001 From: Snesrev Date: Thu, 16 Mar 2023 18:27:13 +0100 Subject: [PATCH] Doors don't close the same way as on console (Fixes #21) --- src/ida_types.h | 1 + src/sm_82.c | 4 ++-- src/sm_84.c | 2 +- src/sm_94.c | 5 ++--- src/sm_cpu_infra.c | 1 - 5 files changed, 6 insertions(+), 7 deletions(-) diff --git a/src/ida_types.h b/src/ida_types.h index 8fa354d..90d78b8 100644 --- a/src/ida_types.h +++ b/src/ida_types.h @@ -2004,6 +2004,7 @@ enum Consts_8F { addr_kRoom_cefb = 0xCEFB, addr_kRoom_dd58 = 0xDD58, addr_kRoom_dede = 0xDEDE, + addr_kDoorClosingPlmIds = 0xE68A, }; enum Consts_90 { addr_loc_908029 = 0x8029, diff --git a/src/sm_82.c b/src/sm_82.c index 37b1bac..0bf3cee 100644 --- a/src/sm_82.c +++ b/src/sm_82.c @@ -4646,11 +4646,11 @@ void LoadLevelDataAndOtherThings(void) { // 0x82E7D3 void SpawnDoorClosingPLM(void) { // 0x82E8EB if (!CheckIfColoredDoorCapSpawned()) { - uint16 *v0 = (uint16 *)RomPtr_8F(2 * door_direction - 6518); + uint16 *v0 = (uint16 *)RomPtr_8F(2 * door_direction + addr_kDoorClosingPlmIds); if (*v0) { R18_ = *v0; R20_ = *(uint16 *)&get_DoorDef(door_def_ptr)->x_pos_plm; - //SpawnRoomPLM(0x12u); // WTF? + SpawnRoomPLM(0x12u); // This reads from R18 } } } diff --git a/src/sm_84.c b/src/sm_84.c index fa08c0f..af4d181 100644 --- a/src/sm_84.c +++ b/src/sm_84.c @@ -312,7 +312,7 @@ void SpawnRoomPLM(uint16 k) { // 0x84846A if ((v1 & 0x8000u) != 0) return; } - rpe = get_RoomPlmEntry(k); + rpe = (k == 0x12) ? (RoomPlmEntry *)&R18_ : get_RoomPlmEntry(k); uint16 prod = Mult8x8(rpe->y_block, room_width_in_blocks); x_block = rpe->x_block; int v4 = v1 >> 1; diff --git a/src/sm_94.c b/src/sm_94.c index 6a94bb2..1a97782 100644 --- a/src/sm_94.c +++ b/src/sm_94.c @@ -1735,9 +1735,8 @@ uint8 BlockReact_Shootable(void) { // 0x949E73 v0 = BTS[cur_block_index]; if ((v0 & 0x80) != 0) { uint16 *kBlockShotBombGrappleReaction_ShootableBlock_RegionPlm = (uint16 *)RomPtr_94(0x9FC6); - R18_ = kBlockShotBombGrappleReaction_ShootableBlock_RegionPlm[area_index]; - uint8 *v2 = RomPtr_94(R18_); - SpawnPLM(*(uint16 *)&v2[(uint16)(2 * (v0 & 0x7F))]); + uint16 *v2 = (uint16*)RomPtr_94(kBlockShotBombGrappleReaction_ShootableBlock_RegionPlm[area_index]); + SpawnPLM(v2[v0 & 0x7f]); } else { uint16 *kBlockShotBombedReactionShootablePlm = (uint16 *)RomPtr_94(0x9ea6); SpawnPLM(kBlockShotBombedReactionShootablePlm[v0]); diff --git a/src/sm_cpu_infra.c b/src/sm_cpu_infra.c index c9e8415..9145d36 100644 --- a/src/sm_cpu_infra.c +++ b/src/sm_cpu_infra.c @@ -594,7 +594,6 @@ Snes *SnesInit(const char *filename) { { uint8 t[] = { 0x5f, 0xf7 }; PatchBytes(0x8BA362, t, sizeof(t)); } { uint8 t[] = { 0xc2, 0x20, 0x4c, 0x67, 0xa3 }; PatchBytes(0x8BF760, t, sizeof(t)); } //{ uint8 t[3] = { 0x60 }; PatchBytes(0x808028, t, 1); } // Apu_UploadBank hangs - { uint8 t[4] = { 0x0a, 0x0a, 0x0a, 0x0a }; PatchBytes(0x82E915, t, 4); } // SpawnDoorClosingPLM reads from 0x12 { uint8 t[2] = { 0x0a, 0x0a }; PatchBytes(0x8584B2, t, 2); } // HandleMessageBoxInteraction has a loop // LoadRoomPlmGfx passes bad value