Add keese to twinrova gfx, spawn ice/fire keese randomly
This commit is contained in:
@@ -151,7 +151,6 @@ endmacro
|
|||||||
|
|
||||||
Sprite_Twinrova_Main:
|
Sprite_Twinrova_Main:
|
||||||
{
|
{
|
||||||
JSL Sprite_PlayerCantPassThrough
|
|
||||||
JSL Sprite_DamageFlash_Long
|
JSL Sprite_DamageFlash_Long
|
||||||
|
|
||||||
PHX
|
PHX
|
||||||
@@ -174,7 +173,6 @@ Sprite_Twinrova_Main:
|
|||||||
dw Twinrova_KotakeMode ; 0x09
|
dw Twinrova_KotakeMode ; 0x09
|
||||||
dw Twinrova_Dead ; 0x0A
|
dw Twinrova_Dead ; 0x0A
|
||||||
|
|
||||||
; -------------------------------------------------------
|
|
||||||
; 0x00
|
; 0x00
|
||||||
Twinrova_Init:
|
Twinrova_Init:
|
||||||
{
|
{
|
||||||
@@ -186,13 +184,11 @@ Sprite_Twinrova_Main:
|
|||||||
RTS
|
RTS
|
||||||
}
|
}
|
||||||
|
|
||||||
; -------------------------------------------------------
|
|
||||||
; 0x01
|
; 0x01
|
||||||
Twinrova_MoveState:
|
Twinrova_MoveState:
|
||||||
{
|
{
|
||||||
STZ.w $0360
|
STZ.w $0360
|
||||||
LDA.w SprHealth, X : CMP.b #$20 : BCS .phase_1
|
LDA.w SprHealth, X : CMP.b #$20 : BCS .phase_1
|
||||||
; -------------------------------------------
|
|
||||||
; Phase 2
|
; Phase 2
|
||||||
LDA.b #$70 : STA.w SprTimerD, X
|
LDA.b #$70 : STA.w SprTimerD, X
|
||||||
LDA.w SprTimerE, X : BNE .kotake
|
LDA.w SprTimerE, X : BNE .kotake
|
||||||
@@ -201,9 +197,20 @@ Sprite_Twinrova_Main:
|
|||||||
.kotake
|
.kotake
|
||||||
%GotoAction(9) ; Kotake Mode
|
%GotoAction(9) ; Kotake Mode
|
||||||
RTS
|
RTS
|
||||||
; ---------------------------------------------
|
|
||||||
.phase_1
|
.phase_1
|
||||||
LDA.w SprMiscA : BEQ .not_flashing
|
|
||||||
|
|
||||||
|
%ProbCheck($3F, +)
|
||||||
|
%ProbCheck($0F, ++)
|
||||||
|
JSL Sprite_SpawnFireKeese
|
||||||
|
LDA.b #$01 : STA.w SprMiscB, Y
|
||||||
|
JMP +
|
||||||
|
++
|
||||||
|
JSL Sprite_SpawnIceKeese
|
||||||
|
LDA.b #$01 : STA.w SprMiscB, Y
|
||||||
|
+
|
||||||
|
|
||||||
|
LDA.w SprFlash, X : BEQ .not_flashing
|
||||||
LDA.b #$30 : STA.w SprTimerD, X
|
LDA.b #$30 : STA.w SprTimerD, X
|
||||||
%GotoAction(7) ; Goto Twinrova_Hurt
|
%GotoAction(7) ; Goto Twinrova_Hurt
|
||||||
RTS
|
RTS
|
||||||
@@ -224,25 +231,23 @@ Sprite_Twinrova_Main:
|
|||||||
++
|
++
|
||||||
|
|
||||||
JSL GetRandomInt : AND.b #$0F : BEQ .random_strafe
|
JSL GetRandomInt : AND.b #$0F : BEQ .random_strafe
|
||||||
JSL Sprite_IsBelowPlayer : TYA : BNE .MoveBackwards
|
JSL Sprite_IsBelowPlayer : TYA : BNE .move_back
|
||||||
%GotoAction(2) ; Move Forwards
|
%GotoAction(2) ; Move Forwards
|
||||||
RTS
|
|
||||||
.random_strafe
|
|
||||||
JSL GetRandomInt : AND.b #$01 : BEQ .strafe_left
|
|
||||||
LDA #$10 : STA.w SprXSpeed, X
|
|
||||||
%GotoAction(2) ; Move Forwards with strafe
|
|
||||||
RTS
|
RTS
|
||||||
.strafe_left
|
.move_back
|
||||||
LDA #$F0 : STA.w SprXSpeed, X
|
|
||||||
%GotoAction(2) ; Move Forwards with strafe
|
|
||||||
RTS
|
|
||||||
|
|
||||||
.MoveBackwards
|
|
||||||
%GotoAction(3) ; MoveBackwards
|
%GotoAction(3) ; MoveBackwards
|
||||||
RTS
|
RTS
|
||||||
|
.random_strafe
|
||||||
|
JSL GetRandomInt : AND.b #$01 : BEQ .strafe_left
|
||||||
|
LDA #$10 : STA.w SprXSpeed, X
|
||||||
|
%GotoAction(2) ; Move Forwards with strafe
|
||||||
|
RTS
|
||||||
|
.strafe_left
|
||||||
|
LDA #$F0 : STA.w SprXSpeed, X
|
||||||
|
%GotoAction(2) ; Move Forwards with strafe
|
||||||
|
RTS
|
||||||
}
|
}
|
||||||
|
|
||||||
; -------------------------------------------------------
|
|
||||||
; 0x02 - Twinrova_MoveForwards
|
; 0x02 - Twinrova_MoveForwards
|
||||||
Twinrova_MoveForwards:
|
Twinrova_MoveForwards:
|
||||||
{
|
{
|
||||||
@@ -255,7 +260,6 @@ Sprite_Twinrova_Main:
|
|||||||
RTS
|
RTS
|
||||||
}
|
}
|
||||||
|
|
||||||
; -------------------------------------------------------
|
|
||||||
; 0x03 - Twinrova_MoveBackwards
|
; 0x03 - Twinrova_MoveBackwards
|
||||||
Twinrova_MoveBackwards:
|
Twinrova_MoveBackwards:
|
||||||
{
|
{
|
||||||
@@ -267,7 +271,6 @@ Sprite_Twinrova_Main:
|
|||||||
RTS
|
RTS
|
||||||
}
|
}
|
||||||
|
|
||||||
; -------------------------------------------------------
|
|
||||||
; 0x04
|
; 0x04
|
||||||
Twinrova_PrepareAttack:
|
Twinrova_PrepareAttack:
|
||||||
{
|
{
|
||||||
@@ -288,13 +291,13 @@ Sprite_Twinrova_Main:
|
|||||||
RTS
|
RTS
|
||||||
}
|
}
|
||||||
|
|
||||||
; -------------------------------------------------------
|
|
||||||
; 0x05
|
; 0x05
|
||||||
Twinrova_FireAttack:
|
Twinrova_FireAttack:
|
||||||
{
|
{
|
||||||
%StartOnFrame(4)
|
%StartOnFrame(4)
|
||||||
%Twinrova_Ready()
|
%Twinrova_Ready()
|
||||||
|
|
||||||
|
JSR Twinrova_RestoreFloorTile
|
||||||
JSL Sprite_Twinrova_FireAttack
|
JSL Sprite_Twinrova_FireAttack
|
||||||
|
|
||||||
; Random chance to release fireball
|
; Random chance to release fireball
|
||||||
@@ -308,7 +311,6 @@ Sprite_Twinrova_Main:
|
|||||||
RTS
|
RTS
|
||||||
}
|
}
|
||||||
|
|
||||||
; -------------------------------------------------------
|
|
||||||
; 0x06
|
; 0x06
|
||||||
Twinrova_IceAttack:
|
Twinrova_IceAttack:
|
||||||
{
|
{
|
||||||
@@ -323,7 +325,6 @@ Sprite_Twinrova_Main:
|
|||||||
RTS
|
RTS
|
||||||
}
|
}
|
||||||
|
|
||||||
; -------------------------------------------------------
|
|
||||||
; 0x07
|
; 0x07
|
||||||
Twinrova_Hurt:
|
Twinrova_Hurt:
|
||||||
{
|
{
|
||||||
@@ -333,53 +334,40 @@ Sprite_Twinrova_Main:
|
|||||||
; Check if hurt timer is zero, if not keep flashing hurt animation
|
; Check if hurt timer is zero, if not keep flashing hurt animation
|
||||||
LDA.w SprTimerD, X : BNE .HurtAnimation
|
LDA.w SprTimerD, X : BNE .HurtAnimation
|
||||||
|
|
||||||
; Determine dodge or retaliate behavior
|
; Determine dodge or retaliate behavior, 1/8 chance
|
||||||
JSL GetRandomInt
|
JSL GetRandomInt : AND.b #$07 : BNE .DodgeOrRetaliate
|
||||||
AND.b #$07 ; 1 in 8 chance for dodge/retaliate
|
BRA .ResumeNormalState
|
||||||
BNE .DodgeOrRetaliate
|
.DodgeOrRetaliate
|
||||||
BRA .ResumeNormalState
|
|
||||||
|
|
||||||
.DodgeOrRetaliate
|
|
||||||
; Determine whether to dodge or retaliate
|
; Determine whether to dodge or retaliate
|
||||||
JSL GetRandomInt
|
JSL GetRandomInt : AND.b #$01 : BEQ .PerformDodge
|
||||||
AND.b #$01
|
BRA .PerformRetaliate
|
||||||
BEQ .PerformDodge
|
.PerformDodge
|
||||||
BRA .PerformRetaliate
|
|
||||||
|
|
||||||
.PerformDodge
|
|
||||||
JSR DoRandomStrafe
|
JSR DoRandomStrafe
|
||||||
LDA.b #$20 : STA.w SprTimerA, X ; Set timer for dodge duration
|
LDA.b #$20 : STA.w SprTimerA, X ; Set timer for dodge duration
|
||||||
LDA.b #$02 : STA.w SprMiscA, X ; Set state to random strafe
|
LDA.b #$02 : STA.w SprMiscA, X ; Set state to random strafe
|
||||||
RTS
|
RTS
|
||||||
|
|
||||||
.PerformRetaliate
|
.PerformRetaliate
|
||||||
; Immediate retaliation with fire or ice attack
|
; Immediate retaliation with fire or ice attack
|
||||||
JSL GetRandomInt
|
JSL GetRandomInt : AND.b #$01 : BEQ .FireAttack
|
||||||
AND.b #$01
|
LDA.b #$20 : STA.w SprTimerD, X
|
||||||
BEQ .FireAttack
|
LDA.b #$01 : STA $AC ; Set ice attack
|
||||||
BRA .IceAttack
|
%GotoAction(4) ; Prepare Attack
|
||||||
|
RTS
|
||||||
.FireAttack
|
.FireAttack
|
||||||
LDA.b #$20 : STA.w SprTimerD, X
|
LDA.b #$20 : STA.w SprTimerD, X
|
||||||
STZ $AC ; Set fire attack
|
STZ $AC ; Set fire attack
|
||||||
%GotoAction(4) ; Prepare Attack
|
%GotoAction(4) ; Prepare Attack
|
||||||
RTS
|
RTS
|
||||||
|
|
||||||
.IceAttack
|
.ResumeNormalState
|
||||||
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
|
%GotoAction(1) ; Resume normal movement state
|
||||||
RTS
|
|
||||||
|
|
||||||
.HurtAnimation
|
.HurtAnimation
|
||||||
RTS
|
RTS
|
||||||
}
|
}
|
||||||
|
|
||||||
; -------------------------------------------------------
|
|
||||||
; 0x08
|
; 0x08
|
||||||
Twinrova_KoumeMode:
|
Twinrova_KoumeMode:
|
||||||
{
|
{
|
||||||
@@ -396,7 +384,6 @@ Sprite_Twinrova_Main:
|
|||||||
JSL Sprite_SpawnFireball
|
JSL Sprite_SpawnFireball
|
||||||
+++
|
+++
|
||||||
|
|
||||||
|
|
||||||
JSR RageModeMove
|
JSR RageModeMove
|
||||||
|
|
||||||
LDA.w SprTimerD, X : BNE +
|
LDA.w SprTimerD, X : BNE +
|
||||||
@@ -406,15 +393,13 @@ Sprite_Twinrova_Main:
|
|||||||
RTS
|
RTS
|
||||||
}
|
}
|
||||||
|
|
||||||
; -------------------------------------------------------
|
|
||||||
; 0x09
|
; 0x09
|
||||||
Twinrova_KotakeMode:
|
Twinrova_KotakeMode:
|
||||||
{
|
{
|
||||||
%StartOnFrame(9)
|
%StartOnFrame(9)
|
||||||
%Show_Kotake()
|
%Show_Kotake()
|
||||||
|
|
||||||
JSL Sprite_IsBelowPlayer
|
JSL Sprite_IsBelowPlayer : CPY #$01 : BEQ .not_below
|
||||||
CPY #$01 : BEQ .not_below
|
|
||||||
JSL GetRandomInt : AND.b #$3F : BNE ++
|
JSL GetRandomInt : AND.b #$3F : BNE ++
|
||||||
JSL $1DE612 ; Sprite_SpawnLightning
|
JSL $1DE612 ; Sprite_SpawnLightning
|
||||||
LDA #$30
|
LDA #$30
|
||||||
@@ -424,17 +409,12 @@ Sprite_Twinrova_Main:
|
|||||||
|
|
||||||
JSR RageModeMove
|
JSR RageModeMove
|
||||||
|
|
||||||
JSL GetRandomInt : AND.b #$0F : BNE +++
|
|
||||||
JSR RestoreFloorTile
|
|
||||||
+++
|
|
||||||
|
|
||||||
LDA.w SprTimerD, X : BNE +
|
LDA.w SprTimerD, X : BNE +
|
||||||
%GotoAction(1)
|
%GotoAction(1)
|
||||||
+
|
+
|
||||||
RTS
|
RTS
|
||||||
}
|
}
|
||||||
|
|
||||||
; -------------------------------------------------------
|
|
||||||
; 0x0A
|
; 0x0A
|
||||||
Twinrova_Dead:
|
Twinrova_Dead:
|
||||||
{
|
{
|
||||||
@@ -452,31 +432,25 @@ RageModeMove:
|
|||||||
{
|
{
|
||||||
; If timer is zero, determine a new movement mode
|
; If timer is zero, determine a new movement mode
|
||||||
LDA.w SprTimerA, X : BEQ .DetermineMovementMode
|
LDA.w SprTimerA, X : BEQ .DetermineMovementMode
|
||||||
|
; Execute current movement mode
|
||||||
; Execute current movement mode
|
LDA.w SprMiscA, X
|
||||||
LDA.w SprMiscA, X
|
CMP #$01 : BEQ .MoveTowardsPlayer
|
||||||
CMP #$01 : BEQ .MoveTowardsPlayer
|
CMP #$02 : BEQ .RandomStrafe
|
||||||
CMP #$02 : BEQ .RandomStrafe
|
CMP #$03 : BEQ .RandomDodge
|
||||||
CMP #$03 : BEQ .RandomDodge
|
CMP #$04 : BEQ .StayInPlace
|
||||||
CMP #$04 : BEQ .StayInPlace
|
JMP .UpdatePosition
|
||||||
|
|
||||||
JMP .UpdatePosition
|
|
||||||
|
|
||||||
.DetermineMovementMode
|
.DetermineMovementMode
|
||||||
|
|
||||||
; Determine random movement mode with weighted probabilities
|
; Determine random movement mode with weighted probabilities
|
||||||
JSL GetRandomInt
|
JSL GetRandomInt : AND.b #$0F
|
||||||
AND.b #$0F
|
CMP.b #$05 : BCC .SetMoveTowardsPlayer ; 0-5 -> Predictive movement towards player
|
||||||
CMP.b #$05
|
CMP.b #$0A : BCC .SetRandomStrafe ; 6-10 -> Random strafe
|
||||||
BCC .SetMoveTowardsPlayer ; 0-5 -> Predictive movement towards player
|
CMP.b #$0E : BCC .SetRandomDodge ; 11-14 -> Random dodge
|
||||||
CMP.b #$0A
|
; 15 -> Stay in place
|
||||||
BCC .SetRandomStrafe ; 6-10 -> Random strafe
|
LDA.b #$04 : STA.w SprMiscA, X
|
||||||
CMP.b #$0E
|
LDA.b #$30 : STA.w SprTimerA, X ; Set timer for 48 frames
|
||||||
BCC .SetRandomDodge ; 11-14 -> Random dodge
|
RTS
|
||||||
; 15 -> Stay in place
|
BRA .StayInPlace
|
||||||
LDA.b #$04 : STA.w SprMiscA, X
|
|
||||||
LDA.b #$30 : STA.w SprTimerA, X ; Set timer for 48 frames
|
|
||||||
RTS
|
|
||||||
BRA .StayInPlace
|
|
||||||
|
|
||||||
.SetMoveTowardsPlayer
|
.SetMoveTowardsPlayer
|
||||||
LDA.b #$01 : STA.w SprMiscA, X
|
LDA.b #$01 : STA.w SprMiscA, X
|
||||||
@@ -506,9 +480,7 @@ RageModeMove:
|
|||||||
|
|
||||||
.RandomDodge
|
.RandomDodge
|
||||||
; Random dodge with controlled movement
|
; Random dodge with controlled movement
|
||||||
JSL GetRandomInt
|
JSL GetRandomInt : AND.b #$03 : TAY
|
||||||
AND.b #$03
|
|
||||||
TAY
|
|
||||||
LDA VelocityOffsets+4, Y : STA.w SprXSpeed, X
|
LDA VelocityOffsets+4, Y : STA.w SprXSpeed, X
|
||||||
INY
|
INY
|
||||||
LDA VelocityOffsets, Y : STA.w SprYSpeed, X
|
LDA VelocityOffsets, Y : STA.w SprYSpeed, X
|
||||||
@@ -524,9 +496,7 @@ RageModeMove:
|
|||||||
|
|
||||||
.Evasive
|
.Evasive
|
||||||
; Evasive action if too close to player
|
; Evasive action if too close to player
|
||||||
JSL GetRandomInt
|
JSL GetRandomInt : AND.b #$03 : TAY
|
||||||
AND.b #$03
|
|
||||||
TAY
|
|
||||||
LDA VelocityOffsets, Y : EOR #$FF : INC : STA.w SprXSpeed, X
|
LDA VelocityOffsets, Y : EOR #$FF : INC : STA.w SprXSpeed, X
|
||||||
INY
|
INY
|
||||||
LDA VelocityOffsets+4, Y : EOR #$FF : INC : STA.w SprYSpeed, X
|
LDA VelocityOffsets+4, Y : EOR #$FF : INC : STA.w SprYSpeed, X
|
||||||
@@ -540,22 +510,14 @@ RageModeMove:
|
|||||||
DEC.w SprHeightS, X
|
DEC.w SprHeightS, X
|
||||||
|
|
||||||
.CheckGrounded
|
.CheckGrounded
|
||||||
; Move sprite
|
|
||||||
JSL Sprite_Move
|
JSL Sprite_Move
|
||||||
|
|
||||||
; Check for tile collision and bounce if necessary
|
|
||||||
JSL Sprite_BounceFromTileCollision
|
JSL Sprite_BounceFromTileCollision
|
||||||
|
|
||||||
; Reduce the state timer and reset state if necessary
|
|
||||||
DEC.w SprTimerA, X
|
|
||||||
RTS
|
RTS
|
||||||
}
|
}
|
||||||
|
|
||||||
DoRandomStrafe:
|
DoRandomStrafe:
|
||||||
{
|
{
|
||||||
; Random strafe with controlled movement
|
JSL GetRandomInt : AND.b #$03
|
||||||
JSL GetRandomInt
|
|
||||||
AND.b #$03
|
|
||||||
TAY
|
TAY
|
||||||
LDA VelocityOffsets, Y : STA.w SprXSpeed, X
|
LDA VelocityOffsets, Y : STA.w SprXSpeed, X
|
||||||
INY
|
INY
|
||||||
@@ -853,13 +815,8 @@ ApplyTwinrovaGraphics:
|
|||||||
; $1DC845
|
; $1DC845
|
||||||
#Fireball_Configure:
|
#Fireball_Configure:
|
||||||
{
|
{
|
||||||
LDA.w SprDefl,Y
|
LDA.w SprDefl, Y : ORA.b #$08 : STA.w SprDefl, Y
|
||||||
ORA.b #$08
|
LDA.b #$04 : STA.w SprBump, Y
|
||||||
STA.w SprDefl,Y
|
|
||||||
|
|
||||||
LDA.b #$04
|
|
||||||
STA.w SprBump,Y
|
|
||||||
|
|
||||||
.exit
|
.exit
|
||||||
RTS
|
RTS
|
||||||
}
|
}
|
||||||
@@ -867,43 +824,21 @@ ApplyTwinrovaGraphics:
|
|||||||
; $1DC879
|
; $1DC879
|
||||||
ReleaseFireballs:
|
ReleaseFireballs:
|
||||||
{
|
{
|
||||||
|
JSL Sprite_SpawnFireball : BMI .exit_a
|
||||||
|
JSR Fireball_Configure
|
||||||
|
|
||||||
JSL Sprite_SpawnFireball
|
PHX
|
||||||
BMI .exit_a
|
TYX
|
||||||
|
JSL Sprite_DirectionToFacePlayer
|
||||||
|
|
||||||
JSR Fireball_Configure
|
LDA.w .speed_x, Y : STA.w SprXSpeed, X
|
||||||
|
LDA.w .speed_y, Y : STA.w SprYSpeed, X
|
||||||
PHX
|
LDA.w SprX, X : CLC : ADC.w .offset_x_low,Y : STA.w SprX,X
|
||||||
TYX
|
LDA.w SprXH, X : ADC.w .offset_x_high, Y : STA.w SprXH, X
|
||||||
|
LDA.w SprY,X : CLC : ADC.w .offset_y_low,Y : STA.w SprY,X
|
||||||
JSL Sprite_DirectionToFacePlayer
|
LDA.w SprYH,X : ADC.w .offset_y_high,Y : STA.w SprYH,X
|
||||||
|
|
||||||
LDA.w .speed_x,Y
|
|
||||||
STA.w SprXSpeed,X
|
|
||||||
|
|
||||||
LDA.w .speed_y,Y
|
|
||||||
STA.w SprYSpeed,X
|
|
||||||
|
|
||||||
LDA.w SprX,X
|
|
||||||
CLC
|
|
||||||
ADC.w .offset_x_low,Y
|
|
||||||
STA.w SprX,X
|
|
||||||
|
|
||||||
LDA.w SprXH,X
|
|
||||||
ADC.w .offset_x_high,Y
|
|
||||||
STA.w SprXH,X
|
|
||||||
|
|
||||||
LDA.w SprY,X
|
|
||||||
CLC
|
|
||||||
ADC.w .offset_y_low,Y
|
|
||||||
STA.w SprY,X
|
|
||||||
|
|
||||||
LDA.w SprYH,X
|
|
||||||
ADC.w .offset_y_high,Y
|
|
||||||
STA.w SprYH,X
|
|
||||||
|
|
||||||
PLX
|
|
||||||
|
|
||||||
|
PLX
|
||||||
.exit_a
|
.exit_a
|
||||||
RTS
|
RTS
|
||||||
|
|
||||||
@@ -932,8 +867,7 @@ pushpc
|
|||||||
; =========================================================
|
; =========================================================
|
||||||
; Blind Maiden spawn code
|
; Blind Maiden spawn code
|
||||||
|
|
||||||
org $0DB818
|
SpritePrep_LoadProperties = $0DB818
|
||||||
SpritePrep_LoadProperties:
|
|
||||||
|
|
||||||
; Follower_BasicMover.dont_scare_kiki
|
; Follower_BasicMover.dont_scare_kiki
|
||||||
org $09A1E4
|
org $09A1E4
|
||||||
@@ -944,36 +878,36 @@ Follower_BasicMover:
|
|||||||
; Check if we are in room 0xAC
|
; Check if we are in room 0xAC
|
||||||
REP #$20
|
REP #$20
|
||||||
LDA.b $A0 : CMP.w #$00AC : BNE .no_blind_transform
|
LDA.b $A0 : CMP.w #$00AC : BNE .no_blind_transform
|
||||||
; ; Check room flag 0x65
|
; Check room flag 0x65
|
||||||
; LDA.l $7EF0CA : AND.w #$0100 : BEQ .no_blind_transform
|
; LDA.l $7EF0CA : AND.w #$0100 : BEQ .no_blind_transform
|
||||||
SEP #$20
|
SEP #$20
|
||||||
JSL Follower_CheckBlindTrigger : BCC .no_blind_transform
|
JSL Follower_CheckBlindTrigger : BCC .no_blind_transform
|
||||||
.blind_transform
|
.blind_transform
|
||||||
; Load follower animation step index from $02CF
|
; Load follower animation step index from $02CF
|
||||||
LDX.w $02CF
|
LDX.w $02CF
|
||||||
LDA.w $1A28, X : STA.b $00 ; Follower XL
|
LDA.w $1A28, X : STA.b $00 ; Follower XL
|
||||||
LDA.w $1A3C, X : STA.b $01 ; Follower XH
|
LDA.w $1A3C, X : STA.b $01 ; Follower XH
|
||||||
LDA.w $1A00, X : SEC : SBC.b #$10 : STA.b $02 ; Follower YL
|
LDA.w $1A00, X : SEC : SBC.b #$10 : STA.b $02 ; Follower YL
|
||||||
LDA.w $1A14, X : STA.b $03 ; Follower YH
|
LDA.w $1A14, X : STA.b $03 ; Follower YH
|
||||||
|
|
||||||
; Dismiss the follower and spawn Twinrova
|
; Dismiss the follower and spawn Twinrova
|
||||||
LDA.b #$00 : STA.l $7EF3CC
|
LDA.b #$00 : STA.l $7EF3CC
|
||||||
JSL Blind_SpawnFromMaiden
|
JSL Blind_SpawnFromMaiden
|
||||||
|
|
||||||
; Close the shutter door
|
; Close the shutter door
|
||||||
INC.w $0468
|
INC.w $0468
|
||||||
|
|
||||||
; Clear door tilemap position for some reason
|
; Clear door tilemap position for some reason
|
||||||
STZ.w $068E : STZ.w $0690
|
STZ.w $068E : STZ.w $0690
|
||||||
|
|
||||||
; TODO: Find out what submodule this is.
|
; TODO: Find out what submodule this is.
|
||||||
LDA.b #$05 : STA.b $11
|
LDA.b #$05 : STA.b $11
|
||||||
|
|
||||||
; SONG 15
|
; SONG 15
|
||||||
LDA.b #$15 : STA.w $012C
|
LDA.b #$15 : STA.w $012C
|
||||||
|
|
||||||
RTS
|
RTS
|
||||||
assert pc() <= $09A23A
|
assert pc() <= $09A23A
|
||||||
|
|
||||||
org $09A23A
|
org $09A23A
|
||||||
.no_blind_transform
|
.no_blind_transform
|
||||||
@@ -984,45 +918,40 @@ Follower_BasicMover:
|
|||||||
org $099E90
|
org $099E90
|
||||||
Follower_CheckBlindTrigger:
|
Follower_CheckBlindTrigger:
|
||||||
{
|
{
|
||||||
PHB : PHK : PLB
|
PHB : PHK : PLB
|
||||||
|
|
||||||
; Cache the follower's position
|
; Cache the follower's position
|
||||||
LDX.w $02CF
|
LDX.w $02CF
|
||||||
LDA.w $1A00, X : STA.b $00
|
LDA.w $1A00, X : STA.b $00
|
||||||
LDA.w $1A14, X : STA.b $01
|
LDA.w $1A14, X : STA.b $01
|
||||||
LDA.w $1A28, X : STA.b $02
|
LDA.w $1A28, X : STA.b $02
|
||||||
LDA.w $1A3C, X : STA.b $03
|
LDA.w $1A3C, X : STA.b $03
|
||||||
STZ.b $0B
|
STZ.b $0B
|
||||||
|
|
||||||
; Check if the follower is within the trigger area
|
|
||||||
LDA.w $1A50, X : STA.b $0A : BPL .positive_z
|
|
||||||
LDA.b #$FF : STA.b $0B
|
|
||||||
|
|
||||||
|
; Check if the follower is within the trigger area
|
||||||
|
LDA.w $1A50, X : STA.b $0A : BPL .positive_z
|
||||||
|
LDA.b #$FF : STA.b $0B
|
||||||
.positive_z
|
.positive_z
|
||||||
REP #$20
|
REP #$20
|
||||||
|
|
||||||
LDA.b $00 : CLC : ADC.b $0A : CLC : ADC.w #$000C : STA.b $00
|
LDA.b $00 : CLC : ADC.b $0A : CLC : ADC.w #$000C : STA.b $00
|
||||||
LDA.b $02 : CLC : ADC.w #$0008 : STA.b $02
|
LDA.b $02 : CLC : ADC.w #$0008 : STA.b $02
|
||||||
LDA.w #$1568 : SEC : SBC.b $00 : BPL .positive_x
|
LDA.w #$1568 : SEC : SBC.b $00 : BPL .positive_x
|
||||||
EOR.w #$FFFF : INC A
|
EOR.w #$FFFF : INC A
|
||||||
.positive_x
|
.positive_x
|
||||||
CMP.w #$0018 : BCS .fail
|
CMP.w #$0018 : BCS .fail
|
||||||
LDA.w #$1980 : SEC : SBC.b $02 : BPL .positive_y
|
LDA.w #$1980 : SEC : SBC.b $02 : BPL .positive_y
|
||||||
EOR.w #$FFFF : INC A
|
EOR.w #$FFFF : INC A
|
||||||
|
|
||||||
.positive_y
|
.positive_y
|
||||||
CMP.w #$0018
|
CMP.w #$0018 : BCS .fail
|
||||||
BCS .fail
|
.success
|
||||||
|
|
||||||
.success
|
|
||||||
SEP #$20
|
SEP #$20
|
||||||
PLB : SEC
|
PLB : SEC
|
||||||
RTL
|
RTL
|
||||||
|
|
||||||
.fail
|
.fail
|
||||||
SEP #$20
|
SEP #$20
|
||||||
PLB : CLC
|
PLB : CLC
|
||||||
RTL
|
RTL
|
||||||
}
|
}
|
||||||
|
|
||||||
; =========================================================
|
; =========================================================
|
||||||
@@ -1079,37 +1008,20 @@ assert pc() <= $1DA081
|
|||||||
org $1DA081
|
org $1DA081
|
||||||
SpritePrep_Blind_PrepareBattle:
|
SpritePrep_Blind_PrepareBattle:
|
||||||
{
|
{
|
||||||
; LDA.l $7EF3CC
|
; LDA.l $7EF3CC
|
||||||
; CMP.b #$06 ; FOLLOWER 06
|
; CMP.b #$06 ; FOLLOWER 06
|
||||||
; BEQ .despawn
|
; BEQ .despawn
|
||||||
|
LDA.w $0403 : AND.b #$20 : BEQ .despawn
|
||||||
LDA.w $0403
|
LDA.b #$60 : STA.w SprTimerC,X
|
||||||
AND.b #$20
|
LDA.b #$01 : STA.w SprMiscB,X
|
||||||
BEQ .despawn
|
LDA.b #$02 : STA.w SprMiscC,X
|
||||||
|
LDA.b #$04 : STA.w SprMiscE,X
|
||||||
LDA.b #$60
|
LDA.b #$07 : STA.w $0DC0,X
|
||||||
STA.w SprTimerC,X
|
|
||||||
|
|
||||||
LDA.b #$01
|
|
||||||
STA.w SprMiscB,X
|
|
||||||
|
|
||||||
LDA.b #$02
|
|
||||||
STA.w SprMiscC,X
|
|
||||||
|
|
||||||
LDA.b #$04
|
|
||||||
STA.w SprMiscE,X
|
|
||||||
|
|
||||||
LDA.b #$07
|
|
||||||
STA.w $0DC0,X
|
|
||||||
|
|
||||||
STZ.w $0B69
|
STZ.w $0B69
|
||||||
|
|
||||||
RTL
|
RTL
|
||||||
|
|
||||||
.despawn
|
.despawn
|
||||||
STZ.w SprState,X
|
STZ.w SprState,X
|
||||||
|
RTL
|
||||||
RTL
|
|
||||||
}
|
}
|
||||||
|
|
||||||
assert pc() <= $1DA0B1
|
assert pc() <= $1DA0B1
|
||||||
@@ -1126,100 +1038,79 @@ org $01B3E1
|
|||||||
org $1DA0B1
|
org $1DA0B1
|
||||||
BlindLaser_SpawnTrailGarnish:
|
BlindLaser_SpawnTrailGarnish:
|
||||||
{
|
{
|
||||||
LDA.w SprDelay,X
|
LDA.w SprDelay,X : AND.b #$00 : BNE .exit
|
||||||
AND.b #$00
|
|
||||||
BNE .exit
|
|
||||||
|
|
||||||
PHX
|
PHX
|
||||||
TXY
|
TXY
|
||||||
|
|
||||||
LDX.b #$1D
|
LDX.b #$1D
|
||||||
|
|
||||||
.next_slot
|
.next_slot
|
||||||
LDA.l $7FF800,X
|
LDA.l $7FF800,X : BEQ .free_slot
|
||||||
BEQ .free_slot
|
|
||||||
|
|
||||||
DEX
|
DEX
|
||||||
BPL .next_slot
|
BPL .next_slot
|
||||||
|
|
||||||
DEC.w $0FF8
|
DEC.w $0FF8
|
||||||
BPL .use_search_index
|
BPL .use_search_index
|
||||||
|
|
||||||
LDA.b #$1D
|
LDA.b #$1D : STA.w $0FF8
|
||||||
STA.w $0FF8
|
|
||||||
|
|
||||||
.use_search_index
|
.use_search_index
|
||||||
LDX.w $0FF8
|
LDX.w $0FF8
|
||||||
|
|
||||||
.free_slot
|
.free_slot
|
||||||
LDA.b #$0F ; GARNISH 0F
|
LDA.b #$0F ; GARNISH 0F
|
||||||
STA.l $7FF800,X
|
STA.l $7FF800, X
|
||||||
STA.w $0FB4
|
STA.w $0FB4
|
||||||
|
|
||||||
LDA.w $0DC0,Y
|
LDA.w $0DC0,Y : STA.l $7FF9FE,X
|
||||||
STA.l $7FF9FE,X
|
TYA : STA.l $7FF92C,X
|
||||||
|
|
||||||
TYA
|
LDA.w SprX,Y : STA.l $7FF83C,X
|
||||||
STA.l $7FF92C,X
|
LDA.w SprXH,Y : STA.l $7FF878,X
|
||||||
|
LDA.w SprY,Y : CLC : ADC.b #$10 : STA.l $7FF81E,X
|
||||||
|
LDA.w SprYH,Y : ADC.b #$00 : STA.l $7FF85A,X
|
||||||
|
|
||||||
LDA.w SprX,Y
|
LDA.b #$0A : STA.l $7FF90E,X
|
||||||
STA.l $7FF83C,X
|
|
||||||
|
|
||||||
LDA.w SprXH,Y
|
PLX
|
||||||
STA.l $7FF878,X
|
|
||||||
|
|
||||||
LDA.w SprY,Y
|
|
||||||
CLC
|
|
||||||
ADC.b #$10
|
|
||||||
STA.l $7FF81E,X
|
|
||||||
|
|
||||||
LDA.w SprYH,Y
|
|
||||||
ADC.b #$00
|
|
||||||
STA.l $7FF85A,X
|
|
||||||
|
|
||||||
LDA.b #$0A
|
|
||||||
STA.l $7FF90E,X
|
|
||||||
|
|
||||||
PLX
|
|
||||||
|
|
||||||
.exit
|
.exit
|
||||||
RTL
|
RTL
|
||||||
}
|
}
|
||||||
|
|
||||||
; =========================================================
|
; =========================================================
|
||||||
; Mantle and Maiden
|
; Mantle and Maiden
|
||||||
|
|
||||||
org $068841
|
org $068841
|
||||||
JSL NewMantlePrep
|
JSL NewMantlePrep
|
||||||
RTS
|
RTS
|
||||||
|
|
||||||
org $1AFC52
|
org $1AFC52
|
||||||
db $06 ; check for maiden instead of zelda
|
db $06 ; check for maiden instead of zelda
|
||||||
|
|
||||||
org $1AFCA7
|
org $1AFCA7
|
||||||
; Tiles
|
; Tiles
|
||||||
db $0C, $0E, $0C, $2C, $2E, $2C
|
db $0C, $0E, $0C, $2C, $2E, $2C
|
||||||
; Mantle Properties :
|
; Mantle Properties :
|
||||||
db $3D, $3D, $7D, $3D, $3D, $7D
|
db $3D, $3D, $7D, $3D, $3D, $7D
|
||||||
|
|
||||||
pullpc
|
pullpc
|
||||||
|
|
||||||
NewMantlePrep:
|
NewMantlePrep:
|
||||||
{
|
{
|
||||||
LDA.w SprY, X : CLC : ADC.b #$07 : STA.w SprY, X
|
LDA.w SprY, X : CLC : ADC.b #$07 : STA.w SprY, X
|
||||||
LDA.w SprX, X : CLC : ADC.b #$08 : STA.w SprX, X
|
LDA.w SprX, X : CLC : ADC.b #$08 : STA.w SprX, X
|
||||||
|
LDA $7EF0DA : AND #$0F : BEQ +
|
||||||
LDA $7EF0DA : AND #$0F : BEQ +
|
LDA.w SprX, X : CLC : ADC.b #$28 : STA.w SprX, X
|
||||||
LDA.w SprX, X : CLC : ADC.b #$28 : STA.w SprX, X
|
+
|
||||||
+
|
RTL
|
||||||
|
|
||||||
RTL
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pushpc
|
pushpc
|
||||||
|
|
||||||
org $09A1EC
|
org $09A1EC : JSL CheckForMaidenInLibrary
|
||||||
JSL CheckForMaidenInLibrary
|
|
||||||
|
|
||||||
; Prevent mantle from setting spawn point
|
; Prevent mantle from setting spawn point
|
||||||
org $1AFC6D
|
org $1AFC6D
|
||||||
@@ -1232,19 +1123,15 @@ pullpc
|
|||||||
CheckForMaidenInLibrary:
|
CheckForMaidenInLibrary:
|
||||||
{
|
{
|
||||||
LDA $A0 : CMP.b #$BD : BNE .notTheLibrary
|
LDA $A0 : CMP.b #$BD : BNE .notTheLibrary
|
||||||
LDA $11 : BNE .notTheLibrary
|
LDA $11 : BNE .notTheLibrary
|
||||||
LDA $7FF9D2 : BNE .dialogue_played
|
LDA $7FF9D2 : BNE .dialogue_played
|
||||||
LDA #$1D : LDY #$00
|
LDA #$1D : LDY #$00
|
||||||
JSL Sprite_ShowMessageUnconditional
|
JSL Sprite_ShowMessageUnconditional
|
||||||
LDA #$01 : STA $7FF9D2
|
LDA #$01 : STA $7FF9D2
|
||||||
|
.dialogue_played
|
||||||
.dialogue_played
|
|
||||||
|
|
||||||
.notTheLibrary
|
.notTheLibrary
|
||||||
|
|
||||||
; Check for blind room vanilla
|
; Check for blind room vanilla
|
||||||
REP #$20
|
REP #$20
|
||||||
LDA.b $A0
|
LDA.b $A0
|
||||||
|
|
||||||
RTL
|
RTL
|
||||||
}
|
}
|
||||||
|
|||||||
Binary file not shown.
Reference in New Issue
Block a user