import bge import StatesNpcPed import StatesCamera #==================================== class Transition(object): def __init__(self, toState): self.toState = toState def Execute(self): pass #=================================== class FSM(object): def __init__ (self, character, owner): self.char = character self.states = {} self.transitions = {} self.curState = None self.prevState = None self.trans = None self.stateLife = 0 self.owner = owner self.name = None def AddTransition(self, transName, transition): self.transitions[transName] = transition def AddState(self, stateName, state): self.states[stateName] = state self.states[stateName].name = state def SetState(self, stateName): self.prevState = self.curState self.curState = self.states[stateName] def ToTransition(self, toTrans): self.trans = self.transitions[toTrans] def Execute(self, owner): if (self.trans): self.owner = owner self.curState.Exit() self.trans.Execute() self.SetState(self.trans.toState) self.curState.Enter() self.trans = None self.curState.Execute() #==================================== Char = type("Char",(object,),{}) #=================================== class NpcPed(Char): def __init__(self, owner): self.FSM = FSM(self, owner) self.owner = owner state_list = [ 'Example'] for s in state_list: self.FSM.AddState(s, getattr(StatesNpcPed, s)(self.FSM)) t = 'to' + s self.FSM.AddTransition(t, Transition(s)) if self.FSM.curState == None: self.FSM.SetState('Example') def Execute(self): self.FSM.Execute(self.owner) #=================================== class CameraFSM(Char): def __init__(self, owner): self.FSM = FSM(self, owner) self.owner = owner state_list = [ 'Example'] for s in state_list: self.FSM.AddState(s, getattr(StatesCamera, s)(self.FSM)) t = 'to' + s self.FSM.AddTransition(t, Transition(s)) if self.FSM.curState == None: self.FSM.SetState('Example') def Execute(self): self.FSM.Execute(self.owner)