diff --git a/dungeon_map/current_room_map.asm b/dungeon_map/current_room_map.asm index 783a22c..2f3cd95 100644 --- a/dungeon_map/current_room_map.asm +++ b/dungeon_map/current_room_map.asm @@ -8,6 +8,9 @@ DrawWackyDoorRandoStuff: STZ.w GFXStripes + LDA.w EntranceIndex + STA.l CurrentDoorEntrance + JSL DetectLinksSection INC A XBA @@ -345,6 +348,7 @@ CheckCanSeeConnector: BEQ .plx_nope LDA.l CurrentDisplayedRoom + AND.w #$00FF ASL A TAX LDA.l SaveDataWRAM, X @@ -548,7 +552,12 @@ DrawStairs: XBA ORA.b $CA STA.b $CA + + JSR GetSpecificRoomVisibility + BEQ .ply_skip + TYX + LDA.b $CA STA.l DoorSlots, X LDA.w DoorSlotsBG2, Y @@ -562,6 +571,7 @@ DrawStairs: INC A STA.l $7F0002-$40, X JSL DrawFullRoomTile +.ply_skip PLY .skip @@ -1384,6 +1394,96 @@ DoorsMapSelectCursor: PLP RTL +DoorsMapNextEntrance: + PHP + REP #$30 + LDA.l CurrentDoorEntrance + TAY + +.check_next + INY + CPY.w #$0085 + BCC + + LDY.w #$0000 ++ + TYA + CMP.l CurrentDoorEntrance + BEQ .done + + TYX + LDA.l $82D1EF, X + AND.w #$00FF + CMP.w DungeonID + + BNE .check_next + + TYA + ASL A + TAX + LDA.l EntranceData_room_id, X + STA.b $CA + + JSR GetSpecificRoomVisibility + BNE .acceptable + + LDA.w #$0001 + STA.b $00 + + LDA.l EntranceData_x_coordinate, X + LSR A + AND.w #$00FF + CMP.w #$0080 + BCS + + LDA.b $00 + ASL A + STA.b $00 ++ + + LDA.l EntranceData_y_coordinate, X + LSR A + AND.w #$00FF + CMP.w #$0080 + BCS + + LDA.b $00 + ASL A + ASL A + STA.b $00 ++ + + LDA.b $00 + AND.b $0E + BEQ .check_next + +.acceptable + PHX + JSL DetectEntranceSection + PLX + INC A + ASL A : ASL A : ASL A : ASL A + XBA + ORA.l EntranceData_room_id, X + STA.l CurrentDisplayedRoom + + TYA + STA.l CurrentDoorEntrance + + STZ.w GFXStripes + JSL ClearDoorsMapBG1 + JSL ClearDoorsMapBG2 + JSL DrawCurrentSupertile + + SEP #$30 + + LDA.b #$08 + STA.b $17 + + LDA.b #$20 + STA.w $012F + +.done + PLP + RTL + ClearDoorsMapBG1: LDA.w #$000B STA.b $00 @@ -1480,7 +1580,7 @@ GetRoomEntrance: BMI .not_found TYX - LDA.l $02D1EF, X + LDA.l EntranceData_dungeon_id, X AND.w #$00FF CMP.w DungeonID BNE - @@ -1488,11 +1588,58 @@ GetRoomEntrance: TYA ASL A TAX - LDA.l $02C577, X + LDA.l EntranceData_room_id, X CMP.w $CA BNE - - LDA.l $02CDC7, X + LDA.l EntranceData_x_coordinate, X + AND.w #$01FF + CMP.w #$00B9 + BCC .left + CMP.w #$0149 + BCC .middle + +.right + LDA.w #$0004 + BRA .done + +.middle + LDA.w #$0002 + BRA .done + +.left + LDA.w #$0000 + BRA .done + +.not_found + LDA.w #$FFFF + +.done + PLY : PLX + RTS + +GetRoomDropdown: + PHX : PHY + LDY.w #$0083 ; entrance IDs 76 - 82 are dropdowns +- + DEY + CPY.w #$0076 + BCC .not_found + + TYX + LDA.l EntranceData_dungeon_id, X + AND.w #$00FF + CMP.w DungeonID + BNE - + + TYA + ASL A + TAX + LDA.l EntranceData_room_id, X + CMP.w $CA + BNE - + + LDA.l EntranceData_x_coordinate, X AND.w #$01FF CMP.w #$00B9 BCC .left @@ -1524,7 +1671,9 @@ DrawDoorsEntrances: .next_room DEX : DEX - BMI .done + BPL + + JMP .done ++ LDA.l DoorSlots, X BMI .next_room @@ -1535,10 +1684,10 @@ DrawDoorsEntrances: JSR GetRoomEntrance STA.b $02 CMP.w #$0000 - BMI .next_room + BMI .check_dropdown JSR GetSpecificRoomVisibility - BNE .draw + BNE .draw_entrance PHX LDA.b $02 @@ -1546,9 +1695,9 @@ DrawDoorsEntrances: LDA.l EntranceQuadrantMasks, X PLX AND.b $0E - BEQ .next_room + BEQ .check_dropdown -.draw +.draw_entrance SEP #$30 LDY.b $00 LDA.b #$00 @@ -1570,7 +1719,45 @@ DrawDoorsEntrances: STA.w OAMBuffer+2, Y INC.b $00 - BRA .next_room +.check_dropdown + JSR GetRoomDropdown + STA.b $02 + CMP.w #$0000 + BMI .next_room + + JSR GetSpecificRoomVisibility + BNE .draw_dropdown + + PHX + LDA.b $02 + TAX + LDA.l DropdownQuadrantMasks, X + PLX + AND.b $0E + BEQ .next_room + +.draw_dropdown + SEP #$30 + LDY.b $00 + LDA.b #$00 + STA.w OAMBufferAux, Y + TYA + ASL A : ASL A + TAY + + LDA.l DoorSlotsSprites, X + CLC : ADC.b $02 : ADC.b $02 + STA.w OAMBuffer, Y + + LDA.l DoorSlotsSprites+1, X + STA.w OAMBuffer+1, Y + + REP #$30 + LDA.w #$A333 + STA.w OAMBuffer+2, Y + INC.b $00 + + JMP .next_room .done SEP #$30 @@ -1582,7 +1769,9 @@ DrawDoorsStairs: LDA.l SpiralPropsIndex, X TAX LDA.l SpiralProps, X - BEQ .done + BNE + + JMP .done ++ STA.b $0C STZ.b $0D @@ -1595,10 +1784,21 @@ DrawDoorsStairs: INX : INX LDA.l SpiralProps, X + PHX ASL A TAX + PHX + LDA.b $0D + CLC : ADC.b #$15 + ASL A + TAX + LDA.l DoorSlots, X + PLX + CMP.b #$0F + BEQ .skip + REP #$30 LDA.l CurrentDisplayedRoom STA.b $CA @@ -1658,7 +1858,9 @@ DetectLinksSection: LDA.l SplitRooms, X AND.w #$00FF STA.b $00 - BEQ .done + BNE + + RTL ++ LDA.b LinkPosX LSR A @@ -1677,6 +1879,7 @@ DetectLinksSection: INC A STA.b $06 +DetectSection: INX .next_section PHX @@ -1732,3 +1935,48 @@ DetectLinksSection: .done LDA.b $00 RTL + +DetectEntranceSection: + TYA + ASL A + TAX + LDA.l EntranceData_room_id, X + + ASL A + TAX + LDA.l SplitRooms, X + TAX + LDA.l SplitRooms, X + AND.w #$00FF + STA.b $00 + BNE + + RTL ++ + + PHX + TYA + ASL A + TAX + LDA.l EntranceData_x_coordinate, X + LSR A + AND.w #$00FF + INC A + STA.b $02 + + TYA + ASL A + TAX + LDA.l EntranceData_y_coordinate, X + LSR A + AND.w #$00FF + INC A + STA.b $04 + + TYX + LDA.l EntranceData_layer, X + AND.w #$00FF + INC A + STA.b $06 + + PLX + JMP DetectSection diff --git a/dungeon_map/data/doors_display.asm b/dungeon_map/data/doors_display.asm index 98654bd..14e219b 100644 --- a/dungeon_map/data/doors_display.asm +++ b/dungeon_map/data/doors_display.asm @@ -174,6 +174,11 @@ EntranceQuadrantMasks: dw $0003 dw $0001 +DropdownQuadrantMasks: + dw $0008 + dw $000C + dw $0004 + MultiConnectorMapping: .two db $02, $00 diff --git a/dungeon_map/data/split_room.asm b/dungeon_map/data/split_room.asm index a11e8f9..62b40f3 100644 --- a/dungeon_map/data/split_room.asm +++ b/dungeon_map/data/split_room.asm @@ -463,8 +463,8 @@ db $01 %d(..areas) : %d(..doors) : %d(.no_items) : %d(.no_items) : %d(.no_items) : %d(.no_items) ..areas db $01, $00, $20, $28, $60 -db $01, $00, $20, $28, $60 -db $01, $E0, $FF, $58, $60 +db $01, $E0, $FF, $28, $60 +db $01, $00, $FF, $58, $60 db $FF ..doors db $03, $09 diff --git a/dungeon_map/dungeon_switch.asm b/dungeon_map/dungeon_switch.asm index 28bcdd7..da7b721 100644 --- a/dungeon_map/dungeon_switch.asm +++ b/dungeon_map/dungeon_switch.asm @@ -13,6 +13,9 @@ CheckSwitchMap: BIT.b #$80 BNE .select_new_room + BIT.b #$20 + BNE .next_entrance + AND.b #$0F BEQ .doors_done BIT.b #$08 : BEQ + : LDA.b #$00 : BRA .doors_move_cursor : + @@ -27,6 +30,10 @@ CheckSwitchMap: .select_new_room JSL DoorsMapSelectCursor + BRA .doors_done + +.next_entrance + JSL DoorsMapNextEntrance .doors_done REP #$20 diff --git a/ram.asm b/ram.asm index ca60b63..528bb50 100644 --- a/ram.asm +++ b/ram.asm @@ -572,6 +572,7 @@ DisplayedRoomDoorIndex = $7EC22E ; 2 bytes, used by dungeon map DoorSlots = $7EC230 ; $32 bytes, used by dungeon map DoorSlotScratch = $7EC262 ; 6 bytes, used by dungeon map DoorSlotCursor = $7EC268 ; 2 bytes, used by dungeon map +CurrentDoorEntrance = $7EC26A ; 2 bytes, used by dungeon map ; LastBGSet = $7EC2F8 ; Lists loaded sheets to check for decompression. 4 bytes. ; diff --git a/vanillalabels.asm b/vanillalabels.asm index fbc64b2..79c425e 100644 --- a/vanillalabels.asm +++ b/vanillalabels.asm @@ -280,6 +280,11 @@ Module1B_SpawnSelect_spawns = $828481 Overworld_ActualScreenID = $82A4E3 UnderworldTransitionLandingCoordinate = $82C034 Overworld_FinalizeEntryOntoScreen_Data = $82C176 +EntranceData_room_id = $82C577 +EntranceData_y_coordinate = $82CCBD +EntranceData_x_coordinate = $82CDC7 +EntranceData_dungeon_id = $82D1EF +EntranceData_layer = $82D2F9 EntranceData_song = $82D592 SpawnPointData_room_id = $82D8D2 Overworld_CheckForSpecialOverworldTrigger_Direction = $84E879