diff --git a/LTTP_RND_GeneralBugfixes.asm b/LTTP_RND_GeneralBugfixes.asm index 26c1359..79ef4b5 100644 --- a/LTTP_RND_GeneralBugfixes.asm +++ b/LTTP_RND_GeneralBugfixes.asm @@ -210,7 +210,8 @@ incsrc special_weapons.asm incsrc variable_ganon_vulnerability.asm incsrc pseudoflute.asm incsrc dungeon_map/main.asm -warnpc $B9F000 + +warnpc $B9E000 ; $E000 - EFFF reserved for custom door rando map data org $B9F000 incsrc dungeon_map/settings.asm diff --git a/dungeon_map/data/doors_connections.asm b/dungeon_map/data/doors_connections.asm index 4f997d5..a2e41f9 100644 --- a/dungeon_map/data/doors_connections.asm +++ b/dungeon_map/data/doors_connections.asm @@ -1,44 +1,21 @@ DoorConnectionTiles: -.horizontal - dw $0300, $0300 ; $00 - dw $03DF, $0300 ; $01 top -> top - dw $03CC, $03CB ; $02 top -> middle - dw $03CF, $C3CF ; $03 top -> bottom - dw $43CC, $43CB ; $04 middle -> top - dw $03CD, $83CD ; $05 middle -> middle - dw $C3CB, $C3CC ; $06 middle -> bottom - dw $C3CF, $03CF ; $07 bottom -> top - dw $83CB, $83CC ; $08 bottom -> middle - dw $0300, $03DF ; $09 bottom -> bottom - dw $83CD, $83DD ; $0A top-middle -> top-middle - dw $C3DC, $C3CC ; $0B top-middle -> top-bottom - dw $03CE, $C3CE ; $0C top-middle -> middle-bottom - dw $43DC, $83CC ; $0D top-bottom -> top-middle - dw $03DF, $03DF ; $0E top-bottom -> top-bottom - dw $03CC, $03DC ; $0F top-bottom -> middle-bottom - dw $43CE, $83CE ; $10 middle-bottom -> top-middle - dw $43CC, $43DC ; $11 middle-bottom -> top-bottom - dw $03CD, $03DD ; $12 middle-bottom -> middle-bottom - dw $03DD, $03DD ; $13 triple -> triple - -.vertical - dw $0300, $0300 ; $00 - dw $03CA, $0300 ; $01 left -> left - dw $83D7, $83DB ; $02 left -> middle - dw $C3CF, $03CF ; $03 left -> right - dw $03D7, $03DB ; $04 middle -> left - dw $03C7, $43C7 ; $05 middle -> middle - dw $43DB, $43D7 ; $06 middle -> right - dw $43CF, $83CF ; $07 right -> left - dw $C3DB, $C3D7 ; $08 right -> middle - dw $0300, $03CA ; $09 right -> right - dw $43C8, $43C7 ; $0A left-middle -> left-middle - dw $43D8, $43D7 ; $0B left-middle -> left-right - dw $83D9, $43D9 ; $0C left-middle -> middle-right - dw $C3D8, $C3D7 ; $0D left-right -> left-middle - dw $03CA, $03CA ; $0E left-right -> left-right - dw $83D7, $83D8 ; $0F left-right -> middle-right - dw $03D9, $C3D9 ; $10 middle-right -> left-middle - dw $03D7, $03D8 ; $11 middle-right -> left-right - dw $03C7, $03C8 ; $12 middle-right -> middle-right - dw $43C8, $03C8 ; $13 triple -> triple + dw $0000, $0000 ; $00 + dw $01C0, $0000 ; $01 left -> left + dw $01D0, $01D1 ; $02 left -> middle + dw $81C3, $41C3 ; $03 left -> right + dw $81D0, $81D1 ; $04 middle -> left + dw $01C1, $41C1 ; $05 middle -> middle + dw $C1D1, $C1D0 ; $06 middle -> right + dw $01C3, $C1C3 ; $07 right -> left + 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 $41D3, $81D3 ; $0C left-middle -> middle-right + dw $01D2, $01D0 ; $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 + dw $81D0, $C1D2 ; $11 middle-right -> left-right + dw $01C1, $01C2 ; $12 middle-right -> middle-right + dw $41C2, $01C2 ; $13 triple -> triple diff --git a/dungeon_map/draw_loot.asm b/dungeon_map/draw_loot.asm index 0fcf018..eaaf020 100644 --- a/dungeon_map/draw_loot.asm +++ b/dungeon_map/draw_loot.asm @@ -35,13 +35,13 @@ DrawLoot: STZ.b $0E LDX.w DungeonID - LDA.l DungeonMapRoomPointers, X - STA.b $0C + JSL LoadDungeonMapRoomPointer + STA.b $72 SEP #$20 LDA.l DungeonMapFloorCountData, X AND.b #$0F - CLC : ADC.w $020E + CLC : ADC.w DungeonMapCurrentFloor PHA JSR DrawSingleFloorLoot @@ -130,7 +130,7 @@ DrawSingleFloorLoot: .next_room REP #$20 - LDA.b ($0C), Y ; get room id + LDA.b [$72], Y ; get room id PHY AND.w #$00FF diff --git a/dungeon_map/draw_rooms.asm b/dungeon_map/draw_rooms.asm index 8d71016..d871fec 100644 --- a/dungeon_map/draw_rooms.asm +++ b/dungeon_map/draw_rooms.asm @@ -138,13 +138,13 @@ DrawEntrances: LDA.b $06 : PHA LDX.w DungeonID - LDA.l DungeonMapRoomPointers, X - STA.b $0C + JSL LoadDungeonMapRoomPointer + STA.b $72 SEP #$20 LDA.l DungeonMapFloorCountData, X AND.b #$0F - CLC : ADC.w $020E + CLC : ADC.w DungeonMapCurrentFloor REP #$20 AND.w #$00FF @@ -182,7 +182,7 @@ DrawSingleFloorEntrances: .next_room REP #$20 - LDA.b ($0C), Y ; get room id + LDA.b [$72], Y ; get room id AND.w #$00FF CMP.w #$000F ; $0F = empty room diff --git a/dungeon_map/dungeon_switch.asm b/dungeon_map/dungeon_switch.asm index 1c50600..c79daef 100644 --- a/dungeon_map/dungeon_switch.asm +++ b/dungeon_map/dungeon_switch.asm @@ -160,10 +160,10 @@ DrawDungeonLabel: RTL StartCurrentRoomSearch: - LDA.w $8AF5E9, X ; dungeon map floor count data + LDA.w DungeonMapFloorCountData, X LSR A : LSR A : LSR A : LSR A STA.b $00 - LDA.w $8AF5E9, X + LDA.w DungeonMapFloorCountData, X AND.b #$0F CLC : ADC.b $00 ASL A @@ -190,7 +190,7 @@ FindCurrentRoom: CPY.b $0C BCS .not_found - LDA.b ($04), Y + LDA.b [$72], Y INY CMP.b $0E BEQ .found diff --git a/dungeon_map/hooks.asm b/dungeon_map/hooks.asm index 3f622c1..3576e04 100644 --- a/dungeon_map/hooks.asm +++ b/dungeon_map/hooks.asm @@ -187,3 +187,33 @@ org $8AE21C org $8AE590 JSL PrepDrawRow BRA + : NOP #5 : + + +org $8AE5F2 + JSR LoadDungeonMapRoomPointer_0A + STA.b $72 + +org $8AE600 + LDA.b [$72], Y + +org $8AE634 + JSR LoadDungeonMapRoomPointer_0A + STA.b $72 + +org $8AE63B + LDA.b [$72], Y + +org $8AE867 + JSR LoadDungeonMapRoomPointer_0A + STA.b $72 + +org $8AE872 + LDA.b [$72], Y + +org $8AE8DD + JSR LoadDungeonMapRoomPointer_0A + +org $8AE8E4 + STA.b $72 + +org $8AE8F9 + LDA.b [$72], Y diff --git a/dungeon_map/mappable_doors.asm b/dungeon_map/mappable_doors.asm index 4617fb7..03e6b23 100644 --- a/dungeon_map/mappable_doors.asm +++ b/dungeon_map/mappable_doors.asm @@ -78,6 +78,31 @@ MapDrawingData: .floor_pixel_row_wrap dw $0040, $0030 +CustomMapDrawingData: +.column_wrap + dw $0003 +.column_count + dw $0004 +.row_wrap + dw $0002 + +.floor_connection_data_offset + dw $0000 + dw $0011 + dw $0022 + dw $0033 + dw $0044 + dw $0055 + dw $0066 + dw $0077 + dw $0088 + +.row_connection_data_offset + dw $0000 + dw $0007 + dw $000E + dw $0015 + macro Map_LDA(addr, label) pushpc org @@ -206,6 +231,10 @@ JSR ADC_Y_sprite_offset_y_base org $8AE652 ; steal some space from the old map-drawing code we're no longer using +LoadDungeonMapRoomPointer_0A: + JSL LoadDungeonMapRoomPointer + RTS + %Map_LDAY($8AE45F, corner_tile_address) %Map_LDAY($8AE489, row_tile_address) %Map_CMP($8AE4B0, row_tile_length) @@ -229,6 +258,20 @@ pullpc incsrc data/doors_connections.asm +LoadDungeonMapRoomPointer: + LDA.l DungeonMapMode + BEQ .normal + LDA.w #bank(CustomMapPointers) + STA.b $74 + LDA.l CustomMapPointers, X + RTL + +.normal + LDA.w #bank(DungeonMapRoomPointers) + STA.b $74 + LDA.l DungeonMapRoomPointers, X + RTL + PrepDrawRow: CLC : ADC.l DungeonMapMode ASL A @@ -247,67 +290,66 @@ PrepDrawRow: .done RTL - -TripleTable: - dw $0000, $0003, $0006 - DrawRowOfRoomConnections: PHB : PHK : PLB PHX + LDX.w DungeonID + LDA.l DoorConnectionPointers, X + STA.b $04 + + LDA.l DungeonMapFloorCountData, X + AND.w #$000F + CLC : ADC.w DungeonMapCurrentFloor + ASL A + TAX + LDA.l CustomMapDrawingData_floor_connection_data_offset, X + CLC : ADC.b $04 + STA.b $04 + LDA.b $00 ASL A - TAY - LDA.w TripleTable, Y - TAY + TAX + LDA.l CustomMapDrawingData_row_connection_data_offset, X + CLC : ADC.b $04 + STA.b $04 - LDA.w $B9FC00, Y + STZ.b $02 + + PLX : PHX + LDY.w #$0000 + +.next_horizontal + LDA.b ($04), Y AND.w #$00FF JSR DrawHorizontalConnector INY INX #6 - LDA.w $B9FC00, Y - AND.w #$00FF - JSR DrawHorizontalConnector - INY - INX #6 - - LDA.w $B9FC00, Y - AND.w #$00FF - JSR DrawHorizontalConnector + INC.b $02 + LDA.b $02 + CMP.l CustomMapDrawingData_column_wrap + BCC .next_horizontal LDA.b $00 - CMP.w #$0002 + CMP.l CustomMapDrawingData_row_wrap BCS .done PLX : PHX - ASL A : ASL A - TAY - LDA.w $B9FC09, Y + STZ.b $02 + +.next_vertical + LDA.b ($04), Y AND.w #$00FF JSR DrawVerticalConnector INY INX #6 - LDA.w $B9FC09, Y - AND.w #$00FF - JSR DrawVerticalConnector - INY - INX #6 - - LDA.w $B9FC09, Y - AND.w #$00FF - JSR DrawVerticalConnector - INY - INX #6 - - LDA.w $B9FC09, Y - AND.w #$00FF - JSR DrawVerticalConnector - INY - INX #6 + INC.b $02 + LDA.b $02 + CMP.l CustomMapDrawingData_column_count + BCC .next_vertical .done PLX @@ -320,12 +362,19 @@ DrawHorizontalConnector: PHY ASL A : ASL A TAY - LDA.w DoorConnectionTiles_horizontal+0, Y - ORA.w #$1400 + + LDA.w DoorConnectionTiles+0, Y + BEQ + + ORA.w #$1404 STA.l $7F0004, X - LDA.w DoorConnectionTiles_horizontal+2, Y - ORA.w #$1400 ++ + + LDA.w DoorConnectionTiles+2, Y + BEQ + + ORA.w #$1404 STA.l $7F0044, X ++ + PLY RTS @@ -335,11 +384,18 @@ DrawVerticalConnector: PHY ASL A : ASL A TAY - LDA.w DoorConnectionTiles_vertical+0, Y + + LDA.w DoorConnectionTiles+0, Y + BEQ + ORA.w #$1400 STA.l $7F0080, X - LDA.w DoorConnectionTiles_vertical+2, Y ++ + + LDA.w DoorConnectionTiles+2, Y + BEQ + ORA.w #$1400 STA.l $7F0082, X ++ + PLY RTS diff --git a/dungeon_map/settings.asm b/dungeon_map/settings.asm index 596d51c..f4898c4 100644 --- a/dungeon_map/settings.asm +++ b/dungeon_map/settings.asm @@ -31,6 +31,18 @@ struct DungeonMapData DungeonMapData .unused: skip 1 endstruct +warnpc $B9F840 +org $B9F840 + +DoorConnectionPointers: +skip $20 + +warnpc $B9F860 +org $B9F860 + +CustomMapPointers: +skip $20 + warnpc $B9F880 org $B9F880 diff --git a/menu/door_connectors.3bpp b/menu/door_connectors.3bpp index 39df1c0..e7658b1 100644 Binary files a/menu/door_connectors.3bpp and b/menu/door_connectors.3bpp differ diff --git a/menu/door_connectors.3bppc b/menu/door_connectors.3bppc index d8a966c..96a8248 100644 Binary files a/menu/door_connectors.3bppc and b/menu/door_connectors.3bppc differ diff --git a/ram.asm b/ram.asm index 0f01166..9c579b0 100644 --- a/ram.asm +++ b/ram.asm @@ -196,6 +196,8 @@ BottleMenuCounter = $7E0205 ; Step counter for opening bottle menu MenuFrameCounter = $7E0206 ; Incremented every menu frame. Never read. MenuBlink = $7E0207 ; Incremented every frame and masked with $10 to blink cursor ; +DungeonMapCurrentFloor = $7E020E ; + ; RaceGameFlag = $7E021B ; ; MessageJunk = $7E0223 ; Zeroed but never used (?)