class Entity: INIT_ORDER = ["model", "style", "position", "size", "graphics"] def __init__(self, name): self.name = name self.model = {} self._log = MessageLogger() self.log = self._log.log self.get_message = self._log.get_message self.get_log = self._log.get_log self.clock = Clock(name + " clock") self.rect = Rect((1, 1), (0, 0)) self.controllers = [] self.control_freeze = False self.visible = True self._graphics = None self._style = {} self.sounds = {} self.meters = {} self.event = None self.event_handler = EventHandler(self) self.handle_event = self.event_handler.handle_event self.queue_events({"name": "on_spawn"}) def __repr__(self): c = self.__class__.__name__ n = self.name return "{}: '{}'".format(c, n) def queue_events(self, *events): self.event_handler.queue_events(*events) def add_listener(self, event_name, response): if "target" in response: target = response["target"] else: target = self l = {"name": event_name, "target": target, "response": response} self.event_handler.listeners.append(l) def update(self): for m in self.get_update_methods(): m() def get_update_methods(self): um = [self.clock.tick] if self.controller: um.append(self.controller.update) if self.graphics: um.append(self.graphics.update) return um def move(self, dxdy): self.rect.move(dxdy) def kill(self): self.control_freeze = True dying = { "name": "on_dying", "duration": DYING_TIME, } self.queue_events(dying, "on_death") @property def graphics(self): return self._graphics @graphics.setter def graphics(self, value): if isinstance(value, Graphics): self._graphics = value else: self.set_graphics(value) @property def controller(self): if self.controllers: return self.controllers[0] @property def image(self): if self.graphics: return self.graphics.get_image() else: return False @property def draw_point(self): return self.position @property def position(self): return self.get_position() @position.setter def position(self, value): x, y = value self.set_position(x, y) def get_position(self): return self.rect.position def set_position(self, x, y): self.rect.position = x, y self.handle_event("on_change_position") @property def size(self): return self.get_size() @size.setter def size(self, value): w, h = value self.set_size(w, h) def get_size(self): return self.rect.size def set_size(self, w, h): self.rect.size = w, h self.handle_event("on_change_size") @property def style(self): if not self._style: self._style = DEFAULT_STYLE.copy() return self._style @style.setter def style(self, value): self.set_style(value) def set_style(self, style): if type(style) is dict: self.style.update(style) if type(style) is str: self._style = load_style(style) if self.graphics: self.graphics.reset_image() def set_meters(self, d): for name in d: self.meters[name] = Meter(name, *d[name]) def get_meter_value(self, name): return self.meters[name].value def set_graphics(self, graphics, *args, **kwargs): self._graphics = graphics(self, *args, **kwargs) self.handle_event("on_change_size") def set_resources(self, *dict_names): for name in dict_names: rd = load_resource("resource_dicts")[name] for key in rd: file_name = rd[key] self.add_resource(key, file_name) def add_resource(self, key, file_name): item = load_resource(file_name) ext = file_name.split(".")[-1] if ext in SOUND_EXT: self.sounds[key] = item def set_controller(self, arg, clear=True): if type(arg) is str: cont = load_controller(arg) else: name = arg.pop("name") cont = make_controller(name, arg) if not clear: self.controllers.append(cont) else: self.controllers = [cont] def set_controllers(self, controllers): for c in controllers: self.set_controller(c.name, clear=False) def set_controller_index(self, layer, index): file_name = layer.controllers[index].name self.set_controller(file_name) def set_command_inputs(self, *commands): for name in commands: c = load_resource("command_inputs")[name] for controller in self.controllers: controller.add_command_input(name, c) def set_event_passers(self, target, *event_names): for name in event_names: l = {"name": name, "target": target} self.event_handler.listeners.append(l) def set_event(self, event): self.event = event.copy() def set_model(self, d, update=False): if not update: self.model = d else: self.model.update(d)
def setCityProperty(self, id, city, tiles=[]): self._stop = xbmc.abortRequested if self._stop: return #[u'city', u'outlook', u'temp', u'url', u'country', u'coords', u'time', u'unit', u'icon'] ok = False try: b_prop = "weatherworld.city.%i." % id lat = float(city["coords"]["lat"][1]) long = float(city["coords"]["long"][1]) posx, posy = self.getPosition(lat, long, self.mapwidth, self.mapheight) rect = Rect(posx, posy, self.tilewidth, self.tileheight) flipx, flipy = 0, 0 offsetx, offsety = 0, 0 if rect.right > self.mapwidth: flipx, offsetx = 1, -self.tilewidth if rect.bottom > self.mapheight: flipy, offsety = 1, -self.tileheight if offsetx or offsety: rect.move(posx + offsetx, posy + offsety) collide = False for tile in tiles: collide = rect.colliderect(tile) is not None if collide: break if collide: self.window.setProperty(b_prop + "name", "") return ok, tiles tiles.append(rect) self.window.setProperty(b_prop + "flipx", str(flipx)) self.window.setProperty(b_prop + "flipy", str(flipy)) try: localtime = get_user_time_format(city["time"]) except: localtime = city["time"] self.window.setProperty(b_prop + "name", city["city"] + ", " + city["country"]) self.window.setProperty(b_prop + "outlook", city["outlook"]) celsius, unit = fahrenheit2celsius(city["temp"], city["unit"]) self.window.setProperty(b_prop + "temperature", celsius) self.window.setProperty(b_prop + "unit", unit) self.window.setProperty(b_prop + "localtime", localtime) self.window.setProperty(b_prop + "icon", city["icon"]) self.window.setProperty(b_prop + "latitude", city["coords"]["lat"][0]) self.window.setProperty(b_prop + "longitude", city["coords"]["long"][0]) # get old pos oldx, oldy = self.window.getProperty( b_prop + "posx"), self.window.getProperty(b_prop + "posy") self.window.setProperty(b_prop + "posx", str(posx)) self.window.setProperty(b_prop + "posy", str(posy)) start = "0,0" if oldx.isdigit() and oldy.isdigit(): start = "%s,%s" % (oldx, oldy) control = self.controls[2600 + id] if control: control.setAnimations([( 'conditional', 'condition=true effect=slide start=%s end=%i,%i time=500 easing=inout tween=easing' % (start, posx, posy))]) ok = True except: ok = "error" print_exc() return ok, tiles
def setCityProperty( self, id, city, tiles=[] ): self._stop = xbmc.abortRequested if self._stop: return #[u'city', u'outlook', u'temp', u'url', u'country', u'coords', u'time', u'unit', u'icon'] ok = False try: b_prop = "weatherworld.city.%i." % id lat = float( city[ "coords" ][ "lat" ][ 1 ] ) long = float( city[ "coords" ][ "long" ][ 1 ] ) posx, posy = self.getPosition( lat, long, self.mapwidth, self.mapheight ) rect = Rect( posx, posy, self.tilewidth, self.tileheight ) flipx, flipy = 0, 0 offsetx, offsety = 0, 0 if rect.right > self.mapwidth: flipx, offsetx = 1, -self.tilewidth if rect.bottom > self.mapheight: flipy, offsety = 1, -self.tileheight if offsetx or offsety: rect.move( posx+offsetx, posy+offsety ) collide = False for tile in tiles: collide = rect.colliderect( tile ) is not None if collide: break if collide: self.window.setProperty( b_prop + "name", "" ) return ok, tiles tiles.append( rect ) self.window.setProperty( b_prop + "flipx", str( flipx ) ) self.window.setProperty( b_prop + "flipy", str( flipy ) ) try: localtime = get_user_time_format( city[ "time" ] ) except: localtime = city[ "time" ] self.window.setProperty( b_prop + "name", city[ "city" ] + ", " + city[ "country" ] ) self.window.setProperty( b_prop + "outlook", city[ "outlook" ] ) celsius, unit = fahrenheit2celsius( city[ "temp" ], city[ "unit" ] ) self.window.setProperty( b_prop + "temperature", celsius ) self.window.setProperty( b_prop + "unit", unit ) self.window.setProperty( b_prop + "localtime", localtime ) self.window.setProperty( b_prop + "icon", city[ "icon" ] ) self.window.setProperty( b_prop + "latitude", city[ "coords" ][ "lat" ][ 0 ] ) self.window.setProperty( b_prop + "longitude", city[ "coords" ][ "long" ][ 0 ] ) # get old pos oldx, oldy = self.window.getProperty( b_prop + "posx" ), self.window.getProperty( b_prop + "posy" ) self.window.setProperty( b_prop + "posx", str( posx ) ) self.window.setProperty( b_prop + "posy", str( posy ) ) start = "0,0" if oldx.isdigit() and oldy.isdigit(): start = "%s,%s" % ( oldx, oldy ) control = self.controls[ 2600 + id ] if control: control.setAnimations( [ ( 'conditional', 'condition=true effect=slide start=%s end=%i,%i time=500 easing=inout tween=easing' % ( start, posx, posy ) ) ] ) ok = True except: ok = "error" print_exc() return ok, tiles