Files
ferma/scripts/state_machine/node_state_machine.gd
2025-08-22 17:16:22 +05:00

49 lines
1.2 KiB
GDScript

class_name NodeStateMachine
extends Node
@export var initial_node_state : NodeState
var node_states : Dictionary = {}
var current_node_state : NodeState
var current_node_state_name : String
func _ready() -> void:
for child in get_children():
if child is NodeState:
node_states[child.name.to_lower()] = child
child.transition.connect(transition_to)
if initial_node_state:
initial_node_state._on_enter()
current_node_state = initial_node_state
current_node_state_name = current_node_state.name.to_lower()
func _process(delta : float) -> void:
if current_node_state:
current_node_state._on_process(delta)
func _physics_process(delta: float) -> void:
if current_node_state:
current_node_state._on_physics_process(delta)
current_node_state._on_next_transitions()
func transition_to(node_state_name : String) -> void:
if node_state_name == current_node_state.name.to_lower():
return
var new_node_state = node_states.get(node_state_name.to_lower())
if !new_node_state:
return
if current_node_state:
current_node_state._on_exit()
new_node_state._on_enter()
current_node_state = new_node_state
current_node_state_name = current_node_state.name.to_lower()
print("Current State: ", current_node_state_name)