Finally: A very talented chap volunteered to create imagery for the game. Lots of decent sprites and chars were created.
To celebrate there's also a slew of new enemies:
Wolfman
Eye
Jumping toad
Ghost skeleton
Code wise this is mainly add the sprites to the binary include and the new behaviours. As you can see, the ghost skeleton doesn't do anything interesting (yet). The jumping toad however is quite complex. It's movement consists of ducking, jumping and waiting. Still, for now, it's quite predictable.
;------------------------------------------------------------
;ghost skeleton
;------------------------------------------------------------
!zone BehaviourGhostSkeleton
BehaviourGhostSkeleton
lda DELAYED_GENERIC_COUNTER
and #$03
bne .NoAnimUpdate
inc SPRITE_ANIM_POS,x
lda SPRITE_ANIM_POS,x
and #$03
sta SPRITE_ANIM_POS,x
tay
lda GHOST_SKELETON_ANIMATION_TABLE,y
sta SPRITE_POINTER_BASE,x
.NoAnimUpdate
.NormalUpdate
;does not do anything yet
rts
;------------------------------------------------------------
;jumping toad
;------------------------------------------------------------
!zone BehaviourJumpingToad
BehaviourJumpingToad
lda SPRITE_HITBACK,x
beq .NoHitBack
dec SPRITE_HITBACK,x
lda SPRITE_HITBACK_DIRECTION,x
beq .HitBackRight
;move left
jsr ObjectMoveLeftBlocking
rts
.HitBackRight
jsr ObjectMoveRightBlocking
rts
.NoHitBack
lda SPRITE_STATE,x
beq .NotDucking
inc SPRITE_ANIM_DELAY,x
lda SPRITE_ANIM_DELAY,x
cmp #6
bne .StillDucking
lda #0
sta SPRITE_ANIM_DELAY,x
ldy SPRITE_ANIM_POS,x
inc SPRITE_ANIM_POS,x
lda TOAD_JUMP_ANIMATION_TABLE,y
sta SPRITE_POINTER_BASE,x
cmp #SPRITE_JUMPING_TOAD_1
bne .StillDucking
;start jump
lda #0
sta SPRITE_STATE,x
inc SPRITE_JUMP_POS,x
.StillDucking
rts
.NotDucking
lda SPRITE_JUMP_POS,x
beq .FallIfPossible
;toad is jumping
lda SPRITE_JUMP_POS,x
cmp #TOAD_JUMP_TABLE_SIZE
bne .JumpOn
;jump donejmp .JumpBlocked
.JumpOn
ldy SPRITE_JUMP_POS,x
inc SPRITE_JUMP_POS,x
lda TOAD_JUMP_TABLE,y
bne .KeepJumping
;no jump movement neededjmp .ToadMove
.KeepJumping
sta PARAM5
.JumpContinue
jsr ObjectMoveUpBlocking
beq .JumpBlocked
dec PARAM5
bne .JumpContinue
jmp .ToadMove
.JumpBlocked
lda #0
sta SPRITE_JUMP_POS,x
jmp .ToadMove
.FallIfPossible
jsr UpdateSpriteFall
beq .CanJump
jmp .ToadMove
.CanJumpinc SPRITE_STATE,x
lda #0
sta SPRITE_ANIM_DELAY,x
sta SPRITE_ANIM_POS,x
lda #SPRITE_JUMPING_TOAD_2
sta SPRITE_POINTER_BASE,x
rts
;simple move left/right
.ToadMove
lda SPRITE_DIRECTION,x
beq .MoveRight
jsr ObjectMoveLeftBlocking
beq .ToggleDirection
rts
.MoveRight
jsr ObjectMoveRightBlocking
beq .ToggleDirection
rts
.ToggleDirection
lda SPRITE_DIRECTION,x
eor #1
sta SPRITE_DIRECTION,x
rts
Then we have the wolfman. Running about the level and randomly jumping. What's worse, the angrier it gets, the faster it runs.
!zone BehaviourWolf
BehaviourWolf
lda SPRITE_HITBACK,x
beq .NoHitBack
dec SPRITE_HITBACK,x
lda SPRITE_HITBACK_DIRECTION,x
beq .HitBackRight
;move left
jsr ObjectMoveLeftBlocking
rts
.HitBackRight
jsr ObjectMoveRightBlocking
rts
.NoHitBack;animate wolf
lda SPRITE_JUMP_POS,x
bne .NoAnimUpdate
inc SPRITE_ANIM_DELAY,x
lda SPRITE_ANIM_DELAY,x
cmp #4
bne .NoAnimUpdate
lda #0
sta SPRITE_ANIM_DELAY,x
inc SPRITE_ANIM_POS,x
lda SPRITE_ANIM_POS,x
and #$03
sta SPRITE_ANIM_POS,x
tay
lda SPRITE_DIRECTION,x
beq .FacingLeft
lda WOLF_ANIMATION_TABLE,y
sta SPRITE_POINTER_BASE,x
jmp .NoAnimUpdate
.FacingLeft
lda WOLF_ANIMATION_TABLE,y
clcadc #( SPRITE_WOLF_WALK_R_1 - SPRITE_WOLF_WALK_L_1 )
sta SPRITE_POINTER_BASE,x
.NoAnimUpdate
lda SPRITE_JUMP_POS,x
bne .NoFallHandling
jsr UpdateSpriteFall
sta SPRITE_FALLING,x
bne .IsFalling
;neither jumping nor falling
jsr GenerateRandomNumber
and #$0fcmp SPRITE_ANNOYED,x
bpl .IsFalling
;random jumpjmp .Jumping
.IsFalling
.NoFallHandling
lda SPRITE_ANNOYED,x
clcadc #2
sta PARAM6
.MoveStepdec PARAM6
beq .MoveDone
lda SPRITE_DIRECTION,x
beq .MoveRight
;move left
lda SPRITE_JUMP_POS,x
ora SPRITE_FALLING,x
bne .OnlyMoveLeft
jsr ObjectWalkOrJumpLeft
beq .ToggleDirection
jmp .MoveStep
.MoveDone
lda SPRITE_JUMP_POS,x
beq .NotJumping
.Jumping
jsr UpdateSpriteJump
.NotJumping
rts
.OnlyMoveLeft
jsr ObjectMoveLeftBlocking
beq .ToggleDirection
jmp .MoveStep
.MoveRight
lda SPRITE_JUMP_POS,x
ora SPRITE_FALLING,x
bne .OnlyMoveRight
jsr ObjectWalkOrJumpRight
beq .ToggleDirection
jmp .MoveStep
.OnlyMoveRight
jsr ObjectMoveRightBlocking
beq .ToggleDirection
jmp .MoveStep
.ToggleDirection
lda SPRITE_DIRECTION,x
eor #1
sta SPRITE_DIRECTION,x
jmp .MoveStep
The eye is rather easy again. It moves diagonally, but stops every now and then to take a look.
!zone BehaviourEye
BehaviourEye
lda DELAYED_GENERIC_COUNTER
and #$03bne .NoAnimUpdate
;inc SPRITE_ANIM_POS,x;lda SPRITE_ANIM_POS,x;and #$03;sta SPRITE_ANIM_POS,x
;tay;lda BAT_ANIMATION,y;sta SPRITE_POINTER_BASE,x
.NoAnimUpdate
lda SPRITE_STATE,x
beq .Move
cmp #1beq .EyeOpen
cmp #2beq .EyeIsOpen
;eye closes
inc SPRITE_ANIM_DELAY,x
lda SPRITE_ANIM_DELAY,x
cmp #3bne .NoActionNow
lda #0
sta SPRITE_ANIM_DELAY,x
;close animation
dec SPRITE_ANIM_POS,x
dec SPRITE_POINTER_BASE,x
ldy SPRITE_ANIM_POS,x
lda EYE_COLOR_TABLE,y
sta VIC_SPRITE_COLOR,x
cpy #0bne .NoActionNow
;can move again
lda #0
sta SPRITE_STATE,x
rts
.EyeOpen
inc SPRITE_ANIM_DELAY,x
lda SPRITE_ANIM_DELAY,x
cmp #3bne .NoActionNow
lda #0
sta SPRITE_ANIM_DELAY,x
;open animation
inc SPRITE_ANIM_POS,x
inc SPRITE_POINTER_BASE,x
ldy SPRITE_ANIM_POS,x
lda EYE_COLOR_TABLE,y
sta VIC_SPRITE_COLOR,x
cpy #3bne .NoActionNow
;now wait
inc SPRITE_STATE,x
rts
.EyeIsOpen
inc SPRITE_ANIM_DELAY,x
lda SPRITE_ANIM_DELAY,x
cmp #30beq .EyeCloseNow
.NoActionNow
rts
.EyeCloseNow
lda #3
sta SPRITE_STATE,x
lda #0
sta SPRITE_ANIM_DELAY,x
rts
.Move
jsr GenerateRandomNumber
cmp #7bne .MoveNow
;start blinking
lda #1
sta SPRITE_STATE,x
rts
.MoveNow
lda SPRITE_DIRECTION,x
beq .MoveRight
;move left
jsr ObjectMoveLeftBlocking
beq .ToggleDirection
jmp .MoveY
.MoveRight
jsr ObjectMoveRightBlocking
beq .ToggleDirection
jmp .MoveY
.ToggleDirection
lda SPRITE_DIRECTION,x
eor #1
sta SPRITE_DIRECTION,x
.MoveY
lda SPRITE_DIRECTION_Y,x
beq .MoveDown
;move up
jsr ObjectMoveUpBlocking
beq .ToggleDirectionY
rts
.MoveDown
jsr ObjectMoveDownBlocking
beq .ToggleDirectionY
rts
.ToggleDirectionY
lda SPRITE_DIRECTION_Y,x
eor #1
sta SPRITE_DIRECTION_Y,x
rts
TL/DR: Have fun!