From 15092cb4b7a04b28af8f30c21658a707b31348b3 Mon Sep 17 00:00:00 2001 From: nn <53490794+nn357@users.noreply.github.com> Date: Thu, 5 Nov 2026 19:37:52 +0900 Subject: [PATCH 1/9] overhaul extended message boxes. Instead of just hooking the vanilla calls and repointing just extend the table and repoint data 1. spinlock patch overlapped so moved it 2. missile refill all patched "missile" with ammo, this is now done in rust and the patch range is either vanilla or extended if using the extended messageboxes patch 3. some tile patching was done in max_ammo_display_fast, this has been applied to the vanilla .ttb / extended message boxes so is removed from that patch. --- .../HUD_Expansion/Data/Opaque/messages.ttb | Bin 3780 -> 3780 bytes patches/src/extended_msg_boxes.asm | 247 +++++++++++++----- patches/src/max_ammo_display_fast.asm | 21 +- patches/src/missile_refill_all.asm | 7 +- patches/src/spin_lock.asm | 4 +- rust/maprando/src/patch.rs | 23 +- 6 files changed, 206 insertions(+), 96 deletions(-) diff --git a/patches/src/HUD_Expansion/Data/Opaque/messages.ttb b/patches/src/HUD_Expansion/Data/Opaque/messages.ttb index 3b5a2792b4c2ade0d1e7859d541d957275bfc5f6..381c7490e6102e5e950e0588c1b562eb241644ff 100644 GIT binary patch delta 64 zcmX>idqj4^B^G`Seuaq>R3`qCVDmKaGVnH-EWx;E;yjtj9~f0wObkqce5M@}Cs=U5 U)Oe-wT7zH1%)o53F!M%k0Lq~iY5)KL delta 72 zcmX>idqj4^B{pvZPXq6Qi4&A2{*qwxG4L|*DVQw5xQE5Wzyu^Z`4^)Ui>ZMrP>^W{ Yi?YybcN diff --git a/patches/src/extended_msg_boxes.asm b/patches/src/extended_msg_boxes.asm index 594a8a297a..a73a46a554 100644 --- a/patches/src/extended_msg_boxes.asm +++ b/patches/src/extended_msg_boxes.asm @@ -1,72 +1,189 @@ -; Message box handler for custom dialog boxes (walljump boots / split speed etc) -; This is separate to the crash dialog handler which intercepts the messagebox routine earlier. +;;; Extended messageboxes for custom PLMS +;;; This extends the available messsagebox definitions table and moves the other tables down, repoints the instructions that referenced the old table. +;;; nn357 -lorom +;;; repoint to new tables: -!bank_85_free_space_start = $8596B0 -!bank_85_free_space_end = $859800 +org $858412 + lda SpecialButtonOffset, x -;;; extended message box table references for custom plm boxes: +org $85869B ;;; $869B: Message definitions ;; -org $858243 - jmp hook_item_id - -org $8582f1 - jsr hook_tilemap - -org !bank_85_free_space_start -hook_item_id: - lda $1c1f ; replaced code - cmp #$001e ; wall-jump boots or higher? - bcc .original - pha - sbc #$001E - asl - sta $95 - asl - clc - adc $95 - clc - adc #(message_box_table-$869b) - tax - pla - jmp $824f ; do ptr calls +dw $8436,$8289,MsgTilemap_Etank, ; 1: Energy tank + $83C5,$825A,MsgTilemap_Missile, ; 2: Missile + $83C5,$825A,MsgTilemap_Super, ; 3: Super missile + $83C5,$825A,MsgTilemap_PB, ; 4: Power bomb + $83C5,$825A,MsgTilemap_Grapple, ; 5: Grappling beam + $83CC,$825A,MsgTilemap_Xray, ; 6: X-ray scope + $8436,$8289,MsgTilemap_Varia, ; 7: Varia suit + $8436,$8289,MsgTilemap_Spring, ; 8: Spring ball + $8436,$8289,MsgTilemap_Morph, ; 9: Morphing ball + $8436,$8289,MsgTilemap_Screw, ; Ah: Screw attack + $8436,$8289,MsgTilemap_Hijump, ; Bh: Hi-jump boots + $8436,$8289,MsgTilemap_Space, ; Ch: Space jump + $83CC,$825A,MsgTilemap_Speed, ; Dh: Speed booster + $8436,$8289,MsgTilemap_Charge, ; Eh: Charge beam + $8436,$8289,MsgTilemap_Ice, ; Fh: Ice beam + $8436,$8289,MsgTilemap_Wave, ; 10h: Wave beam + $8436,$8289,MsgTilemap_Spazer, ; 11h: Spazer + $8436,$8289,MsgTilemap_Plasma, ; 12h: Plasma beam + $83C5,$825A,MsgTilemap_Bomb, ; 13h: Bomb + $8436,$8289,MsgTilemap_Map_complete, ; 14h: Map data access completed + $8436,$8289,MsgTilemap_Energy_complete, ; 15h: Energy recharge completed + $8436,$8289,MsgTilemap_Reload_complete, ; 16h: Missile reload completed + $8441,$8289,MsgTilemap_Saveyn, ; 17h: Would you like to save? + $8436,$8289,MsgTilemap_Save_complete, ; 18h: Save completed + $8436,$8289,MsgTilemap_Reserve, ; 19h: Reserve tank + $8436,$8289,MsgTilemap_Gravity, ; 1Ah: Gravity suit + $8436,$8289,MsgTilemap_Terminator, ; 1Bh: Terminator + $8441,$8289,MsgTilemap_Saveyn, ; 1Ch: Would you like to save? (Used by gunship) + $8436,$8289,MsgTilemap_Save_complete, ; 1Dh: Terminator. (Save completed, unused) + $8436,$8289,MsgTilemap_WallJump, ; 1Eh: Walljump boots + $83CC,$825A,MsgTilemap_BlueBooster, ; 1Fh: Blue booster + $83CC,$825A,MsgTilemap_SparkBooster, ; 20h: Spark booster + $8436,$8289,MsgTilemap_Reserved1, ; 21h: Reserved + $8436,$8289,MsgTilemap_Reserved2, ; 22h: Reserved + $8436,$8289,MsgTilemap_Reserved3, ; 23h: Reserved + $8436,$8289,MsgTilemap_End ; 24h: Terminator -.original - jmp $8246 ; resume normal func +SpecialButtonOffset: +dw $0000, ; 1: Energy tank + $012A, ; 2: Missile + $012A, ; 3: Super missile + $012C, ; 4: Power bomb + $012C, ; 5: Grappling beam + $012C, ; 6: X-ray scope + $0000, ; 7: Varia suit + $0000, ; 8: Spring ball + $0000, ; 9: Morphing ball + $0000, ; Ah: Screw attack + $0000, ; Bh: Hi-jump boots + $0000, ; Ch: Space jump + $0120, ; Dh: Speed booster + $0000, ; Eh: Charge beam + $0000, ; Fh: Ice beam + $0000, ; 10h: Wave beam + $0000, ; 11h: Spazer + $0000, ; 12h: Plasma beam + $012A, ; 13h: Bomb + $0000, ; 14h: Map data access completed + $0000, ; 15h: Energy recharge completed + $0000, ; 16h: Missile reload completed + $0000, ; 17h: Would you like to save? + $0000, ; 18h: Save completed + $0000, ; 19h: Reserve tank + $0000, ; 1Ah: Gravity suit + $0000, ; 1Bh: Dummy + $0000, ; 1Ch: Would you like to save? (gunship) + $0000, ; 1Dh: Save completed (unused) + $0000, ; 1Eh: Walljump boots + $0120, ; 1Fh: Blue booster + $0120, ; 20h: Spark booster + $0000, ; 21h: Reserved (small msg box) + $0000, ; 22h: Reserved (small msg box) + $0000, ; 23h: Reserved (small msg box) + $0000 ; 24h: Terminator - -hook_tilemap: - cpx #$00ae ; wall-jump boots? - bcc .orig - cpx #$00bb ; higher than blue booster? (crash dialogs) - bcs .orig - txa - sec - sbc #$00ae - clc - adc #(message_box_table+4-$869f) - tax -.orig - clc - lda $869f,x ; replaced code - rts - -;;; (message box table, relocated from $85869B): -message_box_table: - dw $8436, $8289, wjb ; 1Eh: Wall-jump boots. - dw $8436, $8289, sparkbooster ; 1Fh: Spark Booster. - dw $8436, $8289, bluebooster ; 20h: Blue Booster. - dw $8436, $8289, msg_end ; 21h: Terminator. - -wjb: ; walljump boots +MsgTilemaps: +MsgTilemap_Etank: + dw $000E, $000E, $000E, $000E, $000E, $000E, $280F, $280F, $280F, $280F, $28C4, $28CD, $28C4, $28D1, $28C6, $28D8, $280F, $28D3, $28C0, $28CD, $28CA, $280F, $280F, $280F, $280F, $000E, $000E, $000E, $000E, $000E, $000E, $000E +MsgTilemap_Missile: + dw $000E, $000E, $000E, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $28CC, $28C8, $28D2, $28D2, $28C8, $28CB, $28C4, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $000E, $000E, $000E + dw $000E, $000E, $000E, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $000E, $000E, $000E + dw $000E, $000E, $000E, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $000E, $000E, $000E + dw $000E, $000E, $000E, $280F, $280F, $28E9, $28EA, $28EB, $280F, $3049, $304A, $304B, $280F, $28F8, $280F, $28E0, $28E1, $28E2, $28F0, $28F1, $28FE, $28C0, $28FF, $28E5, $28E6, $28E7, $28FB, $280F, $280F, $000E, $000E, $000E +MsgTilemap_Super: + dw $000E, $000E, $000E, $280F, $280F, $280F, $280F, $280F, $280F, $28D2, $28D4, $28CF, $28C4, $28D1, $280F, $28CC, $28C8, $28D2, $28D2, $28C8, $28CB, $28C4, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $000E, $000E, $000E + dw $000E, $000E, $000E, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $000E, $000E, $000E + dw $000E, $000E, $000E, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $000E, $000E, $000E + dw $000E, $000E, $000E, $280F, $280F, $280F, $28E9, $28EA, $28EB, $280F, $3034, $3035, $280F, $28F8, $280F, $28E0, $28E1, $28E2, $28F0, $28F1, $28FE, $3CC1, $28FF, $28E5, $28E6, $28E7, $28FB, $280F, $280F, $000E, $000E, $000E +MsgTilemap_PB: + dw $000E, $000E, $000E, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $28CF, $28CE, $28D6, $28C4, $28D1, $280F, $28C1, $28CE, $28CC, $28C1, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $000E, $000E, $000E + dw $000E, $000E, $000E, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $000E, $000E, $000E + dw $000E, $000E, $000E, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $000E, $000E, $000E + dw $000E, $000E, $000E, $280F, $28E9, $28EA, $28EB, $280F, $3036, $7036, $280F, $28F8, $280F, $28F5, $28F6, $28F7, $280F, $28EE, $28EF, $28F0, $28F1, $28FE, $38D1, $28FF, $28E5, $28E6, $28E7, $28FB, $280F, $000E, $000E, $000E +MsgTilemap_Grapple: + dw $000E, $000E, $000E, $280F, $280F, $280F, $280F, $280F, $280F, $28C6, $28D1, $28C0, $28CF, $28CF, $28CB, $28C8, $28CD, $28C6, $280F, $28C1, $28C4, $28C0, $28CC, $280F, $280F, $280F, $280F, $280F, $280F, $000E, $000E, $000E + dw $000E, $000E, $000E, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $000E, $000E, $000E + dw $000E, $000E, $000E, $280F, $280F, $280F, $280F, $280F, $3038, $7038, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $000E, $000E, $000E + dw $000E, $000E, $000E, $280F, $28E9, $28EA, $28EB, $280F, $3039, $7039, $280F, $28E0, $28E1, $28E2, $280F, $28F8, $280F, $28E3, $28E4, $28F0, $28F1, $28FE, $38D8, $28FF, $28E5, $28E6, $28E7, $28FB, $280F, $000E, $000E, $000E +MsgTilemap_Xray: + dw $000E, $000E, $000E, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $28D7, $28DD, $28D1, $28C0, $28D8, $280F, $28D2, $28C2, $28CE, $28CF, $28C4, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $000E, $000E, $000E + dw $000E, $000E, $000E, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $000E, $000E, $000E + dw $000E, $000E, $000E, $280F, $280F, $280F, $280F, $280F, $303A, $703A, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $000E, $000E, $000E + dw $000E, $000E, $000E, $280F, $28E9, $28EA, $28EB, $280F, $303B, $703B, $280F, $28E0, $28E1, $28E2, $280F, $28F8, $280F, $28E3, $28E4, $28F0, $28F1, $28FE, $2CD7, $28FF, $28E5, $28E6, $28E7, $28FB, $280F, $000E, $000E, $000E +MsgTilemap_Varia: + dw $000E, $000E, $000E, $000E, $000E, $000E, $280F, $280F, $280F, $280F, $28D5, $28C0, $28D1, $28C8, $28C0, $280F, $28D2, $28D4, $28C8, $28D3, $280F, $280F, $280F, $280F, $280F, $000E, $000E, $000E, $000E, $000E, $000E, $000E +MsgTilemap_Spring: + dw $000E, $000E, $000E, $000E, $000E, $000E, $280F, $280F, $280F, $280F, $28D2, $28CF, $28D1, $28C8, $28CD, $28C6, $280F, $28C1, $28C0, $28CB, $28CB, $280F, $280F, $280F, $280F, $000E, $000E, $000E, $000E, $000E, $000E, $000E +MsgTilemap_Morph: + dw $000E, $000E, $000E, $000E, $000E, $000E, $280F, $280F, $280F, $28CC, $28CE, $28D1, $28CF, $28C7, $28C8, $28CD, $28C6, $280F, $28C1, $28C0, $28CB, $28CB, $280F, $280F, $280F, $000E, $000E, $000E, $000E, $000E, $000E, $000E +MsgTilemap_Screw: + dw $000E, $000E, $000E, $000E, $000E, $000E, $280F, $280F, $280F, $28D2, $28C2, $28D1, $28C4, $28D6, $280F, $28C0, $28D3, $28D3, $28C0, $28C2, $28CA, $280F, $280F, $280F, $280F, $000E, $000E, $000E, $000E, $000E, $000E, $000E +MsgTilemap_Hijump: + dw $000E, $000E, $000E, $000E, $000E, $000E, $280F, $280F, $280F, $28C7, $28C8, $28DD, $28C9, $28D4, $28CC, $28CF, $280F, $28C1, $28CE, $28CE, $28D3, $28D2, $280F, $280F, $280F, $000E, $000E, $000E, $000E, $000E, $000E, $000E +MsgTilemap_Space: + dw $000E, $000E, $000E, $000E, $000E, $000E, $280F, $280F, $280F, $280F, $28D2, $28CF, $28C0, $28C2, $28C4, $280F, $28C9, $28D4, $28CC, $28CF, $280F, $280F, $280F, $280F, $280F, $000E, $000E, $000E, $000E, $000E, $000E, $000E +MsgTilemap_Speed: + dw $000E, $000E, $000E, $280F, $280F, $280F, $280F, $280F, $280F, $28D2, $28CF, $28C4, $28C4, $28C3, $280F, $28C1, $28CE, $28CE, $28D2, $28D3, $28C4, $28D1, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $000E, $000E, $000E + dw $000E, $000E, $000E, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $000E, $000E, $000E + dw $000E, $000E, $000E, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $000E, $000E, $000E + dw $000E, $000E, $000E, $280F, $280F, $28E0, $28E1, $28E2, $280F, $28F8, $280F, $28E3, $28E4, $28F0, $28F1, $28FE, $38FA, $28FF, $28E5, $28E6, $28E7, $280F, $28F2, $280F, $28EC, $28ED, $28FB, $280F, $280F, $000E, $000E, $000E +MsgTilemap_Charge: + dw $000E, $000E, $000E, $000E, $000E, $000E, $280F, $280F, $280F, $280F, $28C2, $28C7, $28C0, $28D1, $28C6, $28C4, $280F, $28C1, $28C4, $28C0, $28CC, $280F, $280F, $280F, $280F, $000E, $000E, $000E, $000E, $000E, $000E, $000E +MsgTilemap_Ice: + dw $000E, $000E, $000E, $000E, $000E, $000E, $280F, $280F, $280F, $280F, $280F, $28C8, $28C2, $28C4, $280F, $28C1, $28C4, $28C0, $28CC, $280F, $280F, $280F, $280F, $280F, $280F, $000E, $000E, $000E, $000E, $000E, $000E, $000E +MsgTilemap_Wave: + dw $000E, $000E, $000E, $000E, $000E, $000E, $280F, $280F, $280F, $280F, $280F, $28D6, $28C0, $28D5, $28C4, $280F, $28C1, $28C4, $28C0, $28CC, $280F, $280F, $280F, $280F, $280F, $000E, $000E, $000E, $000E, $000E, $000E, $000E +MsgTilemap_Spazer: + dw $000E, $000E, $000E, $000E, $000E, $000E, $280F, $280F, $280F, $280F, $280F, $280F, $28D2, $28CF, $28C0, $28D9, $28C4, $28D1, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $000E, $000E, $000E, $000E, $000E, $000E, $000E +MsgTilemap_Plasma: + dw $000E, $000E, $000E, $000E, $000E, $000E, $280F, $280F, $280F, $280F, $28CF, $28CB, $28C0, $28D2, $28CC, $28C0, $280F, $28C1, $28C4, $28C0, $28CC, $280F, $280F, $280F, $280F, $000E, $000E, $000E, $000E, $000E, $000E, $000E +MsgTilemap_Bomb: + dw $000E, $000E, $000E, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $28C1, $28CE, $28CC, $28C1, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $000E, $000E, $000E + dw $000E, $000E, $000E, $280F, $280F, $28B0, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $000E, $000E, $000E + dw $000E, $000E, $000E, $280F, $280F, $28B1, $28B3, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $000E, $000E, $000E + dw $000E, $000E, $000E, $280F, $280F, $28B2, $3CFC, $38FD, $3CF9, $280F, $28F8, $280F, $28F5, $28F6, $28F7, $280F, $28EE, $28EF, $28F0, $28F1, $28FE, $38CB, $28FF, $28E5, $28E6, $28E7, $28FB, $280F, $280F, $000E, $000E, $000E +MsgTilemap_Map_complete: + dw $000E, $000E, $000E, $000E, $000E, $000E, $3C0F, $3C0F, $3CCC, $3CC0, $3CCF, $3C0F, $3CC3, $3CC0, $3CD3, $3CC0, $3C0F, $3CC0, $3CC2, $3CC2, $3CC4, $3CD2, $3CD2, $3C0F, $3C0F, $000E, $000E, $000E, $000E, $000E, $000E, $000E + dw $000E, $000E, $000E, $000E, $000E, $000E, $3C0F, $3C0F, $3C0F, $3C0F, $3C0F, $3C0F, $3C0F, $3C0F, $3C0F, $3C0F, $3C0F, $3C0F, $3C0F, $3C0F, $3C0F, $3C0F, $3C0F, $3C0F, $3C0F, $000E, $000E, $000E, $000E, $000E, $000E, $000E + dw $000E, $000E, $000E, $000E, $000E, $000E, $3C0F, $3C0F, $3C0F, $3C0F, $3CC2, $3CCE, $3CCC, $3CCF, $3CCB, $3CC4, $3CD3, $3CC4, $3CC3, $3CDA, $3C0F, $3C0F, $3C0F, $3C0F, $3C0F, $000E, $000E, $000E, $000E, $000E, $000E, $000E +MsgTilemap_Energy_complete: + dw $000E, $000E, $000E, $000E, $000E, $000E, $3C0F, $3C0F, $3CC4, $3CCD, $3CC4, $3CD1, $3CC6, $3CD8, $3C0F, $3CD1, $3CC4, $3CC2, $3CC7, $3CC0, $3CD1, $3CC6, $3CC4, $3C0F, $3C0F, $000E, $000E, $000E, $000E, $000E, $000E, $000E + dw $000E, $000E, $000E, $000E, $000E, $000E, $3C0F, $3C0F, $3C0F, $3C0F, $3C0F, $3C0F, $3C0F, $3C0F, $3C0F, $3C0F, $3C0F, $3C0F, $3C0F, $3C0F, $3C0F, $3C0F, $3C0F, $3C0F, $3C0F, $000E, $000E, $000E, $000E, $000E, $000E, $000E + dw $000E, $000E, $000E, $000E, $000E, $000E, $3C0F, $3C0F, $3C0F, $3C0F, $3CC2, $3CCE, $3CCC, $3CCF, $3CCB, $3CC4, $3CD3, $3CC4, $3CC3, $3CDA, $3C0F, $3C0F, $3C0F, $3C0F, $3C0F, $000E, $000E, $000E, $000E, $000E, $000E, $000E +MsgTilemap_Reload_complete: + dw $000E, $000E, $000E, $000E, $000E, $000E, $2C0F, $2C0F, $2C0F, $2CCC, $2CC8, $2CD2, $2CD2, $2CC8, $2CCB, $2CC4, $2C0F, $2CD1, $2CC4, $2CCB, $2CCE, $2CC0, $2CC3, $2C0F, $2C0F, $000E, $000E, $000E, $000E, $000E, $000E, $000E + dw $000E, $000E, $000E, $000E, $000E, $000E, $3C0F, $3C0F, $380F, $380F, $380F, $380F, $380F, $380F, $380F, $380F, $380F, $380F, $380F, $380F, $380F, $380F, $3C0F, $3C0F, $3C0F, $000E, $000E, $000E, $000E, $000E, $000E, $000E + dw $000E, $000E, $000E, $000E, $000E, $000E, $3C0F, $3C0F, $380F, $380F, $3C0F, $3CC2, $3CCE, $3CCC, $3CCF, $3CCB, $3CC4, $3CD3, $3CC4, $3CC3, $3CDA, $3C0F, $3C0F, $3C0F, $3C0F, $000E, $000E, $000E, $000E, $000E, $000E, $000E +MsgTilemap_Saveyn: + dw $000E, $000E, $000E, $000E, $000E, $000E, $3C0F, $3C0F, $3CD6, $3CCE, $3CD4, $3CCB, $3CC3, $3C0F, $3CD8, $3CCE, $3CD4, $3C0F, $3CCB, $3CC8, $3CCA, $3CC4, $3C0F, $3C0F, $3C0F, $000E, $000E, $000E, $000E, $000E, $000E, $000E + dw $000E, $000E, $000E, $000E, $000E, $000E, $3C0F, $3C0F, $3CD3, $3CCE, $3C0F, $3CD2, $3CC0, $3CD5, $3CC4, $3CDE, $3C0F, $3C0F, $3C0F, $3C0F, $3C0F, $3C0F, $3C0F, $3C0F, $3C0F, $000E, $000E, $000E, $000E, $000E, $000E, $000E + dw $000E, $000E, $000E, $000E, $000E, $000E, $3C0F, $3C0F, $3C0F, $3C0F, $3C0F, $3C0F, $3C0F, $3C0F, $3C0F, $3C0F, $3C0F, $3C0F, $3C0F, $3C0F, $3C0F, $3C0F, $3C0F, $3C0F, $3C0F, $000E, $000E, $000E, $000E, $000E, $000E, $000E + dw $000E, $000E, $000E, $000E, $000E, $000E, $3C0F, $3C0F, $38FC, $38FD, $3CD8, $3CC4, $3CD2, $3C0F, $3C0F, $3C0F, $3C0F, $3C0F, $3C0F, $2CCD, $2CCE, $3C0F, $3C0F, $3C0F, $3C0F, $000E, $000E, $000E, $000E, $000E, $000E, $000E +MsgTilemap_Save_complete: + dw $000E, $000E, $000E, $000E, $000E, $000E, $3C0F, $3C0F, $3CD2, $3CC0, $3CD5, $3CC4, $3C0F, $3CC2, $3CCE, $3CCC, $3CCF, $3CCB, $3CC4, $3CD3, $3CC4, $3CC3, $3CDA, $3C0F, $3C0F, $000E, $000E, $000E, $000E, $000E, $000E, $000E +MsgTilemap_Reserve: + dw $000E, $000E, $000E, $000E, $000E, $000E, $280F, $280F, $280F, $28D1, $28C4, $28D2, $28C4, $28D1, $28D5, $28C4, $280F, $28D3, $28C0, $28CD, $28CA, $280F, $280F, $280F, $280F, $000E, $000E, $000E, $000E, $000E, $000E, $000E +MsgTilemap_Gravity: + dw $000E, $000E, $000E, $000E, $000E, $000E, $280F, $280F, $280F, $28C6, $28D1, $28C0, $28D5, $28C8, $28D3, $28D8, $280F, $28D2, $28D4, $28C8, $28D3, $280F, $280F, $280F, $280F, $000E, $000E, $000E, $000E, $000E, $000E, $000E +MsgTilemap_Terminator: +MsgTilemap_WallJump: dw $000E, $000E, $000E, $000E, $000E, $000E, $2C0F, $2C0F, $2CD6, $2CC0, $2CCB, $2CCB, $2CDD, $2CC9, $2CD4, $2CCC, $2CCF, $2C0F, $2CC1, $2CCE, $2CCE, $2CD3, $2CD2, $2C0F, $2C0F, $000E, $000E, $000E, $000E, $000E, $000E, $000E -sparkbooster: ;spark booster - dw $000E, $000E, $000E, $000E, $000E, $000E, $2C0F, $2C0F, $2C0F, $2CD2, $2CCF, $2CC0, $2CD1, $2CCA, $2C0F, $2CC1, $2CCE, $2CCE, $2CD2, $2CD3, $2CC4, $2CD1, $2C0F, $2C0F, $2C0F, $000E, $000E, $000E, $000E, $000E, $000E, $000E -bluebooster: ;blue booster - dw $000E, $000E, $000E, $000E, $000E, $000E, $2C0F, $2C0F, $2C0F, $2C0F, $2CC1, $2CCB, $2CD4, $2CC4, $2C0F, $2CC1, $2CCE, $2CCE, $2CD2, $2CD3, $2CC4, $2CD1, $2C0F,$2C0F, $2C0F, $000E, $000E, $000E, $000E, $000E, $000E, $000E - -msg_end: - dw $0000 - -assert pc() <= !bank_85_free_space_end +MsgTilemap_BlueBooster: + dw $000E, $000E, $000E, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2CC1, $2CCB, $2CD4, $2CC4, $2C0F, $2CC1, $2CCE, $2CCE, $2CD2, $2CD3, $2CC4, $2CD1, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $000E, $000E, $000E + dw $000E, $000E, $000E, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $000E, $000E, $000E + dw $000E, $000E, $000E, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $000E, $000E, $000E + dw $000E, $000E, $000E, $280F, $280F, $28E0, $28E1, $28E2, $280F, $28F8, $280F, $28E3, $28E4, $28F0, $28F1, $28FE, $38FA, $28FF, $28E5, $28E6, $28E7, $280F, $28F2, $280F, $28EC, $28ED, $28FB, $280F, $280F, $000E, $000E, $000E +MsgTilemap_SparkBooster: + dw $000E, $000E, $000E, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2CD2, $2CCF, $2CC0, $2CD1, $2CCA, $2C0F, $2CC1, $2CCE, $2CCE, $2CD2, $2CD3, $2CC4, $2CD1, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $000E, $000E, $000E + dw $000E, $000E, $000E, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $000E, $000E, $000E + dw $000E, $000E, $000E, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $000E, $000E, $000E + dw $000E, $000E, $000E, $280F, $280F, $28E0, $28E1, $28E2, $280F, $28F8, $280F, $28E3, $28E4, $28F0, $28F1, $28FE, $38FA, $28FF, $28E5, $28E6, $28E7, $280F, $28F2, $280F, $28EC, $28ED, $28FB, $280F, $280F, $000E, $000E, $000E +MsgTilemap_Reserved1: + dw $000E, $000E, $000E, $000E, $000E, $000E, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $000E, $000E, $000E, $000E, $000E, $000E, $000E +MsgTilemap_Reserved2: + dw $000E, $000E, $000E, $000E, $000E, $000E, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $000E, $000E, $000E, $000E, $000E, $000E, $000E +MsgTilemap_Reserved3: + dw $000E, $000E, $000E, $000E, $000E, $000E, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $000E, $000E, $000E, $000E, $000E, $000E, $000E +MsgTilemap_End: \ No newline at end of file diff --git a/patches/src/max_ammo_display_fast.asm b/patches/src/max_ammo_display_fast.asm index 5b680c83c2..549809c847 100644 --- a/patches/src/max_ammo_display_fast.asm +++ b/patches/src/max_ammo_display_fast.asm @@ -404,26 +404,7 @@ HUD_digits_tilemap_row1: dw $0000, $0001, $0002, $0003, $0004, $0005, $0006, $0007, $0008, $0009 -warnpc !bank_80_free_space_end - -;;; 85/ MISSILE/SUPER/POWER BOMB message tilemaps -org $858851 - dw $280F, $280F, $280F - -org $858891 - dw $3049, $304A, $304B - -org $858951 - dw $280F, $280F, $280F - -org $858993 - dw $3034, $3035 - -org $858A4F - dw $280F, $280F - -org $858A8F - dw $3036, $7036 +assert pc() <= !bank_80_free_space_end ;;; 9A/$B200: Standard BG3 tiles ;;; org $9AB542 diff --git a/patches/src/missile_refill_all.asm b/patches/src/missile_refill_all.asm index 3f7acddb28..6199298203 100644 --- a/patches/src/missile_refill_all.asm +++ b/patches/src/missile_refill_all.asm @@ -53,9 +53,4 @@ fill_ammo: sta $09CE rts -assert pc() <= !bank_84_free_space_end - -; change MISSILE to AMMO -org $8592FF - dw $000E, $000E, $000E, $000E, $000E, $000E, $2C0F, $2C0F, $2C0F, $2C0F, $2CC0, $2CCC, $2CCC, $2CCE, $2C0F, $2CD1, $2CC4, $2CCB, $2CCE, $2CC0, $2CC3, $2C0F, $2C0F, $2C0F, $2C0F, $2C0E, $000E, $000E, $000E, $000E, $000E, $000E -assert pc() <= $8593BF \ No newline at end of file +assert pc() <= !bank_84_free_space_end \ No newline at end of file diff --git a/patches/src/spin_lock.asm b/patches/src/spin_lock.asm index c580943d51..28ad399f40 100644 --- a/patches/src/spin_lock.asm +++ b/patches/src/spin_lock.asm @@ -1,5 +1,5 @@ -!bank_85_free_space_start = $859800 -!bank_85_free_space_end = $859880 +!bank_85_free_space_start = $85A050 +!bank_85_free_space_end = $85A077 incsrc "constants.asm" diff --git a/rust/maprando/src/patch.rs b/rust/maprando/src/patch.rs index f01518c0e2..07b8cb83c8 100644 --- a/rust/maprando/src/patch.rs +++ b/rust/maprando/src/patch.rs @@ -621,12 +621,29 @@ impl Patcher<'_> { } } - if self.settings.other_settings.wall_jump == WallJump::Collectible - || self.settings.other_settings.speed_booster == SpeedBooster::Split - { + let extended_msg_boxes = self.settings.other_settings.wall_jump == WallJump::Collectible + || self.settings.other_settings.speed_booster == SpeedBooster::Split; + if extended_msg_boxes { patches.push("extended_msg_boxes"); } + if self.settings.quality_of_life_settings.ammo_refill_all { + let base = if extended_msg_boxes { + 0x85933B + } else { + 0x8592FF + }; + let ammo_row: [u16; 32] = [ + 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x2C0F, 0x2C0F, 0x2C0F, 0x2C0F, + 0x2CC0, 0x2CCC, 0x2CCC, 0x2CCE, 0x2C0F, 0x2CD1, 0x2CC4, 0x2CCB, 0x2CCE, 0x2CC0, + 0x2CC3, 0x2C0F, 0x2C0F, 0x2C0F, 0x2C0F, 0x2C0E, 0x000E, 0x000E, 0x000E, 0x000E, + 0x000E, 0x000E, + ]; + for (i, &word) in ammo_row.iter().enumerate() { + self.rom.write_u16(snes2pc(base) + i * 2, word as isize)?; + } + } + match self.settings.quality_of_life_settings.etank_refill { ETankRefill::Disabled => { patches.push("etank_refill_disabled"); From 8df99db47bff926ae216080bc539f18fdbd188ae Mon Sep 17 00:00:00 2001 From: nn <53490794+nn357@users.noreply.github.com> Date: Thu, 5 Nov 2026 19:40:12 +0900 Subject: [PATCH 2/9] update patch --- patches/rom_map/Bank 85.txt | 7 +++---- patches/src/spin_lock.asm | 2 +- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/patches/rom_map/Bank 85.txt b/patches/rom_map/Bank 85.txt index ff56a4d64e..0278b5cc1e 100644 --- a/patches/rom_map/Bank 85.txt +++ b/patches/rom_map/Bank 85.txt @@ -1,12 +1,11 @@ -9643 - 96AF: [FREE] -96B0 - 97C1: ; extended_msg_boxes.asm -9800 - 9827: ; spin_lock.asm +9643 - 987B: ; extended_msg_boxes.asm 9880 - 993A: ; fast_reload.asm 9980 - 9A23: ; stats.asm 9B00 - 9B1B: ; fix_hyper_slowlock.asm 9B20 - 9FEF: ; pause_menu_objectives.asm 9FF0 - A012: ; vanilla_fanfare_stop_sounds.asm -A050 - A0FF: [FREE] +A050 - A07A: ; spin_lock.asm +A07B - A0FF: [FREE] A100 - A16A: ; fix_transition_bad_tiles.asm A1D6 - A23C: ; special_door_reveal.asm A280 - A283: ; map_area.asm diff --git a/patches/src/spin_lock.asm b/patches/src/spin_lock.asm index 28ad399f40..0e6d8b9479 100644 --- a/patches/src/spin_lock.asm +++ b/patches/src/spin_lock.asm @@ -1,5 +1,5 @@ !bank_85_free_space_start = $85A050 -!bank_85_free_space_end = $85A077 +!bank_85_free_space_end = $85A07A incsrc "constants.asm" From 6c6b1211c3adeee7ac94bdb0b451f1b4e9288224 Mon Sep 17 00:00:00 2001 From: nn <53490794+nn357@users.noreply.github.com> Date: Thu, 5 Nov 2026 19:50:59 +0900 Subject: [PATCH 3/9] move fast reload --- patches/src/extended_msg_boxes.asm | 3 ++- patches/src/fast_reload.asm | 5 +++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/patches/src/extended_msg_boxes.asm b/patches/src/extended_msg_boxes.asm index a73a46a554..8be249f393 100644 --- a/patches/src/extended_msg_boxes.asm +++ b/patches/src/extended_msg_boxes.asm @@ -186,4 +186,5 @@ MsgTilemap_Reserved2: dw $000E, $000E, $000E, $000E, $000E, $000E, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $000E, $000E, $000E, $000E, $000E, $000E, $000E MsgTilemap_Reserved3: dw $000E, $000E, $000E, $000E, $000E, $000E, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $000E, $000E, $000E, $000E, $000E, $000E, $000E -MsgTilemap_End: \ No newline at end of file +MsgTilemap_End: +print pc \ No newline at end of file diff --git a/patches/src/fast_reload.asm b/patches/src/fast_reload.asm index afaf372b77..4555ebcb8a 100644 --- a/patches/src/fast_reload.asm +++ b/patches/src/fast_reload.asm @@ -10,8 +10,8 @@ arch 65816 !bank_80_free_space_end = $80d330 !bank_82_free_space_start = $82FE70 !bank_82_free_space_end = $82FE80 -!bank_85_free_space_start = $859880 -!bank_85_free_space_end = $859980 +!bank_85_free_space_start = $85c900 +!bank_85_free_space_end = $85cC9DF !savestate_button_combo = $82FE78 ; This should be inside free space, and also consistent with reference in customize.rs !loadstate_button_combo = $82FE7A ; This should be inside free space, and also consistent with reference in customize.rs @@ -188,6 +188,7 @@ hook_main: pea $f70d ; $82f70e = rtl jml !deathhook82 +print pc assert pc() <= !bank_85_free_space_end org !spin_lock_button_combo From e5c49a791f9f4af20425cb8e33fd407e18cb3d85 Mon Sep 17 00:00:00 2001 From: nn <53490794+nn357@users.noreply.github.com> Date: Thu, 5 Nov 2026 20:01:31 +0900 Subject: [PATCH 4/9] add exception --- patches/rom_map/Bank 85.txt | 4 ++-- patches/src/spin_lock.asm | 2 +- scripts/build_ips.py | 6 +++++- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/patches/rom_map/Bank 85.txt b/patches/rom_map/Bank 85.txt index 0278b5cc1e..8cf77fff45 100644 --- a/patches/rom_map/Bank 85.txt +++ b/patches/rom_map/Bank 85.txt @@ -1,5 +1,4 @@ -9643 - 987B: ; extended_msg_boxes.asm -9880 - 993A: ; fast_reload.asm +9643 - 98BB: ; extended_msg_boxes.asm 9980 - 9A23: ; stats.asm 9B00 - 9B1B: ; fix_hyper_slowlock.asm 9B20 - 9FEF: ; pause_menu_objectives.asm @@ -22,3 +21,4 @@ AEE0 - B599: ; crash_handle_base.asm B600 - B93E: ; map_area.asm C000 - C450: ; savestate.asm C500 - C900: ; pause_menu_objectives.asm +C900 - C9EF: ; fast_reload.asm \ No newline at end of file diff --git a/patches/src/spin_lock.asm b/patches/src/spin_lock.asm index 0e6d8b9479..726a0d731b 100644 --- a/patches/src/spin_lock.asm +++ b/patches/src/spin_lock.asm @@ -34,4 +34,4 @@ hook_spin_lock: lda $0A1C asl A rtl -warnpc !bank_85_free_space_end +assert pc() <= !bank_85_free_space_end diff --git a/scripts/build_ips.py b/scripts/build_ips.py index 72b74b0451..3eedd2343f 100644 --- a/scripts/build_ips.py +++ b/scripts/build_ips.py @@ -139,7 +139,11 @@ def check_range(filename, other_filename, overlap_start, overlap_end): ['max_ammo_display_fast', 0x858851, 0x858A93], ['max_ammo_display_fast', 0x9AB542, 0x9AB6C0], ['missile_refill_all', 0x8592FF, 0x85933F], - ['Area Palettes', 0x82E569, 0x82E56C] + ['Area Palettes', 0x82E569, 0x82E56C], + ['extended_msg_boxes', 0x85877F, 0x859643] + ], + 'extended_msg_boxes': [ + ['hud_expansion_opaque', 0x85877F, 0x859643] ], 'fast_saves': [ ['itemsounds', 0x858089, 0x85808B], From 52e4c3d1d801fb70aaa8ed220297347d30d5385f Mon Sep 17 00:00:00 2001 From: nn <53490794+nn357@users.noreply.github.com> Date: Thu, 5 Nov 2026 20:05:26 +0900 Subject: [PATCH 5/9] remove printpc --- patches/src/extended_msg_boxes.asm | 3 +-- patches/src/fast_reload.asm | 1 - 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/patches/src/extended_msg_boxes.asm b/patches/src/extended_msg_boxes.asm index 8be249f393..a73a46a554 100644 --- a/patches/src/extended_msg_boxes.asm +++ b/patches/src/extended_msg_boxes.asm @@ -186,5 +186,4 @@ MsgTilemap_Reserved2: dw $000E, $000E, $000E, $000E, $000E, $000E, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $000E, $000E, $000E, $000E, $000E, $000E, $000E MsgTilemap_Reserved3: dw $000E, $000E, $000E, $000E, $000E, $000E, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $000E, $000E, $000E, $000E, $000E, $000E, $000E -MsgTilemap_End: -print pc \ No newline at end of file +MsgTilemap_End: \ No newline at end of file diff --git a/patches/src/fast_reload.asm b/patches/src/fast_reload.asm index 4555ebcb8a..8dea5eee72 100644 --- a/patches/src/fast_reload.asm +++ b/patches/src/fast_reload.asm @@ -188,7 +188,6 @@ hook_main: pea $f70d ; $82f70e = rtl jml !deathhook82 -print pc assert pc() <= !bank_85_free_space_end org !spin_lock_button_combo From 67432727694d4e7697932dc2b88b7a39f6412b1b Mon Sep 17 00:00:00 2001 From: nn <53490794+nn357@users.noreply.github.com> Date: Thu, 5 Nov 2026 20:35:27 +0900 Subject: [PATCH 6/9] update tilemap for bluebooster / sparkbooster --- patches/src/extended_msg_boxes.asm | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/patches/src/extended_msg_boxes.asm b/patches/src/extended_msg_boxes.asm index a73a46a554..7f40020915 100644 --- a/patches/src/extended_msg_boxes.asm +++ b/patches/src/extended_msg_boxes.asm @@ -171,15 +171,15 @@ MsgTilemap_Terminator: MsgTilemap_WallJump: dw $000E, $000E, $000E, $000E, $000E, $000E, $2C0F, $2C0F, $2CD6, $2CC0, $2CCB, $2CCB, $2CDD, $2CC9, $2CD4, $2CCC, $2CCF, $2C0F, $2CC1, $2CCE, $2CCE, $2CD3, $2CD2, $2C0F, $2C0F, $000E, $000E, $000E, $000E, $000E, $000E, $000E MsgTilemap_BlueBooster: - dw $000E, $000E, $000E, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2CC1, $2CCB, $2CD4, $2CC4, $2C0F, $2CC1, $2CCE, $2CCE, $2CD2, $2CD3, $2CC4, $2CD1, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $000E, $000E, $000E - dw $000E, $000E, $000E, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $000E, $000E, $000E - dw $000E, $000E, $000E, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $000E, $000E, $000E - dw $000E, $000E, $000E, $280F, $280F, $28E0, $28E1, $28E2, $280F, $28F8, $280F, $28E3, $28E4, $28F0, $28F1, $28FE, $38FA, $28FF, $28E5, $28E6, $28E7, $280F, $28F2, $280F, $28EC, $28ED, $28FB, $280F, $280F, $000E, $000E, $000E -MsgTilemap_SparkBooster: dw $000E, $000E, $000E, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2CD2, $2CCF, $2CC0, $2CD1, $2CCA, $2C0F, $2CC1, $2CCE, $2CCE, $2CD2, $2CD3, $2CC4, $2CD1, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $000E, $000E, $000E - dw $000E, $000E, $000E, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $000E, $000E, $000E - dw $000E, $000E, $000E, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $000E, $000E, $000E - dw $000E, $000E, $000E, $280F, $280F, $28E0, $28E1, $28E2, $280F, $28F8, $280F, $28E3, $28E4, $28F0, $28F1, $28FE, $38FA, $28FF, $28E5, $28E6, $28E7, $280F, $28F2, $280F, $28EC, $28ED, $28FB, $280F, $280F, $000E, $000E, $000E + dw $000E, $000E, $000E, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $000E, $000E, $000E + dw $000E, $000E, $000E, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $000E, $000E, $000E + dw $000E, $000E, $000E, $2C0F, $2C0F, $2CE0, $2CE1, $2CE2, $2C0F, $2CF8, $2C0F, $2CE3, $2CE4, $2CF0, $2CF1, $2CFE, $38FA, $2CFF, $2CE5, $2CE6, $2CE7, $2C0F, $2CF2, $2C0F, $2CEC, $2CED, $2CFB, $2C0F, $2C0F, $000E, $000E, $000E +MsgTilemap_SparkBooster: + dw $000E, $000E, $000E, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2CC1, $2CCB, $2CD4, $2CC4, $2C0F, $2CC1, $2CCE, $2CCE, $2CD2, $2CD3, $2CC4, $2CD1, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $000E, $000E, $000E + dw $000E, $000E, $000E, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $000E, $000E, $000E + dw $000E, $000E, $000E, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $2C0F, $000E, $000E, $000E + dw $000E, $000E, $000E, $2C0F, $2C0F, $2CE0, $2CE1, $2CE2, $2C0F, $2CF8, $2C0F, $2CE3, $2CE4, $2CF0, $2CF1, $2CFE, $38FA, $2CFF, $2CE5, $2CE6, $2CE7, $2C0F, $2CF2, $2C0F, $2CEC, $2CED, $2CFB, $2C0F, $2C0F, $000E, $000E, $000E MsgTilemap_Reserved1: dw $000E, $000E, $000E, $000E, $000E, $000E, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $280F, $000E, $000E, $000E, $000E, $000E, $000E, $000E MsgTilemap_Reserved2: From 4ce1327b26c5cb68f4dd1a9f05e011c09a81e319 Mon Sep 17 00:00:00 2001 From: nn <53490794+nn357@users.noreply.github.com> Date: Thu, 5 Nov 2026 21:30:06 +0900 Subject: [PATCH 7/9] update ips, update patch --- patches/ips/extended_msg_boxes.ips | Bin 303 -> 4661 bytes patches/ips/fast_reload.ips | Bin 727 -> 727 bytes patches/ips/max_ammo_display_fast.ips | Bin 912 -> 852 bytes patches/ips/missile_refill_all.ips | Bin 179 -> 110 bytes patches/ips/spin_lock.ips | Bin 62 -> 62 bytes rust/maprando/src/patch.rs | 40 +++++++++++++++----------- 6 files changed, 23 insertions(+), 17 deletions(-) diff --git a/patches/ips/extended_msg_boxes.ips b/patches/ips/extended_msg_boxes.ips index 13dc5eed0a04fd4aa5d92d72c53563acd45202b8..b290681ea22aa04ed9fcbff2a2e0a809d60356f9 100644 GIT binary patch literal 4661 zcmd^COOG2x5cY<9M#?YPV`k$`}cz*p7oo$6grJdi{|!lkLM>h7=W(KX%UR}a4S>?=L>&6`K}y#4vU<<%p{4p)z!e(UwaQ^(&C`Izu`yWIaC&zZi@yz&9_L&B@Vr@|}8 zdFG+xGWsF&s_?1s$_eQ|!E07Uu6`svA2Y9%JEMH z^_ief2}*eNRH?MGw6bJ`O6s?~lqoAp&U#Cw<)v)a-cm*pIcm}dHEBRCnxJP$3H0^Z zSVY(eDPjyVy_3-`$VE2K^m&qwcnxa@hP&!cwajSDyg%* zLWt3t!*`MG0aiGZvw}v1vcvO!4X|5dSWMtKpa1m*=f7LW;o0sMoy95Gg%@1=JWFBevDg2H$jbU+bOK`eWquH_gFYmO!Kz6ErtkZ?ZnT2 z=lqWwrdmHN83O<#1rAEgPJx4@eJ*EDD&uI3Nc#q*t+e(kG}1|>JU%E zey7&eh)`yH({A7y*p{6@8$hnxGl+qEnzBlW(VDma;8r6-+2j7T|0V);P1~fPw&|EA z^Z|Is^h{zJG9KF0n%FN#`BWr+Mk8nWJD@FwGTR>mIl|60AWuY&ptbG#Ec=VKmiZI-o6c){Ib#ee~53ea{S0 zlRQHsyv+TcQeYBP?K*lKG6lAY9zVmi9?NYwQcQc)`19t1xdd) vnk(k2xrW}`c&?ipW{Nh}xf!SxnG^VDH49p7Wr!h_2z$mm*~Bm%L^^=U1~7SG zIv)c9^6T*HT+=zAb9%Bnzv1K^JUo+I_!TBU;gO!apNDmFi-3YKLM@2Jz~Jid1_0RQ BHroII diff --git a/patches/ips/fast_reload.ips b/patches/ips/fast_reload.ips index c97e3453345dfb56db90678e4239cb1f3c8bf88c..e596518749d1558f35021b9b25b43892c14e14b0 100644 GIT binary patch delta 25 hcmcc4dYyGb43pZ)iE*(^CmAO0HD+Qsx$)CeMgW5E3W5Lt delta 25 hcmcc4dYyGb4AZh16XRl;W;9IPYs}OzW8COJj`947;y delta 73 zcmcb@Hi3PE8IuiDM<4?mzXk|0bxdSn^EB`>@HSxTM2L1yW?(TfFg0N6@@HTHtLy4# PU@ { patches.push("extended_msg_boxes"); } - if self.settings.quality_of_life_settings.ammo_refill_all { - let base = if extended_msg_boxes { - 0x85933B - } else { - 0x8592FF - }; - let ammo_row: [u16; 32] = [ - 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x2C0F, 0x2C0F, 0x2C0F, 0x2C0F, - 0x2CC0, 0x2CCC, 0x2CCC, 0x2CCE, 0x2C0F, 0x2CD1, 0x2CC4, 0x2CCB, 0x2CCE, 0x2CC0, - 0x2CC3, 0x2C0F, 0x2C0F, 0x2C0F, 0x2C0F, 0x2C0E, 0x000E, 0x000E, 0x000E, 0x000E, - 0x000E, 0x000E, - ]; - for (i, &word) in ammo_row.iter().enumerate() { - self.rom.write_u16(snes2pc(base) + i * 2, word as isize)?; - } - } - match self.settings.quality_of_life_settings.etank_refill { ETankRefill::Disabled => { patches.push("etank_refill_disabled"); @@ -1381,6 +1364,28 @@ impl Patcher<'_> { Ok(()) } + fn write_ammo_or_missile_refil(&mut self) -> Result<()> { + let extended_msg_boxes = self.settings.other_settings.wall_jump == WallJump::Collectible + || self.settings.other_settings.speed_booster == SpeedBooster::Split; + if self.settings.quality_of_life_settings.ammo_refill_all { + let base = if extended_msg_boxes { + 0x85933B + } else { + 0x8592FF + }; + let ammo_row: [u16; 32] = [ + 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x2C0F, 0x2C0F, 0x2C0F, 0x2C0F, + 0x2CC0, 0x2CCC, 0x2CCC, 0x2CCE, 0x2C0F, 0x2CD1, 0x2CC4, 0x2CCB, 0x2CCE, 0x2CC0, + 0x2CC3, 0x2C0F, 0x2C0F, 0x2C0F, 0x2C0F, 0x2C0E, 0x000E, 0x000E, 0x000E, 0x000E, + 0x000E, 0x000E, + ]; + for (i, &word) in ammo_row.iter().enumerate() { + self.rom.write_u16(snes2pc(base) + i * 2, word as isize)?; + } + } + Ok(()) + } + fn make_map_revealed(&mut self) -> Result<()> { // Zero out map revealed bits. These will be filled in later to identify area-transition markers, // which are tiles that need to be only fully revealed (not partial) since otherwise they would @@ -3912,6 +3917,7 @@ pub fn make_rom( { patcher.use_area_based_music()?; } + patcher.write_ammo_or_missile_refil()?; patcher.setup_door_specific_fx()?; if randomizer_settings.quality_of_life_settings.camera_fixes { //nn note - the cre wasn't applied in ultralow qol, is this also camera fixes or some other reason - check this too! From d2fa267c444bc4c4a594aee19e4f0fa1dc338741 Mon Sep 17 00:00:00 2001 From: nn <53490794+nn357@users.noreply.github.com> Date: Thu, 5 Nov 2026 22:01:58 +0900 Subject: [PATCH 8/9] add a few notes to patch and asm --- patches/src/extended_msg_boxes.asm | 15 +++++++++++---- rust/maprando/src/patch.rs | 2 ++ 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/patches/src/extended_msg_boxes.asm b/patches/src/extended_msg_boxes.asm index 7f40020915..6f71272577 100644 --- a/patches/src/extended_msg_boxes.asm +++ b/patches/src/extended_msg_boxes.asm @@ -2,7 +2,11 @@ ;;; This extends the available messsagebox definitions table and moves the other tables down, repoints the instructions that referenced the old table. ;;; nn357 -;;; repoint to new tables: +;;; *Address are tied to Patch.rs* +;;; Missile is overwritten to AMMO depending on QOL, this is handled in patch.rs (fn write_ammo_or_missile_refil) +;;; if this table is ever extended then this address will also need to be changed. + +;;; repoint vanilla instructions to new table offsets: org $858412 lda SpecialButtonOffset, x @@ -79,11 +83,14 @@ dw $0000, ; 1: Energy tank $0000, ; 1Eh: Walljump boots $0120, ; 1Fh: Blue booster $0120, ; 20h: Spark booster - $0000, ; 21h: Reserved (small msg box) - $0000, ; 22h: Reserved (small msg box) - $0000, ; 23h: Reserved (small msg box) + $0000, ; 21h: Reserved (small msg box template in place) + $0000, ; 22h: Reserved (small msg box template in place) + $0000, ; 23h: Reserved (small msg box template in place) $0000 ; 24h: Terminator +;;; These tilemaps contain the same palette adjustments / tile adjustments as the hud_expansion/messages.ttb +;;; Plus the tile patches from max_ammo_display_fast.asm + MsgTilemaps: MsgTilemap_Etank: dw $000E, $000E, $000E, $000E, $000E, $000E, $280F, $280F, $280F, $280F, $28C4, $28CD, $28C4, $28D1, $28C6, $28D8, $280F, $28D3, $28C0, $28CD, $28CA, $280F, $280F, $280F, $280F, $000E, $000E, $000E, $000E, $000E, $000E, $000E diff --git a/rust/maprando/src/patch.rs b/rust/maprando/src/patch.rs index f03341c53f..45d848a77d 100644 --- a/rust/maprando/src/patch.rs +++ b/rust/maprando/src/patch.rs @@ -1365,6 +1365,8 @@ impl Patcher<'_> { } fn write_ammo_or_missile_refil(&mut self) -> Result<()> { + // this overwrites the missile refill tilemap, if adjusting the extended message boxes table this + // will also need to be adjusted. let extended_msg_boxes = self.settings.other_settings.wall_jump == WallJump::Collectible || self.settings.other_settings.speed_booster == SpeedBooster::Split; if self.settings.quality_of_life_settings.ammo_refill_all { From 4628fb78a35ae86c2e249ccefee373e189abd9cf Mon Sep 17 00:00:00 2001 From: nn <53490794+nn357@users.noreply.github.com> Date: Thu, 5 Nov 2026 22:34:20 +0900 Subject: [PATCH 9/9] Update vanilla_hooks.txt --- patches/rom_map/vanilla_hooks.txt | 2 -- 1 file changed, 2 deletions(-) diff --git a/patches/rom_map/vanilla_hooks.txt b/patches/rom_map/vanilla_hooks.txt index 9a3c78bf3c..1b9badbb19 100644 --- a/patches/rom_map/vanilla_hooks.txt +++ b/patches/rom_map/vanilla_hooks.txt @@ -553,10 +553,8 @@ EE41 - EE42: ; stats.asm 811E - 8121: ; fast_reload.asm 8122 - 8124: ; fast_saves.asm 8150 - 8168: ; map_area.asm -8243 - 8245: ; extended_msg_boxes.asm 82E5 - 82E7: ; crash_handle_base.asm 82EE - 82F0: ; crash_handle_base.asm -82F1 - 82F3: ; extended_msg_boxes.asm 840C - 840E: ; crash_handle_base.asm 8426 - 8435: ; map_area.asm 846D - 8471: ; item_dots_disappear.asm