class_name Chicken extends KinematicBody2D enum State {IDLE, WALKING, ANGRY, RUNNING} export var walk_linear_speed = 100 export var run_boost = 4 export var push_impulse = 100 var velocity = Vector2.ZERO var _current_state = State.IDLE func attack(from: Vector2, angle: float): position = from velocity = Vector2(walk_linear_speed, 0).rotated(angle) $AnimatedSprite.play("walk") _update_sprite_direction() _current_state = State.WALKING func _physics_process(delta): var collision = move_and_collide(velocity * delta, false) _collide_and_react(collision) func _on_VisibilityNotifier2D_screen_exited(): _die() func _on_Spawner_reset(): _die() func _on_AngryTimer_timeout(): assert(_current_state == State.ANGRY) _start_running() func _die(): queue_free() func _collide_and_react(collision: KinematicCollision2D) -> void: if collision == null: return var collider = collision.get_collider() if collider is Node2D: var node_collider = collider as Node if _current_state == State.WALKING: if node_collider.is_in_group("chicken"): _turn_away() elif node_collider.is_in_group("wheel"): _get_angry() if collider is RigidBody2D: _push_away(collider as RigidBody2D, -collision.normal) func _turn_away() -> void: velocity.x = -velocity.x _update_sprite_direction() func _push_away(body: RigidBody2D, dir: Vector2) -> void: body.apply_central_impulse(dir * push_impulse) func _get_angry() -> void: $AngryTimer.start() $AnimatedSprite.play("get_hit") _current_state = State.ANGRY func _start_running() -> void: velocity *= run_boost $AnimatedSprite.play("run") _current_state = State.RUNNING func _update_sprite_direction() -> void: $AnimatedSprite.flip_h = velocity.x < 0.0