spacepaste

  1.  
  2. import sys
  3. import random
  4. from zc.units.zombies import ZombieFemale
  5. from zc.ai.pathfinder import *
  6. from zc.ai.empty import EmptyAi
  7. from zc.ai.zombie import ZombieAi
  8. from zc.logic.logicnode import LogicNode
  9. from zc.logic.text import Text, Textbuf
  10. class SecurityException(Exception):
  11. def __init__(self, *args, **kwargs):
  12. Exception.__init__(self, *args, **kwargs)
  13. # add more code, such as sending the exception over the network
  14. # so players can be warned if scum is trying something
  15. class ParserError(Exception):
  16. pass
  17. class MapLogic(LogicNode):
  18. Units = {
  19. "zombie_female":ZombieFemale,
  20. }
  21. AIs = {
  22. "zombie_female":ZombieAi,
  23. }
  24. Text = Text
  25. def __init__(self):
  26. LogicNode.__init__(self)
  27. self.game_values = {}
  28. self._js_event_wrapper = None
  29. self._triggers = {}
  30. self._game_in_progress = False
  31. self._panda = None
  32. self._map = None
  33. self.schedEv(self.on_game_second, d=1)
  34. def __del__(self):
  35. self._context.leave()
  36. def new_map_load(self, map_handle, render_window, map_data, _2d_render):
  37. import lib.PyV8 as PyV8
  38. from zc.js.game_class import JSGameClass
  39. from zc.js.event_wrapper import JSEventWrapper
  40. self._game_class = JSGameClass(self, map_handle)
  41. self._js_event_wrapper = JSEventWrapper
  42. self._context = PyV8.JSContext(self._game_class)
  43. self._game_class.set_context(self._context)
  44. self._panda = render_window
  45. self._panda2d = _2d_render
  46. self._map = map_data
  47. print self._panda2d
  48. base_script = map_handle.find_file(map_handle.get_basename() + ".js")
  49. if base_script:
  50. self._game_class.include_from_fileobj(base_script)
  51. # System values
  52. self.game_values["game_random"] = random.Random()
  53. self.game_values["static_random"] = random.Random() # this one will be server based, eventually
  54. self.game_values["used_names"] = []
  55. # Base values
  56. self.game_values["game_time"] = 0
  57. self.game_values["time_of_day"] = 0
  58. self.game_values["time_stopped"] = False
  59. self.game_values["units"] = []
  60. self.game_values["texts"] = []
  61. self.game_values["textbuf"] = Textbuf(self, self._panda, self._panda2d)
  62. self.game_values["misc_stuff"] = []
  63. self.game_values["controled_units"] = {
  64. "Player":[],
  65. "Neutral":[],
  66. "Opponent":[],
  67. }
  68. self._game_in_progress = True
  69. self.trigEv("on_map_init")
  70. def initialize_pathfinder(self, nodemap):
  71. start_pathfinder()
  72. self._pathfinder = pathfinder
  73. self._pathfinder.initialize(nodemap)
  74. def _resolve_event(self, event, *args, **kwargs):
  75. if self._js_event_wrapper:
  76. self._js_event_wrapper(self._game_class, event, *args)
  77. LogicNode._resolve_event(self, event, *args, **kwargs)
  78. def call_from_js(self, event, kwargs={}, args=()):
  79. self.trigEv(event, issuer="logic", *args, **kwargs)
  80. def on_tick(self, dt):
  81. try:
  82. if not self._game_in_progress:
  83. return
  84. except:
  85. return
  86. self.trigEv("on_game_tick")
  87. def on_game_second(self, dt):
  88. if not self._game_in_progress:
  89. return
  90. self.game_values["game_time"] += 1
  91. if not self.game_values["time_stopped"]:
  92. self.game_values["time_of_day"] += 1
  93. if self.game_values["time_of_day"] >= 1440:
  94. self.game_values["time_of_day"] = 0
  95. self.trigEv("on_time_midnight_passed")
  96. if ((self.game_values["time_of_day"] % 60) == 0) or (self.game_values["time_of_day"] == 0):
  97. self.trigEv("on_time_hour_started", self.game_values["time_of_day"])
  98. # additional time of the day mechanics
  99. self.trigEv("on_game_time_tick")
  100.