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

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