├── README.md └── statemachine ├── demo.lua └── statemachine.lua /README.md: -------------------------------------------------------------------------------- 1 | lua-state-machine 2 | ================= 3 | 4 | lua state machine taking advantage of first class functions. 5 | 6 | example 7 | ================= 8 | dofile("statemachine.lua") 9 | 10 | sm = stateManager:new(true) 11 | 12 | firstState = state:new("first state", {function () print("first") sm.nextState() end}) 13 | 14 | secondState = state:new("first state", {function () print("second") sm.stop() end}) 15 | 16 | sm.add(firstState) 17 | 18 | sm.add(secondState) 19 | 20 | sm.run() 21 | ================= 22 | -------------------------------------------------------------------------------- /statemachine/demo.lua: -------------------------------------------------------------------------------- 1 | dofile("statemachine.lua") 2 | 3 | sm = stateManager:new(true) 4 | firstState = state:new("first state", {function () print("demo") end}) 5 | -------------------------------------------------------------------------------- /statemachine/statemachine.lua: -------------------------------------------------------------------------------- 1 | local state = {} 2 | local state_mt = {__index = state} 3 | 4 | function state:new(new_id, new_wrap) 5 | local new_inst = {id = new_id, wrap = {func = new_wrap[1]}, orig} 6 | self.orig = self.wrap 7 | setmetatable(new_inst, state_mt) 8 | return new_inst 9 | end 10 | 11 | function state:getName() 12 | return self.id 13 | end 14 | 15 | function state:update() 16 | self.wrap.func() 17 | end 18 | 19 | local stateManager = {} 20 | local stateManager_mt = {__index = stateManager} 21 | function stateManager:new(isDebugMode) 22 | local new_inst = {running = true, selected = 1, list = {}, previousState = 1, debugMode = isDebugMode} 23 | setmetatable(new_inst, stateManager_mt) 24 | return new_inst 25 | end 26 | 27 | function stateManager:debugModeOn(isDebugMode) 28 | self.debugMode = isDebugMode 29 | if self.debugMode == true then 30 | print("# of states " .. #self.list) 31 | end 32 | end 33 | function stateManager:rollback() 34 | temp = self.selected 35 | self.selected = self.previousState 36 | self.previousState = temp 37 | if self.debugMode == true then print("rolled back to " .. self.list[self.selected]:getName() .. " state...") end 38 | end 39 | function stateManager:add(new_state) 40 | table.insert(self.list, new_state) 41 | end 42 | 43 | function stateManager:nextState() 44 | self.previousState = self.selected 45 | if #self.list > self.selected then 46 | self.selected = self.selected + 1 47 | else 48 | self.selected = 1 49 | end 50 | if self.debugMode == true then print("changed to " .. self.list[self.selected]:getName() .. " state...") end 51 | end 52 | 53 | function stateManager:changeStateTo(new_selected) 54 | self.previousState = self.selected 55 | if type(new_selected) == "number" then 56 | if new_selected > #self.list or new_selected < 1 then 57 | if self.debugMode then print("invalid state number...") end 58 | else 59 | self.selected = new_selected 60 | if self.debugMode == true then print("changed to " .. self.list[self.selected]:getName() .. " state...") end 61 | end 62 | elseif type(new_selected) == "string" then 63 | for i = 1, #self.list do 64 | if self.list[i]:getName() == new_selected then 65 | self.selected = i 66 | if self.debugMode == true then print("changed to " .. self.list[self.selected]:getName() .. " state...") end 67 | break 68 | else 69 | if i == #self.list then 70 | if self.debugMode == true then print("can't find state id...") end 71 | end 72 | end 73 | end 74 | else 75 | if self.debugMode == true then print("unknown type...") end 76 | end 77 | end 78 | 79 | function stateManager:run() 80 | self:changeStateTo(1) 81 | if #self.list >= 1 then 82 | while self.running do 83 | self.list[self.selected]:update() 84 | end 85 | else 86 | if self.debugMode == true then print("state list empty...") end 87 | end 88 | end 89 | function stateManager:stop() 90 | self.running = false 91 | if self.debugMode == true then print("state machine has stopped running") end 92 | end 93 | --------------------------------------------------------------------------------