spacepaste

  1.  
  2. class LogicServer(threading.Thread):
  3. def __init__(self):
  4. threading.Thread.__init__(self)
  5. self._game_running = True
  6. self._paused = False
  7. self._no_interaction = False
  8. self._is_started = False
  9. self._time = None
  10. self._panda = None
  11. self._objects = []
  12. self._scheduled_events = []
  13. # Internal methods
  14. def _tick(self):
  15. if self._paused:
  16. return
  17. self._no_interaction = True
  18. self._time = time.time()
  19. for event in self._scheduled_events:
  20. self._resolve_event(event)
  21. self._no_interaction = False
  22. def _resolve_event(self, _event_data):
  23. game, originator, event, call_time, fire_time, on_event, args, kwargs = _event_data
  24. mod_time = time.time() - self._time
  25. call_time += mod_time
  26. if fire_time is None:
  27. is_once = event(call_time, *args, **kwargs)
  28. if on_event is not None:
  29. self._fire_event(on_event, originator)
  30. if is_once:
  31. self._remove_event(_event_data)
  32. else:
  33. if call_time >= fire_time:
  34. mod_time = time.time() - self._time
  35. is_once = event(mod_time, *args, **kwargs)
  36. _event_data[3] = 0
  37. if on_event is not None:
  38. self._fire_event(on_event, originator)
  39. if is_once:
  40. self._remove_event(_event_data)
  41. else:
  42. _event_data[3] = call_time
  43. def _resolve_event_return_stack(self, _event_data):
  44. game, originator, event, call_time, fire_time, on_event, args, kwargs = _event_data
  45. mod_time = time.time() - self._time
  46. call_time += mod_time
  47. if fire_time is None:
  48. return True, event, call_time, args, kwargs
  49. else:
  50. if call_time >= fire_time:
  51. _event_data[3] = 0
  52. return True, event, call_time, args, kwargs
  53. else:
  54. _event_data[3] += call_time
  55. return False, None, None, None, None
  56. def _remove_event(self, event):
  57. try:
  58. self._scheduled_events.remove(event)
  59. except ValueError:
  60. pass # the event was already remove by some other means, usually by removing it in the logic
  61. def _fire_event(self, event, *args, **kwargs):
  62. for child in self._objects:
  63. stop = child._resolve_event(event, *args, **kwargs)
  64. if stop:
  65. return
  66. # API Methods
  67. def kill(self):
  68. """stops the execution of this Logic server"""
  69. assert self._is_started, "Cannot kill Logic server. It was either killed already or never started in the first place."
  70. self._game_running = False
  71. def parent_object(self, object):
  72. """parents Logic object to this server"""
  73. assert self._is_started, "Cannot reparent to Logic server. It was either killed already or never started in the first place."
  74. assert object not in self._objects, "Object already exists in the Logic, reparent failed."
  75. self._objects.append(object)
  76. def deparent_object(self, object):
  77. """parents Logic object to this server"""
  78. assert self._is_started, "Cannot reparent to Logic server. It was either killed already or never started in the first place."
  79. assert object in self._objects, "Object is not in the Logic, deparent failed."
  80. self._objects.remove(object)
  81. def schedule(self, originator, event, delay=None, on_event=None, *args, **kwargs):
  82. """schedules event on this Logic server"""
  83. assert self._is_started, "Cannot schedule event. It was either killed already or never started in the first place."
  84. event_data = [None, originator, event, 0, delay, on_event, args, kwargs]
  85. self._scheduled_events.append(event_data)
  86. def unschedule(self, originator, event):
  87. """unschedules event/events.
  88. If all is passed instead of event, it will unschedule ALL events owned by that originator.
  89. Otherwise, it will only unschedule first event (should be the only one anyways).
  90. """
  91. assert self._is_started, "Cannot unschedule event. It was either killed already or never started in the first place."
  92. if event != "all":
  93. for ev in self._scheduled_events:
  94. if (ev[1] is originator) and (ev[2] is event):
  95. self._remove_event(ev)
  96. return
  97. else:
  98. for ev in self._scheduled_events:
  99. if (ev[1] is originator):
  100. self._remove_event(ev)
  101. def trigger(self, event, *args, **kwargs):
  102. """triggers event on all children of this Logic server"""
  103. assert self._is_started, "Cannot trigger an event. It was either killed already or never started in the first place."
  104. self._fire_event(event, *args, **kwargs)
  105. def pause(self):
  106. """pauses this Logic server"""
  107. assert self._is_started, "Cannot pause Logic server. It was either killed already or never started in the first place."
  108. self._paused = True
  109. def resume(self):
  110. """resumes this Logic server"""
  111. assert self._is_started, "Cannot run Logic server. It was either killed already or never started in the first place."
  112. self._paused = False
  113. def restart(self):
  114. """restarts this Logic server"""
  115. assert self._is_started, "Cannot run Logic server. It was either killed already or never started in the first place."
  116. self._paused = True
  117. def return_status(self):
  118. return self._is_started
  119. # Run method
  120. def run(self):
  121. self._is_started = True
  122. while self._game_running:
  123. self._tick()
  124. time.sleep(0.000001)
  125. self._is_started = False
  126. logic_server = LogicServer()
  127. def run_logic():
  128. logic_server.start()
  129. def stop_logic():
  130. logic_server.kill()
  131. def pause_logic():
  132. logic_server.pause()
  133. def resume_logic():
  134. logic_server.resume()
  135. def restart_logic():
  136. logic_server.restart()
  137.