extends Node class_name StateMachine var state = null setget set_state var previous_state = null var states = {} # Parent Node that uses these states onready var parent = get_parent() # Basic process flow for every SM func _physics_process(delta): if state != null: _state_logic(delta) var transition = _get_transition(delta) if transition != null: set_state(transition) # Game logic consequences of state func _state_logic(_delta): pass func _get_transition(_delta): return null func _enter_state(_new_state, _previous_state): pass func _exit_state(_previous_state, _new_state): pass func set_state(new_state): previous_state = state state = new_state if previous_state != null: _exit_state(previous_state, new_state) if new_state != null: _enter_state(new_state, previous_state) func add_state(state_name): states[state_name] = state_name