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

76 lines
1.6 KiB

extends CharacterBody2D
class_name Npc
const SPEED = 100
const MINIMUM_STATE_DURATION = 3
const STATES = ['panic', 'dead']
const QUEUE_FREE_DELAY = 10
const SOUNDS = {
"spawn": {"asset": preload("res://assets/sounds/ant_spawn.wav"), "volume": -20},
"die": {"asset": preload("res://assets/sounds/ant_death.wav"), "volume": 0.5},
}
var gravity = ProjectSettings.get_setting("physics/2d/default_gravity")
var direction = 0
var rising_speed = 0
@onready var original_parent = get_parent()
func _ready():
pick_new_direction()
$fsm.set_states(STATES)
$sound_player.play_sound(SOUNDS["spawn"])
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()
if $fsm.state_duration > QUEUE_FREE_DELAY:
queue_free()
func die(level_speed):
$fsm.set_next_state('dead')
$sound_player.play_sound(SOUNDS["die"])
rising_speed = level_speed
func grabbed(by):
$shape.disabled = true
$fsm.set_physics_process(false)
reparent(by)
position.y = 0
func dropped():
$shape.disabled = false
$fsm.set_physics_process(true)
reparent(original_parent)
rotation = 0
func pick_new_direction():
direction = [1,-1][randi_range(0,1)] * SPEED