Skip to content

Instantly share code, notes, and snippets.

@firebelley
Created August 27, 2024 21:18
Show Gist options
  • Select an option

  • Save firebelley/96f2f82e3feaa2756fe647d8b9843174 to your computer and use it in GitHub Desktop.

Select an option

Save firebelley/96f2f82e3feaa2756fe647d8b9843174 to your computer and use it in GitHub Desktop.

Revisions

  1. firebelley revised this gist Aug 27, 2024. No changes.
  2. firebelley revised this gist Aug 27, 2024. No changes.
  3. firebelley created this gist Aug 27, 2024.
    49 changes: 49 additions & 0 deletions callable_state_machine.gd
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,49 @@
    class_name CallableStateMachine

    var state_dictionary = {}
    var current_state: String


    func add_states(
    normal_state_callable: Callable,
    enter_state_callable: Callable,
    leave_state_callable: Callable
    ):
    state_dictionary[normal_state_callable.get_method()] = {
    "normal": normal_state_callable,
    "enter": enter_state_callable,
    "leave": leave_state_callable
    }


    func set_initial_state(state_callable: Callable):
    var state_name = state_callable.get_method()
    if state_dictionary.has(state_name):
    _set_state(state_name)
    else:
    push_warning("No state with name " + state_name)


    func update():
    if current_state != null:
    (state_dictionary[current_state].normal as Callable).call()


    func change_state(state_callable: Callable):
    var state_name = state_callable.get_method()
    if state_dictionary.has(state_name):
    _set_state.call_deferred(state_name)
    else:
    push_warning("No state with name " + state_name)


    func _set_state(state_name: String):
    if current_state:
    var leave_callable = state_dictionary[current_state].leave as Callable
    if !leave_callable.is_null():
    leave_callable.call()

    current_state = state_name
    var enter_callable = state_dictionary[current_state].enter as Callable
    if !enter_callable.is_null():
    enter_callable.call()