Add keese to twinrova gfx, spawn ice/fire keese randomly

This commit is contained in:
scawful
2025-01-19 12:20:58 -05:00
parent f37e570e77
commit aef81e8032
2 changed files with 179 additions and 292 deletions

View File

@@ -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.