diff --git a/dungeon_map/draw_loot.asm b/dungeon_map/draw_loot.asm index 73b2b6e..0fcf018 100644 --- a/dungeon_map/draw_loot.asm +++ b/dungeon_map/draw_loot.asm @@ -54,7 +54,7 @@ DrawLoot: LDX.w GFXStripes LDA.b #$FF - STA.w GFXStripes+2, X + STA.w GFXStripes+$02, X LDA.b #$01 STA.b NMISTRIPES @@ -66,35 +66,68 @@ DrawLoot: DrawSingleFloorLoot: REP #$20 AND.w #$00FF + INC A + ASL A + CLC : ADC.l DungeonMapMode ASL A TAX - LDA.l DungeonMapFloorToDataOffset, X + LDA.l MapDrawingData_floor_data_offset, X + DEC A TAY - STZ.b $06 + + LDA.l DungeonMapMode + ASL A + TAX + + SEP #$20 + LDA.l MapDrawingData_column_count, X + DEC A + STA.b $06 + + LDA.l MapDrawingData_row_count, X + DEC A + STA.b $07 .next_row REP #$20 LDA.w GFXStripes TAX - CLC : ADC.w #$0030 + CLC : ADC.w #$0034 STA.w GFXStripes + PHX + LDA.l DungeonMapMode + ASL A + TAX + + SEP #$20 LDA.b $07 + CPX.w #$0002 + BNE + + ASL A ++ + CLC : ADC.b $07 + REP #$20 AND.w #$00FF - XBA - LSR A : LSR A - CLC : ADC.w #$1092 + ASL #5 + + CLC : ADC.l MapDrawingData_bg1_grid_start, X ADC.b $0E XBA - STA.w GFXStripes+2, X + PLX + STA.w GFXStripes+$02, X CLC : ADC.w #$2000 - STA.w GFXStripes+$1A, X - - LDA.w #$1300 - STA.w GFXStripes+$04, X STA.w GFXStripes+$1C, X + LDA.w #$1500 + STA.w GFXStripes+$04, X + STA.w GFXStripes+$1E, X + + TXA + CLC : ADC.w #$0018 + TAX + .next_room REP #$20 LDA.b ($0C), Y ; get room id @@ -115,29 +148,59 @@ DrawSingleFloorLoot: TAX LDA.l LootTypeIcons+0, X - STA.w GFXStripes+$06, Y + STA.w GFXStripes+$00, Y LDA.l LootTypeIcons+2, X - STA.w GFXStripes+$08, Y + STA.w GFXStripes+$02, Y LDA.l LootTypeIcons+4, X - STA.w GFXStripes+$1E, Y + STA.w GFXStripes+$1A, Y LDA.l LootTypeIcons+6, X - STA.w GFXStripes+$20, Y + STA.w GFXStripes+$1C, Y TYX PLY - INY : INX #4 + DEY : DEX #4 + + LDA.l DungeonMapMode + CMP.w #$0001 + BNE + + LDA.b $06 + AND.w #$00FF + BEQ + + + ; skip a column if in 4x3 mode and it's not the last column + LDA.w #$0300 + STA.w GFXStripes+$02, X + STA.w GFXStripes+$1C, X + DEX : DEX ++ SEP #$20 - INC.b $06 - LDA.b $06 - CMP.b #$05 - BCC .next_room + DEC.b $06 + BPL .next_room + + LDA.l DungeonMapMode + CMP.b #$01 + BEQ + + ; draw an extra empty tile at the end to make up for width differences between modes + LDA.b #$03 + STZ.w GFXStripes+$02, X + STA.w GFXStripes+$03, X + STZ.w GFXStripes+$1C, X + STA.w GFXStripes+$1D, X ++ + + DEC.b $07 + BMI .done + + LDA.b #$00 + XBA + LDA.l DungeonMapMode + ASL A + TAX + LDA.l MapDrawingData_column_count, X + DEC A + STA.b $06 - STZ.b $06 - INC.b $07 - LDA.b $07 - CMP.b #$05 - BCS .done JMP .next_row .done diff --git a/dungeon_map/draw_rooms.asm b/dungeon_map/draw_rooms.asm index 27c83d3..66285ac 100644 --- a/dungeon_map/draw_rooms.asm +++ b/dungeon_map/draw_rooms.asm @@ -1,5 +1,24 @@ +DrawNonexistentRoom: + REP #$20 + LDA.w #$0F00 + STA.l $7F0000, X + STA.l $7F0002, X + STA.l $7F0040, X + STA.l $7F0042, X + +FinishRoom: + PHX + LDA.l DungeonMapMode + ASL A + TAX + PLA + CLC : ADC.l MapDrawingData_column_spacing, X + TAX + JML $8AE7F6 + ; $CA has room_id DrawDungeonMapRoom: + REP #$20 PHB : PHK : PLB ; need to keep this in same bank as data, or else specify bank LDA.b $0A : PHA @@ -111,7 +130,7 @@ DrawDungeonMapRoom: .done PLA : STA.b $0A PLB - RTL + JMP FinishRoom DrawEntrances: REP #$30 diff --git a/dungeon_map/dungeon_switch.asm b/dungeon_map/dungeon_switch.asm index c85998c..1c50600 100644 --- a/dungeon_map/dungeon_switch.asm +++ b/dungeon_map/dungeon_switch.asm @@ -29,13 +29,8 @@ CheckSwitchMap: RTL DungeonMapSwitch_Submodule: -; LDA.b $9B -; STA.l $7EC229 - JSL $80893D JSL $80833F -; LDA.l $7EC229 -; STA.b $9B LDA.b #$09 STA.b $14 @@ -51,11 +46,20 @@ DungeonMapSwitch_Submodule: STZ.b $07 LDA.w DungeonID + CMP.l CachedDungeonID + BEQ .current_dungeon + ASL A TAX LDA.l DungeonMapData.floor, X - STA.b $A4 + STA.b CurrentFloor + BRA .continue +.current_dungeon + LDA.l CachedCurrentFloor + STA.b CurrentFloor + +.continue REP #$20 STZ.b $E0 STZ.b $E2 @@ -90,7 +94,7 @@ SkipMapSprites: JML $8AEAEE + - LDA.l $7EC22A + LDA.l CachedDungeonID CMP.w DungeonID BEQ + JML $8AEAF3 @@ -100,19 +104,19 @@ CacheCurrentDungeon: STA.l $7EC206 SEP #$20 LDA.w DungeonID - STA.l $7EC22A - LDA.b $A4 - STA.l $7EC22B + STA.l CachedDungeonID + LDA.b CurrentFloor + STA.l CachedCurrentFloor REP #$20 RTL RestoreCurrentDungeon: LDA.b #$F3 STA.w $012C ; what we wrote over - LDA.l $7EC22A + LDA.l CachedDungeonID STA.w DungeonID - LDA.l $7EC22B - STA.b $A4 + LDA.l CachedCurrentFloor + STA.b CurrentFloor RTL RestoreDungeonMapFloorIndex: @@ -155,19 +159,67 @@ DrawDungeonLabel: INC.w $020D ; what we wrote over RTL -CountFloors: - ADC.w $8AF605, Y - STA.b $04 - LDY.w #$0000 +StartCurrentRoomSearch: + LDA.w $8AF5E9, X ; dungeon map floor count data + LSR A : LSR A : LSR A : LSR A + STA.b $00 + LDA.w $8AF5E9, X + AND.b #$0F + CLC : ADC.b $00 + ASL A + TAY RTL -CheckIfRoomFound: - CPY.w #$0032 +FindCurrentRoom: + PHX + TYA + CLC : ADC.l DungeonMapMode + ASL A + TAX + LDA.l MapDrawingData_floor_data_offset, X + STA.b $0C + LDY.w #$0000 + + LDA.l DungeonMapMode + ASL A + TAX + + SEP #$20 + +.next_room_check + CPY.b $0C BCS .not_found + LDA.b ($04), Y INY CMP.b $0E - JML $8AE877 + BEQ .found + + LDA.b $00 + CMP.l MapDrawingData_floor_pixel_column_wrap, X + BCS .next_row + CLC : ADC.l MapDrawingData_supertile_pixel_spacing, X + STA.b $00 + BRA .next_room_check + +.next_row + STZ.b $00 + + LDA.b $02 + CMP.l MapDrawingData_floor_pixel_row_wrap, X + BCS .next_floor + CLC : ADC.l MapDrawingData_supertile_pixel_spacing, X + STA.b $02 + BRA .next_room_check + +.next_floor + STZ.b $02 + BRA .next_room_check + +.found + PLX + JML $8AE891 .not_found + PLX JML $8AE8CD diff --git a/dungeon_map/hooks.asm b/dungeon_map/hooks.asm index e35c55f..a84f4cf 100644 --- a/dungeon_map/hooks.asm +++ b/dungeon_map/hooks.asm @@ -55,14 +55,21 @@ org $8AEE2B ;================================================================================ ; Overhaul of Dungeon Map Screen ;-------------------------------------------------------------------------------- -org $8AE64F +org $8AE64D PLX - JSL DrawDungeonMapRoom - JMP.w $8AE7F2 + JML DrawDungeonMapRoom + +org $8AE606 + PLX + JML DrawNonexistentRoom org $8AE152 JSL LoadLastHUDPalette +org $808BD3 + JSL LoadStripes + BRA + : NOP #9 : + + org $8AEAE8 ; vanilla checks number of sprites drawn instead of... counting... LDA.b $0E CMP.b #$02 @@ -99,13 +106,27 @@ org $8AE1EC PLB JML DrawDungeonLabel -org $8AE86A - JSL CountFloors - NOP #2 +org $8AE83E + JSL StartCurrentRoomSearch + BRA + : NOP #6 : + -org $8AE872 - JML CheckIfRoomFound - NOP +org $8AE86C + JML FindCurrentRoom + padbyte $EA + pad $8AE891 + +org $8AEBF8 + LDA.w $0217 + SEC : SBC.b $0F + BMI + + CMP.b #$18 + BCS + + skip 7 + + + +org $8AEB9A + db -8, 8, -8, 8 + db -8, -8, 8, 8 ;================================================================================ ; Show indicators of what is left in each room @@ -141,3 +162,7 @@ org $8AE2E0 org $8AE21C JSL DrawMountain BRA + : NOP #9 : + + +;================================================================================ +; Custom Door Rando Maps +;-------------------------------------------------------------------------------- diff --git a/dungeon_map/main.asm b/dungeon_map/main.asm index b7bd7eb..2f5b408 100644 --- a/dungeon_map/main.asm +++ b/dungeon_map/main.asm @@ -34,3 +34,4 @@ incsrc dungeon_switch.asm incsrc draw_loot.asm incsrc check_loot.asm incsrc blink_loot.asm +incsrc mappable_doors.asm diff --git a/dungeon_map/map_bg3.asm b/dungeon_map/map_bg3.asm index acda9f3..26b2e2d 100644 --- a/dungeon_map/map_bg3.asm +++ b/dungeon_map/map_bg3.asm @@ -1,13 +1,37 @@ -pushpc -org $809383 -db BG3DungeonMapStripes>>0 +LoadStripes: + CPY.b #$09 + BEQ .dungeon_map +.not_dungeon_map + LDA.w $80937A, Y + STA.b $00 + LDA.w $809383,Y + STA.b $01 + LDA.w $80938C,Y + STA.b $02 + RTL -org $80938C -db BG3DungeonMapStripes>>8 +.dungeon_map + LDA.l DungeonMapMode + CMP.b #$01 + BEQ .doors -org $809395 -db BG3DungeonMapStripes>>16 -pullpc +.not_doors + LDA.b #BG3DungeonMapStripes>>0 + STA.b $00 + LDA.b #BG3DungeonMapStripes>>8 + STA.b $01 + LDA.b #BG3DungeonMapStripes>>16 + STA.b $02 + RTL + +.doors + LDA.b #BG3DungeonMapDoorStripes>>0 + STA.b $00 + LDA.b #BG3DungeonMapDoorStripes>>8 + STA.b $01 + LDA.b #BG3DungeonMapDoorStripes>>16 + STA.b $02 + RTL LoadLastHUDPalette: ; what we wrote over @@ -23,45 +47,49 @@ LoadLastHUDPalette: SEP #$20 RTL +macro VanillaCommonMapStripes() + dw $4260, $0100, $2100 + dw $4360, $0E40, $2101 + dw $4B60, $0100, $6100 + dw $6260, $2EC0, $2110 + dw $6B60, $2EC0, $6110 + dw $6263, $0100, $A100 + dw $6363, $0E40, $A101 + dw $6B63, $0100, $E100 + dw $8460, $0B00, $2102, $2103, $2104, $2105, $2106, $2107 + dw $A460, $0B00, $2112, $2113, $2114, $2115, $2116, $2117 + dw $5D60, $0100, $6100 + dw $7D60, $2EC0, $6110 + dw $7D63, $0100, $E100 + dw $0060, $7E40, $2111 + dw $8063, $3E41, $2111 + dw $0060, $3EC0, $2111 + dw $0160, $3EC0, $2111 + dw $0C60, $3EC0, $2111 + dw $0D60, $3EC0, $2111 + dw $1E60, $3EC0, $2111 + dw $1F60, $3EC0, $2111 +endmacro + + BG3DungeonMapStripes: -; boring stuff from vanilla -dw $4260, $0100, $2100 -dw $4360, $0E40, $2101 -dw $4B60, $0100, $6100 -dw $6260, $2EC0, $2110 -dw $6B60, $2EC0, $6110 -dw $6263, $0100, $A100 -dw $6363, $0E40, $A101 -dw $6B63, $0100, $E100 -dw $8460, $0B00, $2102, $2103, $2104, $2105, $2106, $2107 -dw $A460, $0B00, $2112, $2113, $2114, $2115, $2116, $2117 +%VanillaCommonMapStripes() +; left edge of map border, from vanilla dw $4E60, $0100, $2100 dw $4F60, $1A40, $2101 -dw $5D60, $0100, $6100 dw $6E60, $2EC0, $2110 -dw $7D60, $2EC0, $6110 dw $6E63, $0100, $A100 dw $6F63, $1A40, $A101 -dw $7D63, $0100, $E100 -dw $0060, $7E40, $2111 -dw $8063, $3E41, $2111 -dw $0060, $3EC0, $2111 -dw $0160, $3EC0, $2111 -dw $0C60, $3EC0, $2111 -dw $0D60, $3EC0, $2111 -dw $1E60, $3EC0, $2111 -dw $1F60, $3EC0, $2111 -; new stuff here: ; horizontal borders -dw $7260, $1340, $1D11 -dw $D261, $1340, $1D11 -dw $F261, $1340, $1D11 -dw $5263, $1340, $1D11 +dw $7260, $1240, $1D11 +dw $D261, $1240, $1D11 +dw $F261, $1240, $1D11 +dw $5263, $1240, $1D11 ; vertical borders -dw $7160, $2FC0, $1D11 -dw $7C60, $2FC0, $1D11 +dw $7160, $2EC0, $1D11 +dw $7C60, $2EC0, $1D11 macro TopOfSquares(start) ; silly Big Endian @@ -94,3 +122,56 @@ endmacro %FullRow($6312) db $FF + +BG3DungeonMapDoorStripes: +%VanillaCommonMapStripes() +; left edge of map border, adjusted from vanilla +dw $4D60, $0100, $2100 +dw $4E60, $1C40, $2101 +dw $6D60, $2EC0, $2110 +dw $6D63, $0100, $A100 +dw $6E63, $1C40, $A101 + +; horizontal borders +dw $B160, $1440, $1D11 +dw $1161, $1440, $1D11 +dw $7161, $1440, $1D11 +dw $D161, $1440, $1D11 +dw $3162, $1440, $1D11 +dw $9162, $1440, $1D11 +dw $F162, $1440, $1D11 +dw $5163, $1440, $1D11 + +; vertical borders +dw $B060, $12C0, $1D11 +dw $BC60, $12C0, $1D11 +dw $3062, $12C0, $1D11 +dw $3C62, $12C0, $1D11 + +macro TopOfDoorSquares(start) + ; silly Big Endian + db >>8, , $00, $15 + dw $5D4C, $1D4C, $1D11, $5D4C, $1D4C, $1D11, $5D4C, $1D4C, $1D11, $5D4C, $1D4C +endmacro + +macro BottomOfDoorSquares(start) + ; silly Big Endian + db >>8, , $00, $15 + dw $DD4C, $9D4C, $1D11, $DD4C, $9D4C, $1D11, $DD4C, $9D4C, $1D11, $DD4C, $9D4C +endmacro + +macro FullDoorRow(start) + %TopOfDoorSquares() + %BottomOfDoorSquares(+$20) +endmacro + +; top grid +%FullDoorRow($60D1) +%FullDoorRow($6131) +%FullDoorRow($6191) + +%FullDoorRow($6251) +%FullDoorRow($62B1) +%FullDoorRow($6311) + +db $FF diff --git a/dungeon_map/mappable_doors.asm b/dungeon_map/mappable_doors.asm new file mode 100644 index 0000000..e2a870d --- /dev/null +++ b/dungeon_map/mappable_doors.asm @@ -0,0 +1,226 @@ +MapDrawingData: +.floor_data_offset + dw $0000, $0000 + dw $0019, $000C + dw $0032, $0018 + dw $004B, $0024 + dw $0064, $0030 + dw $007D, $003C + dw $0096, $0048 + dw $00AF, $0054 + dw $00C8, $0060 + +.row_data_offset + dw $0000, $0000 + dw $0005, $0004 + dw $000A, $0008 + dw $000F, $000C + dw $0014, $0010 + +.corner_tile_address + dw $00E2, $0160 + dw $00F8, $0178 + dw $03A2, $03A0 + dw $03B8, $03B8 + +.row_tile_address + dw $00E4, $0162 + dw $03A4, $03A2 + +.row_tile_length + dw $0014, $0016 + +.column_tile_address + dw $0122, $01A0 + dw $0138, $01B8 + +.column_tile_length + dw $0280, $0200 + +.floor_label_address + dw $035E, $035C + +.row_start_address + dw $0124, $01A2 + dw $01A4, $0262 + dw $0224, $0322 + dw $02A4, $03D2 + dw $0324, $04A2 + +.column_count + dw $0005, $0004 + +.column_spacing + dw $0004, $0006 + +.row_count + dw $0005, $0003 + +.bg1_grid_start + dw $1091, $10D1 + +.sprite_offset_x_base + dw $0090, $0088 + +.sprite_offset_y_base + dw $001F, $002F + dw $007F, $008F + +.supertile_pixel_spacing + dw $0010, $0018 + +.floor_pixel_column_wrap + dw $0040, $0048 + +.floor_pixel_row_wrap + dw $0040, $0030 + +macro Map_LDA(addr, label) + pushpc + org + JSR LDA_