act_enemy_guard:
actdef ACT_T_GUARD, 0, 0, 10, 0
+#define ACT_GUARD_WALK_RIGHT 0
+#define ACT_GUARD_SHOOT 1
+#define ACT_GUARD_WALK_LEFT 2
+
+#define ACT_GUARD_MOVE_FRAMES 40
+
; updates the guard enemy
; inputs:
; de: actor ptr
ld a, RF_ENEMY
call actor_write_default_collider
+ ; call states
+ ld hl, act_state
+ add hl, de
+ ld a, [hl]
+ cp a, ACT_GUARD_WALK_RIGHT
+ jp z, act_guard_walk_right
+
+ cp a, ACT_GUARD_SHOOT
+ jp z, act_guard_shoot
+
+ cp a, ACT_GUARD_WALK_LEFT
+ jp z, act_guard_walk_left
+
ret
@despawn:
call actor_despawn
ret
+ ; guard shoot state
+ ; inputs:
+ ; de: actor
+act_guard_shoot:
+ ; TODO
+ ld hl, act_state
+ add hl, de
+ ld a, ACT_GUARD_WALK_LEFT
+ ld [hl], a
+ ret
+
+ ; actor walk left state
+ ; inputs:
+ ; de: actor ptr
+ ; uses:
+ ; p0 as timer
+act_guard_walk_left:
+ ; walk
+ ld hl, act_pos_x
+ add hl, de
+ ld a, [hl]
+ dec a
+ ld [hl], a
+
+ ; process timer
+ ld hl, act_p0
+ add hl, de
+ ld a, [hl]
+ inc a
+ ld [hl], a
+ cp a, ACT_GUARD_MOVE_FRAMES
+ jr nz, @not_done REL
+ ; clear p0 and transition
+ xor a, a
+ ld [hl], a
+
+ ld hl, act_state
+ add hl, de
+ ld a, ACT_GUARD_WALK_RIGHT
+ ld [hl], a
+@not_done:
+ ret
+
+ ; walk right state
+ ; inputs:
+ ; de: actor ptr
+ ; uses:
+ ; p0 as timer
+act_guard_walk_right:
+ ; walk
+ ld hl, act_pos_x
+ add hl, de
+ ld a, [hl]
+ inc a
+ ld [hl], a
+
+ ; process timer
+ ld hl, act_p0
+ add hl, de
+ ld a, [hl]
+ inc a
+ ld [hl], a
+ cp a, ACT_GUARD_MOVE_FRAMES ; how many frames do we walk?
+ jr nz, @not_done REL
+ ; clear p0 and transition
+ xor a, a
+ ld [hl], a
+
+ ld hl, act_state
+ add hl, de
+ ld a, ACT_GUARD_SHOOT
+ ld [hl], a
+
+@not_done:
+ ret
+
; draws the guard enemy
; inputs:
; de: actor ptr
add hl, de
ld a, 4
ld [hl], a
+
+ xor a, a
+ ld hl, act_state
+ add hl, de
+ ld [hl], a
+
+ ld hl, act_p0
+ add hl, de
+ ld [hl], a
+
ret