Refactor and open edges

This commit is contained in:
2026-01-10 00:48:22 -06:00
parent 278e428658
commit 610607ece4
5 changed files with 259 additions and 66 deletions

View File

@@ -1,5 +1,5 @@
!CenterTile = $036A
!ConnectorPalette = $0800
!ConnectorPalette = $1000
DrawWackyDoorRandoStuff:
JSL DrawBorder
@@ -11,6 +11,8 @@ DrawWackyDoorRandoStuff:
LDX.w #!CenterTile
JSL DrawFullRoomTile
JSL ClearDoorSlotsTable
; multiply room id by 24 to get index in doors table
LDA.l CurrentDisplayedRoom
TAX
@@ -25,6 +27,24 @@ DrawWackyDoorRandoStuff:
JSL DrawConnectedRooms
RTL
ClearDoorSlotsTable:
LDX.w #$0026
LDA.w #$FF0F
- STA.l DoorSlots, X
DEX : DEX
BPL -
RTL
ClearDoorSlotScratch:
PHX
LDX.w #$0006
LDA.w #$FF0F
- STA.l DoorSlotScratch, X
DEX : DEX
BPL -
PLX
RTL
DrawFullRoomTile:
LDA.b $CA
PHX
@@ -54,52 +74,127 @@ DrawConnectedRooms:
PLB
RTL
CheckEdgesTable:
LDA.b $00
ASL A
CLC : ADC.b $00
ADC.b $02
XBA
ORA.l CurrentDisplayedRoom
STA.b $0C
PHX
LDX.w #$0000
-
LDA.w EdgeConnectionIndices, X
BMI .done
CMP.b $0C
BEQ .match
INX #4
BRA -
.match
INX #2
LDA.w EdgeConnectionIndices, X
TAX
LDA.l NorthOpenEdge, X
.done
PLX
RTS
GetConnection:
LDA.l DoorTable, X
.found
STA.b $08
AND.w #$00FF
CMP.w #$0003
BEQ .not_found
STA.b $0C
LDA.b $08
JSR GetWhichDoorPosition
XBA
ORA.b $0C
RTS
.not_found
JSR CheckEdgesTable
CMP.w #$0000
BPL .found
LDA.w #$FF0F
RTS
print "DrawSide: ", pc
; $00 - Side
; $02 - Door position number on side
; $03 - Door index number on side
; $04 - Target door position
; $06 - Number of doors on side
; $08 - Room Drawn Address
; $0A - Door Index on side
DrawSide:
JSL ClearDoorSlotScratch
STZ.b $06
STZ.b $02
LDY.w #$0002
-
LDA.l DoorTable, X
AND.w #$00FF
CMP.w #$0003
BEQ +
JSR GetConnection
BMI +
INC.b $06
+ INX : INX
PHX
PHA
LDA.b $02
ASL A
TAX
PLA
STA.l DoorSlotScratch, X
PLX
+
INX : INX
INC.b $02
DEY
BPL -
PHX
LDY.b $06
LDA.w DoorsCurrentRoomOffsets_offsets, Y
LDA.w DoorSlotOffsets, Y
AND.w #$00FF
STA.b $02
LDY.b $00
LDA.w DoorsCurrentRoomOffsets_index, Y
LDA.w DoorSlotSides, Y
AND.w #$00FF
CLC : ADC.b $02
TAY
DEX #6
STZ.b $02
STZ.b $0A
-
LDA.l DoorTable, X
LDA.b $02
AND.w #$00FF
CMP.w #$0003
BEQ +
ASL A
TAX
LDA.l DoorSlotScratch, X
BPL .present
.missing
LDA.b $06
CMP.w #$0002
BNE +
JSR DrawDoubleConnectorRoot
BRA +
.present
TYX
STA.l DoorSlots, X
JSR DrawSingleConnectedRoom
INC.b $03
INY : INY
+
INX : INX
INC.b $02
LDA.b $02
AND.w #$00FF
CMP.w #$0003
BCC -
@@ -107,41 +202,39 @@ DrawSide:
CMP.w #$0002
BEQ .two
BCS .three
.other
RTS
BRA .done
.two
PHX
JSR DrawDoubleConnector
PLX
RTS
BRA .done
.three
PHX
JSR DrawTripleConnector
.done
PLX
RTS
DrawSingleConnectedRoom:
STA.b $0A
AND.w #$00FF
STA.b $CA
PHX
LDA.w DoorsCurrentRoomOffsets, Y
LDA.w DoorSlotsBG2, Y
CLC : ADC.w #!CenterTile
STA.b $08
TAX
JSL DrawFullRoomTile
INY : INY
PLX
PHY
LDA.b $06
BEQ ++
CMP.w #$0001
BEQ .single
JSR GetWhichDoorPosition
TYX
LDA.l DoorSlots+1, X
AND.w #$00FF
STA.b $04
BRA .draw
@@ -151,7 +244,9 @@ DrawSingleConnectedRoom:
CLC : ADC.b $02
STA.b $04
JSR GetWhichDoorPosition
TYX
LDA.l DoorSlots+1, X
AND.w #$00FF
CLC : ADC.b $04
STA.b $04
ASL A
@@ -169,11 +264,9 @@ DrawSingleConnectedRoom:
PLY
.done
INC.b $0A
RTS
GetWhichDoorPosition:
LDA.l DoorTable, X
BMI .edge
AND.w #$0300
XBA
@@ -246,7 +339,6 @@ macro Draw2x3Connector(offset, label)
endmacro
macro Draw2TileConnector(offset1, offset2, flip, sublabel)
LDX.b $08
LDA.w DoorConnectionTiles_<sublabel>, Y
BEQ ?+
ORA.w #!ConnectorPalette
@@ -263,7 +355,9 @@ macro Draw2TileConnector(offset1, offset2, flip, sublabel)
endmacro
GetConnectorIndex:
+ LDY.b $0A
LDA.b $03
AND.w #$00FF
TAY
LDA.b $06
CMP.w #$0002
BEQ +
@@ -276,6 +370,25 @@ GetConnectorIndex:
TAY
RTS
DrawDoubleConnectorRoot:
LDA.b $02
AND.w #$00FF
EOR.w #$FFFF
CLC : ADC.w #$0010
ASL A : ASL A
PHY
TAY
LDX.w #!CenterTile
LDA.b $00
BNE + : %Draw2TileConnector(-$40, -$3E, $0000, vertical) : BRA ++
+ DEC A : BNE + : %Draw2TileConnector(-$02, $3E, $0000, horizontal) : BRA ++
+ DEC A : BNE + : %Draw2TileConnector($80, $82, $8000, vertical) : BRA ++
+ DEC A : BNE + : %Draw2TileConnector($04, $44, $4000, horizontal) : BRA ++
+
++
PLY
RTS
DrawEastConnectors:
LDA.b $06 : DEC A
BNE +
@@ -284,6 +397,7 @@ DrawEastConnectors:
+ JSR GetConnectorIndex
PHX
LDX.b $08
%Draw2TileConnector(-$02, $3E, $4000, horizontal)
PLX
RTS
@@ -297,6 +411,7 @@ DrawWestConnectors:
+ JSR GetConnectorIndex
PHX
LDX.b $08
%Draw2TileConnector($04, $44, $0000, horizontal)
PLX
RTS
@@ -310,6 +425,7 @@ DrawNorthConnectors:
+ JSR GetConnectorIndex
PHX
LDX.b $08
%Draw2TileConnector($80, $82, $0000, vertical)
PLX
RTS
@@ -322,6 +438,7 @@ DrawSouthConnectors:
+ JSR GetConnectorIndex
PHX
LDX.b $08
%Draw2TileConnector(-$40, -$3E, $8000, vertical)
PLX
RTS
@@ -395,3 +512,38 @@ DrawDoubleConnector:
DrawTripleConnector:
RTS
DrawBlinkerFancyMode:
LDX.b $00
STZ.w OAMBufferAux, X
TXA
ASL A : ASL A
TAX
REP #$20
LDA.b LinkPosX
AND.w #$01E0
ASL A : ASL A : ASL A
XBA
CLC : ADC.w #$00A4
STA.w OAMBuffer, X
LDA.b LinkPosY
AND.w #$01E0
ASL A : ASL A : ASL A
XBA
CLC : ADC.w #$0064
STA.w OAMBuffer+1, X
SEP #$20
LDA.b FrameCounter
AND.b #$0C
LSR A : LSR A
TAY
LDA.w $8AEB50
STA.w OAMBuffer+2, X
LDA.w $8AEB58, Y
STA.w OAMBuffer+3, X
RTL

View File

@@ -11,9 +11,9 @@ DoorConnectionTiles:
dw $41D1, $41D0 ; $08 right -> middle
dw $0000, $01C0 ; $09 right -> right
dw $41C2, $41C1 ; $0A left-middle -> left-middle
dw $81D2, $81D0 ; $0B left-middle -> left-right
dw $81D2, $C1D0 ; $0B left-middle -> left-right
dw $41D3, $81D3 ; $0C left-middle -> middle-right
dw $01D2, $01D0 ; $0D left-right -> left-middle
dw $01D2, $41D0 ; $0D left-right -> left-middle
dw $01C0, $01C0 ; $0E left-right -> left-right
dw $01D0, $41D2 ; $0F left-right -> middle-right
dw $C1D3, $01D3 ; $10 middle-right -> left-middle
@@ -32,11 +32,11 @@ DoorConnectionTiles:
dw $41D5, $41D4 ; $08 bottom -> middle
dw $0300, $01C4 ; $09 bottom -> bottom
dw $41C6, $41C5 ; $0A top-middle -> top-middle
dw $81D6, $81D4 ; $0B top-middle -> top-bottom
dw $41D6, $01D4 ; $0B top-middle -> top-bottom
dw $41D7, $81D7 ; $0C top-middle -> middle-bottom
dw $01D6, $01D4 ; $0D top-bottom -> top-middle
dw $01D6, $41D4 ; $0D top-bottom -> top-middle
dw $01C4, $01C4 ; $0E top-bottom -> top-bottom
dw $01D4, $41D6 ; $0F top-bottom -> middle-bottom
dw $C1D4, $81D6 ; $0F top-bottom -> middle-bottom
dw $C1D7, $01D7 ; $10 middle-bottom -> top-middle
dw $81D4, $C1D6 ; $11 middle-bottom -> top-bottom
dw $01C5, $01C6 ; $12 middle-bottom -> middle-bottom

View File

@@ -1,36 +1,22 @@
DoorsCurrentRoomOffsets:
.north
..3
DoorSlotsBG2:
; north
dw $FEBA, $FEC0, $FEC6
..2
dw $FEBC, $FEC4
..1
dw $FEC0
.west
..3
; west
dw $FF36, $FFF6, $00B6
..2
dw $FF76, $0076
..1
dw $FFF6
.south
..3
; south
dw $013A, $0140, $0146
..2
dw $013C, $0144
..1
dw $0140
.east
..3
; east
dw $FF4A, $000A, $00CA
..2
dw $FF8A, $008A
..1
dw $000A
.index
db $00, $0C, $18, $24
.offsets
db $00, $0A, $06, $00
DoorSlotSides:
db $00, $0A, $14, $1E
DoorSlotOffsets:
db $02, $02, $06, $00
SingleEdgeCurrentRoomConnectors:
.north
@@ -125,3 +111,54 @@ EdgePositions:
db $00 ; Desert East Wing
db $00, $02 ; TT Triple
db $02 ; TT Big Key Chest
EdgeConnectionIndices:
; North
dw $0182, $0000
dw $0082, $0003
dw $0283, $0006
dw $0084, $0009
dw $0184, $000C
dw $0284, $000F
dw $0085, $0012
dw $01DB, $0015
dw $02DB, $0018
dw $00DC, $001B
dw $01DC, $001E
; South
dw $0772, $0021
dw $0672, $0024
dw $0873, $0027
dw $0674, $002A
dw $0774, $002D
dw $0874, $0030
dw $0675, $0033
dw $07CB, $0036
dw $08CB, $0039
dw $06CC, $003C
dw $07CC, $003F
; West
dw $0565, $0042
dw $0574, $0045
dw $0575, $0048
dw $0582, $004B
dw $0382, $004E
dw $0385, $0051
dw $03CC, $0054
dw $05CC, $0057
dw $05DC, $005A
; East
dw $0B64, $005D
dw $0B73, $0060
dw $0B74, $0063
dw $0B81, $0066
dw $0981, $0069
dw $0984, $006C
dw $09CB, $006F
dw $0BCB, $0072
dw $0BDB, $0075
dw $FFFF

View File

@@ -110,9 +110,10 @@ SkipMapSprites:
LDA.l DRMode
BEQ +
LDA.l DungeonMapMode
BEQ .draw_none
BEQ .no_vanilla_draw
JML $8AEADE
.draw_none
.no_vanilla_draw
JSL DrawBlinkerFancyMode
JML $8AEAFC
+

View File

@@ -569,6 +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
;
LastBGSet = $7EC2F8 ; Lists loaded sheets to check for decompression. 4 bytes.
;
PaletteBufferAux = $7EC300 ; Secondary and main palette buffer. See symbols_wram.asm