diff --git a/LTTP_RND_GeneralBugfixes.asm b/LTTP_RND_GeneralBugfixes.asm index 3e96baa..a70f136 100644 --- a/LTTP_RND_GeneralBugfixes.asm +++ b/LTTP_RND_GeneralBugfixes.asm @@ -188,6 +188,8 @@ ItemReceiptGraphicsROM: ; we need some empty space here so that 0000 can mean nothing fillbyte $00 : fill 32 incbin "data/customitems.4bpp" +PreloadedGraphicsROM: +incbin "data/preloadedgfx.4bpp" warnpc $A2B000 org $A2B000 incsrc itemdatatables.asm ; Statically mapped diff --git a/custompalettes.asm b/custompalettes.asm index d19f52b..801fa3a 100644 --- a/custompalettes.asm +++ b/custompalettes.asm @@ -13,5 +13,7 @@ dw $0000, $7FFF, $27FF, $5E2D, $4F5F, $1CE7, $2E9C, $14B6 dw $0000, $7E4E, $6F44, $1CF5, $7399, $1CE7, $02F9, $0233 .crystal dw $7FFF, $7FFF, $0000, $5907, $6E0E, $0000, $7FBB, $7672 +.red_crystal +dw $7FFF, $7FFF, $0000, $0C94, $2D99, $0000, $6F3D, $4A3B .off_black dw $0000, $14A5, $14A5, $14A5, $14A5, $14A5, $14A5, $14A5 diff --git a/data/preloadedgfx.4bpp b/data/preloadedgfx.4bpp new file mode 100644 index 0000000..7b0b8ef Binary files /dev/null and b/data/preloadedgfx.4bpp differ diff --git a/data/preloadedgfx.png b/data/preloadedgfx.png new file mode 100644 index 0000000..0e20e39 Binary files /dev/null and b/data/preloadedgfx.png differ diff --git a/doorrando/hudadditions.asm b/doorrando/hudadditions.asm index 134ba28..3c77ea6 100644 --- a/doorrando/hudadditions.asm +++ b/doorrando/hudadditions.asm @@ -1,8 +1,6 @@ !BlankTile = $207F !SlashTile = $2830 !HyphenTile = $2405 -!PTile = $296C -!CTile = $295F !LTile = $2D68 !DTile = $2D60 !RedSquare = $345E @@ -114,8 +112,8 @@ dw $0000, $0000, $0000, $0000, $000a, $000a, $000a, $0014, $000a, $0014, $0000, DrHudDungeonItemsAdditions: { jsl DrawHUDDungeonItems - lda.l HUDDungeonItems : and.b #$ff : bne + : rtl : + - lda.l DRMode : cmp.b #$02 : beq + : rtl : + + lda.l DRMode : cmp.b #$02 : beq + : rtl + + phx : phy : php rep #$30 diff --git a/dungeondrops.asm b/dungeondrops.asm index b9a9cc8..b7388ec 100644 --- a/dungeondrops.asm +++ b/dungeondrops.asm @@ -3,9 +3,6 @@ ;-------------------------------------------------------------------------------- SpawnDungeonPrize: PHX : PHB - PHA : LDA.b #$00 : STA.l !MULTIWORLD_SPRITEITEM_PLAYER_ID : PLA - JSL AttemptItemSubstitution - JSL ResolveLootIDLong STA.w ItemReceiptID TAX LDA.b #$29 : LDY.b #$06 @@ -13,7 +10,7 @@ SpawnDungeonPrize: JSL AddAncillaLong BCS .failed_spawn LDA.w ItemReceiptID - STA.w AncillaGet,X : STA.w SprItemReceipt,X + STA.w AncillaGet,X JSR AddDungeonPrizeAncilla .failed_spawn PLB : PLX @@ -62,15 +59,33 @@ RTS PrepPrizeTile: PHA : PHX : PHY - LDA.b #$00 : STA.l !MULTIWORLD_SPRITEITEM_PLAYER_ID - LDA.w AncillaGet, X - JSL AttemptItemSubstitution - JSL ResolveLootIDLong - STA.w SprItemReceipt,X - JSL TransferItemReceiptToBuffer_using_ReceiptID + JSL BossPrizeGetPlayer : STA.l !MULTIWORLD_SPRITEITEM_PLAYER_ID + LDA.b #$01 : STA.l SpriteSkipEOR + LDA.w AncillaGet, X + JSL AttemptItemSubstitution + JSL ResolveLootIDLong + STA.w AncillaGet, X + JSL RequestStandingItemVRAMSlot + LDA.b #$00 : STA.l SpriteSkipEOR PLY : PLX : PLA RTL +PrizeReceiveItem: + PHA + JSL BossPrizeGetPlayer : STA.l !MULTIWORLD_ITEM_PLAYER_ID + PLA + CMP.b #$6A : BNE + + ; TODO : This doesn't increment any item counts/stats + JML ActivateTriforceCutscene + + + JSL Link_ReceiveItem + LDA.l TextBoxDefer : BEQ + + STZ.w TextID : STZ.w TextID+1 ; reset decompression buffer + JSL Main_ShowTextMessage_Alt + LDA.b #$00 : STA.l TextBoxDefer + + +RTL + SetItemPose: PHA LDA.w DungeonID : BMI .one_handed @@ -232,7 +247,6 @@ PrepPrizeOAMCoordinates: STA.b Scrap02 STA.b Scrap04 - REP #$20 LDA.w AncillaZCoord,X AND.w #$00FF STA.b ScrapBuffer72 @@ -243,9 +257,35 @@ PrepPrizeOAMCoordinates: SBC.b ScrapBuffer72 STA.b Scrap00 - SEP #$20 + JSL PrepAncillaAnimation TXY - LDA.w AncillaGet,X : TAX + LDA.w AncillaGet,Y : AND.w #$00FF : PHA + REP #$10 + ASL : TAX + LDA.l VRAMAddressOffset,X : STA.b Scrap0C + CLC : ADC.w #$0010 : STA.b Scrap0D + PLX + SEP #$10 + PHX + ; special animation handling + CPX.b #$D2 : BNE + ; fairy + LDX.w AncillaDirection,Y : BEQ ++ : CPX.b #$03 : BEQ ++ ; use other fairy GFX + LDA.b Scrap0C : CLC : ADC.w #$0002 : STA.b Scrap0C + CLC : ADC.w #$0010 : STA.b Scrap0D + ++ CPX.b #$02 : BCC .check_width ; move fairy up 2 pixels + LDA.b Scrap00 : SEC : SBC.w #$0002 : STA.b Scrap00 + BRA .check_width + + CPX.b #$D6 : BNE + ; good bee + LDA.b Scrap0C : AND.w #$FF00 : ORA.w #$007C : STA.b Scrap0C ; use blank GFX for high VRAM + LDX.w AncillaDirection,Y : BEQ ++ : CPX.b #$03 : BEQ ++ ; use other bee GFX + LDA.b Scrap0D : SEC : SBC.w #$0010 : STA.b Scrap0D + ++ CPX.b #$02 : BCC + ; move bee up 2 pixels + LDA.b Scrap00 : SEC : SBC.w #$0002 : STA.b Scrap00 + + + + .check_width + PLX + SEP #$20 LDA.l SpriteProperties_chest_width,X : BNE .wide TYX LDA.w AncillaID,X : CMP.b #$3E : BEQ .rising_crystal @@ -267,20 +307,70 @@ PrepPrizeOAMCoordinates: PLY : PLX RTL +PrepPrizeVRAMHigh: + PHX + LDX.b #$00 + JSL PrepPrizeVRAM : BCS .store + LDA.b #$24 + .store + STA.b ($90),Y + PLX +RTL + +PrepPrizeVRAMLow: + PHX + LDX.b #$01 + JSL PrepPrizeVRAM : BCS .store + LDA.b #$34 + .store + STA.b ($90),Y + PLX +RTL + +PrepPrizeVRAM: + PHY + LDA.b 9,S : TAY + LDA.w AncillaID,Y : CMP.b #$29 : BEQ + + PLY : CLC : RTL ; not a prize drop ancilla + + LDA.b Scrap0C,X : CMP.b #$24 : BEQ + : CMP.b #$34 : BEQ + + PLY : SEC : RTL ; in vanilla VRAM + + + ; use dynamic VRAM slot + PHX + LDA.w SprItemGFXSlot,Y : ASL : TAX + REP #$20 + LDA.l FreeUWGraphics,X : LSR #4 + PLX + CPX.b #$01 : BNE + + CLC : ADC.w #$0010 + + + SEP #$20 + PLY : SEC +RTL + PrepPrizeShadow: PHX - LDA.w ItemReceiptID : TAX + LDA.b 5,S : TAX : LDA.w AncillaGet,X : TAX LDA.l SpriteProperties_standing_width,X : BNE .wide LDA.b Scrap02 SEC : SBC.b #$04 STA.b Scrap02 + PLX : LDX.b #$02 + BRA .wide+1 .wide - LDA.b #$20 : STA.b Scrap04 ; What we wrote over PLX + LDA.b #$20 : STA.b Scrap04 ; What we wrote over RTL CheckPoseItemCoordinates: PHX + LDA.w SprRedrawFlag,X : BEQ + + JSL BossPrizeGetPlayer : STA.l !MULTIWORLD_SPRITEITEM_PLAYER_ID + LDA.b #$01 : STA.l SpriteSkipEOR + LDA.w AncillaGet,X + JSL RequestStandingItemVRAMSlot + LDA.b #$00 : STA.l SpriteSkipEOR + + LDA.w ItemReceiptPose : BEQ .done BIT.b #$02 : BEQ .done LDA.w AncillaGet,X : TAX @@ -302,6 +392,9 @@ CrystalOrPendantBehavior: AND.w #$00FF : ASL : TAX LDA.l InventoryTable_properties,X : BIT.w #$0080 : BNE .crystal_behavior SEP #$30 + LDA.w ItemReceiptPose : BEQ + + LDA.b #$02 : STA.b LinkDirection + + PLX : PLA RTS .crystal_behavior @@ -325,3 +418,13 @@ SetDungeonCompleted: SEP #$20 + RTS + +ClearMultiworldText: + PHP : PHX + SEP #$30 + LDA.l !MULTIWORLD_HUD_TIMER : BEQ + + LDA.b #$01 : STA.l !MULTIWORLD_HUD_TIMER + JSL GetMultiworldItem + + + PLX : PLP +RTL diff --git a/events.asm b/events.asm index 91b7586..1b6cf1f 100644 --- a/events.asm +++ b/events.asm @@ -31,6 +31,7 @@ RTL ;-------------------------------------------------------------------------------- OnDungeonBossExit: JSL StatTransitionCounter + JSL ClearMultiworldText JSL DynamicDropGFXClear RTL ;-------------------------------------------------------------------------------- diff --git a/goalitem.asm b/goalitem.asm index aadbd44..a73610a 100644 --- a/goalitem.asm +++ b/goalitem.asm @@ -247,7 +247,7 @@ CheckForCrystalBossesDefeated: LDY.w #10 .next_check - LDA.w CrystalPendantFlags_2-2,Y + LDA.w CrystalPendantFlags_2+2,Y BIT.w #$0040 BEQ ++ diff --git a/heartpieces.asm b/heartpieces.asm index 861c938..4e2fe59 100644 --- a/heartpieces.asm +++ b/heartpieces.asm @@ -3,7 +3,7 @@ ;-------------------------------------------------------------------------------- HeartPieceGet: PHX : PHY - LDA.w SprItemMWPlayer, X : STA.l !MULTIWORLD_ITEM_PLAYER_ID : STA.l !MULTIWORLD_SPRITEITEM_PLAYER_ID + LDA.w SprItemMWPlayer, X : STA.l !MULTIWORLD_SPRITEITEM_PLAYER_ID LDY.w SprItemReceipt, X : BNE + LDA.w SprSourceItemId, X : BNE ++ JSL LoadHeartPieceRoomValue @@ -16,8 +16,9 @@ HeartPieceGet: + JSL MaybeMarkDigSpotCollected .skipLoad + LDA.w SprItemMWPlayer, X : STA.l !MULTIWORLD_ITEM_PLAYER_ID CPY.b #$26 : BNE .not_heart ; don't add a 1/4 heart if it's not a heart piece - LDA.w SprItemMWPlayer, X : BNE .not_heart + CMP.b #$00 : BNE .not_heart LDA.l HeartPieceQuarter : INC A : AND.b #$03 : STA.l HeartPieceQuarter .not_heart JSL Player_HaltDashAttackLong @@ -110,8 +111,8 @@ RTL ;-------------------------------------------------------------------------------- NormalItemSkipSound: ; Out: c - skip sounds if set - LDA.l !MULTIWORLD_ITEM_PLAYER_ID : BNE .skip JSL CheckIfBossRoom : BCS .boss_room + LDA.l !MULTIWORLD_ITEM_PLAYER_ID : BNE .skip TDC CPY.b #$17 : BEQ .skip CLC @@ -816,6 +817,50 @@ HeartPieceGetPlayer: RTL } ;-------------------------------------------------------------------------------- +BossPrizeGetPlayer: +{ + PHP + REP #$20 ; set 16-bit accumulator + LDA.b RoomIndex ; these are all decimal because i got them that way + CMP.w #200 : BNE + + LDA.l Prize_ArmosKnights_Player + BRA .done + + CMP.w #51 : BNE + + LDA.l Prize_Lanmolas_Player + BRA .done + + CMP.w #7 : BNE + + LDA.l Prize_Moldorm_Player + BRA .done + + CMP.w #90 : BNE + + LDA.l Prize_HelmasaurKing_Player + BRA .done + + CMP.w #6 : BNE + + LDA.l Prize_Arrghus_Player + BRA .done + + CMP.w #41 : BNE + + LDA.l Prize_Mothula_Player + BRA .done + + CMP.w #172 : BNE + + LDA.l Prize_Blind_Player + BRA .done + + CMP.w #222 : BNE + + LDA.l Prize_Kholdstare_Player + BRA .done + + CMP.w #144 : BNE + + LDA.l Prize_Vitreous_Player + BRA .done + + CMP.w #164 : BNE + + LDA.l Prize_Trinexx_Player + BRA .done + + + LDA.w #$0000 + + .done + AND.w #$00FF ; the loads are words but the values are 1-byte so we need to clear the top half of the accumulator - no guarantee it was 8-bit before + PLP +RTL +} +;-------------------------------------------------------------------------------- HeartPieceSetRedraw: PHY LDY.b #$0F diff --git a/hooks.asm b/hooks.asm index ac69d71..54d6f2e 100755 --- a/hooks.asm +++ b/hooks.asm @@ -914,6 +914,7 @@ JSL Sprite_ConditionalPrepOAMCoord org $8799F7 ; 399F7 - Bank07.asm:4107 (JSL AddReceivedItem) JSL AddReceivedItemExpanded +BRA Link_ReceiveItem_HUDRefresh org $88C505 JSL Ancilla22_ItemReceipt_ContinueB : NOP #2 @@ -1049,10 +1050,13 @@ BCS Ancilla22_ItemReceipt_is_pendant : BRA Ancilla22_ItemReceipt_wait_for_music org $88C61D : JSL AnimatePrizeCutscene : NOP org $88C622 : BCC ItemReceipt_Animate_continue org $88C6BA : JSL CheckPoseItemCoordinates +org $88C6C3 : JSL PrepPrizeVRAMHigh +org $88C6F4 : JSL PrepPrizeVRAMLow org $88CAD6 : JSL HandleDropSFX : NOP #2 org $88CADC : BCC Ancilla29_MilestoneItemReceipt_skip_crystal_sfx org $88CAE9 : JSL PrepPrizeTile org $88CB23 : JSL PrizeDropSparkle : BCC Ancilla29_MilestoneItemReceipt_no_sparkle : NOP #2 +org $88CB6A : JSL PrizeReceiveItem org $88CB97 : JSL PrepPrizeOAMCoordinates : BRA + : NOP #$12 : + org $88CBFF : JSL PrepPrizeShadow org $88CC6C : JSL HandleCrystalsField @@ -1249,7 +1253,8 @@ org $87A3AB ; 3A3AB - Bank07.asm : 5726 - LDA.b #$12 : JSR Player_DoSfx2 _Bank07_5726: ;-------------------------------------------------------------------------------- org $879A0E ; 39A0E - Bank07.asm : 4117 - JSL HUD.RefreshIconLong -JSL Link_ReceiveItem_HUDRefresh +Link_ReceiveItem_HUDRefresh: +JSL HUDRefresh ;================================================================================ ; Swordless Mode @@ -1693,14 +1698,6 @@ org $82B15C ; <- 1315C - Bank02.asm:7672 - (LDA $7EF3CA : EOR.b #$40 : STA $7EF3 JSL IncrementOWMirror JSL FlipLWDWFlag : NOP #2 ;================================================================================ -;org $8AC5BB ; < 545BB - Bank0A.asm:1856 - (LDA $7EF3C7 : CMP.b #$03 : BNE .fail) -;JSL OverworldMap_CheckObject : RTS -;org $8AC5D8 ; < 545D8 - Bank0A.asm:1885 - (LDA $7EF3C7 : CMP.b #$07 : BNE OverworldMap_CheckPendant_fail) -;JSL OverworldMap_CheckObject : RTS -;================================================================================ -org $8AC53E ; <- 5453E - Bank0A.asm:1771 - (LDA $0AC50D, X : STA $0D) -LDA.l CrystalNumberTable-1,X -;================================================================================ ; EVERY INSTANCE OF STA $7EF3C7 IN THE ENTIRE CODEBASE org $829D51 : JSL SetLWDWMap org $8589BB : JSL SetLWDWMap @@ -1721,9 +1718,6 @@ org $85FF7D : JSL GetMapMode org $8AC01A : JSL GetMapMode org $8DC849 : JSL GetMapMode ;================================================================================ -org $8AC012 ; <- 54012 - Bank0A.asm:1039 (LDA $7EF2DB : AND.b #$20 : BNE BRANCH_DELTA) -NOP #8 -;================================================================================ org $828B8F ; <- 10B8F - Bank02.asm:2236 (LDA $7EF374 : LSR A) JSL CheckHeraBossDefeated : NOP ;================================================================================ diff --git a/inventory.asm b/inventory.asm index 1babe23..03ade75 100644 --- a/inventory.asm +++ b/inventory.asm @@ -365,7 +365,7 @@ IncrementFinalSword: PLX RTL ;-------------------------------------------------------------------------------- -Link_ReceiveItem_HUDRefresh: +HUDRefresh: LDA.l BombsEquipment : BNE + ; skip if we have bombs LDA.l BombCapacity : BEQ + ; skip if we can't have bombs LDA.l BombsFiller : BEQ + ; skip if we are filling no bombs @@ -593,6 +593,7 @@ RTL DrawPowder: ;LDA.w ItemReceiptPose : BNE .defer ; defer if link is buying a potion LDA.w SprRedrawFlag, X : BEQ + + LDA.w SprItemMWPlayer, X : STA.l !MULTIWORLD_SPRITEITEM_PLAYER_ID LDA.w SprSourceItemId, X JSL AttemptItemSubstitution JSL ResolveLootIDLong diff --git a/itemdatatables.asm b/itemdatatables.asm index 00d7a89..3c3483c 100644 --- a/itemdatatables.asm +++ b/itemdatatables.asm @@ -592,9 +592,9 @@ endmacro %SpriteProps($AD, 0, 0, $02, $04, PalettesVanilla_blue_ice+$0E) ; AD - Small key of Ganon's Tower %SpriteProps($AE, 2, 2, $02, $02, $0000) ; AE - Reserved %SpriteProps($AF, 0, 0, $02, $04, PalettesVanilla_blue_ice+$0E) ; AF - Generic small key -%SpriteProps($B0, 2, 2, $80, $80, PalettesCustom_crystal) ; B0 - Crystal 6 +%SpriteProps($B0, 2, 2, $80, $80, PalettesCustom_red_crystal) ; B0 - Crystal 6 %SpriteProps($B1, 2, 2, $80, $80, PalettesCustom_crystal) ; B1 - Crystal 1 -%SpriteProps($B2, 2, 2, $80, $80, PalettesCustom_crystal) ; B2 - Crystal 5 +%SpriteProps($B2, 2, 2, $80, $80, PalettesCustom_red_crystal) ; B2 - Crystal 5 %SpriteProps($B3, 2, 2, $80, $80, PalettesCustom_crystal) ; B3 - Crystal 7 %SpriteProps($B4, 2, 2, $80, $80, PalettesCustom_crystal) ; B4 - Crystal 2 %SpriteProps($B5, 2, 2, $80, $80, PalettesCustom_crystal) ; B5 - Crystal 4 @@ -1522,8 +1522,8 @@ VRAMAddressOffset: dw $0024 ; 21 - Net dw $0024 ; 22 - Blue Mail dw $0024 ; 23 - Red Mail - dw $0024 ; 24 - Small Key - dw $0024 ; 25 - Compbutt + dw $006B ; 24 - Small Key + dw $0024 ; 25 - Compass dw $0024 ; 26 - Heart Container from 4/4 dw $0024 ; 27 - Bomb dw $0024 ; 28 - 3 bombs diff --git a/keydrop/dynamic_si_vram.asm b/keydrop/dynamic_si_vram.asm index 46f0852..1c8b58f 100644 --- a/keydrop/dynamic_si_vram.asm +++ b/keydrop/dynamic_si_vram.asm @@ -13,7 +13,8 @@ RequestStandingItemVRAMSlot: PHX : PHY PHA LDA.b #$01 : STA.w SprRedrawFlag, X - JSL Sprite_IsOnscreen : BCC ++ + LDA.l SpriteSkipEOR : BNE + ; skips on-screen check for special cases, like for prize ancilla + JSL Sprite_IsOnscreen : BCC ++ : + ; skip sending the request if busy with other things LDA.b GameSubMode : CMP.b #$21 : BCS ++ ; skip if OW is loading Map16 GFX ; TODO: Figure out how to allow submodule 22, check DMA status instead LDA.b LinkState : CMP.b #$14 : BEQ ++ ; skip if we're mid-mirror @@ -357,6 +358,12 @@ PrepItemAnimation: LDA.b FrameCounter : AND.b #$30 : LSR #4 : STA.w SpriteDirectionTable, X RTS +PrepAncillaAnimation: + PHP : SEP #$20 + LDA.b FrameCounter : AND.b #$30 : LSR #4 : STA.w AncillaDirection, X + PLP +RTL + WaitForNewVBlank: LDA.b #$00 : STA.w NMITIMEN ; Disable interrupts - LDA.w RDNMI : BMI - ; Wait until v-blank is over diff --git a/keydrop/standing_items.asm b/keydrop/standing_items.asm index 84ee2b7..5cd31ce 100644 --- a/keydrop/standing_items.asm +++ b/keydrop/standing_items.asm @@ -352,7 +352,7 @@ SetupEnemyDropIndicator: ; LDA.w DungeonID : AND.w #$00FF : CMP.w #$00FF : BEQ .skipCompassChecks ; compass checks ; does compass for dungeon exist? -; LSR : TAX : LDA.l ExistsTransfer, X : TAX : LDA.l CompassExists, X : BEQ .skipCompassChecks +; LSR : TAX : LDA.l CompassExists : AND.l DungeonItemMasks,X : BEQ .skipCompassChecks ; do we have the compass ; sewers? outstanding? ; LDA.l CompassField : LDX.w DungeonID : AND.l DungeonMask, X : BEQ .done diff --git a/menu/overworldmap.asm b/menu/overworldmap.asm index fcfe38b..a85fc1c 100644 --- a/menu/overworldmap.asm +++ b/menu/overworldmap.asm @@ -1,146 +1,413 @@ pushpc +org $8ABABE : JSL WorldMap_LoadChrHalfSlot + +org $8ABDF6 +WorldMapIcon_DungeonPointers: ; dungeon idx order +dw WorldMapIcon_pos_hc +dw $0000 +dw WorldMapIcon_pos_ep +dw WorldMapIcon_pos_dp +dw WorldMapIcon_pos_at +dw WorldMapIcon_pos_sp +dw WorldMapIcon_pos_pod +dw WorldMapIcon_pos_mm + +dw WorldMapIcon_pos_sw +dw WorldMapIcon_pos_ip +dw WorldMapIcon_pos_toh +dw WorldMapIcon_pos_tt +dw WorldMapIcon_pos_tr +dw WorldMapIcon_pos_gt + +WorldMapIcon_ExtraPointers: ; dungeon idx order +dw WorldMapIcon_extrapos_hc +dw $0000 + +dw $0000 +dw WorldMapIcon_extrapos_dp +dw $0000 +dw $0000 +dw $0000 +dw $0000 +dw WorldMapIcon_extrapos_sw +dw $0000 + +dw $0000 +dw $0000 +dw WorldMapIcon_extrapos_tr +dw $0000 + +warnpc $8ABE2E +org $8ABE2E +; located posx/posy, dislocated posx/posy, prize pox/posy +; located = proper location of icon (default: if you have map) +; dislocated = location of icon if proper location is hidden from player +; highest bit on first posx indicates which world it should show in +; $FFxx on X coord means skip drawing +WorldMapIcon_pos: +.hc +dw $FF00, $FF00, $FF00, $FF00, $FF00, $FF00 +.ep +dw $0F31, $0620, $FF00, $FF00, $0F31, $0620 +.dp +dw $0108, $0D70, $FF00, $FF00, $0108, $0D70 +.at +dw $FF00, $FF00, $FF00, $FF00, $FF00, $FF00 +.sp +dw $8759, $0ED0, $FF00, $FF00, $8759, $0ED0 +.pod +dw $8F40, $0620, $FF00, $FF00, $8F40, $0620 +.mm +dw $8100, $0CA0, $FF00, $FF00, $8100, $0CA0 +.sw +dw $8082, $00B0, $FF00, $FF00, $8082, $00B0 +.ip +dw $8CA0, $0DA0, $FF00, $FF00, $8CA0, $0DA0 +.toh +dw $08D0, $0080, $FF00, $FF00, $08D0, $0080 +.tt +dw $81D0, $0780, $FF00, $FF00, $81D0, $0780 +.tr +dw $8F11, $0103, $FF00, $FF00, $8F11, $0103 +.gt +dw $FF00, $FF00, $FF00, $FF00, $FF00, $FF00 + +warnpc $8ABECA +org $8ABECA +; additional icons posx/posy (terminator = $FFxx) +; additional icons only show if located +; highest bit on posx indicates which world it should show in +WorldMapIcon_extrapos: +.hc +dw $FF00, $FF00, $FF00, $FF00, $FF00, $FF00, $FF00, $FF00, $FFFF +.dp +dw $FF00, $FF00, $FF00, $FF00, $FF00, $FF00, $FFFF +.sw +dw $FF00, $FF00, $FF00, $FF00, $FF00, $FF00, $FF00, $FF00, $FF00, $FF00, $FF00, $FF00, $FF00, $FF00, $FFFF +.tr +dw $FF00, $FF00, $FF00, $FF00, $FF00, $FF00, $FFFF + +warnpc $8ABF36 +org $8ABF36 +; vhpp ccco tttttttt +; v/h - vert/horiz flip +; p - draw priority +; c - color palette idx +; o - OAM page change +; t - VRAM tile idx +WorldMapIcon_prize_tile: +db $00, $00 ; ; Hyrule Castle +db $00, $00 ; ; Sewers +db $38, $62 ; green pendant ; Eastern Palace +db $34, $60 ; blue pendant ; Desert Palace +db $00, $00 ; ; Agahnim's Tower +db $34, $64 ; crystal ; Swamp Palace +db $34, $64 ; crystal ; Dark Palace +db $32, $64 ; red crystal ; Misery Mire +db $34, $64 ; crystal ; Skull Woods +db $32, $64 ; red crystal ; Ice Palace +db $32, $60 ; red pendant ; Tower of Hera +db $34, $64 ; crystal ; Thieves' Town +db $34, $64 ; crystal ; Turtle Rock +db $00, $00 ; ; Ganon's Tower + +warnpc $8ABF52 +org $8ABF52 +WorldMapIcon_dungeon_tile: +db $22, $7E ; white H ; Hyrule Castle +db $00, $00 ; ; Sewers +db $24, $7F ; blue 1 ; Eastern Palace +db $24, $79 ; blue 2 ; Desert Palace +db $22, $7D ; white A ; Agahnim's Tower +db $22, $79 ; red 2 ; Swamp Palace +db $22, $7F ; red 1 ; Dark Palace +db $22, $6F ; red 6 ; Misery Mire +db $22, $6C ; red 3 ; Skull Woods +db $22, $6E ; red 5 ; Ice Palace +db $24, $6C ; blue 3 ; Tower of Hera +db $22, $6D ; red 4 ; Thieves' Town +db $22, $7C ; red 7 ; Turtle Rock +db $22, $66 ; skull ; Ganon's Tower +; db $22, $68 ; red X + +warnpc $8ABF6E +org $8ABF6E +CompassExists: +dw $37F8 + +; mirror portal fixes +org $8ABF74 +db $24, $64, $E4, $A4 ; lowering mirror portal draw priority +org $8ABFFA +db $4C ; use other mirror portal gfx +org $8AC00E +db $01 ; draw in 2nd OAM slot + +org $8AC012 ; <- 54012 - Bank0A.asm:1039 (LDA $7EF2DB : AND.b #$20 : BNE BRANCH_DELTA) +BRA + : NOP #6 : + ; skip pyramid open check + +; Scrap +; $00/$01 = Dungeon Pointer +; $02/$03 = Extra Pointer +; $04 = Current World +; $05 = Current Dungeon +; $06 = Helper Bitfield +; $0B-$0F = OAM GFX Data org $8AC02B DrawPrizesOverride: -LDX.b #$FF + PHB : LDA.b #WorldMapIcon_DungeonPointers>>16 : PHA : PLB + LDA.l CurrentWorld : STA.b Scrap04 + REP #$20 + LDA.w #$0800+8 : STA.b OAMPtr + LDA.w #$0A20+2 : STA.b OAMPtr+2 + LDY.b #$1A + .next_dungeon + STY.b Scrap05 + REP #$20 + LDA.w WorldMapIcon_DungeonPointers,Y : BNE + : JMP .advance : + + STA.b Scrap00 + LDA.w WorldMapIcon_ExtraPointers,Y : STA.b Scrap02 + JSR WorldMap_CheckForDungeonState + LDA.w WorldMapIcon_dungeon_tile,Y : BNE + : JMP .advance : + + XBA : STA.b Scrap0C + TAX : CPX.b #$68 : BNE + + ; handle red X animation + PHX + LDA.b FrameCounter : LSR #3 : AND.w #$0003 : TAX + LDA.l WorldMap_RedXChars,X : TAX : STX.b Scrap0D + PLX : CPX.b #$68 + BRA .do_dungeon + + + LDA.b FrameCounter : AND.w #$0010 : BEQ + : JMP .show_prizes : + + .do_dungeon + ; determine tile size + LDX.b #$00 : BCS + + LDX.b #$02 + + STX.b Scrap0B -.loopStart - INX : PHX - JSR OverworldMap_CheckForPrize - BCC + : JMP .skip_draw : + + LDA.l CompassMode : AND.w #$00F0 : ORA.b Scrap06 + BIT.w #$0040 : BEQ .main_dungeon_icon + BIT.w #$0003 : BEQ .main_dungeon_icon + ; draw additional dungeon icon under prize + LDY.b #$08 ; 8 is located + BIT.w #$0002 : BNE + + LDY.b #$04 ; 4 is dislocated + + + JSR WorldMap_ValidateCoords : BCS .main_dungeon_icon + JSR WorldMap_DrawTile - TXA : ASL A : TAX - LDA.l MapCompassFlag - AND.b #$01 : BNE + - LDA.l WorldMapIcon_posx_vanilla+1, X : STA.l $7EC10B - LDA.l WorldMapIcon_posx_vanilla, X : STA.l $7EC10A - LDA.l WorldMapIcon_posy_vanilla+1, X : STA.l $7EC109 - LDA.l WorldMapIcon_posy_vanilla, X : STA.l $7EC108 - BRA .adjustment - + LDA.l WorldMapIcon_posx_located+1, X : STA.l $7EC10B - LDA.l WorldMapIcon_posx_located, X : STA.l $7EC10A - LDA.l WorldMapIcon_posy_located+1, X : STA.l $7EC109 - LDA.l WorldMapIcon_posy_located, X : STA.l $7EC108 - .adjustment - LDA.l WorldMapIcon_tile, X : CMP.b #$FF : BEQ .skip_draw - LDA.l WorldMapIcon_tile+1, X : BEQ .dont_adjust - CMP.b #$64 : BEQ .is_crystal - LDA.b FrameCounter : AND.b #$10 : BNE .skip_draw - .is_crystal - JSR WorldMapIcon_AdjustCoordinate - .dont_adjust - JSR WorldMap_CalculateOAMCoordinates - BCC .skip_draw - PLX : PHX : TXA : ASL A : TAX - LDA.l WorldMapIcon_tile+1, X : BEQ .is_red_x - LDA.l MapCompassFlag : CMP.b #$01 : BEQ .is_red_x - LDA.l WorldMapIcon_tile+1, X : STA.b Scrap0D - LDA.l WorldMapIcon_tile, X : STA.b Scrap0C - LDA.b #$02 : BRA .continue - .is_red_x - LDA.b FrameCounter : LSR #3 : AND.b #$03 : TAX - LDA.l WorldMap_RedXChars,X : STA.b Scrap0D - LDA.b #$32 : STA.b Scrap0C : LDA.b #$00 - .continue - STA.b Scrap0B - PLX : PHX - INX : JSR WorldMap_HandleSpriteBlink - .skip_draw - ; end of loop - PLX : CPX.b #12 : BCS + : JMP .loopStart : + + ; determine located/dislocated/hidden + .main_dungeon_icon + LDA.l CompassMode : AND.w #$00F0 : ORA.b Scrap06 + BIT.w #$0020 : BEQ + : BIT.w #$0004 : BNE .show_dungeon ; compass mode, show dungeon icon if its allowed to + + BIT.w #$0001 : BNE + : JMP .advance : + ; hidden + .show_dungeon + LDY.b #$00 ; 0 is located + BIT.w #$0004 : BNE + : BIT.w #$0030 : BEQ + + LDY.b #$04 ; 4 is dislocated + + - PLA : STA.l $7EC10B - PLA : STA.l $7EC10A - PLA : STA.l $7EC109 - PLA : STA.l $7EC108 - RTS + ; determine if draw and/or continue + JSR WorldMap_ValidateCoords : BCC + + BNE .extras : BRA .advance + + + JSR WorldMap_DrawTile + ; TODO: draw X if prize icon is X?... here? + .extras + CPY.b #$04 : BCS .advance ; dislocated dungeon skips extras + LDA.b Scrap02 : BEQ .advance : STA.b Scrap00 + LDY.b #$00 + .next_icon + JSR WorldMap_ValidateCoords : BCC + + BEQ .advance : INY #4 : BRA .next_icon + + + JSR WorldMap_DrawTile + BRA .next_icon + .show_prizes + LDA.w WorldMapIcon_prize_tile,Y : BEQ .advance + XBA : STA.b Scrap0C + LDX.b #$02 : STX.b Scrap0B ; all prize icons are wide -; X - the index of the prize marker -OverworldMap_CheckForPrize: -PHX - LDA.b #$00 : STA.l MapCompassFlag - JSR OverworldMap_CheckForCompass - BCC + - LDA.l MapCompassFlag : ORA.b #$01 : STA.l MapCompassFlag - LDA.l CurrentWorld : AND.b #$40 : BNE ++ ; is the compass position on LW or DW? - LDA.l WorldCompassMask, X : BEQ + : JMP .fail - ++ LDA.l WorldCompassMask, X : BNE + : JMP .fail - + JSR OverworldMap_CheckForMap - BCC + - LDA.l MapCompassFlag : ORA.b #$02 : STA.l MapCompassFlag - + - LDA.l MapCompassFlag : BEQ .fail - CMP.b #$02 : BNE .checkIfObtained - LDA.l CurrentWorld : AND.b #$40 : BNE + - CPX.b #3 : BCS .fail : BRA .checkIfObtained - + CPX.b #10 : BCS .fail - CPX.b #3 : BCC .fail + ; determine located/dislocated/unknown + LDA.l CompassMode : AND.w #$00F0 : ORA.b Scrap06 + LDY.b #$04 ; 4 is dislocated + BIT.w #$0003 : BEQ .advance + BIT.w #$0002 : BEQ + + LDY.b #$08 ; 8 is located + BIT.w #$0001 : BNE + + ; don't know what prize + BIT.w #$0040 : BEQ .advance + ; red X + STZ.b Scrap0B + LDA.b FrameCounter : LSR #3 : AND.w #$0003 : TAX + LDA.l WorldMap_RedXChars,X : AND.w #$00FF : ORA.w #$2200 : STA.b Scrap0C + + - .checkIfObtained - LDA.l MC_DungeonIdsForPrize, X - BPL +++ : CLC : BRA .done : +++ ; non-prize flags - CMP.b #$02 : BCC .hyrule_castle - ASL : TAX - REP #$20 - LDA.l DungeonsCompleted : AND.l DungeonItemMasks,X : BNE .fail - CLC : BRA .done - - ; see if hyrule castle has been completely cleared - .hyrule_castle - REP #$20 - LDA.l CompassTotalsWRAM, X : SEC : SBC.l DungeonLocationsChecked, X + ; determine if draw and/or continue + JSR WorldMap_ValidateCoords : BCS .advance + JSR WorldMap_DrawTile + .advance + LDY.b Scrap05 : DEY #2 : BMI + : JMP .next_dungeon : + + PLB + PLA : XBA : STA.l $7EC10A + PLA : XBA : STA.l $7EC108 SEP #$20 - BEQ .fail - CLC : BRA .done - - .fail - SEC -.done -SEP #$20 -PLX RTS -; X - which compass in question -; CLC - should not move indicator -; SEC - yep indicator can move -OverworldMap_CheckForCompass: - LDA.l CompassMode : AND.b #$80 : BEQ .unset ; should I check for compass logic - LDA.l CompassMode : AND.b #$40 : BEQ .set ; compasses/maps aren't shuffled - LDA.l CompassMode : AND.b #$20 : BNE + - JSR OverworldMap_CheckForMap : BCC .unset : BRA .set - + LDA.l CompassExists, X : BEQ .set ; compass doesn't exist +; returns with C set if we skip drawing +; returns with Z unset if we want to continue loop for this dungeon +WorldMap_ValidateCoords: + ; checks if icon is valid + LDA.b (Scrap00),Y : CMP.w #$FF00 : LDX.b #$00 : BCS .fail ; exits with C and Z set + BIT.w #$8000 : BEQ + + LDX.b #$40 + + + ; checks if icon is for this world + CPX.b Scrap04 : BNE .fail ; exits with C set and Z unset + AND.w #$7FFF : STA.l $7EC10A + INY #2 : LDA.b (Scrap00),Y : STA.l $7EC108 + INY #2 +CLC : RTS +.fail +SEC : RTS + +WorldMap_DrawTile: + SEP #$20 + LDX.b Scrap0B : TXA : STA.b (OAMPtr+2) + INC.b OAMPtr+2 + LDA.b Scrap00 : PHA + JSR WorldMap_CalculateOAMCoordinates + PLA : STA.b Scrap00 + LDX.b Scrap0B : BEQ + + LDA.b Scrap0E : SEC : SBC.b #$04 : STA.b Scrap0E + LDA.b Scrap0F : SEC : SBC.b #$04 : STA.b Scrap0F + + + REP #$20 + LDA.b Scrap0E : STA.b (OAMPtr) + INC.b OAMPtr : INC.b OAMPtr + LDA.b Scrap0C : STA.b (OAMPtr) + INC.b OAMPtr : INC.b OAMPtr +RTS + +; Y - dungeon index +; TODO: This is terribly inefficient and needs to be rewritten someday +; DungeonItemMasks = 16-bit mask for bitfields +; DungeonsCompleted = 16-bit bitfield for beaten bosses +; MapMode = flag is maps are not wild +; MapField = 16-bit bitfield for collected maps +; MapOverlay = 16-bit bitfield for revealed prizes via Saha/Bomb Shop +; CompassMode = (repurposed version of MapMode above) +; 0x80 = flag is compasses are not wild (similar to MapMode) +; 0x10 = Maps reveals location of dungeons +; 0x20 = Compass reveals location of dungeons +; 0x40 = Boss kill reveals location of prize +; CompassField = 16-bit bitfield for collected compasses +WorldMap_CheckForDungeonState: + PHY : TYX + LDY.b #$00 ; used as bitfield + ; determine if prize is revealed + LDA.l MapMode : AND.w #$0001 : BEQ .setRevealPrize ; 0 = always show, 1 = requires map + LDA.l MapField : ORA.l MapOverlay : AND.l DungeonItemMasks,X : BEQ + + .setRevealPrize + TYA : ORA.w #$0001 : TAY + + + + ; determine if prize is located + LDA.l CompassMode : BIT.w #$0040 : BEQ + ; boss defeated + JSR WorldMap_CheckPrizeCollected : BCC ++ + TYA : AND.w #$00FC : TAY ; prize collected, hide prize icons + BRA .dungeon_icon + ++ LDA.l DungeonsCompleted : AND.l DungeonItemMasks,X : BEQ ++ + .setLocatePrize + TYA : ORA.w #$0002 : TAY + BRA .dungeon_icon + ++ LDA.l MapOverlay : AND.l DungeonItemMasks,X : BNE .setLocatePrize + BRA .dungeon_icon + + BIT.w #$0030 : BNE + ; Default ow map + .defaultPrizeCheck + LDA.l MapMode : AND.w #$00FF : BEQ .setLocatePrize ; 0 = always show, 1 = requires map + LDA.l MapField : ORA.l MapOverlay : AND.l DungeonItemMasks,X : BNE .setLocatePrize + BRA .dungeon_icon + + BIT.w #$0020 : BEQ + ; compass collected + BIT.w #$0080 : BEQ .setLocatePrize ; 0 = always show, 1 = require compass + LDA.l CompassExists : AND.l DungeonItemMasks,X : BEQ .setLocatePrize + LDA.l CompassField : ORA.l MapOverlay : AND.l DungeonItemMasks,X : BNE .setLocatePrize + + LDA.l CompassMode : BIT.w #$0010 : BNE .defaultPrizeCheck ; map collected + + ; determine if dungeon is located + .dungeon_icon + LDA.l CompassMode : BIT.w #$0020 : BEQ + ; compass collected + BIT.w #$0080 : BEQ .setLocateDungeon ; 0 = always show, 1 = require compass + LDA.l CompassExists : AND.l DungeonItemMasks,X : BEQ .setLocateDungeon + LDA.l CompassField : AND.l DungeonItemMasks,X : BNE .setLocateDungeon + + ; Overworld Map: Default or Map option + LDA.l MapMode : AND.w #$00FF : BNE + ; 0 = always show, 1 = requires map + LDA.l MapField : AND.l DungeonItemMasks,X : BEQ + + .setLocateDungeon + TYA : ORA.w #$0004 : TAY + + + .continue + STY.b Scrap06 + PLY +RTS + +WorldMap_CheckPrizeCollected: PHX - LDA.l MC_SRAM_Offsets, X : TAX ; put compass offset into X - LDA.l CompassField, X : ORA.l MapOverlay, X - PLX - AND.l MC_Masks, X : BNE .set ; is the compass obtained -.unset -CLC -RTS -.set -SEC + TXA : LSR : TAX + LDA.l CrystalPendantFlags_3,X : AND.w #$00FF : BEQ .prize_not_collected + CMP.w #$0008 : LDA.l CrystalPendantFlags,X : BCS .pendant + AND.l CrystalsField : BRA .check + .pendant + AND.l PendantsField + .check + AND.w #$00FF : BEQ .prize_not_collected + PLX : SEC : RTS + .prize_not_collected + PLX : CLC RTS -; map - which map in question -; CLC - should not show exact prize -; SEC - yep should show exact prize -OverworldMap_CheckForMap: - LDA.l MapMode : BEQ .set ; obtaining map doesn't change anything - LDA.l CurrentWorld : AND.b #$40 : BNE + ; not really sure on this check - LDA.l MapField : ORA.l MapOverlay : AND.b #$01 : BNE .set : BRA .continue - + LDA.l MapField : ORA.l MapOverlay : AND.b #$02 : BNE .set -.continue - PHX - LDA.l MC_SRAM_Offsets, X : TAX ; put map offset into X - LDA.l MapField, X : ORA.l MapOverlay, X - PLX - AND.l MC_Masks, X : BNE .set ; is the map obtained? -.unset -CLC -RTS -.set -SEC -RTS +WorldMap_LoadChrHalfSlot: + JSL Graphics_LoadChrHalfSlot ; what we wrote over + PHB : LDA.b #$7F : PHA : PLB + LDA.b #PreloadedGraphicsROM>>16 : STA.b Scrap02 + REP #$20 + LDX.b GameSubMode : CPX.b #$07 : BEQ .not_flute_menu + LDX.b #(.list_end-.list_flute)-6 + + .next_flute_group + LDA.l .list_flute+4,X : TAY + LDA.l .list_flute+2,X : STA.b Scrap03 + LDA.l .list_flute,X : STA.b Scrap00 + - LDA.b [$00],Y : STA.b ($03),Y : DEY #2 : BPL - + TXA : SBC.w #6 : TAX : BPL .next_flute_group ; SEC is always set + BRA .return + + .not_flute_menu + LDX.b #(.list_flute-.list)-6 + + .next_group + LDA.l .list+4,X : TAY + LDA.l .list+2,X : STA.b Scrap03 + LDA.l .list,X : STA.b Scrap00 + - LDA.b [$00],Y : STA.b ($03),Y : DEY #2 : BPL - + TXA : SBC.w #6 : TAX : BPL .next_group ; SEC is always set + + .return + SEP #$20 + PLB +RTL + +; from (bank $A2 only), to (bank $7F only), length (limited to 8-bit) +.list +dw #PreloadedGraphicsROM+$180, $7F1180, $80-2 +dw #PreloadedGraphicsROM+$380, $7F1380, $80-2 +dw #PreloadedGraphicsROM+$360, $7F1320, $20-2 +.list_flute +dw #PreloadedGraphicsROM+$160, $7F13C0, $20-2 +.list_end + +warnpc $8AC3B1 pullpc diff --git a/newhud.asm b/newhud.asm index d53031d..f4458f9 100644 --- a/newhud.asm +++ b/newhud.asm @@ -177,14 +177,14 @@ NewHUD_DrawPrizeIcon: BEQ .no_prize .prize - TYX - LDA.l CrystalPendantFlags_2,X - BIT.w #$0080 - BNE .no_icon - - BIT.w #$0040 - BNE .crystal + TYX + LDA.l CrystalPendantFlags_3,X : AND.w #$00FF + ASL : TAX + LDA.l PrizeIconTiles_Transparent,X : BEQ .no_icon + TAY + BRA .draw_prize +.pendant LDY.w #!PTile BRA .draw_prize @@ -291,6 +291,20 @@ MagicMeterColorMasks: dw $EBFF ; yellow dw $E3FF ; orange +;================================================================================ +PrizeIconTiles_Transparent: +dw $0000 ; no icon +dw $2978 ; crystal 1 +dw $2979 ; crystal 2 +dw $297A ; crystal 3 +dw $297B ; crystal 4 +dw $297C ; crystal 5 +dw $297D ; crystal 6 +dw $297E ; crystal 7 +dw $2963 ; green pendant +dw $295E ; blue pendant +dw $296E ; red pendant + ;================================================================================ DrawCompassCounts: LDA.l CompassMode : AND.b #$0F : BNE .continue @@ -300,9 +314,9 @@ DrawCompassCounts: ; no compass needed if this bit is set BIT.b #$02 : BNE .draw_compass_count - TYX : LDA.l ExistsTransfer, X : TAX : LDA.l CompassExists, X : BEQ .draw_compass_count REP #$20 - LDX.w DungeonID : LDA.w CompassField : AND.l DungeonItemMasks,X : BEQ .early_exit + LDX.w DungeonID : LDA.l CompassExists : AND.l DungeonItemMasks,X : BEQ .draw_compass_count + LDA.w CompassField : AND.l DungeonItemMasks,X : BEQ .early_exit .draw_compass_count LDX.w DungeonID @@ -387,10 +401,6 @@ DrawMapCounts: SEP #$20 RTS -; maps from $040C to the odd order used in overworld map -ExistsTransfer: -db $0C, $0C, $00, $02, $0B, $09, $03, $07, $04, $08, $01, $06, $05, $0A - ;================================================================================ ; Exits with: ; X - ones place tile diff --git a/pendantcrystalhud.asm b/pendantcrystalhud.asm index ca55503..12952c6 100644 --- a/pendantcrystalhud.asm +++ b/pendantcrystalhud.asm @@ -190,7 +190,9 @@ DrawMoonPearlInMenuLocation: RTL ;-------------------------------------------------------------------------------- DrawHUDDungeonItems: - LDA.l HUDDungeonItems : BNE .continue + LDA.l HUDDungeonItems : BEQ .return + JMP .continue +.return RTL .dungeon_positions @@ -208,6 +210,21 @@ RTL dw 26 ; Turtle Rock dw 30 ; Ganon's Tower +.dungeon_reorder ; why was I forced to make this table? smh. + dw 0 ; Hyrule Castle + dw 2 ; Eastern + dw 4 ; Desert + dw 18 ; Hera + dw 6 ; Agahnims Tower + dw 10 ; PoD + dw 8 ; Swamp + dw 14 ; Skull Woods + dw 20 ; Thieves Town + dw 16 ; Ice + dw 12 ; Mire + dw 22 ; Turtle Rock + dw 24 ; Ganon's Tower + .small_key_x_offset dw HyruleCastleKeys-DungeonKeys ; Hyrule Castle dw EasternKeys-DungeonKeys ; Eastern @@ -373,8 +390,16 @@ RTL BIT.w .dungeon_bitmasks,X BEQ ..skip_map + PHX : TXA : TAX + LDA.w .dungeon_reorder,X + LSR : TAX + LDA.l CrystalPendantFlags_3+1,X + AND.w #$00FF : ASL : TAX + LDA.w PrizeIconTiles,X : BNE + + LDA.w #$2826 + + + PLX LDY.w .dungeon_positions,X - LDA.w #$2826 STA.w GFXStripes+$0686,Y LDA.l MapField @@ -412,6 +437,18 @@ RTL PLP RTL ;-------------------------------------------------------------------------------- +PrizeIconTiles: +dw $0000 ; no icon +dw $2981 ; crystal 1 +dw $2982 ; crystal 2 +dw $2983 ; crystal 3 +dw $2984 ; crystal 4 +dw $2985 ; crystal 5 +dw $2986 ; crystal 6 +dw $2987 ; crystal 7 +dw $2990 ; green pendant +dw $298B ; blue pendant +dw $299B ; red pendant ;================================================================================ DrawPendantCrystalDiagram: PHP : PHB : PHK : PLB diff --git a/ram.asm b/ram.asm index 8195083..b36ed8c 100644 --- a/ram.asm +++ b/ram.asm @@ -379,8 +379,9 @@ AncillaID = $7E0C4A ; $0A bytes. ; AncillaGeneralN = $7E0C54 ; General use buffer for ancillae. $0A bytes. ; -AncillaGet = $7E0C5E ; Used by varius ancilla in various ways. $0F bytes. +AncillaGet = $7E0C5E ; Used by various ancilla in various ways. $0A bytes. ; +AncillaDirection = $7E0C72 ; Used by various ancilla to track its direction. $0A bytes AncillaLayer = $7E0C7C ; ; SpriteForceDrop = $7E0CBA ; Forces drops on sprite death. $10 bytes. @@ -917,6 +918,7 @@ endmacro %assertRAM(AncillaID, $7E0C4A) %assertRAM(AncillaGeneralN, $7E0C54) %assertRAM(AncillaGet, $7E0C5E) +%assertRAM(AncillaDirection, $7E0C72) %assertRAM(AncillaLayer, $7E0C7C) %assertRAM(SpriteForceDrop, $7E0CBA) %assertRAM(SpriteBump, $7E0CD2) diff --git a/tables.asm b/tables.asm index 92e7cc3..900f4df 100644 --- a/tables.asm +++ b/tables.asm @@ -123,10 +123,14 @@ db #$00 ; #$00 = Off (default) - #$01 = Display Dungeon Count w/Map - #$02 = Dis MapMode: db $00 ; #$00 = Always On (default) - #$01 = Require Map Item CompassMode: -db $00 ; #$00 = Off (default) - #$01 = Display Dungeon Count w/Compass - #$02 = Display Dungeon Count Always - ; #$80 = Move prizes to custom position - ; #$40 = Compasses or Maps are shuffled and must be obtained to show position if bit on - ; #$20 = Use Compass for position, otherwise use Map +;xbcm --ii +; +;x - True CompassMode Check (similar to MapMode): #$00 = Always On (default) - #$01 = Require Compass Item +;b - Boss Reveal - Beating a boss reveals the location of the prize +;c - Compass Reveal - Collecting the compass reveals the location of the dungeon +;m - Map Reveal - Collecting the map reveals the location of the dungeon +;i - Dungeon Item Counts: #$00 = Off (default) - #$01 = Display w/ Compass - #$02 = Always Display +db $00 ;-------------------------------------------------------------------------------- org $B0803D ; PC 0x18003D PersistentFloodgate: @@ -571,52 +575,6 @@ dw $0190 org $87F52F dw $0191 -;-------------------------------------------------------------------------------- -;Map Pendant / Crystal Indicators - DEPRECATED in favor of WorldMapIcon_tile, don't use - -org $8ABF2E ; PC 0x53F02 -dw $0100 ; #$6234 - Master Sword - -org $8ABEF8 ; PC 0x53EF8 -MapObject_Eastern: -dw $6238 ; #$6038 - Green Pendant / Courage - -org $8ABF1C ; PC 0x53F1C -MapObject_Desert: -dw $6034 ; #$6034 - Blue Pendant / Power - -org $8ABF0A ; PC 0x53F0A -MapObject_Hera: -dw $6032 ; #$6032 - Red Pendant / Wisdom - -org $8ABF00 ; PC 0x53F00 -MapObject_Darkness: -dw $6434 ; #6434 - Crystal - -org $8ABF6C ; PC 0x53F6C -MapObject_Swamp: -dw $6434 ; #6434 - Crystal - -org $8ABF12 ; PC 0x53F12 -MapObject_Skull: -dw $6434 ; #6434 - Crystal - -org $8ABF36 ; PC 0x53F36 -MapObject_Thieves: -dw $6434 ; #6434 - Crystal - -org $8ABF5A ; PC 0x53F5A -MapObject_Ice: -dw $6432 ; #6434 - Crystal 5/6 - -org $8ABF48 ; PC 0x53F48 -MapObject_Mire: -dw $6432 ; #6434 - Crystal 5/6 - -org $8ABF24 ; PC 0x53F24 -MapObject_TRock: -dw $6434 ; #6434 - Crystal - ;-------------------------------------------------------------------------------- org $82A09B ; PC 0x1209B - Bank02.asm:5802 - (pool MilestoneItem_Flags:) CrystalPendantFlags: @@ -2530,6 +2488,26 @@ TreeKidItem_Player: ; EE2A db #$00 ChestGameItem_Player: ; EE2B db #$00 +Prize_ArmosKnights_Player: ; EE2C +db #$00 +Prize_Lanmolas_Player: ; EE2D +db #$00 +Prize_Moldorm_Player: ; EE2E +db #$00 +Prize_HelmasaurKing_Player: ; EE2F +db #$00 +Prize_Arrghus_Player: ; EE30 +db #$00 +Prize_Mothula_Player: ; EE31 +db #$00 +Prize_Blind_Player: ; EE32 +db #$00 +Prize_Kholdstare_Player: ; EE33 +db #$00 +Prize_Vitreous_Player: ; EE34 +db #$00 +Prize_Trinexx_Player: ; EE35 +db #$00 ;-------------------------------------------------------------------------------- org $B0EE30 ; PC 0x18636C RemoteItems: @@ -2623,140 +2601,3 @@ org $B0F0C0 ; PC 0x1870C0 ;-------------------------------------------------------------------------------- ; 0x1870C0 - 187FFF (unused) ;-------------------------------------------------------------------------------- - -pushpc -;-------------------------------------------------------------------------------- -; Overworld Map Tables -;-------------------------------------------------------------------------------- -org $8ABDF6 -WorldMapIcon_posx_vanilla: -dw $0F31 ; prize1 -dw $08D0 ; prize2 -dw $0108 -dw $0F40 - -dw $0082 -dw $0F11 -dw $01D0 -dw $0100 - -dw $0CA0 -dw $0759 -dw $FF00 -dw $FF00 - -dw $FF00 -dw $FFFF ; reserved - not used -dw $FFFF -dw $FFFF - -org $8ABE16 -WorldMapIcon_posy_vanilla: -dw $0620 ; prize1 -dw $0080 ; prize2 -dw $0D70 -dw $0620 - -dw $00B0 -dw $0103 -dw $0780 -dw $0CA0 - -dw $0DA0 -dw $0ED0 -dw $FF00 -dw $FF00 - -dw $FF00 -dw $FFFF ; reserved - not used -dw $FFFF -dw $FFFF - -org $8ABE36 -WorldMapIcon_posx_located: -dw $FF00 ; prize1 -dw $FF00 ; prize2 -dw $FF00 -dw $FF00 - -dw $FF00 -dw $FF00 -dw $FF00 -dw $FF00 - -dw $FF00 -dw $FF00 -dw $FF00 -dw $FF00 - -dw $FF00 -dw $FFFF ; reserved - not used -dw $FFFF -dw $FFFF - -org $8ABE56 -WorldMapIcon_posy_located: -dw $FF00 ; prize1 -dw $FF00 ; prize2 -dw $FF00 -dw $FF00 - -dw $FF00 -dw $FF00 -dw $FF00 -dw $FF00 - -dw $FF00 -dw $FF00 -dw $FF00 -dw $FF00 - -dw $FF00 -dw $FFFF ; reserved - not used -dw $FFFF -dw $FFFF - -org $8ABE76 -WorldMapIcon_tile: -db $38, $62 ; green pendant ; Eastern Palace -db $32, $60 ; red pendant ; Hera -db $34, $60 ; blue pendant ; Desert -db $34, $64 ; crystal ; PoD - -db $34, $64 ; crystal ; Skull Woods -db $34, $64 ; crystal ; Turtle Rock -db $34, $64 ; crystal ; Thieves Town -db $34, $64 ; crystal ; Misery Mire - -db $34, $64 ; crystal ; Ice Palace -db $34, $64 ; crystal ; Swamp Palace -db $32, $66 ; skull looking thing -db $00, $00 ; red x - -db $00, $00 ; red x -db $00, $00 ; unused red x's -db $00, $00 -db $00, $00 - -org $8ABE96 -CompassExists: -; dw $37FC ; todo: convert to two bytes with masks? so much extra code... -; eastern hera desert pod skull trock thieves mire ice swamp gt at escape -db $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $00, $00, $00, $00, $00 - -; 0 = light world, 1 = dark world -org $8ABEA6 -WorldCompassMask: -; eastern desert hera pod skull trock thieves mire ice swamp gt at escape x1 x2 x3 -db $00, $00, $00, $01, $01, $01, $01, $01, $01, $01, $01, $00, $00, $00, $00, $00 - -; eastern desert hera pod skull trock thieves mire ice swamp gt at escape -MC_DungeonIdsForPrize: -db $02, $0A, $03, $06, $08, $0C, $0B, $07, $09, $05, $00, $04, $01 -MC_SRAM_Offsets: -db $01, $00, $01, $01, $00, $00, $00, $01, $00, $01, $00, $01, $01 -MC_Masks: -; EP TH DP PD SK TR TT MM -db $20, $20, $10, $02, $80, $08, $10, $01, $40, $04, $04, $08, $40 - -pullpc diff --git a/vanillalabels.asm b/vanillalabels.asm index 1611fef..43d5238 100644 --- a/vanillalabels.asm +++ b/vanillalabels.asm @@ -31,6 +31,7 @@ ReloadPreviouslyLoadedSheets = $80D7C8 Attract_DecompressStoryGfx = $80D84E InitializeTilesets = $80E1DB LoadCommonSprites_long = $80E3C4 +Graphics_LoadChrHalfSlot = $80E43A LoadSelectScreenGfx = $80E529 CopyFontToVRAM = $80E596 LoadCommonSprites_in_file_select = $80E784