Exemple #1
0
 def terrain(self):
     data =  s11n.from_json(self._model.terrain)
     terrain = []
     for row in data:
         terrain.append([])
         for cell in row:
             terrain[-1].append(TERRAIN(cell))
     return terrain
Exemple #2
0
class GuideMobResource(MobResourceBase):
    @validator(code='mobs.mob_disabled',
               message='монстр находится вне игры',
               status_code=404)
    def validate_mob_disabled(self, *args, **kwargs):
        return not self.mob.state.is_DISABLED or self.can_create_mob or self.can_moderate_mob

    @validate_argument('state', argument_to_mob_state, 'mobs',
                       'неверное состояние записи о монстре')
    @validate_argument('terrain', lambda value: TERRAIN(int(value)), 'mobs',
                       'неверный тип территории')
    @validate_argument('order_by', INDEX_ORDER_TYPE, 'mobs',
                       'неверный тип сортировки')
    @validate_argument('archetype', argument_to_archetype, 'mobs',
                       'неверный архетип монстра')
    @validate_argument('type', argument_to_mob_type, 'mobs',
                       'неверный тип монстра')
    @handler('', method='get')
    def index(self,
              state=MOB_RECORD_STATE.ENABLED,
              terrain=None,
              order_by=INDEX_ORDER_TYPE.BY_NAME,
              type=None,
              archetype=None):

        mobs = mobs_storage.all()

        if not self.can_create_mob and not self.can_moderate_mob:
            mobs = [mob for mob in mobs if mob.state.is_ENABLED]  # pylint: disable=W0110

        is_filtering = False

        if not state.is_ENABLED:  # if not default
            is_filtering = True
        mobs = [mob for mob in mobs if mob.state == state]  # pylint: disable=W0110

        if terrain is not None:
            is_filtering = True
            mobs = [mob for mob in mobs if terrain in mob.terrains]  # pylint: disable=W0110

        if order_by.is_BY_NAME:
            mobs = sorted(mobs, key=lambda mob: mob.name)
        elif order_by.is_BY_LEVEL:
            mobs = sorted(mobs, key=lambda mob: mob.level)

        if type is not None:
            mobs = [mob for mob in mobs if mob.type == type]  # pylint: disable=W0110

        if archetype is not None:
            mobs = [mob for mob in mobs if mob.archetype == archetype]  # pylint: disable=W0110

        url_builder = UrlBuilder(
            reverse('guide:mobs:'),
            arguments={
                'state': state.value if state is not None else None,
                'terrain': terrain.value if terrain is not None else None,
                'type': type.value if type is not None else None,
                'archetype':
                archetype.value if archetype is not None else None,
                'order_by': order_by.value
            })

        IndexFilter = ModeratorIndexFilter if self.can_create_mob or self.can_moderate_mob else UnloginedIndexFilter  #pylint: disable=C0103

        index_filter = IndexFilter(
            url_builder=url_builder,
            values={
                'state': state.value if state is not None else None,
                'terrain': terrain.value if terrain is not None else None,
                'type': type.value if type is not None else None,
                'archetype':
                archetype.value if archetype is not None else None,
                'order_by': order_by.value
            })

        return self.template(
            'mobs/index.html', {
                'mobs': mobs,
                'is_filtering': is_filtering,
                'MOB_RECORD_STATE': MOB_RECORD_STATE,
                'TERRAIN': TERRAIN,
                'state': state,
                'terrain': terrain,
                'order_by': order_by,
                'INDEX_ORDER_TYPE': INDEX_ORDER_TYPE,
                'url_builder': url_builder,
                'index_filter': index_filter,
                'section': 'mobs'
            })

    @validate_mob_disabled()
    @handler('#mob', name='show', method='get')
    def show(self):
        return self.template(
            'mobs/show.html', {
                'mob': self.mob,
                'mob_meta_object': meta_relations.Mob.create_from_object(
                    self.mob),
                'section': 'mobs'
            })

    @validate_mob_disabled()
    @handler('#mob', 'info', method='get')
    def show_dialog(self):
        return self.template(
            'mobs/info.html', {
                'mob': self.mob,
                'mob_meta_object': meta_relations.Mob.create_from_object(
                    self.mob),
            })
Exemple #3
0
    def handle(self, *args, **options):

        region = options['region']
        if not region:
            region = map_settings.GEN_REGION_OUTPUT % map_info_storage.version

        output = options['output']
        if not output:
            output = '/tmp/the-tale-map.png'

        with open(region) as region_file:
            data = json.loads(region_file.read())

        terrain = data['terrain']
        buildings = data['buildings'].values()
        places = data['places'].values()
        roads = data['roads'].values()

        width = data['width']
        height = data['height']

        roads_map = get_roads_map(width, height, roads,
                                  {place['id']: place
                                   for place in places})

        image = PIL.Image.new(
            'RGBA',
            (width * map_settings.CELL_SIZE, height * map_settings.CELL_SIZE))

        texture = PIL.Image.open(map_settings.TEXTURE_PATH)

        for y, row in enumerate(terrain):
            for x, cell in enumerate(row):
                terrain_type = TERRAIN(cell)
                draw_sprite(image, texture, terrain_type.name, x, y)

                if roads_map[y][x]:
                    draw_sprite(image,
                                texture,
                                terrain_type.name,
                                x,
                                y,
                                base=True)

                    road_sprite = get_road_sprite_info(roads_map, x, y)
                    draw_sprite(image,
                                texture,
                                road_sprite['name'],
                                x,
                                y,
                                rotate=road_sprite['rotate'])

        for place_info in places:
            size = place_info['size']
            race = RACE(place_info['race'])

            if size < 3: verbose_size = 'small'
            elif size < 6: verbose_size = 'medium'
            elif size < 9: verbose_size = 'large'
            else: verbose_size = 'capital'

            sprite_name = ('city_%s_%s' %
                           (race.name.lower(), verbose_size)).upper()
            draw_sprite(image, texture, sprite_name, place_info['pos']['x'],
                        place_info['pos']['y'])

        for building_info in buildings:
            x, y = building_info['pos']['x'], building_info['pos']['y']
            draw_sprite(image,
                        texture,
                        TERRAIN(terrain[y][x]).name,
                        x,
                        y,
                        base=True)

            sprite_name = 'BUILDING_%s' % BUILDING_TYPE(
                building_info['type']).name
            draw_sprite(image, texture, sprite_name, x, y)

        image.crop(OUTPUT_RECTANGLE).resize(REAL_SIZE,
                                            PIL.Image.ANTIALIAS).save(output)
Exemple #4
0
 def get_terrains(self):
     if not hasattr(self, '_terrains'):
         self._terrains = frozenset(
             TERRAIN(terrain)
             for terrain in s11n.from_json(self._model.terrains))
     return self._terrains