From 02df9c4856a1704f42d655327b142045bd0dac5f Mon Sep 17 00:00:00 2001 From: scawful Date: Mon, 6 Jan 2025 17:52:35 -0500 Subject: [PATCH] Boss housekeeping --- Sprites/Bosses/dark_link.asm | 91 ++-- Sprites/Bosses/kydreeok.asm | 67 +-- Sprites/Bosses/kydreeok_head.asm | 218 ++++----- Sprites/Bosses/octoboss.asm | 798 +++++++++++++------------------ Sprites/Bosses/twinrova.asm | 4 +- 5 files changed, 475 insertions(+), 703 deletions(-) diff --git a/Sprites/Bosses/dark_link.asm b/Sprites/Bosses/dark_link.asm index 2304265..68c89f3 100644 --- a/Sprites/Bosses/dark_link.asm +++ b/Sprites/Bosses/dark_link.asm @@ -198,24 +198,21 @@ Sprite_DarkLink_Main: SEP #$20 LDA.w SprTimerC, X : BNE ++ ; attempt a slash if we can - LDA.w SprMiscD, X : BNE + - STZ.w SprFrame, X - BRA .skipdirections + STZ.w SprFrame, X + BRA .skipdirections + LDA.w SprMiscD, X : CMP #$01 : BNE + - LDA.b #06 : STA.w SprFrame, X - BRA .skipdirections + LDA.b #06 : STA.w SprFrame, X + BRA .skipdirections + LDA.w SprMiscD, X : CMP #$02 : BNE + - LDA.b #12 : STA.w SprFrame, X - BRA .skipdirections + LDA.b #12 : STA.w SprFrame, X + BRA .skipdirections + LDA.b #18 : STA.w SprFrame, X + - .skipdirections - JSR SpawnSwordDamage %GotoAction(1) ++ @@ -228,46 +225,38 @@ Sprite_DarkLink_Main: LDA.w $0354 : CMP #$27 : BEQ .attemptToDodge - CMP #$02 : BEQ .attemptToDodge - CMP #$06 : BEQ .attemptToDodge - CMP #$0F : BNE .toofardodge - - ; only once per slash ! - + CMP #$02 : BEQ .attemptToDodge + CMP #$06 : BEQ .attemptToDodge + CMP #$0F : BNE .toofardodge + ; only once per slash ! .attemptToDodge ;check if we are using spin attack LDA.b $3C : CMP #$90 : BNE .nospin - - ; determine if player is going to dodge it or not - LDA $1A : AND #$01 : BEQ .dodge - + ; determine if player is going to dodge it or not + LDA $1A : AND #$01 : BEQ .dodge .nospin LDA.w SprMiscB, X : CMP.w $0354 : BEQ .toofardodge + LDA.w SprMiscC, X : BNE .enrageddodge + LDA $1A : AND #$03 : BEQ .toofardodge ; 50/50 chances of dodging + BRA .dodge + .enrageddodge + LDA $1A : AND #$07 : BEQ .toofardodge ; 50/50 chances of dodging - LDA.w SprMiscC, X : BNE .enrageddodge - LDA $1A : AND #$03 : BEQ .toofardodge ; 50/50 chances of dodging - BRA .dodge - .enrageddodge - LDA $1A : AND #$07 : BEQ .toofardodge ; 50/50 chances of dodging - - .dodge - LDA #$16 - JSL Sprite_ApplySpeedTowardsPlayer - LDA.w SprXSpeed, X : EOR #$FF : STA.w SprXSpeed, X - LDA.w SprYSpeed, X : EOR #$FF : STA.w SprYSpeed, X - LDA.b #$1A : STA.w $0F80,X - - %GotoAction(2) - - RTS + .dodge + LDA #$16 + JSL Sprite_ApplySpeedTowardsPlayer + LDA.w SprXSpeed, X : EOR #$FF : STA.w SprXSpeed, X + LDA.w SprYSpeed, X : EOR #$FF : STA.w SprYSpeed, X + LDA.b #$1A : STA.w $0F80,X + %GotoAction(2) + RTS .toofardodge SEP #$20 - .linknotattacking LDA.w $0354 : STA.w SprMiscB, X @@ -275,22 +264,22 @@ Sprite_DarkLink_Main: STZ $03 ; y direction LDA.w SprXSpeed, X : BPL .positiveX - STA $02 - EOR #$FF + STA $02 + EOR #$FF .positiveX STA $00 ; X speed (abs) LDA.w SprYSpeed, X : BPL .positiveY - STA $03 - EOR #$FF + STA $03 + EOR #$FF .positiveY STA $01 ; Y speed (abs) LDA.w SprXSpeed, X : CMP.b #$08 : BCC .zeroXSpeed - BPL .positiveXspeed - LDA #$F0 : STA.w SprXSpeed, X - BRA .doYspeed + BPL .positiveXspeed + LDA #$F0 : STA.w SprXSpeed, X + BRA .doYspeed .positiveXspeed LDA #$10 : STA.w SprXSpeed, X BRA .doYspeed @@ -298,10 +287,9 @@ Sprite_DarkLink_Main: STZ.w SprXSpeed, X .doYspeed LDA.w SprYSpeed, X : CMP.b #$08 : BCC .zeroYSpeed - BPL .positiveYspeed - LDA #$F0 : STA.w SprYSpeed, X - BRA .ignorezerospeed + LDA #$F0 : STA.w SprYSpeed, X + BRA .ignorezerospeed .positiveYspeed LDA #$10 : STA.w SprYSpeed, X BRA .ignorezerospeed @@ -414,12 +402,11 @@ Sprite_DarkLink_Main: ActionJumpTable: - dw JumpAttack ;00 - dw Cape ;02 - dw Bomb ;04 - dw BombThrow ;04 - ;dw Walk ;06 - + dw JumpAttack ;00 + dw Cape ;02 + dw Bomb ;04 + dw BombThrow ;04 + ;dw Walk ;06 Bomb: diff --git a/Sprites/Bosses/kydreeok.asm b/Sprites/Bosses/kydreeok.asm index 56d0bf6..d9514ab 100644 --- a/Sprites/Bosses/kydreeok.asm +++ b/Sprites/Bosses/kydreeok.asm @@ -68,7 +68,7 @@ Sprite_Kydreeok_Prep: STZ.w Neck1_OffsetX : STZ.w Neck1_OffsetY STZ.w Neck2_OffsetX : STZ.w Neck2_OffsetY - STZ.w Neck3_OffsetX : STZ.w Neck3_OffsetY + ; STZ.w Neck3_OffsetX : STZ.w Neck3_OffsetY JSR ApplyPalette @@ -121,21 +121,17 @@ MaybeRespawnHead: RTS } - ; ========================================================= Sprite_Kydreeok_Main: { - LDA.w SprAction, X - JSL UseImplicitRegIndexedLocalJumpTable - - dw Kydreeok_Start ; 00 - dw Kydreeok_StageControl ; 01 - dw Kydreeok_MoveXandY ; 02 - dw Kydreeok_MoveXorY ; 03 - dw Kydreeok_KeepWalking ; 04 - dw Kydreeok_Dead ; 05 - dw Kydreeok_Flying ; 06 + %SpriteJumpTable(Kydreeok_Start, + Kydreeok_StageControl, + Kydreeok_MoveXandY, + Kydreeok_MoveXorY, + Kydreeok_KeepWalking, + Kydreeok_Dead, + Kydreeok_Flying) ; ------------------------------------------------------- ; 0x00 @@ -324,21 +320,21 @@ Sprite_Kydreeok_Main: ; ========================================================= -Offspring1_Neck1_X = $19EA -Offspring1_Neck2_X = $19EC -Offspring1_Neck3_X = $19EE +LeftNeck1_X = $19EA +LeftNeck2_X = $19EC +LeftNeck3_X = $19EE -Offspring1_Neck1_Y = $19EB -Offspring1_Neck2_Y = $19ED -Offspring1_Neck3_Y = $19EF +LeftNeck1_Y = $19EB +LeftNeck2_Y = $19ED +LeftNeck3_Y = $19EF -Offspring2_Neck1_X = $19F0 -Offspring2_Neck2_X = $19F2 -Offspring2_Neck3_X = $19F4 +RightNeck1_X = $19F0 +RightNeck2_X = $19F2 +RightNeck3_X = $19F4 -Offspring2_Neck1_Y = $19F1 -Offspring2_Neck2_Y = $19F3 -Offspring2_Neck3_Y = $19F5 +RightNeck1_Y = $19F1 +RightNeck2_Y = $19F3 +RightNeck3_Y = $19F5 Offspring3_Neck1_X = $1A78 Offspring3_Neck2_X = $1A7A @@ -353,27 +349,21 @@ SpawnLeftHead: LDA #$CF JSL Sprite_SpawnDynamically : BMI .return TYA : STA.w Offspring1_Id - ;store the sub-type LDA.b #$00 : STA $0E30, Y PHX - ; code that controls where to spawn the offspring. REP #$20 LDA.w SprCachedX : SEC : SBC.w #$0010 SEP #$20 STA.w SprX, Y : XBA : STA.w SprXH, Y - REP #$20 LDA.w SprCachedY : SEC : SBC.w #$000F SEP #$20 STA.w SprY, Y : XBA : STA.w SprYH, Y - LDA.w SprX, Y STA.w SprMiscA, Y : STA.w $19EA : STA.w $19EC : STA.w $19EE LDA.w SprY, Y : STA.w $19EB : STA.w $19ED : STA.w $19EF : STA.w SprY, Y STA.w SprMiscB, Y - TYX - STZ.w SprYRound, X STZ.w SprXRound, X PLX @@ -382,44 +372,34 @@ SpawnLeftHead: } ; ========================================================= - ; SpawnCenterHead: ; { ; LDA #$CF - ; JSL Sprite_SpawnDynamically : BMI .return ; TYA : STA.w Offspring3_Id - ; ;store the sub-type ; LDA.b #$02 : STA $0E30, Y - ; PHX ; ; code that controls where to spawn the offspring. ; REP #$20 ; LDA.w SprCachedX : CLC : ADC.w #$0004 ; SEP #$20 ; STA.w SprX, Y : XBA : STA.w SprXH, Y - ; REP #$20 ; LDA.w SprCachedY : SEC : SBC.w #$000F ; SEP #$20 ; STA.w SprY, Y : XBA : STA.w SprYH, Y - ; LDA.w SprX, Y : STA.w SprX, Y ; STA.w SprMiscA, Y : STA.w $1A78 : STA.w $1A7A : STA.w $1A7C ; LDA.w SprY, Y : STA.w $1A79 : STA.w $1A7B : STA.w $1A7D : STA.w SprY, Y ; STA.w SprMiscB, Y - ; TYX - ; STZ.w SprYRound, X ; STZ.w SprXRound, X ; PLX - ; .return ; RTS ; } - ; ========================================================= SpawnRightHead: @@ -427,28 +407,21 @@ SpawnRightHead: LDA #$CF JSL Sprite_SpawnDynamically : BMI .return TYA : STA.w Offspring2_Id - - ;store the sub-type LDA.b #$01 : STA $0E30, Y PHX - ; code that controls where to spawn the offspring. REP #$20 LDA.w SprCachedX : CLC : ADC.w #$000D SEP #$20 STA.w SprX, Y : XBA : STA.w SprXH, Y - REP #$20 LDA.w SprCachedY : SEC : SBC.w #$000F SEP #$20 STA.w SprY, Y : XBA : STA.w SprYH, Y - LDA.w SprX, Y : STA.w SprX, Y STA.w SprMiscA, Y : STA.w $19F0 : STA.w $19F2 : STA.w $19F4 LDA.w SprY, Y : STA.w $19F1 : STA.w $19F3 : STA.w $19F5 : STA.w SprY, Y STA.w SprMiscB, Y - TYX - STZ.w SprYRound, X STZ.w SprXRound, X PLX diff --git a/Sprites/Bosses/kydreeok_head.asm b/Sprites/Bosses/kydreeok_head.asm index e4ce0e2..f5dc495 100644 --- a/Sprites/Bosses/kydreeok_head.asm +++ b/Sprites/Bosses/kydreeok_head.asm @@ -30,6 +30,7 @@ !ImperviousArrow = 00 ; 01 = Impervious to arrows !ImpervSwordHammer = 00 ; 01 = Impervious to sword and hammer attacks !Boss = 00 ; 00 = normal sprite, 01 = sprite is a boss + %Set_Sprite_Properties(Sprite_KydreeokHead_Prep, Sprite_KydreeokHead_Long) Sprite_KydreeokHead_Long: @@ -48,7 +49,6 @@ Sprite_KydreeokHead_Long: ; ========================================================= -print "KydreeokHead_Prep: ", pc Sprite_KydreeokHead_Prep: { PHB : PHK : PLB @@ -192,7 +192,6 @@ Sprite_KydreeokHead_Main: RTS } - KydreeokHead_SummonFire: { %MoveTowardPlayer(10) @@ -204,55 +203,19 @@ Sprite_KydreeokHead_Main: .not_done RTS } - } KydreeokHead_RotationMove: { - ; ; Reset targetting mode - ; LDA.w SprTimerE, X : BNE + - ; STZ.w SprMiscE, X - ; + - ; LDA.w SprMiscE, X : BEQ .continue_move - ; LDA.b #$04 - ; JSL Sprite_ApplySpeedTowardsPlayer - ; JSL Sprite_Move - ; JSR MoveWithBody - ; RTS - ; .continue_move - JSL GetRandomInt : AND #$0F : TAY LDA.w SpeedTable, Y : STA.w SprXSpeed, X : STA $00 JSL GetRandomInt : AND #$0F : TAY LDA.w SpeedTable, Y : STA.w SprYSpeed, X : STA $01 - ; JSL Sprite_Move JSR KydreeokHead_NeckControl JSR MoveWithBody JSR RotateHeadUsingSpeedValues - - ; JSL GetRandomInt : AND #$7F : BNE .no_independent - ; LDA.b #$01 : STA.w SprMiscE, X - ; LDA.b #$10 : STA.w SprTimerE, X - ; .no_independent - RTS -} - -Sprite_KydreeokHead_Damage_Flash: -{ - LDA.w SprMiscE, X : BEQ .dontFlash - ; Change the palette to the next in the cycle - LDA.w SprMiscE, X : INC : CMP.b #$08 : BNE .dontReset - LDA.b #$00 - .dontReset - STA.w SprMiscE, X - BRA .flash - - .dontFlash - STZ.w SprMiscE, X - - .flash RTS } @@ -279,39 +242,33 @@ CoordinateBasedRotation: ; 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 + 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 + db 0, -3, -8, -11, -15, -15, -11, -8 + db -3, 0, 3, 8, 11, 15, 15, 11 ; ========================================================= RotateHeadUsingSpeedValues: { LDY.w Neck_Index - LDA.w SprXSpeed, X : CLC : ADC.w XSpeedSin, Y : ASL : STA.w SprXSpeed, X LDA.w SprYSpeed, X : CLC : ADC.w YSpeedSin, Y : ASL : STA.w SprYSpeed, X - INY : CPY #$3F : BNE .not_full LDY.b #$00 .not_full STY.w Neck_Index JSL Sprite_MoveLong RTS -} -XSpeedSin: -{ +#XSpeedSin: db 0, 3, 6, 9, 12, 15, 18, 20, 23, 25 db 27, 28, 30, 31, 31, 32 -} -YSpeedSin: -{ +#YSpeedSin: db 32, 32, 31, 31 db 30, 28, 27, 25, 23, 20, 18, 15, 12, 9 db 6, 3, 0, -3, -6, -9, -12, -15, -18, -20 @@ -331,7 +288,7 @@ YSpeedSin: RandomlyAttack: { - JSR Sprite_KydreeokHead_Damage_Flash + JSL Sprite_DamageFlash_Long JSL GetRandomInt : AND #$7F : BNE .no_attack CLC JSL GetRandomInt : AND #$0F : BNE .no_attack @@ -354,16 +311,16 @@ MoveWithBody: LDA.w SprX, Y : SEC : SBC #$0F STA.w SprMiscA, X - STA.w $19EA : DEC - STA.w $19EC : DEC - STA.w $19EE + STA.w LeftNeck1_X : DEC + STA.w LeftNeck2_X : DEC + STA.w LeftNeck3_X ; STA.w SprX, X LDA.w SprY, Y : SEC : SBC #$0F STA.w SprMiscB, X - STA.w $19EB - ; STA.w $19ED - ; STA.w $19EF + STA.w LeftNeck1_Y + ; STA.w LeftNeck2_Y + ; STA.w LeftNeck3_Y ; STA.w SprY, X RTS @@ -390,29 +347,30 @@ MoveWithBody: Neck1_Control: { - ; Set head pos - LDA $19EE : STA.w SprX, X - LDA $19EF : STA.w SprY, X + LDA.w LeftNeck3_X : STA.w SprX, X + LDA.w LeftNeck3_Y : STA.w SprY, X LDA.w SprX, X : STA.w SprMiscC, X LDA.w SprY, X : STA.w SprMiscD, X + LDA.w SprXSpeed, X : STA $08 LDA.w SprYSpeed, X : STA $09 - LDA.w $19EA : STA $02 ; x - LDA.w $19EB : STA $03 ; y + LDA.w LeftNeck1_X : STA $02 ; x + LDA.w LeftNeck1_Y : STA $03 ; y LDA.w SprX, X : STA $04 LDA.w SprY, X : STA $05 - JSR GetDistance8bit : CMP #$08 : BCC .TooCloseToHead ; is body1 too close to the head? + + JSR GetDistance8bit : CMP #$08 : BCC .TooCloseToHead ; is body1 too close to the head? LDA.w SprX, X : STA $04 ; dest X LDA.w SprXH, X : STA $05 ; dest XH LDA.w SprY, X : STA $06 ; dest Y LDA.w SprYH, X : STA $07 ; dest YH ; load body position into sprite position - LDA.w $19EA : STA.w SprX, X - LDA.w $19EB : STA.w SprY, X + LDA.w LeftNeck1_X : STA.w SprX, X + LDA.w LeftNeck1_Y : STA.w SprY, X LDA #$06 JSL Sprite_ProjectSpeedTowardsEntityLong @@ -420,26 +378,28 @@ Neck1_Control: LDA.b $00 : STA.w SprYSpeed, X JSL Sprite_MoveLong - LDA.w SprX, X : STA.w $19EA - LDA.w SprY, X : STA.w $19EB + LDA.w SprX, X : STA.w LeftNeck1_X + LDA.w SprY, X : STA.w LeftNeck1_Y .TooCloseToHead ; Do body part 2 - LDA.w $19EC : STA $02 ; x - LDA.w $19ED : STA $03 ; y + LDA.w LeftNeck2_X : STA $02 ; x + LDA.w LeftNeck2_Y : STA $03 ; y - LDA.w $19EA : STA $04 - LDA.w $19EB : STA $05 - JSR GetDistance8bit : CMP #$0D : BCC .TooCloseToBodyPart1 ; is body1 too close to the head? - LDA.w $19EA : STA $04 ; dest X + LDA.w LeftNeck1_X : STA $04 + LDA.w LeftNeck1_Y : STA $05 + + ; is body1 too close to the head? + JSR GetDistance8bit : CMP #$0D : BCC .TooCloseToBodyPart1 + LDA.w LeftNeck1_X : STA $04 ; dest X LDA.w SprXH, X : STA $05 ; dest XH - LDA.w $19EB : STA $06 ; dest Y + LDA.w LeftNeck1_Y : STA $06 ; dest Y LDA.w SprYH, X : STA $07 ; dest YH ;load body position into sprite position - LDA.w $19EC : STA.w SprX, X - LDA.w $19ED : STA.w SprY, X + LDA.w LeftNeck2_X : STA.w SprX, X + LDA.w LeftNeck2_Y : STA.w SprY, X LDA #$06 JSL Sprite_ProjectSpeedTowardsEntityLong @@ -447,32 +407,33 @@ Neck1_Control: LDA.b $00 : STA.w SprYSpeed, X JSL Sprite_MoveLong - LDA.w SprX, X : STA.w $19EC - LDA.w SprY, X : STA.w $19ED + LDA.w SprX, X : STA.w LeftNeck2_X + LDA.w SprY, X : STA.w LeftNeck2_Y .TooCloseToBodyPart1 ; Do body part 2 - LDA.w $19EE : STA $02 ; x - LDA.w $19EF : STA $03 ; y + LDA.w LeftNeck3_X : STA $02 ; x + LDA.w LeftNeck3_Y : STA $03 ; y + LDA.w LeftNeck2_X : STA $04 + LDA.w LeftNeck2_Y : STA $05 - LDA.w $19EC : STA $04 - LDA.w $19ED : STA $05 - JSR GetDistance8bit : CMP #$14 : BCC .TooCloseToBodyPart2 ; is body1 too close to the head? - LDA.w $19EC : STA $04 ; dest X - LDA.w SprXH, X : STA $05 ; dest XH - LDA.w $19ED : STA $06 ; dest Y - LDA.w SprYH, X : STA $07 ; dest YH - ;load body position into sprite position - LDA.w $19EE : STA.w SprX, X - LDA.w $19EF : STA.w SprY, X + ; is body1 too close to the head? + JSR GetDistance8bit : CMP #$14 : BCC .TooCloseToBodyPart2 + LDA.w LeftNeck2_X : STA $04 ; dest X + LDA.w SprXH, X : STA $05 ; dest XH + LDA.w LeftNeck2_Y : STA $06 ; dest Y + LDA.w SprYH, X : STA $07 ; dest YH + ; load body position into sprite position + LDA.w LeftNeck3_X : STA.w SprX, X + LDA.w LeftNeck3_Y : STA.w SprY, X LDA #$06 JSL Sprite_ProjectSpeedTowardsEntityLong LDA.b $01 : STA.w SprXSpeed, X LDA.b $00 : STA.w SprYSpeed, X JSL Sprite_MoveLong - LDA.w SprX, X : STA.w $19EE - LDA.w SprY, X : STA.w $19EF + LDA.w SprX, X : STA.w LeftNeck3_X + LDA.w SprY, X : STA.w LeftNeck3_Y .TooCloseToBodyPart2 LDA.w SprMiscC, X : STA.w SprX, X @@ -484,7 +445,6 @@ Neck1_Control: Neck2_Control: { - ; Set head pos LDA $19F4 : STA.w SprX, X LDA $19F5 : STA.w SprY, X @@ -498,7 +458,7 @@ Neck2_Control: LDA.w SprX, X : STA $04 LDA.w SprY, X : STA $05 - JSR GetDistance8bit : CMP #$08 : BCC .TooCloseToHead2 ; is body1 too close to the head? + JSR GetDistance8bit : CMP #$08 : BCC .TooCloseToHead2 ; is body1 too close to the head? LDA.w SprX, X : STA $04 ; dest X LDA.w SprXH, X : STA $05 ; dest XH LDA.w SprY, X : STA $06 ; dest Y @@ -512,8 +472,8 @@ Neck2_Control: LDA.b $01 : STA.w SprXSpeed, X LDA.b $00 : STA.w SprYSpeed, X JSL Sprite_MoveLong - LDA.w SprX, X : STA.w $19F0 - LDA.w SprY, X : STA.w $19F1 + LDA.w SprX, X : STA.w $19F0 + LDA.w SprY, X : STA.w $19F1 .TooCloseToHead2 @@ -522,7 +482,9 @@ Neck2_Control: LDA.w $19F0 : STA $04 LDA.w $19F1 : STA $05 - JSR GetDistance8bit : CMP #$0D : BCC .TooCloseToBodyPart12 ; is body1 too close to the head? + + ; is body1 too close to the head? + JSR GetDistance8bit : CMP #$0D : BCC .TooCloseToBodyPart12 LDA.w $19F0 : STA $04 ; dest X LDA.w SprXH, X : STA $05 ; dest XH @@ -587,40 +549,43 @@ KydreeokHead_NeckControl: Sprite_KydreeokHead_DrawNeck: { - ; Dumb draw neck code LDA.w SprSubtype, X : CMP.b #$01 : BEQ .neck2 - LDA.w $19EE : STA.w SprCachedX - LDA.w $19EF : CLC : ADC.b #$06 : STA.w SprCachedY + LDA.w LeftNeck3_X : STA.w SprCachedX + LDA.w LeftNeck3_Y : CLC : ADC.b #$06 : STA.w SprCachedY JSR DrawNeckPart - LDA.w $19EC : STA.w SprCachedX - LDA.w $19ED : STA.w SprCachedY + LDA.w LeftNeck2_X : STA.w SprCachedX + LDA.w LeftNeck2_Y : STA.w SprCachedY JSR DrawNeckPart + LDA.w SprCachedY : SEC : SBC.b #$0A : STA.w SprCachedY JSR DrawNeckPart - LDA.w $19EA : STA.w SprCachedX - LDA.w $19EB : SEC : SBC.b #$04 : STA.w SprCachedY + LDA.w LeftNeck1_X : STA.w SprCachedX + LDA.w LeftNeck1_Y : SEC : SBC.b #$04 : STA.w SprCachedY JSR DrawNeckPart + LDA.w SprCachedY : SEC : SBC.b #$0A : STA.w SprCachedY JSR DrawNeckPart BRA .skipNeck .neck2 - LDA.w $19F4 : STA.w SprCachedX - LDA.w $19F5 : CLC : ADC.b #$06 : STA.w SprCachedY + LDA.w RightNeck3_X : STA.w SprCachedX + LDA.w RightNeck3_Y : CLC : ADC.b #$06 : STA.w SprCachedY JSR DrawNeckPart - LDA.w $19F2 : STA.w SprCachedX - LDA.w $19F3 : STA.w SprCachedY + LDA.w RightNeck2_X : STA.w SprCachedX + LDA.w RightNeck2_Y : STA.w SprCachedY JSR DrawNeckPart + LDA.w SprCachedY : SEC : SBC.b #$0A : STA.w SprCachedY JSR DrawNeckPart - LDA.w $19F0 : STA.w SprCachedX - LDA.w $19F1 : SEC : SBC.b #$04 : STA.w SprCachedY + LDA.w RightNeck1_X : STA.w SprCachedX + LDA.w RightNeck1_Y : SEC : SBC.b #$04 : STA.w SprCachedY JSR DrawNeckPart + LDA.w SprCachedY : SEC : SBC.b #$0A : STA.w SprCachedY JSR DrawNeckPart @@ -633,29 +598,25 @@ Sprite_KydreeokHead_DrawNeck: DrawNeckPart: { - PHY - JSL Sprite_PrepOamCoord - PLY - + PHY : JSL Sprite_PrepOamCoord : PLY REP #$20 LDA $00 : STA ($90), Y : AND.w #$0100 : STA $0E : INY LDA $02 : STA ($90), Y : CLC : ADC #$0010 : CMP.w #$0100 SEP #$20 BCC .on_screen_y2 - LDA.b #$F0 : STA ($90), Y ; Put the sprite out of the way - STA $0E + ; Put the sprite out of the way + LDA.b #$F0 : STA ($90), Y : STA $0E .on_screen_y2 - INY - LDA #$2E : STA ($90), Y ; Set the Char - INY - LDA #$39 : ORA $08 : STA ($90), Y ; Set the Properties - - PHY - TYA : LSR #2 : TAY - LDA #$02 : ORA $0F : STA ($92), Y ; store size in oam buffer - PLY : INY - - RTS + INY + LDA #$2E : STA ($90), Y ; Set the Char + INY + LDA #$39 : ORA $08 : STA ($90), Y ; Set the Properties + PHY + TYA : LSR #2 : TAY + LDA #$02 : ORA $0F : STA ($92), Y ; store size in oam buffer + PLY + INY + RTS } ; ========================================================= @@ -667,8 +628,7 @@ Sprite_KydreeokHead_Draw: LDA $0DC0, X : CLC : ADC $0D90, X : TAY;Animation Frame LDA .start_index, Y : STA $06 - - LDA.w SprMiscE, X : STA $08 + LDA.w SprFlash, X : STA $08 PHX ; amount of tiles - 1 diff --git a/Sprites/Bosses/octoboss.asm b/Sprites/Bosses/octoboss.asm index 52ab15d..162e175 100644 --- a/Sprites/Bosses/octoboss.asm +++ b/Sprites/Bosses/octoboss.asm @@ -17,73 +17,60 @@ Sprite_Octoboss_Long: PHB : PHK : PLB LDA.w SprMiscD, X : BNE + ; is the sprite already init - LDA #$04 : STA.w SprNbrOAM, X - ;LDA.w SprHitbox, X : AND.b #$E0 : ORA.b #$23 : STA.w SprHitbox, X - ;LDA.w SprDefl, X : AND #$7F : ORA.b #$81 : STA.w SprDefl, X - ;LDA.b #$20 : STA.w SprHealth, X - STZ.w SprBulletproof, X + LDA #$04 : STA.w SprNbrOAM, X + ;LDA.w SprHitbox, X : AND.b #$E0 : ORA.b #$23 : STA.w SprHitbox, X + ;LDA.w SprDefl, X : AND #$7F : ORA.b #$81 : STA.w SprDefl, X + ;LDA.b #$20 : STA.w SprHealth, X + STZ.w SprBulletproof, X - ; TODO: Add a safety check to prevent player from leaving without the item - ; example if player left without the item, item will be on the ground still - ; when he'll came back on that screen - PHX + ; TODO: Add a safety check to prevent player from leaving without the item + ; example if player left without the item, item will be on the ground still + ; when he'll came back on that screen + PHX + LDX.b $8A + LDA.l $7EF280, X : AND.b #$40 : BEQ .notKiledYet + PLX ; get back SPR index + ; Is is killed? do we have the quake medallion tho ? + LDA.l $7EF349 : BNE .weHaveMedallion + ; Spawn the medallion + STZ.w SprState, X + JSR SpawnMedallionAlt ; spawn standing medallion + BRA .SpriteIsNotActive + .weHaveMedallion + ; Do nothing just kill this sprite + STZ.w SprState, X + BRA .SpriteIsNotActive + .notKiledYet - LDX.b $8A - LDA.l $7EF280, X : AND.b #$40 : BEQ .notKiledYet - PLX ; get back SPR index - ; Is is killed? do we have the quake medallion tho ? - LDA.l $7EF349 : BNE .weHaveMedallion - ; Spawn the medallion - STZ.w SprState, X - JSR SpawnMedallionAlt ; spawn standing medallion - BRA .SpriteIsNotActive - - .weHaveMedallion - ; Do nothing just kill this sprite - - STZ.w SprState, X - BRA .SpriteIsNotActive - - .notKiledYet - - PLX - - - ;LDA.w SprGfxProps, X : AND.b #$BF : STA.w SprGfxProps, X - ;LDA.w SprProps, X : AND.b #$BF : STA.w SprProps, X - - LDA.b #15 : STA.w SprFrame, X - LDA.b #$87 : STA.l $7EC664 : STA.l $7EC684 - LDA.b #$55 : STA.l $7EC665 : STA.l $7EC685 - INC.b $15 - INC.w SprMiscD, X ; increase it so sprite is initialized - LDA.l $7EF343 : INC : STA.l $7EF343 + PLX + ;LDA.w SprGfxProps, X : AND.b #$BF : STA.w SprGfxProps, X + ;LDA.w SprProps, X : AND.b #$BF : STA.w SprProps, X + LDA.b #15 : STA.w SprFrame, X + LDA.b #$87 : STA.l $7EC664 : STA.l $7EC684 + LDA.b #$55 : STA.l $7EC665 : STA.l $7EC685 + INC.b $15 + INC.w SprMiscD, X ; increase it so sprite is initialized + LDA.l $7EF343 : INC : STA.l $7EF343 + LDA.w SprMiscF, X : BNE + - JSR Sprite_Octoboss_Draw ; Call the draw code - BRA ++ + JSR Sprite_Octoboss_Draw + BRA ++ + - JSR Sprite_Octoboss_Draw2 ; Call the draw code + JSR Sprite_Octoboss_Draw2 ++ - JSL Sprite_CheckActive ; Check if game is not paused - BCC .SpriteIsNotActive ; Skip Main code is sprite is innactive - - - LDA.w SprMiscF, X : BNE + - - JSR Sprite_Octoboss_Main ; Call the main sprite code - BRA .SpriteIsNotActive - + - JSR Sprite_Octoboss_Secondary ; Call the Secondary sprite code - + JSL Sprite_CheckActive : BCC .SpriteIsNotActive + LDA.w SprMiscF, X : BNE + + JSR Sprite_Octoboss_Main + BRA .SpriteIsNotActive + + + JSR Sprite_Octoboss_Secondary .SpriteIsNotActive - PLB ; Get back the databank we stored previously - RTL ; Go back to original code + PLB + RTL } - Sprite_Octoboss_Main: { LDA.w SprAction, X @@ -122,44 +109,43 @@ Sprite_Octoboss_Secondary: dw IdleWait ; 06 dw SubmergeForeverKill ; 07 - WaitForPlayerToApproach: + { REP #$20 LDA.b $20 : CMP #$08C8 SEP #$20 BCS .TooFar - INC.w SprAction, X - STZ.w SprFrame, X - JSR SpawnSplash + INC.w SprAction, X + STZ.w SprFrame, X + JSR SpawnSplash .TooFar RTS - - ; 08B8 - + } Emerge: + { INC.w $02E4 ; prevent link from moving LDA.w SprTimerB, X : BNE + - LDA.w SprFrame, X : INC : STA.w SprFrame, X : CMP.b #8 : BCC .noframereset - INC.w SprAction, X - .noframereset - LDA.b #2 : STA.w SprTimerB, X + LDA.w SprFrame, X : INC : STA.w SprFrame, X : CMP.b #8 : BCC .noframereset + INC.w SprAction, X + .noframereset + LDA.b #2 : STA.w SprTimerB, X + RTS - + } EmergedShowMessage: - LDA.b #$48 - LDY.b #$00 - JSL Sprite_ShowMessageUnconditional + { + %ShowUnconditionalMessage($0048) INC.w SprAction, X RTS + } WaitDialog: RTS - SpawnAndAwakeHisBrother: + { LDA.b #$40 : STA.w SprTimerC, X ; Will need to adjust LDA.b #$3C JSL Sprite_SpawnDynamically @@ -167,417 +153,368 @@ Sprite_Octoboss_Secondary: STA.w BrotherSpr, X ; keep the brother id LDA.b #$D0 : STA.w SprY, Y LDA.b #$08 : STA.w SprYH, Y - LDA.b #$20 : STA.w SprX, Y LDA.b #$09 : STA.w SprXH, Y - - LDA.b #$01 : STA.w SprMiscF, Y LDA.b #$00 : STA.w SprFrame, Y ; Do the spawning code INC.w SprAction, X - - RTS - + } WaitForBrotherEmerge: + { LDA.w SprTimerC, X : BNE + - LDA.b #$49 - LDY.b #$00 - JSL Sprite_ShowMessageUnconditional - LDA #$16 : STA.w SprTimerC, X - INC.w SprAction, X + LDA.b #$49 + LDY.b #$00 + JSL Sprite_ShowMessageUnconditional + LDA #$16 : STA.w SprTimerC, X + INC.w SprAction, X + RTS + } SpawnPirateHats: + { LDA.w SprTimerC, X : CMP #$14 : BNE + - PHX - JSR SpawnBossPoof - PLX + PHX + JSR SpawnBossPoof + PLX - PHX - LDA.w BrotherSpr, X : TAX - JSR SpawnBossPoof - PLX + PHX + LDA.w BrotherSpr, X : TAX + JSR SpawnBossPoof + PLX + LDY.w BrotherSpr, X LDA.w SprTimerC, X : CMP #$0A : BNE + - LDA.b #10 : STA.w SprFrame, X - LDA.b #10 : STA.w SprFrame, Y + LDA.b #10 : STA.w SprFrame, X + LDA.b #10 : STA.w SprFrame, Y + ; Spawn Walls too LDA.w SprTimerC, X : BNE + - LDA.w SprAction, Y : INC : STA.w SprAction, Y - LDA.b #$40 - STA.w SprTimerC, Y - STA.w SprTimerC, X + LDA.w SprAction, Y : INC : STA.w SprAction, Y + LDA.b #$40 + STA.w SprTimerC, Y + STA.w SprTimerC, X - STZ.w $02E4 ; allow link to move again + STZ.w $02E4 ; allow link to move again - INC.w SprAction, X + INC.w SprAction, X - ; All the tiles spawned by the sprite - ; you can use a sprite/item to get location from ZS - ; and use the macro GetTilePos($x,$y) + ; All the tiles spawned by the sprite + ; you can use a sprite/item to get location from ZS + ; and use the macro GetTilePos($x,$y) - ;------------------------------------------------------------- - PHX - REP #$30 - %GetTilePos($0F, $07) - LDA.w #$068F - JSL $1BC97C ; Overworld_DrawMap16_Persist + PHX + %mode16() - %GetTilePos($10, $07) - LDA.w #$068F - JSL $1BC97C ; Overworld_DrawMap16_Persist + %GetTilePos($0F, $07) + LDA.w #$068F : JSL Overworld_DrawMap16_Persist - %GetTilePos($11, $07) - LDA.w #$068F - JSL $1BC97C ; Overworld_DrawMap16_Persist + %GetTilePos($10, $07) + LDA.w #$068F : JSL Overworld_DrawMap16_Persist + %GetTilePos($11, $07) + LDA.w #$068F : JSL Overworld_DrawMap16_Persist - %GetTilePos($0F, $08) - LDA.w #$06A4 - JSL $1BC97C ; Overworld_DrawMap16_Persist + %GetTilePos($0F, $08) + LDA.w #$06A4 : JSL Overworld_DrawMap16_Persist - %GetTilePos($10, $08) - LDA.w #$06A4 - JSL $1BC97C ; Overworld_DrawMap16_Persist + %GetTilePos($10, $08) + LDA.w #$06A4 : JSL Overworld_DrawMap16_Persist - %GetTilePos($11, $08) - LDA.w #$06A4 - JSL $1BC97C ; Overworld_DrawMap16_Persist - SEP #$30 - PLX - LDA.b #$01 - STA.b $14 - ;------------------------------------------------------------- + %GetTilePos($11, $08) + LDA.w #$06A4 : JSL Overworld_DrawMap16_Persist + + %mode8() + PLX + LDA.b #$01 : STA.b $14 + RTS - - + } IdlePhase: + { LDA.w SprTimerC, X : CMP.b #$08 : BNE + - JSL Sprite_SpawnFireball + JSL Sprite_SpawnFireball + - - LDA.w SprTimerC, X : BNE + - INC.w SprAction, X + INC.w SprAction, X + LDA.w SprTimerB, X : BNE + - LDA.b #$01 : STA.w SprHeight, X - LDA.w SprFrame, X : INC : STA.w SprFrame, X : CMP.b #12 : BCC .noframereset - LDA.b #10 : STA.w SprFrame, X - STZ.w SprHeight, X - .noframereset - LDA.b #18 : STA.w SprTimerB, X + LDA.b #$01 : STA.w SprHeight, X + LDA.w SprFrame, X : INC : STA.w SprFrame, X : CMP.b #12 : BCC .noframereset + LDA.b #10 : STA.w SprFrame, X + STZ.w SprHeight, X + .noframereset + LDA.b #18 : STA.w SprTimerB, X + - LDA.w SprMiscF, X : BNE + ; is it the red octopus? (blue doesn't need to run that) - JSR ReturnTotalHealth ; return the health total of both sprite - CMP.b #$30 : BCS .tooMuchHealth - LDA.b #$09 : STA.w SprAction, X ; go to wait message action - .tooMuchHealth + JSR ReturnTotalHealth : CMP.b #$30 : BCS .tooMuchHealth + LDA.b #$09 : STA.w SprAction, X ; go to wait message action + .tooMuchHealth + - JSL Sprite_CheckDamageFromPlayer RTS + } PickDirection: + { JSL GetRandomInt : AND.b #$1F : SEC : SBC #$10 : STA.w SprXSpeed, X JSL GetRandomInt : AND.b #$1F : SEC : SBC #$10 : STA.w SprYSpeed, X INC.w SprAction, X - JSL GetRandomInt : AND.b #$4F : CLC : ADC.b #$1F : STA.w SprTimerC, X - - RTS - + } Moving: + { LDA.w SprTimerC, X : BNE + - DEC.w SprAction, X - DEC.w SprAction, X - JSL GetRandomInt : AND.b #$4F : CLC : ADC.b #$1F : STA.w SprTimerC, X + DEC.w SprAction, X + DEC.w SprAction, X + JSL GetRandomInt : AND.b #$4F : CLC : ADC.b #$1F : STA.w SprTimerC, X + - JSL Sprite_Move LDA.w SprTimerB, X : BNE + - LDA.b #$01 : STA.w SprHeight, X - LDA.w SprFrame, X : INC : STA.w SprFrame, X : CMP.b #12 : BCC .noframereset - LDA.b #10 : STA.w SprFrame, X - STZ.w SprHeight, X - .noframereset - LDA.b #10 : STA.w SprTimerB, X + LDA.b #$01 : STA.w SprHeight, X + LDA.w SprFrame, X : INC : STA.w SprFrame, X : CMP.b #12 : BCC .noframereset + LDA.b #10 : STA.w SprFrame, X + STZ.w SprHeight, X + .noframereset + LDA.b #10 : STA.w SprTimerB, X + - LDA.w SprX, X : CMP.b #$E2 : BCC .notTooFarRight - LDA.w SprXSpeed, X : BMI .notTooFarRight - EOR.b #$FF : STA.w SprXSpeed, X + LDA.w SprXSpeed, X : BMI .notTooFarRight + EOR.b #$FF : STA.w SprXSpeed, X .notTooFarRight - LDA.w SprX, X : CMP.b #$80 : BCS .notTooFarLeft - LDA.w SprXSpeed, X : BPL .notTooFarLeft - EOR.b #$FF : STA.w SprXSpeed, X + LDA.w SprXSpeed, X : BPL .notTooFarLeft + EOR.b #$FF : STA.w SprXSpeed, X .notTooFarLeft - - LDA.w SprY, X : CMP.b #$FB : BCC .notTooFarDown - LDA.w SprYSpeed, X : BMI .notTooFarDown - EOR.b #$FF : STA.w SprYSpeed, X + LDA.w SprYSpeed, X : BMI .notTooFarDown + EOR.b #$FF : STA.w SprYSpeed, X .notTooFarDown - LDA.w SprY, X : CMP.b #$B8 : BCS .notTooFarUp - LDA.w SprYSpeed, X : BPL .notTooFarUp - EOR.b #$FF : STA.w SprYSpeed, X + LDA.w SprYSpeed, X : BPL .notTooFarUp + EOR.b #$FF : STA.w SprYSpeed, X .notTooFarUp JSR HandleMovingSplash - JSL Sprite_CheckDamageFromPlayer - - JSR ReturnTotalHealth ; return the health total of both sprite - CMP.b #$30 : BCS .tooMuchHealth - LDA.b #$09 : STA.w SprAction, X ; go to wait message action + JSR ReturnTotalHealth : CMP.b #$30 : BCS .tooMuchHealth + LDA.b #$09 : STA.w SprAction, X ; go to wait message action .tooMuchHealth RTS - + } Moving2: + { LDA.w SprTimerC, X : BNE + - DEC.w SprAction, X - DEC.w SprAction, X - JSL GetRandomInt : AND.b #$4F : CLC : ADC.b #$1F : STA.w SprTimerC, X + DEC.w SprAction, X + DEC.w SprAction, X + JSL GetRandomInt : AND.b #$4F : CLC : ADC.b #$1F : STA.w SprTimerC, X + - JSL Sprite_Move LDA.w SprTimerB, X : BNE + - LDA.b #$01 : STA.w SprHeight, X - LDA.w SprFrame, X : INC : STA.w SprFrame, X : CMP.b #12 : BCC .noframereset - LDA.b #10 : STA.w SprFrame, X - STZ.w SprHeight, X - .noframereset - LDA.b #10 : STA.w SprTimerB, X + LDA.b #$01 : STA.w SprHeight, X + LDA.w SprFrame, X : INC : STA.w SprFrame, X : CMP.b #12 : BCC .noframereset + LDA.b #10 : STA.w SprFrame, X + STZ.w SprHeight, X + .noframereset + LDA.b #10 : STA.w SprTimerB, X + - LDA.w SprX, X : CMP.b #$78 : BCC .notTooFarRight - LDA.w SprXSpeed, X : BMI .notTooFarRight - EOR.b #$FF : STA.w SprXSpeed, X + LDA.w SprXSpeed, X : BMI .notTooFarRight + EOR.b #$FF : STA.w SprXSpeed, X .notTooFarRight - LDA.w SprX, X : CMP.b #$10 : BCS .notTooFarLeft - LDA.w SprXSpeed, X : BPL .notTooFarLeft - EOR.b #$FF : STA.w SprXSpeed, X + LDA.w SprXSpeed, X : BPL .notTooFarLeft + EOR.b #$FF : STA.w SprXSpeed, X .notTooFarLeft - - LDA.w SprY, X : CMP.b #$FB : BCC .notTooFarDown - LDA.w SprYSpeed, X : BMI .notTooFarDown - EOR.b #$FF : STA.w SprYSpeed, X + LDA.w SprYSpeed, X : BMI .notTooFarDown + EOR.b #$FF : STA.w SprYSpeed, X .notTooFarDown - LDA.w SprY, X : CMP.b #$B8 : BCS .notTooFarUp - LDA.w SprYSpeed, X : BPL .notTooFarUp - EOR.b #$FF : STA.w SprYSpeed, X + LDA.w SprYSpeed, X : BPL .notTooFarUp + EOR.b #$FF : STA.w SprYSpeed, X .notTooFarUp JSR HandleMovingSplash - JSL Sprite_CheckDamageFromPlayer - RTS - + } WaitMessageBeforeSurrender: + { ; display message 4A ; Wait! WAIT! please! LDY.w BrotherSpr, X LDA.b #$06 : STA.w SprAction, Y ; set brother to action 6 - LDA.b #$50 : STA.w SprTimerC, X ; set timer to remove hat, surrender - LDA.b #$4A - LDY.b #$00 - JSL Sprite_ShowMessageUnconditional + %SetTimerC($50) ; set timer to remove hat, surrender + %ShowUnconditionalMessage($004A) INC.w SprAction, X ; go to remove hat routine - RTS + } - RemoveHat: + RemoveHat: + { INC.w $02E4 STZ.b $5D ; kill link action ; Use timer to remove hat like when it's spawning LDA.w SprTimerC, X : CMP #$34 : BNE + - PHX - JSR SpawnBossPoof - PLX + PHX + JSR SpawnBossPoof + PLX - PHX - LDA.w BrotherSpr, X : TAX - JSR SpawnBossPoof - PLX + PHX + LDA.w BrotherSpr, X : TAX + JSR SpawnBossPoof + PLX + LDY.w BrotherSpr, X LDA.w SprTimerC, X : CMP #$3A : BNE + - LDA.b #9 : STA.w SprFrame, X - LDA.b #9 : STA.w SprFrame, Y + LDA.b #9 : STA.w SprFrame, X + LDA.b #9 : STA.w SprFrame, Y + LDA.w SprTimerC, X : BNE + - LDA.b #$4B - LDY.b #$00 - JSL Sprite_ShowMessageUnconditional - INC.w SprAction, X ; surrender message + LDA.b #$4B + LDY.b #$00 + JSL Sprite_ShowMessageUnconditional + INC.w SprAction, X ; surrender message + RTS - + } Submerge: + { ; display message 4B ; Surrender message LDA.w SprTimerB, X : BNE + - LDA.w SprFrame, X : DEC : STA.w SprFrame, X : CMP.b #01 : BCS .noframereset - JSR SpawnSplash - INC.w SprAction, X ; surrender message - LDA.b #15 : STA.w SprFrame, X - LDA.b #$B0 : STA.w SprX, X - LDA.b #$08 : STA.w SprXH, X : STA.w SprYH, X - LDA.b #$D4 : STA.w SprY, X - LDA.b #$90 : STA.w SprTimerC, X - .noframereset - LDA.b #2 : STA.w SprTimerB, X - + - + LDA.w SprFrame, X : DEC : STA.w SprFrame, X : CMP.b #01 : BCS .noframereset + JSR SpawnSplash + INC.w SprAction, X ; surrender message + LDA.b #15 : STA.w SprFrame, X + LDA.b #$B0 : STA.w SprX, X + LDA.b #$08 : STA.w SprXH, X : STA.w SprYH, X + LDA.b #$D4 : STA.w SprY, X + LDA.b #$90 : STA.w SprTimerC, X + .noframereset + LDA.b #2 : STA.w SprTimerB, X + + RTS + } SubmergeWaitWall: + { ; go under water to get the item - move back to original position - LDA.w SprTimerC, X : BNE + - STZ.w SprFrame, X - INC.w SprAction, X - LDA.b #$40 : STA.w SprTimerC, X + STZ.w SprFrame, X + INC.w SprAction, X + LDA.b #$40 : STA.w SprTimerC, X + LDA.w SprTimerC, X : CMP.b #$40 : BNE + - ;------------------------------------------------------------- - PHX - REP #$30 - %GetTilePos($0F, $07) - LDA.w #$0034 - JSL $1BC97C ; Overworld_DrawMap16_Persist + PHX + %mode16() - %GetTilePos($10, $07) - LDA.w #$0034 - JSL $1BC97C ; Overworld_DrawMap16_Persist + %GetTilePos($0F, $07) + LDA.w #$0034 : JSL Overworld_DrawMap16_Persist - %GetTilePos($11, $07) - LDA.w #$0034 - JSL $1BC97C ; Overworld_DrawMap16_Persist + %GetTilePos($10, $07) + LDA.w #$0034 : JSL Overworld_DrawMap16_Persist + %GetTilePos($11, $07) + LDA.w #$0034 : JSL Overworld_DrawMap16_Persist - %GetTilePos($0F, $08) - LDA.w #$0034 - JSL $1BC97C ; Overworld_DrawMap16_Persist + %GetTilePos($0F, $08) + LDA.w #$0034 : JSL Overworld_DrawMap16_Persist - %GetTilePos($10, $08) - LDA.w #$0034 - JSL $1BC97C ; Overworld_DrawMap16_Persist + %GetTilePos($10, $08) + LDA.w #$0034 : JSL Overworld_DrawMap16_Persist - %GetTilePos($11, $08) - LDA.w #$0034 - JSL $1BC97C ; Overworld_DrawMap16_Persist - SEP #$30 - PLX - LDA.b #$01 - STA.b $14 - ;------------------------------------------------------------- + %GetTilePos($11, $08) + LDA.w #$0034 : JSL Overworld_DrawMap16_Persist + + %mode8() + PLX + LDA.b #$01 : STA.b $14 + RTS + } EmergeWaitGiveItem: + { ; Emerge back wait few frames, throw item in the middle moat, despawn wall - LDA.w SprTimerB, X : BNE + - LDA.w SprFrame, X : INC : STA.w SprFrame, X : CMP.b #9 : BCC .noframereset - LDA.b #$09 : STA.w SprFrame, X - .noframereset - LDA.b #2 : STA.w SprTimerB, X + LDA.w SprFrame, X : INC : STA.w SprFrame, X : CMP.b #9 : BCC .noframereset + LDA.b #$09 : STA.w SprFrame, X + .noframereset + LDA.b #2 : STA.w SprTimerB, X + - - LDA.w SprTimerC, X : BNE .noItemYet - INC.w SprAction, X - - JSR SpawnMedallion - - LDY.w BrotherSpr, X - LDA.b #$07 : STA.w SprAction, Y - ; Throw item here - - PHX - LDX.b $8A - LDA.l $7EF280, X : ORA.b #$40 : STA.l $7EF280, X ; save in HP sram - PLX - + INC.w SprAction, X + JSR SpawnMedallion + LDY.w BrotherSpr, X + LDA.b #$07 : STA.w SprAction, Y + ; Throw item here + PHX + LDX.b $8A + LDA.l $7EF280, X : ORA.b #$40 : STA.l $7EF280, X ; save in HP sram + PLX .noItemYet - RTS + } SubmergeForeverKill: + { ; Set overworld sram flag for object collected on that screen STZ.w $02E4 ; allow link to move - LDA.w SprTimerB, X : BNE + - LDA.w SprFrame, X : DEC : STA.w SprFrame, X : CMP.b #01 : BCS .noframereset - JSR SpawnSplash - STZ.w SprState, X - .noframereset - LDA.b #2 : STA.w SprTimerB, X + LDA.w SprFrame, X : DEC : STA.w SprFrame, X : CMP.b #01 : BCS .noframereset + JSR SpawnSplash + STZ.w SprState, X + .noframereset + LDA.b #2 : STA.w SprTimerB, X + RTS - - + } IdleWait: RTS - - - ReturnTotalHealth: + { LDY.w BrotherSpr, X LDA.w SprHealth, Y : STA.b $00 - LDA.w SprHealth, X : CLC : ADC.b $00 RTS + } } - -; ========================================================= - Sprite_Octoboss_Draw: { JSL Sprite_PrepOamCoord JSL Sprite_OAM_AllocateDeferToPlayer - LDA $0DC0, X : CLC : ADC $0D90, X : TAY;Animation Frame + LDA $0DC0, X : CLC : ADC SprFrame, X : TAY;Animation Frame LDA .start_index, Y : STA $06 @@ -725,14 +662,12 @@ Sprite_Octoboss_Draw: } -; ========================================================= - Sprite_Octoboss_Draw2: { JSL Sprite_PrepOamCoord JSL Sprite_OAM_AllocateDeferToPlayer - LDA $0DC0, X : CLC : ADC $0D90, X : TAY;Animation Frame + LDA $0DC0, X : CLC : ADC SprFrame, X : TAY;Animation Frame LDA .start_index, Y : STA $06 @@ -877,214 +812,133 @@ Sprite_Octoboss_Draw2: } SpawnSplash: +{ LDA.b #$EC ; SPRITE EC - JSL Sprite_SpawnDynamically - BMI .exit - - JSL Sprite_SetSpawnedCoords - - LDA.b #$03 - STA.w SprState,Y - - LDA.b #$0F - STA.w SprTimerA,Y - - LDA.b #$00 - STA.w $0D80,Y - - LDA.b #$03 - STA.w SprNbrOAM,Y - - LDA.b #$28 ; SFX2.28 - JSL Sound_SetSfx2PanLong - + JSL Sprite_SpawnDynamically : BMI .exit + JSL Sprite_SetSpawnedCoords + LDA.b #$03 : STA.w SprState, Y + LDA.b #$0F : STA.w SprTimerA, Y + LDA.b #$00 : STA.w $0D80, Y + LDA.b #$03 : STA.w SprNbrOAM,Y + LDA.b #$28 : JSL Sound_SetSfx2PanLong .exit - RTS - - +} SpawnBossPoof: - LDA.b #$0C ; SFX2.0C +{ + LDA.b #$0C STA.w $012E - LDA.b #$CE ; SPRITE CE + LDA.b #$CE JSL Sprite_SpawnDynamically - LDA.b $00 - CLC - ADC.b #$10 - STA.w SprX,Y - - LDA.b $01 - ADC.b #$00 - STA.w SprXH,Y - - LDA.b $02 - CLC - ADC.b #$08 - STA.w SprY,Y - - LDA.b $03 - ADC.b #$00 - STA.w SprYH,Y - - LDA.b #$0F - STA.w $0DC0,Y - - LDA.b #$01 - STA.w $0D90,Y - - LDA.b #$2F - STA.w SprTimerA,Y + LDA.b $00 : CLC : ADC.b #$10 : STA.w SprX,Y + LDA.b $01 : ADC.b #$00 : STA.w SprXH,Y + LDA.b $02 : CLC : ADC.b #$08 : STA.w SprY,Y + LDA.b $03 : ADC.b #$00 : STA.w SprYH,Y + LDA.b #$0F : STA.w $0DC0,Y + LDA.b #$01 : STA.w SprFrame,Y + LDA.b #$2F : STA.w SprTimerA,Y LDA.b #$09 STA.w SprNbrOAM,Y STA.w SprBulletproof,Y RTS - - - +} HandleMovingSplash: - LDA.b $1A - AND.b #$0F - BNE .exit +{ + LDA.b $1A : AND.b #$0F : BNE .exit + LDA.b #$28 : JSL Sound_SetSfx2PanLong + PHX + TXY + LDX.b #$1D + LDA.w SprYSpeed, Y : BMI .next_slot + LDX.b #$0E + .next_slot + LDA.l $7FF800,X : BNE .slot_occupied - LDA.b #$28 ; SFX2.28 - JSL Sound_SetSfx2PanLong + LDA.b #$15 ; GARNISH 15 + STA.l $7FF800,X + STA.w $0FB4 - PHX + LDA.w SprX,Y : STA.l $7FF83C,X + LDA.w SprXH,Y : STA.l $7FF878,X + CLC : ADC.b #$18 : STA.l $7FF81E,X + LDA.w SprYH,Y : STA.l $7FF85A,X + LDA.b #$0F : STA.l $7FF90E,X - TXY - LDX.b #$1D + PLX + RTS - LDA.w SprYSpeed,Y - BMI .next_slot - - LDX.b #$0E - - .next_slot - LDA.l $7FF800,X - BNE .slot_occupied - - LDA.b #$15 ; GARNISH 15 - STA.l $7FF800,X - STA.w $0FB4 - - LDA.w SprX,Y - STA.l $7FF83C,X - - LDA.w SprXH,Y - STA.l $7FF878,X - - LDA.w SprY,Y - CLC - ADC.b #$18 - STA.l $7FF81E,X - - LDA.w SprYH,Y - STA.l $7FF85A,X - - LDA.b #$0F - STA.l $7FF90E,X - - PLX - - RTS - - ; --------------------------------------------------------- - - .slot_occupied - DEX - BPL .next_slot - - PLX + .slot_occupied + DEX + BPL .next_slot + PLX .exit RTS - +} SpawnMedallion: +{ LDA.b #$C0 ; SPRITE C0 - JSL Sprite_SpawnDynamically - BMI .exit + JSL Sprite_SpawnDynamically : BMI .exit - JSL $09AE64 ; Sprite_SetSpawnedCoordinates + JSL $09AE64 ; Sprite_SetSpawnedCoordinates - PHX - TYX + PHX + TYX - LDA.b #$10 - STA.w SprXSpeed, X + LDA.b #$10 : STA.w SprXSpeed, X - LDA.b #$30 - STA.w $0F80, X + LDA.b #$30 : STA.w $0F80, X + LDA.b #$11 : STA.w SprFrame, X ; ITEMGET 11 - LDA.b #$11 ; ITEMGET 11 - STA.w $0D90, X + LDA.b #$20 ; SFX2.20 + JSL $0DBB7C ; SpriteSFX_QueueSFX2WithPan - LDA.b #$20 ; SFX2.20 - JSL $0DBB7C ; SpriteSFX_QueueSFX2WithPan + LDA.b #$83 : STA.w SprNbrOAM,X + LDA.b #$58 : STA.w SprGfxProps,X + AND.b #$0F : STA.w SprProps,X - LDA.b #$83 - STA.w SprNbrOAM,X + PLX - LDA.b #$58 - STA.w SprGfxProps,X + PHX + PHY - AND.b #$0F - STA.w SprProps,X + LDA.b #$1C + JSL $00D4ED ; WriteTo4BPPBuffer_item_gfx - PLX - - PHX - PHY - - LDA.b #$1C - JSL $00D4ED ; WriteTo4BPPBuffer_item_gfx - - PLY - PLX + PLY + PLX .exit RTS - +} SpawnMedallionAlt: +{ LDA.b #$C0 ; SPRITE C0 - JSL Sprite_SpawnDynamically - BMI .exit - - PHX - TYX - - LDA.b #$11 ; ITEMGET 11 - STA.w $0D90, X - - LDA.b #$83 - STA.w SprNbrOAM,X - - LDA.b #$58 - STA.w SprGfxProps,X - - AND.b #$0F - STA.w SprProps,X - - LDA.b #$DC : STA.w SprY, X - LDA.b #$F7 : STA.w SprX, X - LDA.b #$08 : STA.w SprYH, X : STA.w SprXH, X - PLX - - PHX - PHY - - LDA.b #$1C - JSL $00D4ED ; WriteTo4BPPBuffer_item_gfx - - PLY - PLX - + JSL Sprite_SpawnDynamically : BMI .exit + PHX + TYX + LDA.b #$11 ; ITEMGET 11 + STA.w SprFrame, X + LDA.b #$83 : STA.w SprNbrOAM,X + LDA.b #$58 : STA.w SprGfxProps,X + AND.b #$0F : STA.w SprProps,X + LDA.b #$DC : STA.w SprY, X + LDA.b #$F7 : STA.w SprX, X + LDA.b #$08 : STA.w SprYH, X : STA.w SprXH, X + PLX + PHX + PHY + LDA.b #$1C : JSL $00D4ED ; WriteTo4BPPBuffer_item_gfx + PLY + PLX .exit RTS +} diff --git a/Sprites/Bosses/twinrova.asm b/Sprites/Bosses/twinrova.asm index 410c9a2..b976d67 100644 --- a/Sprites/Bosses/twinrova.asm +++ b/Sprites/Bosses/twinrova.asm @@ -59,8 +59,7 @@ Sprite_Twinrova_CheckIfDead: ; If health is negative, set back to zero LDA.w SprHealth, X : CMP.b #$C3 : BCC .health_not_negative LDA.b #$00 : STA.w SprHealth, X - - .health_not_negative + .health_not_negative LDA.w SprHealth, X : BNE .not_dead PHX LDA.b #$04 : STA.w SprState, X ; Kill sprite boss style @@ -76,7 +75,6 @@ Sprite_Twinrova_CheckIfDead: Sprite_Twinrova_Prep: { PHB : PHK : PLB - ; Kill the sprite if the Maiden is present LDA.l $7EF3CC : CMP.b #$06 : BNE .prep_twinrova STZ.w SprState, X