Add strafing, update attacks, retaliation on hurt state
This commit is contained in:
@@ -170,7 +170,7 @@ Sprite_Twinrova_Main:
|
|||||||
|
|
||||||
; -------------------------------------------------------
|
; -------------------------------------------------------
|
||||||
; 0x00
|
; 0x00
|
||||||
; TODO: Separate MoveState phases into action 0 and 1
|
; TODO: Play the cutscene and transition from Maiden sprite
|
||||||
Twinrova_Init:
|
Twinrova_Init:
|
||||||
{
|
{
|
||||||
%GotoAction(01)
|
%GotoAction(01)
|
||||||
@@ -181,6 +181,7 @@ Sprite_Twinrova_Main:
|
|||||||
; 0x01
|
; 0x01
|
||||||
Twinrova_MoveState:
|
Twinrova_MoveState:
|
||||||
{
|
{
|
||||||
|
STZ.w $0360
|
||||||
LDA SprHealth, X : CMP.b #$20 : BCS .phase_1
|
LDA SprHealth, X : CMP.b #$20 : BCS .phase_1
|
||||||
; -------------------------------------------
|
; -------------------------------------------
|
||||||
; Phase 2
|
; Phase 2
|
||||||
@@ -215,9 +216,20 @@ Sprite_Twinrova_Main:
|
|||||||
RTS
|
RTS
|
||||||
++
|
++
|
||||||
|
|
||||||
JSL Sprite_IsBelowPlayer : TYA : BNE .MoveBackwards ; If 1,
|
JSL GetRandomInt : AND.b #$0F : BEQ .random_strafe
|
||||||
%GotoAction(2) ; MoveForwards
|
JSL Sprite_IsBelowPlayer : TYA : BNE .MoveBackwards
|
||||||
|
%GotoAction(2) ; Move Forwards
|
||||||
RTS
|
RTS
|
||||||
|
.random_strafe
|
||||||
|
JSL GetRandomInt : AND.b #$01 : BEQ .strafe_left
|
||||||
|
LDA #$10 : STA SprXSpeed, X
|
||||||
|
%GotoAction(2) ; Move Forwards with strafe
|
||||||
|
RTS
|
||||||
|
.strafe_left
|
||||||
|
LDA #$F0 : STA SprXSpeed, X
|
||||||
|
%GotoAction(2) ; Move Forwards with strafe
|
||||||
|
RTS
|
||||||
|
|
||||||
.MoveBackwards
|
.MoveBackwards
|
||||||
%GotoAction(3) ; MoveBackwards
|
%GotoAction(3) ; MoveBackwards
|
||||||
RTS
|
RTS
|
||||||
@@ -235,8 +247,11 @@ Sprite_Twinrova_Main:
|
|||||||
PLX
|
PLX
|
||||||
|
|
||||||
JSL Sprite_DamageFlash_Long
|
JSL Sprite_DamageFlash_Long
|
||||||
JSL Sprite_BounceTowardPlayer
|
|
||||||
|
LDA #$10 ; Set speed
|
||||||
|
JSL Sprite_FloatTowardPlayer
|
||||||
JSL Sprite_CheckTileCollision
|
JSL Sprite_CheckTileCollision
|
||||||
|
JSL Sprite_PlayerCantPassThrough
|
||||||
|
|
||||||
%GotoAction(1)
|
%GotoAction(1)
|
||||||
RTS
|
RTS
|
||||||
@@ -254,8 +269,11 @@ Sprite_Twinrova_Main:
|
|||||||
PLX
|
PLX
|
||||||
|
|
||||||
JSL Sprite_DamageFlash_Long
|
JSL Sprite_DamageFlash_Long
|
||||||
JSL Sprite_BounceTowardPlayer
|
|
||||||
|
LDA #$20
|
||||||
|
JSL Sprite_FloatTowardPlayer
|
||||||
JSL Sprite_CheckTileCollision
|
JSL Sprite_CheckTileCollision
|
||||||
|
JSL Sprite_PlayerCantPassThrough
|
||||||
|
|
||||||
%GotoAction(1)
|
%GotoAction(1)
|
||||||
RTS
|
RTS
|
||||||
@@ -268,10 +286,9 @@ Sprite_Twinrova_Main:
|
|||||||
%StartOnFrame(7)
|
%StartOnFrame(7)
|
||||||
%Twinrova_Attack()
|
%Twinrova_Attack()
|
||||||
|
|
||||||
PHX
|
LDA #$01 : STA $0360
|
||||||
JSL Sprite_CheckDamageFromPlayerLong
|
|
||||||
%DoDamageToPlayerSameLayerOnContact()
|
JSL Sprite_PlayerCantPassThrough
|
||||||
PLX
|
|
||||||
|
|
||||||
LDA $0CAA : AND.b #$03 : STA $0CAA
|
LDA $0CAA : AND.b #$03 : STA $0CAA
|
||||||
LDA SprTimerD, X : BNE +
|
LDA SprTimerD, X : BNE +
|
||||||
@@ -294,6 +311,7 @@ Sprite_Twinrova_Main:
|
|||||||
%Twinrova_Ready()
|
%Twinrova_Ready()
|
||||||
|
|
||||||
JSR Sprite_Twinrova_FireAttack
|
JSR Sprite_Twinrova_FireAttack
|
||||||
|
JSL Sprite_PlayerCantPassThrough
|
||||||
|
|
||||||
; Random chance to release fireball
|
; Random chance to release fireball
|
||||||
JSL GetRandomInt : AND.b #$3F : BNE ++
|
JSL GetRandomInt : AND.b #$3F : BNE ++
|
||||||
@@ -314,6 +332,7 @@ Sprite_Twinrova_Main:
|
|||||||
%Twinrova_Ready()
|
%Twinrova_Ready()
|
||||||
|
|
||||||
JSR Sprite_Twinrova_IceAttack
|
JSR Sprite_Twinrova_IceAttack
|
||||||
|
JSL Sprite_PlayerCantPassThrough
|
||||||
|
|
||||||
LDA.w SprTimerD, X : BNE +
|
LDA.w SprTimerD, X : BNE +
|
||||||
%GotoAction(1)
|
%GotoAction(1)
|
||||||
@@ -328,13 +347,56 @@ Sprite_Twinrova_Main:
|
|||||||
%StartOnFrame(10)
|
%StartOnFrame(10)
|
||||||
%Twinrova_Hurt()
|
%Twinrova_Hurt()
|
||||||
|
|
||||||
|
|
||||||
JSL Sprite_DamageFlash_Long
|
JSL Sprite_DamageFlash_Long
|
||||||
|
JSL Sprite_PlayerCantPassThrough
|
||||||
|
|
||||||
LDA.w SprTimerD, X : BNE +
|
; Check if hurt timer is zero, if not keep flashing hurt animation
|
||||||
%GotoAction(1)
|
LDA.w SprTimerD, X : BNE .HurtAnimation
|
||||||
+
|
|
||||||
RTS
|
; Determine dodge or retaliate behavior
|
||||||
|
JSL GetRandomInt
|
||||||
|
AND.b #$07 ; 1 in 8 chance for dodge/retaliate
|
||||||
|
BNE .DodgeOrRetaliate
|
||||||
|
BRA .ResumeNormalState
|
||||||
|
|
||||||
|
.DodgeOrRetaliate
|
||||||
|
; Determine whether to dodge or retaliate
|
||||||
|
JSL GetRandomInt
|
||||||
|
AND.b #$01
|
||||||
|
BEQ .PerformDodge
|
||||||
|
BRA .PerformRetaliate
|
||||||
|
|
||||||
|
.PerformDodge
|
||||||
|
JSR DoRandomStrafe
|
||||||
|
LDA.b #$20 : STA.w SprTimerA, X ; Set timer for dodge duration
|
||||||
|
LDA.b #$02 : STA SprMiscA, X ; Set state to random strafe
|
||||||
|
RTS
|
||||||
|
|
||||||
|
.PerformRetaliate
|
||||||
|
; Immediate retaliation with fire or ice attack
|
||||||
|
JSL GetRandomInt
|
||||||
|
AND.b #$01
|
||||||
|
BEQ .FireAttack
|
||||||
|
BRA .IceAttack
|
||||||
|
|
||||||
|
.FireAttack
|
||||||
|
LDA.b #$20 : STA.w SprTimerD, X
|
||||||
|
STZ $AC ; Set fire attack
|
||||||
|
%GotoAction(4) ; Prepare Attack
|
||||||
|
RTS
|
||||||
|
|
||||||
|
.IceAttack
|
||||||
|
LDA.b #$20 : STA.w SprTimerD, X
|
||||||
|
LDA.b #$01 : STA $AC ; Set ice attack
|
||||||
|
%GotoAction(4) ; Prepare Attack
|
||||||
|
RTS
|
||||||
|
|
||||||
|
.ResumeNormalState
|
||||||
|
%GotoAction(1) ; Resume normal movement state
|
||||||
|
RTS
|
||||||
|
|
||||||
|
.HurtAnimation
|
||||||
|
RTS
|
||||||
}
|
}
|
||||||
|
|
||||||
; -------------------------------------------------------
|
; -------------------------------------------------------
|
||||||
@@ -349,10 +411,15 @@ Sprite_Twinrova_Main:
|
|||||||
%DoDamageToPlayerSameLayerOnContact()
|
%DoDamageToPlayerSameLayerOnContact()
|
||||||
PLX
|
PLX
|
||||||
|
|
||||||
JSL GetRandomInt : AND.b #$1F : BNE ++
|
JSL GetRandomInt : AND.b #$3F : BNE ++
|
||||||
JSR AddPitHazard
|
JSR AddPitHazard
|
||||||
JSR Ganon_SpawnFallingTilesOverlord
|
JSR Ganon_SpawnFallingTilesOverlord
|
||||||
++
|
++
|
||||||
|
|
||||||
|
; Random chance to release fireball
|
||||||
|
JSL GetRandomInt : AND.b #$3F : BNE +++
|
||||||
|
JSL Sprite_SpawnFireball
|
||||||
|
+++
|
||||||
|
|
||||||
JSL Sprite_DamageFlash_Long
|
JSL Sprite_DamageFlash_Long
|
||||||
JSR RageModeMove
|
JSR RageModeMove
|
||||||
@@ -376,11 +443,14 @@ Sprite_Twinrova_Main:
|
|||||||
%DoDamageToPlayerSameLayerOnContact()
|
%DoDamageToPlayerSameLayerOnContact()
|
||||||
PLX
|
PLX
|
||||||
|
|
||||||
JSL GetRandomInt : AND.b #$3F : BNE ++
|
JSL Sprite_IsBelowPlayer
|
||||||
JSL $1DE612 ; Sprite_SpawnLightning
|
CPY #$01 : BEQ .not_below
|
||||||
LDA #$30
|
JSL GetRandomInt : AND.b #$3F : BNE ++
|
||||||
JSL Sprite_ProjectSpeedTowardsPlayer
|
JSL $1DE612 ; Sprite_SpawnLightning
|
||||||
++
|
LDA #$30
|
||||||
|
JSL Sprite_ProjectSpeedTowardsPlayer
|
||||||
|
++
|
||||||
|
.not_below
|
||||||
|
|
||||||
JSL Sprite_DamageFlash_Long
|
JSL Sprite_DamageFlash_Long
|
||||||
JSR RageModeMove
|
JSR RageModeMove
|
||||||
@@ -395,7 +465,7 @@ Sprite_Twinrova_Main:
|
|||||||
; 0x0A
|
; 0x0A
|
||||||
Twinrova_Dead:
|
Twinrova_Dead:
|
||||||
{
|
{
|
||||||
%StartOnFrame(10)
|
%StartOnFrame(11)
|
||||||
%Twinrova_Hurt()
|
%Twinrova_Hurt()
|
||||||
RTS
|
RTS
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user