Update Farore Sprite and Intro Cutscene

This commit is contained in:
scawful
2023-05-25 11:02:43 -05:00
parent 9fdf057876
commit 0781fe650e
7 changed files with 192 additions and 386 deletions

View File

@@ -1,17 +0,0 @@
;; kan flute song of healing
org $1A8C60
db $00
org $1A9750
db $E0, $0D
db $2A ; change this to change length of quarter note
db $46
db $A3, $A1, $9D
db $A3, $A1, $9D
db $A3, $A1
db $15 ; make this half of whatever you made quarter note
db $9C, $9A
db $7F ; make this triple whatever you made quarter note (max value 7F)
db $9C
db $00

View File

@@ -332,7 +332,6 @@ Menu_ScrollUp:
; =============================================================================
; 09 CHECK BOTTLE
print pc
Menu_CheckBottle:
{
LDA.w $0202 : CMP.b #$06 : BNE .not_first

View File

@@ -1,4 +1,4 @@
;===========================================================
; =============================================================================
; The Legend of Zelda: Oracle of Secrets
; Composed by: Scawful
;
@@ -10,8 +10,6 @@
; Intro skip after leaving house
; Key block link's awakening
; Lost Sea Area Combo
;
;
; Expanded Banks Key:
; 21 - N/A
@@ -44,8 +42,14 @@
; 3C - None
; 3D - None
; 3F - Boat GFX
;
; Used Free RAM:
; $B6 - Cutscene State
; $02B2 - Mask Form
; (0 = Human, 1 = Deku, 2 = Zora, 3 = Wolf, 4 = Bunny, 5 = Minish)
; $0AAB - Diving Flag
;
;===========================================================
; =============================================================================
namespace Oracle
{
@@ -55,21 +59,58 @@ namespace Oracle
incsrc "Util/ram.asm"
incsrc "Util/functions.asm"
incsrc "Util/music_macros.asm"
; ---------------------------------------------------------
; Music
; incsrc "Music/stone_tower_temple.asm"
; print "End of stone_tower_temple.asm ", pc
; incsrc "Music/frozen_hyrule.asm"
; print "End of Music/frozen_hyrule.asm ", pc
incsrc "Music/lost_woods.asm"
print "End of Music/lost_woods.asm ", pc
incsrc "Music/dungeon_theme.asm"
print "End of Music/dungeon_theme.asm ", pc
; ---------------------------------------------------------
; Sprites
incsrc "Sprites/farore_and_maku.asm"
print "End of farore_and_maku.asm ", pc
; org $02ECF8
; dw $0029
incsrc "Sprites/farore.asm"
print "End of farore.asm ", pc
incsrc "Sprites/Kydrog/kydrog.asm"
print "End of kydrog.asm ", pc
incsrc "Sprites/maku_tree.asm"
print "End of maku_tree.asm ", pc
incsrc "Sprites/mask_salesman.asm"
print "End of mask_salesman.asm ", pc
print ""
; ---------------------------------------------------------
; Transformation Masks
print " -- Masks -- "
print ""
incsrc "Masks/mask_routines.asm"
incsrc "Masks/bunny_hood.asm"
print "End of Masks/bunny_hood.asm ", pc
incsrc "Masks/minish_form.asm"
print "End of Masks/minish_form.asm ", pc
incsrc "Masks/deku_mask.asm"
print "End of Masks/deku_mask.asm ", pc
@@ -79,13 +120,17 @@ namespace Oracle
incsrc "Masks/wolf_mask.asm"
print "End of Masks/wolf_mask.asm ", pc
incsrc "Masks/bunny_hood.asm"
print "End of Masks/bunny_hood.asm ", pc
print ""
; ---------------------------------------------------------
; Items
print " -- Items -- "
print ""
incsrc "Items/bottle_net.asm"
print "End of Items/bottle_net.asm ", pc
incsrc "Items/jump_feather.asm"
print "End of Items/jump_feather.asm ", pc
@@ -95,9 +140,10 @@ namespace Oracle
incsrc "Items/book_of_secrets.asm"
print "End of Items/book_of_secrets.asm ", pc
; incsrc "Items/bottle_net.asm"
; print "End of Items/bottle_net.asm ", pc
incsrc "Items/ocarina.asm"
print "End of Items/ocarina.asm ", pc
print ""
; ---------------------------------------------------------
; Events
@@ -106,7 +152,10 @@ namespace Oracle
print "End of Events/house_tag.asm ", pc
incsrc "Events/lost_sea.asm"
print "End of Events/lost_sea.asm ", pc
print "End of Events/lost_sea.asm ", pc
incsrc "Events/snow_overlay.asm"
print "End of Events/snow_overlay.asm ", pc
; ---------------------------------------------------------
@@ -125,6 +174,9 @@ namespace Oracle
incsrc "Dungeons/keyblock.asm"
print "End of Dungeons/keyblock.asm ", pc
incsrc "Dungeons/entrances.asm"
print "End of Dungeons/entrances.asm ", pc
; ---------------------------------------------------------
; Custom Menu and HUD
@@ -136,7 +188,11 @@ namespace Oracle
; ---------------------------------------------------------
incsrc "Debug/debug.asm"
print "End of Debug/debug.asm ", pc
; Overworld area which has holes that hurt
; You can change the area to which holes will hurt the player!
; currently it only allows you to choose one area
; 396DB, should be a 05 - Change to another area hex number
print ""
print "Finished applying patches"

View File

@@ -1,12 +0,0 @@
;===========================================================
; Happy Mask Salesman
;===========================================================
namespace Sprites
{
namespace HappyMaskSalesman
{
} ; namespace HappyMaskSalesman
} ; namespace Sprites

View File

@@ -1,217 +0,0 @@
; ==============================================================================
; Impa - Sprite #76 Zelda
;
; Goals: Make the Impa sprite interact with the "Uncle/Priest/Mantle" object
; in the forest. This will trigger the intro cutscene with Farore and the
; antagonist of the story.
;
; Ideas: Maybe make the "Mantle" the Maku Tree?
; ==============================================================================
; from `sprites/npcs/sprite_uncle_and_priest.asm`
; $2DD72-$2DD9E JUMP LOCATION
{
LDA.b #$00 : STA $0EB0, X : STA $0DE0, X
LDA $0DF0, X : BNE .alpha
; "Princess Zelda, you are safe! Is this your doing, [Name]?" message
LDA.b #$17
LDY.b #$00
JSL Sprite_ShowMessageUnconditional
INC $0D80, X
LDA.b #$01 : STA $7FFE01
JSR Zelda_TransitionFromTagalong
LDA.b #$01 : STA $02E4
LDA.b #$01 : STA $7EF3C7
.alpha
RTS
}
; ==============================================================================
; from `sprites/npcs/sprite_zelda.asm`
; *$2EC4C-$2EC8D LOCAL
Zelda_TransitionFromTagalong:
{
; Transition princess Zelda back into a sprite from the tagalong
; state (the sage's sprite is doing this).
LDA.b #$76 : JSL Sprite_SpawnDynamically
PHX
LDX $02CF
LDA $1A64, X : AND.b #$03 : STA $0EB0, Y : STA $0DE0, Y
LDA $20 : STA $0D00, Y
LDA $21 : STA $0D20, Y
LDA $22 : STA $0D10, Y
LDA $23 : STA $0D30, Y
LDA.b #$01 : STA $0E80, Y
LDA.b #$00 : STA $7EF3CC
LDA $0BA0, Y : INC A : STA $0BA0, Y
LDA.b #$03 : STA $0F60, Y
PLX
RTS
}
; ==============================================================================
; *$2EC9E-$2ECBE LOCAL
Sprite_Zelda:
{
JSL CrystalMaiden_Draw
JSR Sprite2_CheckIfActive
JSL Sprite_PlayerCantPassThrough
JSL Sprite_MakeBodyTrackHeadDirection : BCC .cant_move
JSR Sprite2_Move
.cant_move
LDA $0E80, X
JSL UseImplicitRegIndexedLocalJumpTable
dw Zelda_InPrison ; On the beach
dw Zelda_EnteringSanctuary ; Approaching Maku Tree
dw Zelda_AtSanctuary ; In the Maku Tree forest area
}
; ==============================================================================
; *$2ED69-$2ED75 JUMP LOCATION
Zelda_EnteringSanctuary:
{
LDA $0D80, X
JSL UseImplicitRegIndexedLocalJumpTable
dw Zelda_WalkTowardsPriest
dw Zelda_RespondToPriest
dw Zelda_BeCarefulOutThere
}
; ==============================================================================
; $2ED76-$2ED7D DATA
pool Zelda_WalkTowardsPriest:
{
.timers
db $26, $1A, $2C, $01
.directions
db $01, $03, $01, $02
}
; ==============================================================================
; *$2ED7E-$2EDC3 JUMP LOCATION
Zelda_WalkTowardsPriest:
{
LDA $0DF0, X : BNE .walking
LDY $0D90, X : CPY.b #$04 : BCC .beta
INC $0D80, X
STZ $0DE0, X
STZ $0EB0, X
STZ $0D50, X
STZ $0D40, X
RTS
.beta
LDA .timers, Y : STA $0DF0, X
LDA .directions, Y : STA $0EB0, X : STA $0DE0, X
INC $0D90, X
TAY
LDA Sprite_Zelda.x_speeds, Y : STA $0D50, X
LDA Sprite_Zelda.y_speeds, Y : STA $0D40, X
.walking
LDA $1A : LSR #3 : AND.b #$01 : STA $0DC0, X
RTS
}
; ==============================================================================
; *$2EDC4-$2EDEB JUMP LOCATION
Zelda_RespondToPriest:
{
; "Yes, it was [Name] who helped me escape from the dungeon! ..."
LDA.b #$1D
LDY.b #$00
JSL Sprite_ShowMessageUnconditional
INC $0D80, X
LDA.b #$02 : STA $7FFE01
LDA.b #$01 : STA $7EF3C8
JSL SavePalaceDeaths
LDA.b #$02 : STA $7EF3C5
PHX
JSL Sprite_LoadGfxProperties.justLightWorld
PLX
RTS
}
; ==============================================================================
; *$2EDEC-$2EE05 JUMP LOCATION
Zelda_BeCarefulOutThere:
{
JSR Sprite2_DirectionToFacePlayer : TYA : EOR.b #$03 : STA $0EB0, X
; "[Name], be careful out there! I know you can save Hyrule!"
LDA.b #$1E
LDY.b #$00
JSL Sprite_ShowSolicitedMessageIfPlayerFacing : BCC .didnt_speak
STA $0DE0, X
STA $0EB0, X
.didnt_speak
RTS
}
; ==============================================================================

View File

@@ -3,7 +3,7 @@
;==============================================================================
!SPRID = $7B; The sprite ID you are overwriting (HEX)
!NbrTiles = 6 ; Number of tiles used in a frame
!Harmless = 00 ; 00 = Sprite is Harmful, 01 = Sprite is Harmless
!Harmless = 01 ; 00 = Sprite is Harmful, 01 = Sprite is Harmless
!HVelocity = 00 ; Is your sprite going super fast? put 01 if it is
!Health = 0 ; Number of Health the sprite have
!Damage = 0 ; (08 is a whole heart), 04 is half heart
@@ -54,6 +54,10 @@ Sprite_Kydrog_Prep:
PHB : PHK : PLB
; Add more code here to initialize data
LDA.l $7EF300
BEQ .PlayIntro
STZ.w $0DD0, X ; Kill the sprite
.PlayIntro
PLB
RTL
@@ -69,7 +73,6 @@ Sprite_Kydrog_Main:
dw Kydrog_StartCutscene
dw Kydrog_AttractPlayer
dw Kydrog_SpawnOffspring
dw Kydrog_TurnPlayerToDeku
dw Kydrog_WarpPlayerAway
@@ -95,7 +98,6 @@ Sprite_Kydrog_Main:
{
LDA.w SprTimerA, X : BNE +
%ShowUnconditionalMessage($21)
LDA.b #$02 : STA.b $B6 ; Update story flag for Farore
%GotoAction(2)
+
RTS
@@ -103,29 +105,22 @@ Sprite_Kydrog_Main:
Kydrog_SpawnOffspring:
{
LDA.b #$02 : STA.b $B6 ; Update story flag for Farore
STZ.b $49 ; Stop Link from moving
%GotoAction(3)
RTS
}
Kydrog_TurnPlayerToDeku:
{
LDA #$35 : STA $BC
%GotoAction(4)
RTS
}
Kydrog_WarpPlayerAway:
{
; Set game state to part 03
LDA.b #$03 : STA $7EF3C5
; LDA.b #$03 : STA $7EF3C5
; Put us in the Dark World.
LDA $7EF3CA : EOR.b #$40 : STA $7EF3CA
JSL $00FC41 ; Sprite_LoadGfxProperties
; JSL $00FC62 ; Sprite_LoadGfxProperties.justLightWorld
; JSL $00FC62 ; Sprite_LoadGfxProperties.justLightWorld
STZ $037B : STZ $3C : STZ $3A : STZ $03EF
@@ -144,28 +139,11 @@ Sprite_Kydrog_Main:
; Clear submodules
STZ $11 : STZ $B0
; Remove Impa
; Remove Impa follower
LDA.b #$00 : STA $7EF3CC
; Mirror Warp Timer
; #_00D8D2: INC.w $06BA
; LDA.w $06BA
; CMP.b #$20
; BEQ .continue
; STZ.w $0200
; RTL
; .continue
; Set the module to magic mirror
; $10 - 0x15 - Module for Magic Mirror
; LoadOverworldFromSpecialOverworld
; #_029D5F: LDY.b #$5A
; #_029D61: JSL DecompressAnimatedOverworldTiles
; JSL $00D8D2
; Set the flag to remove Farore and Kydrog from Maku area
LDA #$01 : STA.l $7EF300
RTS
}
@@ -248,8 +226,8 @@ Sprite_Kydrog_Draw:
}
; I forget what this is lol
org $02ECF8
dw $0029
; org $02ECF8
; dw $0029
; ==============================================================================
@@ -259,18 +237,3 @@ org $02ECF8
; org $029E65
; JSR LoadOverworldFromSpecialOverworld
; 11E5F
; 029E66
; 00D8A0
; SetTargetOverworldWarpToPyramid:
; #_029D56: LDA.b $10
; #_029D58: CMP.b #$15
; #_029D5A: BNE .exit
; #_029D5C: JSR LoadOverworldFromUnderworld
; #_029D5F: LDY.b #$5A
; #_029D61: JSL DecompressAnimatedOverworldTiles

View File

@@ -1,7 +1,5 @@
;==============================================================================
; Farore/Maku Tree - Sprite Uncle/Priest
;
; STZ.w $0DD0, X ; Kill the sprite since it's not needed anymore
; Farore Sprite
;
;==============================================================================
@@ -18,7 +16,6 @@ incsrc sprite_new_table.asm
org $308000
incsrc sprite_new_functions.asm
;==============================================================================
; Sprite Properties
;==============================================================================
@@ -76,14 +73,14 @@ Sprite_Farore_Long:
Sprite_Farore_Prep:
{
PHB : PHK : PLB
; LDA.l $7EF300
; BEQ .PlayIntro
; STZ.w $0DD0, X ; Kill the sprite
; .PlayIntro
LDA.b #$80 : STA $0CAA, X ; Don't kill Farore when she goes off screen
LDA.l $7EF300
BEQ .PlayIntro
STZ.w $0DD0, X ; Kill the sprite
.PlayIntro
PLB
RTL
}
@@ -95,6 +92,7 @@ Sprite_Farore_Prep:
WALKSPEED = 14
STORY_STATE = $B6
Sprite_Farore_Main:
{
LDA.w SprAction, X; Load the SprAction
@@ -104,28 +102,36 @@ Sprite_Farore_Main:
dw MoveUpTowardsFarore
dw MoveLeftTowardsFarore
dw WaitAndMessage
dw FaroreGiveSwordAndShield
dw FaroreFollowPlayer
dw MakuArea_FaroreFollowPlayer
dw MakuArea_FaroreWaitForKydrog
; dw MakuArea_FaroreWalkToPosition
; 00
IntroStart:
{
; JSR SetupMovieEffect
; JSR MovieEffect
LDA $B6 : CMP #$01 : BEQ .maku_area
CMP #$02 : BEQ .waiting
LDA $B6 : CMP.b #$01 : BEQ .maku_area
CMP.b #$02 : BEQ .waiting
%GotoAction(1)
RTS
.maku_area
JSR MakuArea_FaroreFollowPlayer
.waiting
JSR MakuArea_FaroreWaitForKydrog
%GotoAction(6)
; JSR MakuArea_FaroreFollowPlayer
RTS
.waiting
%GotoAction(7)
;JSR MakuArea_FaroreWaitForKydrog
RTS
}
; 01
MoveUpTowardsFarore:
{
LDA WALKSPEED : STA.b $57 ; Slow Link down for the cutscene
@@ -141,6 +147,7 @@ Sprite_Farore_Main:
RTS
}
; 02
MoveLeftTowardsFarore:
{
; Move Link Left
@@ -161,14 +168,17 @@ Sprite_Farore_Main:
RTS
}
; 03
WaitAndMessage:
{
%PlayAnimation(1, 2, 8)
%MoveTowardPlayer(15)
LDA.b #$15
JSL Sprite_ApplySpeedTowardsPlayer
JSL Sprite_MoveVert
LDA.w SprTimerA, X : BNE +
STZ $2F
%ShowUnconditionalMessage($24)
%ShowUnconditionalMessage($0E) ; "I am Farore, the Oracle of Secrets."
%GotoAction(4)
+
@@ -176,34 +186,57 @@ Sprite_Farore_Main:
}
; 04
FaroreGiveSwordAndShield:
{
; Give Link the Sword and shield
LDA.w SprTimerA, X : BNE ++
LDY.b #$00 : STZ $02E9
JSL Link_ReceiveItem
%GotoAction(5)
++
RTS
}
; 05
FaroreFollowPlayer:
{
LDA WALKSPEED : STA.b $57 ; Slow Link down for the cutscene
LDA.b #$08 : STA.b $49 ; Auto-movement north
%PlayAnimation(3, 4, 8)
%MoveTowardPlayer(16)
LDA.b #$15
JSL Sprite_ApplySpeedTowardsPlayer
JSL Sprite_MoveVert
LDA #$02 : STA $7EF3C5 ; (0 - intro, 1 - pendants, 2 - crystals)
LDA #$05 : STA $012D ; turn off rain sound
JSL $00FC41 ; fix monsters
LDA #$01 : STA $B6 ; Set Story State
%GotoAction(0)
RTS
}
; 05
MakuArea_FaroreFollowPlayer:
{
.keep_walking
%PlayAnimation(3, 4, 8)
%MoveTowardPlayer(18)
LDA $B6 : CMP.b #$02 : BEQ .keep_walking
JSR MakuArea_FaroreWaitForKydrog
JSL $00FC41 ; fix monsters
%GotoAction(6)
RTS
}
; 06
MakuArea_FaroreFollowPlayer:
{
;.keep_walking
%PlayAnimation(3, 4, 8)
LDA.b #$15
JSL Sprite_ApplySpeedTowardsPlayer
JSL Sprite_MoveVert
; LDA $B6 : CMP.b #$02 : BEQ .keep_walking
%GotoAction(6)
RTS
}
; 07
; Look at the RAM $0D00 to $0D60, the first few are the actual positions of the sprite that you can just set manually or $0D40 and $0D50 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
@@ -211,16 +244,17 @@ Sprite_Farore_Main:
{
%PlayAnimation(5, 5, 8)
RTS
}
; 07
MakuArea_FaroreWalkToPosition:
{
%PlayAnimation(3, 4, 8)
RTS
}
; ; 09
; MakuArea_FaroreWalkToPosition:
; {
; %PlayAnimation(3, 4, 8)
; RTS
; }
}
;==============================================================================
@@ -284,49 +318,49 @@ Sprite_Farore_Draw:
;==============================================================================
.start_index
db $00, $02, $04, $06, $08, $0A, $0C
db $00, $02, $04, $06, $08, $0A, $0C
.nbr_of_tiles
db 1, 1, 1, 1, 1, 1, 1
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
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
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
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
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
db $02, $02
db $02, $02
db $02, $02
db $02, $02
db $02, $02
db $02, $02
db $02, $02
}
;==============================================================================