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.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  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. self.last_state_notes = None
  28. def AddTransition(self, transName, transition):
  29. self.transitions[transName] = transition
  30. def AddState(self, stateName, state):
  31. self.states[stateName] = state
  32. self.states[stateName].name = state
  33. def SetState(self, stateName):
  34. self.prevState = self.curState
  35. self.curState = self.states[stateName]
  36. def ToTransition(self, toTrans):
  37. self.trans = self.transitions[toTrans]
  38. def Execute(self, owner):
  39. if (self.trans):
  40. self.owner = owner
  41. self.curState.Exit()
  42. self.trans.Execute()
  43. self.SetState(self.trans.toState)
  44. self.curState.Enter()
  45. self.trans = None
  46. self.curState.Execute()
  47. #====================================
  48. Char = type("Char",(object,),{})
  49. #===================================
  50. #===================================
  51. class GameFSM(Char):
  52. def __init__(self, owner):
  53. self.FSM = FSM(self, owner)
  54. self.owner = owner
  55. state_list = [
  56. 'Example',
  57. 'Startup',
  58. 'Initer',
  59. 'LoadLevel',
  60. 'GameOn',
  61. 'Reload']
  62. for s in state_list:
  63. self.FSM.AddState(s, getattr(StatesGame, s)(self.FSM))
  64. t = 'to' + s
  65. self.FSM.AddTransition(t, Transition(s))
  66. if self.FSM.curState == None:
  67. self.FSM.SetState('Startup')
  68. def Execute(self):
  69. self.FSM.Execute(self.owner)
  70. #===================================
  71. class PlayerFSM(Char):
  72. def __init__(self, owner):
  73. self.FSM = FSM(self, owner)
  74. self.owner = owner
  75. state_list = [
  76. 'Example',
  77. 'Startup',
  78. 'Walk',
  79. 'WalkJump',
  80. 'WalkAir',
  81. 'WalkLand',
  82. 'WalkHang',
  83. 'WalkClimb',
  84. 'WalkHurdle',
  85. 'WalkOnboard',
  86. 'AirOnboard',
  87. 'Offboard',
  88. 'Dropin',
  89. 'Roll',
  90. 'Ragdoll',
  91. 'Pause']
  92. for s in state_list:
  93. self.FSM.AddState(s, getattr(StatesPlayer, s)(self.FSM))
  94. t = 'to' + s
  95. self.FSM.AddTransition(t, Transition(s))
  96. if self.FSM.curState == None:
  97. self.FSM.SetState('Startup')
  98. def Execute(self):
  99. self.FSM.Execute(self.owner)
  100. #===================================
  101. #===================================
  102. class CameraFSM(Char):
  103. def __init__(self, owner):
  104. self.FSM = FSM(self, owner)
  105. self.owner = owner
  106. state_list = [
  107. 'Example']
  108. for s in state_list:
  109. self.FSM.AddState(s, getattr(StatesCamera, s)(self.FSM))
  110. t = 'to' + s
  111. self.FSM.AddTransition(t, Transition(s))
  112. if self.FSM.curState == None:
  113. self.FSM.SetState('Example')
  114. def Execute(self):
  115. self.FSM.Execute(self.owner)
  116. #===================================
  117. class CarFSM(Char):
  118. def __init__(self, owner):
  119. self.FSM = FSM(self, owner)
  120. self.owner = owner
  121. state_list = [
  122. 'Example',
  123. 'Activate',
  124. 'ExitParallelPark',
  125. 'EnterParallelPark',
  126. 'NavigateToTarget',
  127. 'RequestPath',
  128. 'EnterPerpPark',
  129. 'ExitPerpPark']
  130. for s in state_list:
  131. self.FSM.AddState(s, getattr(StatesCar, s)(self.FSM))
  132. t = 'to' + s
  133. self.FSM.AddTransition(t, Transition(s))
  134. if self.FSM.curState == None:
  135. self.FSM.SetState('Example')
  136. def Execute(self):
  137. self.FSM.Execute(self.owner)
  138. #===================================
  139. class WalkerFSM(Char):
  140. def __init__(self, owner):
  141. self.FSM = FSM(self, owner)
  142. self.owner = owner
  143. state_list = [
  144. 'Example',
  145. 'Activate',
  146. 'ExitParallelPark',
  147. 'EnterParallelPark',
  148. 'NavigateToTarget',
  149. 'RequestPath',
  150. 'HitBySkater',
  151. 'WalkingHitBySkater',
  152. 'Dance1',
  153. 'GoToSleep']
  154. for s in state_list:
  155. self.FSM.AddState(s, getattr(StatesWalker, s)(self.FSM))
  156. t = 'to' + s
  157. self.FSM.AddTransition(t, Transition(s))
  158. if self.FSM.curState == None:
  159. self.FSM.SetState('Example')
  160. def Execute(self):
  161. self.FSM.Execute(self.owner)
  162. #===================================
  163. class TrainFSM(Char):
  164. def __init__(self, owner):
  165. self.FSM = FSM(self, owner)
  166. self.owner = owner
  167. state_list = [
  168. 'Example']
  169. for s in state_list:
  170. self.FSM.AddState(s, getattr(StatesTrain, s)(self.FSM))
  171. t = 'to' + s
  172. self.FSM.AddTransition(t, Transition(s))
  173. if self.FSM.curState == None:
  174. self.FSM.SetState('Example')
  175. def Execute(self):
  176. self.FSM.Execute(self.owner)
  177. #===================================
  178. class EaFSM(Char):
  179. def __init__(self, owner):
  180. self.FSM = FSM(self, owner)
  181. self.owner = owner
  182. state_list = [
  183. 'Example',
  184. 'Land']
  185. for s in state_list:
  186. self.FSM.AddState(s, getattr(StatesEa, s)(self.FSM))
  187. t = 'to' + s
  188. self.FSM.AddTransition(t, Transition(s))
  189. if self.FSM.curState == None:
  190. self.FSM.SetState('Example')
  191. def Execute(self):
  192. self.FSM.Execute(self.owner)