From 59a063e5f448d3f20b284840a2356996e00f16fd Mon Sep 17 00:00:00 2001 From: scawful Date: Fri, 10 Jan 2025 20:42:25 -0500 Subject: [PATCH 01/67] Update world map conditions --- Overworld/world_map.asm | 4 +--- Sprites/NPCs/village_elder.asm | 6 +++--- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/Overworld/world_map.asm b/Overworld/world_map.asm index d485187..31ba67f 100644 --- a/Overworld/world_map.asm +++ b/Overworld/world_map.asm @@ -209,16 +209,14 @@ MapIconDraw: LDA.l OOSPROG : CMP.b #$02 : BNE + JSL DrawHallOfSecretsIcon JSR HandleMapDrawIcon - JMP .main_quest + LDA.l OOSPROG : AND.b #$10 : BEQ .main_quest - ; Pyramid of Power JSL DrawPyramidIcon JSR HandleMapDrawIcon_noflash .main_quest LDA.l MapIcon : CMP.b #$01 : BEQ .draw_crystal_1 - CMP.b #$02 : BEQ .draw_crystals + CMP.b #$02 : BCS .draw_crystals JSL DrawEonEscapeIcon JSR HandleMapDrawIcon JMP restore_coords_and_exit diff --git a/Sprites/NPCs/village_elder.asm b/Sprites/NPCs/village_elder.asm index 579de4b..68441dd 100644 --- a/Sprites/NPCs/village_elder.asm +++ b/Sprites/NPCs/village_elder.asm @@ -3,11 +3,11 @@ Sprite_VillageElder_Main: %PlayAnimation(2,3,16) JSL Sprite_PlayerCantPassThrough REP #$30 - LDA.l MAPICON : AND.w #$00FF + LDA.l OOSPROG : AND.w #$00FF SEP #$30 - CMP.b #$02 : BCS .already_met + AND.b #$10 : BNE .already_met %ShowSolicitedMessage($143) : BCC .no_message - LDA.b #$02 : STA.l $7EF3C7 + LDA.l OOSPROG : ORA.b #$10 : STA.l OOSPROG .no_message RTS From 80fd69d8bb0c498bdd45d932099fd6650a648920 Mon Sep 17 00:00:00 2001 From: scawful Date: Fri, 10 Jan 2025 20:42:42 -0500 Subject: [PATCH 02/67] Enemy housekeeping --- Sprites/Enemies/anti_kirby.asm | 2 -- Sprites/Enemies/booki.asm | 15 --------- Sprites/Enemies/goriya.asm | 9 ------ Sprites/Enemies/octorok.asm | 56 ++++++++-------------------------- 4 files changed, 13 insertions(+), 69 deletions(-) diff --git a/Sprites/Enemies/anti_kirby.asm b/Sprites/Enemies/anti_kirby.asm index 47b2d55..4d54374 100644 --- a/Sprites/Enemies/anti_kirby.asm +++ b/Sprites/Enemies/anti_kirby.asm @@ -43,8 +43,6 @@ Sprite_AntiKirby_Long: RTL } -; ========================================================= - Sprite_AntiKirby_Prep: { PHB : PHK : PLB diff --git a/Sprites/Enemies/booki.asm b/Sprites/Enemies/booki.asm index 00375c1..ac83f02 100644 --- a/Sprites/Enemies/booki.asm +++ b/Sprites/Enemies/booki.asm @@ -32,8 +32,6 @@ %Set_Sprite_Properties(Sprite_Booki_Prep, Sprite_Booki_Long) -; ========================================================= - Sprite_Booki_Long: { PHB : PHK : PLB @@ -46,8 +44,6 @@ Sprite_Booki_Long: RTL } -; ========================================================= - Sprite_Booki_Prep: { PHB : PHK : PLB @@ -61,8 +57,6 @@ Sprite_Booki_Prep: db $04, $08, $10, $18 } -; ========================================================= - Sprite_Booki_Main: { LDA.w SprAction, X @@ -76,16 +70,13 @@ Sprite_Booki_Main: StalkPlayer: { %PlayAnimation(0,1,16) - JSR Sprite_Booki_Move - RTS } HideFromPlayer: { %PlayAnimation(0,4,16) - LDA.w SprTimerA, X : BNE + INC.w SprAction, X + @@ -95,9 +86,7 @@ Sprite_Booki_Main: HiddenFromPlayer: { %PlayAnimation(4,4,16) - JSR Sprite_Booki_Move - JSL GetRandomInt : AND.b #$03 : BEQ + INC.w SprAction, X + @@ -107,9 +96,7 @@ Sprite_Booki_Main: ApproachPlayer: { %PlayAnimation(5,9,16) - JSR Sprite_Booki_Move - RTS } } @@ -198,9 +185,7 @@ Sprite_Booki_Draw: .nextTile PHX ; Save current Tile Index? - TXA : CLC : ADC $06 ; Add Animation Index Offset - PHA ; Keep the value with animation index offset? ASL A : TAX diff --git a/Sprites/Enemies/goriya.asm b/Sprites/Enemies/goriya.asm index e9b1175..2855edd 100644 --- a/Sprites/Enemies/goriya.asm +++ b/Sprites/Enemies/goriya.asm @@ -32,8 +32,6 @@ %Set_Sprite_Properties(Sprite_Goriya_Prep, Sprite_Goriya_Long) -; ========================================================= - Sprite_Goriya_Long: { PHB : PHK : PLB @@ -51,8 +49,6 @@ Sprite_Goriya_Long: RTL } -; ========================================================= - Sprite_Goriya_Prep: { PHB : PHK : PLB @@ -61,8 +57,6 @@ Sprite_Goriya_Prep: RTL } -; ========================================================= - Sprite_Goriya_Main: { LDA.w SprAction, X @@ -309,9 +303,6 @@ Sprite_Goriya_Draw: RTS - - ; ========================================================= - .start_index db $00, $02, $04, $06, $08, $0A, $0C, $0E .nbr_of_tiles diff --git a/Sprites/Enemies/octorok.asm b/Sprites/Enemies/octorok.asm index b83788c..1c73f79 100644 --- a/Sprites/Enemies/octorok.asm +++ b/Sprites/Enemies/octorok.asm @@ -32,8 +32,6 @@ %Set_Sprite_Properties(Sprite_Octorok_Prep, Sprite_Octorok_Long) -; ========================================================= - Sprite_Octorok_Long: { PHB : PHK : PLB @@ -52,8 +50,6 @@ Sprite_Octorok_Long: RTL } -; ========================================================= - Sprite_Octorok_Prep: { PHB : PHK : PLB @@ -62,8 +58,6 @@ Sprite_Octorok_Prep: RTL } -; ========================================================= - Sprite_Octorok_Main: { JSR Sprite_Octorok_Move @@ -148,9 +142,8 @@ Sprite_Octorok_Move: .wait LDY.w SprMiscC, X - LDA.w .speed_x, Y : STA.w SprXSpeed,X - - LDA.w .speed_y, Y : STA.w SprYSpeed,X + LDA.w .speed_x, Y : STA.w SprXSpeed, X + LDA.w .speed_y, Y : STA.w SprYSpeed, X JSL Sprite_CheckTileCollision LDA.w $0E70, X : BEQ .no_collision @@ -159,26 +152,18 @@ Sprite_Octorok_Move: .no_collision RTS - ; --------------------------------------------------------- - .octorok_used_barrage STZ.w SprXSpeed, X : STZ.w SprYSpeed,X - LDA.w SprTimerA, X : BNE Octorock_ShootEmUp INC.w SprMiscF, X - LDA.w SprMiscC, X PHA - JSL GetRandomInt : AND.b #$3F : ADC.b #$30 : STA.w SprTimerA, X AND.b #$03 : STA.w SprMiscC, X - PLA CMP.w SprMiscC, X : BEQ .exit - EOR.w SprMiscC, X : BNE .exit - - LDA.b #$08 : STA.w SprTimerB,X - + EOR.w SprMiscC, X : BNE .exit + LDA.b #$08 : STA.w SprTimerB,X .exit RTS @@ -284,8 +269,7 @@ Sprite_WaterOctorok_Attack: + JSL GetDistance8bit_Long - CMP.b #$40 - BCC .not_close_enough ; LD < 64 + CMP.b #$40 : BCC .not_close_enough ; LD < 64 INC.w SprMiscG, X %SetTimerA($10) .not_close_enough @@ -332,19 +316,14 @@ Sprite_WaterOctorok_Attack: Octorok_ShootSingle: { - LDA.w SprTimerA,X : CMP.b #$1C : BNE .bide_time + LDA.w SprTimerA, X : CMP.b #$1C : BNE .bide_time PHA JSR Octorok_SpawnRock PLA .bide_time - LSR A - LSR A - LSR A + LSR #3 TAY - - LDA.w .mouth_anim_step,Y - STA.w SprMiscB,X - + LDA.w .mouth_anim_step, Y : STA.w SprMiscB, X RTS .mouth_anim_step @@ -355,33 +334,24 @@ Octorok_ShootSingle: db $02, $01, $01, $00 } -; --------------------------------------------------------- - Octorok_Shoot4Ways: { - LDA.w SprTimerA,X + LDA.w SprTimerA, X PHA CMP.b #$80 : BCS .animate AND.b #$0F : BNE .delay_turn PHA - - LDY.w SprMiscC,X - LDA.w .next_direction,Y : STA.w SprMiscC,X - + LDY.w SprMiscC, X + LDA.w .next_direction, Y : STA.w SprMiscC, X PLA .delay_turn CMP.b #$08 : BNE .animate JSR Octorok_SpawnRock .animate PLA - LSR A - LSR A - LSR A - LSR A + LSR #4 TAY - - LDA.w .mouth_anim_step,Y : STA.w SprMiscB,X - + LDA.w .mouth_anim_step, Y : STA.w SprMiscB, X RTS .next_direction From e9ff95faf31f6c17027dbaab987dec43f508adf1 Mon Sep 17 00:00:00 2001 From: scawful Date: Fri, 10 Jan 2025 21:19:54 -0500 Subject: [PATCH 03/67] Update bean vendor prep so village elder loads indoors --- Sprites/NPCs/bean_vendor.asm | 31 ++++++++++++------------------- 1 file changed, 12 insertions(+), 19 deletions(-) diff --git a/Sprites/NPCs/bean_vendor.asm b/Sprites/NPCs/bean_vendor.asm index e8b121a..06e6222 100644 --- a/Sprites/NPCs/bean_vendor.asm +++ b/Sprites/NPCs/bean_vendor.asm @@ -32,8 +32,6 @@ %Set_Sprite_Properties(Sprite_BeanVendor_Prep, Sprite_BeanVendor_Long) -; ========================================================= - Sprite_BeanVendor_Long: { PHB : PHK : PLB @@ -53,8 +51,6 @@ Sprite_BeanVendor_Long: RTL } -; ========================================================= - Sprite_BeanVendor_Prep: { PHB : PHK : PLB @@ -62,24 +58,23 @@ Sprite_BeanVendor_Prep: LDA.b #$40 : STA.w SprTimerA, X STZ.w SprMiscD, X - LDA.b $8A : CMP.b #$00 : BNE + - LDA.l MagicBeanProg : BNE .in_progress - LDA.b #$01 : STA.w SprMiscD, X - LDA.b #$04 : STA.w SprAction, X - JMP + - .in_progress - LDA.l MagicBeanProg : CMP.b #$3F : BCS .not_flower - ; Sprite is the flower on ranch map - LDA.b #$05 : STA.w SprAction, X - .not_flower - STA.w SprFrame, X + LDA.b $1B : BNE + + LDA.b $8A : CMP.b #$00 : BNE + + LDA.l MagicBeanProg : BNE .in_progress + LDA.b #$01 : STA.w SprMiscD, X + LDA.b #$04 : STA.w SprAction, X + JMP + + .in_progress + LDA.l MagicBeanProg : CMP.b #$3F : BCS .not_flower + ; Sprite is the flower on ranch map + LDA.b #$05 : STA.w SprAction, X + .not_flower + STA.w SprFrame, X + PLB RTL } -; ========================================================= - Sprite_BeanVendor_Main: { %SpriteJumpTable(BeanVendor, @@ -398,8 +393,6 @@ Sprite_BeanVendor_Draw: RTS - - ; ======================================================= .start_index db $00, $04, $05, $0B, $11, $13, $15 .nbr_of_tiles From b09aebc5de4af3cb52e5da186a9fdbf76c6c6efb Mon Sep 17 00:00:00 2001 From: scawful Date: Sat, 11 Jan 2025 08:56:56 -0500 Subject: [PATCH 04/67] update crystals and gamestate symbols --- Core/symbols.asm | 4 ++-- Dungeons/custom_tag.asm | 7 ++----- Items/ocarina.asm | 6 +++--- Masks/minish_form.asm | 2 +- Overworld/overworld.asm | 6 +++--- Overworld/time_system.asm | 18 +++++++++--------- Sprites/NPCs/zora.asm | 2 +- 7 files changed, 21 insertions(+), 24 deletions(-) diff --git a/Core/symbols.asm b/Core/symbols.asm index 8367834..a9ab0ea 100644 --- a/Core/symbols.asm +++ b/Core/symbols.asm @@ -42,7 +42,7 @@ SaveRam: ; 0x01 - Uncle reached ; 0x02 - Zelda rescued ; 0x03 - Agahnim defeated -GAMESTATE = $7EF3C5 +GameState = $7EF3C5 ; Red X on Hall of Secrets ; Red X on Kalyxo Pyramid @@ -98,7 +98,7 @@ MapIcon = $7EF3C7 ; i - Ice Palace ; m - Misery Mire ; t - Turtle Rock -CRYSTALS = $7EF37A +Crystals = $7EF37A ; 01 - Fishing Rod ; 02 - Portal Rod diff --git a/Dungeons/custom_tag.asm b/Dungeons/custom_tag.asm index b1972a0..9a7c26e 100644 --- a/Dungeons/custom_tag.asm +++ b/Dungeons/custom_tag.asm @@ -39,23 +39,20 @@ HouseTag_Main: LDA.b #$08 : STA $7EE000 ; Set the time to 8:00am LDA.b #$03 : STA.w $012C ; Play the deku tree music - ; ------------------------------- ; Set Link's coordinates to this specific position. LDA.b #$40 : STA $0FC2 LDA.b #$09 : STA $0FC3 - LDA.b #$5A : STA $0FC4 LDA.b #$21 : STA $0FC5 ; "Accept our quest, Link!" LDA.b #$1F : LDY.b #$00 - JSL $05E219 ; Sprite_ShowMessageUnconditional + JSL Sprite_ShowMessageUnconditional INC.b StoryState RTS } - HouseTag_WakeUpPlayer: { ; Lighten the screen gradually and then wake Link up partially @@ -80,7 +77,7 @@ HouseTag_Main: LDA $7EF3C6 : ORA.b #$10 : STA $7EF3C6 ; Set the game mode - LDA #$00 : STA $7EF3C5 ; (0 - intro, 1 - pendants, 2 - crystals) + LDA #$00 : STA GameState ; (0 - intro, 1 - pendants, 2 - crystals) LDA #$00 : STA $7EF3CC ; disable telepathic message JSL Sprite_LoadGfxProperties RTS diff --git a/Items/ocarina.asm b/Items/ocarina.asm index ecf5a32..420c260 100644 --- a/Items/ocarina.asm +++ b/Items/ocarina.asm @@ -337,8 +337,8 @@ CheckRealTable: ResetOcarinaFlag: { - LDA $7EF3C5 : BEQ .continue - CMP #$01 : BEQ .continue + LDA.l GameState : BEQ .continue + CMP #$01 : BEQ .continue REP #$30 LDA #$0000 : STA.l $7EE00E SEP #$30 @@ -416,7 +416,7 @@ RainAnimation_Overridden: JSL CheckRealTable : BEQ .rainOverlaySet ; LDA.b $8C : CMP.b #$9F : ; Check the progress indicator - LDA.l $7EF3C5 : CMP.b #$02 : BRA .skipMovement + LDA.l GameState : CMP.b #$02 : BRA .skipMovement .rainOverlaySet ; If misery mire has been opened already, we're done. diff --git a/Masks/minish_form.asm b/Masks/minish_form.asm index c64bd05..4ca4958 100644 --- a/Masks/minish_form.asm +++ b/Masks/minish_form.asm @@ -21,7 +21,7 @@ pullpc LinkState_CheckForMinishForm: { SEP #$30 - LDA.l GAMESTATE : BEQ .return + LDA.l GameState : BEQ .return JSL $0FF979 ; AncillaSpawn_SwordChargeSparkle ; Check for the R button (like minish cap) diff --git a/Overworld/overworld.asm b/Overworld/overworld.asm index c0b2cbd..a91a7ed 100644 --- a/Overworld/overworld.asm +++ b/Overworld/overworld.asm @@ -6,7 +6,7 @@ org $1AFBC7 : db $0B ; Heart Index org $1AFBD7 : db $00 ; Remove rain sound effects from beginning -org $02838C : LDA.l $7EF3C5 : CMP.b #$00 +org $02838C : LDA.l GameState : CMP.b #$00 ; RoomTag_GanonDoor ; Replace SprState == 04 -> .exit @@ -121,7 +121,7 @@ LoadDarkWorldIntro: LDA.b #$40 : STA.l $7EF3CA RTL .not_dw_spawn - LDA.l GAMESTATE : CMP.b #$02 : BNE .intro_sequence + LDA.l GameState : CMP.b #$02 : BNE .intro_sequence ; Check for maku tree progress flag LDA.l OOSPROG : CMP.b #$02 : BCS .has_pearl STZ.w $1B @@ -148,7 +148,7 @@ org $0281E2 : LDA.l $7EF342 : CMP.b #$02 org $0281CD : LDA.l $7EF3D6 : CMP.b #$04 ; GameOver_FadeAndRevive -org $09F520 : LDA.l $7EF3C5 : CMP.b #$02 +org $09F520 : LDA.l GameState : CMP.b #$02 pullpc LoadOverworldPitAreas: diff --git a/Overworld/time_system.asm b/Overworld/time_system.asm index 18f38a1..f23b9d3 100644 --- a/Overworld/time_system.asm +++ b/Overworld/time_system.asm @@ -446,11 +446,11 @@ CheckIfNight: JSR LoadPeacetimeSprites : BCS + RTL + - LDA.l $7EF3C5 : CMP.b #$02 : BCC .day_time + LDA.l GameState : CMP.b #$02 : BCC .day_time LDA $7EE000 : CMP.b #$12 : BCS .night_time LDA $7EE000 : CMP.b #$06 : BCC .night_time .day_time - LDA.l $7EF3C5 + LDA.l GameState RTL .night_time LDA.b #$03 @@ -487,32 +487,32 @@ CheckIfNight16Bit: + REP #$30 ; Don't change the spriteset during the intro sequence - LDA.l $7EF3C5 : AND.w #$00FF : CMP.w #$0002 : BCC .day_time + LDA.l GameState : AND.w #$00FF : CMP.w #$0002 : BCC .day_time ; 0x12 = 18 hours or 6 pm LDA $7EE000 : AND.w #$00FF : CMP.w #$0012 : BCS .night_time ; If it's less than 6 am, jump to night time LDA $7EE000 : AND.w #$00FF : CMP.w #$0006 : BCC .night_time .day_time - LDA.l $7EF3C5 + LDA.l GameState RTL .night_time ; Load the gamestate 03 spritesets, but don't change the save ram - LDA.l $7EF3C5 : CLC : ADC #$0001 + LDA.l GameState : CLC : ADC #$0001 RTL } LoadPeacetimeSprites: { - ; Map 2E, 2F if CRYSTALS && 0x10 == 0 + ; Map 2E, 2F if Crystals && 0x10 == 0 LDA $8A : CMP.b #$2E : BEQ .tail_palace CMP.b #$2F : BEQ .tail_palace CMP.b #$1E : BEQ .zora_sanctuary JMP + .tail_palace - LDA.l CRYSTALS : AND #$10 : BNE .load_peacetime + LDA.l Crystals : AND #$10 : BNE .load_peacetime JMP + .zora_sanctuary - LDA.l CRYSTALS : AND #$20 : BNE .load_peacetime + LDA.l Crystals : AND #$20 : BNE .load_peacetime JMP + .load_peacetime LDA.b #$01 @@ -526,7 +526,7 @@ LoadPeacetimeSprites: FixSaveAndQuit: { LDA #$08 : STA $7EE000 - LDA.l $7EF3C5 + LDA.l GameState RTL } diff --git a/Sprites/NPCs/zora.asm b/Sprites/NPCs/zora.asm index 6d96a40..de5fe51 100644 --- a/Sprites/NPCs/zora.asm +++ b/Sprites/NPCs/zora.asm @@ -105,7 +105,7 @@ Zora_TrackHeadToPlayer: Zora_HandleDialogue: { - LDA.l CRYSTALS : AND.b #$20 : BEQ +++ + LDA.l Crystals : AND.b #$20 : BEQ +++ %ShowSolicitedMessage($01A6) JMP + +++ From ee18cda610876f47e85471cfc583a8d3fe3a1e64 Mon Sep 17 00:00:00 2001 From: scawful Date: Sat, 11 Jan 2025 09:40:59 -0500 Subject: [PATCH 05/67] Fix bug with eon abyss link sprite palette --- Masks/gbc_form.asm | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Masks/gbc_form.asm b/Masks/gbc_form.asm index a851fd6..be7d85f 100644 --- a/Masks/gbc_form.asm +++ b/Masks/gbc_form.asm @@ -48,10 +48,10 @@ GameboyLinkRedMail: LinkState_GameboyInDungeonEntrance: { + print pc ; if link is in the dark world, change his sprite to the gbc one LDA $0FFF : CMP #$00 : BEQ .return - LDA.w !CurrentMask : BNE .return - LDA $BC : CMP #$06 : BEQ .return + LDA.w !CurrentMask : CMP.b #$05 : BEQ .return JSL UpdateGbcPalette LDA #$3B : STA $BC ; change link's sprite .return @@ -64,10 +64,10 @@ LoadOverworld_CheckForGbcLink: { LDA $0FFF : BEQ .return_lw LDA.w !CurrentMask : CMP.b #$05 : BEQ .return - LDA.b #$06 : STA $02B2 - LDA.b #$3B : STA $BC ; change link's sprite - JSL UpdateGbcPalette - JMP .return + LDA.b #$06 : STA $02B2 + LDA.b #$3B : STA $BC ; change link's sprite + JSL UpdateGbcPalette + JMP .return .return_lw STZ.w $02B2 .return From 03478c4f040ea0ce7c6b9d652f53e5ad87107c04 Mon Sep 17 00:00:00 2001 From: scawful Date: Sat, 11 Jan 2025 21:09:10 -0500 Subject: [PATCH 06/67] Add deku butler and deku princess peacetime dialogue --- Core/message.asm | 4 ++++ Core/messages.org | 22 ++++++++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/Core/message.asm b/Core/message.asm index 1e78166..49f2b9d 100644 --- a/Core/message.asm +++ b/Core/message.asm @@ -130,6 +130,10 @@ Message_1B7: db $07, $2E, $21, $42, $59, $27, $28, $59, $2C, $29, $1A, $2B, $24, $59, $B4, $59, $2C, $22, $20, $21, $2D, $41, $75, $0D, $28, $59, $0F, $A5, $1D, $93, $2D, $42, $59, $27, $28, $59, $1D, $CE, $1A, $26, $42, $59, $2C, $C8, $2B, $32, $3E, $76, $01, $2E, $2D, $59, $21, $1E, $32, $42, $59, $2B, $28, $1A, $26, $59, $D8, $59, $00, $1B, $32, $2C, $2C, $59, $1A, $59, $1B, $B6, $41, $7E, $73, $08, $51, $26, $59, $2C, $2E, $CD, $E3, $51, $25, $25, $59, $2C, $1C, $2B, $28, $2E, $27, $20, $1E, $59, $C7, $1E, $59, $DC, $73, $A7, $A3, $2E, $1A, $25, $25, $32, $43, $59, $00, $27, $1D, $59, $E1, $A0, $E3, $59, $9F, $42, $73, $08, $51, $25, $25, $59, $97, $59, $21, $A6, $1E, $42, $59, $DF, $B6, $B4, $20, $41, $7F Message_1B8: db $0E, $21, $28, $3E, $59, $02, $2E, $2B, $22, $28, $2E, $2C, $59, $1A, $98, $2E, $2D, $59, $26, $32, $59, $25, $B6, $2D, $25, $1E, $75, $1D, $CE, $1A, $26, $40, $E0, $1A, $2F, $B3, $1A, $1C, $2D, $42, $59, $8D, $E0, $3F, $76, $0B, $B5, $2D, $A0, $1C, $BB, $D0, $42, $59, $07, $A6, $28, $41, $7E, $73, $12, $1E, $1E, $42, $59, $B4, $59, $D8, $59, $04, $C7, $59, $00, $1B, $32, $2C, $2C, $42, $59, $2D, $21, $A6, $1E, $73, $8D, $2D, $21, $CE, $1E, $59, $29, $A5, $1D, $93, $2D, $2C, $42, $59, $1A, $2B, $2D, $22, $1F, $1A, $1C, $2D, $2C, $73, $25, $1E, $1F, $2D, $59, $97, $B0, $27, $1D, $59, $1B, $32, $59, $D8, $59, $06, $28, $1D, $9D, $D0, $2C, $41, $7E, $73, $16, $21, $A0, $E3, $59, $20, $94, $21, $A1, $1E, $1A, $1C, $21, $59, $29, $A5, $1D, $93, $2D, $42, $73, $D8, $32, $59, $CE, $2C, $C7, $94, $1E, $59, $30, $B6, $21, $59, $E3, $2B, $59, $2C, $29, $22, $2B, $B6, $42, $73, $B4, $2F, $28, $24, $B3, $1D, $CE, $1A, $26, $2C, $59, $C6, $59, $D8, $59, $29, $92, $43, $7E, $73, $13, $21, $94, $8B, $E1, $A6, $1E, $59, $08, $59, $9B, $1E, $59, $B4, $42, $59, $21, $1E, $25, $29, $B4, $20, $73, $DA, $59, $27, $1A, $2F, $22, $20, $94, $1E, $59, $D8, $59, $1D, $CE, $1A, $26, $2C, $59, $90, $73, $2B, $A7, $1E, $1A, $25, $59, $D0, $1C, $CE, $2D, $2C, $59, $C6, $59, $D8, $59, $29, $92, $41, $7E, $73, $01, $2E, $2D, $59, $D8, $59, $20, $2B, $8C, $29, $2B, $22, $33, $1E, $3F, $59, $0E, $27, $1C, $1E, $73, $E3, $51, $2F, $1E, $59, $CC, $2F, $A0, $E3, $2B, $D0, $25, $1F, $42, $73, $D8, $59, $0C, $92, $A1, $12, $30, $C8, $1D, $59, $1A, $DF, $B6, $2C, $41, $7E, $73, $13, $21, $91, $1B, $BA, $1D, $1E, $8B, $B0, $1D, $1D, $A0, $1D, $1E, $1E, $29, $59, $B4, $59, $D8, $73, $00, $1B, $32, $2C, $2C, $42, $59, $8C, $C7, $B9, $D8, $59, $C7, $1E, $59, $30, $B6, $21, $73, $D8, $59, $29, $A5, $1D, $93, $2D, $2C, $59, $1C, $93, $59, $1A, $DF, $24, $A0, $B6, $41, $7E, $73, $12, $28, $42, $59, $2D, $B0, $27, $24, $59, $C6, $59, $D8, $D0, $59, $25, $B6, $2D, $25, $1E, $59, $1D, $CE, $1A, $26, $2C, $73, $1A, $2C, $59, $D3, $1E, $29, $29, $B3, $D3, $C7, $1E, $2C, $59, $DA, $59, $E3, $2B, $73, $9D, $2D, $B4, $32, $3E, $7F +Message_1B9: +db $0C, $32, $59, $1D, $1E, $1E, $29, $1E, $D3, $59, $20, $2B, $94, $B6, $2E, $1D, $1E, $42, $59, $21, $A6, $28, $41, $75, $01, $1E, $1C, $1A, $2E, $D0, $59, $C6, $59, $E3, $2B, $59, $2F, $1A, $BB, $2B, $42, $76, $13, $1A, $22, $25, $59, $0F, $1A, $BA, $1C, $1E, $59, $2C, $B0, $27, $1E, $2C, $59, $C7, $1C, $1E, $59, $26, $C8, $1E, $41, $7E, $73, $16, $1E, $59, $03, $1E, $24, $2E, $59, $28, $E0, $59, $E3, $59, $1A, $59, $1D, $1E, $1B, $2D, $28, $2E, $2B, $73, $21, $28, $BE, $59, $DF, $2C, $59, $B4, $59, $2D, $2E, $2B, $26, $28, $22, $25, $59, $1A, $1F, $2D, $A6, $73, $0A, $32, $1D, $2B, $28, $20, $8B, $BE, $1D, $1D, $25, $B4, $20, $41, $7E, $73, $01, $2E, $2D, $59, $30, $B6, $21, $59, $D8, $59, $0C, $28, $25, $9F, $2B, $26, $59, $1C, $1A, $25, $BE, $1D, $42, $73, $29, $1E, $1A, $1C, $1E, $59, $CE, $2D, $2E, $2B, $27, $2C, $59, $DA, $59, $28, $2E, $2B, $59, $B1, $25, $25, $2C, $42, $73, $2D, $21, $93, $24, $2C, $59, $DA, $59, $E3, $3E, $7F +Message_1BA: +db $00, $21, $42, $59, $E3, $59, $29, $25, $93, $59, $DA, $59, $21, $1E, $1A, $1D, $59, $C7, $DF, $2B, $1D, $42, $75, $32, $1E, $2C, $3F, $59, $E6, $59, $27, $1E, $31, $2D, $59, $2D, $21, $CE, $91, $BB, $28, $26, $2C, $76, $B4, $59, $0A, $1A, $25, $32, $31, $28, $59, $02, $92, $25, $1E, $41, $7E, $73, $08, $51, $2F, $1E, $59, $2D, $1A, $24, $A0, $D8, $59, $25, $22, $97, $2B, $2D, $32, $59, $C6, $73, $BD, $2B, $24, $B3, $D8, $59, $1C, $92, $25, $1E, $59, $C7, $59, $E3, $2B, $59, $BD, $29, $41, $73, $01, $1E, $DF, $CE, $59, $B6, $2C, $59, $2C, $B1, $9F, $30, $2C, $59, $2B, $2E, $27, $59, $1D, $1E, $1E, $29, $41, $7E, $73, $12, $1E, $1E, $24, $59, $D8, $59, $0C, $1E, $1A, $9F, $30, $59, $01, $BA, $1D, $1E, $59, $2D, $21, $A6, $1E, $42, $73, $25, $1E, $20, $A5, $1D, $2C, $59, $2C, $1A, $32, $59, $B6, $59, $21, $28, $25, $1D, $2C, $59, $CB, $A1, $1F, $B6, $73, $A8, $59, $E3, $2B, $59, $2A, $2E, $1E, $D3, $41, $7F db $FF ; end of message pointers checks diff --git a/Core/messages.org b/Core/messages.org index 03fb3cd..ba84c06 100644 --- a/Core/messages.org +++ b/Core/messages.org @@ -1841,3 +1841,25 @@ Oho! Curious about my little [V]So, think of these little dreams [V]as stepping stones to your [V]destiny! + +** 1B9 - Deku NPC +My deepest gratitude, hero. +[2]Because of your valor, +[3]Tail Palace shines once more.[K] +[V]We Deku owe you a debt—our +[V]home was in turmoil after +[V]Kydrog's meddling.[K] +[V]But with the Moldorm calmed, +[V]peace returns to our halls, +[V]thanks to you! + +** 1BA - Deku NPC 2 +Ah, you plan to head onward, +[2]yes? The next threat looms +[3]in Kalyxo Castle.[K] +[V]I've taken the liberty of +[V]marking the castle on your map. +[V]Beware: its shadows run deep.[K] +[V]Seek the Meadow Blade there, +[V]legends say it holds power fit +[V]for your quest. From 01289b10e9318db2c786756edafcd426e5641520 Mon Sep 17 00:00:00 2001 From: scawful Date: Sat, 11 Jan 2025 21:09:43 -0500 Subject: [PATCH 07/67] NPC cleanup, add deku scrub dialogue ID and map marker --- Sprites/NPCs/deku_scrub.asm | 25 ++++----- Sprites/NPCs/eon_owl.asm | 4 +- Sprites/NPCs/farore.asm | 106 +++++++++++++++--------------------- Sprites/NPCs/followers.asm | 30 ++++++++++ Sprites/NPCs/vasu.asm | 8 --- 5 files changed, 88 insertions(+), 85 deletions(-) diff --git a/Sprites/NPCs/deku_scrub.asm b/Sprites/NPCs/deku_scrub.asm index 29aa125..002ec22 100644 --- a/Sprites/NPCs/deku_scrub.asm +++ b/Sprites/NPCs/deku_scrub.asm @@ -32,8 +32,6 @@ %Set_Sprite_Properties(Sprite_DekuScrub_Prep, Sprite_DekuScrub_Long) -; ========================================================= - Sprite_DekuScrub_Long: { PHB : PHK : PLB @@ -45,15 +43,13 @@ Sprite_DekuScrub_Long: RTL } -; ========================================================= - Sprite_DekuScrub_Prep: { PHB : PHK : PLB LDA.b #$80 : STA.w SprDefl, X ; Peacetime Deku Scrub NPCs - LDA.b $8A : CMP.b #$2E : BNE .check_next + LDA.b AreaIndex : CMP.b #$2E : BNE .check_next ; Deku Butler LDA.b #$07 : STA.w SprAction, X JMP + @@ -75,15 +71,13 @@ Sprite_DekuScrub_Prep: LDA.b #$06 : STA.w SprAction, X ++ ; Check if tail palace is cleared - LDA.l CRYSTALS : AND #$10 : BEQ + + LDA.l Crystals : AND #$10 : BEQ + STZ.w SprState, X + PLB RTL } -; ========================================================= - Sprite_DekuScrub_Main: { LDA.w SprAction, X @@ -100,7 +94,6 @@ Sprite_DekuScrub_Main: dw DekuButler_Peacetime dw DekuPrinces_Peacetime - EstadoInactivo: { %PlayAnimation(0, 1, 16) @@ -114,8 +107,8 @@ Sprite_DekuScrub_Main: QuiereCuracion: { %PlayAnimation(0, 1, 16) - LDA $FE : BEQ .ninguna_cancion - STZ $FE + LDA $FE : BEQ .ninguna_cancion + STZ $FE LDA.b #$C0 : STA.w SprTimerD, X %GotoAction(2) .ninguna_cancion @@ -171,7 +164,9 @@ Sprite_DekuScrub_Main: %StartOnFrame(3) %PlayAnimation(3, 3, 10) JSL Sprite_PlayerCantPassThrough - ; %ShowSolicitedMessage($0C4) + %ShowSolicitedMessage($1B9) : BCC + + LDA.b #$02 : STA.l MapIcon + + RTS } @@ -180,13 +175,13 @@ Sprite_DekuScrub_Main: %StartOnFrame(4) %PlayAnimation(4, 4, 10) JSL Sprite_PlayerCantPassThrough - ; %ShowSolicitedMessage($0C5) + %ShowSolicitedMessage($1BA) : BCC + + LDA.b #$02 : STA.l MapIcon + + RTS } } -; ========================================================= - Sprite_DekuScrub_Draw: { JSL Sprite_PrepOamCoord diff --git a/Sprites/NPCs/eon_owl.asm b/Sprites/NPCs/eon_owl.asm index e59f035..05b42aa 100644 --- a/Sprites/NPCs/eon_owl.asm +++ b/Sprites/NPCs/eon_owl.asm @@ -62,13 +62,15 @@ Sprite_EonOwl_Long: Sprite_EonOwl_Prep: { PHB : PHK : PLB + + STZ.w SprHitbox, X + LDA.b $8A : CMP.b #$0E : BNE .NotGaebora LDA.b #$03 : STA.w SprAction, X .NotGaebora LDA.w AreaIndex : CMP.b #$50 : BNE .not_intro ; If Map 0x50, don't spawn after getting sword LDA.l SWORD : CMP.b #$01 : BCC .continue - .Despawn STZ.w SprState, X .continue .not_intro diff --git a/Sprites/NPCs/farore.asm b/Sprites/NPCs/farore.asm index 3bc46e7..056ff3b 100644 --- a/Sprites/NPCs/farore.asm +++ b/Sprites/NPCs/farore.asm @@ -31,8 +31,6 @@ %Set_Sprite_Properties(Sprite_Farore_Prep, Sprite_Farore_Long) -; ========================================================= - Sprite_Farore_Long: { PHB : PHK : PLB @@ -50,8 +48,6 @@ Sprite_Farore_Long: RTL } -; ========================================================= - Sprite_Farore_Prep: { PHB : PHK : PLB @@ -67,8 +63,6 @@ Sprite_Farore_Prep: RTL } -; ========================================================= - ; Movement key bitwise ---- udlr WALKSPEED = 14 @@ -198,10 +192,6 @@ Sprite_Farore_Main: } ; 07 - ; Look at the RAM SprY to SprYRound, the first few are the actual positions of the sprite - ; that you can just set manually or SprYSpeed and SprXSpeed are the "speeds" of the sprites irrc - ; You can set one of the speeds and then call the function called Sprite_Move - ; And then that will handle it applying the speed for you MakuArea_FaroreWaitForKydrog: { %PlayAnimation(5, 5, 8) @@ -210,7 +200,6 @@ Sprite_Farore_Main: } } -; ========================================================= Sprite_Farore_Draw: { @@ -220,16 +209,13 @@ Sprite_Farore_Draw: LDA $0DC0, X : CLC : ADC $0D90, X : TAY;Animation Frame LDA .start_index, Y : STA $06 - PHX LDX .nbr_of_tiles, Y ;amount of tiles -1 LDY.b #$00 .nextTile PHX ; Save current Tile Index? - TXA : CLC : ADC $06 ; Add Animation Index Offset - PHA ; Keep the value with animation index offset? ASL A : TAX @@ -246,7 +232,7 @@ Sprite_Farore_Draw: LDA.b #$F0 : STA ($90), Y ;Put the sprite out of the way STA $0E -.on_screen_y + .on_screen_y PLX ; Pullback Animation Index Offset (without the *2 not 16bit anymore) INY @@ -268,50 +254,48 @@ Sprite_Farore_Draw: RTS -; ========================================================= - -.start_index - db $00, $02, $04, $06, $08, $0A, $0C -.nbr_of_tiles - db 1, 1, 1, 1, 1, 1, 1 -.x_offsets - dw 0, 0 - dw 0, 0 - dw 0, 0 - dw 0, 0 - dw 0, 0 - dw 0, 0 - dw 0, -1 -.y_offsets - dw -8, 4 - dw -8, 4 - dw 4, -8 - dw -8, 4 - dw 4, -7 - dw -8, 4 - dw 4, -7 -.chr - db $A8, $AA - db $A8, $88 - db $AA, $A8 - db $8A, $8C - db $8C, $8A - db $8A, $AC - db $AA, $86 -.properties - db $3B, $3B - db $3B, $7B - db $3B, $3B - db $3B, $3B - db $7B, $3B - db $3B, $3B - db $3B, $7B -.sizes - db $02, $02 - db $02, $02 - db $02, $02 - db $02, $02 - db $02, $02 - db $02, $02 - db $02, $02 + .start_index + db $00, $02, $04, $06, $08, $0A, $0C + .nbr_of_tiles + db 1, 1, 1, 1, 1, 1, 1 + .x_offsets + dw 0, 0 + dw 0, 0 + dw 0, 0 + dw 0, 0 + dw 0, 0 + dw 0, 0 + dw 0, -1 + .y_offsets + dw -8, 4 + dw -8, 4 + dw 4, -8 + dw -8, 4 + dw 4, -7 + dw -8, 4 + dw 4, -7 + .chr + db $A8, $AA + db $A8, $88 + db $AA, $A8 + db $8A, $8C + db $8C, $8A + db $8A, $AC + db $AA, $86 + .properties + db $3B, $3B + db $3B, $7B + db $3B, $3B + db $3B, $3B + db $7B, $3B + db $3B, $3B + db $3B, $7B + .sizes + db $02, $02 + db $02, $02 + db $02, $02 + db $02, $02 + db $02, $02 + db $02, $02 + db $02, $02 } diff --git a/Sprites/NPCs/followers.asm b/Sprites/NPCs/followers.asm index 118c46f..6c394d6 100644 --- a/Sprites/NPCs/followers.asm +++ b/Sprites/NPCs/followers.asm @@ -1003,12 +1003,42 @@ LinkState_Minecart: db -1, 0, 0, 0 } + +TileBehavior_TL_Long: +{ + LDA.w !MinecartDirection : CMP.b #East : BNE + + + + + CMP.b #West + + RTL +} + +TileBehavior_StopLeft_Long: +{ + ; Transition back to sprite, put link in state default + LDA.w !LinkInCart : BEQ + + JSL MinecartFollower_TransitionToSprite + STZ.w LinkState + STZ.w !LinkInCart + + + RTL +} + pushpc org $07A5F7 JSL LinkState_Minecart RTS +TileBehavior_TL: + JSL TileBehavior_TL_Long + RTS + +TileBehavior_StopLeft: + JSL TileBehavior_StopLeft_Long + RTS + assert pc() <= $07A64B ; Minecart Track tile types diff --git a/Sprites/NPCs/vasu.asm b/Sprites/NPCs/vasu.asm index 2c292a8..110786d 100644 --- a/Sprites/NPCs/vasu.asm +++ b/Sprites/NPCs/vasu.asm @@ -31,8 +31,6 @@ !Boss = 00 ; 00 = normal sprite, 01 = sprite is a boss %Set_Sprite_Properties(Sprite_Vasu_Prep, Sprite_Vasu_Long) -; ========================================================= - Sprite_Vasu_Long: { PHB : PHK : PLB @@ -51,8 +49,6 @@ Sprite_Vasu_Long: RTL } -; ========================================================= - Sprite_Vasu_Prep: { PHB : PHK : PLB @@ -64,8 +60,6 @@ Sprite_Vasu_Prep: RTL } -; ========================================================= - Sprite_Vasu_Main: { JSL Sprite_PlayerCantPassThrough @@ -180,8 +174,6 @@ Sprite_Vasu_Main: } } -; ========================================================= - Sprite_Vasu_Draw: { JSL Sprite_PrepOamCoord From dea2ff1561c8c67f6f8fc3cc810090c82f2e3c7e Mon Sep 17 00:00:00 2001 From: scawful Date: Sat, 11 Jan 2025 21:09:56 -0500 Subject: [PATCH 08/67] Maple grants portal rod when speaking beta --- Sprites/NPCs/maple.asm | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/Sprites/NPCs/maple.asm b/Sprites/NPCs/maple.asm index 768c03f..c3cadb8 100644 --- a/Sprites/NPCs/maple.asm +++ b/Sprites/NPCs/maple.asm @@ -16,17 +16,16 @@ MapleHandler: dw Maple_PutLinkToSleep dw Maple_HandleDreams -; LDA.l $7EF351 : BEQ + -; LDA.b #$02 : STA.l $7EF351 -; LDA.b #$1B : STA.w $012F -; STZ.w SprAction, X -; + Maple_Idle: { %ShowSolicitedMessage($01B3) : BCC + INC.w SprAction, X + + LDA.l $7EF351 : BEQ + + LDA.b #$02 : STA.l $7EF351 + LDA.b #$1B : STA.w $012F + + RTS } From f9f4436df2d0f5fcded3a58fadfc010abe8f1111 Mon Sep 17 00:00:00 2001 From: scawful Date: Sat, 11 Jan 2025 21:10:30 -0500 Subject: [PATCH 09/67] Housekeeping --- Core/ram.asm | 2 +- Dungeons/floor_puzzle.asm | 41 +++++++++++++------------------- Items/book_of_secrets.asm | 2 -- Menu/menu_hud.asm | 4 ---- Overworld/overlays.asm | 8 ------- Sprites/Bosses/kydreeok_head.asm | 30 ++++++++--------------- 6 files changed, 27 insertions(+), 60 deletions(-) diff --git a/Core/ram.asm b/Core/ram.asm index 8292a63..2bf105a 100644 --- a/Core/ram.asm +++ b/Core/ram.asm @@ -8087,7 +8087,7 @@ ABILITY = $7EF379 ; i - Ice Palace ; m - Misery Mire ; t - Turtle Rock -CRYSTALS = $7EF37A +Crystals = $7EF37A ; 0x00 - Normal magic ; 0x01 - Half magic diff --git a/Dungeons/floor_puzzle.asm b/Dungeons/floor_puzzle.asm index ef9bb37..33000cc 100644 --- a/Dungeons/floor_puzzle.asm +++ b/Dungeons/floor_puzzle.asm @@ -1,8 +1,6 @@ -;================================================ -;use holes_0 tag routine -; DO NOT USE holes_1 tag (broken because of holes_0 tag) -;================================================== +; ================================================ +; use holes_0 tag routine org $01CC00 ; holes_0 tag routine JSL NewTagRoutine @@ -17,10 +15,10 @@ NewTagRoutine: LDA.b $20 : CLC : ADC #$10 : AND.b #$F0 : STA.w $0224 ; y LDA.b $22 : CLC : ADC #$08 : AND.b #$F0 : STA.w $0225 ; x - LDA.w $0224 : CMP.w $0226 : BNE .differentTile - LDA.w $0225 : CMP.w $0227 : BNE .differentTile - JMP .sameTile - .differentTile + LDA.w $0224 : CMP.w $0226 : BNE .different_tile + LDA.w $0225 : CMP.w $0227 : BNE .different_tile + JMP .same_tile + .different_tile ; do code here for tile code REP #$30 @@ -32,7 +30,7 @@ NewTagRoutine: LDA.l $7E2000, X : CMP.w #$0DED : BNE + JSR update_star_tile JSR SearchForEmptyStar - BRA .doneupdate + BRA .done_update + LDA.l $7E2000, X : CMP.w #$0DEE : BNE + ;JSR SearchToRedStar @@ -43,10 +41,10 @@ NewTagRoutine: ;JSR SearchForEmptyStar + - .doneupdate + .done_update SEP #$30 - .sameTile + .same_tile LDA.w $0224 : STA.w $0226 ; Last Y LDA.w $0225 : STA.w $0227 ; Last X @@ -93,26 +91,19 @@ update_red_star_tile: replace_red_tile_star: { LDX.w $1000 - - LDA.w #$19EE : STA.w $1006,X - LDA.w #$99EE : STA.w $100C,X - LDA.w #$59EE : STA.w $1012,X - LDA.w #$D9EE : STA.w $1018,X + LDA.w #$19EE : STA.w $1006, X + LDA.w #$99EE : STA.w $100C, X + LDA.w #$59EE : STA.w $1012, X + LDA.w #$D9EE : STA.w $1018, X LDX.b $06 - LDA.w #$19EE : STA.l $7E2000, X LDA.w #$99EE : STA.l $7E2080, X LDA.w #$59EE : STA.l $7E2002, X LDA.w #$D9EE : STA.l $7E2082, X - - AND.w #$03FF - TAX - - LDA.l $7EFE00,X - AND.w #$00FF - STA.b $08 - STA.b $09 + AND.w #$03FF : TAX + LDA.l $7EFE00,X : AND.w #$00FF + STA.b $08 : STA.b $09 JMP replace_tile_continue } diff --git a/Items/book_of_secrets.asm b/Items/book_of_secrets.asm index 327096c..71d0220 100644 --- a/Items/book_of_secrets.asm +++ b/Items/book_of_secrets.asm @@ -19,8 +19,6 @@ org $068365 JSL LinkItem_SecretsBook ; overwrite it (originally JSL $099F91) -; ========================================================= - pullpc LinkItem_SecretsBook: diff --git a/Menu/menu_hud.asm b/Menu/menu_hud.asm index f3afd44..2637b0b 100644 --- a/Menu/menu_hud.asm +++ b/Menu/menu_hud.asm @@ -538,8 +538,6 @@ FloorIndicatorNumberHigh: dw $E51C, $250E, $007F } -; ========================================================== - ; $57CF6 DATA org $0AFCF6 FloorIndicatorNumberLow: @@ -548,8 +546,6 @@ FloorIndicatorNumberLow: dw $E50C, $A50E, $007F } -; ========================================================== - ; *$57D0C-$57DA7 JUMP LOCATION (LONG) org $0AFD0C FloorIndicator: diff --git a/Overworld/overlays.asm b/Overworld/overlays.asm index 3a0fa35..c545e39 100644 --- a/Overworld/overlays.asm +++ b/Overworld/overlays.asm @@ -1,12 +1,4 @@ ; ========================================================= -; Normal Overlays: -; Overworld_DrawQuadrantsAndOverlays -; -> ApplyOverworldOverlay - -; Animated Entrances: -; Module09_00_PlayerControl -; -> Overworld_AnimateEntrance -; ========================================================= ; Trigger Zora Temple from Tablet org $1EE061 diff --git a/Sprites/Bosses/kydreeok_head.asm b/Sprites/Bosses/kydreeok_head.asm index f5dc495..e15e672 100644 --- a/Sprites/Bosses/kydreeok_head.asm +++ b/Sprites/Bosses/kydreeok_head.asm @@ -47,8 +47,6 @@ Sprite_KydreeokHead_Long: RTL } -; ========================================================= - Sprite_KydreeokHead_Prep: { PHB : PHK : PLB @@ -59,8 +57,6 @@ Sprite_KydreeokHead_Prep: RTL } -; ========================================================= - SpeedTable: db $00, $02, $04, $06, $07, $01, $06, $03 db 0, -2, -4, -6, -7, -1, -6, -3 @@ -219,8 +215,6 @@ KydreeokHead_RotationMove: RTS } -; ========================================================= - CoordinateBasedRotation: { LDA.w Neck_Index : TAY @@ -238,20 +232,18 @@ CoordinateBasedRotation: LDA #0 : STA.w Neck_Index .not_full RTS + + ; Table for X coordinates (based on a radius of 8) + X_Coords: + db 8, 11, 8, 3, -4, -9, -12, -9 + db -4, 3, 8, 11, 8, 3, -4, -9 + + ; Table for Y coordinates (based on a radius of 8) + Y_Coords: + db 0, -3, -8, -11, -15, -15, -11, -8 + db -3, 0, 3, 8, 11, 15, 15, 11 } -; Table for X coordinates (based on a radius of 8) -X_Coords: - db 8, 11, 8, 3, -4, -9, -12, -9 - db -4, 3, 8, 11, 8, 3, -4, -9 - -; Table for Y coordinates (based on a radius of 8) -Y_Coords: - db 0, -3, -8, -11, -15, -15, -11, -8 - db -3, 0, 3, 8, 11, 15, 15, 11 - -; ========================================================= - RotateHeadUsingSpeedValues: { LDY.w Neck_Index @@ -284,8 +276,6 @@ RotateHeadUsingSpeedValues: db -12, -9, -6, -3 } -; ========================================================= - RandomlyAttack: { JSL Sprite_DamageFlash_Long From 2f3faba1a61c4273782b2e1a35134facafd09021 Mon Sep 17 00:00:00 2001 From: scawful Date: Sun, 12 Jan 2025 15:25:02 -0500 Subject: [PATCH 10/67] Fix KaeporaGaebora sprite interaction --- Sprites/NPCs/eon_owl.asm | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Sprites/NPCs/eon_owl.asm b/Sprites/NPCs/eon_owl.asm index 05b42aa..6132f14 100644 --- a/Sprites/NPCs/eon_owl.asm +++ b/Sprites/NPCs/eon_owl.asm @@ -66,6 +66,7 @@ Sprite_EonOwl_Prep: STZ.w SprHitbox, X LDA.b $8A : CMP.b #$0E : BNE .NotGaebora + LDA.b #$20 : STA.w SprTimerA, X LDA.b #$03 : STA.w SprAction, X .NotGaebora LDA.w AreaIndex : CMP.b #$50 : BNE .not_intro @@ -137,8 +138,8 @@ Sprite_EonOwl_Main: { %PlayAnimation(0,0,1) LDA.w SprTimerA, X : BNE .not_ready - %ShowUnconditionalMessage($146) - %GotoAction(4) + %ShowUnconditionalMessage($146) + %GotoAction(4) .not_ready RTS } @@ -146,7 +147,7 @@ Sprite_EonOwl_Main: KaeporaGaebora_Respond: { LDA $1CE8 : BNE .player_said_no - %GotoAction(5) + %GotoAction(3) RTS .player_said_no %GotoAction(5) From ac855f7eeb58308d35c253c021d3c9bb697d2273 Mon Sep 17 00:00:00 2001 From: scawful Date: Sun, 12 Jan 2025 15:25:20 -0500 Subject: [PATCH 11/67] Change HeadPos macros into functions --- Sprites/Bosses/manhandla.asm | 196 ++++++++++++----------------------- 1 file changed, 67 insertions(+), 129 deletions(-) diff --git a/Sprites/Bosses/manhandla.asm b/Sprites/Bosses/manhandla.asm index 0ff68f2..b55d3e3 100644 --- a/Sprites/Bosses/manhandla.asm +++ b/Sprites/Bosses/manhandla.asm @@ -52,11 +52,9 @@ Sprite_Manhandla_Long: } pushpc - ; Sprite_DoTheDeath#PrepareEnemyDrop.post_death_stuff org $06FA25 LDA.w $0E20, X : CMP.b #$88 - pullpc ; ========================================================= @@ -121,7 +119,7 @@ Sprite_Manhandla_CheckForNextPhaseOrDeath: ; ========================================================= -macro SetLeftHeadPos() +SetLeftHeadPos: REP #$20 LDA.w SprCachedX : SEC : SBC.w #$0016 SEP #$20 @@ -131,9 +129,9 @@ macro SetLeftHeadPos() LDA.w SprCachedY : SEC : SBC.w #$000F SEP #$20 STA.w SprY, Y : XBA : STA.w SprYH, Y -endmacro + RTS -macro SetRightHeadPos() +SetRightHeadPos: REP #$20 LDA.w SprCachedX : CLC : ADC.w #$0016 SEP #$20 @@ -143,9 +141,9 @@ macro SetRightHeadPos() LDA.w SprCachedY : SEC : SBC.w #$000F SEP #$20 STA.w SprY, Y : XBA : STA.w SprYH, Y -endmacro + RTS -macro SetCenterHeadPos() +SetCenterHeadPos: REP #$20 LDA.w SprCachedX SEP #$20 @@ -155,7 +153,7 @@ macro SetCenterHeadPos() LDA.w SprCachedY SEP #$20 STA.w SprY, Y : XBA : STA.w SprYH, Y -endmacro + RTS Sprite_Manhandla_Main: { @@ -257,7 +255,7 @@ Sprite_Manhandla_Main: LDY.w Offspring3_Id LDA.w SprType, Y : CMP.b #$88 : BNE .not_head3 LDA.w SprState, Y : BEQ .offspring3_dead - %SetCenterHeadPos() + JSR SetCenterHeadPos .offspring3_dead .not_head3 @@ -267,16 +265,16 @@ Sprite_Manhandla_Main: Flower_Flicker: { %PlayAnimation(11, 12, 10) - LDA $1C : ORA.b #$01 : STA $1C ;turn on BG2 (Body) + LDA $1C : ORA.b #$01 : STA $1C ; turn on BG2 (Body) ; Flicker the body every other frame using the timer LDA.w SprTimerA, X : AND.b #$01 : BEQ .flicker - LDA $1C : AND.b #$FE : STA $1C ;turn off BG2 (Body) + LDA $1C : AND.b #$FE : STA $1C ; turn off BG2 (Body) .flicker LDA.w SprTimerA, X : BNE .continue STZ.w $0422 STZ.w $0424 - LDA $1C : AND.b #$FE : STA $1C ;turn off BG2 (Body) + LDA $1C : AND.b #$FE : STA $1C ; turn off BG2 (Body) %GotoAction($04) LDA.b #$10 : STA.w SprTimerC, X @@ -285,27 +283,19 @@ Sprite_Manhandla_Main: LDA #$88 JSL Sprite_SpawnDynamically : BMI .return TYA : STA.w Offspring3_Id - PHX - %SetCenterHeadPos() - + JSR SetCenterHeadPos LDA.b #$08 : STA.w SprSubtype, Y STA.w SprAction, Y LDA.b #$20 : STA.w SprHealth, Y LDA.b #$07 : STA.w SprNbrOAM, Y - LDA.w SprY, Y : CLC : ADC.b #$20 : STA.w SprY, Y LDA.b #$10 : STA.w SprTimerC, Y - TYX - STZ.w SprYRound, X STZ.w SprXRound, X PLX - - .return - .continue RTS } @@ -328,54 +318,47 @@ Sprite_Manhandla_Main: LDY.w Offspring1_Id LDA.w SprType, Y : CMP.b #$88 : BNE .not_head - LDA.w SprState, Y : BEQ .offspring1_dead - %SetLeftHeadPos() - .offspring1_dead + LDA.w SprState, Y : BEQ .offspring1_dead + JSR SetLeftHeadPos + .offspring1_dead .not_head + LDY.w Offspring2_Id LDA.w SprType, Y : CMP.b #$88 : BNE .not_head2 - LDA.w SprState, Y : BEQ .offspring2_dead - %SetRightHeadPos() - .offspring2_dead + LDA.w SprState, Y : BEQ .offspring2_dead + JSR SetRightHeadPos + .offspring2_dead .not_head2 LDY.w Offspring3_Id LDA.w SprType, Y : CMP.b #$88 : BNE .not_head3 - LDA.w SprState, Y : BEQ .offspring3_dead - %SetCenterHeadPos() + LDA.w SprState, Y : BEQ .offspring3_dead + JSR SetCenterHeadPos .offspring3_dead .not_head3 - PLX - RTS } BigChuchu_Emerge: { %PlayAnimation(9, 12, 10) - JSL Sprite_DamageFlash_Long - LDA.w SprTimerA, X : BNE + LDA.b #$02 : STA.w SprMiscD, X ; Set phase flag LDA.b #$20 : STA.w SprTimerA, X %GotoAction($05) + - RTS } BigChuchu_Flower: { %PlayAnimation(12, 12, 1) - JSL Sprite_DamageFlash_Long - LDA.w SprTimerC, X : BEQ + LDA.w SprY, X : DEC : STA.w SprY, X + - RTS } @@ -391,11 +374,8 @@ Sprite_Manhandla_Main: ChuchuBlast: { %PlayAnimation(3, 4, 4) - JSL Sprite_Move - %DoDamageToPlayerSameLayerOnContact() - RTS } } @@ -579,9 +559,6 @@ Sprite_Manhandla_Draw: RTS - - ; ========================================================= - .start_index db $00, $02, $04, $08, $0C, $10, $14, $17, $1A, $1D, $23, $29, $33 .nbr_of_tiles @@ -719,7 +696,6 @@ Sprite_BigChuchu_Draw: RTS - ; ======================================================= .start_index db $00, $09, $12, $1B, $1C .nbr_of_tiles @@ -761,12 +737,8 @@ Chuchu_SpawnBlast: PHX LDA.b #$88 JSL Sprite_SpawnDynamically : BMI .return - - LDA.b #$0A : STA.w SprSubtype, Y - STA.w SprAction, Y - + LDA.b #$0A : STA.w SprSubtype, Y : STA.w SprAction, Y JSL GetRandomInt : AND.b #$01 : TAX - LDA.w .speed_and_offset_x, X : STA.w SprXSpeed, Y LDA.w SprX, Y : CLC : ADC.w .speed_and_offset_x, X : STA.w SprX, Y STA.w SprXRound, Y @@ -779,12 +751,10 @@ Chuchu_SpawnBlast: LDA.b #$10 : STA.w SprTimerB, Y LDA.b #$00 : STA.w SprNbrOAM, Y LDA.b #$03 : STA.w SprHitbox, Y - .return PLX RTS - .speed_and_offset_x db -16, 16 @@ -797,43 +767,27 @@ Mothula_SpawnBeams: LDA.b #$36 ; SFX3.36 JSL $0DBB8A ; SpriteSFX_QueueSFX3WithPan - LDA.b #$02 - STA.w $0FB5 + LDA.b #$02 : STA.w $0FB5 .next_spawn LDA.b #$89 ; SPRITE 89 - JSL Sprite_SpawnDynamically - BMI .no_space + JSL Sprite_SpawnDynamically : BMI .no_space + JSL Sprite_SetSpawnedCoordinates + LDA.b $02 : SEC : SBC.b $04 + CLC : ADC.b #$03 : STA.w SprY,Y + LDA.b #$10 : STA.w SprTimerA,Y : STA.w SprBulletproof,Y - JSL Sprite_SetSpawnedCoordinates - - LDA.b $02 : SEC : SBC.b $04 - - CLC : ADC.b #$03 : STA.w SprY,Y - - LDA.b #$10 : STA.w SprTimerA,Y : STA.w SprBulletproof,Y - - PHX - - LDX.w $0FB5 - - LDA.b $00 : CLC : ADC.w .speed_and_offset_x,X - STA.w SprX,Y - - LDA.w .speed_and_offset_x,X : STA.w SprXSpeed,Y - - LDA.w .speed_y,X - STA.w SprYSpeed,Y - - LDA.b #$00 - STA.w SprHeight,Y - - PLX + PHX + LDX.w $0FB5 + LDA.b $00 : CLC : ADC.w .speed_and_offset_x,X : STA.w SprX,Y + LDA.w .speed_and_offset_x,X : STA.w SprXSpeed,Y + LDA.w .speed_y,X : STA.w SprYSpeed,Y + LDA.b #$00 : STA.w SprHeight,Y + PLX .no_space DEC.w $0FB5 BPL .next_spawn - RTS .speed_and_offset_x db -20, 0, 20 @@ -845,23 +799,19 @@ Mothula_SpawnBeams: SpawnLeftManhandlaHead: { LDA #$88 - JSL Sprite_SpawnDynamically : BMI .return - TYA : STA.w Offspring1_Id - + JSL Sprite_SpawnDynamically : BMI .return + TYA : STA.w Offspring1_Id PHX - %SetLeftHeadPos() - ; store the sub-type + JSR SetLeftHeadPos LDA.b #$03 : STA.w SprSubtype, Y STA.w SprAction, Y LDA.b #$14 : STA.w SprHealth, Y LDA.b #$90 : STA.w SprTileDie, Y LDA.w SprGfxProps : ORA.b #$80 : STA.w SprGfxProps, Y TYX - STZ.w SprYRound, X STZ.w SprXRound, X PLX - .return RTS } @@ -871,17 +821,14 @@ SpawnRightManhandlaHead: LDA #$88 JSL Sprite_SpawnDynamically : BMI .return TYA : STA.w Offspring2_Id - PHX - %SetRightHeadPos() - + JSR SetRightHeadPos LDA.b #$02 STA.w SprSubtype, Y LDA.b #$14 : STA.w SprHealth, Y LDA.b #$90 : STA.w SprTileDie, Y LDA.w SprGfxProps : AND.b #$80 : STA.w SprGfxProps, Y TYX - STZ.w SprYRound, X STZ.w SprXRound, X PLX @@ -894,18 +841,14 @@ SpawnCenterMandhandlaHead: LDA #$88 JSL Sprite_SpawnDynamically : BMI .return TYA : STA.w Offspring3_Id - PHX - %SetCenterHeadPos() - + JSR SetCenterHeadPos LDA.b #$01 STA.w SprSubtype, Y LDA.b #$14 : STA.w SprHealth, Y LDA.b #$90 : STA.w SprTileDie, Y LDA.w SprGfxProps : AND.b #$80 : STA.w SprGfxProps, Y - TYX - STZ.w SprYRound, X STZ.w SprXRound, X PLX @@ -915,45 +858,40 @@ SpawnCenterMandhandlaHead: ApplyManhandlaPalette: { - REP #$20 ;Set A in 16bit mode - - ;note, this uses adresses like 7EC300 and not 7EC500 because the game - ;will fade the colors into 7EC500 based on the colors found in 7EC300 - - LDA #$7FFF : STA $7EC5E2 ;BG2 - LDA #$08D9 : STA $7EC5E4 - LDA #$1E07 : STA $7EC5E6 - LDA #$4ACA : STA $7EC5E8 - LDA #$14A5 : STA $7EC5EA - LDA #$133F : STA $7EC5EC - LDA #$19DF : STA $7EC5EE - - INC $15 - - SEP #$20 ;Set A in 8bit mode - - RTS + REP #$20 ;Set A in 16bit mode + ; note, this uses adresses like 7EC300 and not 7EC500 because the game + ; will fade the colors into 7EC500 based on the colors found in 7EC300 + LDA #$7FFF : STA $7EC5E2 ;BG2 + LDA #$08D9 : STA $7EC5E4 + LDA #$1E07 : STA $7EC5E6 + LDA #$4ACA : STA $7EC5E8 + LDA #$14A5 : STA $7EC5EA + LDA #$133F : STA $7EC5EC + LDA #$19DF : STA $7EC5EE + INC $15 + SEP #$20 ;Set A in 8bit mode + RTS } ApplyManhandlaGraphics: { - PHX - REP #$20 ; A = 16, XY = 8 - LDX #$80 : STX $2100 ; turn the screen off (required) - LDX #$80 : STX $2115 ; Set the video port register every time we write it increase by 1 - LDA #$5000 : STA $2116 ; Destination of the DMA $5800 in vram <- this need to be divided by 2 - LDA #$1801 : STA $4300 ; DMA Transfer Mode and destination register - ; "001 => 2 registers write once (2 bytes: p, p+1)" + PHX + REP #$20 ; A = 16, XY = 8 + LDX #$80 : STX $2100 ; turn the screen off (required) + LDX #$80 : STX $2115 ; Set the video port register every time we write it increase by 1 + LDA #$5000 : STA $2116 ; Destination of the DMA $5800 in vram, need to be divided by 2 + LDA #$1801 : STA $4300 ; DMA Transfer Mode and destination register + ; "001 => 2 registers write once (2 bytes: p, p+1)" - LDA.w #ManhandlaGraphics : STA $4302 - LDX.b #ManhandlaGraphics>>16 : STX $4304 + LDA.w #ManhandlaGraphics : STA $4302 + LDX.b #ManhandlaGraphics>>16 : STX $4304 - LDA #$2000 : STA $4305 ; Size of the transfer 4 sheets of $800 each - LDX #$01 : STX $420B ; Do the DMA - LDX #$0F : STX $2100 ; Turn the screen back on - SEP #$30 - PLX - RTS + LDA #$2000 : STA $4305 ; Size of the transfer 4 sheets of $800 each + LDX #$01 : STX $420B ; Do the DMA + LDX #$0F : STX $2100 ; Turn the screen back on + SEP #$30 + PLX + RTS ManhandlaGraphics: incbin manhandla.bin From d73e49c9bca4bdcf215c51e89407f12c72b14a31 Mon Sep 17 00:00:00 2001 From: scawful Date: Sun, 12 Jan 2025 19:04:01 -0500 Subject: [PATCH 12/67] Fix mask salesman song of healing dialogue ID --- Sprites/NPCs/mask_salesman.asm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sprites/NPCs/mask_salesman.asm b/Sprites/NPCs/mask_salesman.asm index d7408b9..fdf9455 100644 --- a/Sprites/NPCs/mask_salesman.asm +++ b/Sprites/NPCs/mask_salesman.asm @@ -120,7 +120,7 @@ Sprite_MaskSalesman_Main: HasOcarina: { %PlayAnimation(0, 1, 16) - %ShowSolicitedMessage($080) ; Oh! You got it! + %ShowSolicitedMessage($081) ; Oh! You got it! %GotoAction(3) RTS } From 09a7271ace6019fdd69603e62defabf3a139a531 Mon Sep 17 00:00:00 2001 From: scawful Date: Mon, 13 Jan 2025 08:49:13 -0500 Subject: [PATCH 13/67] Fix bug with magic bean quest when leaving map and returning --- Sprites/NPCs/bean_vendor.asm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sprites/NPCs/bean_vendor.asm b/Sprites/NPCs/bean_vendor.asm index 06e6222..622e063 100644 --- a/Sprites/NPCs/bean_vendor.asm +++ b/Sprites/NPCs/bean_vendor.asm @@ -62,7 +62,7 @@ Sprite_BeanVendor_Prep: LDA.b $8A : CMP.b #$00 : BNE + LDA.l MagicBeanProg : BNE .in_progress LDA.b #$01 : STA.w SprMiscD, X - LDA.b #$04 : STA.w SprAction, X + LDA.b #$05 : STA.w SprAction, X JMP + .in_progress LDA.l MagicBeanProg : CMP.b #$3F : BCS .not_flower From 252293cc732c40522eb1f4083094fcdb66df5697 Mon Sep 17 00:00:00 2001 From: scawful Date: Mon, 13 Jan 2025 08:56:53 -0500 Subject: [PATCH 14/67] Add distance check to kaepora gaebora sprite --- Sprites/NPCs/eon_owl.asm | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Sprites/NPCs/eon_owl.asm b/Sprites/NPCs/eon_owl.asm index 6132f14..d8234f5 100644 --- a/Sprites/NPCs/eon_owl.asm +++ b/Sprites/NPCs/eon_owl.asm @@ -137,9 +137,10 @@ Sprite_EonOwl_Main: KaeporaGaebora: { %PlayAnimation(0,0,1) - LDA.w SprTimerA, X : BNE .not_ready - %ShowUnconditionalMessage($146) - %GotoAction(4) + JSL GetDistance8bit_Long : CMP.b #$50 : BCC .not_ready + LDA.w SprTimerA, X : BNE .not_ready + %ShowUnconditionalMessage($146) + %GotoAction(4) .not_ready RTS } From 913f9ea3d0386db6287d7518cb9e2065d28a6db6 Mon Sep 17 00:00:00 2001 From: scawful Date: Fri, 17 Jan 2025 22:42:29 -0500 Subject: [PATCH 15/67] add sfx.asm --- Core/ram.asm | 382 ++++----------------------------------------------- Core/sfx.asm | 321 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 350 insertions(+), 353 deletions(-) create mode 100644 Core/sfx.asm diff --git a/Core/ram.asm b/Core/ram.asm index 2bf105a..883be80 100644 --- a/Core/ram.asm +++ b/Core/ram.asm @@ -3551,7 +3551,7 @@ ANC9SUBX = $7E0C49 ; 0x22 - Received Item Sprite ; 0x23 - Bunny / Cape transformation poof ; 0x24 - Gravestone sprite when in motion -; 0x25 - +; 0x25 - ; 0x26 - Sparkles when swinging lvl 2 or higher sword ; 0x27 - the bird (when called by flute) ; 0x28 - item sprite that you throw into magic faerie ponds. @@ -3559,7 +3559,7 @@ ANC9SUBX = $7E0C49 ; 0x2A - Start of spin attack sparkle ; 0x2B - During Spin attack sparkles ; 0x2C - Cane of Somaria blocks -; 0x2D - +; 0x2D - ; 0x2E - ???? ; 0x2F - Torch's flame @@ -3582,7 +3582,7 @@ ANC9SUBX = $7E0C49 ; 0x40 - Dwarf transformation cloud ; 0x41 - Water splash in the waterfall of wishing entrance (and swamp palace) ; 0x42 - Rupees that you throw in to the Pond of Wishing -; 0x43 - Ganon's Tower seal being broken. (not opened up though!) +; 0x43 - Ganon's Tower seal being broken. (not opened up though!) ANC0ID = $7E0C4A ANC1ID = $7E0C4B ANC2ID = $7E0C4C @@ -3702,12 +3702,12 @@ SPRFSCR = $7E0CA9 ; aixd tspr ; a - TODO -; i - -; x - -; d - -; t - -; s - -; p - +; i - +; x - +; d - +; t - +; s - +; p - ; r - Handles behavior with previous deaths flagged in $7F:DF80 (0: default | 1: ignore) SPR0DEFL = $7E0CAA SPR1DEFL = $7E0CAB @@ -7285,25 +7285,25 @@ SPR_7FFF00 = $7FFF00 ; ========================================================= ; The following ASCII art is included because MathOnNapkins likes it: ; --------------------------------------------------------- -; -; /\/\/\/ ||\\\\ || |||\\ /\ |||||||||||| /\ -; /| || || // \\ //\\ || || || //\\ -; /| ||\\ || // || // \\ || || || ///\\\ -; /| ||// || // || //||||\\ || || || /\ /\ -; /| || || // // // \\ || || || //\\ //\\ -; /\/\/\/ ||//// ||//// |||// // \\ |||||||||||| ///\\\///\\\ -; -; <^^> <^^> **** **** **** **** **** **** -; <<<##^^^^##>>> *** **** *** *** **** *** *** **** *** -; <<############>> ** ** ** ** ** ** -; <<############>> ** ** ** ** ** ** -; <<##########>> ** ** ** ** ** ** -; <<########>> ** ** ** ** ** ** -; <<######>> ** ** ** ** ** ** -; <<##>> ** ** ** ** ** ** -; <<>> **** **** **** -; <> ** ** ** -; +; +; /\/\/\/ ||\\\\ || |||\\ /\ |||||||||||| /\ +; /| || || // \\ //\\ || || || //\\ +; /| ||\\ || // || // \\ || || || ///\\\ +; /| ||// || // || //||||\\ || || || /\ /\ +; /| || || // // // \\ || || || //\\ //\\ +; /\/\/\/ ||//// ||//// |||// // \\ |||||||||||| ///\\\///\\\ +; +; <^^> <^^> **** **** **** **** **** **** +; <<<##^^^^##>>> *** **** *** *** **** *** *** **** *** +; <<############>> ** ** ** ** ** ** +; <<############>> ** ** ** ** ** ** +; <<##########>> ** ** ** ** ** ** +; <<########>> ** ** ** ** ** ** +; <<######>> ** ** ** ** ** ** +; <<##>> ** ** ** ** ** ** +; <<>> **** **** **** +; <> ** ** ** +; ; ========================================================= FILE1MAIN = $700000 FILE2MAIN = $700500 @@ -8244,7 +8244,7 @@ SAVEICKSML = $7EF4FE SAVEICKSMH = $7EF4FF ; ========================================================= -; Music +; Music ; Transfers (+4 for first byte of data) ; --------------------------------------------------------- @@ -8451,330 +8451,6 @@ SAVEICKSMH = $7EF4FF ; SRCN 17 $B0EC $B32C $0240* $FF $E0 $B8 $02C0 Oof - S ; SRCN 18 $B32C $BA61 $0735 $FE $8F $B8 $06F0 Piano M - -; ========================================================= -; SFX instruments - Table: ARAM $3E00, ROM $1A:9C04 - -; ID VOL L,R Pitch SRCN ADSR Gain Mult Name -; ----------------------------------------------------------------------------- -; $00 $70, $70 $1000 $00 $F6 $6A $B8 $03 Fwoosh -; $01 $70, $70 $1000 $01 $8E $E0 $B8 $02 Swish -; $02 $70, $70 $1000 $14 $FE $6A $B8 $02 Bomp -; $03 $70, $70 $1000 $03 $FE $F8 $B8 $0D Ting -; $04 $70, $70 $1000 $04 $FE $6A $7F $03 Rrrrr -; $05 $70, $70 $1000 $02 $FE $6A $7F $03 Clunk -; $06 $70, $70 $1000 $05 $FE $6A $70 $03 Ching -; $07 $70, $70 $1000 $06 $FE $6A $70 $03 Fwomp -; $08 $70, $70 $1000 $08 $FA $6A $70 $03 Squee -; $09 $70, $70 $1000 $06 $FE $6A $70 $01 Unused -; $0A $70, $70 $1000 $07 $FE $6A $70 $05 Bzzzrt -; $0B $70, $70 $1000 $0B $FE $6A $B8 $03 Brrfft -; $0C $70, $70 $1000 $0C $FE $E0 $B8 $02 Brrwwww -; $0D $70, $70 $1000 $0D $F9 $6E $B8 $03 Twee -; $0E $70, $70 $1000 $0E $FE $F5 $B8 $07 Pwing -; $0F $70, $70 $1000 $0F $FE $F5 $B8 $06 Pling -; $10 $70, $70 $1000 $01 $FE $FC $B8 $03 Chshtsh -; $11 $70, $70 $1000 $10 $8E $E0 $B8 $03 Splssh -; $12 $70, $70 $1000 $08 $8E $E0 $B8 $02 Weewoo -; $13 $70, $70 $1000 $14 $8E $E0 $B8 $02 Brbrbrb -; $14 $70, $70 $1000 $0A $88 $E0 $B8 $02 Bwow -; $15 $70, $70 $1000 $17 $8E $E0 $B8 $02 Uughf -; $16 $70, $70 $1000 $15 $FF $E0 $B8 $04 Aaaaaa -; $17 $70, $70 $1000 $03 $DF $11 $B8 $0F Twing -; $18 $70, $70 $1000 $01 $88 $E0 $B8 $01 Whooo - -; ----------------------------------------------------------------------------- - -; SFX instruments by usage - -; $00 SFX1.13, SFX1.14 -; SFX2.07, SFX2.09, SFX2.0D, SFX2.0E, SFX2.2C, SFX2.3A -; SFX3.05, SFX3.26 -; SFXU2533 - -; $01 SFX1.01, SFX1.02, SFX1.03, SFX1.04 -; SFX2.01, SFX2.02, SFX2.12, SFX2.1A, SFX2.1E, SFX2.1F -; SFX2.21, SFX2.23, SFX2.29, SFX2.32, SFX2.39 -; SFX3.02, SFX3.1E, SFX3.23, SFX3.31 - -; $02 SFX2.03, SFX2.04, SFX2.08, SFX2.0B, SFX2.12, SFX2.1F, SFX2.21 -; SFX3.06, SFX3.0E -; SFXU2831 - -; $03 SFX2.06 -; SFX3.0A, SFX3.30 - -; $04 SFX2.3C -; SFX3.32 -; SFXU2831 - -; $05 SFX2.10, SFX2.11, SFX2.22 -; SFX3.18, SFX3.3E -; SFXU252D - -; $06 SFX2.05, SFX2.0A, SFX2.0F, SFX2.3B -; SFX3.04, SFX3.14, SFX3.25 - -; $07 SFX2.14, SFX2.15, SFX2.33 -; SFX3.01, SFX3.11, SFX3.12, SFX3.19, SFX3.27, SFX3.28, SFX3.29, SFX3.35, SFX3.39 -; SFXU26A2 - -; $08 SFX3.17 - -; $09 nothing - -; $0A SFX1.15, SFX1.16 -; SFX3.1C, SFX3.2A, SFX3.2B, SFX3.2C - -; $0B SFX2.27 -; SFX3.0B, SFX3.0F, SFX3.2E, SFX3.34, SFX3.35, SFX3.36, SFX3.3C, SFX3.3D, SFX3.3F - -; $0C SFX2.2A -; SFX3.07, SFX3.08, SFX3.09 - -; $0D SFX1.0B, SFX1.0C, SFX1.17, SFX1.18, SFX1.1B, SFX1.1C -; SFX2.13, SFX2.20, SFX2.31, SFX2.3E, SFX2.3F -; SFX3.0C, SFX3.13, SFX3.24 -; SFXU1EE2, SFXU279D, SFXU27F6, SFXU2807, SFXU2818 - -; $0E SFX1.0D, SFX1.0E, SFX1.0F, SFX1.10, SFX1.1D, SFX1.1E, SFX1.1F, SFX1.20 -; SFX2.2B, SFX2.37 -; SFX3.0D, SFX3.10, SFX3.1B, SFX3.2F, SFX3.33, SFX3.3A, SFX3.3B - -; $0F SFX2.2D -; SFX3.1A, SFX3.1D, SFX3.20, SFX3.2D, SFX3.37 -; SFXU1D1C - -; $10 SFX2.16, SFX2.17, SFX2.18, SFX2.19 - -; $11 SFX2.1B, SFX2.1C, SFX2.24, SFX2.25, SFX2.28, SFX2.2E, SFX2.34, SFX3.28, SFX2.3D - -; $12 SFX3.04 - -; $13 SFX1.07, SFX1.08 -; SFX2.0C, SFX2.35, SFX2.36 -; SFX3.03, SFX3.15, SFX3.16, SFX3.25, SFX3.38 - -; $14 SFX3.21, SFX3.22 -; SFXU277E - -; $15 SFX2.26, SFX2.30 -; SFXU1F13 - -; $16 SFX1.11, SFX1.12 -; SFX2.1D -; SFX3.1F - -; $17 SFX2.2C, SFX2.3A - -; $18 SFX1.09, SFX1.0A - -; ----------------------------------------------------------------------------- - -; SFX1 - queued via $012D | Table: ARAM $17C0, ROM $1A:8B70 - -; ID ARAM ROM Name -; ----------------------------------------------------------------------------- -; SFX1.01 $2652 $1A9A02 Rain / Zora area -; SFX1.02 $2662 $1A9A12 Rain / Zora area (packaged with $01) -; SFX1.03 $2677 $1A9A27 Rain -; SFX1.04 $2687 $1A9A37 Rain (packaged with $03) -; SFX1.05 $284F $1A9BFF Silence -; SFX1.06 $284F $1A9BFF Silence (packaged with $05) -; SFX1.07 $2739 $1A9AE9 The Rumbling -; SFX1.08 $2736 $1A9AE6 The Rumbling (packaged with $08) -; SFX1.09 $1C8E $1A903E Wind -; SFX1.0A $1CBC $1A906C Wind (packaged with $09 by APU) -; SFX1.0B $1BA3 $1A8F53 Flute song by flute boy -; SFX1.0C $1B62 $1A8F12 Flute song by flute boy (packaged with $0B) -; SFX1.0D $1B0E $1A8EBE Magic jingle -; SFX1.0E $1B1D $1A8ECD Magic jingle (packaged with $0D) -; SFX1.0F $1B2C $1A8EDC Crystal / Save and quit -; SFX1.10 $1B3E $1A8EEE Crystal / Save and quit (packaged with $0F) -; SFX1.11 $1EAC $1A925C Choir melody -; SFX1.12 $1EC8 $1A9278 Choir countermelody (packaged with $11) -; SFX1.13 $1AD2 $1A8E82 Large boss swoosh -; SFX1.14 $1AE1 $1A8E91 Large boss swoosh (packaged with $13) -; SFX1.15 $1AF0 $1A8EA0 Triforce door / Pyramid hole opening -; SFX1.16 $1AFF $1A8EAF VOMP (packaged with $15) -; SFX1.17 $1C24 $1A8FD4 Flute song for weathervane -; SFX1.18 $1BE3 $1A8F93 Flute song for weathervane (packaged with $17) -; SFX1.19 $0000 ------- Nothing (unused) -; SFX1.1A $0000 ------- Nothing (unused; packaged with $19) -; SFX1.1B $1BA3 $1A8F53 Flute song by flute boy duplicate (unused) -; SFX1.1C $1B62 $1A8F12 Flute song by flute boy duplicate (unused; packaged with $1B) -; SFX1.1D $1B0E $1A8EBE Magic jingle duplicate (unused) -; SFX1.1E $1B1D $1A8ECD Magic jingle duplicate (unused; packaged with $1D) -; SFX1.1F $1B2C $1A8EDC Crystal / Save and quit duplicate (unused) -; SFX1.20 $1B3E $1A8EEE Crystal / Save and quit duplicate (unused; packaged with $1F) - -; $80..$FF Initiates a fade to half volume for SFX1 - -; ----------------------------------------------------------------------------- - -; SFX2 - queued via $012E | Table: ARAM $1820, ROM $1A:8BD0 - -; ID ARAM ROM Name -; ----------------------------------------------------------------------------- -; 00 $0020 ------- Undefined; when queued value of $40, $C0, $80 -; SFX2.01 $2614 $1A99C4 Slash -; SFX2.02 $2625 $1A99D5 Slash -; SFX2.03 $2634 $1A99E4 Slash -; SFX2.04 $2643 $1A99F3 Slash -; SFX2.05 $25DD $1A998D Clink -; SFX2.06 $25D7 $1A9987 Bombable door clink -; SFX2.07 $25B7 $1A9967 Fwoosh -; SFX2.08 $25E3 $1A9993 Arrow smash -; SFX2.09 $25AD $1A995D Boomerang fwish -; SFX2.0A $25C7 $1A9977 Hookshot clink -; SFX2.0B $2478 $1A9828 Placing bomb -; SFX2.0C $269C $1A9A4C Explosion -; SFX2.0D $2414 $1A97C4 Powder (paired $0D→$3F) -; SFX2.0E $2404 $1A97B4 Fire rod shot -; SFX2.0F $24C3 $1A9873 Ice rod shot -; SFX2.10 $23FA $1A97AA Hammer use -; SFX2.11 $23F0 $1A97A0 Hammering peg -; SFX2.12 $23CD $1A977D Digging -; SFX2.13 $23A0 $1A9750 Flute (paired $13→$3E) -; SFX2.14 $2380 $1A9730 Cape on -; SFX2.15 $2390 $1A9740 Cape off / Wallmaster grab -; SFX2.16 $232C $1A96DC Staircase -; SFX2.17 $2344 $1A96F4 Staircase -; SFX2.18 $2356 $1A9706 Staircase -; SFX2.19 $236E $1A971E Staircase -; SFX2.1A $2316 $1A96C6 Tall grass / Hammer hitting bush -; SFX2.1B $2307 $1A96B7 Shallow water -; SFX2.1C $2301 $1A96B1 Mire shallow water -; SFX2.1D $22BB $1A966B Lifting object -; SFX2.1E $2577 $1A9927 Cutting grass -; SFX2.1F $22E9 $1A9699 Item breaking -; SFX2.20 $22DA $1A968A Item falling in pit -; SFX2.21 $22CF $1A967F Bomb hitting ground / General thud -; SFX2.22 $2107 $1A94B7 Pushing object / Armos bounce -; SFX2.23 $22B1 $1A9661 Boots dust -; SFX2.24 $22A5 $1A9655 Splashing (paired $24→$3D) -; SFX2.25 $2296 $1A9646 Mire shallow water again? -; SFX2.26 $2844 $1A9BF4 Link taking damage -; SFX2.27 $2252 $1A9602 Fainting -; SFX2.28 $2287 $1A9637 Item splash -; SFX2.29 $243F $1A97EF Rupee refill (paired $29→$3B) -; SFX2.2A $2033 $1A93E3 Fire splash / Bombos spell -; SFX2.2B $1FF2 $1A93A2 Heart beep / Text box -; SFX2.2C $1FD9 $1A9389 Sword up (paired $2C→$3A) (also uses instrument $17) -; SFX2.2D $20A6 $1A9456 Magic drain -; SFX2.2E $1FCA $1A937A GT opening (paired $2E→$39) -; SFX2.2F $1F47 $1A92F7 GT opening / Water drain (paired $2F→$38) -; SFX2.30 $1EF1 $1A92A1 Cucco -; SFX2.31 $20CE $1A947E Fairy -; SFX2.32 $1D47 $1A90F7 Bug net -; SFX2.33 $1CDC $1A908C Teleport (paired $34→$33) -; SFX2.34 $1F6F $1A931F Teleport (paired $34→$33) -; SFX2.35 $1C67 $1A9017 Shaking -; SFX2.36 $1C64 $1A9014 Mire entrance (extends above; paired $35→$36) -; SFX2.37 $1A43 $1A8DF3 Spin charged -; SFX2.38 $1F6F $1A931F Water sound (paired $2F→$38) -; SFX2.39 $1F9C $1A934C Thunder (paired $2E→$39) -; SFX2.3A $1FE7 $1A9397 Sword up (paired $2C→$3A) -; SFX2.3B $2462 $1A9812 Rupee refill (paired $29→$3B) -; SFX2.3C $1A37 $1A8DE7 Error beep -; SFX2.3D $22AB $1A965B Big splash (paired $24→$3D) -; SFX2.3E $23B5 $1A9765 Flute (paired $13→$3E) -; SFX2.3F $2435 $1A97E5 Powder (paired $0D→$3F) - -; ----------------------------------------------------------------------------- - -; SFX3 - queued via $012F | Table: ARAM $191C, ROM $1A:8CCC - -; ID ARAM ROM Name -; ----------------------------------------------------------------------------- -; 00 $003C ------- Undefined; when queued value of $40, $C0, $80 -; SFX3.01 $1A18 $1A8DC8 Sword beam -; SFX3.02 $254E $1A98FE TR opening -; SFX3.03 $224A $1A95FA Pyramid hole -; SFX3.04 $220E $1A95BE Angry soldier -; SFX3.05 $25B7 $1A9967 Lynel shot / Javelin toss -; SFX3.06 $21F5 $1A95A5 Swoosh -; SFX3.07 $223D $1A95ED Cannon fire -; SFX3.08 $21E6 $1A9596 Damage to enemy; $0BEX.4=1 -; SFX3.09 $21C1 $1A9571 Enemy death -; SFX3.0A $21A9 $1A9559 Collecting rupee -; SFX3.0B $2198 $1A9548 Collecting heart -; SFX3.0C $218E $1A953E Non-blank text character -; SFX3.0D $21B5 $1A9565 HUD heart -; SFX3.0E $2182 $1A9532 Opening chest -; SFX3.0F $24B9 $1A9869 ♪Do do do doooooo♫ (paired $0F→$3C→$3D→$3E→$3F) -; SFX3.10 $216D $1A951D Map (paired $10→$3B) -; SFX3.11 $214F $1A94FF Opening item menu / Bomb shop guy breathing -; SFX3.12 $215E $1A950E Closing item menu / Bomb shop guy breathing -; SFX3.13 $213B $1A94EB Throwing object / Stalfos jump -; SFX3.14 $246C $1A981C Key door -; SFX3.15 $212F $1A94DF Door / Chest (used with SFX2.29) -; SFX3.16 $2123 $1A94D3 Armos Knight thud -; SFX3.17 $25A6 $1A9956 Rat squeak -; SFX3.18 $20DD $1A948D Dragging -; SFX3.19 $250A $1A98BA Fireball / Laser shot -; SFX3.1A $1E8A $1A923A Chest reveal jingle (paired $1A→$38) -; SFX3.1B $20B6 $1A9466 Puzzle jingle (paired $1B→$3A) -; SFX3.1C $1A62 $1A8E12 Damage to enemy -; SFX3.1D $20A6 $1A9456 Magic meter -; SFX3.1E $2091 $1A9441 Wing flapping -; SFX3.1F $204B $1A93FB Link falling -; SFX3.20 $276C $1A9B1C Menu / Text cursor moved -; SFX3.21 $27E2 $1A9B92 Damage to boss -; SFX3.22 $26CF $1A9A7F Boss dying / Deleting file -; SFX3.23 $2001 $1A93B1 Spin attack swoosh (paired $23→$39) -; SFX3.24 $2043 $1A93F3 OW map perspective change -; SFX3.25 $1E9D $1A924D Pressure switch (also uses instrument $06) -; SFX3.26 $1E7B $1A922B Lightning / Game over / Laser / Ganon bat / Trinexx lunge -; SFX3.27 $1E40 $1A91F0 Agahnim charge -; SFX3.28 $26F7 $1A9AA7 Agahnim / Ganon teleport -; SFX3.29 $1E21 $1A91D1 Agahnim shot -; SFX3.2A $1E12 $1A91C2 Somaria / Byrna / Ether spell / Helma fire ball -; SFX3.2B $1DF3 $1A91A3 Electrocution -; SFX3.2C $1DC0 $1A9170 Bees -; SFX3.2D $1DA9 $1A9159 Milestone jingle (paired $2D→$37) -; SFX3.2E $1D5D $1A910D Heart container jingle (paired $2E→$35→$34) -; SFX3.2F $1D80 $1A9130 Key jingle (paired $2F→$33) -; SFX3.30 $1B53 $1A8F03 Magic zap / Plop -; SFX3.31 $1ACA $1A8E7A Sprite falling / Moldorm shuffle -; SFX3.32 $1A78 $1A8E28 BOING -; SFX3.33 $1D93 $1A9143 Key jingle (paired $2F→$33) -; SFX3.34 $1D66 $1A9116 Heart container jingle (paired $2E→$35→$34) -; SFX3.35 $1D73 $1A9123 Heart container jingle (paired $2E→$35→$34) -; SFX3.36 $1AA7 $1A8E57 Magic attack -; SFX3.37 $1DB4 $1A9164 Milestone jingle (paired $2D→$37) -; SFX3.38 $1E93 $1A9243 Chest reveal jingle (paired $1A→$38) -; SFX3.39 $2017 $1A93C7 Swish (paired $23→$39) -; SFX3.3A $20C0 $1A9470 Puzzle jingle (paired $1B→$3A) -; SFX3.3B $2176 $1A9526 Map (paired $10→$3B) -; SFX3.3C $248A $1A983A Item jingle (paired $0F→$3C→$3D→$3E→$3F) -; SFX3.3D $2494 $1A9844 Item jingle ($0F→$3C→$3D→$3E→$3F) -; SFX3.3E $249E $1A984E Item jingle (paired $0F→$3C→$3D→$3E→$3F) -; SFX3.3F $2480 $1A9830 Item jingle (paired $0F→$3C→$3D→$3E→$3F) - -; ----------------------------------------------------------------------------- - -; Unused SFX - -; ARAM ROM Description -; ----------------------------------------------------------------------------- -; $1A5B $1A8E0B Noisy fsssh; bleeds into SFX3.1C -; $1D1C $1A90CC Radar ping -; $1EE2 $1A9292 Slide whistle / Chirp -; $1F13 $1A92C3 Cucco clucking -; $252D $1A98DD Brighter hammer peg -; $2533 $1A98E3 Bat wings flapping -; $2657 $1A9A07 Broken static -; $267C $1A9A2C Static; Loops -; $26A2 $1A9A52 Tuba jingle followed by a roar -; $277E $1A9B2E UFO winding up -; $279D $1A9B4D Distant whistling -; $27C9 $1A9B79 Bwuuuoow -; $27F6 $1A9BA6 Cat call -; $2807 $1A9BB7 Higher pitched cat call -; $2818 $1A9BC8 Reverse cat call -; $2829 $1A9BD9 Dial-up -; $2831 $1A9BE1 Bumper peg - ; ========================================================= ; Registers diff --git a/Core/sfx.asm b/Core/sfx.asm new file mode 100644 index 0000000..985659c --- /dev/null +++ b/Core/sfx.asm @@ -0,0 +1,321 @@ +; ========================================================= +; SFX instruments - Table: ARAM $3E00, ROM $1A:9C04 + +; ID VOL L,R Pitch SRCN ADSR Gain Mult Name +; ----------------------------------------------------------------------------- +; $00 $70, $70 $1000 $00 $F6 $6A $B8 $03 Fwoosh +; $01 $70, $70 $1000 $01 $8E $E0 $B8 $02 Swish +; $02 $70, $70 $1000 $14 $FE $6A $B8 $02 Bomp +; $03 $70, $70 $1000 $03 $FE $F8 $B8 $0D Ting +; $04 $70, $70 $1000 $04 $FE $6A $7F $03 Rrrrr +; $05 $70, $70 $1000 $02 $FE $6A $7F $03 Clunk +; $06 $70, $70 $1000 $05 $FE $6A $70 $03 Ching +; $07 $70, $70 $1000 $06 $FE $6A $70 $03 Fwomp +; $08 $70, $70 $1000 $08 $FA $6A $70 $03 Squee +; $09 $70, $70 $1000 $06 $FE $6A $70 $01 Unused +; $0A $70, $70 $1000 $07 $FE $6A $70 $05 Bzzzrt +; $0B $70, $70 $1000 $0B $FE $6A $B8 $03 Brrfft +; $0C $70, $70 $1000 $0C $FE $E0 $B8 $02 Brrwwww +; $0D $70, $70 $1000 $0D $F9 $6E $B8 $03 Twee +; $0E $70, $70 $1000 $0E $FE $F5 $B8 $07 Pwing +; $0F $70, $70 $1000 $0F $FE $F5 $B8 $06 Pling +; $10 $70, $70 $1000 $01 $FE $FC $B8 $03 Chshtsh +; $11 $70, $70 $1000 $10 $8E $E0 $B8 $03 Splssh +; $12 $70, $70 $1000 $08 $8E $E0 $B8 $02 Weewoo +; $13 $70, $70 $1000 $14 $8E $E0 $B8 $02 Brbrbrb +; $14 $70, $70 $1000 $0A $88 $E0 $B8 $02 Bwow +; $15 $70, $70 $1000 $17 $8E $E0 $B8 $02 Uughf +; $16 $70, $70 $1000 $15 $FF $E0 $B8 $04 Aaaaaa +; $17 $70, $70 $1000 $03 $DF $11 $B8 $0F Twing +; $18 $70, $70 $1000 $01 $88 $E0 $B8 $01 Whooo + +; ----------------------------------------------------------------------------- + +; SFX instruments by usage + +; $00 SFX1.13, SFX1.14 +; SFX2.07, SFX2.09, SFX2.0D, SFX2.0E, SFX2.2C, SFX2.3A +; SFX3.05, SFX3.26 +; SFXU2533 + +; $01 SFX1.01, SFX1.02, SFX1.03, SFX1.04 +; SFX2.01, SFX2.02, SFX2.12, SFX2.1A, SFX2.1E, SFX2.1F +; SFX2.21, SFX2.23, SFX2.29, SFX2.32, SFX2.39 +; SFX3.02, SFX3.1E, SFX3.23, SFX3.31 + +; $02 SFX2.03, SFX2.04, SFX2.08, SFX2.0B, SFX2.12, SFX2.1F, SFX2.21 +; SFX3.06, SFX3.0E +; SFXU2831 + +; $03 SFX2.06 +; SFX3.0A, SFX3.30 + +; $04 SFX2.3C +; SFX3.32 +; SFXU2831 + +; $05 SFX2.10, SFX2.11, SFX2.22 +; SFX3.18, SFX3.3E +; SFXU252D + +; $06 SFX2.05, SFX2.0A, SFX2.0F, SFX2.3B +; SFX3.04, SFX3.14, SFX3.25 + +; $07 SFX2.14, SFX2.15, SFX2.33 +; SFX3.01, SFX3.11, SFX3.12, SFX3.19, SFX3.27, SFX3.28, SFX3.29, SFX3.35, SFX3.39 +; SFXU26A2 + +; $08 SFX3.17 + +; $09 nothing + +; $0A SFX1.15, SFX1.16 +; SFX3.1C, SFX3.2A, SFX3.2B, SFX3.2C + +; $0B SFX2.27 +; SFX3.0B, SFX3.0F, SFX3.2E, SFX3.34, SFX3.35, SFX3.36, SFX3.3C, SFX3.3D, SFX3.3F + +; $0C SFX2.2A +; SFX3.07, SFX3.08, SFX3.09 + +; $0D SFX1.0B, SFX1.0C, SFX1.17, SFX1.18, SFX1.1B, SFX1.1C +; SFX2.13, SFX2.20, SFX2.31, SFX2.3E, SFX2.3F +; SFX3.0C, SFX3.13, SFX3.24 +; SFXU1EE2, SFXU279D, SFXU27F6, SFXU2807, SFXU2818 + +; $0E SFX1.0D, SFX1.0E, SFX1.0F, SFX1.10, SFX1.1D, SFX1.1E, SFX1.1F, SFX1.20 +; SFX2.2B, SFX2.37 +; SFX3.0D, SFX3.10, SFX3.1B, SFX3.2F, SFX3.33, SFX3.3A, SFX3.3B + +; $0F SFX2.2D +; SFX3.1A, SFX3.1D, SFX3.20, SFX3.2D, SFX3.37 +; SFXU1D1C + +; $10 SFX2.16, SFX2.17, SFX2.18, SFX2.19 + +; $11 SFX2.1B, SFX2.1C, SFX2.24, SFX2.25, SFX2.28, SFX2.2E, SFX2.34, SFX3.28, SFX2.3D + +; $12 SFX3.04 + +; $13 SFX1.07, SFX1.08 +; SFX2.0C, SFX2.35, SFX2.36 +; SFX3.03, SFX3.15, SFX3.16, SFX3.25, SFX3.38 + +; $14 SFX3.21, SFX3.22 +; SFXU277E + +; $15 SFX2.26, SFX2.30 +; SFXU1F13 + +; $16 SFX1.11, SFX1.12 +; SFX2.1D +; SFX3.1F + +; $17 SFX2.2C, SFX2.3A + +; $18 SFX1.09, SFX1.0A + +; ----------------------------------------------------------------------------- +; SFX1 - queued via $012D | Table: ARAM $17C0, ROM $1A:8B70 + +; ID ARAM ROM Name +; ----------------------------------------------------------------------------- +; SFX1.01 $2652 $1A9A02 Rain / Zora area +; SFX1.02 $2662 $1A9A12 Rain / Zora area (packaged with $01) +; SFX1.03 $2677 $1A9A27 Rain +; SFX1.04 $2687 $1A9A37 Rain (packaged with $03) +; SFX1.05 $284F $1A9BFF Silence +; SFX1.06 $284F $1A9BFF Silence (packaged with $05) +; SFX1.07 $2739 $1A9AE9 The Rumbling +; SFX1.08 $2736 $1A9AE6 The Rumbling (packaged with $08) +; SFX1.09 $1C8E $1A903E Wind +; SFX1.0A $1CBC $1A906C Wind (packaged with $09 by APU) +; SFX1.0B $1BA3 $1A8F53 Flute song by flute boy +; SFX1.0C $1B62 $1A8F12 Flute song by flute boy (packaged with $0B) +; SFX1.0D $1B0E $1A8EBE Magic jingle +; SFX1.0E $1B1D $1A8ECD Magic jingle (packaged with $0D) +; SFX1.0F $1B2C $1A8EDC Crystal / Save and quit +; SFX1.10 $1B3E $1A8EEE Crystal / Save and quit (packaged with $0F) +; SFX1.11 $1EAC $1A925C Choir melody +; SFX1.12 $1EC8 $1A9278 Choir countermelody (packaged with $11) +; SFX1.13 $1AD2 $1A8E82 Large boss swoosh +; SFX1.14 $1AE1 $1A8E91 Large boss swoosh (packaged with $13) +; SFX1.15 $1AF0 $1A8EA0 Triforce door / Pyramid hole opening +; SFX1.16 $1AFF $1A8EAF VOMP (packaged with $15) +; SFX1.17 $1C24 $1A8FD4 Flute song for weathervane +; SFX1.18 $1BE3 $1A8F93 Flute song for weathervane (packaged with $17) +; SFX1.19 $0000 ------- Nothing (unused) +; SFX1.1A $0000 ------- Nothing (unused; packaged with $19) +; SFX1.1B $1BA3 $1A8F53 Flute song by flute boy duplicate (unused) +; SFX1.1C $1B62 $1A8F12 Flute song by flute boy duplicate (unused; packaged with $1B) +; SFX1.1D $1B0E $1A8EBE Magic jingle duplicate (unused) +; SFX1.1E $1B1D $1A8ECD Magic jingle duplicate (unused; packaged with $1D) +; SFX1.1F $1B2C $1A8EDC Crystal / Save and quit duplicate (unused) +; SFX1.20 $1B3E $1A8EEE Crystal / Save and quit duplicate (unused; packaged with $1F) + +; $80..$FF Initiates a fade to half volume for SFX1 + + +; ----------------------------------------------------------------------------- +; SFX2 - queued via $012E | Table: ARAM $1820, ROM $1A:8BD0 + +; ID ARAM ROM Name +; ----------------------------------------------------------------------------- +; 00 $0020 ------- Undefined; when queued value of $40, $C0, $80 +; SFX2.01 $2614 $1A99C4 Slash +; SFX2.02 $2625 $1A99D5 Slash +; SFX2.03 $2634 $1A99E4 Slash +; SFX2.04 $2643 $1A99F3 Slash +; SFX2.05 $25DD $1A998D Clink +; SFX2.06 $25D7 $1A9987 Bombable door clink +; SFX2.07 $25B7 $1A9967 Fwoosh +; SFX2.08 $25E3 $1A9993 Arrow smash +; SFX2.09 $25AD $1A995D Boomerang fwish +; SFX2.0A $25C7 $1A9977 Hookshot clink +; SFX2.0B $2478 $1A9828 Placing bomb +; SFX2.0C $269C $1A9A4C Explosion +; SFX2.0D $2414 $1A97C4 Powder (paired $0D→$3F) +; SFX2.0E $2404 $1A97B4 Fire rod shot +; SFX2.0F $24C3 $1A9873 Ice rod shot +; SFX2.10 $23FA $1A97AA Hammer use +; SFX2.11 $23F0 $1A97A0 Hammering peg +; SFX2.12 $23CD $1A977D Digging +; SFX2.13 $23A0 $1A9750 Flute (paired $13→$3E) +; SFX2.14 $2380 $1A9730 Cape on +; SFX2.15 $2390 $1A9740 Cape off / Wallmaster grab +; SFX2.16 $232C $1A96DC Staircase +; SFX2.17 $2344 $1A96F4 Staircase +; SFX2.18 $2356 $1A9706 Staircase +; SFX2.19 $236E $1A971E Staircase +; SFX2.1A $2316 $1A96C6 Tall grass / Hammer hitting bush +; SFX2.1B $2307 $1A96B7 Shallow water +; SFX2.1C $2301 $1A96B1 Mire shallow water +; SFX2.1D $22BB $1A966B Lifting object +; SFX2.1E $2577 $1A9927 Cutting grass +; SFX2.1F $22E9 $1A9699 Item breaking +; SFX2.20 $22DA $1A968A Item falling in pit +; SFX2.21 $22CF $1A967F Bomb hitting ground / General thud +; SFX2.22 $2107 $1A94B7 Pushing object / Armos bounce +; SFX2.23 $22B1 $1A9661 Boots dust +; SFX2.24 $22A5 $1A9655 Splashing (paired $24→$3D) +; SFX2.25 $2296 $1A9646 Mire shallow water again? +; SFX2.26 $2844 $1A9BF4 Link taking damage +; SFX2.27 $2252 $1A9602 Fainting +; SFX2.28 $2287 $1A9637 Item splash +; SFX2.29 $243F $1A97EF Rupee refill (paired $29→$3B) +; SFX2.2A $2033 $1A93E3 Fire splash / Bombos spell +; SFX2.2B $1FF2 $1A93A2 Heart beep / Text box +; SFX2.2C $1FD9 $1A9389 Sword up (paired $2C→$3A) (also uses instrument $17) +; SFX2.2D $20A6 $1A9456 Magic drain +; SFX2.2E $1FCA $1A937A GT opening (paired $2E→$39) +; SFX2.2F $1F47 $1A92F7 GT opening / Water drain (paired $2F→$38) +; SFX2.30 $1EF1 $1A92A1 Cucco +; SFX2.31 $20CE $1A947E Fairy +; SFX2.32 $1D47 $1A90F7 Bug net +; SFX2.33 $1CDC $1A908C Teleport (paired $34→$33) +; SFX2.34 $1F6F $1A931F Teleport (paired $34→$33) +; SFX2.35 $1C67 $1A9017 Shaking +; SFX2.36 $1C64 $1A9014 Mire entrance (extends above; paired $35→$36) +; SFX2.37 $1A43 $1A8DF3 Spin charged +; SFX2.38 $1F6F $1A931F Water sound (paired $2F→$38) +; SFX2.39 $1F9C $1A934C Thunder (paired $2E→$39) +; SFX2.3A $1FE7 $1A9397 Sword up (paired $2C→$3A) +; SFX2.3B $2462 $1A9812 Rupee refill (paired $29→$3B) +; SFX2.3C $1A37 $1A8DE7 Error beep +; SFX2.3D $22AB $1A965B Big splash (paired $24→$3D) +; SFX2.3E $23B5 $1A9765 Flute (paired $13→$3E) +; SFX2.3F $2435 $1A97E5 Powder (paired $0D→$3F) + +; ----------------------------------------------------------------------------- +; SFX3 - queued via $012F | Table: ARAM $191C, ROM $1A:8CCC + +; ID ARAM ROM Name +; ----------------------------------------------------------------------------- +; 00 $003C ------- Undefined; when queued value of $40, $C0, $80 +; SFX3.01 $1A18 $1A8DC8 Sword beam +; SFX3.02 $254E $1A98FE TR opening +; SFX3.03 $224A $1A95FA Pyramid hole +; SFX3.04 $220E $1A95BE Angry soldier +; SFX3.05 $25B7 $1A9967 Lynel shot / Javelin toss +; SFX3.06 $21F5 $1A95A5 Swoosh +; SFX3.07 $223D $1A95ED Cannon fire +; SFX3.08 $21E6 $1A9596 Damage to enemy; $0BEX.4=1 +; SFX3.09 $21C1 $1A9571 Enemy death +; SFX3.0A $21A9 $1A9559 Collecting rupee +; SFX3.0B $2198 $1A9548 Collecting heart +; SFX3.0C $218E $1A953E Non-blank text character +; SFX3.0D $21B5 $1A9565 HUD heart +; SFX3.0E $2182 $1A9532 Opening chest +; SFX3.0F $24B9 $1A9869 ♪Do do do doooooo♫ (paired $0F→$3C→$3D→$3E→$3F) +; SFX3.10 $216D $1A951D Map (paired $10→$3B) +; SFX3.11 $214F $1A94FF Opening item menu / Bomb shop guy breathing +; SFX3.12 $215E $1A950E Closing item menu / Bomb shop guy breathing +; SFX3.13 $213B $1A94EB Throwing object / Stalfos jump +; SFX3.14 $246C $1A981C Key door +; SFX3.15 $212F $1A94DF Door / Chest (used with SFX2.29) +; SFX3.16 $2123 $1A94D3 Armos Knight thud +; SFX3.17 $25A6 $1A9956 Rat squeak +; SFX3.18 $20DD $1A948D Dragging +; SFX3.19 $250A $1A98BA Fireball / Laser shot +; SFX3.1A $1E8A $1A923A Chest reveal jingle (paired $1A→$38) +; SFX3.1B $20B6 $1A9466 Puzzle jingle (paired $1B→$3A) +; SFX3.1C $1A62 $1A8E12 Damage to enemy +; SFX3.1D $20A6 $1A9456 Magic meter +; SFX3.1E $2091 $1A9441 Wing flapping +; SFX3.1F $204B $1A93FB Link falling +; SFX3.20 $276C $1A9B1C Menu / Text cursor moved +; SFX3.21 $27E2 $1A9B92 Damage to boss +; SFX3.22 $26CF $1A9A7F Boss dying / Deleting file +; SFX3.23 $2001 $1A93B1 Spin attack swoosh (paired $23→$39) +; SFX3.24 $2043 $1A93F3 OW map perspective change +; SFX3.25 $1E9D $1A924D Pressure switch (also uses instrument $06) +; SFX3.26 $1E7B $1A922B Lightning / Game over / Laser / Ganon bat / Trinexx lunge +; SFX3.27 $1E40 $1A91F0 Agahnim charge +; SFX3.28 $26F7 $1A9AA7 Agahnim / Ganon teleport +; SFX3.29 $1E21 $1A91D1 Agahnim shot +; SFX3.2A $1E12 $1A91C2 Somaria / Byrna / Ether spell / Helma fire ball +; SFX3.2B $1DF3 $1A91A3 Electrocution +; SFX3.2C $1DC0 $1A9170 Bees +; SFX3.2D $1DA9 $1A9159 Milestone jingle (paired $2D→$37) +; SFX3.2E $1D5D $1A910D Heart container jingle (paired $2E→$35→$34) +; SFX3.2F $1D80 $1A9130 Key jingle (paired $2F→$33) +; SFX3.30 $1B53 $1A8F03 Magic zap / Plop +; SFX3.31 $1ACA $1A8E7A Sprite falling / Moldorm shuffle +; SFX3.32 $1A78 $1A8E28 BOING +; SFX3.33 $1D93 $1A9143 Key jingle (paired $2F→$33) +; SFX3.34 $1D66 $1A9116 Heart container jingle (paired $2E→$35→$34) +; SFX3.35 $1D73 $1A9123 Heart container jingle (paired $2E→$35→$34) +; SFX3.36 $1AA7 $1A8E57 Magic attack +; SFX3.37 $1DB4 $1A9164 Milestone jingle (paired $2D→$37) +; SFX3.38 $1E93 $1A9243 Chest reveal jingle (paired $1A→$38) +; SFX3.39 $2017 $1A93C7 Swish (paired $23→$39) +; SFX3.3A $20C0 $1A9470 Puzzle jingle (paired $1B→$3A) +; SFX3.3B $2176 $1A9526 Map (paired $10→$3B) +; SFX3.3C $248A $1A983A Item jingle (paired $0F→$3C→$3D→$3E→$3F) +; SFX3.3D $2494 $1A9844 Item jingle ($0F→$3C→$3D→$3E→$3F) +; SFX3.3E $249E $1A984E Item jingle (paired $0F→$3C→$3D→$3E→$3F) +; SFX3.3F $2480 $1A9830 Item jingle (paired $0F→$3C→$3D→$3E→$3F) + +; ----------------------------------------------------------------------------- +; Unused SFX + +; ARAM ROM Description +; ----------------------------------------------------------------------------- +; $1A5B $1A8E0B Noisy fsssh; bleeds into SFX3.1C +; $1D1C $1A90CC Radar ping +; $1EE2 $1A9292 Slide whistle / Chirp +; $1F13 $1A92C3 Cucco clucking +; $252D $1A98DD Brighter hammer peg +; $2533 $1A98E3 Bat wings flapping +; $2657 $1A9A07 Broken static +; $267C $1A9A2C Static; Loops +; $26A2 $1A9A52 Tuba jingle followed by a roar +; $277E $1A9B2E UFO winding up +; $279D $1A9B4D Distant whistling +; $27C9 $1A9B79 Bwuuuoow +; $27F6 $1A9BA6 Cat call +; $2807 $1A9BB7 Higher pitched cat call +; $2818 $1A9BC8 Reverse cat call +; $2829 $1A9BD9 Dial-up +; $2831 $1A9BE1 Bumper peg + From b8fa53ec92fd4ac0ad8b57c8fe64c8890dbcd597 Mon Sep 17 00:00:00 2001 From: scawful Date: Fri, 17 Jan 2025 23:19:28 -0500 Subject: [PATCH 16/67] Refactor time system to use named variables for hours and minutes; add night check functions and update palette handling --- Overworld/time_system.asm | 218 ++++++++++++++++++-------------------- 1 file changed, 103 insertions(+), 115 deletions(-) diff --git a/Overworld/time_system.asm b/Overworld/time_system.asm index f23b9d3..83a63f1 100644 --- a/Overworld/time_system.asm +++ b/Overworld/time_system.asm @@ -38,8 +38,8 @@ pullpc LogoFadeInSetClock: { JSL $00ED7C ; IntroLogoPaletteFadeIn - LDA.b #$08 : STA.l $7EE000 ; Set the time to 6:00am - LDA.b #$3F : STA.l $7EE002 ; Set the time speed + LDA.b #$08 : STA.l Hours ; Set the time to 6:00am + LDA.b #$3F : STA.l TimeSpeed ; Set the time speed RTL } @@ -50,8 +50,8 @@ pullpc ResetClockTriforceRoom: { JSL $00E384 ; LoadCommonSprites_long - LDA.b #$00 : STA.l $7EE000 ; low hours for palette? - LDA.b #$00 : STA.l $7EE001 ; high hours for palette? + LDA.b #$00 : STA.l Hours ; low hours for palette? + LDA.b #$00 : STA.l Minutes ; high hours for palette? RTL } @@ -65,7 +65,7 @@ DrawClockToHud: { LDX #$00 .debut - LDY #$00 : LDA $7EE000,x + LDY #$00 : LDA Hours,x .debut2 CMP #$0A : BMI .draw SBC #$0A : INY : BRA .debut2 @@ -146,7 +146,7 @@ RunClock: LDA #$00 : STA.l Minutes LDA.l Hours : INC A : STA.l Hours CMP #$18 : BPL .reset_hours ; hours = 24 ? - ;check indoors/outdoors + ; check indoors/outdoors LDA $1B : BEQ .outdoors0 RTS .outdoors0 @@ -154,7 +154,7 @@ RunClock: JSL RomToPaletteBuffer ; update buffer palette JSL PaletteBufferToEffective ; update effective palette - ;rain layer ? + ; rain layer ? LDA $8C : CMP #$9F : BEQ .skip_bg_updt0 LDA $8C : CMP #$9E : BEQ .skip_bg_updt0 ; canopy layer ? CMP #$97 : BEQ .skip_bg_updt0 ; fog layer? @@ -170,10 +170,9 @@ RunClock: JSR CheckForDailyQuests - LDA #$00 : STA $7EE000 - .update_palette + LDA.b #$00 : STA.l Hours ; check indoors/outdoors - LDA $1B : BEQ .outdoors1 + LDA.b $1B : BEQ .outdoors1 RTS .outdoors1 @@ -234,8 +233,53 @@ CheckForDailyQuests: RTS } +CheckIfNight: +{ + JSR LoadPeacetimeSprites : BCS + + RTL + + + LDA.l GameState : CMP.b #$02 : BCC .day_time + LDA Hours : CMP.b #$12 : BCS .night_time + LDA Hours : CMP.b #$06 : BCC .night_time + .day_time + LDA.l GameState + RTL + .night_time + LDA.b #$03 + RTL +} + +CheckIfNight16Bit: +{ + SEP #$30 + JSR LoadPeacetimeSprites : BCS + + REP #$30 + RTL + + + REP #$30 + ; Don't change the spriteset during the intro sequence + LDA.l GameState : AND.w #$00FF : CMP.w #$0002 : BCC .day_time + ; 0x12 = 18 hours or 6 pm + LDA Hours : AND.w #$00FF : CMP.w #$0012 : BCS .night_time + ; If it's less than 6 am, jump to night time + LDA Hours : AND.w #$00FF : CMP.w #$0006 : BCC .night_time + .day_time + LDA.l GameState + RTL + .night_time + ; Load the gamestate 03 spritesets, but don't change the save ram + LDA.l GameState : CLC : ADC #$0001 + RTL +} + pushpc +; Overworld_LoadSprites +org $09C4E3 : JSL CheckIfNight + +; Sprite_LoadGraphicsProperties_light_world_only +org $00FC6A : JSL CheckIfNight16Bit + ; ========================================================= ; ----[ Day / Night system * palette effect ]---- ; ========================================================= @@ -259,18 +303,13 @@ RomToPaletteBuffer: JSR $C692 ; $02:C692 -> rom to palette buffer for other colors RTL -PaletteBuffer_HUD = $7EC300 -PaletteBuffer_BG = $7EC340 -PaletteBuffer_Spr = $7EC400 +PalBuf300_HUD = $7EC300 +PalBuf340_BG = $7EC340 +PalBuf400_Spr = $7EC400 -PaletteCgram_HUD = $7EC500 -PaletteCgram_BG = $7EC540 -PaletteCgram_Spr = $7EC600 - -; part of rom pal to buffer routine -; $1B/EF61 9F 00 C3 7E STA $7EC300,x[$7E:C422] -; $1B/EF3D 9F 00 C3 7E STA $7EC300,x[$7E:C412] -; $1B/EF84 9F 00 C3 7E STA $7EC300,x[$7E:C4B2] +PalCgram500_HUD = $7EC500 +PalCgram540_BG = $7EC540 +PalCgram600_Spr = $7EC600 ; Palettes_LoadSingle.next_color org $1BEF3D : JSL LoadDayNightPaletteEffect @@ -285,14 +324,14 @@ pullpc LoadDayNightPaletteEffect: { STA.l !pal_color : CPX #$0041 : BPL .title_check - STA.l PaletteBuffer_HUD, X + STA.l PalBuf300_HUD, X RTL .title_check ; title or file select screen ? LDA $10 : AND #$00FF : CMP #$0002 : BCS .outin_check LDA.l !pal_color - STA.l PaletteBuffer_HUD, X + STA.l PalBuf300_HUD, X RTL .outin_check @@ -301,20 +340,20 @@ LoadDayNightPaletteEffect: BRA .overworld .restorecode LDA.l !pal_color - STA.l PaletteBuffer_HUD, X + STA.l PalBuf300_HUD, X RTL .overworld LDA $1B : AND #$00FF : BEQ .outdoors2 LDA.l !pal_color - STA.l PaletteBuffer_HUD,X + STA.l PalBuf300_HUD,X RTL .outdoors2 PHX JSL ColorSubEffect PLX - STA.l PaletteBuffer_HUD, X + STA.l PalBuf300_HUD, X RTL } @@ -391,10 +430,10 @@ BackgroundFix: BEQ .no_effect ;BRAnch if A=#$0000 (transparent bg) JSL ColorSubEffect .no_effect: - STA.l PaletteCgram_HUD - STA.l PaletteBuffer_HUD - STA.l PaletteCgram_BG - STA.l PaletteBuffer_BG + STA.l PalCgram500_HUD + STA.l PalBuf300_HUD + STA.l PalCgram540_BG + STA.l PalBuf340_BG RTL } @@ -403,8 +442,8 @@ MosaicFix: BEQ + JSL ColorSubEffect + - STA.l PaletteBuffer_HUD - STA.l PaletteBuffer_BG + STA.l PalBuf300_HUD + STA.l PalBuf340_BG RTL } @@ -418,8 +457,8 @@ SubAreasFix: SEP #$20 PLX .no_effect - STA.l PaletteBuffer_HUD - STA.l PaletteBuffer_BG + STA.l PalBuf300_HUD + STA.l PalBuf340_BG RTL } @@ -441,63 +480,23 @@ GlovesFix: RTL } -CheckIfNight: -{ - JSR LoadPeacetimeSprites : BCS + - RTL - + - LDA.l GameState : CMP.b #$02 : BCC .day_time - LDA $7EE000 : CMP.b #$12 : BCS .night_time - LDA $7EE000 : CMP.b #$06 : BCC .night_time - .day_time - LDA.l GameState - RTL - .night_time - LDA.b #$03 - RTL -} - ColorBgFix: { PHA SEP #$30 ; Check for save and quit LDA.b $10 : CMP.b #$17 : BEQ .vanilla - REP #$30 - PLA - STA.l !pal_color - JSL ColorSubEffect - STA.l PaletteCgram_HUD - STA.l PaletteCgram_BG - RTL - + REP #$30 + PLA + STA.l !pal_color + JSL ColorSubEffect + STA.l PalCgram500_HUD + STA.l PalCgram540_BG + RTL .vanilla REP #$30 PLA - STA.l PaletteCgram_HUD - RTL -} - -CheckIfNight16Bit: -{ - SEP #$30 - JSR LoadPeacetimeSprites : BCS + - REP #$30 - RTL - + - REP #$30 - ; Don't change the spriteset during the intro sequence - LDA.l GameState : AND.w #$00FF : CMP.w #$0002 : BCC .day_time - ; 0x12 = 18 hours or 6 pm - LDA $7EE000 : AND.w #$00FF : CMP.w #$0012 : BCS .night_time - ; If it's less than 6 am, jump to night time - LDA $7EE000 : AND.w #$00FF : CMP.w #$0006 : BCC .night_time - .day_time - LDA.l GameState - RTL - .night_time - ; Load the gamestate 03 spritesets, but don't change the save ram - LDA.l GameState : CLC : ADC #$0001 + STA.l PalCgram500_HUD RTL } @@ -525,7 +524,7 @@ LoadPeacetimeSprites: FixSaveAndQuit: { - LDA #$08 : STA $7EE000 + LDA.b #$08 : STA.l Hours LDA.l GameState RTL } @@ -533,13 +532,13 @@ FixSaveAndQuit: FixShockPalette: { PHA - LDA $1B : BNE .indoors + LDA.b $1B : BNE .indoors PLA STA !pal_color PHX JSL ColorSubEffect PLX - STA.l PaletteCgram_HUD, X + STA.l PalCgram500_HUD, X RTL .indoors PLA @@ -550,48 +549,39 @@ FixDungeonMapColors: { PHA ; Cache the current time - LDA $7EE000 : STA $7EF900 - LDA $7EE001 : STA $7EF901 + LDA Hours : STA $7EF900 + LDA Minutes : STA $7EF901 ; Set the time to 8:00am while map is open - LDA #$08 : STA $7EE000 - LDA #$00 : STA $7EE001 + LDA.b #$08 : STA Hours + LDA.b #$00 : STA Minutes PLA - STA $7EC229 + STA.l $7EC229 RTL } RestoreTimeForDungeonMap: { - LDA $7EF900 : STA $7EE000 - LDA $7EF901 : STA $7EE001 + LDA $7EF900 : STA Hours + LDA $7EF901 : STA Minutes LDA.l $7EC017 RTL } pushpc -; Overworld_LoadSprites -org $09C4E3 : JSL CheckIfNight - -; Sprite_LoadGraphicsProperties_light_world_only -org $00FC6A : JSL CheckIfNight16Bit - ; $0BFE70 -> background color loading routine ; Background color write fix - 16 bytes ; $0B/FEB6 8F 00 C5 7E STA $7EC500 ; $0B/FEBA 8F 00 C3 7E STA $7EC300 ; $0B/FEBE 8F 40 C5 7E STA $7EC540 ; $0B/FEC2 8F 40 C3 7E STA $7EC340 -org $0BFEB6 - JSL BackgroundFix +org $0BFEB6 : JSL BackgroundFix ; SetBGColorMainBuffer -org $0ED5F9 - JSL ColorBgFix +org $0ED5F9 : JSL ColorBgFix ; OverworldMosaicTransition_HandleScreensAndLoadShroom -org $02AE92 - NOP #6 +org $02AE92 : NOP #6 ; ========================================================= @@ -599,8 +589,7 @@ org $02AE92 ; $0E/D601 8F 00 C3 7E STA $7EC300[$7E:C300] ; $0E/D605 8F 40 C3 7E STA $7EC340[$7E:C340] -org $0ED601 - JSL SubAreasFix +org $0ED601 : JSL SubAreasFix ; ========================================================= ; Gloves color loading routine @@ -619,20 +608,19 @@ org $0ED601 ; $1B/EE39 6B RTL ; Palettes_Load_LinkGloves -org $1BEE2D - JSL GlovesFix - -; ========================================================= +org $1BEE2D : JSL GlovesFix ; org $0ABA5A ; TODO: Handle overworld map palette for flashing icons +; Module0E_03_00_DarkenAndPrep org $0ED956 : JSL FixDungeonMapColors -org $0AEFA6 : JSL RestoreTimeForDungeonMap +; UnderworldMap_RecoverGFX +org $0AEFA6 : JSL RestoreTimeForDungeonMap -org $0ED745 : JSL FixShockPalette +; RefreshLinkEquipmentPalettes +org $0ED745 : JSL FixShockPalette -org $09F604 -GameOver_SaveAndQuit: - JSL FixSaveAndQuit +; GameOver_SaveAndQuit: +org $09F604 : JSL FixSaveAndQuit \ No newline at end of file From a6eac7dc4fc083e6d6ec2323a7c8e19e31fd4b98 Mon Sep 17 00:00:00 2001 From: scawful Date: Sat, 18 Jan 2025 10:59:08 -0500 Subject: [PATCH 17/67] Fix sword barrier sprite prep --- Sprites/all_sprites.asm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Sprites/all_sprites.asm b/Sprites/all_sprites.asm index 2db1101..9e86d88 100644 --- a/Sprites/all_sprites.asm +++ b/Sprites/all_sprites.asm @@ -432,3 +432,6 @@ SpriteDraw_RunningBoy: #_05EA3D: dw 0, -7 : db $2E, $40, $00, $02 #_05EA45: dw 0, 1 : db $CE, $4E, $00, $02 +; Sword Barrier Sprite Prep +; Skip overworld flag check, sprite is indoors now +org $06891B : NOP #12 From 90225c3b4ab04be12d2bf21aa62904403e2ff356 Mon Sep 17 00:00:00 2001 From: scawful Date: Sat, 18 Jan 2025 10:59:45 -0500 Subject: [PATCH 18/67] Sprite housekeeping --- Sprites/Bosses/kydreeok.asm | 4 - Sprites/Enemies/business_scrub.asm | 4 +- Sprites/Enemies/poltergeist.asm | 1051 +++++++++++++--------------- Sprites/NPCs/ranch_girl.asm | 8 +- Sprites/NPCs/vasu.asm | 3 +- Sprites/Objects/ice_block.asm | 73 +- 6 files changed, 529 insertions(+), 614 deletions(-) diff --git a/Sprites/Bosses/kydreeok.asm b/Sprites/Bosses/kydreeok.asm index be364aa..dbfb47f 100644 --- a/Sprites/Bosses/kydreeok.asm +++ b/Sprites/Bosses/kydreeok.asm @@ -48,8 +48,6 @@ Sprite_Kydreeok_Long: RTL } -; ========================================================= - Sprite_Kydreeok_Prep: { PHB : PHK : PLB @@ -121,8 +119,6 @@ MaybeRespawnHead: RTS } -; ========================================================= - Sprite_Kydreeok_Main: { %SpriteJumpTable(Kydreeok_Start, diff --git a/Sprites/Enemies/business_scrub.asm b/Sprites/Enemies/business_scrub.asm index 1d3d2c8..3b90150 100644 --- a/Sprites/Enemies/business_scrub.asm +++ b/Sprites/Enemies/business_scrub.asm @@ -29,7 +29,7 @@ !ImpervSwordHammer = 00 ; 01 = Impervious to sword and hammer attacks !Boss = 00 ; 00 = normal sprite, 01 = sprite is a boss -%Set_Sprite_Properties(Sprite_BusinessScrub_Prep, Sprite_BusinessScrub_Long); +%Set_Sprite_Properties(Sprite_BusinessScrub_Prep, Sprite_BusinessScrub_Long) Sprite_BusinessScrub_Long: { @@ -60,7 +60,7 @@ Sprite_BusinessScrub_Prep: { PHB : PHK : PLB LDA.w SprSubtype, X : CMP.b #$01 : BEQ .pea_shot - CMP.b #$02 : BEQ .cutscene_scrub + CMP.b #$02 : BEQ .cutscene_scrub JMP + .pea_shot LDA.b #$06 : STA.w SprAction, X ; Pea Shot State diff --git a/Sprites/Enemies/poltergeist.asm b/Sprites/Enemies/poltergeist.asm index b0d1517..51cb34a 100644 --- a/Sprites/Enemies/poltergeist.asm +++ b/Sprites/Enemies/poltergeist.asm @@ -21,7 +21,7 @@ !DeflectArrow = 00 ; 01 = deflect arrows !WaterSprite = 00 ; 01 = can only walk shallow water !Blockable = 00 ; 01 = can be blocked by link's shield? -!Prize = 0 ; 00-15 = the prize pack the sprite will drop from +!Prize = 00 ; 00-15 = the prize pack the sprite will drop from !Sound = 00 ; 01 = Play different sound when taking damage !Interaction = 00 ; ?? No documentation !Statue = 00 ; 01 = Sprite is statue @@ -47,8 +47,6 @@ Sprite_Poltergeist_Long: RTL } -; ========================================================= - Sprite_Poltergeist_Prep: { PHB : PHK : PLB @@ -59,49 +57,49 @@ Sprite_Poltergeist_Prep: LDA #$01 : STA.w SprAction, X ; by default it's a chair LDA.w SprSubtype, X : CMP #$10 : BNE .notPictureFrame - STZ.w SprMiscA, X - STZ.w SprAction, X - JMP .done + STZ.w SprMiscA, X + STZ.w SprAction, X + JMP .done .notPictureFrame CMP #$11 : BNE .notAxe - LDA #$07 : STA.w SprFrame, X - LDA #$02 : STA.w SprAction, X - LDA #$04 : STA.w SprNbrOAM, X - BRA .done + LDA #$07 : STA.w SprFrame, X + LDA #$02 : STA.w SprAction, X + LDA #$04 : STA.w SprNbrOAM, X + BRA .done .notAxe CMP #$12 : BNE .notKnife - LDA #15 : STA.w SprFrame, X - LDA #$02 : STA.w SprAction, X - BRA .done + LDA #15 : STA.w SprFrame, X + LDA #$02 : STA.w SprAction, X + BRA .done .notKnife CMP #$13 : BNE .notFork - LDA #37 : STA.w SprFrame, X - LDA #$02 : STA.w SprAction, X - BRA .done + LDA #37 : STA.w SprFrame, X + LDA #$02 : STA.w SprAction, X + BRA .done .notFork CMP #$14 : BNE .notBed - LDA #5 : STA.w SprFrame, X - LDA #$01 : STA.w SprAction, X - LDA #$06 : STA.w SprNbrOAM, X - BRA .done + LDA #5 : STA.w SprFrame, X + LDA #$01 : STA.w SprAction, X + LDA #$06 : STA.w SprNbrOAM, X + BRA .done .notBed CMP #$15 : BNE .notDoor - LDA #36 : STA.w SprFrame, X - LDA #$01 : STA.w SprAction, X - LDA #$04 : STA.w SprNbrOAM, X - LDA.w SprY, X : SEC : SBC #$0C : STA.w SprY, X - LDA.w SprX, X : CLC : ADC #$08 : STA.w SprX, X - BRA .done + LDA #36 : STA.w SprFrame, X + LDA #$01 : STA.w SprAction, X + LDA #$04 : STA.w SprNbrOAM, X + LDA.w SprY, X : SEC : SBC #$0C : STA.w SprY, X + LDA.w SprX, X : CLC : ADC #$08 : STA.w SprX, X + BRA .done .notDoor LDA.w SprSubtype, X : AND #$08 : BNE .secondset ;2nd set - LDA.w SprSubtype, X : CLC : ADC #23 : STA.w SprFrame, X - BRA .done + LDA.w SprSubtype, X : CLC : ADC #23 : STA.w SprFrame, X + BRA .done .secondset LDA.w SprSubtype, X : AND #$07 : CLC : ADC #30 : STA.w SprFrame, X @@ -148,231 +146,196 @@ Sprite_Poltergeist_Main: PictureFrame: { - JSL Sprite_CheckDamageToPlayer - REP #$20 - - JSR GetLinkDistance16bit : CMP #$0050 : BCS .notcloseenough - SEP #$20 - LDA #$01 : STA.w SprMiscA, X - LDA #$02 : STA.w SprHeight, X - - .notcloseenough + JSL Sprite_CheckDamageToPlayer + REP #$20 + JSR GetLinkDistance16bit : CMP #$0050 : BCS .notcloseenough SEP #$20 + LDA #$01 : STA.w SprMiscA, X + LDA #$02 : STA.w SprHeight, X + .notcloseenough - LDA.w SprMiscA, X : BNE .chase - RTS - - .chase - - %PlayAnimation(0, 3, 6) - - LDA #$0A - JSL Sprite_ApplySpeedTowardsPlayer - - JSL Sprite_MoveLong - - JSL Sprite_CheckDamageFromPlayer : BCC .noShatter - JMP Shatter - - .noShatter + SEP #$20 + LDA.w SprMiscA, X : BNE .chase RTS + .chase + + %PlayAnimation(0, 3, 6) + + LDA #$0A + JSL Sprite_ApplySpeedTowardsPlayer + + JSL Sprite_MoveLong + + JSL Sprite_CheckDamageFromPlayer : BCC .noShatter + JMP Shatter + .noShatter + RTS } GetLinkDistance16bit: { - LDA.w SprCachedX ; Sprite X - SEC : SBC $22 ; - Player X + LDA.w SprCachedX ; Sprite X + SEC : SBC $22 ; - Player X - BPL + - EOR #$FFFF : INC - + + BPL + + EOR #$FFFF : INC + + - STA $00 ; Distance X (ABS) + STA $00 ; Distance X (ABS) - LDA.w SprCachedY ; Sprite Y - SEC : SBC $20 ; - Player Y + LDA.w SprCachedY ; Sprite Y + SEC : SBC $20 ; - Player Y - BPL + - EOR #$FFFF : INC - + + BPL + + EOR #$FFFF : INC + + - ; Add it back to X Distance - CLC : ADC $00 : STA $00 ; distance total X, Y (ABS) + ; Add it back to X Distance + CLC : ADC $00 : STA $00 ; distance total X, Y (ABS) - RTS + RTS } Chair: { - JSL Sprite_CheckDamageToPlayer - REP #$20 - - JSR GetLinkDistance16bit : CMP #$0050 : BCS .notcloseenough - SEP #$20 - LDA.w SprMiscA, X : BNE + - LDA #$01 : STA.w SprMiscA, X - + - - .notcloseenough + JSL Sprite_CheckDamageToPlayer + REP #$20 + JSR GetLinkDistance16bit : CMP #$0050 : BCS .notcloseenough SEP #$20 - - LDA.w SprMiscA, X : CMP #$01 : BNE + - ; Prepare to raise in the air - LDA.b #$20 : STA.w SprTimerA, X - INC.w SprMiscA, X - - RTS + LDA.w SprMiscA, X : BNE + + LDA #$01 : STA.w SprMiscA, X + + .notcloseenough - CMP #$02 : BNE + - ; Prepare to raise in the air - - LDA.w SprTimerA, X : BNE .stillrising - LDA.b #$10 : STA.w SprTimerA, X - INC.w SprMiscA, X - - RTS - - .stillrising - - ; OPTIONAL DELAY THE INCREASING SPRHEIGHT WITH TIMER - LDA.w SprTimerC, X : BNE .optionalTimer - LDA #$02 : STA.w SprTimerC, X - INC.w SprHeight, X - - .optionalTimer - - RTS - + - - CMP #$03 : BNE + - LDA.w SprTimerA, X : BNE .waitingdelay - JSL Sprite_MoveLong - JSL Sprite_CheckDamageToPlayer : BCS Shatter - JSL Sprite_CheckDamageFromPlayer : BCS Shatter - ;JSL Sprite_CheckTileCollision : BNE Shatter - + SEP #$20 + LDA.w SprMiscA, X : CMP #$01 : BNE + + ; Prepare to raise in the air + LDA.b #$20 : STA.w SprTimerA, X + INC.w SprMiscA, X RTS - + - RTS - .waitingdelay - LDA #$28 - JSL Sprite_ApplySpeedTowardsPlayer + + + CMP #$02 : BNE + + ; Prepare to raise in the air + LDA.w SprTimerA, X : BNE .stillrising + LDA.b #$10 : STA.w SprTimerA, X + INC.w SprMiscA, X + RTS + .stillrising + + ; OPTIONAL DELAY THE INCREASING SPRHEIGHT WITH TIMER + LDA.w SprTimerC, X : BNE .optionalTimer + LDA #$02 : STA.w SprTimerC, X + INC.w SprHeight, X + .optionalTimer RTS + + + + CMP #$03 : BNE + + LDA.w SprTimerA, X : BNE .waitingdelay + JSL Sprite_MoveLong + JSL Sprite_CheckDamageToPlayer : BCS Shatter + JSL Sprite_CheckDamageFromPlayer : BCS Shatter + ;JSL Sprite_CheckTileCollision : BNE Shatter + + RTS + + + RTS + .waitingdelay + LDA #$28 + JSL Sprite_ApplySpeedTowardsPlayer + + RTS } Shatter: { - LDA.b #$A6 : STA.w SprNbrOAM, X - LDA.b #$1F : JSL Sound_SetSfx2PanLong - STZ $0DC0, X - - LDA.b #$04 : STA.w SprMiscB, X - - LDA.b #$06 : STA.w SprState, X - - LDA.b #$1F : STA.w SprTimerA, X - - LDA.b #$EC : STA $0E20, X - - LDA.w SprNbrOAM, X : CLC : ADC #$04 : STA.w SprNbrOAM, X - - STZ $0EF0, X - - LDA.b #$80 : STA.w SprMiscB, X - RTS + LDA.b #$A6 : STA.w SprNbrOAM, X + LDA.b #$1F : JSL Sound_SetSfx2PanLong + STZ $0DC0, X + LDA.b #$04 : STA.w SprMiscB, X + LDA.b #$06 : STA.w SprState, X + LDA.b #$1F : STA.w SprTimerA, X + LDA.b #$EC : STA $0E20, X + LDA.w SprNbrOAM, X : CLC : ADC #$04 : STA.w SprNbrOAM, X + STZ $0EF0, X + LDA.b #$80 : STA.w SprMiscB, X + RTS } Axe: { - JSL Sprite_CheckDamageToPlayer - REP #$20 - JSR GetLinkDistance16bit : CMP #$0050 : BCS .notcloseenough - SEP #$20 - - LDA.w SprMiscA, X : BNE + - LDA #$01 : STA.w SprMiscA, X - + - - .notcloseenough - + JSL Sprite_CheckDamageToPlayer + REP #$20 + JSR GetLinkDistance16bit : CMP #$0050 : BCS .notcloseenough SEP #$20 - LDA.w SprMiscA, X : CMP #$01 : BNE + - ; Prepare to raise in the air - LDA.b #$20 : STA.w SprTimerA, X - INC.w SprMiscA, X - - RTS + LDA.w SprMiscA, X : BNE + + LDA #$01 : STA.w SprMiscA, X + + .notcloseenough - CMP #$02 : BNE + - ; Prepare to raise in the air - - LDA.w SprTimerA, X : BNE .stillrising - LDA.b #$10 : STA.w SprTimerA, X - INC.w SprMiscA, X - - RTS - - .stillrising - - ; OPTIONAL DELAY THE INCREASING SPRHEIGHT WITH TIMER - LDA.w SprTimerC, X : BNE .optionalTimer - LDA #$02 : STA.w SprTimerC, X - INC.w SprHeight, X - - .optionalTimer - - RTS - + - - CMP #$03 : BNE + - LDA.w SprSubtype, X : CMP #$11 : BNE .notAxe - JSR PlayAxe - BRA .done - - .notAxe - - CMP #$12 : BNE .notKnife - JSR PlayKnife - BRA .done - - .notKnife - - JSR PlayFork - - .done - - LDA.w SprTimerA, X : BNE .waitingdelay - JSL Sprite_MoveLong - - JSL Sprite_CheckDamageToPlayer : BCC .noShatter - JMP Shatter - - JSL Sprite_CheckDamageFromPlayer : BCC .noShatter - JMP Shatter - - JSL Sprite_CheckTileCollision : BEQ .noShatter - JMP Shatter - - .noShatter - - RTS - + + SEP #$20 + LDA.w SprMiscA, X : CMP #$01 : BNE + + ; Prepare to raise in the air + LDA.b #$20 : STA.w SprTimerA, X + INC.w SprMiscA, X RTS + + - .waitingdelay - - LDA #$20 - JSL Sprite_ApplySpeedTowardsPlayer + CMP #$02 : BNE + + ; Prepare to raise in the air + LDA.w SprTimerA, X : BNE .stillrising + LDA.b #$10 : STA.w SprTimerA, X + INC.w SprMiscA, X + RTS + .stillrising + ; OPTIONAL DELAY THE INCREASING SPRHEIGHT WITH TIMER + LDA.w SprTimerC, X : BNE .optionalTimer + LDA #$02 : STA.w SprTimerC, X + INC.w SprHeight, X + .optionalTimer RTS + + + + CMP #$03 : BNE + + LDA.w SprSubtype, X : CMP #$11 : BNE .notAxe + JSR PlayAxe + BRA .done + .notAxe + + CMP #$12 : BNE .notKnife + JSR PlayKnife + BRA .done + .notKnife + + JSR PlayFork + .done + + LDA.w SprTimerA, X : BNE .waitingdelay + JSL Sprite_MoveLong + JSL Sprite_CheckDamageToPlayer : BCC .noShatter + JMP Shatter + JSL Sprite_CheckDamageFromPlayer : BCC .noShatter + JMP Shatter + JSL Sprite_CheckTileCollision : BEQ .noShatter + JMP Shatter + .noShatter + RTS + + + RTS + + .waitingdelay + + LDA #$20 + JSL Sprite_ApplySpeedTowardsPlayer + + RTS } PlayAxe: @@ -395,380 +358,378 @@ PlayKnife: SpawnerTester: { - LDA.w SprTimerA, X : BEQ + - RTS - + + LDA.w SprTimerA, X : BEQ + + RTS + + - LDA #$FF : STA.w SprTimerA, X + LDA #$FF : STA.w SprTimerA, X + LDA #$00 + JSL Sprite_SpawnDynamically + JSL Sprite_SetSpawnedCoords + LDA.w SprMiscD, X : STA.w SprSubtype, Y + INC.w SprMiscD, X + + ;LDA #$28 : STA.w SprY, X + LDA #$01 : STA.w SprAction, Y ; by default it's a chair + LDA.w SprSubtype, Y : CMP #$10 : BNE .notPictureFrame LDA #$00 - JSL Sprite_SpawnDynamically - JSL Sprite_SetSpawnedCoords - LDA.w SprMiscD, X : STA.w SprSubtype, Y - INC.w SprMiscD, X + STA.w SprMiscA, Y + STA.w SprAction, Y + BRA .done - ;LDA #$28 : STA.w SprY, X - LDA #$01 : STA.w SprAction, Y ; by default it's a chair - LDA.w SprSubtype, Y : CMP #$10 : BNE .notPictureFrame - LDA #$00 - STA.w SprMiscA, Y - STA.w SprAction, Y - BRA .done + .notPictureFrame - .notPictureFrame + CMP #$11 : BNE .notAxe + LDA #$07 : STA.w SprFrame, Y + LDA #$02 : STA.w SprAction, Y + BRA .done - CMP #$11 : BNE .notAxe - LDA #$07 : STA.w SprFrame, Y - LDA #$02 : STA.w SprAction, Y - BRA .done + .notAxe - .notAxe + CMP #$12 : BNE .notKnife + LDA #15 : STA.w SprFrame, Y + LDA #$02 : STA.w SprAction, Y + BRA .done - CMP #$12 : BNE .notKnife - LDA #15 : STA.w SprFrame, Y - LDA #$02 : STA.w SprAction, Y - BRA .done + .notKnife - .notKnife + CMP #$13 : BNE .notFork + LDA #37 : STA.w SprFrame, Y + LDA #$02 : STA.w SprAction, Y + BRA .done - CMP #$13 : BNE .notFork - LDA #37 : STA.w SprFrame, Y - LDA #$02 : STA.w SprAction, Y - BRA .done + .notFork - .notFork + CMP #$14 : BNE .notBed + LDA #5 : STA.w SprFrame, Y + LDA #$01 : STA.w SprAction, Y + BRA .done - CMP #$14 : BNE .notBed - LDA #5 : STA.w SprFrame, Y - LDA #$01 : STA.w SprAction, Y - BRA .done + .notBed - .notBed + CMP #$14 : BNE .notDoor + LDA #36 : STA.w SprFrame, Y + LDA #$01 : STA.w SprAction, Y + BRA .done - CMP #$14 : BNE .notDoor - LDA #36 : STA.w SprFrame, Y - LDA #$01 : STA.w SprAction, Y - BRA .done + .notDoor - .notDoor + LDA.w SprSubtype, Y : AND #$08 : BNE .secondset ;2nd set + LDA.w SprSubtype, Y : CLC : ADC #23 : STA.w SprFrame, Y + BRA .done - LDA.w SprSubtype, Y : AND #$08 : BNE .secondset ;2nd set - LDA.w SprSubtype, Y : CLC : ADC #23 : STA.w SprFrame, Y - BRA .done + .secondset - .secondset + LDA.w SprSubtype, Y : AND #$07 : CLC : ADC #30 : STA.w SprFrame, Y + LDA.w SprSubtype, Y - LDA.w SprSubtype, Y : AND #$07 : CLC : ADC #30 : STA.w SprFrame, Y - LDA.w SprSubtype, Y + .done - .done - - RTS + RTS } Sprite_Poltergeist_Draw: { - LDA.w SprAction, X : CMP #$03 : BNE + - RTS - + + LDA.w SprAction, X : CMP #$03 : BNE + + RTS + + - JSL Sprite_PrepOamCoord - LDA #$08 - JSL Sprite_OAM_AllocateDeferToPlayer + JSL Sprite_PrepOamCoord + LDA #$08 + JSL Sprite_OAM_AllocateDeferToPlayer - LDA $0DC0, X : CLC : ADC $0D90, X : TAY;Animation Frame - LDA .start_index, Y : STA $06 + LDA $0DC0, X : CLC : ADC $0D90, X : TAY;Animation Frame + LDA .start_index, Y : STA $06 - PHX - LDX .nbr_of_tiles, Y ;amount of tiles -1 - LDY.b #$00 + PHX + LDX .nbr_of_tiles, Y ;amount of tiles -1 + LDY.b #$00 - .nextTile + .nextTile - PHX ; Save current Tile Index? + PHX ; Save current Tile Index? - TXA : CLC : ADC $06 ; Add Animation Index Offset + TXA : CLC : ADC $06 ; Add Animation Index Offset - PHA ; Keep the value with animation index offset? + PHA ; Keep the value with animation index offset? - ASL A : TAX + ASL A : TAX - REP #$20 + REP #$20 - LDA $00 : CLC : ADC .x_offsets, X : STA ($90), Y - AND.w #$0100 : STA $0E - INY - LDA $02 : CLC : ADC .y_offsets, X : STA ($90), Y - CLC : ADC #$0010 : CMP.w #$0100 - SEP #$20 + LDA $00 : CLC : ADC .x_offsets, X : STA ($90), Y + AND.w #$0100 : STA $0E + INY + LDA $02 : CLC : ADC .y_offsets, X : STA ($90), Y + CLC : ADC #$0010 : CMP.w #$0100 + SEP #$20 - BCC .on_screen_y - LDA.b #$F0 : STA ($90), Y ;Put the sprite out of the way - STA $0E + BCC .on_screen_y + LDA.b #$F0 : STA ($90), Y ;Put the sprite out of the way + STA $0E - .on_screen_y + .on_screen_y - PLX ; Pullback Animation Index Offset (without the *2 not 16bit anymore) - INY - LDA .chr, X : STA ($90), Y - INY - LDA .properties, X : STA ($90), Y + PLX ; Pullback Animation Index Offset (without the *2 not 16bit anymore) + INY + LDA .chr, X : STA ($90), Y + INY + LDA .properties, X : STA ($90), Y - PHY + PHY - TYA : LSR #2 : TAY + TYA : LSR #2 : TAY - LDA .sizes, X : ORA $0F : STA ($92), Y ; store size in oam buffer + LDA .sizes, X : ORA $0F : STA ($92), Y ; store size in oam buffer - PLY : INY - PLX : DEX : BPL .nextTile + PLY : INY + PLX : DEX : BPL .nextTile - PLX - LDA.w SprMiscA, X : BEQ .noshadow - JSL Sprite_DrawShadow - .noshadow - RTS + PLX + LDA.w SprMiscA, X : BEQ .noshadow + JSL Sprite_DrawShadow + .noshadow + RTS + + .start_index + db $00, $02, $04, $06, $08, $09, $0F, $15, $16, $17, $18, $19, $1A, $1B, $1C, $1D, $1F, $20, $22, $23, $25, $26, $28, $29, $2A, $2B, $2C, $2D, $2E, $2F, $30, $31, $33, $35, $37, $39, $3B, $3F, $41, $42, $44, $45, $47, $48, $4A + + .nbr_of_tiles + db 1, 1, 1, 1, 0, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 3, 1, 0, 1, 0, 1, 0, 1, 0 + + .x_offsets + dw -8, 8 + dw -8, 8 + dw -8, 8 + dw -8, 8 + dw 0 + dw -8, 8, -8, 8, -8, 8 + dw -4, 12, -4, 20, 4, 12 + dw 0 + dw 0 + dw 0 + dw 0 + dw 0 + dw 0 + dw 0 + dw 0 + dw 4, 4 + dw 0 + dw 0, 8 + dw 0 + dw 4, 4 + dw 0 + dw 8, 0 + dw 0 + dw 0 + dw 0 + dw 0 + dw 0 + dw 0 + dw 0 + dw 0 + dw 0 + dw 0, 0 + dw 0, 0 + dw 4, 4 + dw -4, -4 + dw 4, 4 + dw -8, 8, -8, 8 + dw 4, 4 + dw 0 + dw 0, 8 + dw 0 + dw 4, 4 + dw 0 + dw 0, 8 + dw 0 + + .y_offsets + dw 0, 0 + dw 0, 0 + dw 0, 0 + dw 0, 0 + dw 0 + dw -12, -12, 4, 4, 12, 12 + dw -4, -4, 12, 12, 12, 12 + dw 0 + dw 0 + dw 0 + dw 0 + dw 0 + dw 0 + dw 0 + dw 0 + dw 0, 8 + dw 0 + dw 4, 4 + dw 0 + dw 8, 0 + dw 0 + dw 4, 4 + dw 0 + dw 0 + dw 0 + dw 0 + dw 0 + dw 0 + dw 0 + dw 0 + dw 0 + dw 0, -16 + dw 8, -8 + dw 0, 8 + dw -12, 4 + dw -12, 4 + dw -4, -4, 12, 12 + dw 8, 0 + dw 0 + dw 4, 4 + dw 0 + dw 0, 8 + dw 0 + dw 4, 4 + dw 0 + + .chr + db $02, $02 + db $00, $00 + db $02, $02 + db $04, $04 + db $2C + db $0C, $0C, $0E, $0E, $1E, $1E + db $0A, $0A, $2A, $2A, $2B, $2B + db $20 + db $24 + db $22 + db $26 + db $20 + db $24 + db $22 + db $26 + db $06, $16 + db $08 + db $3A, $3B + db $08 + db $06, $16 + db $08 + db $3A, $3B + db $08 + db $42 + db $40 + db $44 + db $46 + db $60 + db $62 + db $64 + db $66 + db $6A, $4A + db $6C, $4C + db $6F, $7F + db $4E, $4E + db $4E, $4E + db $48, $48, $68, $68 + db $07, $17 + db $28 + db $3F, $3E + db $28 + db $07, $17 + db $28 + db $3E, $3F + db $28 + + .properties + db $3D, $7D + db $3D, $7D + db $3D, $7D + db $3D, $7D + db $3D + db $3D, $7D, $3D, $7D, $3D, $7D + db $3D, $7D, $3D, $7D, $3D, $7D + db $39 + db $39 + db $39 + db $39 + db $F9 + db $F9 + db $F9 + db $F9 + db $39, $39 + db $39 + db $39, $39 + db $B9 + db $B9, $B9 + db $F9 + db $79, $79 + db $79 + db $3D + db $3D + db $39 + db $3D + db $3D + db $3D + db $39 + db $3D + db $3D, $3D + db $3D, $3D + db $3D, $3D + db $3D, $BD + db $7D, $FD + db $3D, $7D, $3D, $7D + db $B9, $B9 + db $F9 + db $79, $79 + db $79 + db $39, $39 + db $39 + db $39, $39 + db $B9 + + .sizes + db $02, $02 + db $02, $02 + db $02, $02 + db $02, $02 + db $02 + db $02, $02, $02, $02, $02, $02 + db $02, $02, $00, $00, $00, $00 + db $02 + db $02 + db $02 + db $02 + db $02 + db $02 + db $02 + db $02 + db $00, $00 + db $02 + db $00, $00 + db $02 + db $00, $00 + db $02 + db $00, $00 + db $02 + db $02 + db $02 + db $02 + db $02 + db $02 + db $02 + db $02 + db $02 + db $02, $02 + db $02, $02 + db $00, $00 + db $02, $02 + db $02, $02 + db $02, $02, $02, $02 + db $00, $00 + db $02 + db $00, $00 + db $02 + db $00, $00 + db $02 + db $00, $00 + db $02 } - -; ========================================================= - - .start_index - db $00, $02, $04, $06, $08, $09, $0F, $15, $16, $17, $18, $19, $1A, $1B, $1C, $1D, $1F, $20, $22, $23, $25, $26, $28, $29, $2A, $2B, $2C, $2D, $2E, $2F, $30, $31, $33, $35, $37, $39, $3B, $3F, $41, $42, $44, $45, $47, $48, $4A - - .nbr_of_tiles - db 1, 1, 1, 1, 0, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 3, 1, 0, 1, 0, 1, 0, 1, 0 - - .x_offsets - dw -8, 8 - dw -8, 8 - dw -8, 8 - dw -8, 8 - dw 0 - dw -8, 8, -8, 8, -8, 8 - dw -4, 12, -4, 20, 4, 12 - dw 0 - dw 0 - dw 0 - dw 0 - dw 0 - dw 0 - dw 0 - dw 0 - dw 4, 4 - dw 0 - dw 0, 8 - dw 0 - dw 4, 4 - dw 0 - dw 8, 0 - dw 0 - dw 0 - dw 0 - dw 0 - dw 0 - dw 0 - dw 0 - dw 0 - dw 0 - dw 0, 0 - dw 0, 0 - dw 4, 4 - dw -4, -4 - dw 4, 4 - dw -8, 8, -8, 8 - dw 4, 4 - dw 0 - dw 0, 8 - dw 0 - dw 4, 4 - dw 0 - dw 0, 8 - dw 0 - - .y_offsets - dw 0, 0 - dw 0, 0 - dw 0, 0 - dw 0, 0 - dw 0 - dw -12, -12, 4, 4, 12, 12 - dw -4, -4, 12, 12, 12, 12 - dw 0 - dw 0 - dw 0 - dw 0 - dw 0 - dw 0 - dw 0 - dw 0 - dw 0, 8 - dw 0 - dw 4, 4 - dw 0 - dw 8, 0 - dw 0 - dw 4, 4 - dw 0 - dw 0 - dw 0 - dw 0 - dw 0 - dw 0 - dw 0 - dw 0 - dw 0 - dw 0, -16 - dw 8, -8 - dw 0, 8 - dw -12, 4 - dw -12, 4 - dw -4, -4, 12, 12 - dw 8, 0 - dw 0 - dw 4, 4 - dw 0 - dw 0, 8 - dw 0 - dw 4, 4 - dw 0 - - .chr - db $02, $02 - db $00, $00 - db $02, $02 - db $04, $04 - db $2C - db $0C, $0C, $0E, $0E, $1E, $1E - db $0A, $0A, $2A, $2A, $2B, $2B - db $20 - db $24 - db $22 - db $26 - db $20 - db $24 - db $22 - db $26 - db $06, $16 - db $08 - db $3A, $3B - db $08 - db $06, $16 - db $08 - db $3A, $3B - db $08 - db $42 - db $40 - db $44 - db $46 - db $60 - db $62 - db $64 - db $66 - db $6A, $4A - db $6C, $4C - db $6F, $7F - db $4E, $4E - db $4E, $4E - db $48, $48, $68, $68 - db $07, $17 - db $28 - db $3F, $3E - db $28 - db $07, $17 - db $28 - db $3E, $3F - db $28 - - .properties - db $3D, $7D - db $3D, $7D - db $3D, $7D - db $3D, $7D - db $3D - db $3D, $7D, $3D, $7D, $3D, $7D - db $3D, $7D, $3D, $7D, $3D, $7D - db $39 - db $39 - db $39 - db $39 - db $F9 - db $F9 - db $F9 - db $F9 - db $39, $39 - db $39 - db $39, $39 - db $B9 - db $B9, $B9 - db $F9 - db $79, $79 - db $79 - db $3D - db $3D - db $39 - db $3D - db $3D - db $3D - db $39 - db $3D - db $3D, $3D - db $3D, $3D - db $3D, $3D - db $3D, $BD - db $7D, $FD - db $3D, $7D, $3D, $7D - db $B9, $B9 - db $F9 - db $79, $79 - db $79 - db $39, $39 - db $39 - db $39, $39 - db $B9 - - .sizes - db $02, $02 - db $02, $02 - db $02, $02 - db $02, $02 - db $02 - db $02, $02, $02, $02, $02, $02 - db $02, $02, $00, $00, $00, $00 - db $02 - db $02 - db $02 - db $02 - db $02 - db $02 - db $02 - db $02 - db $00, $00 - db $02 - db $00, $00 - db $02 - db $00, $00 - db $02 - db $00, $00 - db $02 - db $02 - db $02 - db $02 - db $02 - db $02 - db $02 - db $02 - db $02 - db $02, $02 - db $02, $02 - db $00, $00 - db $02, $02 - db $02, $02 - db $02, $02, $02, $02 - db $00, $00 - db $02 - db $00, $00 - db $02 - db $00, $00 - db $02 - db $00, $00 - db $02 diff --git a/Sprites/NPCs/ranch_girl.asm b/Sprites/NPCs/ranch_girl.asm index acefcdd..f0dc213 100644 --- a/Sprites/NPCs/ranch_girl.asm +++ b/Sprites/NPCs/ranch_girl.asm @@ -43,13 +43,7 @@ RanchGirl_TeachSong: .not_started .running_dialog .has_song - LDA.b $1A - LSR A - LSR A - LSR A - LSR A - AND.b #$01 - STA.w $0DC0,X + LDA.b $1A : LSR #4 : AND.b #$01 : STA.w $0DC0,X RTL } diff --git a/Sprites/NPCs/vasu.asm b/Sprites/NPCs/vasu.asm index 110786d..1e8c85b 100644 --- a/Sprites/NPCs/vasu.asm +++ b/Sprites/NPCs/vasu.asm @@ -34,7 +34,6 @@ Sprite_Vasu_Long: { PHB : PHK : PLB - LDA.w SprSubtype, X : BNE + JSR Sprite_Vasu_Draw JMP ++ @@ -43,7 +42,7 @@ Sprite_Vasu_Long: ++ JSL Sprite_DrawShadow JSL Sprite_CheckActive : BCC .SpriteIsNotActive - JSR Sprite_Vasu_Main + JSR Sprite_Vasu_Main .SpriteIsNotActive PLB RTL diff --git a/Sprites/Objects/ice_block.asm b/Sprites/Objects/ice_block.asm index 5e167de..fffd85d 100644 --- a/Sprites/Objects/ice_block.asm +++ b/Sprites/Objects/ice_block.asm @@ -35,13 +35,13 @@ Sprite_IceBlock_Long: PHB : PHK : PLB LDA.w SprMiscC, X : BEQ .not_being_pushed STZ.w SprMiscC, X - STZ.b $5E ; Clear Links speed + STZ.b LinkSpeedTbl STZ.b $48 ; Clear push actions bitfield .not_being_pushed LDA.w SprTimerA, X : BEQ .retain_momentum LDA.b #$01 : STA.w SprMiscC, X LDA.b #$84 : STA.b $48 ; Set statue and push block actions - LDA.b #$04 : STA.b $5E ; Slipping into pit speed + LDA.b #$04 : STA.b LinkSpeedTbl ; Slipping into pit speed .retain_momentum JSR Sprite_IceBlock_Draw @@ -60,7 +60,6 @@ Sprite_IceBlock_Prep: LDA.w SprY, X : STA.w SprMiscE, X LDA.w SprXH, X : STA.w SprMiscF, X LDA.w SprYH, X : STA.w SprMiscG, X - STZ.w SprDefl, X PLB RTL @@ -110,6 +109,7 @@ Sprite_IceBlock_Main: LDA.b $26 : STA.w SprMiscA, X JSR ApplyPush .push_cached + LDA.b #$07 : STA.w SprTimerA, X STZ.b $5E JSL Sprite_RepelDash @@ -227,71 +227,36 @@ Statue_BlockSprites: LDY.b #$0F .next - LDA.w $0E20,Y - CMP.b #$1C ; SPRITE 1C - BEQ .skip + ; SPRITE 1C + LDA.w $0E20, Y : CMP.b #$1C : BEQ .skip + CPY.w $0FA0 : BEQ .skip + TYA : EOR.b $1A : AND.b #$01 : BNE .skip + LDA.w SprState,Y : CMP.b #$09 : BCC .skip - CPY.w $0FA0 - BEQ .skip - - TYA - EOR.b $1A - AND.b #$01 - BNE .skip - - LDA.w SprState,Y - CMP.b #$09 - BCC .skip - - LDA.w SprX,Y - STA.b $04 - - LDA.w SprXH,Y - STA.b $05 - - LDA.w SprY,Y - STA.b $06 - - LDA.w SprYH,Y - STA.b $07 + LDA.w SprX, Y : STA.b $04 + LDA.w SprXH, Y : STA.b $05 + LDA.w SprY, Y : STA.b $06 + LDA.w SprYH, Y : STA.b $07 REP #$20 - LDA.w SprCachedX - SEC - SBC.b $04 - CLC - ADC.w #$000C + LDA.w SprCachedX : SEC : SBC.b $04 : CLC : ADC.w #$000C + CMP.w #$0018 : BCS .skip - CMP.w #$0018 - BCS .skip - - LDA.w SprCachedY - SEC - SBC.b $06 - CLC - ADC.w #$000C - - CMP.w #$0024 - BCS .skip + LDA.w SprCachedY : SEC : SBC.b $06 : CLC : ADC.w #$000C + CMP.w #$0024 : BCS .skip SEP #$20 - LDA.b #$04 - STA.w $0EA0,Y + LDA.b #$04 : STA.w $0EA0, Y PHY - LDA.b #$20 JSL Sprite_CheckSlopedTileCollision ; JSR Sprite_ProjectSpeedTowardsLocation - PLY - LDA.b $00 - STA.w SprYRecoil,Y - - LDA.b $01 - STA.w SprXRecoil,Y + LDA.b $00 : STA.w SprYRecoil, Y + LDA.b $01 : STA.w SprXRecoil, Y .skip SEP #$20 From 64adca20121bc1b02b7a959bfdf87ab3c3552c2a Mon Sep 17 00:00:00 2001 From: scawful Date: Sat, 18 Jan 2025 11:00:34 -0500 Subject: [PATCH 19/67] Cleanup portal rod code --- Items/portal_rod.asm | 37 ++++++++++++++++++------------------- 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/Items/portal_rod.asm b/Items/portal_rod.asm index 0a7534e..de94ef2 100644 --- a/Items/portal_rod.asm +++ b/Items/portal_rod.asm @@ -9,27 +9,26 @@ RodAnimationTimer: LinkItem_PortalRod: { BIT $3A : BVS .y_button_held - LDA $6C : BNE .return + LDA $6C : BNE .return + JSR Link_CheckNewY_ButtonPress : BCC .return + LDX.b #$00 + JSR LinkItem_EvaluateMagicCost : BCC .insufficient_mp + LDA.b #$30 : JSR $802F ; Sfx3 + JSL LinkItem_FirePortal + .y_button_held - JSR Link_CheckNewY_ButtonPress : BCC .return - LDX.b #$00 - JSR LinkItem_EvaluateMagicCost : BCC .insufficient_mp - LDA.b #$30 : JSR $802F ; Sfx3 - JSL LinkItem_FirePortal - .y_button_held + JSR $AE65 ; HaltLinkWhenUsingItems + DEC $3D : BPL .return + LDA $0300 : INC A : STA $0300 : TAX + LDA RodAnimationTimer, X : STA $3D + CPX.b #$03 : BNE .return + STZ $0300 + STZ $5E + STZ $3D + LDA $0301 : AND.b #$FE : STA $0301 - JSR $AE65 ; HaltLinkWhenUsingItems - DEC $3D : BPL .return - LDA $0300 : INC A : STA $0300 : TAX - LDA RodAnimationTimer, X : STA $3D - CPX.b #$03 : BNE .return - STZ $0300 - STZ $5E - STZ $3D - LDA $0301 : AND.b #$FE : STA $0301 - - .insufficient_mp - LDA $3A : AND.b #$BF : STA $3A + .insufficient_mp + LDA $3A : AND.b #$BF : STA $3A .return RTS From e98b0a02adfb850a0893ee9320a37713cec336b5 Mon Sep 17 00:00:00 2001 From: scawful Date: Sat, 18 Jan 2025 11:00:51 -0500 Subject: [PATCH 20/67] Add Link_ConsumeMagicBagItem, implement Link_Banana --- Items/all_items.asm | 61 ++++++++++++++++++++++++++++++++++++++------- 1 file changed, 52 insertions(+), 9 deletions(-) diff --git a/Items/all_items.asm b/Items/all_items.asm index 7c2030e..e17aa43 100644 --- a/Items/all_items.asm +++ b/Items/all_items.asm @@ -18,22 +18,65 @@ MagicBeanGfx: MagicBeanSwapDynamicGfx: { - PHX - PHP - + PHX : PHP REP #$30 - LDX #$01BE -- LDA.l MagicBeanGfx, X : STA.l $7EA480, X - DEX : DEX - BPL -- - - PLP - PLX + DEX : DEX : BPL -- + PLP : PLX RTL } +Link_ConsumeMagicBagItem: +{ + LDA.w $020B + JSL JumpTableLocal + + dw Link_Banana + dw Link_Pineapple + dw Link_RockMeat + dw Link_Seashells + dw Link_Honeycombs + dw Link_DekuSticks + + Link_Banana: + { + LDA.l CURHP : CMP.w MAXHP : BCS + + LDA.l CURHP : CLC : ADC.b #$10 : STA.l CURHP + LDA.b #$0D : STA.w $012F ; HUD Heart SFX + + + RTS + } + + Link_Pineapple: + { + RTS + } + + Link_RockMeat: + { + RTS + } + + Link_Seashells: + { + RTS + } + + Link_Honeycombs: + { + RTS + } + + Link_DekuSticks: + { + RTS + } + +} + + pushpc ; League of its own incsrc "Items/ice_rod.asm" From c8f6d0e98974fbc8cdd88c1485bd935e29a0907a Mon Sep 17 00:00:00 2001 From: scawful Date: Sat, 18 Jan 2025 12:47:52 -0500 Subject: [PATCH 21/67] Add all_music.asm, cleanup Oracle_main.asm --- Music/all_music.asm | 17 +++++++++++++++++ Oracle_main.asm | 37 +------------------------------------ 2 files changed, 18 insertions(+), 36 deletions(-) create mode 100644 Music/all_music.asm diff --git a/Music/all_music.asm b/Music/all_music.asm new file mode 100644 index 0000000..c1fea27 --- /dev/null +++ b/Music/all_music.asm @@ -0,0 +1,17 @@ +incsrc "Core/music_macros.asm" + +incsrc "Music/lost_woods_v2.asm" +print "End of Music/lost_woods_v2.asm ", pc + +incsrc "Music/color_dungeon_theme.asm" +print "End of color_dungeon_theme.asm ", pc + +incsrc "Music/deku_theme.asm" +print "End of Music/deku_theme.asm ", pc + +incsrc "Music/song_of_healing.asm" +print "End of Music/song_of_healing.asm ", pc + +; incsrc "Music/ww_ganondorf.asm" +; incsrc "Music/great_sea.asm" + diff --git a/Oracle_main.asm b/Oracle_main.asm index 387162d..c04da4c 100644 --- a/Oracle_main.asm +++ b/Oracle_main.asm @@ -27,9 +27,6 @@ ; 41 - DW World Map ; ========================================================= -; ZSCustomOverworld version -; Kept in case of serious issues which impedes progress -ZS_CUSTOM_OW_V2 = 1 incsrc "Overworld/ZSCustomOverworld_Latest.asm" print "End of ZSCustomOverworld.asm ", pc @@ -38,76 +35,44 @@ incsrc "Core/ram.asm" namespace Oracle { - print "" - print "Applying patches to Oracle of Secrets" - print "" - - incsrc "Core/music_macros.asm" incsrc "Core/symbols.asm" incsrc "Core/message.asm" print " -- Music -- " print "" - - incsrc "Music/lost_woods_v2.asm" - print "End of Music/lost_woods_v2.asm ", pc - - incsrc "Music/color_dungeon_theme.asm" - print "End of color_dungeon_theme.asm ", pc - - incsrc "Music/deku_theme.asm" - print "End of Music/deku_theme.asm ", pc - - incsrc "Music/song_of_healing.asm" - print "End of Music/song_of_healing.asm ", pc - + incsrc "Music/all_music.asm" print "" print " -- Overworld -- " print "" - incsrc "Overworld/overworld.asm" - print "" print " -- Dungeon -- " print "" - incsrc "Dungeons/dungeons.asm" - print "" print " -- Sprites -- " print "" - incsrc "Sprites/all_sprites.asm" - print "" print " -- Masks -- " print "" - incsrc "Masks/all_masks.asm" - print "" print " -- Items -- " print "" - incsrc "Items/all_items.asm" - print "" print " -- Menu -- " print "" - incsrc "Menu/menu.asm" - incsrc "Util/item_cheat.asm" - ; incsrc "Music/ww_ganondorf.asm" - ; incsrc "Music/great_sea.asm" - print "" print "Finished applying patches" } From 202b042b6bb8f6e0e1006b86441e46329baee9d5 Mon Sep 17 00:00:00 2001 From: scawful Date: Sun, 19 Jan 2025 11:33:56 -0500 Subject: [PATCH 22/67] Add PlayerTransform, CheckNewRButtonPress fns --- Items/goldstar.asm | 2 +- Masks/gbc_form.asm | 4 +-- Masks/mask_routines.asm | 77 +++++++++++++++-------------------------- Masks/minish_form.asm | 4 +-- Menu/menu.asm | 6 ++-- 5 files changed, 36 insertions(+), 57 deletions(-) diff --git a/Items/goldstar.asm b/Items/goldstar.asm index aa7ed11..126d3c0 100644 --- a/Items/goldstar.asm +++ b/Items/goldstar.asm @@ -1000,7 +1000,7 @@ ApplyGoldstarDamageClass: CheckForSwitchToGoldstar: { - %CheckNewR_ButtonPress() : BEQ .continue + JSL CheckNewRButtonPress : BEQ .continue LDA.l $7EF342 : CMP.b #$02 : BNE .continue LDA.w GoldstarOrHookshot : CMP.b #$01 : BEQ .set_hookshot LDA.b #$01 : STA.w GoldstarOrHookshot diff --git a/Masks/gbc_form.asm b/Masks/gbc_form.asm index be7d85f..21f3987 100644 --- a/Masks/gbc_form.asm +++ b/Masks/gbc_form.asm @@ -108,14 +108,14 @@ LinkState_GameboyForm: LDA $02B2 : CMP.b #$06 : BEQ .already_gbc LDA $0FFF : BEQ .return ; not in dark world .transform - %PlayerTransform() + JSL PlayerTransform LDA #$3B : STA $BC ; change link's sprite LDA #$06 : STA $02B2 JSL UpdateGbcPalette BRA .return .already_gbc - %PlayerTransform() + JSL PlayerTransform LDA #$10 : STA $BC STZ $02B2 JSL Palette_ArmorAndGloves diff --git a/Masks/mask_routines.asm b/Masks/mask_routines.asm index 3d1db2c..b5187f8 100644 --- a/Masks/mask_routines.asm +++ b/Masks/mask_routines.asm @@ -1,19 +1,3 @@ -; ========================================================= -; Macros - -macro PlayerTransform() - LDY.b #$04 : LDA.b #$23 - JSL AddTransformationCloud - LDA.b #$14 : STA.w $0CF8 - JSL $0DBB67 ; Link_CalculateSFXPan - ORA.w $0CF8 - STA $012E -endmacro - -macro CheckNewR_ButtonPress() - LDA.b $F6 : BIT.b #$10 -endmacro - ; ========================================================= ; Change Link's sprite by setting $BC to the gfx bank @@ -51,8 +35,7 @@ org $09F7B5 : JSL ForceResetMask_SaveAndQuit org $3A8000 StartupMasks: { - ; from vanilla: - ; bring the screen into force blank after NMI + ; vanilla: bring the screen into force blank after NMI LDA.b #$80 : STA $13 ; set links sprite bank @@ -60,6 +43,17 @@ StartupMasks: RTL } +PlayerTransform: +{ + LDY.b #$04 : LDA.b #$23 + JSL AddTransformationCloud + LDA.b #$14 : STA.w $0CF8 + JSL $0DBB67 ; Link_CalculateSFXPan + ORA.w $0CF8 + STA $012E + RTL +} + ResetToLinkGraphics: { LDA $0FFF : BNE + @@ -197,13 +191,11 @@ Palette_ArmorAndGloves: ; ========================================================= ; Overworld Palette Persist -Overworld_CgramAuxToMain_Override: +Overworld_CgramAuxToMain: { ; Copies the auxiliary CGRAM buffer to the main one ; Causes NMI to reupload the palette. - REP #$20 - LDX.b #$00 .loop @@ -217,16 +209,21 @@ Overworld_CgramAuxToMain_Override: LDA !CurrentMask : BNE .has_mask_palette LDA $7EC4C0, X : STA $7EC6C0, X .has_mask_palette - INX #2 : CPX.b #$40 : BNE .loop + INX #2 : CPX.b #$40 : BNE .loop SEP #$20 ; tell NMI to upload new CGRAM data INC $15 - RTL } +pushpc +org $02C769 ; Overworld_CgramAuxToMain + JSL Overworld_CgramAuxToMain + RTS +pullpc + ; ========================================================= LinkState_ResetMaskAnimated: @@ -245,7 +242,7 @@ LinkState_ResetMaskAnimated: LDA.w $0202 : SEC : SBC.b #$13 : BEQ .no_transform .transform - %PlayerTransform() + JSL PlayerTransform JSL ResetToLinkGraphics .gbc_form @@ -254,24 +251,14 @@ LinkState_ResetMaskAnimated: RTL } -pushpc - -; ========================================================= - -org $02C769 -Overworld_CgramAuxToMain: - JSL Overworld_CgramAuxToMain_Override - RTS - ; ========================================================= ; Change which mask forms have access to the sword. -; ========================================================= +pushpc ; Link_CheckForSwordSwing -org $079CD9 - JSL LinkItem_CheckForSwordSwing_Masks - +org $079CD9 : JSL LinkItem_CheckForSwordSwing_Masks pullpc + LinkItem_CheckForSwordSwing_Masks: { LDA !CurrentMask : BEQ .return @@ -293,11 +280,11 @@ Link_TransformMask: { PHB : PHK : PLB PHA ; save mask ID - %CheckNewR_ButtonPress() : BEQ .return + JSL CheckNewRButtonPress : BEQ .return LDA $6C : BNE .return ; in a doorway LDA $0FFC : BNE .return ; can't open menu - %PlayerTransform() + JSL PlayerTransform PLA ; restore mask ID TAY CPY !CurrentMask : BEQ .unequip ; check if mask is on @@ -321,8 +308,6 @@ Link_TransformMask: db $00, $35, $36, $38, $37, $39, $3A, $3B } -; ========================================================= - Link_TransformMoosh: { PHB : PHK : PLB @@ -331,13 +316,13 @@ Link_TransformMoosh: JMP .done ++ LDA.w !CurrentMask : CMP.b #$07 : BNE + - %PlayerTransform() + JSL PlayerTransform JSL ResetToLinkGraphics PLB : RTL + LDA.b #$07 : STA.w !CurrentMask LDA.b #$33 : STA $BC - %PlayerTransform() + JSL PlayerTransform JSL Palette_ArmorAndGloves .done PLB @@ -391,8 +376,6 @@ PrepareQuakeSpell: RTL } -; ========================================================= - HandleMovement: { LDA $F0 : AND #$08 : BEQ .not_up @@ -752,8 +735,6 @@ Ancilla_Move_X: BRL Ancilla_RestoreIndex } -; --------------------------------------------------------- - Ancilla_Move_Y: { LDA.w $0C22, X @@ -790,8 +771,6 @@ Ancilla_Move_Y: RTS } -; ========================================================= - Ancilla_Move_Z: { LDA.w AnciZSpeed, X diff --git a/Masks/minish_form.asm b/Masks/minish_form.asm index 4ca4958..ceb1976 100644 --- a/Masks/minish_form.asm +++ b/Masks/minish_form.asm @@ -44,14 +44,14 @@ LinkState_CheckForMinishForm: CMP.b #$00 : BEQ .transform CMP.b #$06 : BCC .return ; don't transform if not human .transform - %PlayerTransform() + JSL PlayerTransform LDA #$39 : STA $BC ; Change link's sprite LDA #$05 : STA $02B2 ; Set the current mask form BRA .return .already_minish - %PlayerTransform() + JSL PlayerTransform JSL ResetToLinkGraphics .return diff --git a/Menu/menu.asm b/Menu/menu.asm index 130604f..553d04e 100644 --- a/Menu/menu.asm +++ b/Menu/menu.asm @@ -471,7 +471,7 @@ Menu_MagicBag: JSR Menu_DeleteCursor_AltEntry INC.w $020B LDA.w $020B : CMP.b #$06 : BCS .zero - BRA .continue + BRA .continue .move_down .move_left @@ -479,8 +479,8 @@ Menu_MagicBag: LDX.w Menu_MagicBagCursorPositions-2, Y JSR Menu_DeleteCursor_AltEntry LDA.w $020B : CMP.b #$00 : BEQ .continue - DEC.w $020B - BRA .continue + DEC.w $020B + BRA .continue .zero STZ.w $020B .continue From 93a0c7fd8e36522c571790a465295fcd8896a8f8 Mon Sep 17 00:00:00 2001 From: scawful Date: Sun, 19 Jan 2025 11:35:04 -0500 Subject: [PATCH 23/67] Add Sprite_SpawnIceKeese --- Sprites/Bosses/vampire_bat.asm | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/Sprites/Bosses/vampire_bat.asm b/Sprites/Bosses/vampire_bat.asm index 0ad9a59..5c7051f 100644 --- a/Sprites/Bosses/vampire_bat.asm +++ b/Sprites/Bosses/vampire_bat.asm @@ -38,7 +38,7 @@ Sprite_VampireBat_Main: INC.w SprAction, X LDA.b #$50 : STA.w SprTimerC, X JSL GetRandomInt : AND.b #$3F : BNE + - JSR Sprite_SpawnFireKeese + JSL Sprite_SpawnFireKeese + RTS } @@ -87,7 +87,16 @@ Sprite_SpawnFireKeese: LDA.b #$01 : STA.w SprSubtype, Y ; Fire Keese JSL Sprite_SetSpawnedCoords .spawn_failed - RTS + RTL +} + +Sprite_SpawnIceKeese: +{ + LDA.b #$11 + JSL Sprite_SpawnDynamically : BMI + + JSL Sprite_SetSpawnedCoords + + + RTL } Sprite_VampireBat_Draw: From 5302b03d3198b1e3702cd8e33c211775c7f005b7 Mon Sep 17 00:00:00 2001 From: scawful Date: Sun, 19 Jan 2025 11:54:38 -0500 Subject: [PATCH 24/67] Add sram.asm, separate from symbols.asm --- Core/sram.asm | 514 +++++++++++++++++++++++++++++++++++++++++++++++ Core/symbols.asm | 186 +---------------- 2 files changed, 525 insertions(+), 175 deletions(-) create mode 100644 Core/sram.asm diff --git a/Core/sram.asm b/Core/sram.asm new file mode 100644 index 0000000..d32755f --- /dev/null +++ b/Core/sram.asm @@ -0,0 +1,514 @@ + +; Game state +; 0x00 - Very start; progress cannot be saved in this state +; 0x01 - Uncle reached +; 0x02 - Zelda rescued +; 0x03 - Agahnim defeated +GameState = $7EF3C5 + +; Red X on Hall of Secrets +; Red X on Kalyxo Pyramid + +; .fmp h.i. +; f - fortress of secrets +; m - master sword +; p - pendant quest +; h - hall of secrets +; i - intro over, maku tree +OOSPROG = $7EF3D6 + +; Bitfield of less important progression +; .fbh .zsu +; u - Uncle +; s - Priest visited in sanc after Zelda is kidnapped again +; z - Zelda brought to sanc +; h - Uncle left Link's house (0: spawn | 1: gone) +; b - Book of Mudora obtained/mentioned; controls Aginah dialog +; f - Flipped by fortune tellers to decide fortune set to give +OOSPROG2 = $7EF3C6 + +; .... ...m +; m - maku tree has met link (0: no | 1: yes) +MakuTreeQuest = $7EF3D4 + +; Map icon +; 0x00 - Red X on Maku Tree/Maku Warp +; 0x01 - Toadstool Woods Crystal +; 0x02 - Kalyxo All Crystals +; 0x03 - +; 0x04 - +; 0x05 - +; 0x06 - +; 0x07 - +; 0x08 - Skull on GT | Climb Ganon's Tower +MapIcon = $7EF3C7 + +; 01 - Fishing Rod +; 02 - Portal Rod +CustomRods = $7EF351 + +; Free SRAM Block 38A-3C4 +FishingRod = $7EF38A + +; Collectibles +Bananas = $7EF38B +Pineapples = $7EF38D +RockMeat = $7EF38F +Seashells = $7EF391 +Honeycomb = $7EF393 +DekuSticks = $7EF395 + +TingleMaps = $7EF396 +TingleId = $7EF397 + +; .dgi zktm +; m - Mushroom Grotto +; t - Tail Palace +; k - Kalyxo Castle +; z - Zora Temple +; i - Glacia Estate +; g - Goron Mines +; d - Dragon Ship +Scrolls = $7EF398 + +; Keep track of the previous scroll +; For re-reading old hints. +PrevScroll = $7EF39A + +; .dts fwpb +; b - bean planted +; w - plant watered +; p - pollinated by bee +; f - first day +; s - second day +; t - third day +; d - done +MagicBeanProg = $7EF39B + +; .... .cpw +; c - courage +; p - power +; w - wisdom +Dreams = $7EF410 + +; ========================================================= +; Items +; ========================================================= +; 0x00 - Nothing +; 0x01 - Bow +; 0x02 - Bow and arrows +; 0x03 - Silver bow +; 0x04 - Silver bow and arrows +; Picking the arrow and nonarrow versions is done by the HUD draw routines +BOW = $7EF340 + +; 0x00 - Nothing +; 0x01 - Blue boomerang +; 0x02 - Red boomerang +BOOMER = $7EF341 + +; 0x00 - Nothing +; 0x01 - Hookshot +; 0x02 - Goldstar (L/R) +HOOKSHOT = $7EF342 + +; Number of bombs +BOMBS = $7EF343 + +; 0x00 - Nothing +; 0x01 - Mushroom +; 0x02 - Powder +SHROOM = $7EF344 + +; 0x00 - Nothing +; 0x01 - Fire rod +FIREROD = $7EF345 + +; 0x00 - Nothing +; 0x01 - Ice rod +ICEROD = $7EF346 + +; 0x00 - Nothing +; 0x01 - Zora Mask +ZoraMask = $7EF347 + +; 0x00 - Nothing +; 0x01 - Bunny Hood +BunnyHood = $7EF348 + +; 0x00 - Nothing +; 0x01 - Deku Mask +DekuMask = $7EF349 + +; 0x00 - Nothing +; 0x01 - Lamp +LAMP = $7EF34A + +; 0x00 - Nothing +; 0x01 - Magic hammer +HAMMER = $7EF34B + +; 0x00 - Nothing +; 0x01 - Shovel +; 0x02 - Inactive flute +; 0x03 - Active flute +FLUTE = $7EF34C + +; 0x00 - Nothing +; 0x01 - Roc's Feather +RocsFeather = $7EF34D + +; 0x00 - Nothing +; 0x01 - Book of Mudora +BOOK = $7EF34E + +; 0x00 - Nothing +; Other values indicate the index of the currently selected bottle +BottleIndex = $7EF34F + +; 0x00 - Nothing +; 0x01 - Cane of Somaria +SOMARIA = $7EF350 + +; 0x00 - Nothing +; 0x01 - Cane of Byrna +BYRNA = $7EF351 + +; 0x00 - Nothing +; 0x01 - Magic cape +CAPE = $7EF352 + +; 0x00 - Nothing +; 0x01 - Letter (works like mirror) +; 0x02 - Mirror +; 0x03 - Deleted triforce item +MIRROR = $7EF353 + +; 0x00 - Lift 1 (nothing) +; 0x01 - Lift 2 (power glove) +; 0x02 - Lift 3 (titan's mitt) +GLOVES = $7EF354 + +; 0x00 - Nothing +; 0x01 - Pegasus boots +; bit 2 of $7E:F379 also needs to be set to actually dash +BOOTS = $7EF355 + +; 0x00 - Nothing +; 0x01 - Zora's flippers +FLIPPERS = $7EF356 + +; 0x00 - Nothing +; 0x01 - Moon pearl +PEARL = $7EF357 + +; 0x00 - Nothing +; 0x01 - Wolf Mask +WolfMask = $7EF358 + +; 0x00 - Nothing +; 0x01 - Fighter sword +; 0x02 - Master sword +; 0x03 - Tempered sword +; 0x04 - Golden sword +; 0xFF - Set when sword is handed in to smithy +SWORD = $7EF359 + +; 0x00 - Nothing +; 0x01 - Fighter shield +; 0x02 - Fire shield +; 0x03 - Mirror shield +SHIELD = $7EF35A + +; 0x00 - Green mail +; 0x01 - Blue mail +; 0x02 - Red mail +ARMOR = $7EF35B + +; 0x00 - Nothing +; 0x01 - Mushroom (unused) +; 0x02 - Empty bottle +; 0x03 - Red potion +; 0x04 - Green potion +; 0x05 - Blue potion +; 0x06 - Fairy +; 0x07 - Bee +; 0x08 - Good bee +; 0x09 - Magic Bean +; 0x0A - Milk Bottle +Bottle1 = $7EF35C +Bottle2 = $7EF35D +Bottle3 = $7EF35E +Bottle4 = $7EF35F + +; Number of rupees you have +; RUPEEDISP will be incremented or decremented until it reaches this value +RUPEES = $7EF360 + +; Rupee count displayed on the HUD +RUPEEDISP = $7EF362 + +; Bitfields for ownership of various dungeon items +; SET 2 SET 1 +; xced aspm wihb tg.. +; c - Hyrule Castle +; x - Sewers +; a - Agahnim's Tower +; +; e - Eastern Palace +; d - Desert Palace +; h - Tower of Hera +; +; p - Palace of Darkness +; s - Swamp Palace +; w - Skull Woods +; b - Thieves' Town +; i - Ice Palace +; m - Misery Mire +; t - Turtle Rock +; g - Ganon's Tower +COMPASS1 = $7EF364 +COMPASS2 = $7EF365 + +BIGKEY1 = $7EF366 +BIGKEY2 = $7EF367 + +DNGMAP1 = $7EF368 +DNGMAP2 = $7EF369 + +; Number of rupees donated to fairies +WISHRUP = $7EF36A + +; Number of heart pieces towards next container +; Intended to be a value from 0-3 +HEARTPC = $7EF36B + +; Maximum health; 1 heart container = 0x08 HP +MAXHP = $7EF36C + +; Current health +; You die at 0x00 +; You also die at ≥0xA8 +CURHP = $7EF36D + +; Magic power, capped at 128 +MAGPOW = $7EF36E + +; Current number of keys for whatever dungeon is loaded +KEYS = $7EF36F + +; Number of capacity upgrades received +BOMBCAP = $7EF370 +ARROWCAP = $7EF371 + +; Refills health +; Expects multiples of 8 +HEALME = $7EF372 + +; Refills magic +ZAPME = $7EF373 + +; ... ..gbr +; r - Wisdom (red) +; b - Power (blue) +; g - Courage (green) +PENDANTS = $7EF374 + +; Refills bombs +BOMBME = $7EF375 + +; Refills arrows +SHOOTME = $7EF376 + +; Arrow count +ARROWS = $7EF377 + +; Unused +UNUSED_7EF378 = $7EF378 + +; Displays ability flags +; lrtu pbsh +; h - Pray (unused and mostly cut off by HUD borders) +; s - Swim +; b - Run +; u - unused but set by default +; p - Pull +; t - Talk +; r - Read +; l - Lift +; This only controls the display of "LIFT.1" +; If this bit is unset but LIFT is set then the proper lift text is displayed +ABILITY = $7EF379 + +; Dungeon ID Legend +; Mushroom Grotto ID 0x0C (Palace of Darkness) +; Tail Palace ID 0x0A (Swamp Palace) +; Kalyxo Castle ID 0x10 (Skull Woods) +; Zora Temple ID 0x16 (Thieves Town) +; Glacia Estate 0x12 (Ice Palace) +; Goron Mines 0x0E (Misery Mire) +; Dragon Ship 0x18 (Turtle Rock) + +; .wbs tipm +; p - Palace of Darkness +; s - Swamp Palace +; w - Skull Woods +; b - Thieves' Town +; i - Ice Palace +; m - Misery Mire +; t - Turtle Rock +Crystals = $7EF37A + +; 0x00 - Normal magic +; 0x01 - Half magic +; 0x02 - Quarter magic +; Quarter magic has no special HUD graphic, unlike half magic +; Also, not everything is necessarily quarter magic +MAGCON = $7EF37B + +; Keys earned per dungeon +; Sewers and Castle are kept in sync +KEYSSEWER = $7EF37C +KEYSHYRULE = $7EF37D +KEYSEAST = $7EF37E +KEYSDESERT = $7EF37F +KEYSAGA = $7EF380 +KEYSSWAMP = $7EF381 +KEYSPOD = $7EF382 +KEYSMIRE = $7EF383 +KEYSWOODS = $7EF384 +KEYSICE = $7EF385 +KEYSHERA = $7EF386 +KEYSTHIEF = $7EF387 +KEYSTROCK = $7EF388 +KEYSGANON = $7EF389 + +; Unused block of SRAM +UNUSED_7EF38A = $7EF38A + +; Game state +; 0x00 - Very start; progress cannot be saved in this state +; 0x01 - Uncle reached +; 0x02 - Zelda rescued +; 0x03 - Agahnim defeated +GAMESTATE = $7EF3C5 + +; Bitfield of less important progression +; .fbh .zsu +; u - Uncle visited in secret passage; controls spawn (0: spawn | 1: gone) +; s - Priest visited in sanc after Zelda is kidnapped again +; z - Zelda brought to sanc +; h - Uncle has left Link's house; controls spawn (0: spawn | 1: gone) +; b - Book of Mudora obtained/mentioned; controls Aginah dialog +; f - Flipped by fortune tellers to decide which fortune set to give +PROGLITE = $7EF3C6 + +; Map icon to guide noob players +; 0x00 - Red X on castle | Save zelda +; 0x01 - Red X on Kakariko | Talk to villagers about elders +; 0x02 - Red X on Eastern | Talk to Sahasrahla +; 0x03 - Pendants and MS | Obtain the master sword +; 0x04 - Master sword on LW | Grab the master sword +; 0x05 - Skull on castle | Kill Agahnim +; 0x06 - Crystal on POD | Get the first crystal +; 0x07 - Crystals | Get all 7 crystals +; 0x08 - Skull on GT | Climb Ganon's Tower +MAPICON = $7EF3C7 + +; 0x00 - Link's house +; 0x01 - Sanctuary +; 0x02 - Prison +; 0x03 - Uncle +; 0x04 - Throne +; 0x05 - Old man cave +; 0x06 - Old man home +SPAWNPT = $7EF3C8 + +; Another bitfield for progress +; t.dp s.bh +; t - smiths are currently tempering sword +; d - swordsmith rescued +; p - purple chest has been opened +; s - stumpy has been stumped +; b - bottle purchased from vendor +; h - bottle received from hobo +PROGLITE2 = $7EF3C9 + +; .d.. .... +; d - World (0: Light World | 1: Dark World) +SAVEWORLD = $7EF3CA + +; Not used +UNUSED_7EF3CB = $7EF3CB + +; Current follower ID +FOLLOWER = $7EF3CC + +; Cache of follower properties +FOLLOWCYL = $7EF3CD +FOLLOWCYH = $7EF3CE +FOLLOWCXL = $7EF3CF +FOLLOWCXH = $7EF3D0 + +; Copies INDOORS +FOLLOWERINOUT = $7EF3D1 + +; Copies LAYER +FOLLOWERCLAYER = $7EF3D2 + +; Indicates the follower is currently following +; 0x00 - Following +; 0x80 - Not following +FOLLOWERING = $7EF3D3 + +; Unused +UNUSED_7EF3D4 = $7EF3D4 +UNUSED_7EF3D5 = $7EF3D5 +UNUSED_7EF3D6 = $7EF3D6 +UNUSED_7EF3D7 = $7EF3D7 +UNUSED_7EF3D8 = $7EF3D8 + +; Player name +NAME1L = $7EF3D9 +NAME1H = $7EF3DA +NAME2L = $7EF3DB +NAME2H = $7EF3DC +NAME3L = $7EF3DD +NAME3H = $7EF3DE +NAME4L = $7EF3DF +NAME4H = $7EF3E0 + +; Save file checksum; expected to be $55AA +SCHKSML = $7EF3E1 +SCHKSMH = $7EF3E2 + +; Games played in each dungeon +GPSEWER = $7EF3E3 +GPHYRULE = $7EF3E5 +GPEAST = $7EF3E7 +GPDESERT = $7EF3E9 +GPAGA = $7EF3EB +GPSWAMP = $7EF3ED +GPPOD = $7EF3EF +GPMIRE = $7EF3F1 +GPWOODS = $7EF3F3 +GPICE = $7EF3F5 +GPHERA = $7EF3F7 +GPTHIEF = $7EF3F9 +GPTROCK = $7EF3FB +GPGANON = $7EF3FD + +; Games played for current segment +GPNOW = $7EF3FF + +; Total games played +; No display on file select if 0xFFFF +GAMESPLAYED = $7EF401 + +; Big unused block +UNUSED_7EF403 = $7EF403 +DEATHS_MAXED = $7EF405 + +; Inverse checksum for save file +SAVEICKSML = $7EF4FE +SAVEICKSMH = $7EF4FF \ No newline at end of file diff --git a/Core/symbols.asm b/Core/symbols.asm index a9ab0ea..b1698ea 100644 --- a/Core/symbols.asm +++ b/Core/symbols.asm @@ -33,127 +33,11 @@ function RGBto555(R,G,B) = ((R/8)<<10)|((G/8)<<5)|(B/8) ; zarby function hexto555(h) = ((((h&$FF)/8)<<10)|(((h>>8&$FF)/8)<<5)|(((h>>16&$FF)/8)<<0)) ; kan function menu_offset(y,x) = (y*64)+(x*2) -; ========================================================= -; SRAM in Use -SaveRam: -{ -; Game state -; 0x00 - Very start; progress cannot be saved in this state -; 0x01 - Uncle reached -; 0x02 - Zelda rescued -; 0x03 - Agahnim defeated -GameState = $7EF3C5 - -; Red X on Hall of Secrets -; Red X on Kalyxo Pyramid - -; .fmp h.i. -; f - fortress of secrets -; m - master sword -; p - pendant quest -; h - hall of secrets -; i - intro over, maku tree -OOSPROG = $7EF3D6 - -; Bitfield of less important progression -; .fbh .zsu -; u - Uncle -; s - Priest visited in sanc after Zelda is kidnapped again -; z - Zelda brought to sanc -; h - Uncle left Link's house (0: spawn | 1: gone) -; b - Book of Mudora obtained/mentioned; controls Aginah dialog -; f - Flipped by fortune tellers to decide fortune set to give -OOSPROG2 = $7EF3C6 - -; .... ...m -; m - maku tree has met link (0: no | 1: yes) -MakuTreeQuest = $7EF3D4 - -; Map icon -; 0x00 - Red X on Maku Tree/Maku Warp -; 0x01 - Toadstool Woods Crystal -; 0x02 - Kalyxo All Crystals -; 0x03 - -; 0x04 - -; 0x05 - -; 0x06 - -; 0x07 - -; 0x08 - Skull on GT | Climb Ganon's Tower -MapIcon = $7EF3C7 - -; Dungeon ID Legend -; Mushroom Grotto ID 0x0C (Palace of Darkness) -; Tail Palace ID 0x0A (Swamp Palace) -; Kalyxo Castle ID 0x10 (Skull Woods) -; Zora Temple ID 0x16 (Thieves Town) -; Glacia Estate 0x12 (Ice Palace) -; Goron Mines 0x0E (Misery Mire) -; Dragon Ship 0x18 (Turtle Rock) - -; .wbs tipm -; p - Palace of Darkness -; s - Swamp Palace -; w - Skull Woods -; b - Thieves' Town -; i - Ice Palace -; m - Misery Mire -; t - Turtle Rock -Crystals = $7EF37A - -; 01 - Fishing Rod -; 02 - Portal Rod -CustomRods = $7EF351 - -; Free SRAM Block 38A-3C4 -FishingRod = $7EF38A - -; Collectibles -Bananas = $7EF38B -Pineapples = $7EF38D -RockMeat = $7EF38F -Seashells = $7EF391 -Honeycomb = $7EF393 -DekuSticks = $7EF395 - -TingleMaps = $7EF396 -TingleId = $7EF397 - -; .dgi zktm -; m - Mushroom Grotto -; t - Tail Palace -; k - Kalyxo Castle -; z - Zora Temple -; i - Glacia Estate -; g - Goron Mines -; d - Dragon Ship -Scrolls = $7EF398 - -; Keep track of the previous scroll -; For re-reading old hints. -PrevScroll = $7EF39A - -; .dts fwpb -; b - bean planted -; w - plant watered -; p - pollinated by bee -; f - first day -; s - second day -; t - third day -; d - done -MagicBeanProg = $7EF39B - -; .... .cpw -; c - courage -; p - power -; w - wisdom -Dreams = $7EF410 - ; Current Dream ID (0x00-0x03) CurrentDream = $0426 ; Current Song CurrentSong = $030F -} ; ========================================================= ; The record format for the low table is 4 bytes: @@ -180,10 +64,8 @@ OamPtrH = $92 OamBackup = $0FEC ; ========================================================= -; Sprite RAM and Functions +; Sprite RAM -SpriteRam: -{ SprY = $0D00 SprX = $0D10 SprYH = $0D20 @@ -215,9 +97,7 @@ SprCustom = $1CC0 ; ; Used in sprite state 0x03 (falling in water) ; used as delay in most of the sprites SprDelay = $0E80 - -; Enemy color flash buffer -SprFlash = $0B89 +SprFlash = $0B89 ; Enemy color flash buffer SprTimerA = $0DF0 ; Action, decreased by 1 each frame SprTimerB = $0E00 ; Animation, decreased by 1 each frame @@ -323,14 +203,6 @@ SprFreeze = $0FC1 ; Seems to freeze sprites ; 0x07 32 24 16 ; 0x08 24 16 8 ; 0x09 64 48 24 -; -; Higher values are invalid, but here's what they are: -; 0x0A 169 48 32 -; 0x0B 142 246 169 -; 0x0C 144 133 71 -; 0x0D 169 16 133 -; 0x0E 70 169 33 -; 0x0F 34 124 187 SprBump = $0CD2 ; Damage sprite is enduring @@ -344,9 +216,7 @@ SprDmgTaken = $0CE2 ; d - If hit from front, deflect Ice Rod, Somarian missile, ; boomerang, hookshot, and sword beam, and arrows stick in ; it harmlessly. If bit 1 is also set, frontal arrows will -; instead disappear harmlessly. No monsters have bit 4 set -; in the ROM data, but it was functional and interesting -; enough to include. +; instead disappear harmlessly. ; e - If set, sprite collides with less tiles than usual ; f - If set, impervious to sword and hammer type attacks ; g - If set, impervious to arrows, but may have other additional meanings. @@ -378,10 +248,8 @@ SprBulletproof = $0BA0 SprRoom = $0C9A ;X W Contains the area or room id the sprite has been loaded in SprDrop = $0CBA ;X W 00: Drop nothing, 01: drop normal key, 03: Drop green rupee, OtherValues: Drop big key -} ; Overlord - OverlordId = $0B00 OverlordX = $0B08 OverlordXH = $0B10 @@ -392,16 +260,17 @@ OverlordTimerA = $0B28 OverlordTimerB = $0B30 OverlordTimerC = $0B38 +; ========================================================= +; Sprite Functions + SpriteData_OAMProp = $0DB359 ; Clear all properties for sprites SpritePrep_ResetProperties = $0DB871 -; ========================================================= ; set the oam coordinate for the sprite draw Sprite_PrepOamCoord = $06E416 -; ========================================================= ; Draw the sprite depending of the position of the player ; (if he has to be over or under link) Sprite_OAM_AllocateDeferToPlayer = $06F864 @@ -415,24 +284,18 @@ OAM_AllocateFromRegionF = $0DBA94 ; Above Sprite_DrawMultiple_quantity_preset = $05DF70 -; ========================================================= ; check if the sprite is getting damage from player or items Sprite_CheckDamageFromPlayer = $06F2AA -; ========================================================= ; check if the sprite is touching the player to damage Sprite_CheckDamageToPlayer = $06F121 -; ========================================================= ; damage the player everywhere on screen? Sprite_AttemptDamageToPlayerPlusRecoil = $06F41F -; ========================================================= ; makes all the sprites on screen shaking ApplyRumbleToSprites = $0680FA -; ========================================================= - Sprite_MoveLong = $1D808C Sprite_ProjectSpeedTowardsPlayer = $06EA1A @@ -463,74 +326,59 @@ ans_high = $0C CheckIfHitBoxesOverlap = $0683E6 -; ========================================================= ; $0FD8 = sprite's X coordinate ; $0FDA = sprite's Y coordinate Sprite_Get16BitCoords_Local = $0684C1 Sprite_Get_16_bit_Coords = $0684BD -; ========================================================= ; load / draw a 16x16 sprite Sprite_PrepAndDrawSingleLarge = $06DBF0 -; ========================================================= ; load / draw a 8x8 sprite Sprite_PrepAndDrawSingleSmall = $06DBF8 -; ========================================================= ; draw shadow (requires additional oam allocation) Sprite_DrawShadow = $06DC54 Sprite_DrawWaterRipple = $059FFA Sprite_DrawRippleIfInWater = $1EFF8D -; ========================================================= ; check if the sprite is colliding with a solid tile set $0E70, X ; ----udlr , u = up, d = down, l = left, r = right Sprite_CheckTileCollision = $06E496 Sprite_CheckTileCollision_long = $06E496 -; ========================================================= -; $00[0x02] - Entity Y coordinate +; $00[0x02] - Entity Y coordinate ; $02[0x03?] - Entity X coordinate -; $0FA5 +; $0FA5 - Tile ID result Sprite_GetTileAttr = $06E87B -; ========================================================= ; check if the sprite is colliding with a solid sloped tile Sprite_CheckSlopedTileCollision = $06E8FD -; ========================================================= ; set the velocity x,y towards the player (A = speed) Sprite_ApplySpeedTowardsPlayer = $06EA12 -; ========================================================= ; \return $0E is low byte of player_y_pos - sprite_y_pos ; \return $0F is low byte of player_x_pos - sprite_x_pos Sprite_DirectionToFacePlayer = $06EAA0 -; ========================================================= ; if Link is to the left of the sprite, Y = 1, otherwise Y = 0. Sprite_IsToRightOfPlayer = $06EACD -; ========================================================= ; return Y=1 sprite is below player, otherwise Y = 0 Sprite_IsBelowPlayer = $06EAE4 -; ========================================================= ; $06 = sprite's Y coordinate ; $07 = sprite's X coordinate Sprite_IsBelowLocation = $06EB1D -; ========================================================= ; check damage done to player if they collide on same layer Sprite_CheckDamageToPlayerSameLayer = $06F129 -; ========================================================= ; check damage done to player if they collide even if they are not on same layer Sprite_CheckDamageToPlayerIgnoreLayer = $06F131 -; ========================================================= ; play a sound loaded in A Sound_SetSfx1PanLong = $0DBB6E Sound_SetSfx2PanLong = $0DBB7C @@ -551,41 +399,30 @@ Sprite_SpawnDynamically_slot_limited = $1DF65F Sprite_SetSpawnedCoords = $09AE64 Sprite_SetSpawnedCoordinates = $09AE64 -; ========================================================= ; move the sprite if he stand on a conveyor belt Sprite_ApplyConveyorAdjustment = $1D8010 -; ========================================================= ; Setup sprite hitbox for comparison with scrap ram Sprite_SetupHitBoxLong = $0683EA -; ========================================================= -; set tile of dungeon -Dungeon_SpriteInducedTilemapUpdate = $01E7A9 - -; ========================================================= ; player can't pass through the sprite Sprite_BehaveAsBarrier = $1EF4F3 Sprite_PlayerCantPassThrough = $1EF4F3 -; ========================================================= ; player can't hookshot to that sprite Sprite_NullifyHookshotDrag = $0FF540 -; ========================================================= ; show a message box without any condition ; A = low byte of message ID to use. ; Y = high byte of message ID to use. Sprite_ShowMessageUnconditional = $05E219 -; ========================================================= ; show a message if we press A and face the sprite ; A = low byte of message ID to use. ; Y = high byte of message ID to use. Sprite_ShowSolicitedMessage = $05E1A7 Sprite_ShowSolicitedMessageIfPlayerFacing = $05E1A7 -; ========================================================= ; show a message if we touch the sprite ; should be used with Sprite_PlayerCantPassThrough ; A = low byte of message ID to use. @@ -605,6 +442,8 @@ Sprite_KillFriends = $09EF56 Sprite_KillSelf = $09F1F8 +Dungeon_SpriteInducedTilemapUpdate = $01E7A9 + ; ========================================================= ; $04 = X ; $05 = HighX @@ -644,10 +483,9 @@ Sprite_TrackBodyToHead = $05DCA2 GetRandomInt = $0DBA71 Sprite_SpawnFireball = $0DDA06 - Sprite_SpawnSmallSplash = $1EA820 - Sprite_SpawnSparkleGarnish = $058008 +Sprite_SpawnPoofGarnish = $05AB9C Sprite_CheckIfLifted = $06AA0C @@ -655,8 +493,6 @@ Sprite_TransmuteToBomb = $06AD50 Sprite_RepelDash = $079291 -Sprite_SpawnPoofGarnish = $05AB9C - Sprite_LoadGfxProperties = $00FC41 ThrownSprite_TileAndSpriteInteraction_long = $06DFF2 From dceb823ee428535c4153d1a2edfe4d6851b4f3cb Mon Sep 17 00:00:00 2001 From: scawful Date: Sun, 19 Jan 2025 11:54:52 -0500 Subject: [PATCH 25/67] add probability check macro --- Core/sprite_macros.asm | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Core/sprite_macros.asm b/Core/sprite_macros.asm index 2de7780..b40fe38 100644 --- a/Core/sprite_macros.asm +++ b/Core/sprite_macros.asm @@ -299,6 +299,12 @@ macro SetupDistanceFromSprite() LDA.w SprY, X : STA $05 endmacro +macro ProbCheck(mask, label) + JSL GetRandomInt + AND.b # + BNE