diff --git a/dungeon_map/current_room_map.asm b/dungeon_map/current_room_map.asm index de4755f..ee9073d 100644 --- a/dungeon_map/current_room_map.asm +++ b/dungeon_map/current_room_map.asm @@ -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_, 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 diff --git a/dungeon_map/data/doors_connections.asm b/dungeon_map/data/doors_connections.asm index 60405c3..0541cdf 100644 --- a/dungeon_map/data/doors_connections.asm +++ b/dungeon_map/data/doors_connections.asm @@ -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 diff --git a/dungeon_map/data/doors_display.asm b/dungeon_map/data/doors_display.asm index ffcd4f9..fbabfcf 100644 --- a/dungeon_map/data/doors_display.asm +++ b/dungeon_map/data/doors_display.asm @@ -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 diff --git a/dungeon_map/dungeon_switch.asm b/dungeon_map/dungeon_switch.asm index aa9e55f..f8619ef 100644 --- a/dungeon_map/dungeon_switch.asm +++ b/dungeon_map/dungeon_switch.asm @@ -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 + diff --git a/ram.asm b/ram.asm index e1aa0bb..a215abd 100644 --- a/ram.asm +++ b/ram.asm @@ -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