import sys import random from zc.units.zombies import ZombieFemale from zc.ai.pathfinder import * from zc.ai.empty import EmptyAi from zc.ai.zombie import ZombieAi from zc.logic.logicnode import LogicNode from zc.logic.text import Text, Textbuf class SecurityException(Exception): def __init__(self, *args, **kwargs): Exception.__init__(self, *args, **kwargs) # add more code, such as sending the exception over the network # so players can be warned if scum is trying something class ParserError(Exception): pass class MapLogic(LogicNode): Units = { "zombie_female":ZombieFemale, } AIs = { "zombie_female":ZombieAi, } Text = Text def __init__(self): LogicNode.__init__(self) self.game_values = {} self._js_event_wrapper = None self._triggers = {} self._game_in_progress = False self._panda = None self._map = None self.schedEv(self.on_game_second, d=1) def __del__(self): self._context.leave() def new_map_load(self, map_handle, render_window, map_data, _2d_render): import lib.PyV8 as PyV8 from zc.js.game_class import JSGameClass from zc.js.event_wrapper import JSEventWrapper self._game_class = JSGameClass(self, map_handle) self._js_event_wrapper = JSEventWrapper self._context = PyV8.JSContext(self._game_class) self._game_class.set_context(self._context) self._panda = render_window self._panda2d = _2d_render self._map = map_data print self._panda2d base_script = map_handle.find_file(map_handle.get_basename() + ".js") if base_script: self._game_class.include_from_fileobj(base_script) # System values self.game_values["game_random"] = random.Random() self.game_values["static_random"] = random.Random() # this one will be server based, eventually self.game_values["used_names"] = [] # Base values self.game_values["game_time"] = 0 self.game_values["time_of_day"] = 0 self.game_values["time_stopped"] = False self.game_values["units"] = [] self.game_values["texts"] = [] self.game_values["textbuf"] = Textbuf(self, self._panda, self._panda2d) self.game_values["misc_stuff"] = [] self.game_values["controled_units"] = { "Player":[], "Neutral":[], "Opponent":[], } self._game_in_progress = True self.trigEv("on_map_init") def initialize_pathfinder(self, nodemap): start_pathfinder() self._pathfinder = pathfinder self._pathfinder.initialize(nodemap) def _resolve_event(self, event, *args, **kwargs): if self._js_event_wrapper: self._js_event_wrapper(self._game_class, event, *args) LogicNode._resolve_event(self, event, *args, **kwargs) def call_from_js(self, event, kwargs={}, args=()): self.trigEv(event, issuer="logic", *args, **kwargs) def on_tick(self, dt): try: if not self._game_in_progress: return except: return self.trigEv("on_game_tick") def on_game_second(self, dt): if not self._game_in_progress: return self.game_values["game_time"] += 1 if not self.game_values["time_stopped"]: self.game_values["time_of_day"] += 1 if self.game_values["time_of_day"] >= 1440: self.game_values["time_of_day"] = 0 self.trigEv("on_time_midnight_passed") if ((self.game_values["time_of_day"] % 60) == 0) or (self.game_values["time_of_day"] == 0): self.trigEv("on_time_hour_started", self.game_values["time_of_day"]) # additional time of the day mechanics self.trigEv("on_game_time_tick")