Poor Sam was left out again. Now he can kill the boss too.
Since the boss is a special beast you wouldn't want Sam just to stand there and kill him without any reaction.
We add a new variable BOSS_HELD, similar to the SPRITE_HELD value.
So if SAM hurts the enemy, and it's the boss, the boss is released from Sam's grip:
dec SPRITE_HP,x
beq .EnemyKilled
;enemy was hurt
lda BOSS_HELD beq .EnemyWasHurt
;release if end boss
jmp .SamNotFirePushed
BOSS_HELD is set to 1 if Sam has the boss in his force grip. We check if the sprite caught is the last boss or one of his parts:
.EnemyHit
;enemy hit!
stx SPRITE_HELD
ldy SPRITE_HELD
inc SPRITE_HELD
lda SPRITE_ACTIVE,y
cmp #TYPE_BOSS7
beq .HoldingBoss
cmp #TYPE_BOSS_PART
beq .HoldingBoss
jmp .NotHoldingBoss
.HoldingBoss
sty BOSS_HELD
inc BOSS_HELD
.NotHoldingBoss
Therefore we also need to clear the bit in case the enemy or Sam is killed:
!zone KillEnemy
KillEnemy
;is the enemy currently held?
ldy SPRITE_HELD
dey
sty PARAM4
cpx PARAM4
bne .WasNotHeld
lda #0
sta SPRITE_HELD
sta BOSS_HELD
Obviously the boss should not move when being caught, so in BehaviourBoss7 we add an early bail out:
.NoHitBack
lda BOSS_HELD beq +
rts
+
The step also adds a few bug fixes, as in the boss not auto-moving the bats he spawned (as if they were body parts).
Have fun!