add big chuchu phase to manhandla boss

This commit is contained in:
scawful
2024-06-21 19:19:24 -04:00
parent 65c0ad2f70
commit 391fddd923

View File

@@ -40,7 +40,7 @@ Sprite_Manhandla_Long:
JSR Sprite_Manhandla_CheckForNextPhaseOrDeath JSR Sprite_Manhandla_CheckForNextPhaseOrDeath
LDA.w SprMiscD, X : BEQ .phase1 LDA.w SprMiscD, X : CMP.b #$02 : BCC .phase1
JSR Sprite_BigChuchu_Draw JSR Sprite_BigChuchu_Draw
JMP .continue JMP .continue
.phase1 .phase1
@@ -65,7 +65,7 @@ Sprite_Manhandla_Prep:
LDA.b #$04 : STA $36 ; Stores initial movement speeds LDA.b #$04 : STA $36 ; Stores initial movement speeds
LDA.b #$06 : STA $0428 ; Allows BG1 to move LDA.b #$06 : STA $0428 ; Allows BG1 to move
LDA.b #$80 : STA.w SprDefl, X LDA.b #$80 : STA.w SprDefl, X
LDA.b #$20 : STA.w SprHealth, X LDA.b #$80 : STA.w SprHealth, X
LDA.w SprSubtype, X : STA.w SprAction, X LDA.w SprSubtype, X : STA.w SprAction, X
PLB PLB
@@ -76,35 +76,41 @@ Sprite_Manhandla_Prep:
; Then we transition to the chuchu phase. ; Then we transition to the chuchu phase.
Sprite_Manhandla_CheckForNextPhaseOrDeath: Sprite_Manhandla_CheckForNextPhaseOrDeath:
{ {
; All three heads need to be dead before we become big chuchu
LDA Offspring1_Id : TAY LDA Offspring1_Id : TAY
LDA.w SprState, Y : BEQ .offspring1_dead LDA.w SprState, Y : BEQ .offspring1_dead
JMP .not_dead JMP .not_dead
.offspring1_dead .offspring1_dead
LDA.b #$05 : STA.w $36
LDA Offspring2_Id : TAY LDA Offspring2_Id : TAY
LDA.w SprState, Y : BEQ .offspring2_dead LDA.w SprState, Y : BEQ .offspring2_dead
JMP .not_dead JMP .not_dead
.offspring2_dead .offspring2_dead
LDA.b #$06 : STA.w $36
LDA Offspring3_Id : TAY
LDA.w SprState, Y : BEQ .offspring3_dead
JMP .not_dead
.offspring3_dead
LDA.b #$07 : STA.w $36
LDA.w SprMiscD, X : BNE .phase2 LDA.w SprMiscD, X : BNE .phase2
LDA.w SprHealth, X : CMP.b #$08 : BCS .not_dead LDA.b #$01 : STA.w SprMiscD, X
LDA.b #$40 : STA.w SprTimerA, X
LDA.b #$01 : STA.w SprMiscD, X LDA.b #$20 : STA.w SprHealth, X ; Refill the health
LDA.b #$20 : STA.w SprHealth, X LDA.b #$08 : STA.w SprNbrOAM, X ; Give more OAM
LDA.b #$08 : STA.w SprNbrOAM, X LDA.b #$07 : STA.w SprAction, X ; Chuchu Emerge
.not_dead .not_dead
RTS RTS
.phase2 .phase2
LDA.w SprMiscD, X : CMP.b #$02 : BEQ + LDA.w SprMiscD, X : CMP.b #$03 : BEQ +
LDA.w SprHealth, X : CMP.b #$04 : BCS .phase2_not_dead
LDA.w SprHealth, X : CMP.b #$08 : BCS .phase2_not_dead LDA.b #$50 : STA.w SprTimerA, X
LDA.b #$20 : STA.w SprTimerA, X LDA.b #$09 : STA.w SprAction, X
LDA.b #$05 : STA.w SprAction, X
LDA.b #$13 : STA $012C LDA.b #$13 : STA $012C
LDA.b #$02 : STA.w SprMiscD, X LDA.b #$04 : STA.w SprMiscD, X
.phase2_not_dead
.phase2_not_dead
+ +
RTS RTS
@@ -136,17 +142,33 @@ macro SetRightHeadPos()
STA.w SprY, Y : XBA : STA.w SprYH, Y STA.w SprY, Y : XBA : STA.w SprYH, Y
endmacro endmacro
macro SetCenterHeadPos()
REP #$20
LDA SprCachedX
SEP #$20
STA.w SprX, Y : XBA : STA.w SprXH, Y
REP #$20
LDA SprCachedY
SEP #$20
STA.w SprY, Y : XBA : STA.w SprYH, Y
endmacro
Sprite_Manhandla_Main: Sprite_Manhandla_Main:
{ {
LDA.w SprAction, X LDA.w SprAction, X
JSL UseImplicitRegIndexedLocalJumpTable JSL UseImplicitRegIndexedLocalJumpTable
dw Manhandla_Intro dw Manhandla_Intro
dw Manhandla_FrontHead dw Manhandla_FrontHead ; 0x01
dw Manhandla_LeftHead dw Manhandla_LeftHead ; 0x02
dw Manhandla_RightHead dw Manhandla_RightHead ; 0x03
dw BigChuchu_Main dw BigChuchu_Main ; 0x04
dw BigChuChu_Dead dw Flower_Flicker ; 0x05
dw Manhandla_Body ; 0x06
dw BigChuchu_Emerge ; 0x07
dw BigChuchu_Flower ; 0x08
dw BigChuchu_Dead ; 0x09
Manhandla_Intro: Manhandla_Intro:
{ {
@@ -156,9 +178,12 @@ Sprite_Manhandla_Main:
JSR ApplyManhandlaPalette JSR ApplyManhandlaPalette
JSR SpawnLeftManhandlaHead JSR SpawnLeftManhandlaHead
JSR SpawnRightManhandlaHead JSR SpawnRightManhandlaHead
INC.w SprAction, X JSR SpawnCenterMandhandlaHead
LDA.b #$06 : STA.w SprFrame, X
%GotoAction(6) ; Manhandla_Body
RTS RTS
.not_main .not_main
LDA.w SprSubtype, X : STA.w SprAction, X LDA.w SprSubtype, X : STA.w SprAction, X
RTS RTS
} }
@@ -167,31 +192,12 @@ Sprite_Manhandla_Main:
{ {
%PlayAnimation(0,1,16) %PlayAnimation(0,1,16)
JSL GetRandomInt : AND.b #$7F : BNE + JSL Sprite_Move
JSR Mothula_SpawnBeams
+
JSR Sprite_Manhandla_Move
JSL Sprite_DamageFlash_Long JSL Sprite_DamageFlash_Long
JSL Sprite_CheckDamageFromPlayerLong JSL Sprite_CheckDamageFromPlayerLong
%DoDamageToPlayerSameLayerOnContact() %DoDamageToPlayerSameLayerOnContact()
PHX
LDY.w Offspring1_Id
LDA.w SprType, Y : CMP.b #$88 : BNE .not_head
LDA.w SprState, Y : BEQ .offspring1_dead
%SetLeftHeadPos()
.offspring1_dead
.not_head
LDY.w Offspring2_Id
LDA.w SprType, Y : CMP.b #$88 : BNE .not_head2
LDA.w SprState, Y : BEQ .offspring2_dead
%SetRightHeadPos()
.offspring2_dead
.not_head2
PLX
RTS RTS
} }
@@ -237,11 +243,19 @@ Sprite_Manhandla_Main:
%DoDamageToPlayerSameLayerOnContact() %DoDamageToPlayerSameLayerOnContact()
PLX PLX
LDY.w Offspring3_Id
LDA.w SprType, Y : CMP.b #$88 : BNE .not_head3
LDA.w SprState, Y : BEQ .offspring3_dead
%SetCenterHeadPos()
.offspring3_dead
.not_head3
RTS RTS
} }
BigChuChu_Dead: Flower_Flicker:
{ {
%PlayAnimation(11, 12, 10)
LDA $1C : ORA.b #$01 : STA $1C ;turn on BG2 (Body) LDA $1C : ORA.b #$01 : STA $1C ;turn on BG2 (Body)
; Flicker the body every other frame using the timer ; Flicker the body every other frame using the timer
LDA SprTimerA, X : AND.b #$01 : BEQ .flicker LDA SprTimerA, X : AND.b #$01 : BEQ .flicker
@@ -252,12 +266,100 @@ Sprite_Manhandla_Main:
STZ.w $0422 STZ.w $0422
STZ.w $0424 STZ.w $0424
LDA $1C : AND.b #$FE : STA $1C ;turn off BG2 (Body) LDA $1C : AND.b #$FE : STA $1C ;turn off BG2 (Body)
LDA.b #$04 : STA.w SprState, X %GotoAction($04)
STZ.w SprHealth, X LDA.b #$8D : STA.w SprHitbox, X
LDA #$88
JSL Sprite_SpawnDynamically : BMI .return
TYA : STA Offspring3_Id
PHX
%SetCenterHeadPos()
LDA.b #$08 : STA.w SprSubtype, Y
STA.w SprAction, Y
LDA.b #$20 : STA.w SprHealth, Y
LDA.b #$07 : STA.w SprNbrOAM, Y
TYX
STZ.w SprYRound, X
STZ.w SprXRound, X
PLX
.return
.continue .continue
RTS RTS
} }
Manhandla_Body:
{
%PlayAnimation(6,8,16)
PHX
JSR Sprite_Manhandla_Move
JSL Sprite_DamageFlash_Long
JSL GetRandomInt : AND.b #$7F : BNE +
JSL GetRandomInt : AND.b #$0F : BNE +
JSR Mothula_SpawnBeams
+
JSL Sprite_CheckDamageFromPlayerLong
%DoDamageToPlayerSameLayerOnContact()
LDY.w Offspring1_Id
LDA.w SprType, Y : CMP.b #$88 : BNE .not_head
LDA.w SprState, Y : BEQ .offspring1_dead
%SetLeftHeadPos()
.offspring1_dead
.not_head
LDY.w Offspring2_Id
LDA.w SprType, Y : CMP.b #$88 : BNE .not_head2
LDA.w SprState, Y : BEQ .offspring2_dead
%SetRightHeadPos()
.offspring2_dead
.not_head2
LDY.w Offspring3_Id
LDA.w SprType, Y : CMP.b #$88 : BNE .not_head3
LDA.w SprState, Y : BEQ .offspring3_dead
%SetCenterHeadPos()
.offspring3_dead
.not_head3
PLX
RTS
}
BigChuchu_Emerge:
{
%PlayAnimation(9, 12, 10)
LDA.w SprTimerA, X : BNE +
LDA.b #$02 : STA.w SprMiscD, X ; Set phase flag
LDA.b #$20 : STA.w SprTimerA, X
%GotoAction($05)
+
RTS
}
BigChuchu_Flower:
{
%PlayAnimation(12, 12, 1)
RTS
}
BigChuchu_Dead:
{
LDA.b #$04 : STA.w SprState, X
STZ.w SprHealth, X
RTS
}
} }
Sprite_Manhandla_Move: Sprite_Manhandla_Move:
@@ -342,10 +444,10 @@ Manhandla_StopIfOutOfBounds:
{ {
; Set A to 00 if outside of certain bounds ; Set A to 00 if outside of certain bounds
REP #$20 REP #$20
LDA SprCachedX : CMP.w #$1528 : BCS .not_out_of_bounds_Left LDA SprCachedX : CMP.w #$153A : BCS .not_out_of_bounds_Left
SEP #$20 SEP #$20
LDA.w SprXSpeed : CMP.b #$7F : BCC .not_out_of_bounds_Left LDA.w SprXSpeed : CMP.b #$7F : BCC .not_out_of_bounds_Left
LDA.b #-10 : STA.w SprXSpeed : STA SprXRound LDA.b #-08 : STA.w SprXSpeed : STA SprXRound
.not_out_of_bounds_Left .not_out_of_bounds_Left
SEP #$20 SEP #$20
@@ -354,26 +456,26 @@ Manhandla_StopIfOutOfBounds:
LDA SprCachedX : CMP.w #$15C8 : BCC .not_out_of_bounds_Right LDA SprCachedX : CMP.w #$15C8 : BCC .not_out_of_bounds_Right
SEP #$20 SEP #$20
LDA.w SprXSpeed : CMP.b #$80 : BCS .not_out_of_bounds_Right LDA.w SprXSpeed : CMP.b #$80 : BCS .not_out_of_bounds_Right
LDA.b #$00 : STA.w SprXSpeed : STA SprXRound LDA.b #$08 : STA.w SprXSpeed : STA SprXRound
.not_out_of_bounds_Right .not_out_of_bounds_Right
SEP #$20 SEP #$20
; Upper bound ; Upper bound
REP #$20 REP #$20
LDA SprCachedY : CMP.w #$0B30 : BCS .not_out_of_bounds_Up LDA SprCachedY : CMP.w #$0B3A : BCS .not_out_of_bounds_Up
SEP #$20 SEP #$20
LDA.w SprYSpeed : CMP.b #$7F : BCC .not_out_of_bounds_Up LDA.w SprYSpeed : CMP.b #$7F : BCC .not_out_of_bounds_Up
LDA.b #$00 : STA.w SprYSpeed : STA SprYRound LDA.b #$08 : STA.w SprYSpeed : STA SprYRound
.not_out_of_bounds_Up .not_out_of_bounds_Up
SEP #$20 SEP #$20
REP #$20 REP #$20
LDA SprCachedY : CMP.w #$0BC0 : BCC .not_out_of_bounds_Down LDA SprCachedY : CMP.w #$0BA6 : BCC .not_out_of_bounds_Down
SEP #$20 SEP #$20
LDA.w SprYSpeed : CMP.b #$80 : BCS .not_out_of_bounds_Down LDA.w SprYSpeed : CMP.b #$80 : BCS .not_out_of_bounds_Down
LDA.b #-10 : STA.w SprYSpeed : STA SprYRound ; Reverse the direction LDA.b #-08 : STA.w SprYSpeed : STA SprYRound ; Reverse the direction
.not_out_of_bounds_Down .not_out_of_bounds_Down
SEP #$20 SEP #$20
@@ -443,9 +545,9 @@ Sprite_Manhandla_Draw:
; ========================================================= ; =========================================================
.start_index .start_index
db $00, $02, $04, $08, $0C, $10, $14, $17, $1A db $00, $02, $04, $08, $0C, $10, $14, $17, $1A, $1D, $23, $29, $33
.nbr_of_tiles .nbr_of_tiles
db 1, 1, 3, 3, 3, 3, 2, 2, 2 db 1, 1, 3, 3, 3, 3, 2, 2, 2, 5, 5, 9, 7
.x_offsets .x_offsets
dw 0, 0 dw 0, 0
dw 0, 0 dw 0, 0
@@ -456,6 +558,11 @@ Sprite_Manhandla_Draw:
dw -12, -4, 12 dw -12, -4, 12
dw -12, -4, 12 dw -12, -4, 12
dw 12, 4, -12 dw 12, 4, -12
dw -12, -4, -12, -4, 12, 12
dw -12, -4, -12, -4, 12, 12
dw -16, -8, -16, -8, 16, 8, 16, 8, -12, 12
dw -16, -8, -16, -8, 16, 8, 16, 8
.y_offsets .y_offsets
dw -8, 8 dw -8, 8
dw 0, 16 dw 0, 16
@@ -466,6 +573,11 @@ Sprite_Manhandla_Draw:
dw 0, 0, 0 dw 0, 0, 0
dw 0, 0, 0 dw 0, 0, 0
dw 0, 0, 0 dw 0, 0, 0
dw -28, -28, -12, -12, -28, -12
dw -24, -24, -8, -8, -24, -8
dw -24, -24, -8, -8, -8, -8, -24, -24, -32, -32
dw -24, -24, -8, -8, -8, -8, -24, -24
.chr .chr
db $00, $20 db $00, $20
db $02, $22 db $02, $22
@@ -476,6 +588,11 @@ Sprite_Manhandla_Draw:
db $40, $41, $40 db $40, $41, $40
db $43, $44, $46 db $43, $44, $46
db $43, $44, $46 db $43, $44, $46
db $4D, $4E, $6D, $6E, $4D, $6D
db $8D, $8E, $AD, $AE, $8D, $AD
db $CD, $CE, $ED, $EE, $ED, $EE, $CD, $CE, $AE, $AE
db $CD, $CE, $ED, $EE, $ED, $EE, $CD, $CE
.properties .properties
db $33, $33 db $33, $33
db $33, $33 db $33, $33
@@ -486,6 +603,11 @@ Sprite_Manhandla_Draw:
db $33, $33, $73 db $33, $33, $73
db $33, $33, $73 db $33, $33, $73
db $73, $73, $33 db $73, $73, $33
db $33, $33, $33, $33, $73, $73
db $33, $33, $33, $33, $73, $73
db $33, $33, $33, $33, $73, $73, $73, $73, $32, $72
db $33, $33, $33, $33, $73, $73, $73, $73
.sizes .sizes
db $02, $02 db $02, $02
db $02, $02 db $02, $02
@@ -496,6 +618,11 @@ Sprite_Manhandla_Draw:
db $02, $02, $02 db $02, $02, $02
db $02, $02, $02 db $02, $02, $02
db $02, $02, $02 db $02, $02, $02
db $02, $02, $02, $02, $02, $02
db $02, $02, $02, $02, $02, $02
db $02, $02, $02, $02, $02, $02, $02, $02, $02, $02
db $02, $02, $02, $02, $02, $02, $02, $02
} }
Sprite_BigChuchu_Draw: Sprite_BigChuchu_Draw:
@@ -639,14 +766,13 @@ SpawnLeftManhandlaHead:
TYA : STA Offspring1_Id TYA : STA Offspring1_Id
PHX PHX
%SetLeftHeadPos() %SetLeftHeadPos()
; store the sub-type ; store the sub-type
LDA.b #$03 : STA.w $0E30, Y LDA.b #$03 : STA.w SprSubtype, Y
STA.w SprSubtype, Y STA.w SprAction, Y
LDA.b #$10 : STA.w SprHealth, Y LDA.b #$10 : STA.w SprHealth, Y
LDA.b #$90 : STA.w SprTileDie, Y LDA.b #$90 : STA.w SprTileDie, Y
LDA.w SprGfxProps : ORA.b #$80 : STA.w SprGfxProps, Y
TYX TYX
STZ.w SprYRound, X STZ.w SprYRound, X
@@ -657,7 +783,6 @@ SpawnLeftManhandlaHead:
RTS RTS
} }
SpawnRightManhandlaHead: SpawnRightManhandlaHead:
{ {
LDA #$88 LDA #$88
@@ -667,10 +792,34 @@ SpawnRightManhandlaHead:
PHX PHX
%SetRightHeadPos() %SetRightHeadPos()
LDA.b #$02 : STA $0E30, Y LDA.b #$02
STA.w SprSubtype, Y STA.w SprSubtype, Y
LDA.b #$10 : STA.w SprHealth, Y LDA.b #$10 : STA.w SprHealth, Y
LDA.b #$90 : STA.w SprTileDie, Y LDA.b #$90 : STA.w SprTileDie, Y
LDA.w SprGfxProps : AND.b #$80 : STA.w SprGfxProps, Y
TYX
STZ.w SprYRound, X
STZ.w SprXRound, X
PLX
.return
RTS
}
SpawnCenterMandhandlaHead:
{
LDA #$88
JSL Sprite_SpawnDynamically : BMI .return
TYA : STA Offspring3_Id
PHX
%SetCenterHeadPos()
LDA.b #$01
STA.w SprSubtype, Y
LDA.b #$10 : STA.w SprHealth, Y
LDA.b #$90 : STA.w SprTileDie, Y
LDA.w SprGfxProps : AND.b #$80 : STA.w SprGfxProps, Y
TYX TYX
@@ -703,7 +852,6 @@ ApplyManhandlaPalette:
RTS RTS
} }
ApplyManhandlaGraphics: ApplyManhandlaGraphics:
{ {
PHX PHX