Allow moving through doors map

This commit is contained in:
2026-01-10 20:17:29 -06:00
parent 1776daa43d
commit 5e7c4a65b8
6 changed files with 302 additions and 12 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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
+

Binary file not shown.

View File

@@ -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.
;