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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  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. 'WalkJump',
  78. 'WalkAir',
  79. 'WalkLand',
  80. 'WalkHang',
  81. 'WalkClimb',
  82. 'WalkHurdle',
  83. 'Roll']
  84. for s in state_list:
  85. self.FSM.AddState(s, getattr(StatesPlayer, s)(self.FSM))
  86. t = 'to' + s
  87. self.FSM.AddTransition(t, Transition(s))
  88. if self.FSM.curState == None:
  89. self.FSM.SetState('Startup')
  90. def Execute(self):
  91. self.FSM.Execute(self.owner)
  92. #===================================
  93. #===================================
  94. class CameraFSM(Char):
  95. def __init__(self, owner):
  96. self.FSM = FSM(self, owner)
  97. self.owner = owner
  98. state_list = [
  99. 'Example']
  100. for s in state_list:
  101. self.FSM.AddState(s, getattr(StatesCamera, s)(self.FSM))
  102. t = 'to' + s
  103. self.FSM.AddTransition(t, Transition(s))
  104. if self.FSM.curState == None:
  105. self.FSM.SetState('Example')
  106. def Execute(self):
  107. self.FSM.Execute(self.owner)
  108. #===================================
  109. class CarFSM(Char):
  110. def __init__(self, owner):
  111. self.FSM = FSM(self, owner)
  112. self.owner = owner
  113. state_list = [
  114. 'Example',
  115. 'Activate',
  116. 'ExitParallelPark',
  117. 'EnterParallelPark',
  118. 'NavigateToTarget',
  119. 'RequestPath',
  120. 'EnterPerpPark',
  121. 'ExitPerpPark']
  122. for s in state_list:
  123. self.FSM.AddState(s, getattr(StatesCar, s)(self.FSM))
  124. t = 'to' + s
  125. self.FSM.AddTransition(t, Transition(s))
  126. if self.FSM.curState == None:
  127. self.FSM.SetState('Example')
  128. def Execute(self):
  129. self.FSM.Execute(self.owner)
  130. #===================================
  131. class WalkerFSM(Char):
  132. def __init__(self, owner):
  133. self.FSM = FSM(self, owner)
  134. self.owner = owner
  135. state_list = [
  136. 'Example',
  137. 'Activate',
  138. 'ExitParallelPark',
  139. 'EnterParallelPark',
  140. 'NavigateToTarget',
  141. 'RequestPath',
  142. 'HitBySkater',
  143. 'WalkingHitBySkater',
  144. 'Dance1',
  145. 'GoToSleep']
  146. for s in state_list:
  147. self.FSM.AddState(s, getattr(StatesWalker, s)(self.FSM))
  148. t = 'to' + s
  149. self.FSM.AddTransition(t, Transition(s))
  150. if self.FSM.curState == None:
  151. self.FSM.SetState('Example')
  152. def Execute(self):
  153. self.FSM.Execute(self.owner)
  154. #===================================
  155. class TrainFSM(Char):
  156. def __init__(self, owner):
  157. self.FSM = FSM(self, owner)
  158. self.owner = owner
  159. state_list = [
  160. 'Example']
  161. for s in state_list:
  162. self.FSM.AddState(s, getattr(StatesTrain, s)(self.FSM))
  163. t = 'to' + s
  164. self.FSM.AddTransition(t, Transition(s))
  165. if self.FSM.curState == None:
  166. self.FSM.SetState('Example')
  167. def Execute(self):
  168. self.FSM.Execute(self.owner)
  169. #===================================
  170. class EaFSM(Char):
  171. def __init__(self, owner):
  172. self.FSM = FSM(self, owner)
  173. self.owner = owner
  174. state_list = [
  175. 'Example',
  176. 'Land']
  177. for s in state_list:
  178. self.FSM.AddState(s, getattr(StatesEa, s)(self.FSM))
  179. t = 'to' + s
  180. self.FSM.AddTransition(t, Transition(s))
  181. if self.FSM.curState == None:
  182. self.FSM.SetState('Example')
  183. def Execute(self):
  184. self.FSM.Execute(self.owner)