diff --git a/LTTP_RND_GeneralBugfixes.asm b/LTTP_RND_GeneralBugfixes.asm index 7306b72..60450a6 100644 --- a/LTTP_RND_GeneralBugfixes.asm +++ b/LTTP_RND_GeneralBugfixes.asm @@ -210,6 +210,7 @@ incsrc special_weapons.asm incsrc variable_ganon_vulnerability.asm incsrc pseudoflute.asm incsrc dungeon_map/main.asm +print "End of B9: ", pc warnpc $B9E000 ; $E000 - EFFF reserved for custom door rando map data diff --git a/bin/linux/compress b/bin/linux/compress index fb8342d..cef95d0 100644 Binary files a/bin/linux/compress and b/bin/linux/compress differ diff --git a/bin/linux/decompress b/bin/linux/decompress index 4e183e5..a62f358 100644 Binary files a/bin/linux/decompress and b/bin/linux/decompress differ diff --git a/bin/src/compress.c b/bin/src/compress.c index 0504ad0..4b9bcdb 100644 --- a/bin/src/compress.c +++ b/bin/src/compress.c @@ -243,7 +243,7 @@ int main(int argc, char *argv[]) { } fclose(outptr); - printf("Input file: %X bytes. Compressed: %X bytes.\n", size, oloc); + printf("Input file: %lX bytes. Compressed: %X bytes.\n", size, oloc); return 0; } diff --git a/bin/src/decompress.c b/bin/src/decompress.c index e0d12ea..1be2274 100644 --- a/bin/src/decompress.c +++ b/bin/src/decompress.c @@ -149,7 +149,7 @@ int main(int argc, char *argv[]) { } fclose(outptr); - printf("Input file: %X bytes. Decompressed: %X bytes.\n", size, oloc); + printf("Input file: %lX bytes. Decompressed: %X bytes.\n", size, oloc); return 0; } diff --git a/bin/windows/compress.exe b/bin/windows/compress.exe index 54c9b39..3366dc6 100644 Binary files a/bin/windows/compress.exe and b/bin/windows/compress.exe differ diff --git a/bin/windows/decompress.exe b/bin/windows/decompress.exe index b3e6619..723671a 100644 Binary files a/bin/windows/decompress.exe and b/bin/windows/decompress.exe differ diff --git a/dungeon_map/blink_loot.asm b/dungeon_map/blink_loot.asm index db8f671..8df3f0f 100644 --- a/dungeon_map/blink_loot.asm +++ b/dungeon_map/blink_loot.asm @@ -20,6 +20,17 @@ BlinkLoot: StartDoubleWrite: ; what we wrote over + LDA.l DRMode + BEQ .draw + LDA.l DungeonMapMode + BNE .draw + + INC.w $020D ; next subsubmode + PLA : PLA : PLA ; pull our jump to here off the stack + PLB + RTL + +.draw REP #$30 STZ.w GFXStripes diff --git a/dungeon_map/check_loot.asm b/dungeon_map/check_loot.asm index 17bdc26..e35c161 100644 --- a/dungeon_map/check_loot.asm +++ b/dungeon_map/check_loot.asm @@ -5,7 +5,7 @@ CheckLoot: REP #$30 PHB : PHX : PHY - STA.b $00 + STA.b $CA LDA.b $06 : PHA LDA.b $0E : PHA @@ -16,7 +16,8 @@ CheckLoot: AND.w #$00FF STA.b $0E - LDA.b $00 + LDA.b $CA + AND.w #$00FF ASL A TAX @@ -80,7 +81,9 @@ CheckLoot: RTL CheckChests: - LDA.b $00 + LDA.b $CA + AND.w #$00FF + STA.b $00 ASL A TAX @@ -90,6 +93,7 @@ CheckChests: LDA.w #$0008 STA.b $04 + STZ.b $06 LDY.w #$FFFD .increment_mask @@ -106,6 +110,11 @@ CheckChests: CMP.b $00 BNE .next_chest + LDA.b $06 + JSR CheckChestSection + INC.b $06 + BCC .increment_mask + LDA.l SaveDataWRAM, X AND.b $04 BNE .increment_mask ; already got item @@ -119,6 +128,22 @@ CheckChests: RTS CheckBoss: + ; we assume all bosses are in section 1 of split sections + ; mainly to simplify hera cage key and GT torch + ; which use the same flow + ; and bosses are always in their own section anyway + LDA.b $CA + AND.w #$F000 + XBA + CMP.w #$0020 + BCC + + RTS + ++ + LDA.b $CA + AND.w #$00FF + STA.b $04 + LDX.w #$FFFA .next_boss INX #6 @@ -127,7 +152,7 @@ CheckBoss: RTS .check - CMP.b $00 + CMP.b $04 BNE .next_boss TXY @@ -170,6 +195,10 @@ CheckBoss: BRA .next_boss CheckPrize: + LDA.b $CA + AND.w #$00FF + STA.b $04 + LDX.w #$FFFD .next_prize INX #3 @@ -178,7 +207,7 @@ CheckPrize: RTS .check - CMP.b $00 + CMP.b $04 BNE .next_prize TXY @@ -202,7 +231,8 @@ CheckPrize: BRA .next_prize CheckPots: - LDA.b $00 + LDA.b $CA + AND.w #$00FF ASL A TAX @@ -221,6 +251,10 @@ CheckPots: LDA.b [$04], Y AND.w #$00FF CMP.w #$0008 : BEQ .small_key + LDA.l PotCountMode + BEQ + + JSR CheckJunkPot + + INY BRA .next_pot @@ -231,18 +265,30 @@ CheckPots: PHX INY BRA .mask_set + .major_item LDA.b [$04], Y -.continue PHA PHX INY TXA : ASL A TAX LDA.l DungeonMask, X : STA.b $08 + TXA : LSR A : TAX .mask_set - LDA.b $00 : ASL A : TAX + TXA + JSR CheckPotSection + BCS + + PLX + PLA + BRA .next_pot ++ + + LDA.b $CA + AND.w #$00FF + ASL A + TAX if !FEATURE_FIX_BASEROM LDA.l SpriteDropData, X else @@ -263,8 +309,50 @@ endif .done RTS +CheckJunkPot: + LDA.b [$04], Y + PHA + PHX + TXA : ASL A : TAX + LDA.l DungeonMask, X : STA.b $08 + TXA : LSR A + JSR CheckPotSection + BCS + + PLX + PLA + RTS + + + + LDA.b $CA + AND.w #$00FF + ASL A + TAX + LDA.l PotCollectionRateTable, X + AND.b $08 + BEQ .not_important + +if !FEATURE_FIX_BASEROM + LDA.l SpriteDropData, X +else + LDA.l RoomPotData, X +endif + AND.b $08 + BNE .not_important + + PLX + PLA + AND.w #$00FF + JSR GetPotJunkClass + RTS + +.not_important + PLX + PLA + RTS + CheckEnemies: - LDA.b $00 + LDA.b $CA + AND.w #$00FF ASL A TAX @@ -279,9 +367,14 @@ CheckEnemies: .next_enemy LDA.b [$04], Y AND.w #$00FF - CMP.w #$00FF : BEQ .done + CMP.w #$00FF + BNE + + JMP .done + + LDA.b [$04], Y - BIT.w #$8000 : BNE .overlord + AND.w #$E000 + CMP.w #$E000 + BEQ .overlord INY : INY LDA.b [$04], Y AND.w #$00FF @@ -331,15 +424,28 @@ CheckEnemies: TXA : ASL A TAX LDA.l DungeonMask, X : STA.b $08 + TXA : LSR A : TAX .mask_set - LDA.b $00 : ASL A : TAX + TXA + JSR CheckEnemySection + BCS + + PLX + PLA + JMP .next_enemy ++ + + LDA.b $CA + AND.w #$00FF + ASL A + TAX + LDA.l SpriteDropData, X PLX AND.b $08 BEQ .not_obtained PLA - BRA .next_enemy + JMP .next_enemy .not_obtained PLA @@ -380,3 +486,148 @@ GetLootClass: .done PLX RTS + +; A = item id +; updates "best loot" value if better +GetPotJunkClass: + PHX + TAX + + LDA.b $0E + BEQ .done + CMP.w #$0001 + BEQ .value_set + + ; hardcode as junk for now + LDA.w #$0002 + +.value_set + CMP.b $02 + BCC .done + STA.b $02 + +.done + PLX + RTS + +macro DefineGetFooSection(type, offset) +GetSection: + PHX + LDA.b $CA + AND.w #$00FF + ASL A + TAX + LDA.l SplitRooms, X + TAX + + LDA.l SplitRooms, X + AND.w #$00FF + STA.b $CE + BEQ .found + + INX +.check_next_section + PHX + LDA.l SplitRooms+, X + TAX +- + LDA.l SplitRooms, X + AND.w #$00FF + CMP.w #$00FF + BEQ .not_this_section + CMP.b $CC + BEQ .plx_found + + INX + BRA - + +.not_this_section + PLX + TXA : CLC : ADC.w #$000D : TAX + DEC.b $CE + BNE .check_next_section + BRA .found + +.plx_found + PLX + +.found + PLX + LDA.b $CE + RTS +endmacro + +macro DefineCheckFooSection(type) +CheckSection: + STA.b $CC + + LDA.b $CB + AND.w #$00FF + BEQ .yes + + JSR GetSection + + LDA.b $CB + AND.w #$00FF + LSR A : LSR A : LSR A : LSR A + DEC A + CMP.b $CE + BEQ .yes + +.no + CLC + RTS + +.yes + SEC + RTS +endmacro + +%DefineGetFooSection(Door, 3) +%DefineGetFooSection(Stair, 5) +%DefineGetFooSection(Chest, 7) +%DefineGetFooSection(Pot, 9) +%DefineGetFooSection(Enemy, 11) + +%DefineCheckFooSection(Door) +%DefineCheckFooSection(Stair) +%DefineCheckFooSection(Chest) +%DefineCheckFooSection(Pot) +%DefineCheckFooSection(Enemy) + +GetIncomingStairSection: + PHX + AND.w #$0300 + XBA + ASL A + TAX + LDA.l $8098D8, X + STA.b $CC + + LDA.b $CA + AND.w #$00FF + ASL A + TAX + LDA.l SplitRooms, X + TAX + + LDA.l SplitRooms, X + AND.w #$00FF + STA.b $CE + BEQ .found + + INX +.check_next_section + LDA.l SplitRooms+0, X + AND.w #$00FF + AND.b $CC + BNE .found + TXA : CLC : ADC.w #$000D : TAX + DEC.b $CE + BNE .check_next_section + BRA .found + +.found + PLX + LDA.b $CE + RTS diff --git a/dungeon_map/current_room_map.asm b/dungeon_map/current_room_map.asm new file mode 100644 index 0000000..862642c --- /dev/null +++ b/dungeon_map/current_room_map.asm @@ -0,0 +1,2162 @@ +!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 + + +; $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_