Big pass at dungeon item indicators

This commit is contained in:
2025-12-30 21:56:48 -06:00
parent 9a40f28a86
commit 10ced3c9c6
23 changed files with 1525 additions and 9 deletions

View File

@@ -0,0 +1,99 @@
; we want the icons indicating what is left in a room to blink
; but we don't want to redraw to BG1 every few frames
; so we duplicate the left side of BG1 to a lower portion and just toggle vertical scroll
BlinkLoot:
; do not show icons if we're scrolling
LDA.w $0210
BNE .hide
LDA.b FrameCounter
AND.b #$10
BEQ .show
.hide
LDA.b #$01
.show
STZ.b $E6
STA.w $E7
JSL $8AE96B
RTL
StartDoubleWrite:
; what we wrote over
REP #$30
STZ.w GFXStripes
STZ.w $021B
RTL
CheckDoubleWrite:
LDA.w $021C
BNE .done
LDA.b #$08
STA.w $021C
REP #$30
JML $8AE20B
.done
; what we wrote over
REP #$10
LDY.w GFXStripes
LDA.b #$FF
JML $8AE2E7
DrawMountain:
LDX.w GFXStripes
PHX
LDY.w #$0000
.next_word
LDA.w $8AEFEF, Y
STA.w GFXStripes+2, X
INX : INX
INY : INY
CPY.w #$002A
BCC .next_word
PLY
LDA.w $021B
BEQ .done
; if second copy of mountain, adjust VRAM addresses
SEP #$20
LDA.w GFXStripes+$02, Y
ORA.w $021C
STA.w GFXStripes+$02, Y
LDA.w GFXStripes+$08, Y
ORA.w $021C
STA.w GFXStripes+$08, Y
LDA.w GFXStripes+$10, Y
ORA.w $021C
STA.w GFXStripes+$10, Y
LDA.w GFXStripes+$20, Y
ORA.w $021C
STA.w GFXStripes+$20, Y
LDA.w GFXStripes+$26, Y
ORA.w $021C
STA.w GFXStripes+$26, Y
REP #$20
.done
RTL
WriteBigEndianAddressX:
ORA.w $021B
XBA
STA.w GFXStripes+2, X
AND.w #$FFF7
RTL
WriteBigEndianAddressY:
ORA.w $021B
XBA
STA.w GFXStripes+2, Y
AND.w #$FFF7
RTL

251
dungeon_map/check_loot.asm Normal file
View File

@@ -0,0 +1,251 @@
; A = room_id
; out A = level of loot
CheckLoot:
PHP
REP #$30
PHB : PHX : PHY
STA.b $00
ASL A
TAX
LDA.b $06 : PHA
STZ.b $02 ; best item class found
JSR CheckChests
JSR CheckBoss
JSR CheckPots
JSR CheckEnemies
PLA : STA.b $06
PLY : PLX : PLB
PLP
LDA.b $02
RTL
CheckChests:
LDA.w #($81<<8)
PHA
PLB : PLB
LDA.w #$0008
STA.b $04
LDY.w #$FFFD
.increment_mask
LDA.b $04
ASL A
STA.b $04
.next_chest
INY #3
CPY.w #$01F8
BCS .done
LDA.w RoomData_ChestItems, Y
AND.w #$7FFF
CMP.b $00
BNE .next_chest
LDA.l SaveDataWRAM, X
AND.b $04
BNE .increment_mask ; already got item
LDA.w RoomData_ChestItems+2, Y
AND.w #$00FF
JSR GetLootClass
BRA .increment_mask
.done
RTS
CheckBoss:
LDX.w #$FFFA
.next_boss
INX #6
LDA.l MiscLocations, X
BPL .check
RTS
.check
CMP.b $00
BNE .next_boss
TXY
CMP.b RoomIndex
BEQ .current_room
ASL A
TAX
LDA.l SaveDataWRAM, X
BRA .continue
.current_room
LDA.w RoomItemsTaken ; if checking our current room, $0403 has fresher flags
ASL #4
.continue
STA.b $04
TYX
LDA.l MiscLocations+2, X ; get bit of room data to check
AND.w #$00FF
ASL A
TAX
LDA.l DungeonMask, X
TYX
BIT.b $04
BNE .next_boss ; continue checking if we already got the item
LDA.l MiscLocations+4, X
STA.b $05
LDA.l MiscLocations+3, X
STA.b $04
LDA.b [$04]
AND.w #$00FF
JSR GetLootClass
BRA .next_boss
CheckPots:
LDA.b $00
ASL A
TAX
LDA.l UWPotsPointers, X
STA.b $04
LDA.w #bank(UWPotsData)
STA.b $06
LDY.w #$0000
LDX.w #$FFFF
.next_pot
LDA.b [$04], Y
CMP.w #$FFFF : BEQ .done
INX : INY : INY
BIT.w #$8000 : BNE .we_care ; marked as major item
LDA.b [$04], Y
AND.w #$00FF
CMP.w #$0008 : BEQ .small_key
INY
BRA .next_pot
.small_key
LDA.w #$0024
.we_care
INY
PHA
PHX
TXA : ASL A
EOR.w #$FFFF
CLC : ADC.w #$001F ; bit mask table is in opposite order of what we want
TAX
LDA.l DungeonMask, X : STA.b $08
LDA.b $00 : ASL A : TAX
LDA.l RoomPotData, X
PLX
AND.b $08
BEQ .not_obtained
PLA
BRA .next_pot
.not_obtained
PLA
AND.w #$00FF
JSR GetLootClass
BRA .next_pot
.done
RTS
CheckEnemies:
LDA.b $00
ASL A
TAX
LDA.l UWSpritesPointers, X
INC A ; skip the layered/unlayered indicator
STA.b $04
LDA.w #bank(UWSpritesData)
STA.b $06
LDY.w #$0000
LDX.w #$FFFF
.next_enemy
LDA.b [$04], Y
AND.w #$00FF
CMP.w #$00FF : BEQ .done
INY : INY
LDA.b [$04], Y
AND.w #$00FF
CMP.w #$00F8 : BEQ .major ; major item
CMP.w #$00F9 : BEQ .major ; major item in other world
CMP.w #$00E4 : BEQ .vanilla_key
INY
BRA .next_enemy
.vanilla_key
DEY : DEY
LDA.b [$04], Y
AND.w #$00FF
CMP.w #$00FD ; big key
BEQ .big_key
CMP.w #$00FE ; small key
BEQ .small_key
INY #3 ; false alarm -- probably hera basement key
BRA .next_enemy
.small_key
LDA.w #$0024
BRA .proceed
.big_key
LDA.w #$0032
BRA .proceed
.major
DEY : DEY
LDA.b [$04], Y
AND.w #$00FF
.proceed
INX
INY : INY : INY
PHA
PHX
TXA : ASL A
TAX
LDA.l DungeonMask, X : STA.b $08
LDA.b $00 : ASL A : TAX
LDA.l SpriteDropData, X
PLX
AND.b $08
BEQ .not_obtained
PLA
BRA .next_enemy
.not_obtained
PLA
AND.w #$00FF
JSR GetLootClass
BRA .next_enemy
.done
RTS
; A = item id
; updates "best loot" value if better
GetLootClass:
PHX
TAX
LDA.l LootTypeMapping, X
AND.w #$00FF
CMP.b $02
BCC +
STA.b $02
+ PLX
RTS

View File

@@ -0,0 +1,261 @@
db $0A ; 00 - Fighter Sword and Shield
db $0A ; 01 - Master Sword
db $0A ; 02 - Tempered Sword
db $0A ; 03 - Butter Sword
db $05 ; 04 - Fighter Shield
db $05 ; 05 - Fire Shield
db $05 ; 06 - Mirror Shield
db $0A ; 07 - Fire Rod
db $0A ; 08 - Ice Rod
db $0A ; 09 - Hammer
db $0A ; 0A - Hookshot
db $0A ; 0B - Bow
db $0A ; 0C - Boomerang
db $0A ; 0D - Powder
db $02 ; 0E - Bottle Refill (bee)
db $0A ; 0F - Bombos
db $0A ; 10 - Ether
db $0A ; 11 - Quake
db $0A ; 12 - Lamp
db $0A ; 13 - Shovel
db $0A ; 14 - Flute
db $0A ; 15 - Somaria
db $0A ; 16 - Bottle
db $05 ; 17 - Heartpiece
db $0A ; 18 - Byrna
db $0A ; 19 - Cape
db $0A ; 1A - Mirror
db $0A ; 1B - Glove
db $0A ; 1C - Mitts
db $0A ; 1D - Book
db $0A ; 1E - Flippers
db $0A ; 1F - Pearl
db $0C ; 20 - Crystal
db $0A ; 21 - Net
db $05 ; 22 - Blue Mail
db $05 ; 23 - Red Mail
db $03 ; 24 - Small Key
db $06 ; 25 - Compass
db $05 ; 26 - Heart Container from 4/4
db $02 ; 27 - Bomb
db $02 ; 28 - 3 bombs
db $0A ; 29 - Mushroom
db $0A ; 2A - Red boomerang
db $0A ; 2B - Full bottle (red)
db $0A ; 2C - Full bottle (green)
db $0A ; 2D - Full bottle (blue)
db $05 ; 2E - Potion refill (red)
db $05 ; 2F - Potion refill (green)
db $05 ; 30 - Potion refill (blue)
db $02 ; 31 - 10 bombs
db $08 ; 32 - Big key
db $02 ; 33 - Map
db $02 ; 34 - 1 rupee
db $02 ; 35 - 5 rupees
db $02 ; 36 - 20 rupees
db $09 ; 37 - Green pendant
db $09 ; 38 - Blue pendant
db $09 ; 39 - Red pendant
db $0A ; 3A - Tossed bow
db $0A ; 3B - Silvers
db $0A ; 3C - Full bottle (bee)
db $0A ; 3D - Full bottle (fairy)
db $05 ; 3E - Boss heart
db $05 ; 3F - Sanc heart
db $02 ; 40 - 100 rupees
db $02 ; 41 - 50 rupees
db $02 ; 42 - Heart
db $02 ; 43 - Arrow
db $02 ; 44 - 10 arrows
db $02 ; 45 - Small magic
db $02 ; 46 - 300 rupees
db $02 ; 47 - 20 rupees green
db $0A ; 48 - Full bottle (good bee)
db $0A ; 49 - Tossed fighter sword
db $0A ; 4A - Active Flute
db $0A ; 4B - Boots
db $05 ; 4C - Bomb capacity (50)
db $05 ; 4D - Arrow capacity (70)
db $0A ; 4E - 1/2 magic
db $0A ; 4F - 1/4 magic
db $0A ; 50 - Safe master sword
db $05 ; 51 - Bomb capacity (+5)
db $05 ; 52 - Bomb capacity (+10)
db $05 ; 53 - Arrow capacity (+5)
db $05 ; 54 - Arrow capacity (+10)
db $02 ; 55 - Programmable item 1
db $02 ; 56 - Programmable item 2
db $02 ; 57 - Programmable item 3
db $0A ; 58 - Upgrade-only silver arrows
db $02 ; 59 - Rupoor
db $02 ; 5A - Nothing
db $02 ; 5B - Red clock
db $02 ; 5C - Blue clock
db $02 ; 5D - Green clock
db $0A ; 5E - Progressive sword
db $05 ; 5F - Progressive shield
db $05 ; 60 - Progressive armor
db $0A ; 61 - Progressive glove
db $02 ; 62 - RNG pool item (single)
db $02 ; 63 - RNG pool item (multi)
db $0A ; 64 - Progressive bow
db $0A ; 65 - Progressive bow
db $02 ; 66 -
db $02 ; 67 -
db $02 ; 68 -
db $02 ; 69 -
db $0E ; 6A - Triforce
db $0D ; 6B - Power star
db $0D ; 6C - Triforce Piece
db $02 ; 6D - Server request item
db $02 ; 6E - Server request item (dungeon drop)
db $02 ; 6F -
db $02 ; 70 - Map of Light World
db $02 ; 71 - Map of Dark World
db $02 ; 72 - Map of Ganon's Tower
db $02 ; 73 - Map of Turtle Rock
db $02 ; 74 - Map of Thieves' Town
db $02 ; 75 - Map of Tower of Hera
db $02 ; 76 - Map of Ice Palace
db $02 ; 77 - Map of Skull Woods
db $02 ; 78 - Map of Misery Mire
db $02 ; 79 - Map of Dark Palace
db $02 ; 7A - Map of Swamp Palace
db $02 ; 7B - Map of Agahnim's Tower
db $02 ; 7C - Map of Desert Palace
db $02 ; 7D - Map of Eastern Palace
db $02 ; 7E - Map of Hyrule Castle
db $02 ; 7F - Map of Sewers
db $06 ; 80 - Compass of Light World
db $06 ; 81 - Compass of Dark World
db $06 ; 82 - Compass of Ganon's Tower
db $06 ; 83 - Compass of Turtle Rock
db $06 ; 84 - Compass of Thieves' Town
db $06 ; 85 - Compass of Tower of Hera
db $06 ; 86 - Compass of Ice Palace
db $06 ; 87 - Compass of Skull Woods
db $06 ; 88 - Compass of Misery Mire
db $06 ; 89 - Compass of Dark Palace
db $06 ; 8A - Compass of Swamp Palace
db $06 ; 8B - Compass of Agahnim's Tower
db $06 ; 8C - Compass of Desert Palace
db $06 ; 8D - Compass of Eastern Palace
db $06 ; 8E - Compass of Hyrule Castle
db $06 ; 8F - Compass of Sewers
db $08 ; 90 - Skull key
db $08 ; 91 - Reserved
db $08 ; 92 - Big key of Ganon's Tower
db $08 ; 93 - Big key of Turtle Rock
db $08 ; 94 - Big key of Thieves' Town
db $08 ; 95 - Big key of Tower of Hera
db $08 ; 96 - Big key of Ice Palace
db $08 ; 97 - Big key of Skull Woods
db $08 ; 98 - Big key of Misery Mire
db $08 ; 99 - Big key of Dark Palace
db $08 ; 9A - Big key of Swamp Palace
db $08 ; 9B - Big key of Agahnim's Tower
db $08 ; 9C - Big key of Desert Palace
db $08 ; 9D - Big key of Eastern Palace
db $08 ; 9E - Big key of Hyrule Castle
db $08 ; 9F - Big key of Sewers
db $07 ; A0 - Small key of Sewers
db $07 ; A1 - Small key of Hyrule Castle
db $07 ; A2 - Small key of Eastern Palace
db $07 ; A3 - Small key of Desert Palace
db $07 ; A4 - Small key of Agahnim's Tower
db $07 ; A5 - Small key of Swamp Palace
db $07 ; A6 - Small key of Dark Palace
db $07 ; A7 - Small key of Misery Mire
db $07 ; A8 - Small key of Skull Woods
db $07 ; A9 - Small key of Ice Palace
db $07 ; AA - Small key of Tower of Hera
db $07 ; AB - Small key of Thieves' Town
db $07 ; AC - Small key of Turtle Rock
db $07 ; AD - Small key of Ganon's Tower
db $02 ; AE - Reserved
db $03 ; AF - Generic small key
db $0C ; B0 - Crystal 6
db $0C ; B1 - Crystal 1
db $0C ; B2 - Crystal 5
db $0C ; B3 - Crystal 7
db $0C ; B4 - Crystal 2
db $0C ; B5 - Crystal 4
db $0C ; B6 - Crystal 3
db $02 ; B7 - Reserved
db $02 ; B8 -
db $02 ; B9 -
db $02 ; BA -
db $02 ; BB -
db $02 ; BC -
db $02 ; BD -
db $02 ; BE -
db $02 ; BF -
db $02 ; C0 -
db $02 ; C1 -
db $02 ; C2 -
db $02 ; C3 -
db $02 ; C4 -
db $02 ; C5 -
db $02 ; C6 -
db $02 ; C7 -
db $02 ; C8 -
db $02 ; C9 -
db $02 ; CA -
db $02 ; CB -
db $02 ; CC -
db $02 ; CD -
db $02 ; CE -
db $02 ; CF -
db $02 ; D0 - Bee trap
db $02 ; D1 - Apples
db $02 ; D2 - Fairy
db $02 ; D3 - Chicken
db $02 ; D4 - Big Magic
db $02 ; D5 - 5 Arrows
db $02 ; D6 - Good Bee
db $02 ; D7 -
db $02 ; D8 -
db $02 ; D9 -
db $02 ; DA -
db $02 ; DB -
db $02 ; DC -
db $02 ; DD -
db $02 ; DE -
db $02 ; DF -
db $02 ; E0 -
db $02 ; E1 -
db $02 ; E2 -
db $02 ; E3 -
db $02 ; E4 -
db $02 ; E5 -
db $02 ; E6 -
db $02 ; E7 -
db $02 ; E8 -
db $02 ; E9 -
db $02 ; EA -
db $02 ; EB -
db $02 ; EC -
db $02 ; ED -
db $02 ; EE -
db $02 ; EF -
db $02 ; F0 -
db $02 ; F1 -
db $02 ; F2 -
db $02 ; F3 -
db $02 ; F4 -
db $02 ; F5 -
db $02 ; F6 -
db $02 ; F7 -
db $02 ; F8 -
db $02 ; F9 -
db $02 ; FA -
db $02 ; FB -
db $02 ; FC -
db $02 ; FD -
db $02 ; FE - Server request (async)
db $02 ; FF -

View File

@@ -0,0 +1,256 @@
db $0F, $00, $1F, $0E ; 00
db $46, $46, $0E, $0E
db $00, $30, $14, $14
db $0E, $1F, $20, $0F
db $65, $74, $2D, $2E ; 04
db $FF, $FF, $FF, $FF ; 05 - unused
db $FF, $FF, $4F, $FF
db $00, $40, $00, $00 ; 07
db $0E, $0E, $10, $20 ; 08 - useless fairy entrance
db $66, $66, $FF, $FF
db $44, $44, $0E, $0E
db $2E, $67, $2E, $70 ; 0B
db $31, $31, $24, $24 ; 0C
db $FF, $FF, $4F, $FF ; 0D
db $FF, $FF, $57, $5F ; 0E
db $FF, $FF, $FF, $FF ; 0F - unused and should never be, treated as non-id
db $00, $00, $20, $00 ; 10
db $00, $30, $00, $10
db $14, $14, $24, $24
db $FF, $77, $FF, $77 ; 13
db $11, $01, $11, $11
db $34, $00, $01, $00
db $75, $65, $2E, $2E ; 16
db $40, $40, $00, $00
db $10, $0F, $00, $0F ; 18 - useless fairy drop
db $0F, $03, $0F, $02
db $6E, $6F, $6D, $75 ; 1A
db $2E, $67, $75, $FF
db $74, $74, $3E, $2E ; 1C
db $72, $67, $FF, $FF
db $FF, $68, $57, $4B
db $FF, $FF, $71, $57 ; 1F
db $FF, $FF, $4F, $FF ; 20
db $00, $10, $00, $01
db $0E, $0E, $15, $14
db $FF, $FF, $FF, $6B
db $10, $10, $01, $20 ; 24
db $FF, $FF, $FF, $FF ; 25 - unused
db $00, $3C, $14, $42 ; 26
db $40, $40, $00, $00
db $30, $1E, $24, $24 ; 28
db $1F, $0E, $0F, $00
db $10, $12, $10, $5E
db $12, $1E, $36, $00
db $00, $00, $10, $10 ; 2C - hookshot cave fairies
db $FF, $FF, $FF, $FF ; 2D - unused
db $FF, $4F, $FF, $FF ; 2E
db $00, $1E, $00, $20 ; 2F - kakariko well
db $75, $FF, $65, $FF ; 30
db $2E, $57, $2E, $57 ; 31
db $14, $14, $44, $44
db $FF, $FF, $4F, $FF ; 33
db $00, $01, $40, $01
db $4D, $77, $71, $3D ; 35
db $15, $15, $15, $15
db $77, $4D, $3D, $71 ; 37
db $6C, $FF, $77, $FF ; 38
db $FF, $FF, $72, $69 ; 39
db $64, $64, $14, $14
db $65, $FF, $75, $FF
db $00, $10, $00, $20 ; 3C - hookshot cave
db $2E, $2E, $75, $65 ; 3D
db $FF, $74, $72, $2E ; 3E
db $FF, $FF, $57, $57
db $65, $FF, $2E, $57 ; 40
db $00, $30, $14, $14
db $44, $31, $0E, $0E
db $72, $2E, $FF, $75
db $70, $3D, $70, $3D
db $6C, $74, $3D, $2E ; 45
db $14, $14, $00, $00
db $FF, $FF, $FF, $FF ; 47 - unused
db $FF, $FF, $FF, $FF ; 48 - unused
db $72, $2E, $72, $2E ; 49
db $61, $61, $24, $24
db $75, $74, $2E, $2E
db $FF, $65, $FF, $77 ; 4C
db $10, $30, $01, $00
db $72, $57, $FF, $FF ; 4E
db $1E, $00, $01, $1E
db $FF, $77, $FF, $75 ; 50
db $14, $14, $44, $44
db $01, $1E, $04, $14
db $65, $75, $2E, $2E
db $50, $50, $40, $00 ; 54
db $00, $00, $20, $00
db $74, $74, $2B, $3D
db $2E, $70, $63, $5B
db $00, $00, $21, $10 ; 58 - split
db $10, $00, $20, $00
db $FF, $FF, $FF, $4F
db $FF, $77, $FF, $75 ; 5B
db $71, $6A, $FF, $74 ; 5C
db $2E, $67, $75, $FF ; 5D
db $FF, $68, $57, $4B ; 5E
db $FF, $FF, $7B, $FF
db $0F, $13, $0F, $22 ; 60
db $47, $45, $26, $26
db $06, $14, $22, $00
db $65, $FF, $76, $FF ; 63
db $FF, $FF, $57, $71
db $FF, $FF, $71, $69
db $00, $30, $10, $00
db $00, $10, $00, $01
db $00, $10, $01, $00 ; 68
db $00, $00, $00, $00
db $FF, $4C, $FF, $74 ; 6A
db $65, $75, $2E, $2E
db $65, $FF, $2E, $71 ; 6C
db $75, $FF, $77, $FF ; 6D
db $FF, $4E, $FF, $FF ; 6E
db $00, $00, $00, $00
db $7A, $FF, $FF, $FF ; 70
db $65, $FF, $2D, $70 ; 71
db $44, $44, $04, $14 ; 72 - slight cheating I guess...
db $74, $74, $2E, $4B ; 73
db $00, $00, $05, $05
db $74, $74, $4A, $75 ; 75
db $2D, $7C, $2E, $57 ; 76
db $30, $00, $60, $60
db $00, $00, $00, $00 ; 78
db $00, $00, $00, $00
db $00, $00, $00, $00
db $70, $71, $4F, $4D
db $77, $74, $77, $77
db $2E, $70, $77, $4F ; 7D
db $FF, $77, $53, $2D ; 7E
db $77, $FF, $55, $FF
db $67, $70, $FF, $FF ; 80
db $10, $01, $00, $01
db $5D, $14, $01, $00
db $74, $75, $2B, $2E ; 83
db $04, $05, $24, $24
db $4B, $72, $2E, $5F ; 85
db $00, $00, $00, $00
db $67, $2E, $54, $74
db $00, $00, $00, $00 ; 88
db $00, $00, $0E, $0E
db $00, $00, $00, $00
db $2D, $71, $2D, $70
db $7E, $7F, $7D, $78 ; 8C
db $71, $2D, $70, $2D ; 8D
db $FF, $4E, $FF, $FF
db $00, $00, $00, $00
db $FF, $FF, $4F, $FF ; 90
db $FF, $65, $FF, $77
db $00, $00, $01, $01 ; 92 - should it be split? idk
db $2C, $2C, $77, $74 ; 93
db $00, $00, $00, $00
db $FF, $77, $FF, $75 ; 95
db $77, $FF, $2E, $57
db $65, $74, $2E, $2F ; 97
db $0E, $0E, $20, $40 ; 98
db $1E, $00, $42, $14
db $00, $00, $00, $00
db $72, $70, $70, $71
db $10, $10, $01, $01
db $70, $72, $71, $70
db $1E, $30, $00, $52
db $0E, $1F, $11, $0F
db $72, $57, $FF, $FF ; A0
db $00, $02, $1E, $12
db $45, $45, $16, $06
db $02, $0F, $12, $0F
db $FF, $FF, $4E, $FF ; A4
db $65, $75, $2E, $2E
db $00, $30, $00, $00
db $00, $0F, $0E, $1F
db $00, $03, $00, $12 ; A8
db $17, $17, $16, $16
db $03, $00, $12, $00
db $FF, $FF, $5A, $FF
db $FF, $FF, $FF, $4F ; AC
db $00, $00, $00, $00
db $0F, $34, $1F, $0E
db $11, $0F, $0E, $1F
db $2E, $67, $2E, $57 ; B0
db $74, $75, $2E, $2D
db $14, $05, $10, $11 ; B2 - split this monster somehow?
db $4A, $FF, $4A, $FF
db $10, $00, $44, $44
db $30, $00, $10, $00
db $65, $74, $75, $75
db $74, $FF, $75, $FF
db $FF, $4A, $FF, $74 ; B8
db $15, $15, $14, $14
db $73, $70, $FF, $FF
db $10, $01, $00, $01
db $34, $10, $11, $10
db $00, $00, $00, $00
db $FF, $65, $FF, $4A
db $FF, $FF, $4D, $FF
db $2E, $67, $2E, $57 ; C0
db $2E, $73, $2D, $73
db $11, $13, $01, $13
db $13, $00, $03, $00
db $44, $44, $00, $01 ; C4
db $75, $FF, $4A, $FF
db $10, $11, $10, $11
db $11, $00, $01, $00
db $FF, $FF, $FF, $4F ; C8
db $14, $14, $24, $24
db $00, $00, $00, $00
db $00, $03, $14, $07
db $13, $10, $07, $14 ; CC
db $00, $00, $00, $00
db $FF, $78, $FF, $FF
db $00, $00, $00, $00
db $2E, $67, $2E, $57 ; D0
db $4E, $4F, $70, $70
db $FF, $75, $FF, $55
db $FF, $FF, $FF, $FF ; D3 - unused
db $FF, $FF, $FF, $FF ; D4 - unused
db $75, $FF, $76, $FF
db $75, $75, $74, $76
db $00, $00, $00, $00
db $FF, $75, $FF, $77 ; D8
db $FF, $FF, $71, $71
db $FF, $FF, $5C, $FF
db $14, $06, $24, $3F
db $06, $14, $03, $00 ; DC
db $00, $00, $00, $00
db $0F, $00, $1F, $0E
db $0E, $0E, $24, $24
db $2E, $67, $76, $FF ; E0
db $00, $00, $20, $00
db $00, $1E, $00, $20
db $1E, $00, $20, $00
db $00, $02, $20, $02
db $02, $00, $26, $24
db $00, $01, $10, $00
db $01, $00, $00, $20
db $30, $30, $40, $20 ; E8 more cheating
db $00, $00, $00, $00
db $30, $0F, $20, $0F
db $0F, $30, $0F, $20
db $00, $00, $00, $00
db $30, $30, $00, $20
db $00, $00, $00, $20
db $1E, $00, $60, $60
db $00, $02, $20, $02 ; F0
db $02, $02, $00, $20
db $1F, $0E, $0F, $20
db $0E, $1F, $20, $0F
db $1F, $0E, $0F, $20
db $0E, $1F, $20, $0F
db $00, $00, $00, $00
db $00, $00, $00, $00
db $30, $30, $60, $24 ; F8
db $00, $01, $20, $00
db $34, $00, $20, $00
db $1E, $30, $24, $24
db $00, $00, $00, $00
db $30, $30, $24, $24
db $0F, $0F, $00, $20
db $00, $00, $00, $20

130
dungeon_map/draw_loot.asm Normal file
View File

@@ -0,0 +1,130 @@
RedrawLoot:
JSL DrawLoot
; what we wrote over
SEP #$20
STZ.w $0210
RTL
FirstDrawLoot:
; what we wrote over
LDA.b #$08
STA.b $17
DrawLoot:
LDA.b $07
STA.w $021B
REP #$30
PHX : PHY
STZ.b $0E
LDX.w DungeonID
LDA.l $8AF615, X
STA.b $0C
SEP #$20
LDA.l $8AF5E9, X
AND.b #$0F
CLC : ADC.w $020E
PHA
JSR DrawSingleFloorLoot
INC.b $0F
LDA.b #$80
STA.b $0E
PLA : DEC A
JSR DrawSingleFloorLoot
LDX.w GFXStripes
LDA.b #$FF
STA.w GFXStripes+2, X
LDA.b #$01
STA.b NMISTRIPES
PLY : PLX
LDA.b #$00
RTL
DrawSingleFloorLoot:
REP #$20
AND.w #$00FF
ASL A
TAX
LDA.l $8AF605, X
TAY
STZ.b $06
.next_row
REP #$20
LDA.w GFXStripes
TAX
CLC : ADC.w #$0030
STA.w GFXStripes
LDA.b $07
AND.w #$00FF
XBA
LSR A : LSR A
CLC : ADC.w #$1092
ADC.b $0E
XBA
STA.w GFXStripes+2, X
CLC : ADC.w #$2000
STA.w GFXStripes+$1A, X
LDA.w #$1300
STA.w GFXStripes+$04, X
STA.w GFXStripes+$1C, X
.next_room
REP #$20
LDA.b ($0C), Y ; get room id
PHY
AND.w #$00FF
CMP.w #$000F ; $0F = empty room
BNE .valid_room
LDA.w #$0000
BRA +
.valid_room
JSL CheckLoot
+
ASL A : ASL A : ASL A
TXY
TAX
LDA.l LootTypeIcons+0, X
STA.w GFXStripes+$06, Y
LDA.l LootTypeIcons+2, X
STA.w GFXStripes+$08, Y
LDA.l LootTypeIcons+4, X
STA.w GFXStripes+$1E, Y
LDA.l LootTypeIcons+6, X
STA.w GFXStripes+$20, Y
TYX
PLY
INY : INX #4
SEP #$20
INC.b $06
LDA.b $06
CMP.b #$05
BCC .next_room
STZ.b $06
INC.b $07
LDA.b $07
CMP.b #$05
BCS .done
JMP .next_row
.done
RTS

View File

@@ -0,0 +1,84 @@
; $CA has room_id
DrawDungeonMapRoom:
PHB : PHK : PLB ; need to keep this in same bank as data, or else specify bank
; base no-info palette
LDA.w #$0C00
STA.b $0C
PHX
LDX.w DungeonID
LDA.l MapField
AND.l DungeonMask, X
BEQ +
LDA.w #$1400
STA.b $0C
LDA.b $0E
ORA.w #$8000
STA.b $0E
+
LDA.l CompassField
AND.l DungeonMask, X
BEQ +
LDA.b $0E
ORA.w #$4000
STA.b $0E
+
PLX
LDA.b $0E
BNE +
; we haven't seen the supertile at all and don't have map or compass
LDA.w #$0F7B
STA.l $7F0042, X
ORA.w #$4000
STA.l $7F0040, X
ORA.w #$8000
STA.l $7F0000, X
AND.w #$BFFF
STA.l $7F0002, X
JMP .done
+
AND.w #$000F
BEQ +
LDA.w #$1400
STA.b $0C
+
LDA.b $CA
AND.w #$00FF
ASL A : ASL A
TAY
macro DrawQuadrant(quadrant, writeOffset)
?DrawQuadrant:
LDA.w SupertileRoomShapes+<quadrant>, Y
AND.w #$00FF
CMP.w #$00FF : BEQ ?.empty
CLC : ADC.w #$0340
ORA.w #(3-<quadrant>)<<14
PHA
LDA.b $0E
AND.w #1<<(3-<quadrant>)
BNE ?.visited
PLA
ORA.b $0C
BRA ?.write
?.visited
PLA
ORA.w #$0800
?.write
STA.l $7F0000+<writeOffset>, X
?.empty
endmacro
%DrawQuadrant(0, $00)
%DrawQuadrant(1, $02)
%DrawQuadrant(2, $40)
%DrawQuadrant(3, $42)
.done
PLB
RTL

View File

@@ -0,0 +1,101 @@
CheckSwitchMap:
SEP #$20
LDA.b $F6
AND.b #$30
BNE +
; what we wrote over
REP #$20
LDA.w $8AF5E9, X
AND.w #$000F
CLC : ADC.b $00
RTL
+ PHA
TXA
ASL A
TAX
PLA
BIT.b #$20
BNE +
INX
+ LDA.l DungeonMapData.prev, X
STA.w DungeonID
LDA.b #$04
STA.w $0200
REP #$20
LDA.w #$0000
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
STA.w $0710
LDA.b #$01
STA.w $0200
STA.w $020D
STZ.w $021B
STZ.w $021C
STZ.b $06
STZ.b $07
LDA.w DungeonID
ASL A
TAX
LDA.l DungeonMapData.floor, X
STA.b $A4
REP #$20
JML $98BC8A
SkipMapSprites:
STZ.b $00
STZ.b $0E
LDA.w $0200
CMP.b #$04
BNE +
JML $8AEAFC
+ LDA.l $7EC22A
CMP.w DungeonID
BEQ +
JML $8AEAF3
+ JML $8AEADE
CacheCurrentDungeon:
STA.l $7EC206
SEP #$20
LDA.w DungeonID
STA.l $7EC22A
LDA.b $A4
STA.l $7EC22B
REP #$20
RTL
RestoreCurrentDungeon:
LDA.b #$F3
STA.w $012C ; what we wrote over
LDA.l $7EC22A
STA.w DungeonID
LDA.l $7EC22B
STA.b $4A
RTL
RestoreDungeonMapFloorIndex:
STZ.w $020F
LDA.w $021B
STA.b $07
STZ.b $06
LDA.b $0A
AND.b #$08
RTL

105
dungeon_map/hooks.asm Normal file
View File

@@ -0,0 +1,105 @@
; move aga boss icon to correct room
org $8AEE75
db $08
; change dungeon map subsheet gfx in TR
org $80DDC9
db $57
; Dungeon Map Palettes 2-5 left half
org $9BE544
dw $0000, $71E7, $7FFF, $3B5F, $0000, $0000, $7EB5, $1CE7
org $9BE564
dw $0000, $34E0, $7FFF, $34E0, $34E0, $0000, $7EB5, $1CE7
org $9BE584
dw $0000, $71E7, $2DFF, $3B5F, $7FFF, $0000, $0018, $1CE7
org $9BE5A4
dw $0000, $34E0, $7FFF, $2656, $34E0, $0000, $7EB5, $1CE7
; move BG1 to main screen in dungeon map screen
org $8AE130
LDA.b #$17 : STA.b $1C
LDA.b #$00 : STA.b $1D
; make skull icon blink opposite our loot icons
org $8AEE2B
AND.b #$10
NOP #2
db $F0 ; BEQ to replace BCS
;================================================================================
; Overhaul of Dungeon Map Screen
;--------------------------------------------------------------------------------
org $8AE64F
PLX
JSL DrawDungeonMapRoom
JMP.w $8AE7F2
org $8AE152
JSL LoadLastHUDPalette
;================================================================================
; Swapping Dungeon in Dungeon Map Screen (L/R)
;--------------------------------------------------------------------------------
org $8AE9A7
JSL CheckSwitchMap
BRA + : NOP #3 : +
org $8AEF06
DEC.b $13
BNE +
JML DungeonMapSwitch_Submodule
+ RTL
warnpc $8AEF29
org $8AEADA
JML SkipMapSprites
org $8AE9C7
JSL RestoreDungeonMapFloorIndex
NOP
org $98BC86
JSL CacheCurrentDungeon
org $8AEFC5
JSL RestoreCurrentDungeon
NOP
;================================================================================
; Show indicators of what is left in each room
;--------------------------------------------------------------------------------
org $8AEABA
JSL RedrawLoot
NOP
org $8AE42B
JSL FirstDrawLoot
;================================================================================
; Blink indicators of what is left in each room
;--------------------------------------------------------------------------------
org $8AE964
JSL BlinkLoot
org $8AE235
JSL WriteBigEndianAddressX
org $8AE290
JSL WriteBigEndianAddressY
org $8AE350
JSL WriteBigEndianAddressY
org $8AE206
JSL StartDoubleWrite
NOP
org $8AE2E0
JML CheckDoubleWrite
NOP
org $8AE21C
JSL DrawMountain
BRA + : NOP #9 : +

33
dungeon_map/main.asm Normal file
View File

@@ -0,0 +1,33 @@
pushpc
incsrc hooks.asm
macro WriteGFXSheetPointer(sheet, location)
pushpc
org $80CFC0+<sheet>
db <location>>>16
org $80D09F+<sheet>
db <location>>>8
org $80D17E+<sheet>
db <location>>>0
pullpc
endmacro
%WriteGFXSheetPointer($C9, DungeonMapIcons1)
%WriteGFXSheetPointer($CA, DungeonMapIcons2)
%WriteGFXSheetPointer($D5, DungeonMapIcons1)
%WriteGFXSheetPointer($D6, DungeonMapIcons2)
%WriteGFXSheetPointer($D4, MapSheetD4)
pullpc
incsrc draw_rooms.asm
incsrc map_bg3.asm
incsrc dungeon_switch.asm
incsrc draw_loot.asm
incsrc check_loot.asm
incsrc blink_loot.asm

96
dungeon_map/map_bg3.asm Normal file
View File

@@ -0,0 +1,96 @@
pushpc
org $809383
db BG3DungeonMapStripes>>0
org $80938C
db BG3DungeonMapStripes>>8
org $809395
db BG3DungeonMapStripes>>16
pullpc
LoadLastHUDPalette:
; what we wrote over
JSL $9BEE52
REP #$20
LDA.l MapHUDPalette
STA.l PaletteBuffer+$3A
LDA.l MapHUDPalette+2
STA.l PaletteBuffer+$3C
LDA.l MapHUDPalette+4
STA.l PaletteBuffer+$3E
SEP #$20
RTL
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
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
; vertical borders
dw $7160, $2FC0, $1D11
dw $7C60, $2FC0, $1D11
macro TopOfSquares(start)
; silly Big Endian
db <start>>>8, <start>, $00, $13
dw $5D4C, $1D4C, $5D4C, $1D4C, $5D4C, $1D4C, $5D4C, $1D4C, $5D4C, $1D4C
endmacro
macro BottomOfSquares(start)
; silly Big Endian
db <start>>>8, <start>, $00, $13
dw $DD4C, $9D4C, $DD4C, $9D4C, $DD4C, $9D4C, $DD4C, $9D4C, $DD4C, $9D4C
endmacro
macro FullRow(start)
%TopOfSquares(<start>)
%BottomOfSquares(<start>+$20)
endmacro
; top grid
%FullRow($6092)
%FullRow($60D2)
%FullRow($6112)
%FullRow($6152)
%FullRow($6192)
%FullRow($6212)
%FullRow($6252)
%FullRow($6292)
%FullRow($62D2)
%FullRow($6312)
db $FF

83
dungeon_map/settings.asm Normal file
View File

@@ -0,0 +1,83 @@
; $B9F000
SupertileRoomShapes:
incsrc data/supertile_shapes.asm
warnpc $B9F400
org $B9F400
DungeonMapData:
db $02, $04, $00, $00 ; Sewers
db $1A, $00, $00, $00 ; Hyrule Castle
db $00, $06, $00, $00 ; Eastern Palace
db $04, $14, $00, $00 ; Desert Palace
db $14, $0C, $01, $00 ; Castle Tower
db $0C, $10, $00, $00 ; Swamp Palace
db $08, $0A, $00, $00 ; Palace of Darkness
db $12, $18, $00, $00 ; Misery Mire
db $0A, $16, $FF, $00 ; Skull Woods
db $16, $0E, $00, $00 ; Ice Palace
db $06, $08, $01, $00 ; Tower of Hera
db $10, $12, $00, $00 ; Thieves Town
db $0E, $1A, $00, $00 ; Turtle Rock
db $18, $02, $01, $00 ; Ganon's Tower
db $1A, $02, $00, $00 ; Extra
db $1A, $02, $00, $00 ; Extra
struct DungeonMapData DungeonMapData
.prev: skip 1
.next: skip 1
.floor: skip 1
.unused: skip 1
endstruct
; $B9F480
LootTypeIcons:
dw $1300, $1300, $1300, $1300 ; 00 - nothing
dw $334D, $734D, $335D, $735D ; 01 - unknown - basic chest
dw $330D, $730D, $333D, $733D ; 02 - junk - pot
dw $3307, $3308, $3317, $3318 ; 03 - small key
dw $330A, $730A, $333A, $733A ; 04 - triforce piece
dw $330C, $730C, $333C, $733C ; 05 - safety - heart
dw $330E, $730E, $333E, $733E ; 06 - compass
dw $3307, $3308, $3317, $3318 ; 07 - small key
dw $3305, $7305, $3315, $3316 ; 08 - big key
dw $3309, $7309, $3339, $7339 ; 09 - pendant
dw $330F, $730F, $333F, $733F ; 0A - inventory item - big chest
dw $3309, $7309, $3339, $7339 ; 0B - also pendant
dw $3303, $7303, $B303, $F303 ; 0C - crystal
dw $330A, $730A, $333A, $733A ; 0D - triforce piece
dw $330B, $730B, $333B, $733B ; 0E - triforce
dw $1300, $1300, $1300, $1300 ; 0F - empty (reserved)
; $B9F500
LootTypeMapping:
incsrc data/item_mapping.asm
; $B9F600
; Room ID mappings to bit to check for presence and address of item drop
MiscLocations:
dw $00C8 : db $04 : dl HeartContainer_ArmosKnights
dw $0033 : db $04 : dl HeartContainer_Lanmolas
dw $0007 : db $04 : dl HeartContainer_Moldorm
dw $005A : db $04 : dl HeartContainer_HelmasaurKing
dw $0006 : db $04 : dl HeartContainer_Arrghus
dw $0029 : db $04 : dl HeartContainer_Mothula
dw $00AC : db $04 : dl HeartContainer_Blind
dw $00DE : db $04 : dl HeartContainer_Kholdstare
dw $0090 : db $04 : dl HeartContainer_Vitreous
dw $00A4 : db $04 : dl HeartContainer_Trinexx
dw $0073 : db $05 : dl BonkKey_Desert ; torch
dw $008C : db $05 : dl BonkKey_GTower ; torch
dw $0087 : db $05 : dl StandingKey_Hera
dw $FFFF : db $FF : dl $FFFFFF ; Placeholders
dw $FFFF : db $FF : dl $FFFFFF
dw $FFFF : db $FF : dl $FFFFFF
dw $FFFF
; $B9F682
MapHUDPalette:
dw $0000, $3ED8, $2E54
; $B9F688