Limited Space
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
ld54/nodes/npc/npc.gd

53 lines
1.0 KiB

extends CharacterBody2D
class_name Npc
const SPEED = 100
const MINIMUM_STATE_DURATION = 3
const STATES = ['panic', 'dead']
const QUEUE_FREE_DELAY = 30
var gravity = ProjectSettings.get_setting("physics/2d/default_gravity")
var direction = 0
var rising_speed = 0
func _ready():
pick_new_direction()
$fsm.set_states(STATES)
func panic_state(delta):
if is_on_wall():
direction *= -1
var state_duration_in_seconds = ceili($fsm.state_duration)
var should_update = (
$fsm.state_duration >= MINIMUM_STATE_DURATION
&& state_duration_in_seconds % 2 == (randi() %2)
)
if should_update:
pick_new_direction()
$fsm.state_duration = 0
velocity.x = direction
velocity.y += gravity * delta
move_and_slide()
func on_enter_dead_state():
$shape.queue_free()
func dead_state(_delta):
velocity = Vector2(0, -rising_speed)
move_and_slide()
func die(level_speed):
$fsm.set_next_state('dead')
rising_speed = level_speed
if $fsm.state_duration > QUEUE_FREE_DELAY:
queue_free()
func pick_new_direction():
direction = [1,-1][randi_range(0,1)] * SPEED