!CenterTile = $026A !ConnectorPalette = $1000 !DoorSlotCount = 25 DrawWackyDoorRandoStuff: JSL DrawTopAreaBorder JSL DrawBottomAreaBorder STZ.w GFXStripes LDA.l CachedDungeonID AND.w #$00FF CMP.w DungeonID BNE .different_dungeon LDA.w EntranceIndex STA.l CurrentDoorEntrance JSL DetectLinksSection INC A XBA ASL A : ASL A : ASL A : ASL A ORA.b RoomIndex STA.l CurrentDisplayedRoom BRA DrawCurrentSupertile .different_dungeon JSL FindFirstEntrance TYA STA.l CurrentDoorEntrance ASL A TAX LDA.l EntranceData_room_id, X STA.l CurrentDisplayedRoom JSL DetectEntranceSection INC A XBA ASL A : ASL A : ASL A : ASL A ORA.l CurrentDisplayedRoom 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 AND.w #$00FF 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 AND.w #$00FF PHX ASL A TAX LDA.l SaveDataWRAM, X STA.b $0E PLX PHY JSL DrawDungeonMapRoom PLY LDA.b $CA AND.w #$0FFF 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 $08 : PHA LDA.b $0E : PHA JSL DrawSingleRoomLoot PLA : STA.b $0E PLA : STA.b $08 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 STA.b $0C LDA.l CurrentDisplayedRoom AND.w #$00FF ORA.b $0C 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 STA.b $0C LDA.l CurrentDisplayedRoom AND.w #$00FF ORA.b $0C 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 STA.b $CA LDA.b $08 JSR GetWhichDoorPosition PHA XBA ORA.b $0C STA.b $0C PLA CLC : ADC.b $00 : ADC.b $00 : ADC.b $00 PHX TAX LDA.l IncomingDoorMap, X AND.w #$00FF PLX STA.b $CC JSR GetDoorSection INC A ASL A : ASL A : ASL A : ASL A 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 $0A CMP.w #$0001 BCS .yep PHX LDA.b $0C AND.w #$00FF ASL A TAX LDA.l SaveDataWRAM, X AND.w #$000F BEQ .plx_nope LDA.l CurrentDisplayedRoom AND.w #$00FF ASL A TAX LDA.l SaveDataWRAM, X AND.w #$000F BEQ .plx_nope PLX .yep SEC RTS .plx_nope PLX 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 - LDA.l CurrentDisplayedRoom STA.b $CA LDA.b $00 ASL A CLC : ADC.b $00 ADC.b $02 JSR CheckDoorSection BCC + 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 AND.w #$00FF 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 LDA.l CurrentDisplayedRoom STA.b $CA LDA.b $02 JSR CheckStairSection BCC .skip PHY LDA.b $02 CLC : ADC.w #$0015 ASL A TAY LDA.l SpiralTable, X AND.w #$00FF STA.b $CA LDA.l SpiralTable, X JSR GetIncomingStairSection INC A ASL A : ASL A : ASL A : ASL A XBA ORA.b $CA STA.b $CA JSR GetSpecificRoomVisibility BNE + LDA.b $0E AND.w #$000F BNE + BRA .ply_skip + TYX LDA.b $CA STA.l DoorSlots, X 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_skip PLY .skip INY : INY INC.b $02 DEC.b $06 BNE .next_room .done PLX RTS GetCurrentRoomVisibility: LDA.l CurrentDisplayedRoom STA.b $CA GetSpecificRoomVisibility: PHX 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.b $CA AND.w #$00FF ASL A TAX LDA.l SaveDataWRAM, X AND.w #$000F STA.b $0E BEQ + LDA.l ShowRooms_visited_tile AND.w #$00FF CMP.b $0A BCC + STA.b $0A + PLX LDA.b $0A RTS DrawDropOrWarp: PHX LDA.l CurrentDisplayedRoom STA.b $00 LDX.w #$0000 .check_next_drop LDA.l FallTable, X CMP.w #$FFFF BEQ .no_drop CMP.b $00 BEQ .found_drop INX : INX : INX : INX BRA .check_next_drop .no_drop LDX.w #$0000 .check_next_warp LDA.l WarpTable, X CMP.w #$FFFF BEQ .done CMP.b $00 BEQ .found_warp INX : INX : INX : INX BRA .check_next_warp .found_drop LDA.w #$0DE0 PHA LDA.l FallTable+2, X BRA .draw_room .found_warp LDA.w #$0DE2 PHA LDA.l WarpTable+2, X .draw_room STA.b $CA JSR GetSpecificRoomVisibility BNE + LDA.b $0E AND.w #$000F BNE + PLA BRA .done + PLA STA.l $7F0574 INC A STA.l $7F0576 LDX.w #$0030 LDA.b $CA STA.l DoorSlots, X LDA.w DoorSlotsBG2, X CLC : ADC.w #!CenterTile TXY TAX JSL DrawFullRoomTile .done PLX RTS DrawSingleConnectedRoom: 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 #$000F 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 PLX LDA.b $00 BEQ .north DEC A : BEQ .west DEC A : BEQ .south .east LDA.l EdgePositions_east, X BRA .done .north LDA.l EdgePositions_north, X BRA .done .west LDA.l EdgePositions_west, X BRA .done .south LDA.l EdgePositions_south, X .done AND.w #$00FF PLX RTS macro Draw3x2Connector(offset, label) LDA.w SingleEdgeCurrentRoomConnectors_