This commit is contained in:
2026-01-05 19:30:49 -06:00
parent d918e571ab
commit 5574eea4c7
11 changed files with 572 additions and 94 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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
;--------------------------------------------------------------------------------

View File

@@ -34,3 +34,4 @@ incsrc dungeon_switch.asm
incsrc draw_loot.asm
incsrc check_loot.asm
incsrc blink_loot.asm
incsrc mappable_doors.asm

View File

@@ -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 <start>>>8, <start>, $00, $15
dw $5D4C, $1D4C, $1D11, $5D4C, $1D4C, $1D11, $5D4C, $1D4C, $1D11, $5D4C, $1D4C
endmacro
macro BottomOfDoorSquares(start)
; silly Big Endian
db <start>>>8, <start>, $00, $15
dw $DD4C, $9D4C, $1D11, $DD4C, $9D4C, $1D11, $DD4C, $9D4C, $1D11, $DD4C, $9D4C
endmacro
macro FullDoorRow(start)
%TopOfDoorSquares(<start>)
%BottomOfDoorSquares(<start>+$20)
endmacro
; top grid
%FullDoorRow($60D1)
%FullDoorRow($6131)
%FullDoorRow($6191)
%FullDoorRow($6251)
%FullDoorRow($62B1)
%FullDoorRow($6311)
db $FF

View File

@@ -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 <addr>
JSR LDA_<label>
pullpc
LDA_<label>:
PHX
LDA.l DungeonMapMode
ASL A
TAX
LDA.l MapDrawingData_<label>, X
PLX
RTS
endmacro
macro Map_LDAY(addr, label)
pushpc
org <addr>
JSR LDA_Y_<label>
pullpc
if not(defined("LDA_Y_<label>"))
!LDA_Y_<label> = 1
LDA_Y_<label>:
PHX
TYA
CLC : ADC.l DungeonMapMode
ASL A
TAX
LDA.l MapDrawingData_<label>, X
PLX
RTS
endif
endmacro
macro Map_LDAX(addr, label)
pushpc
org <addr>
JSR LDA_X_<label>
pullpc
LDA_X_<label>:
PHX
TXA
CLC : ADC.l DungeonMapMode
ASL A
TAX
LDA.l MapDrawingData_<label>, X
PLX
RTS
endmacro
macro Map_CMP(addr, label)
pushpc
org <addr>
JSR CMP_<label>
pullpc
CMP_<label>:
PHX
PHA
LDA.l DungeonMapMode
ASL A
TAX
PLA
CMP.l MapDrawingData_<label>, X
BEQ .z_flag_set
.z_flag_clear
PLX
REP #$02
RTS
.z_flag_set
PLX
SEP #$02
RTS
endmacro
macro Map_ADC(addr, label)
pushpc
org <addr>
JSR ADC_<label>
pullpc
ADC_<label>:
PHX
PHA
LDA.l DungeonMapMode
ASL A
TAX
PLA
CLC : ADC.l MapDrawingData_<label>, X
PLX
RTS
endmacro
macro Map_ADCY(addr, label)
pushpc
org <addr>
JSR ADC_Y_<label>
pullpc
if not(defined("ADC_Y_<label>"))
!ADC_Y_<label> = 1
ADC_Y_<label>:
PHX
PHA
TYA
CLC : ADC.l DungeonMapMode
ASL A
TAX
PLA
CLC : ADC.l MapDrawingData_<label>, X
PLX
RTS
endif
endmacro
pushpc
org $8AE5DA
ADC.b $02 ; swap position of load and add for ease
org $8AEBDB
JSR ADC_Y_sprite_offset_y_base
org $8AE652 ; steal some space from the old map-drawing code we're no longer using
%Map_LDAY($8AE45F, corner_tile_address)
%Map_LDAY($8AE489, row_tile_address)
%Map_CMP($8AE4B0, row_tile_length)
%Map_LDAY($8AE4C1, column_tile_address)
%Map_CMP($8AE4EA, column_tile_length)
%Map_LDA($8AE54A, floor_label_address)
%Map_LDAX($8AE5D7, row_data_offset)
%Map_LDAY($8AE5F7, floor_data_offset)
%Map_CMP($8AE5A2, row_count)
%Map_CMP($8AE7FA, column_count)
%Map_LDAX($8AE591, row_start_address)
%Map_ADC($8AE896, sprite_offset_x_base)
%Map_ADCY($8AE8B5, sprite_offset_y_base)
%Map_ADC($8AE952, sprite_offset_y_base)
%Map_ADCY($8AEBDB, sprite_offset_y_base)
warnpc $8AE7F6
padbyte $EA
pad $8AE7F6
pullpc

View File

@@ -178,7 +178,7 @@ warnpc $B9FF10
org $B9FF10
; ---P bepc
; P - dungeon prizes
; b - bosses (and torches in GT, plus hera basement standing item)
; b - bosses (and torches in GT and desert, plus hera basement standing item)
; e - enemy drops
; p - pots
; c - chests
@@ -187,3 +187,9 @@ ItemSources:
AlwaysShowCompass:
db $01
; $00 - vanilla 5x5 maps
; $01 - special DR 4x3 maps
DungeonMapMode:
dw $0000