diff --git a/inc/enums.inc b/inc/enums.inc index a34e7eb5..76bb207c 100644 --- a/inc/enums.inc +++ b/inc/enums.inc @@ -484,6 +484,49 @@ ScrollExtend_Top equ 02h ScrollExtend_Bottom equ 03h ScrollExtend_None equ 0FFh +ClipdataTile_Air equ 0000h +ClipdataTile_Solid equ 0010h +ClipdataTile_DoorTransition equ 0020h +ClipdataTile_2x2TopLeftNeverReform equ 0050h +ClipdataTile_2x2TopRightNeverReform equ 0051h +ClipdataTile_WeakNeverReform equ 0052h +ClipdataTile_WeakReform equ 0053h +ClipdataTile_MissileNeverReform equ 0054h +ClipdataTile_BombNeverReform equ 0055h +ClipdataTile_BombReform equ 0056h +ClipdataTile_PBomb equ 0057h +ClipdataTile_SpeedNoReform equ 0058h +ClipdataTile_ScrewAttack equ 0059h +ClipdataTile_Crumble equ 005Ah +ClipdataTile_WeakNoReform equ 005Bh +ClipdataTile_MissileNoReform equ 005Eh +ClipdataTile_2x2TopLeftNoReform equ 005Ch +ClipdataTile_2x2TopRightNoReform equ 005Dh +ClipdataTile_2x2BottomLeftNeverReform equ 0060h +ClipdataTile_2x2BottomRightNeverReform equ 0061h +ClipdataTile_MissileTankHidden equ 0064h +ClipdataTile_EngergyTankHidden equ 0065h +ClipdataTile_PBombTankHidden equ 0069h +ClipdataTile_SpeedReform equ 006Bh +ClipdataTile_2x2BottomLeftNoReform equ 006Ch +ClipdataTile_2x2BottomRightNoReform equ 006Dh +ClipdataTile_VerticalBombChain1 equ 0070h +ClipdataTile_VerticalBombChain2 equ 0071h +ClipdataTile_VerticalBombChain3 equ 0072h +ClipdataTile_VerticalBombChain4 equ 0073h +ClipdataTile_HorizontalBombChain1 equ 0074h +ClipdataTile_HorizontalBombChain2 equ 0075h +ClipdataTile_HorizontalBombChain3 equ 0076h +ClipdataTile_HorizontalBombChain4 equ 0077h + +ClipdataRevealed_Crumble equ 800Bh +ClipdataRevealed_Weak equ 800Ch +ClipdataRevealed_Bomb equ 8005h +ClipdataRevealed_Missile equ 8006h +ClipdataRevealed_PBomb equ 8007h +ClipdataRevealed_Speed equ 8008h +ClipdataRevealed_ScrewAttack equ 800Ah + ; non-vanilla enums Upgrade_None equ 0 diff --git a/inc/functions.inc b/inc/functions.inc index 89a4a463..6157462b 100644 --- a/inc/functions.inc +++ b/inc/functions.inc @@ -13,6 +13,8 @@ Nightmare_MakeMissilesFall equ 0805DD40h LockHatches equ 08063070h ChangeSuit equ 08063190h SetEventEffect equ 0806342Ch +RemoveNeverReformBlocksAndCollectedTanks equ 08064ADCh +RemoveNeverReformBlocks equ 0806B130h SetBg1Tile equ 0806C614h SetSpecialBg1Tile equ 0806C6E4h SetClipdata equ 0806C82Ch diff --git a/inc/structs.inc b/inc/structs.inc index 5e39f4d1..3d088648 100644 --- a/inc/structs.inc +++ b/inc/structs.inc @@ -1,3 +1,11 @@ +DecompressedBG0Data equ 02029000h +DecompressedBG1Data equ 0202C000h +DecompressedBG2Data equ 0202F000h +DecompressedBG3Data equ 02032000h +.sym off +DecompressBGData_Size equ 3000h +.sym on + MinimapData equ 02034000h DecompressedMinimapData equ 02034800h MinimapVisited equ 02037C00h diff --git a/src/main.s b/src/main.s index 4d7bd223..44fab183 100644 --- a/src/main.s +++ b/src/main.s @@ -67,6 +67,7 @@ EnvironmentalHazardDps equ 087FF065h MissileLimit equ 087FF06Ah MinorLocationsAddr equ 087FF06Ch RoomNamesAddr equ 087FF070h +RevealHiddenTilesFlag equ 087FF08Ch ; Mark end-of-file padding as free space @@EOF equ 0879ECC8h @@ -103,6 +104,7 @@ RoomNamesAddr equ 087FF070h .include "src/qol/screw-unbonk.s" .include "src/qol/skip-ending.s" .include "src/qol/skip-intro.s" +.include "src/qol/unhidden-breakable-tiles.s" .if UNHIDDEN_MAP .include "src/qol/unhidden-map.s" @@ -164,10 +166,10 @@ RoomNamesAddr equ 087FF070h .include "src/randomizer/less-map-info.s" .include "src/randomizer/menu-edits.s" .include "src/randomizer/open-escape.s" -.include "src/randomizer/room-name-display.s" .include "src/randomizer/start-warp.s" .include "src/randomizer/start-location.s" .include "src/randomizer/tank-majors.s" +.include "src/randomizer/room-name-display.s" .endif .close diff --git a/src/qol/unhidden-breakable-tiles.s b/src/qol/unhidden-breakable-tiles.s new file mode 100644 index 00000000..f865e80d --- /dev/null +++ b/src/qol/unhidden-breakable-tiles.s @@ -0,0 +1,206 @@ +.org RemoveNeverReformBlocksAndCollectedTanks +.area 08064AEBh-08064ADCh, 0 + push { lr } + bl @RemoveMiscTilesFromRoom + pop { r0 } + bx r0 +.endarea + +.autoregion + .align 2 +.func @RemoveMiscTilesFromRoom + push { lr } + bl RemoveNeverReformBlocks + bl RemoveCollectedTanks + bl RevealHiddenBreakableTiles + pop { r0 } + bx r0 +.endfunc +.endautoregion + +.org RevealHiddenTilesFlag +.area 1 + .db 00h +.endarea + +.org 0806B962h ; Editing UpdateBlockAnimation, case 07h +.area 0806B968h-0806B962h, 0 + bl @BreakStateIfRevealed +.endarea + +.autoregion + .align 2 +.func @BreakStateIfRevealed + push { r4, lr } + ldr r4, =RevealHiddenTilesFlag + ldrb r4, [r4] + cmp r4, 0 + bne @@if_revealed +@@if_vanilla: + add r0, #01h + b @@return +@@if_revealed: + sub r0, #05h +@@return: + lsl r0, r0, #10h + lsr r5, r0, #10h + pop { r4, lr } + .pool +.endfunc +.endautoregion + +.autoregion + .align 2 +.func RevealHiddenBreakableTiles + push { r4-r7, lr } + ldr r0, =RevealHiddenTilesFlag + ldrb r0, [r0] + cmp r0, #0 + beq @@return + b @@load_room_info + +@@load_room_info: + ldr r7, =LevelLayers + LevelLayers_Clipdata + ldrh r6, [r7, LevelLayer_Rows] ; height + ldrh r5, [r7, LevelLayer_Stride] ; width + ldr r7, [r7] + sub sp, #8 + str r5, [sp] + str r6, [sp, #4] + mov r5, #0 + mov r6, #0 +@@loop: + mov r1, r7 + ldr r3, [sp] + mov r2, r6 + mul r2, r3 ; height * room width + add r2, r2, r5 ; + width + lsl r2, #1 + add r0, r1, r2 + ldr r1, =3001h + cmp r1, r2 ; don't read past Clipdata RAM + beq @@return + ldrh r0, [r7, r2] + cmp r0, #ClipdataTile_Air + beq @@inc_width + cmp r0, #ClipdataTile_Solid + beq @@inc_width + cmp r0, #ClipdataTile_DoorTransition + beq @@inc_width + bl @SearchForHiddenBlocks + mov r1, #0 + mvn r1, r1 + lsl r1, #10h + lsr r1, #10h + cmp r1, r0 ; if not FFFF + bne @@reveal_hidden_block + b @@inc_width +@@reveal_hidden_block: + ; r0 should contain value of new tile + mov r1, r6 ; Y Pos + mov r2, r5 ; X Pos + bl SetSpecialBg1Tile +@@inc_width: + add r5, #1 + ldr r0, [sp] + cmp r5, r0 + ble @@loop +@@inc_height: + add r6, #1 + ldr r0, [sp, #4] + cmp r6, r0 + beq @@return + mov r5, #1 + b @@loop +@@return: + add sp, #8 + pop { r4-r7 } + pop { r0 } + bx r0 + .pool +.endfunc +.endautoregion + +.autoregion + .align 2 +@ClipDataReplacements: + ;.db Clip to check, replacement clip + .dh ClipdataTile_Crumble, ClipdataRevealed_Crumble + .dh ClipdataTile_WeakReform, ClipdataRevealed_Weak + .dh ClipdataTile_BombNeverReform, ClipdataRevealed_Bomb + .dh ClipdataTile_BombReform, ClipdataRevealed_Bomb + .dh ClipdataTile_SpeedNoReform, ClipdataRevealed_Speed + .dh ClipdataTile_SpeedReform, ClipdataRevealed_Speed + .dh ClipdataTile_MissileNeverReform, ClipdataRevealed_Missile + .dh ClipdataTile_MissileNoReform, ClipdataRevealed_Missile + .dh ClipdataTile_PBomb, ClipdataRevealed_PBomb + .dh ClipdataTile_ScrewAttack, ClipdataRevealed_ScrewAttack + ; Not revealing tanks at this time + ;.dh ClipdataTile_MissileTankHidden, 801Ch + ;.dh ClipdataTile_EngergyTankHidden, 801Dh + ;.dh ClipdataTile_PBombTankHidden, 801Eh + .dh ClipdataTile_2x2TopLeftNeverReform, ClipdataRevealed_Weak + .dh ClipdataTile_2x2TopRightNeverReform, ClipdataRevealed_Weak + .dh ClipdataTile_WeakNeverReform, ClipdataRevealed_Weak + .dh ClipdataTile_WeakNoReform, ClipdataRevealed_Weak + .dh ClipdataTile_2x2TopLeftNoReform, ClipdataRevealed_Weak + .dh ClipdataTile_2x2TopRightNoReform, ClipdataRevealed_Weak + .dh ClipdataTile_2x2BottomLeftNeverReform, ClipdataRevealed_Weak + .dh ClipdataTile_2x2BottomRightNeverReform, ClipdataRevealed_Weak + .dh ClipdataTile_2x2BottomLeftNoReform, ClipdataRevealed_Weak + .dh ClipdataTile_2x2BottomRightNoReform, ClipdataRevealed_Weak + .dh ClipdataTile_VerticalBombChain1, ClipdataRevealed_Bomb + .dh ClipdataTile_VerticalBombChain2, ClipdataRevealed_Bomb + .dh ClipdataTile_VerticalBombChain3, ClipdataRevealed_Bomb + .dh ClipdataTile_VerticalBombChain4, ClipdataRevealed_Bomb + .dh ClipdataTile_HorizontalBombChain1, ClipdataRevealed_Bomb + .dh ClipdataTile_HorizontalBombChain2, ClipdataRevealed_Bomb + .dh ClipdataTile_HorizontalBombChain3, ClipdataRevealed_Bomb + .dh ClipdataTile_HorizontalBombChain4, ClipdataRevealed_Bomb + .dh 0FFFFh, 0FFFFh +.endautoregion + + +.autoregion +; input +; r0 = Block to Search For +; output +; r0 = Replacement Tile, or None (0FFFFh) + .align 2 +.func @SearchForHiddenBlocks + push { r1-r4, lr } + sub sp, #4 + mov r3, #0 + str r3, [sp] +@@search: + ldr r3, [sp] + lsl r3, #2 + ldr r4, =@ClipDataReplacements + add r4, r4, r3 + ldrh r2, [r4] + mov r1, #0 + mvn r1, r1 + lsl r1, r1, 10h + lsr r1, r1, 10h + cmp r2, r1 + beq @@return_none + cmp r0, r2 + beq @@return_replacement + ; increment counter + lsr r3, #2 + add r3, #1 + str r3, [sp] + b @@search +@@return_replacement: + ldr r2, =@ClipDataReplacements+2 + add r2, r2, r3 + ldrh r0, [r2, #0] + add sp, #4 + pop { r1-r4, pc } +@@return_none: + ldr r0, =0FFFFh + add sp, #4 + pop { r1-r4, pc } + .pool +.endfunc +.endautoregion diff --git a/src/randomizer/room-name-display.s b/src/randomizer/room-name-display.s index b286ea36..d2aa2563 100644 --- a/src/randomizer/room-name-display.s +++ b/src/randomizer/room-name-display.s @@ -8,7 +8,7 @@ ; ldr r2, [r7] ; mov r1, #0FFh ; r7 is a pointer to the text to show for the Objective/Room Name message box. -; Loading the desired pointer to r7, then running the original lines will get +; Loading the desired pointer to r7, then running the original lines will get ; the room name text to be loaded .func @LoadRoomName @@ -47,7 +47,8 @@ .dw @@Names_Sector6 .endarea -.region 56h * 4 +.autoregion + .align 4 @@Names_MainDeck: .dw @UnknownRoom, @UnknownRoom, @UnknownRoom, @UnknownRoom .dw @UnknownRoom, @UnknownRoom, @UnknownRoom, @UnknownRoom @@ -71,9 +72,10 @@ .dw @UnknownRoom, @UnknownRoom, @UnknownRoom, @UnknownRoom .dw @UnknownRoom, @UnknownRoom, @UnknownRoom, @UnknownRoom .dw @UnknownRoom, @UnknownRoom -.endregion +.endautoregion -.region 35h * 4 +.autoregion + .align 4 @@Names_Sector1: .dw @UnknownRoom, @UnknownRoom, @UnknownRoom, @UnknownRoom .dw @UnknownRoom, @UnknownRoom, @UnknownRoom, @UnknownRoom @@ -89,9 +91,10 @@ .dw @UnknownRoom, @UnknownRoom, @UnknownRoom, @UnknownRoom .dw @UnknownRoom, @UnknownRoom, @UnknownRoom, @UnknownRoom .dw @UnknownRoom -.endregion +.endautoregion -.region 3Ch * 4 +.autoregion + .align 4 @@Names_Sector2: .dw @UnknownRoom, @UnknownRoom, @UnknownRoom, @UnknownRoom .dw @UnknownRoom, @UnknownRoom, @UnknownRoom, @UnknownRoom @@ -108,9 +111,10 @@ .dw @UnknownRoom, @UnknownRoom, @UnknownRoom, @UnknownRoom .dw @UnknownRoom, @UnknownRoom, @UnknownRoom, @UnknownRoom .dw @UnknownRoom, @UnknownRoom, @UnknownRoom, @UnknownRoom -.endregion +.endautoregion -.region 26h * 4 +.autoregion + .align 4 @@Names_Sector3: .dw @UnknownRoom, @UnknownRoom, @UnknownRoom, @UnknownRoom .dw @UnknownRoom, @UnknownRoom, @UnknownRoom, @UnknownRoom @@ -122,9 +126,10 @@ .dw @UnknownRoom, @UnknownRoom, @UnknownRoom, @UnknownRoom .dw @UnknownRoom, @UnknownRoom, @UnknownRoom, @UnknownRoom .dw @UnknownRoom, @UnknownRoom -.endregion +.endautoregion -.region 2Fh * 4 +.autoregion + .align 4 @@Names_Sector4: .dw @UnknownRoom, @UnknownRoom, @UnknownRoom, @UnknownRoom .dw @UnknownRoom, @UnknownRoom, @UnknownRoom, @UnknownRoom @@ -138,9 +143,10 @@ .dw @UnknownRoom, @UnknownRoom, @UnknownRoom, @UnknownRoom .dw @UnknownRoom, @UnknownRoom, @UnknownRoom, @UnknownRoom .dw @UnknownRoom, @UnknownRoom, @UnknownRoom -.endregion +.endautoregion -.region 33h * 4 +.autoregion + .align 4 @@Names_Sector5: .dw @UnknownRoom, @UnknownRoom, @UnknownRoom, @UnknownRoom .dw @UnknownRoom, @UnknownRoom, @UnknownRoom, @UnknownRoom @@ -155,9 +161,10 @@ .dw @UnknownRoom, @UnknownRoom, @UnknownRoom, @UnknownRoom .dw @UnknownRoom, @UnknownRoom, @UnknownRoom, @UnknownRoom .dw @UnknownRoom, @UnknownRoom, @UnknownRoom -.endregion +.endautoregion -.region 28h * 4 +.autoregion + .align 4 @@Names_Sector6: .dw @UnknownRoom, @UnknownRoom, @UnknownRoom, @UnknownRoom .dw @UnknownRoom, @UnknownRoom, @UnknownRoom, @UnknownRoom @@ -169,4 +176,4 @@ .dw @UnknownRoom, @UnknownRoom, @UnknownRoom, @UnknownRoom .dw @UnknownRoom, @UnknownRoom, @UnknownRoom, @UnknownRoom .dw @UnknownRoom, @UnknownRoom, @UnknownRoom, @UnknownRoom -.endregion \ No newline at end of file +.endautoregion