Merge in dungeon map changes #1

Merged
karafruit merged 75 commits from FancyDoorsMap into GKNew 2026-01-25 22:43:02 +00:00
23 changed files with 1525 additions and 9 deletions
Showing only changes of commit 10ced3c9c6 - Show all commits
+14 -2
View File
@@ -209,7 +209,11 @@ incsrc gloom.asm
incsrc special_weapons.asm
incsrc variable_ganon_vulnerability.asm
incsrc pseudoflute.asm
warnpc $BA8000
incsrc dungeon_map/main.asm
warnpc $B9F000
org $B9F000
incsrc dungeon_map/settings.asm
org $A38000
incsrc stats/credits.asm ; Statically mapped
@@ -253,7 +257,7 @@ warnpc $B1A000
org $B1A000
GFX_HUD_Items:
incbin "menu/drsheetdc.2bppc"
incbin "menu/dr_sheet_dc.2bppc"
warnpc $B1A800
org $B1A800
@@ -306,6 +310,14 @@ NewFontInverted:
incbin "data/newfont_inverted.bin"
SmallCharacters:
incbin "data/smallchars.2bpp"
DungeonMapIcons1:
incbin "menu/map_icons_1.3bppc"
DungeonMapIcons2:
incbin "menu/map_icons_2.3bppc"
MapSheetD4:
incbin "menu/map_sheet_d4.3bppc"
org $8CD7DF
incsrc data/playernamecharmap.asm
org $8CE73D
+99
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
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
+261
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 -
+256
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
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
+84
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
+101
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
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
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
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
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
+1 -5
View File
@@ -1,10 +1,6 @@
LoadUnderworldSprites:
STA.b Scrap00 ; part one of what we replaced
if !FEATURE_FIX_BASEROM
LDA.w #$89
else
LDA.w #UWSpritesData>>16 ; set the bank to 28 for now
endif
LDA.w #UWSpritesData>>16 ; set the bank to 28 for now
STA.b Scrap02
LDA.w $048E
RTL
+10 -2
View File
@@ -98,10 +98,18 @@ else
endif
UWPotsPointers: ; 0x250 bytes for 0x128 rooms' 16-bit pointers
org $89DACE
if !FEATURE_FIX_BASEROM
org $01DDE7
else
org $89DACE
endif
UWPotsData: ; variable number of bytes (max 0x11D1) for all pots data
org $A88000
if !FEATURE_FIX_BASEROM
org $89D92E
else
org $A88000
endif
UWSpritesData: ; variable number of bytes (max 0x2800) for all sprites and sprite drop data
; First $2800 bytes of this bank (28) is reserved for the sprite tables
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+1
View File
@@ -274,6 +274,7 @@ GFXSheetPointers_background_bank = $80CFC0
GFXSheetPointers_background_high = $80D09F
GFXSheetPointers_background_low = $80D17E
LayerOfDestination = $81C31F
RoomData_ChestItems = $81E96C
AnimatedTileSheets = $82802E
Module1B_SpawnSelect_spawns = $828481
Overworld_ActualScreenID = $82A4E3