Advertisement
antonsavov

WIP StateMachine

Jan 10th, 2018
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 3.49 KB | None | 0 0
  1. ----------------------------
  2. --- STATE MACHINE DEFINITION & FUNCTIONS
  3. ---------------------------
  4. fsm = {}
  5.  
  6. -- The format of the states table is as follows:
  7. --
  8. --  states = {
  9. --      state1_name = {
  10. --          name    = state1_name,
  11. --          enter   = func_enterState1,
  12. --          update  = func_updateState1,
  13. --          exit    = func_exitState1
  14. --      },
  15. --      state2_name = {
  16. --          name    = state2_name,
  17. --          enter   = func_enterState2,
  18. --          update  = func_updateState2,
  19. --          exit    = func_exitState2
  20. --      },
  21. --      state3_name = {
  22. --          name    = state3_name,
  23. --          enter   = func_enterState3,
  24. --          update  = func_updateState3,
  25. --          exit    = func_exitState3
  26. --      }
  27. --  }
  28. --
  29. --  func_enterState1 =  function(self)
  30. --                          must have a self object as argument
  31. --                          things to run when entering state 1
  32. --                      end
  33. --  func_updateState1 = function(self) -- to be run in the game loop
  34. --                          must have a self object as argument
  35. --                          things to run when updating state 1 with one step
  36. --                      end
  37. --  func_exitState1 =   function(self)
  38. --                          must have a self object as argument
  39. --                          things to run when exiting state 1
  40. --                      end
  41. --
  42. --  in the func_updateState1() check for an event that triggers another state, let's say state2_name
  43. --  if such event occurs then use self:setState(states[state2_name]) to switch states
  44. --
  45. --
  46.  
  47. function fsm:setState(newstate)
  48.     assert(type(newstate.name) == 'string', "fsm:setState(): newstate.name must be string" )
  49.     assert(type(newstate.enter) == 'function' or newstate.enter == nil, "fsm:setState(): newstate.enter must be a function or nil" )
  50.     assert(type(newstate.update) == 'function' or newstate.update == nil, "fsm:setState(): newstate.update must be a function or nil" )
  51.     assert(type(newstate.exit) == 'function' or newstate.exit == nil, "fsm:setState(): newstate.exit must be a function or nil" )
  52.     self:doExit()
  53.     self.state = newstate.name
  54.     self.updateStateFunc = newstate.update
  55.     self.exitStateFunc = newstate.exit
  56.     if newstate.enter then
  57.         debug.log(self.name.." - entering state:"..self.state)
  58.         return newstate.enter(self)
  59.     end
  60. end
  61.  
  62. --[[
  63. function fsm:addState(_name, _enterStateFunc, _updateStateFunc, _exitStateFunc)
  64.     assert(type(_name) == 'string', "fsm:addState(): _name must be string" )
  65.     assert(type(_enterStateFunc) == 'function' or _enterStateFunc == nil, "fsm:addState(): _enterStateFunc must be a function or nil" )
  66.     assert(type(_updateStateFunc) == 'function' or _updateStateFunc == nil, "fsm:addState(): _updateStateFunc must be a function or nil" )
  67.     assert(type(_exitStateFunc) == 'function' or _exitStateFunc == nil, "fsm:addState(): _exitStateFunc must be a function or nil" )
  68.     assert(self.states[_name] == nil, "fsm:addState() - state already exists")
  69.     self.states[_name] = {
  70.         name = _name,
  71.         enterStateFunc = _enterStateFunc,
  72.         updateStateFunc = _updateStateFunc,
  73.         exitStateFunc = _exitStateFunc
  74.     }
  75. end
  76. --]]
  77.  
  78. function fsm:update()
  79.     if self.updateStateFunc then
  80.         debug.log(self.name.." - updating state:"..self.state)
  81.         self:updateStateFunc()
  82.     end
  83. end
  84.  
  85. function fsm:doExit()
  86.     if self.exitStateFunc then
  87.         debug.log(self.name.." - exiting state:"..self.state)
  88.         self:exitStateFunc()
  89.     end
  90. end
  91.  
  92. function fsm:new(states)--, state)
  93.     local newfsm = {}
  94.     -- use the kew table as a metatable for the new queue object
  95.     setmetatable(newfsm, self)
  96.     self.__index = self
  97.     self.name = "state machine"
  98.     newfsm.states = states or {}
  99.     print(newfsm.states)
  100.     --[[
  101.     if state then
  102.         newfsm:setState(state)
  103.     elseif states then
  104.         newfsm:setState(states[1])
  105.     end --]]
  106.     return newfsm
  107. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement