From 10ced3c9c645739cc8c3aca1c74491d08600348a Mon Sep 17 00:00:00 2001 From: Kara Alexandra Date: Tue, 30 Dec 2025 21:56:48 -0600 Subject: [PATCH] Big pass at dungeon item indicators --- LTTP_RND_GeneralBugfixes.asm | 16 +- dungeon_map/blink_loot.asm | 99 ++++++++ dungeon_map/check_loot.asm | 251 +++++++++++++++++++++ dungeon_map/data/item_mapping.asm | 261 ++++++++++++++++++++++ dungeon_map/data/supertile_shapes.asm | 256 +++++++++++++++++++++ dungeon_map/draw_loot.asm | 130 +++++++++++ dungeon_map/draw_rooms.asm | 84 +++++++ dungeon_map/dungeon_switch.asm | 101 +++++++++ dungeon_map/hooks.asm | 105 +++++++++ dungeon_map/main.asm | 33 +++ dungeon_map/map_bg3.asm | 96 ++++++++ dungeon_map/settings.asm | 83 +++++++ enemizer/underworld_sprites.asm | 6 +- keydrop/standing_items.asm | 12 +- menu/{drsheetdc.2bpp => dr_sheet_dc.2bpp} | Bin 2048 -> 2048 bytes menu/dr_sheet_dc.2bppc | Bin 0 -> 1460 bytes menu/drsheetdc.2bppc | Bin 1713 -> 0 bytes menu/map_icons.3bpp | Bin 0 -> 3072 bytes menu/map_icons_1.3bppc | Bin 0 -> 479 bytes menu/map_icons_2.3bppc | Bin 0 -> 668 bytes menu/map_sheet_d4.3bpp | Bin 0 -> 1536 bytes menu/map_sheet_d4.3bppc | Bin 0 -> 989 bytes vanillalabels.asm | 1 + 23 files changed, 1525 insertions(+), 9 deletions(-) create mode 100644 dungeon_map/blink_loot.asm create mode 100644 dungeon_map/check_loot.asm create mode 100644 dungeon_map/data/item_mapping.asm create mode 100644 dungeon_map/data/supertile_shapes.asm create mode 100644 dungeon_map/draw_loot.asm create mode 100644 dungeon_map/draw_rooms.asm create mode 100644 dungeon_map/dungeon_switch.asm create mode 100644 dungeon_map/hooks.asm create mode 100644 dungeon_map/main.asm create mode 100644 dungeon_map/map_bg3.asm create mode 100644 dungeon_map/settings.asm rename menu/{drsheetdc.2bpp => dr_sheet_dc.2bpp} (96%) create mode 100644 menu/dr_sheet_dc.2bppc delete mode 100644 menu/drsheetdc.2bppc create mode 100644 menu/map_icons.3bpp create mode 100644 menu/map_icons_1.3bppc create mode 100644 menu/map_icons_2.3bppc create mode 100644 menu/map_sheet_d4.3bpp create mode 100644 menu/map_sheet_d4.3bppc diff --git a/LTTP_RND_GeneralBugfixes.asm b/LTTP_RND_GeneralBugfixes.asm index bf3a4f9..6600fab 100644 --- a/LTTP_RND_GeneralBugfixes.asm +++ b/LTTP_RND_GeneralBugfixes.asm @@ -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 diff --git a/dungeon_map/blink_loot.asm b/dungeon_map/blink_loot.asm new file mode 100644 index 0000000..d0e65e1 --- /dev/null +++ b/dungeon_map/blink_loot.asm @@ -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 diff --git a/dungeon_map/check_loot.asm b/dungeon_map/check_loot.asm new file mode 100644 index 0000000..4003fdd --- /dev/null +++ b/dungeon_map/check_loot.asm @@ -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 diff --git a/dungeon_map/data/item_mapping.asm b/dungeon_map/data/item_mapping.asm new file mode 100644 index 0000000..1017def --- /dev/null +++ b/dungeon_map/data/item_mapping.asm @@ -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 - diff --git a/dungeon_map/data/supertile_shapes.asm b/dungeon_map/data/supertile_shapes.asm new file mode 100644 index 0000000..71f34c4 --- /dev/null +++ b/dungeon_map/data/supertile_shapes.asm @@ -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 diff --git a/dungeon_map/draw_loot.asm b/dungeon_map/draw_loot.asm new file mode 100644 index 0000000..2d5393d --- /dev/null +++ b/dungeon_map/draw_loot.asm @@ -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 diff --git a/dungeon_map/draw_rooms.asm b/dungeon_map/draw_rooms.asm new file mode 100644 index 0000000..3e0e2d7 --- /dev/null +++ b/dungeon_map/draw_rooms.asm @@ -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+, Y + AND.w #$00FF + CMP.w #$00FF : BEQ ?.empty + CLC : ADC.w #$0340 + ORA.w #(3-)<<14 + PHA + LDA.b $0E + AND.w #1<<(3-) + BNE ?.visited + PLA + ORA.b $0C + BRA ?.write + ?.visited + PLA + ORA.w #$0800 + ?.write + STA.l $7F0000+, X + ?.empty + endmacro + + %DrawQuadrant(0, $00) + %DrawQuadrant(1, $02) + %DrawQuadrant(2, $40) + %DrawQuadrant(3, $42) + +.done + PLB + RTL diff --git a/dungeon_map/dungeon_switch.asm b/dungeon_map/dungeon_switch.asm new file mode 100644 index 0000000..52a222d --- /dev/null +++ b/dungeon_map/dungeon_switch.asm @@ -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 diff --git a/dungeon_map/hooks.asm b/dungeon_map/hooks.asm new file mode 100644 index 0000000..a8b3428 --- /dev/null +++ b/dungeon_map/hooks.asm @@ -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 : + diff --git a/dungeon_map/main.asm b/dungeon_map/main.asm new file mode 100644 index 0000000..07d0d4f --- /dev/null +++ b/dungeon_map/main.asm @@ -0,0 +1,33 @@ +pushpc +incsrc hooks.asm + +macro WriteGFXSheetPointer(sheet, location) + pushpc + org $80CFC0+ + db >>16 + + org $80D09F+ + db >>8 + + org $80D17E+ + db >>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 diff --git a/dungeon_map/map_bg3.asm b/dungeon_map/map_bg3.asm new file mode 100644 index 0000000..acda9f3 --- /dev/null +++ b/dungeon_map/map_bg3.asm @@ -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 >>8, , $00, $13 + dw $5D4C, $1D4C, $5D4C, $1D4C, $5D4C, $1D4C, $5D4C, $1D4C, $5D4C, $1D4C +endmacro + +macro BottomOfSquares(start) + ; silly Big Endian + db >>8, , $00, $13 + dw $DD4C, $9D4C, $DD4C, $9D4C, $DD4C, $9D4C, $DD4C, $9D4C, $DD4C, $9D4C +endmacro + +macro FullRow(start) + %TopOfSquares() + %BottomOfSquares(+$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 diff --git a/dungeon_map/settings.asm b/dungeon_map/settings.asm new file mode 100644 index 0000000..bb3140b --- /dev/null +++ b/dungeon_map/settings.asm @@ -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 diff --git a/enemizer/underworld_sprites.asm b/enemizer/underworld_sprites.asm index cb80068..87f0e6f 100644 --- a/enemizer/underworld_sprites.asm +++ b/enemizer/underworld_sprites.asm @@ -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 diff --git a/keydrop/standing_items.asm b/keydrop/standing_items.asm index 23598cf..aa3c160 100644 --- a/keydrop/standing_items.asm +++ b/keydrop/standing_items.asm @@ -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 diff --git a/menu/drsheetdc.2bpp b/menu/dr_sheet_dc.2bpp similarity index 96% rename from menu/drsheetdc.2bpp rename to menu/dr_sheet_dc.2bpp index 11555562c84fb0575be66f61d381b0786b649653..aa4d3460fb9e69c09e8d43881b2a15bcb19bcdd7 100644 GIT binary patch delta 29 ZcmZn=Xb{+NfJNZ{e?}Cz`2vdpGXThS4P5{L delta 29 ncmV+&0OJ3E5P%S{zyuKffBnDv-}mqD_uu=!{eS+m&;&382k8<~ diff --git a/menu/dr_sheet_dc.2bppc b/menu/dr_sheet_dc.2bppc new file mode 100644 index 0000000000000000000000000000000000000000..34408747308207846ac4952cf383e9f261196f9c GIT binary patch literal 1460 zcmWlXdrTZv6vofY?948Y@G4p&3b-tl#%I(jnzdABKp;M<7P09cU~GIOM(U%5mURYp zc38GlpsmKzR&CU%0UuaxHB`&`2pC_DQ6N6rE`nm3W|x+l9oXT1-u`p%x%Zx&@Autv zyvU4Bb=$A}Ido?C-}`1>^+F_&O3*+aNOZa6y`t(4HCnmit-`_FdCHzAJkxuBZ+)nt zV^fE91I5%6H#}U@ShAtCv80${#e}(nn>`brhVBVZ2N@m8A`>#D3sU~f1*uY~sp#F3 zAFGIJpSkQRr=Y;+*8(ADbD-MiclrHQdS?v=#FX|J*V z`GZc7b;3MEf_JSMB)PV27r(KFN!o6tWmo4F_4JcEfXFaepV57D1J`54O_VQHxSv?r zT+D<;ic(X@M7nx^ujgD=w6br@7Fr*wqx21>f0lAzS=p2y+DNgohVIsGfpr+5Ov!c= z1W0hB7`FYa!2NdCr^{=DT7UJT{U@AdYihc#6@&PwhCS;bcw< zbBp8lPv@pjCBMZqaIywp&>uU8MAtNa#Ikup^ucu=3(H9jw)8#59kWTyXc=w6>&YZi z*+^bR)LzqG&o@3?X|&x3&l6nXX`IBdRq#B5d+;AuduJ7@KZH1h$8QABH8i7^>Qn=v z2SwK}_!7_Ud_f{db9}k84l|ZVQ>T-OMDlcMblG5i!;+Z7bSfz9vF9aGs58`k5C^bYOO%U= z#H{9QR%adcO1OYPU`%5pp0C&v>*6DYdm&^7gVp2pC${lFX~JmeT2Y8b)k86NN$kzo z+ta@;gkw_H_-%>Y#NI?Bun~<|siBcJ`jEZ?Td@YuaX%}qLP0}=>p}i}EAPoAID(IA zaHJIUk%moF$d^cwEUv-U&;iLT5tXex;}=YIT`kkgp+{x)XV4lxbh-67W@X9h5r`k- z)2>398Z_iqH=w6i4&N@*ZVm0~CeVSM@4H+&O*-T&T$s>v2dQkZ3?j%PnV9fH<+~~Q(TJ=MkZx5M-k#o zEw7+>s8CUKy-MGvU(lRS@_%sJ+8pN-=RIei{ho7_%f{oe+SnoMGQ|~-kFY(pY|!de zXurk=>2RoB;ngigi8vS8%yK1sonm?v`6&C2>3SrpSij3@y8aah8)G|kYs3{gfBa|EjQ{`u literal 0 HcmV?d00001 diff --git a/menu/drsheetdc.2bppc b/menu/drsheetdc.2bppc deleted file mode 100644 index 3f1bc71b81557ea64dab2af7924d2f5df3e70250..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1713 zcmX9;3v3i+5T5_v$CW~;tyKvi@ZS}!N+MCzVk*S$T?>r}2o>cKQHfS!L_m4i6{an+DOL2)>ma2G@)1;wgZFNq;FgsDM$X;Iz?HOR^v5eZJP zo`|WKg%sHCz1h9ZwLN?r)F9`5aBPs1R;;rRLw{Ub86S`nVO;T=daxR(-{~BHZXErtm;RoUg%}v;ykv zqu`T{;U2J>Jf1}?i8cYZlFI(=?}jTDG1!OtRj9(eDoqLl0v4{zY4V6K}Xo(+*bP2!UhezRvtd4V3igVxQIL0Z2+%CG2JVuJ)L$c?2> zb)%n&3#B6GBRQI~GSov|l%`9Z@v?wL_Ccvv(P27cpODat6_9E@)O^m+Hd3nzg{SI$eto1gWU}#%s1e)%7pE>t2n$RIJ~pDO-=U zmbWdl%QSe#Ua9*hN3~cxQ|74Dd#Ml3{em-j$%zh4w2sGrG_7kx*DOWiX+qNBwlK{? zX@p3>nO>&{?5!H+>u9n=-cJ>F$bcEPX23%Qq~AjO>6230A0m9vu;vg93)7qsC4&au zYGA(MY}0tvLCGeLGjOv8r)uso;GM+thV>J1PKY44oDMTS&#?BB{FDyX3^TC6uyQF< zK_RNG_x+sqR+y@|1LiSt6-_qjd{gi<9U6ma<>C>YZRan;=`{GNMx7?z+M8wEuO2c?=VudsqYFh>Q6qe}=r;Jd?FiseT|kVHfM^xQ0qIYR$X2Jn3pwcQ;wlkF+YAT-!)KBsn`JbfU z-V*j2ahGtS<_)rq>9yB=@=l@Y(?~X%KKWH99Jkx}6xW_NlD`|=^^op!Zqmi7SWUCO zdb&?Z6{&O?7kJoovP|uy_j1(t*uNX4+~e*5&!0{f2H5gT_-3RZ<12y9x_EE`jtRio z#4x7vMw6*BXn^=9!-bQx%^T7->zMJo`lGl`eL$4PYBM|)tK*zBxCmqi2P@CXGdY-S k)>X{8Y$neezJ#9hTp%!X#H}O76^|)qV*YM;dmN(w0hV9C_W%F@ diff --git a/menu/map_icons.3bpp b/menu/map_icons.3bpp new file mode 100644 index 0000000000000000000000000000000000000000..f498014f5438aad7632bc8a2dedbc9eb50ac9cfc GIT binary patch literal 3072 zcmc&$!A=xG5G~jc2{BIMX~KCvfMDW@#0`-651a^+@xmW$GCRUgc*0MS$ibU@g~QE6 zFCN5M>(#5Cu36ZNA=-7=?zgY2t6o>vZZCZ>k#!ry7DDR<_(WvV8viAO&D*QXl6e;$Pt8^wkNQEY8Nt2olSm1rU@N5~af z@3}r*HP#0>^y#XxK6|bY@vIMU^0SthUAg~eI`$77{AN1#f93v(XaB&-kGcNKxvKu8 z2nQCMT=h#j_pWmrxR|DO)~74GvMO2sQU6=Vm-Q!~^&j;o|GxfB+qBb`{-geL$Cvdd zpZ=r%?W&CTEozx~F9Fw`dybFziZAm!=@fN*dt3WPuo5`+38?h% zBOdD0__6=^F5@R0nAffQht6a=?*56V8rM(ve-C&6#5Lqc8KaDY$3~vXH`*C=IREin z2lY>}QcuRyNUw1x%la?mLOzN#b#s29Mm-|4umWaLLLrZGJ+ zNmjzYH2XSg;}72i9LjuAqf)5<-Cg{ij&bM@oPFs=ZY(P5`Cc`{JSYTKp9$Ps^94PSB!(#HgS5}Wov6EJBdGMQf_E?{IFVvH|DPH0`#!sDlIoFE* zU}pa-n)&hZ8~#uDE2LL{ z`lD`F4b4hB2~9Z*^b_i^I3vn@FWUA3vmsyW|4AQ(r&G5YaSy?&_Y EA3%Z~^Z)<= literal 0 HcmV?d00001 diff --git a/menu/map_icons_1.3bppc b/menu/map_icons_1.3bppc new file mode 100644 index 0000000000000000000000000000000000000000..8e6b4785bded66169acadece4ddee61a4a36cc47 GIT binary patch literal 479 zcmW-dPfHt76vfY-cl|>Q1_WUUT}Z24jGL^~MZ}?l39Y22e-qdtZdp%kE`49#Ys zWC1(Iu0lLCa^N8;fj+!Ha}j?*>`ipV+FOt=^f6@DdV^C?2|;N}Hi-&_RuvxFZ>bU4 zvggrjALz1xG%rY{`+P8ok+Y5Ozt?iyOJ1be1WP;v&RlVxm439f$s;QKYj#9=ZV|^ literal 0 HcmV?d00001 diff --git a/menu/map_icons_2.3bppc b/menu/map_icons_2.3bppc new file mode 100644 index 0000000000000000000000000000000000000000..47cd63c6d98d24792ed05541a3caf79d1048c0df GIT binary patch literal 668 zcmWlX&ubGw6vw~s&8CzzP*9MiUW9B*PZ}$vB0)knZQ82PgY*!vl&I^$f*0{%VVgQT z*_~|Sj~>KRJPDq9(UT~Mg1sqt@DGrhieRZw@X&U*)7y7=Z{~g9_cJ0vV$UWZV3ex~ z+5#xGhCzL&3*h6i^ve>crBFEtQx;bfpc&_&=Ak`vQ$#0FL)y9vRmWV4mOK_)=ivIN zts>{6gi6INmtD{C^)m!{Q00@XgZqv@iN9(19g-ovzs9(p;IMFt5s8Z2`N z7sxm>Bl4B_C#gR)S_!IDM0^Ut4+>6V>pV=MyGZdK)C@%}hW(^WR)R;6(|9?Q-~jBe zE-l^kZn-J&ZyNt`C~wdJ4G#_u|8iR6%rF-FHaWJs$ZCT^hVYx^X1i>{N?<=Op?zBD zG3Z@n?%1B~*deI9gzjabuTwn0-G?IFCH59n8^uhDk<0*ycD#>b2E*AUcAtnfMZz_Y4fzv*m)&*-TubuwbbjgkMCk zNXBJwn5$&60GtoMNH$vIed2Y3gs3ScB Ds~^da literal 0 HcmV?d00001 diff --git a/menu/map_sheet_d4.3bpp b/menu/map_sheet_d4.3bpp new file mode 100644 index 0000000000000000000000000000000000000000..7470cdafa1f0ffe09a61f57dcf347a16dd686b78 GIT binary patch literal 1536 zcma)6u}<4i6g{yW+fX+S0twWH*h(U?G9iXE4q-zX2vQiBB3WV%Fm#LQ4=^xy=+edi zfXEN@4=N=efD|@Vwbkpn&vBYmt<-y*=X1|H@7lTcGw}b>W{CS1V`54?OV)0OVHvo> z39k9O5)0Fl>l01yaEdNE_?YQ;r`^t+1_)jSeo*v_z5@hXz&XxvpXv7(=Vzq8>F7SP3tIPVHk0&uJiR42 zj`che6UpOq4h)tI&$$(&3OKfejB; z{=t|YB(_&IW0DfJ16&f~K&g6gd6|$T81Qb67yiNMSo@{E%*a)^ycG{dvD8VlBG(Wg ziDTRINV5CMN4Xz4*pFNFxCCic7P@PBvN*Gyn*UH=)J!GwOr*X_rOB$Fru}}JFL=ZY zQuNvRFm&B8)cWLQLW}mKTnAO2rD9=p9-w4>Dl%r==UFIB!ta)7lkl|}q|QQKp({ydNunhzR%LH<-rmI@a~*+YX1j~~&G+@khToR_Bcw}M zZnohAH*lj$R7qNVCmGw@_4*NM*_SHDe7Er{$uhF@eA{=NMRj0}UpHCT+-X&+UQqJq Xb9?p84UaQXfz<;-OpI1N42Ay!s1-f_ literal 0 HcmV?d00001 diff --git a/menu/map_sheet_d4.3bppc b/menu/map_sheet_d4.3bppc new file mode 100644 index 0000000000000000000000000000000000000000..3933267d91f2cdbe8277abcbfdf660ccb788bdf0 GIT binary patch literal 989 zcmW+!U5Hyn7(FxJ+@IZzxx02tLrwQy?%f!)6ry5XAtu}0>ncmYb|HNzLIW4}L0__6 zQGChWGB?S()kPPCJ}BygLPHTBL=h~Tg8C+c_#zaNhe8n+v!Hbmf5wRqGjrz5oZzk^%kbQy!_jzK1-%x7mE88A4$+dBj!7FwJ+#zeslW4dz_ za}K%Lg$F99$`1jQnL8E~3t&~OR8Ju%~;9p38 zWcD5|;Ud{#b7v#0OGXy53uo8Y6I0(7O|%hi+r*pgFr6p)3ztt&7(=cQ z#m#mskJF@{SQ3R92qbZA`kCH6-g}+o5trLUP-?5L_8(E{E4-vas6d&2tMAoVB|A5W zH&j1TFdF@SqtP!ab00_Oqv6BwJlpoXMP&?+hWaeMM|NK|6x8gvFaIDPRJ#Qw?-Kg* zLBTPeed9W4==~+MmtyGcFaNW>4~^NMrYwuMYGQ`z#x1ybh9}U}_H{s=VZEz@m(gB< z3fq_}qg=cC@vYigIRIN+403up4Phfc@igIi*z#wHdH>vN^YSOLh%kr85#)C6i}&w~ zdQ!diF5di{dbdSn*-TJ}a|ZZM`tSc4?)?fK9AS6H2wgj@=2=qdJY`IsI1vQr5~8j8 literal 0 HcmV?d00001 diff --git a/vanillalabels.asm b/vanillalabels.asm index 8ee4842..a26cdf4 100644 --- a/vanillalabels.asm +++ b/vanillalabels.asm @@ -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