Shuvit game master repo. http://shuvit.org
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

FSM.py 6.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. import bge
  2. import StatesGame
  3. import StatesPlayer
  4. import StatesWalker
  5. import StatesCamera
  6. import StatesCar
  7. import StatesEa
  8. import StatesTrain
  9. #====================================
  10. class Transition(object):
  11. def __init__(self, toState):
  12. self.toState = toState
  13. def Execute(self):
  14. pass
  15. #===================================
  16. class FSM(object):
  17. def __init__ (self, character, owner):
  18. self.char = character
  19. self.states = {}
  20. self.transitions = {}
  21. self.curState = None
  22. self.prevState = None
  23. self.trans = None
  24. self.stateLife = 0
  25. self.owner = owner
  26. self.name = None
  27. def AddTransition(self, transName, transition):
  28. self.transitions[transName] = transition
  29. def AddState(self, stateName, state):
  30. self.states[stateName] = state
  31. self.states[stateName].name = state
  32. def SetState(self, stateName):
  33. self.prevState = self.curState
  34. self.curState = self.states[stateName]
  35. def ToTransition(self, toTrans):
  36. self.trans = self.transitions[toTrans]
  37. def Execute(self, owner):
  38. if (self.trans):
  39. self.owner = owner
  40. self.curState.Exit()
  41. self.trans.Execute()
  42. self.SetState(self.trans.toState)
  43. self.curState.Enter()
  44. self.trans = None
  45. self.curState.Execute()
  46. #====================================
  47. Char = type("Char",(object,),{})
  48. #===================================
  49. #===================================
  50. class GameFSM(Char):
  51. def __init__(self, owner):
  52. self.FSM = FSM(self, owner)
  53. self.owner = owner
  54. state_list = [
  55. 'Example',
  56. 'Startup',
  57. 'Initer',
  58. 'LoadLevel',
  59. 'GameOn']
  60. for s in state_list:
  61. self.FSM.AddState(s, getattr(StatesGame, s)(self.FSM))
  62. t = 'to' + s
  63. self.FSM.AddTransition(t, Transition(s))
  64. if self.FSM.curState == None:
  65. self.FSM.SetState('Startup')
  66. def Execute(self):
  67. self.FSM.Execute(self.owner)
  68. #===================================
  69. class PlayerFSM(Char):
  70. def __init__(self, owner):
  71. self.FSM = FSM(self, owner)
  72. self.owner = owner
  73. state_list = [
  74. 'Example',
  75. 'Startup',
  76. 'Walk',
  77. 'Roll']
  78. for s in state_list:
  79. self.FSM.AddState(s, getattr(StatesPlayer, s)(self.FSM))
  80. t = 'to' + s
  81. self.FSM.AddTransition(t, Transition(s))
  82. if self.FSM.curState == None:
  83. self.FSM.SetState('Startup')
  84. def Execute(self):
  85. self.FSM.Execute(self.owner)
  86. #===================================
  87. #===================================
  88. class CameraFSM(Char):
  89. def __init__(self, owner):
  90. self.FSM = FSM(self, owner)
  91. self.owner = owner
  92. state_list = [
  93. 'Example']
  94. for s in state_list:
  95. self.FSM.AddState(s, getattr(StatesCamera, s)(self.FSM))
  96. t = 'to' + s
  97. self.FSM.AddTransition(t, Transition(s))
  98. if self.FSM.curState == None:
  99. self.FSM.SetState('Example')
  100. def Execute(self):
  101. self.FSM.Execute(self.owner)
  102. #===================================
  103. class CarFSM(Char):
  104. def __init__(self, owner):
  105. self.FSM = FSM(self, owner)
  106. self.owner = owner
  107. state_list = [
  108. 'Example',
  109. 'Activate',
  110. 'ExitParallelPark',
  111. 'EnterParallelPark',
  112. 'NavigateToTarget',
  113. 'RequestPath',
  114. 'EnterPerpPark',
  115. 'ExitPerpPark']
  116. for s in state_list:
  117. self.FSM.AddState(s, getattr(StatesCar, s)(self.FSM))
  118. t = 'to' + s
  119. self.FSM.AddTransition(t, Transition(s))
  120. if self.FSM.curState == None:
  121. self.FSM.SetState('Example')
  122. def Execute(self):
  123. self.FSM.Execute(self.owner)
  124. #===================================
  125. class WalkerFSM(Char):
  126. def __init__(self, owner):
  127. self.FSM = FSM(self, owner)
  128. self.owner = owner
  129. state_list = [
  130. 'Example',
  131. 'Activate',
  132. 'ExitParallelPark',
  133. 'EnterParallelPark',
  134. 'NavigateToTarget',
  135. 'RequestPath',
  136. 'HitBySkater',
  137. 'WalkingHitBySkater',
  138. 'Dance1',
  139. 'GoToSleep']
  140. for s in state_list:
  141. self.FSM.AddState(s, getattr(StatesWalker, s)(self.FSM))
  142. t = 'to' + s
  143. self.FSM.AddTransition(t, Transition(s))
  144. if self.FSM.curState == None:
  145. self.FSM.SetState('Example')
  146. def Execute(self):
  147. self.FSM.Execute(self.owner)
  148. #===================================
  149. class TrainFSM(Char):
  150. def __init__(self, owner):
  151. self.FSM = FSM(self, owner)
  152. self.owner = owner
  153. state_list = [
  154. 'Example']
  155. for s in state_list:
  156. self.FSM.AddState(s, getattr(StatesTrain, s)(self.FSM))
  157. t = 'to' + s
  158. self.FSM.AddTransition(t, Transition(s))
  159. if self.FSM.curState == None:
  160. self.FSM.SetState('Example')
  161. def Execute(self):
  162. self.FSM.Execute(self.owner)
  163. #===================================
  164. class EaFSM(Char):
  165. def __init__(self, owner):
  166. self.FSM = FSM(self, owner)
  167. self.owner = owner
  168. state_list = [
  169. 'Example',
  170. 'Land']
  171. for s in state_list:
  172. self.FSM.AddState(s, getattr(StatesEa, s)(self.FSM))
  173. t = 'to' + s
  174. self.FSM.AddTransition(t, Transition(s))
  175. if self.FSM.curState == None:
  176. self.FSM.SetState('Example')
  177. def Execute(self):
  178. self.FSM.Execute(self.owner)