From 17939339bcd8d8c90e3334b38fd621684ed97826 Mon Sep 17 00:00:00 2001 From: Kara Alexandra Date: Mon, 12 Jan 2026 20:30:08 -0600 Subject: [PATCH] Start tracking separated sections --- dungeon_map/check_loot.asm | 149 ++++++++++++++++++-- dungeon_map/current_room_map.asm | 145 +++++++++++++++++-- dungeon_map/data/spiral_stairs.asm | 3 +- dungeon_map/data/split_room.asm | 214 +++++++++++++++++++++++++++++ dungeon_map/main.asm | 1 + 5 files changed, 492 insertions(+), 20 deletions(-) create mode 100644 dungeon_map/data/split_room.asm diff --git a/dungeon_map/check_loot.asm b/dungeon_map/check_loot.asm index 17bdc26..28ecc4a 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,10 @@ CheckChests: CMP.b $00 BNE .next_chest + JSR CheckChestSection + INC.b $06 + BCC .increment_mask + LDA.l SaveDataWRAM, X AND.b $04 BNE .increment_mask ; already got item @@ -119,6 +127,10 @@ CheckChests: RTS CheckBoss: + LDA.b $CA + AND.w #$00FF + STA.b $04 + LDX.w #$FFFA .next_boss INX #6 @@ -127,7 +139,7 @@ CheckBoss: RTS .check - CMP.b $00 + CMP.b $04 BNE .next_boss TXY @@ -170,6 +182,10 @@ CheckBoss: BRA .next_boss CheckPrize: + LDA.b $CA + AND.w #$00FF + STA.b $04 + LDX.w #$FFFD .next_prize INX #3 @@ -178,7 +194,7 @@ CheckPrize: RTS .check - CMP.b $00 + CMP.b $04 BNE .next_prize TXY @@ -202,7 +218,8 @@ CheckPrize: BRA .next_prize CheckPots: - LDA.b $00 + LDA.b $CA + AND.w #$00FF ASL A TAX @@ -242,7 +259,18 @@ CheckPots: LDA.l DungeonMask, X : STA.b $08 .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 @@ -264,7 +292,8 @@ endif RTS CheckEnemies: - LDA.b $00 + LDA.b $CA + AND.w #$00FF ASL A TAX @@ -279,7 +308,10 @@ 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 INY : INY @@ -333,13 +365,25 @@ CheckEnemies: LDA.l DungeonMask, X : STA.b $08 .mask_set - LDA.b $00 : ASL A : TAX + TXA + JSR CheckEnemySection + BCS + + PLX + PLA + BRA .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 +424,86 @@ GetLootClass: .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 #$000A : 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, 2) +%DefineGetFooSection(Chest, 4) +%DefineGetFooSection(Pot, 6) +%DefineGetFooSection(Enemy, 8) + +%DefineCheckFooSection(Door) +%DefineCheckFooSection(Chest) +%DefineCheckFooSection(Pot) +%DefineCheckFooSection(Enemy) diff --git a/dungeon_map/current_room_map.asm b/dungeon_map/current_room_map.asm index 3b2e1e5..553e3f7 100644 --- a/dungeon_map/current_room_map.asm +++ b/dungeon_map/current_room_map.asm @@ -8,8 +8,11 @@ DrawWackyDoorRandoStuff: STZ.w GFXStripes - LDA.b RoomIndex - AND.w #$00FF + JSL DetectLinksSection + INC A + XBA + ASL A : ASL A : ASL A : ASL A + ORA.b RoomIndex STA.l CurrentDisplayedRoom DrawCurrentSupertile: @@ -28,6 +31,7 @@ DrawCurrentSupertile: ; 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 @@ -70,6 +74,7 @@ ClearDoorSlotScratch: DrawFullRoomTile: LDA.b $CA + AND.w #$00FF PHX ASL A TAX @@ -81,6 +86,8 @@ DrawFullRoomTile: 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 @@ -207,7 +214,10 @@ CheckEdgesTable: CLC : ADC.b $00 ADC.b $02 XBA - ORA.l CurrentDisplayedRoom + STA.b $0C + LDA.l CurrentDisplayedRoom + AND.w #$00FF + ORA.b $0C STA.b $0C PHX @@ -236,7 +246,10 @@ CheckInRoomTable: CLC : ADC.b $00 ADC.b $02 XBA - ORA.l CurrentDisplayedRoom + STA.b $0C + LDA.l CurrentDisplayedRoom + AND.w #$00FF + ORA.b $0C STA.b $0C PHX @@ -270,13 +283,32 @@ GetConnection: 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 @@ -380,6 +412,15 @@ DrawSide: 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 @@ -459,6 +500,7 @@ DrawSide: DrawStairs: PHX LDA.l CurrentDisplayedRoom + AND.w #$00FF TAX LDA.w SpiralPropsIndex, X AND.w #$00FF @@ -571,6 +613,7 @@ GetSpecificRoomVisibility: DrawDropOrWarp: PHX LDA.l CurrentDisplayedRoom + AND.w #$00FF STA.b $00 LDX.w #$0000 @@ -644,7 +687,7 @@ DrawSingleConnectedRoom: TYX LDA.l DoorSlots+1, X - AND.w #$00FF + AND.w #$000F CMP.w #$0003 BNE + LDA.l DoorSlots, X @@ -1305,10 +1348,12 @@ DoorsMapSelectCursor: ASL A TAX - LDA.l DoorSlots, X - STA.l CurrentDisplayedRoom REP #$30 + + LDA.l DoorSlots, X + AND.w #$F0FF + STA.l CurrentDisplayedRoom STZ.w GFXStripes JSL ClearDoorsMapBG1 JSL ClearDoorsMapBG2 @@ -1416,7 +1461,7 @@ ClearDoorsMapBG2: GetRoomEntrance: PHX : PHY - LDY.w #$0085 + LDY.w #$0076 ; entrance IDs 76 - 82 are dropdowns, handle those later - DEY BMI .not_found @@ -1581,3 +1626,87 @@ DrawDoorsStairs: .done RTS + +DetectLinksSection: + LDA.b RoomIndex + ASL A + TAX + LDA.l SplitRooms, X + TAX + LDA.l SplitRooms, X + AND.w #$00FF + STA.b $00 + BEQ .done + + LDA.b LinkPosX + LSR A + AND.w #$00FF + INC A + STA.b $02 + + LDA.b LinkPosY + LSR A + AND.w #$00FF + INC A + STA.b $04 + + LDA.b LinkLayer + AND.w #$00FF + INC A + STA.b $06 + + INX +.next_section + PHX + LDA.l SplitRooms, X + TAX +.next_area + LDA.l SplitRooms, X + AND.w #$00FF + CMP.w #$00FF + BEQ .not_this_section + + AND.w $06 + BEQ .not_this_area + + LDA.l SplitRooms+1, X ; x minimum + AND.w #$00FF + CMP.b $02 + BCS .not_this_area + + LDA.l SplitRooms+2, X ; x maximum + AND.w #$00FF + INC A + CMP.b $02 + BCC .not_this_area + + LDA.l SplitRooms+3, X ; y minimum + AND.w #$00FF + CMP.b $04 + BCS .not_this_area + + LDA.l SplitRooms+4, X ; y maximum + AND.w #$00FF + INC A + CMP.b $04 + BCC .not_this_area + + BRA .found + +.not_this_area + INX #5 + BRA .next_area + +.not_this_section + PLX + TXA : CLC : ADC.w #$000A : TAX + DEC.b $00 + BNE .next_section + BRA .done + +.found + PLX + +.done + LDA.b $00 + RTL diff --git a/dungeon_map/data/spiral_stairs.asm b/dungeon_map/data/spiral_stairs.asm index 058b8d8..508eb6b 100644 --- a/dungeon_map/data/spiral_stairs.asm +++ b/dungeon_map/data/spiral_stairs.asm @@ -13,7 +13,7 @@ db $00, $07, $00, $04, $00, $00, $00, $01, $7D, $0A, $00, $00, $00, $00, $04, $0 db $01, $00, $04, $00, $00, $01, $07, $00, $00, $00, $00, $0A, $00, $00, $07, $00 db $80, $00, $00, $00, $00, $01, $01, $00, $00, $00, $00, $00, $01, $00, $07, $00 db $85, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 -db $8A, $04, $8F, $00, $00, $00, $00, $00, $00, $00, $0A, $00, $00, $00, $00, $00 +db $8A, $92, $8F, $00, $00, $00, $00, $00, $00, $00, $0A, $00, $00, $00, $00, $00 db $04 SpiralProps: @@ -52,6 +52,7 @@ db $02, $00, $02, $02, $09 ; ($80) Tower Usains (2nd value unused) db $02, $00, $02, $02, $09 ; ($85) Tower Dark2 (2nd value unused) db $02, $00, $02, $02, $09 ; ($8A) Tower Dark1 (2nd value unused) db $01, $00, $09 ; ($8F) Mire2 +db $01, $00, $0A ; ($92) Mire south of Torch Room SpiralLabelOffsets: db 1, -9 diff --git a/dungeon_map/data/split_room.asm b/dungeon_map/data/split_room.asm new file mode 100644 index 0000000..b508bbd --- /dev/null +++ b/dungeon_map/data/split_room.asm @@ -0,0 +1,214 @@ +IncomingDoorMap: +; north +db $06, $07, $08 +; west +db $09, $0A, $0B +; south +db $00, $01, $02 +; east +db $03, $04, $05 + +macro d(label) +dw