From 5e7c4a65b89f7214f3ee60a00c8eb3bbdb848093 Mon Sep 17 00:00:00 2001 From: Kara Alexandra Date: Sat, 10 Jan 2026 20:17:29 -0600 Subject: [PATCH] Allow moving through doors map --- dungeon_map/current_room_map.asm | 207 ++++++++++++++++++++++++- dungeon_map/data/doors_connections.asm | 2 +- dungeon_map/data/doors_display.asm | 65 +++++++- dungeon_map/dungeon_switch.asm | 35 ++++- menu/map_sheet_d4.3bpp | Bin 1536 -> 1536 bytes ram.asm | 5 +- 6 files changed, 302 insertions(+), 12 deletions(-) diff --git a/dungeon_map/current_room_map.asm b/dungeon_map/current_room_map.asm index f00e42f..6ca618f 100644 --- a/dungeon_map/current_room_map.asm +++ b/dungeon_map/current_room_map.asm @@ -7,11 +7,19 @@ DrawWackyDoorRandoStuff: LDA.b RoomIndex AND.w #$00FF STA.l CurrentDisplayedRoom + +DrawCurrentSupertile: + LDA.w #$0000 + STA.l DoorSlotCursor + + LDA.l CurrentDisplayedRoom STA.b $CA LDX.w #!CenterTile JSL DrawFullRoomTile JSL ClearDoorSlotsTable + LDA.l CurrentDisplayedRoom + STA.l DoorSlots ; multiply room id by 24 to get index in doors table LDA.l CurrentDisplayedRoom @@ -28,7 +36,7 @@ DrawWackyDoorRandoStuff: RTL ClearDoorSlotsTable: - LDX.w #$0026 + LDX.w #$0028 LDA.w #$FF0F - STA.l DoorSlots, X DEX : DEX @@ -37,7 +45,7 @@ ClearDoorSlotsTable: ClearDoorSlotScratch: PHX - LDX.w #$0006 + LDX.w #$0004 LDA.w #$FF0F - STA.l DoorSlotScratch, X DEX : DEX @@ -566,7 +574,16 @@ DrawTripleConnector: RTS -DrawBlinkerFancyMode: +DrawDoorsMapSprites: + LDA.l CurrentDisplayedRoom + CMP.b RoomIndex + BNE + + JSR DrawDoorsMapBlinker ++ + JSR DrawDoorsMapCursor + RTL + +DrawDoorsMapBlinker: LDX.b $00 STZ.w OAMBufferAux, X TXA @@ -599,4 +616,188 @@ DrawBlinkerFancyMode: LDA.w $8AEB58, Y STA.w OAMBuffer+3, X + + INC.b $00 + RTS + +DrawDoorsMapCursor: + LDA.l DoorSlotCursor + ASL A + TAX + LDA.l DoorSlotsSprites, X + STA.b $0E + LDA.l DoorSlotsSprites+1, X + STA.b $0F + + LDY.b #$03 + +.next_object + LDX.b $00 + LDA.b #$02 + STA.w OAMBufferAux, X + TXA + ASL A : ASL A + TAX + + LDA.b $0E + CLC : ADC.w $8AEB9A, Y + STA.w OAMBuffer, X + + LDA.b $0F + CLC : ADC.w $8AEB9E, Y + DEC A + STA.w OAMBuffer+1, X + + STZ.w OAMBuffer+2, X + + LDA.b FrameCounter + AND.b #$04 + BNE + + LDA.b #$05 ++ + ASL A + ORA.w $8AEBA2, Y + STA.w OAMBuffer+3, X + + INC.b $00 + DEY + BPL .next_object + + RTS + +; $00 - direction to move +; $01 - current spot +MoveDoorsMapCursor: + PHP + SEP #$30 + LDA.l DoorSlotCursor + STA.b $01 + +.move_again + LDA.b $01 + ASL A : ASL A + CLC : ADC.b $00 + TAX + LDA.l NextCursorSlot, X + BPL .easy + CMP.b #$FF + BEQ .no_move + BIT.b #$40 + BNE .almost_easy + + LDA.b $00 + TAX + LDA.l NextCursorSpecial_center_offset, X + TAX + DEX +.try_next + INX + LDA.l NextCursorSpecial_center, X + BMI .no_move + PHX + ASL A + TAX + LDA.l DoorSlots+1, X + PLX + CMP.b #$00 + BMI .try_next + LDA.l NextCursorSpecial_center, X + STA.b $01 + BRA .write + +.almost_easy + BIT.b #$20 + BNE .from_end + +.from_start + AND.b #$03 + TAX + LDA.l NextCursorSpecial_start_direction, X + STA.b $00 + LDA.l NextCursorSpecial_start_index, X + BRA .easy + +.from_end + AND.b #$03 + TAX + LDA.l NextCursorSpecial_end_direction, X + STA.b $00 + LDA.l NextCursorSpecial_end_index, X + BRA .easy + +.easy + STA.b $01 + +.check + LDA.b $01 + ASL A + TAX + LDA.l DoorSlots+1, X + BMI .move_again + +.write + LDA.b $01 + STA.l DoorSlotCursor + LDA.b #$20 + STA.w $012F + BRA .done + +.no_move + LDA.b #$3C + STA.w $012E + +.done + PLP + RTL + +DoorsMapSelectCursor: + PHP + SEP #$30 + + LDA.l DoorSlotCursor + BEQ .done + + ASL A + TAX + LDA.l DoorSlots, X + + STA.l CurrentDisplayedRoom + REP #$30 + JSL ClearDoorsMapBG2 + JSL DrawCurrentSupertile + + SEP #$30 + + LDA.b #$08 + STA.b $17 + + LDA.b #$20 + STA.w $012F + +.done + PLP + RTL + +ClearDoorsMapBG2: + LDX.w #$0220 + LDA.w #$000B + STA.b $00 + STA.b $02 + LDA.w #$0300 +.next + STA.l $7F0000, X + INX : INX + DEC.b $02 + BPL .next + + LDA.w #$000B + STA.b $02 + TXA + CLC : ADC.w #$0028 + TAX + + LDA.w #$0300 + DEC.b $00 + BPL .next + RTL diff --git a/dungeon_map/data/doors_connections.asm b/dungeon_map/data/doors_connections.asm index b9906ea..95c0320 100644 --- a/dungeon_map/data/doors_connections.asm +++ b/dungeon_map/data/doors_connections.asm @@ -26,7 +26,7 @@ DoorConnectionTiles: dw $C1D4, $C1D5 ; $02 top -> middle dw $81C7, $41C7 ; $03 top -> bottom dw $81D4, $81D5 ; $04 middle -> top - dw $01C5, $41C5 ; $05 middle -> middle + dw $01C5, $81C5 ; $05 middle -> middle dw $01D5, $01D4 ; $06 middle -> bottom dw $C1C7, $01C7 ; $07 bottom -> top dw $41D5, $41D4 ; $08 bottom -> middle diff --git a/dungeon_map/data/doors_display.asm b/dungeon_map/data/doors_display.asm index 7c13de9..a2b1918 100644 --- a/dungeon_map/data/doors_display.asm +++ b/dungeon_map/data/doors_display.asm @@ -1,4 +1,22 @@ +DoorSlotsSprites: +; center + dw $68A8 +; north + dw $4090, $40A8, $40C0 + dw $4098, $40B8 +; west + dw $5080, $6880, $8080 + dw $5880, $7880 +; south + dw $9090, $90A8, $90C0 + dw $9098, $90B8 +; east + dw $50D0, $68D0, $80D0 + dw $58D0, $78D0 + DoorSlotsBG2: +; center + dw $0000 ; north dw $FEBA, $FEC0, $FEC6 dw $FEBC, $FEC4 @@ -13,11 +31,56 @@ DoorSlotsBG2: dw $FF8A, $008A DoorSlotSides: - db $00, $0A, $14, $1E + db $02, $0C, $16, $20 DoorSlotOffsets: db $02, $02, $06, $00 +; up, left, down, right +NextCursorSlot: + db $80, $81, $82, $83 +; top + db $FF, $C1, $00, $04 + db $FF, $04, $00, $05 + db $FF, $05, $00, $C3 + db $FF, $01, $00, $02 + db $FF, $02, $00, $03 +; left + db $C0, $FF, $09, $00 + db $09, $FF, $0A, $00 + db $0A, $FF, $C2, $00 + db $06, $FF, $07, $00 + db $07, $FF, $08, $00 +; bottom + db $00, $E1, $FF, $0E + db $00, $0E, $FF, $0F + db $00, $0F, $FF, $E3 + db $00, $0B, $FF, $0C + db $00, $0C, $FF, $0D +; right + db $E0, $00, $13, $FF + db $13, $00, $14, $FF + db $14, $00, $E2, $FF + db $10, $00, $11, $FF + db $11, $00, $12, $FF + +NextCursorSpecial: +.center + db $02, $04, $05, $01, $03, $FF + db $07, $09, $0A, $06, $08, $FF + db $0C, $0E, $0F, $0B, $0D, $FF + db $11, $13, $14, $10, $12, $FF +.center_offset + db $00, $06, $0C, $12 +.start_index + db $01, $06, $0B, $10 +.start_direction + db $03, $02, $03, $02 +.end_index + db $03, $08, $0D, $12 +.end_direction + db $01, $00, $01, $00 + SingleEdgeCurrentRoomConnectors: .north dw $01C0, $0300, $01C0, $0300, $01C0, $0300 ; left -> left diff --git a/dungeon_map/dungeon_switch.asm b/dungeon_map/dungeon_switch.asm index f8619ef..28bcdd7 100644 --- a/dungeon_map/dungeon_switch.asm +++ b/dungeon_map/dungeon_switch.asm @@ -1,14 +1,39 @@ CheckSwitchMap: LDA.l DRMode - BEQ + + BEQ .not_fancy_door_map LDA.l DungeonMapMode - BNE + + BNE .not_fancy_door_map - ; fancy door map, will figure out later + ; fancy door map + SEP #$20 + LDA.b $F6 + BIT.b #$80 + BNE .select_new_room + LDA.b $F4 + BIT.b #$80 + BNE .select_new_room + + AND.b #$0F + BEQ .doors_done + BIT.b #$08 : BEQ + : LDA.b #$00 : BRA .doors_move_cursor : + + BIT.b #$04 : BEQ + : LDA.b #$02 : BRA .doors_move_cursor : + + BIT.b #$02 : BEQ + : LDA.b #$01 : BRA .doors_move_cursor : + + LDA.b #$03 + +.doors_move_cursor + STA.b $00 + JSL MoveDoorsMapCursor + BRA .doors_done + +.select_new_room + JSL DoorsMapSelectCursor + +.doors_done + REP #$20 LDA.w #$0002 ; ignore input! nothing to see here! RTL -+ +.not_fancy_door_map SEP #$20 LDA.b $F6 AND.b #$30 @@ -113,7 +138,7 @@ SkipMapSprites: BEQ .no_vanilla_draw JML $8AEADE .no_vanilla_draw - JSL DrawBlinkerFancyMode + JSL DrawDoorsMapSprites JML $8AEAFC + diff --git a/menu/map_sheet_d4.3bpp b/menu/map_sheet_d4.3bpp index 8958227ee19d12378228cf65e1b14d2c759afc2b..f0207cb4af1761ab946735ab5b6cc9b6a25e5f4f 100644 GIT binary patch delta 138 zcmZqRY2euq!CKD%1Of~OKrFyu0pcJ53kD9Lm;w%QkQ^$|V9)@HaR4DIfS7@*{$Ksy M{lD*jpSWHV0Ff9Cpa1{> delta 10 RcmZqRY2euq!8&op3IG#f1P1^B diff --git a/ram.asm b/ram.asm index a215abd..47df548 100644 --- a/ram.asm +++ b/ram.asm @@ -569,8 +569,9 @@ CachedCurrentFloor = $7EC22B ; to restore when closing CurrentDisplayedRoom = $7EC22C ; 2 bytes, used by dungeon map DisplayedRoomDoorIndex = $7EC22E ; 2 bytes, used by dungeon map ; -DoorSlotScratch = $7EC230 ; 8 bytes, used by dungeon map -DoorSlots = $7EC238 ; $28 bytes, used by dungeon map +DoorSlots = $7EC230 ; $2A bytes, used by dungeon map +DoorSlotScratch = $7EC25A ; 6 bytes, used by dungeon map +DoorSlotCursor = $7EC260 ; 2 bytes, used by dungeon map ; LastBGSet = $7EC2F8 ; Lists loaded sheets to check for decompression. 4 bytes. ;