register_comp("State_Machine", function(ent, default, states) assert(states[default], "Entity does not have state '" .. default .. "'.") ent.states = states ent.state = default for _, state in pairs(states) do state.data = {} try(state.init, state.data) end end) function state_update_sys(ent, dt) try(ent.states[ent.state].update, ent, ent.states[ent.state].data, dt) end function set_state(ent, to) assert(has_comp(ent, "State_Machine"), "Entity must have a state machine.") assert(ent.states[to], "Entity does not have state '" .. to .. "'.") try(ent.states[ent.state].exit, ent, ent.states[ent.state].data, to) ent.state = to try(ent.states[ent.state].enter, ent, ent.states[ent.state].data) end