!CenterTile = $026A !ConnectorPalette = $1000 !DoorSlotCount = 25 DrawWackyDoorRandoStuff: JSL DrawTopAreaBorder JSL DrawBottomAreaBorder STZ.w GFXStripes 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 LDY.w #$0000 JSL DrawFullRoomTile JSL ClearDoorSlotsTable LDA.l CurrentDisplayedRoom STA.l DoorSlots ; multiply room id by 24 to get index in doors table LDA.l CurrentDisplayedRoom TAX LDA.l DoorOffset, X AND.w #$00FF STA.l DisplayedRoomDoorIndex ASL A CLC : ADC.l DisplayedRoomDoorIndex ASL A : ASL A : ASL A STA.l DisplayedRoomDoorIndex JSL DrawConnectedRooms SEP #$20 LDX.w GFXStripes LDA.b #$FF STA.w GFXStripes+2, X LDA.b #$01 STA.b NMISTRIPES REP #$20 RTL ClearDoorSlotsTable: LDX.w #2*!DoorSlotCount-2 LDA.w #$FF0F - STA.l DoorSlots, X DEX : DEX BPL - RTL ClearDoorSlotScratch: PHX LDX.w #$0004 LDA.w #$FF0F - STA.l DoorSlotScratch, X DEX : DEX BPL - PLX RTL DrawFullRoomTile: LDA.b $CA PHX ASL A TAX LDA.l SaveDataWRAM, X STA.b $0E PLX PHY JSL DrawDungeonMapRoom PLY LDA.b $CA CMP.w #$003F : BEQ .top_right CMP.w #$0096 : BEQ .top_right CMP.w #$007E : BEQ .top_left CMP.w #$001B : BEQ .bottom_right BRA + .top_right LDA.w #$01C0|!ConnectorPalette STA.l $7F0002, X BRA + .top_left LDA.w #$01C0|!ConnectorPalette STA.l $7F0000, X BRA + .bottom_right LDA.w #$01C0|!ConnectorPalette STA.l $7F0042, X + LDA.b $00 : PHA LDA.b $02 : PHA LDA.b $06 : PHA LDA.b $0E : PHA JSL DrawSingleRoomLoot PLA : STA.b $0E PLA : STA.b $06 PLA : STA.b $02 PLA : STA.b $00 RTL DrawSingleRoomLoot: PHX : PHY TYX LDA.w GFXStripes TAY CLC : ADC.w #$0010 STA.w GFXStripes LDA.l DoorSlotsBG1, X XBA STA.w GFXStripes+$02, Y XBA CLC : ADC.w #$0020 XBA STA.w GFXStripes+$0A, Y LDA.w #$0300 STA.w GFXStripes+$04, Y STA.w GFXStripes+$0C, Y LDA.b $CA JSL CheckLoot ASL A : ASL A : ASL A TAX LDA.l LootTypeIcons+0, X STA.w GFXStripes+$06, Y LDA.l LootTypeIcons+2, X STA.w GFXStripes+$08, Y LDA.l LootTypeIcons+4, X STA.w GFXStripes+$0E, Y LDA.l LootTypeIcons+6, X STA.w GFXStripes+$10, Y PLY : PLX RTL DrawConnectedRooms: PHB : PHK : PLB LDA.l ShowRooms_default AND.w #$00FF STA.b $0A LDX.w DungeonID LDA.l MapField AND.l DungeonMask, X BEQ + LDA.l ShowRooms_have_map AND.w #$00FF CMP.b $0A BCC + STA.b $0A + LDX.w DungeonID LDA.l CompassField AND.l DungeonMask, X BEQ + LDA.l ShowRooms_have_compass AND.w #$00FF CMP.b $0A BCC + STA.b $0A + LDA.l DisplayedRoomDoorIndex TAX STZ.b $00 .next_side JSR DrawSide INC.b $00 LDA.b $00 CMP.w #$0004 BCC .next_side JSR DrawStairs JSR DrawDropOrWarp 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 CheckInRoomTable: 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 InRoomConnectionIndices, X BMI .done CMP.b $0C BEQ .match INX #4 BRA - .match INX #2 LDA.w InRoomConnectionIndices, X TAX LDA.l InroomStairsTable, X .done PLX RTS GetConnection: LDA.b $02 STA.b $04 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 STA.b $0C JSR CheckCanSeeConnector BCC .nope LDA.b $0C RTS .not_found JSR CheckEdgesTable CMP.w #$FFFF BNE .found JSR CheckInRoomTable CMP.w #$FFFF BEQ .nope PHA LDA.w #$0003 STA.b $04 PLA BRA .found .nope LDA.w #$FF0F RTS CheckCanSeeConnector: LDA.b $0C : PHA LDA.b $0A CMP.w #$0003 BCS .yep PHX LDA.b $0C AND.w #$00FF ASL A TAX LDA.l SaveDataWRAM, X AND.w #$00FF XBA ORA.b $00 EOR.w #$0002 XBA STA.b $0E PLX JSR GetQuadrantMask AND.b $0E BEQ .nope LDA.l CurrentDisplayedRoom XBA ORA.b $04 XBA STA.b $0C PHX LDA.l CurrentDisplayedRoom ASL A TAX LDA.l SaveDataWRAM, X AND.w #$00FF XBA ORA.b $00 XBA STA.b $0E PLX JSR GetQuadrantMask AND.b $0E BEQ .nope .yep PLA : STA.b $0C SEC RTS .nope PLA : STA.b $0C CLC RTS ; $0C - room id ; $0D - room connection position ; $0F - side GetQuadrantMask: LDA.b $0D AND.w #$0003 CMP.w #$0003 BNE .normal LDA.b $0C AND.w #$00FF CMP.w #$005E : BEQ .bottom_left CMP.w #$007E : BEQ .bottom_left CMP.w #$000B : BEQ .top_right CMP.w #$001B : BEQ .top_right .bottom_right LDA.w #$0001 RTS .bottom_left LDA.w #$0002 RTS .top_right LDA.w #$0004 RTS .normal SEP #$20 CLC : ADC.b $0F : ADC.b $0F : ADC.b $0F REP #$20 ASL A PHX TAX LDA.l QuadrantMasks, X PLX 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 DrawSide: JSL ClearDoorSlotScratch STZ.b $06 STZ.b $02 LDY.w #$0002 - JSR GetConnection BMI + INC.b $06 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 DoorSlotOffsets, Y AND.w #$00FF STA.b $02 LDY.b $00 LDA.w DoorSlotSides, Y AND.w #$00FF CLC : ADC.b $02 TAY STZ.b $02 - LDA.b $02 AND.w #$00FF 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 + INC.b $02 LDA.b $02 AND.w #$00FF CMP.w #$0003 BCC - LDA.b $06 CMP.w #$0002 BEQ .two BCS .three BRA .done .two JSR DrawDoubleConnector BRA .done .three JSR DrawTripleConnectorRoot JSR DrawTripleConnector .done PLX RTS DrawStairs: PHX LDA.l CurrentDisplayedRoom TAX LDA.w SpiralPropsIndex, X AND.w #$00FF TAY LDA.l SpiralOffset, X AND.w #$00FF ASL A : ASL A STA.b $00 LDA.w SpiralProps, Y AND.w #$00FF STA.b $06 BEQ .done STZ.b $02 INY .next_room LDA.w SpiralProps, Y AND.w #$00FF ASL A : ASL A CLC : ADC.b $00 TAX PHY LDA.b $02 CLC : ADC.w #$0015 ASL A TAY LDA.l SpiralTable, X AND.w #$00FF TYX STA.l DoorSlots, X STA.b $CA LDA.w DoorSlotsBG2, Y CLC : ADC.w #!CenterTile TAX LDA.b $02 ASL A CLC : ADC.w #$0DF0 STA.l $7F0000-$40, X INC A STA.l $7F0002-$40, X JSL DrawFullRoomTile PLY INY : INY INC.b $02 DEC.b $06 BNE .next_room .done PLX RTS DrawDropOrWarp: PHX LDA.l CurrentDisplayedRoom STA.b $00 LDX.w #$0000 .check_next_drop LDA.l FallTable, X AND.w #$00FF CMP.w #$00FF BEQ .no_drop CMP.b $00 BEQ .found_drop INX : INX BRA .check_next_drop .no_drop LDX.w #$0000 .check_next_warp LDA.l WarpTable, X AND.w #$00FF CMP.w #$00FF BEQ .done CMP.b $00 BEQ .found_warp INX : INX BRA .check_next_warp .found_drop LDA.w #$0DE0 STA.l $7F0574 INC A STA.l $7F0576 LDA.l FallTable+1, X AND.w #$00FF BRA .draw_room .found_warp LDA.w #$0DE2 STA.l $7F0574 INC A STA.l $7F0576 LDA.l WarpTable+1, X AND.w #$00FF .draw_room PHY LDX.w #$0030 TXY STA.l DoorSlots, X STA.b $CA LDA.w DoorSlotsBG2, X CLC : ADC.w #!CenterTile TAX JSL DrawFullRoomTile PLY .done PLX RTS DrawSingleConnectedRoom: AND.w #$00FF STA.b $CA LDA.w DoorSlotsBG2, Y CLC : ADC.w #!CenterTile STA.b $08 TAX JSL DrawFullRoomTile PHY TYX LDA.l DoorSlots+1, X AND.w #$00FF CMP.w #$0003 BNE + LDA.l DoorSlots, X AND.w #$00FF CMP.w #$005E : BEQ .left CMP.w #$007E : BEQ .left .right LDA.w #$0002 BRA + .left LDA.w #$0000 + STA.b $04 LDA.b $06 BEQ ++ CMP.w #$0001 BNE .draw .single LDA.b $02 ASL A CLC : ADC.b $02 CLC : ADC.b $04 STA.b $04 ASL A CLC : ADC.b $04 ASL A : ASL A TAY .draw LDA.b $00 BNE + : JSR DrawNorthConnectors : BRA ++ : + DEC A : BNE + : JSR DrawWestConnectors : BRA ++ : + DEC A : BNE + : JSR DrawSouthConnectors : BRA ++ : + DEC A : BNE + : JSR DrawEastConnectors : BRA ++ : + ++ PLY .done RTS GetWhichDoorPosition: BMI .edge AND.w #$0300 XBA RTS .edge AND.w #$0F00 XBA PHX PHA LDA.b $00 BIT.w #$0001 BEQ .north_south .east_west PLX LDA.l EdgePositions_east_west, X AND.w #$00FF PLX RTS .north_south PLX LDA.l EdgePositions_north_south, X AND.w #$00FF PLX RTS macro Draw3x2Connector(offset, label) LDA.w SingleEdgeCurrentRoomConnectors_