예제 #1
0
    def sync_data(self, sheduled=True):

        self.logger.info('sync data')

        all_persons = persons_storage.persons_storage.filter(state=PERSON_STATE.IN_GAME)

        self.sync_persons_powers(persons=[person for person in all_persons if person.place.is_frontier])
        self.sync_persons_powers(persons=[person for person in all_persons if not person.place.is_frontier])

        for person in all_persons:
            person.update_friends_number()
            person.update_enemies_number()

        self.persons_power = {}

        self.sync_places_powers(places=[place for place in places_storage.all() if place.is_frontier])
        self.sync_places_powers(places=[place for place in places_storage.all() if not place.is_frontier])

        self.places_power = {}

        # update size
        if sheduled:
            self.sync_sizes([place for place in places_storage.all() if place.is_frontier],
                            hours=c.MAP_SYNC_TIME_HOURS,
                            max_size=places_settings.MAX_FRONTIER_SIZE)

            self.sync_sizes([place for place in places_storage.all() if not place.is_frontier],
                            hours=c.MAP_SYNC_TIME_HOURS,
                            max_size=places_settings.MAX_SIZE)


        for place in places_storage.all():
            place.sync_stability()
            place.sync_modifier()
            place.sync_habits()

            place.sync_parameters() # must be last operation to display and use real data

            place.update_heroes_number()
            place.update_heroes_habits()

            place.mark_as_updated()

        places_storage.save_all()

        persons_storage.persons_storage.remove_out_game_persons()
        persons_storage.persons_storage.save_all()

        persons_logic.sync_social_connections()

        if sheduled:
            for building in buildings_storage.all():
                building.amortize(c.MAP_SYNC_TIME)

        buildings_storage.save_all()

        self.logger.info('sync data completed')
    def setUp(self):
        super(PlaceDescriptionTests, self).setUp()

        self.place = places_storage.all()[0]
        self.place.description = 'old description'
        self.place.save()

        self.place_2 = places_storage.all()[1]

        self.bill_data = PlaceDescripton(place_id=self.place.id, description='new description')
        self.bill = BillPrototype.create(self.account1, 'bill-1-caption', 'bill-1-rationale', self.bill_data, chronicle_on_accepted='chronicle-on-accepted')
예제 #3
0
    def setUp(self):
        super(PlaceDescriptionTests, self).setUp()

        self.place = places_storage.all()[0]
        self.place.description = 'old description'
        self.place.save()

        self.place_2 = places_storage.all()[1]

        self.bill_data = PlaceDescripton(place_id=self.place.id, description='new description')
        self.bill = BillPrototype.create(self.account1, 'bill-1-caption', 'bill-1-rationale', self.bill_data, chronicle_on_accepted='chronicle-on-accepted')
예제 #4
0
    def test_sync_data__places_methods_called(self):
        # all that methods tested in places package
        set_expected_size = mock.Mock()
        sync_size = mock.Mock()
        sync_persons = mock.Mock()
        sync_stability = mock.Mock()
        sync_habits = mock.Mock()
        sync_modifier = mock.Mock()
        sync_parameters = mock.Mock()
        update_heroes_number = mock.Mock()
        mark_as_updated = mock.Mock()

        with contextlib.nested(mock.patch('the_tale.game.map.places.prototypes.PlacePrototype.set_expected_size', set_expected_size),
                               mock.patch('the_tale.game.map.places.prototypes.PlacePrototype.sync_size', sync_size),
                               mock.patch('the_tale.game.map.places.prototypes.PlacePrototype.sync_persons', sync_persons),
                               mock.patch('the_tale.game.map.places.prototypes.PlacePrototype.sync_stability', sync_stability),
                               mock.patch('the_tale.game.map.places.prototypes.PlacePrototype.sync_habits', sync_habits),
                               mock.patch('the_tale.game.map.places.prototypes.PlacePrototype.sync_modifier', sync_modifier),
                               mock.patch('the_tale.game.map.places.prototypes.PlacePrototype.sync_parameters', sync_parameters),
                               mock.patch('the_tale.game.map.places.prototypes.PlacePrototype.update_heroes_number', update_heroes_number),
                               mock.patch('the_tale.game.map.places.prototypes.PlacePrototype.mark_as_updated', mark_as_updated)):
            self.worker.sync_data()

        places_number = len(places_storage.all())

        self.assertEqual(set_expected_size.call_count, places_number)
        self.assertEqual(sync_size.call_count, places_number)
        self.assertEqual(sync_persons.call_count, places_number)
        self.assertEqual(sync_stability.call_count, places_number)
        self.assertEqual(sync_habits.call_count, places_number)
        self.assertEqual(sync_modifier.call_count, places_number)
        self.assertEqual(sync_parameters.call_count, places_number)
        self.assertEqual(update_heroes_number.call_count, places_number)
        self.assertEqual(mark_as_updated.call_count, places_number)
예제 #5
0
def _point_arrow_height(obj, borders, length_normalizer, width_normalizer, power_percent):

    distances = []

    for other_place in places_storage.all():
        if obj.id != other_place.id:
            distances.append((math.hypot(obj.x - other_place.x, obj.y - other_place.y), other_place))

    distances = sorted(distances, key=lambda x: x[0])

    arrows = []

    if len(distances) > 0:
        distance, other_place = distances[0] # pylint: disable=W0612
        arrow = power_points.ArrowAreaPoint.Arrow(angle=math.atan2(other_place.y - obj.y, other_place.x - obj.x),
                                                  length=obj.r,
                                                  width=(obj.r / 3) + 1)
        arrows.extend([arrow, arrow.rounded_arrow])

    if len(distances) > 1:
        distance, other_place = distances[1]
        arrow = power_points.ArrowAreaPoint.Arrow(angle=math.atan2(other_place.y - obj.y, other_place.x - obj.x),
                                                  length=obj.r,
                                                  width=(obj.r / 3) + 1)
        arrows.extend([arrow, arrow.rounded_arrow])

    return power_points.ArrowAreaPoint(layer_type=layers.LAYER_TYPE.HEIGHT,
                                       name='height_arrow_' + obj.uid,
                                       x=obj.x,
                                       y=obj.y,
                                       power=get_height_power_function(borders, power_percent),
                                       default_power=(0.0, 0.0),
                                       length_normalizer=length_normalizer,
                                       width_normalizer=width_normalizer,
                                       arrows=arrows)
예제 #6
0
def fill_places(kb, hero_info, max_distance):
    places = []

    for place in places_storage.all():
        path_length = waymarks_storage.look_for_road(
            places_storage[hero_info.position_place_id], place).length

        if path_length > max_distance:
            continue

        places.append((path_length, place))

    places.sort()

    chosen_places = []

    for base_distance, place in places:
        for chosen_place in chosen_places:
            path_length = waymarks_storage.look_for_road(chosen_place,
                                                         place).length

            if path_length > max_distance:
                break

        else:
            chosen_places.append(place)

    for place in chosen_places:
        uid = uids.place(place.id)

        if uid in kb:
            continue

        kb += fact_place(place)
예제 #7
0
파일: logic.py 프로젝트: Alkalit/the-tale
def fill_places(kb, hero_info, max_distance):
    places = []

    for place in places_storage.all():
        path_length = waymarks_storage.look_for_road(places_storage[hero_info.position_place_id], place).length

        if path_length > max_distance:
            continue

        places.append((path_length, place))

    places.sort()


    chosen_places = []

    for base_distance, place in places:
        for chosen_place in chosen_places:
            path_length = waymarks_storage.look_for_road(chosen_place, place).length

            if path_length > max_distance:
                break

        else:
            chosen_places.append(place)


    for place in chosen_places:
        uid = uids.place(place.id)

        if uid in kb:
            continue

        kb += fact_place(place)
예제 #8
0
    def get_quests_priorities(self):
        # always check hero position to prevent «bad» quests generation
        from the_tale.game.quests.relations import QUESTS

        quests = [
            quest for quest in QUESTS.records if quest.quest_type.is_NORMAL
        ]

        if self.preferences.mob is not None:
            quests.append(QUESTS.HUNT)
        if self.preferences.place is not None and (
                self.position.place is None
                or self.preferences.place.id != self.position.place.id):
            quests.append(QUESTS.HOMETOWN)
        if self.preferences.friend is not None and (
                self.position.place is None
                or self.preferences.friend.place.id != self.position.place.id):
            quests.append(QUESTS.HELP_FRIEND)
        if self.preferences.enemy is not None and (
                self.position.place is None
                or self.preferences.enemy.place.id != self.position.place.id):
            quests.append(QUESTS.INTERFERE_ENEMY)

        if any(place.modifier and place.modifier.TYPE.is_HOLY_CITY
               for place in places_storage.all()):
            if self.position.place is None or self.position.place.modifier is None or not self.position.place.modifier.TYPE.is_HOLY_CITY:
                quests.append(QUESTS.PILGRIMAGE)

        return [(quest, self.modify_quest_priority(quest)) for quest in quests]
예제 #9
0
def get_power_points():

    month = TimePrototype.get_current_time().game_time.month_record

    points = []

    points = [
        _default_temperature_points(delta={
            MONTHS.COLD: -0.1,
            MONTHS.HOT: 0.1
        }.get(month, 0)),
        _default_wetness_points(delta={
            MONTHS.DRY: -0.1,
            MONTHS.CRUDE: 0.1
        }.get(month, 0)),
        _default_vegetation_points(),
        _default_soil_points()
    ]

    for place in places_storage.all():
        points.extend(get_place_power_points(place))
        for race in RACE.records:
            points.extend(get_place_race_power_points(place, race))

    for building in buildings_storage.all():
        points.extend(get_building_power_points(building))

    return points
예제 #10
0
    def form_choices(cls,
                     only_weak=False,
                     choosen_person=None,
                     predicate=lambda place, person: True):
        choices = []

        for place in places_storage.all():
            persons_choices = filter(lambda person: predicate(place, person),
                                     place.persons)  # pylint: disable=W0110
            accepted_persons = persons_choices[
                place.max_persons_number /
                2:] if only_weak else persons_choices

            if choosen_person is not None and choosen_person.place.id == place.id:
                if choosen_person.id not in [p.id for p in accepted_persons]:
                    accepted_persons.append(choosen_person)

            place_power = place.total_persons_power

            persons = tuple((person.id, u'%s [%s %.2f%%]' %
                             (person.name, person.type.text, person.power /
                              place_power * 100 if place_power > 0.001 else 0))
                            for person in accepted_persons)

            persons = sorted(persons, key=lambda choice: choice[1])

            choices.append((place.name, persons))

        return sorted(choices, key=lambda choice: choice[0])
예제 #11
0
    def test_get_neares_place(self):

        for place in places_storage.all():
            x, y = place.x, place.y

            with mock.patch('the_tale.game.heroes.prototypes.HeroPositionPrototype.cell_coordinates', (x, y)):
                self.assertEqual(place.id, self.hero.position.get_nearest_place().id)
예제 #12
0
    def create_place(self, x, y, size, roads_to, persons=(), name_forms=None, is_frontier=False): # pylint: disable=R0914

        place_power = int(max(place.power for place in places_storage.all()) * float(size) / places_settings.MAX_SIZE)

        place_power_steps = int(places_settings.POWER_HISTORY_LENGTH / c.MAP_SYNC_TIME)
        place_power_per_step = (place_power / place_power_steps) + 1

        place = PlacePrototype.create( x=x,
                                       y=y,
                                       utg_name=name_forms.word,
                                       is_frontier=is_frontier,
                                       size=size)

        initial_turn = TimePrototype.get_current_turn_number() - places_settings.POWER_HISTORY_LENGTH
        for i in xrange(place_power_steps):
            place.push_power(int(initial_turn+i*c.MAP_SYNC_TIME), int(place_power_per_step))

        for person_name_forms, power_percent, race, gender, tp in persons:
            person = PersonPrototype.create(place=place,
                                            race=race,
                                            gender=gender,
                                            tp=tp,
                                            name_forms=person_name_forms)

            person_power = place_power * power_percent
            person_power_steps = int(persons_conf.settings.POWER_HISTORY_LENGTH / c.MAP_SYNC_TIME)
            person_power_per_step = (person_power / person_power_steps) + 1
            initial_turn = TimePrototype.get_current_turn_number() - persons_conf.settings.POWER_HISTORY_LENGTH
            for i in xrange(person_power_steps):
                person.push_power(int(initial_turn+i*c.MAP_SYNC_TIME), int(person_power_per_step))
            person.save()

        place.sync_persons(force_add=True)

        power_delta = self.INITIAL_PERSON_POWER

        for person in place.persons:
            person.fill_power_evenly(power_delta)
            person.save()
            power_delta /= 2

        place.sync_race()
        place.save()

        for destination in roads_to:
            Road.objects.create(point_1=place._model, point_2=destination._model)

        persons_storage.update_version()
        places_storage.update_version()
        roads_storage.update_version()

        persons_storage.refresh()
        places_storage.refresh()
        roads_storage.refresh()

        return place
예제 #13
0
    def get_nearest_place(self):
        x, y = self.cell_coordinates
        best_distance = 999999999999999
        best_place = None
        for place in places_storage.all():
            distance = math.hypot(place.x-x, place.y-y)
            if distance < best_distance:
                best_distance = distance
                best_place = place

        return best_place
예제 #14
0
    def get_nearest_place(self):
        x, y = self.cell_coordinates
        best_distance = 999999999999999
        best_place = None
        for place in places_storage.all():
            distance = math.hypot(place.x - x, place.y - y)
            if distance < best_distance:
                best_distance = distance
                best_place = place

        return best_place
예제 #15
0
def update_waymarks(): # pylint: disable=R0912

    places = places_storage.all()

    roads = roads_storage.all_exists_roads()

    places_len = len(places)

    paths = [ [ Path() for place in xrange(places_len) ] for i in xrange(places_len)] # pylint: disable=W0612

    p2i = dict( (place.id, i) for i, place in enumerate(places))

    for i in xrange(len(places)):
        paths[i][i].update_path(0, None)

    for road in roads:
        i = p2i[road.point_1_id]
        j = p2i[road.point_2_id]
        paths[i][j].update_path(road.length, road.id)
        paths[j][i].update_path(road.length, road.id)

    for k in xrange(places_len):
        for i in xrange(places_len):
            for j in xrange(places_len):
                new_len = min(paths[i][j].length,
                              paths[i][k].length + paths[k][j].length)
                paths[i][j].update_path(new_len, paths[i][k].road_id)

    for row in paths:
        res = []
        for el in row:
            res.append(el.road_id)


    for i in xrange(places_len):
        for j in xrange(places_len):
            if paths[i][j].road_id is not None:
                road = roads_storage[paths[i][j].road_id]
            else:
                road = None

            waymark = waymarks_storage.look_for_road(point_from=places[i].id, point_to=places[j].id)

            if waymark:
                waymark.road = road
                waymark.length = paths[i][j].length
                waymark.save()
            else:
                waymark = WaymarkPrototype.create(point_from=places[i],
                                                  point_to=places[j],
                                                  road=road,
                                                  length=paths[i][j].length)

    waymarks_storage.update_version()
예제 #16
0
    def handle(self, *args, **options):

        for place in places_storage.all():
            place.sync_persons(force_add=True)
            place.sync_habits()

            place.sync_parameters() # must be last operation to display and use real data

            place.update_heroes_number()
            place.update_heroes_habits()

            place.save()
예제 #17
0
    def handle(self, *args, **options):

        for place in places_storage.all():
            place.sync_persons(force_add=True)
            place.sync_habits()

            place.sync_parameters(
            )  # must be last operation to display and use real data

            place.update_heroes_number()
            place.update_heroes_habits()

            place.save()
예제 #18
0
    def create(cls, turn_number, width, height, terrain, world): # pylint: disable=R0914
        from the_tale.game.map.generator.descriptors import UICells

        terrain_percents = {}

        terrain_squares = collections.defaultdict(int)

        for y in xrange(0, height):
            for x in xrange(0, width):
                cell = world.generator.cell_info(x, y)

                if cell.height < -0.2:
                    terrain_squares[MAP_STATISTICS.LOWLANDS] += 1
                elif cell.height < 0.3:
                    terrain_squares[MAP_STATISTICS.PLAINS] += 1
                else:
                    terrain_squares[MAP_STATISTICS.UPLANDS] += 1

                if cell.vegetation == VEGETATION_TYPE.DESERT:
                    terrain_squares[MAP_STATISTICS.DESERTS] += 1
                elif cell.vegetation == VEGETATION_TYPE.GRASS:
                    terrain_squares[MAP_STATISTICS.GRASS] += 1
                else:
                    terrain_squares[MAP_STATISTICS.FORESTS] += 1

        total_cells = width * height

        terrain_percents = dict( (id_.value, float(square) / total_cells) for id_, square in terrain_squares.items())

        person_race_percents = get_person_race_percents(persons_storage.filter(state=PERSON_STATE.IN_GAME))
        race_percents = get_race_percents(places_storage.all())

        #race to cities percents
        race_cities = dict( (race.value, 0) for race in RACE.records)
        for place_model in Place.objects.all():
            place = PlacePrototype(place_model)
            race_cities[place.race.value] += 1

        statistics = {'terrain_percents': terrain_percents,
                      'person_race_percents': person_race_percents,
                      'race_percents': race_percents,
                      'race_cities': race_cities}

        model = MapInfo.objects.create(turn_number=turn_number,
                                       width=width,
                                       height=height,
                                       terrain=s11n.to_json([ [cell.value for cell in row] for row in terrain]),
                                       cells=s11n.to_json(UICells.create(world.generator).serialize()),
                                       world=world._model,
                                       statistics=s11n.to_json(statistics))
        return cls(model)
예제 #19
0
파일: logic.py 프로젝트: Alkalit/the-tale
def fill_places_for_first_quest(kb, hero_info):
    best_distance = c.QUEST_AREA_MAXIMUM_RADIUS
    best_destination = None

    for place in places_storage.all():
        if place.id == hero_info.position_place_id:
            continue
        path_length = waymarks_storage.look_for_road(places_storage[hero_info.position_place_id], place).length
        if path_length < best_distance:
            best_distance = path_length
            best_destination = place

    kb += fact_place(best_destination)
    kb += fact_place(places_storage[hero_info.position_place_id])
예제 #20
0
def fill_places_for_first_quest(kb, hero_info):
    best_distance = c.QUEST_AREA_MAXIMUM_RADIUS
    best_destination = None

    for place in places_storage.all():
        if place.id == hero_info.position_place_id:
            continue
        path_length = waymarks_storage.look_for_road(
            places_storage[hero_info.position_place_id], place).length
        if path_length < best_distance:
            best_distance = path_length
            best_destination = place

    kb += fact_place(best_destination)
    kb += fact_place(places_storage[hero_info.position_place_id])
예제 #21
0
    def get_available_positions(
        cls,
        center_x,
        center_y,
        building_position_radius=places_settings.BUILDING_POSITION_RADIUS):  # pylint: disable=R0914
        from the_tale.game.map.places.storage import places_storage, buildings_storage
        from the_tale.game.map.roads.storage import roads_storage
        from the_tale.game.map.roads.relations import PATH_DIRECTION

        positions = set()

        for i in xrange(0, building_position_radius + 1):
            for j in xrange(0, building_position_radius + 1):
                positions.add((center_x + i, center_y + j))
                positions.add((center_x - i, center_y + j))
                positions.add((center_x + i, center_y - j))
                positions.add((center_x - i, center_y - j))

        positions = set(pos for pos in positions
                        if 0 <= pos[0] < map_settings.WIDTH
                        and 0 <= pos[1] < map_settings.HEIGHT)

        removed_positions = set()

        for place in places_storage.all():
            removed_positions.add((place.x, place.y))

        for building in buildings_storage.all():
            removed_positions.add((building.x, building.y))

        for road in roads_storage.all_exists_roads():
            x, y = road.point_1.x, road.point_1.y
            for direction in road.path:
                if direction == PATH_DIRECTION.LEFT.value: x -= 1
                elif direction == PATH_DIRECTION.RIGHT.value: x += 1
                elif direction == PATH_DIRECTION.UP.value: y -= 1
                elif direction == PATH_DIRECTION.DOWN.value: y += 1

                removed_positions.add((x, y))

        result = positions - removed_positions

        return result if result else cls.get_available_positions(
            center_x,
            center_y,
            building_position_radius=building_position_radius + 1)
예제 #22
0
파일: drawer.py 프로젝트: pavetok/the-tale
def get_draw_info(biomes_map):

    width = map_info_storage.item.width
    height = map_info_storage.item.height

    map_images = []
    for y in xrange(height):
        map_images.append([])
        for x in xrange(width):
            map_images[-1].append(CellDrawer())


    roads_map = get_roads_map(width, height, roads_storage.all())

    for y in xrange(height):
        for x in xrange(width):
            biom = biomes_map[y][x]
            cell_drawer = map_images[y][x]

            cell_drawer.terrain = SPRITES.index_name[biom.id.name]

            if roads_map[y][x]:
                road_sprite = get_road_sprite_info(roads_map, x, y)

                cell_drawer.road = SPRITES.index_name[road_sprite['name']]
                cell_drawer.road_rotate = road_sprite['rotate']

    for place in places_storage.all():
        if place.size < 3: verbose_size = 'small'
        elif place.size < 6: verbose_size = 'medium'
        elif place.size < 9: verbose_size = 'large'
        else: verbose_size = 'capital'

        sprite_name = ('city_%s_%s' % (place.race.name.lower(), verbose_size)).upper()

        cell_drawer = map_images[place.y][place.x]
        cell_drawer.object = SPRITES.index_name[sprite_name]

    for building in buildings_storage.all():
        sprite_name = 'BUILDING_%s' % building.type.name

        cell_drawer = map_images[building.y][building.x]
        cell_drawer.object = SPRITES.index_name[sprite_name]

    return map_images
예제 #23
0
    def test_get_available_positions(self):

        building = BuildingPrototype.create(self.place_1.persons[0],
                                            utg_name=names.generator.get_test_name(name='building-name'))

        positions = BuildingPrototype.get_available_positions(self.place_1.x, self.place_1.y)

        self.assertTrue(positions)

        for place in places_storage.all():
            self.assertFalse((place.x, place.y) in positions)

        for building in buildings_storage.all():
            self.assertFalse((building.x, building.y) in positions)

        for x, y in positions:
            self.assertTrue(0 <= x < map_settings.WIDTH)
            self.assertTrue(0 <= y < map_settings.HEIGHT)
예제 #24
0
def create_test_map():
    linguistics_logic.sync_static_restrictions()

    map_logic.create_test_my_info()

    p1 = PlacePrototype.create( x=1, y=1, size=1, utg_name=names.generator.get_test_name(name='1x1'))
    p2 = PlacePrototype.create( x=3, y=3, size=3, utg_name=names.generator.get_test_name(name='10x10'))
    p3 = PlacePrototype.create( x=1, y=3, size=3, utg_name=names.generator.get_test_name(name='1x10'))

    for place in places_storage.all():
        place.sync_persons(force_add=True)

    RoadPrototype.create(point_1=p1, point_2=p2).update()
    RoadPrototype.create(point_1=p2, point_2=p3).update()

    update_waymarks()

    update_nearest_cells()

    mob_1 = MobRecordPrototype.create_random('mob_1')
    mob_2 = MobRecordPrototype.create_random('mob_2')
    mob_3 = MobRecordPrototype.create_random('mob_3')

    ArtifactRecordPrototype.create_random('loot_1', mob=mob_1)
    ArtifactRecordPrototype.create_random('loot_2', mob=mob_2)
    ArtifactRecordPrototype.create_random('loot_3', mob=mob_3)

    ArtifactRecordPrototype.create_random('helmet_1', type_=ARTIFACT_TYPE.HELMET, mob=mob_1)
    ArtifactRecordPrototype.create_random('plate_1', type_=ARTIFACT_TYPE.PLATE, mob=mob_2)
    ArtifactRecordPrototype.create_random('boots_1', type_=ARTIFACT_TYPE.BOOTS, mob=mob_3)

    ArtifactRecordPrototype.create_random(DEFAULT_HERO_EQUIPMENT.PANTS, type_=ARTIFACT_TYPE.PANTS)
    ArtifactRecordPrototype.create_random(DEFAULT_HERO_EQUIPMENT.BOOTS, type_=ARTIFACT_TYPE.BOOTS)
    ArtifactRecordPrototype.create_random(DEFAULT_HERO_EQUIPMENT.PLATE, type_=ARTIFACT_TYPE.PLATE)
    ArtifactRecordPrototype.create_random(DEFAULT_HERO_EQUIPMENT.GLOVES, type_=ARTIFACT_TYPE.GLOVES)
    ArtifactRecordPrototype.create_random(DEFAULT_HERO_EQUIPMENT.WEAPON, type_=ARTIFACT_TYPE.MAIN_HAND)

    companions_logic.create_random_companion_record('companion_1', dedication=companions_relations.DEDICATION.HEROIC, state=companions_relations.STATE.ENABLED)
    companions_logic.create_random_companion_record('companion_2', dedication=companions_relations.DEDICATION.BOLD, state=companions_relations.STATE.ENABLED)
    companions_logic.create_random_companion_record('companion_3', dedication=companions_relations.DEDICATION.BOLD, state=companions_relations.STATE.DISABLED)

    return p1, p2, p3
예제 #25
0
def get_power_points():

    month = TimePrototype.get_current_time().game_time.month_record

    points = []

    points = [_default_temperature_points(delta={MONTHS.COLD: -0.1, MONTHS.HOT: 0.1}.get(month, 0)),
              _default_wetness_points(delta={MONTHS.DRY: -0.1, MONTHS.CRUDE: 0.1}.get(month, 0)),
              _default_vegetation_points(),
              _default_soil_points()]

    for place in places_storage.all():
        points.extend(get_place_power_points(place))
        for race in RACE.records:
            points.extend(get_place_race_power_points(place, race))

    for building in buildings_storage.all():
        points.extend(get_building_power_points(building))

    return points
예제 #26
0
    def get_quests_priorities(self):
        # always check hero position to prevent «bad» quests generation
        from the_tale.game.quests.relations import QUESTS

        quests = [quest for quest in QUESTS.records if quest.quest_type.is_NORMAL]

        if self.preferences.mob is not None:
            quests.append(QUESTS.HUNT)
        if self.preferences.place is not None and (self.position.place is None or self.preferences.place.id != self.position.place.id):
            quests.append(QUESTS.HOMETOWN)
        if self.preferences.friend is not None and (self.position.place is None or self.preferences.friend.place.id != self.position.place.id):
            quests.append(QUESTS.HELP_FRIEND)
        if self.preferences.enemy is not None and (self.position.place is None or self.preferences.enemy.place.id != self.position.place.id):
            quests.append(QUESTS.INTERFERE_ENEMY)

        if any(place.modifier and place.modifier.TYPE.is_HOLY_CITY for place in places_storage.all()):
            if self.position.place is None or self.position.place.modifier is None or not self.position.place.modifier.TYPE.is_HOLY_CITY:
                quests.append(QUESTS.PILGRIMAGE)

        return [(quest, self.modify_quest_priority(quest)) for quest in quests]
예제 #27
0
    def test_get_available_positions(self):

        building = BuildingPrototype.create(
            self.place_1.persons[0],
            utg_name=names.generator.get_test_name(name='building-name'))

        positions = BuildingPrototype.get_available_positions(
            self.place_1.x, self.place_1.y)

        self.assertTrue(positions)

        for place in places_storage.all():
            self.assertFalse((place.x, place.y) in positions)

        for building in buildings_storage.all():
            self.assertFalse((building.x, building.y) in positions)

        for x, y in positions:
            self.assertTrue(0 <= x < map_settings.WIDTH)
            self.assertTrue(0 <= y < map_settings.HEIGHT)
예제 #28
0
def _point_arrow_height(obj, borders, length_normalizer, width_normalizer,
                        power_percent):

    distances = []

    for other_place in places_storage.all():
        if obj.id != other_place.id:
            distances.append((math.hypot(obj.x - other_place.x,
                                         obj.y - other_place.y), other_place))

    distances = sorted(distances, key=lambda x: x[0])

    arrows = []

    if len(distances) > 0:
        distance, other_place = distances[0]  # pylint: disable=W0612
        arrow = power_points.ArrowAreaPoint.Arrow(angle=math.atan2(
            other_place.y - obj.y, other_place.x - obj.x),
                                                  length=obj.r,
                                                  width=(obj.r / 3) + 1)
        arrows.extend([arrow, arrow.rounded_arrow])

    if len(distances) > 1:
        distance, other_place = distances[1]
        arrow = power_points.ArrowAreaPoint.Arrow(angle=math.atan2(
            other_place.y - obj.y, other_place.x - obj.x),
                                                  length=obj.r,
                                                  width=(obj.r / 3) + 1)
        arrows.extend([arrow, arrow.rounded_arrow])

    return power_points.ArrowAreaPoint(layer_type=layers.LAYER_TYPE.HEIGHT,
                                       name='height_arrow_' + obj.uid,
                                       x=obj.x,
                                       y=obj.y,
                                       power=get_height_power_function(
                                           borders, power_percent),
                                       default_power=(0.0, 0.0),
                                       length_normalizer=length_normalizer,
                                       width_normalizer=width_normalizer,
                                       arrows=arrows)
예제 #29
0
    def get_available_positions(cls, center_x, center_y, building_position_radius=places_settings.BUILDING_POSITION_RADIUS): # pylint: disable=R0914
        from the_tale.game.map.places.storage import places_storage, buildings_storage
        from the_tale.game.map.roads.storage import roads_storage
        from the_tale.game.map.roads.relations import PATH_DIRECTION

        positions = set()

        for i in xrange(0, building_position_radius+1):
            for j in xrange(0, building_position_radius+1):
                positions.add((center_x+i, center_y+j))
                positions.add((center_x-i, center_y+j))
                positions.add((center_x+i, center_y-j))
                positions.add((center_x-i, center_y-j))

        positions =  set(pos for pos in positions
                         if 0 <= pos[0] < map_settings.WIDTH and 0 <= pos[1] < map_settings.HEIGHT)

        removed_positions = set()

        for place in places_storage.all():
            removed_positions.add((place.x, place.y))

        for building in buildings_storage.all():
            removed_positions.add((building.x, building.y))

        for road in roads_storage.all_exists_roads():
            x, y = road.point_1.x, road.point_1.y
            for direction in road.path:
                if direction == PATH_DIRECTION.LEFT.value: x -= 1
                elif direction == PATH_DIRECTION.RIGHT.value: x += 1
                elif direction == PATH_DIRECTION.UP.value: y -= 1
                elif direction == PATH_DIRECTION.DOWN.value: y += 1

                removed_positions.add((x, y))

        result = positions - removed_positions

        return result if result else cls.get_available_positions(center_x, center_y, building_position_radius=building_position_radius+1)
예제 #30
0
    def form_choices(cls, only_weak=False, choosen_person=None, predicate=lambda place, person: True):
        choices = []

        for place in places_storage.all():
            persons_choices = filter(lambda person: predicate(place, person), place.persons) # pylint: disable=W0110
            accepted_persons = persons_choices[place.max_persons_number/2:] if only_weak else persons_choices

            if choosen_person is not None and choosen_person.place.id == place.id:
                if choosen_person.id not in [p.id for p in accepted_persons]:
                    accepted_persons.append(choosen_person)

            place_power = place.total_persons_power

            persons = tuple( (person.id, u'%s [%s %.2f%%]' % (person.name,
                                                              person.type.text,
                                                              person.power / place_power * 100 if place_power > 0.001 else 0))
                             for person in accepted_persons )

            persons = sorted(persons, key=lambda choice: choice[1])

            choices.append( ( place.name, persons ) )

        return sorted(choices, key=lambda choice: choice[0])
예제 #31
0
파일: updater.py 프로젝트: Alkalit/the-tale
def update_map(index):

    generator = WorldInfoPrototype.get_by_id(map_info_storage.item.world_id).generator

    generator.clear_power_points()
    generator.clear_biomes()

    if generator.w != map_settings.WIDTH or generator.h != map_settings.HEIGHT:
        dx, dy = generator.resize(map_settings.WIDTH, map_settings.HEIGHT)
        places_storage.shift_all(dx, dy)
        buildings_storage.shift_all(dx, dy)

    for point in get_power_points():
        generator.add_power_point(point)

    for terrain in TERRAIN.records:
        generator.add_biom(Biom(id_=terrain))

    generator.do_step()

    biomes_map = generator.get_biomes_map()

    time = TimePrototype.get_current_time()

    draw_info = get_draw_info(biomes_map)

    terrain = []
    for y in xrange(0, generator.h):
        row = []
        terrain.append(row)
        for x in xrange(0, generator.w):
            row.append(biomes_map[y][x].id)

    map_info_storage.set_item(MapInfoPrototype.create(turn_number=time.turn_number,
                                                      width=generator.w,
                                                      height=generator.h,
                                                      terrain=terrain,
                                                      world=WorldInfoPrototype.create_from_generator(generator)))

    MapInfoPrototype.remove_old_infos()

    raw_draw_info = []
    for row in draw_info:
        raw_draw_info.append([])
        for cell in row:
            raw_draw_info[-1].append(cell.get_sprites())

    data = {'width': generator.w,
            'height': generator.h,
            'map_version': map_info_storage.version,
            'format_version': '0.1',
            'draw_info': raw_draw_info,
            'places': dict( (place.id, place.map_info() ) for place in places_storage.all() ),
            # 'buildings': dict( (building.id, building.map_info() ) for building in buildings_storage.all() ),
            'roads': dict( (road.id, road.map_info() ) for road in roads_storage.all()) }

    region_js_file = map_settings.GEN_REGION_OUTPUT % map_info_storage.version

    output_dir_name = os.path.dirname(region_js_file)
    if not os.path.exists(output_dir_name):
        os.makedirs(output_dir_name, 0755)

    with open(region_js_file, 'w') as region_json_file:
        region_json_file.write(s11n.to_json(data).encode('utf-8'))

    if project_settings.DEBUG:
        deworld.draw_world(index, generator, catalog=map_settings.GEN_WORLD_PROGRESSION)
예제 #32
0
 def test_new_place_renaming(self):
     texts = [('>'+place.name+'<', 1) for place in places_storage.all()]
     self.check_html_ok(self.request_html(reverse('game:bills:new') + ('?bill_type=%s' % PlaceRenaming.type.value)), texts=texts)
예제 #33
0
 def test_edit_place_renaming(self):
     texts = [('>'+place.name+'<', 1) for place in places_storage.all()]
     self.check_html_ok(self.request_html(reverse('game:bills:edit', args=[self.bill.id])), texts=texts)
예제 #34
0
    def create_map(self):  # pylint: disable=R0914, R0915

        Place.objects.all().delete()
        Road.objects.all().delete()

        p1x1 = self.create_place(1, 1, size=1)
        p14x1 = self.create_place(14, 1, size=1)
        p27x1 = self.create_place(27, 1, size=6)
        p5x3 = self.create_place(5, 3, size=5)
        p1x9 = self.create_place(1, 9, size=6)
        p5x12 = self.create_place(5, 12, size=1)
        p3x17 = self.create_place(3, 17, size=10)
        p10x18 = self.create_place(10, 18, size=3)
        p11x11 = self.create_place(11, 11, size=4)
        p11x6 = self.create_place(11, 6, size=4)
        p19x5 = self.create_place(19, 5, size=3)
        p20x8 = self.create_place(20, 8, size=9)
        p24x8 = self.create_place(24, 8, size=10)
        p17x12 = self.create_place(17, 12, size=2)
        p19x17 = self.create_place(19, 17, size=8)
        p24x13 = self.create_place(24, 13, size=1)
        p27x13 = self.create_place(27, 13, size=1)
        p28x19 = self.create_place(28, 19, size=3)

        self.create_road(p1x1, p5x3)
        self.create_road(p5x3, p1x9)
        self.create_road(p5x3, p11x6)
        self.create_road(p1x9, p5x12)
        self.create_road(p5x12, p3x17)
        self.create_road(p5x12, p11x11)
        self.create_road(p3x17, p10x18)
        self.create_road(p11x11, p10x18)
        self.create_road(p11x11, p11x6)
        self.create_road(p11x11, p19x17)
        self.create_road(p11x11, p17x12)
        self.create_road(p11x11, p20x8)
        self.create_road(p11x6, p14x1)
        self.create_road(p14x1, p27x1)
        self.create_road(p27x1, p24x8)
        self.create_road(p24x8, p20x8)
        self.create_road(p24x8, p24x13)
        self.create_road(p24x8, p27x13)
        self.create_road(p20x8, p19x5)
        self.create_road(p20x8, p17x12)
        self.create_road(p19x17, p24x13)
        self.create_road(p28x19, p24x13)
        self.create_road(p28x19, p27x13)

        places_storage.update_version()
        roads_storage.update_version()

        for place in places_storage.all():
            place.sync_persons(force_add=True)

        persons_storage.update_version()

        terrain = []
        for y in xrange(0, map_settings.HEIGHT):  # pylint: disable=W0612
            row = []
            terrain.append(row)
            for x in xrange(0, map_settings.WIDTH):  # pylint: disable=W0612
                row.append(TERRAIN.PLANE_GREENWOOD)

        map_info_storage.set_item(
            MapInfoPrototype.create(turn_number=0,
                                    width=map_settings.WIDTH,
                                    height=map_settings.HEIGHT,
                                    terrain=terrain,
                                    world=WorldInfoPrototype.create(
                                        w=map_settings.WIDTH,
                                        h=map_settings.HEIGHT)))

        map_info_storage.update_version()
예제 #35
0
 def test_correct_objects_power__places(self):
     self.check_correct_objects_power(places_storage.all())
예제 #36
0
def update_map(index):

    generator = WorldInfoPrototype.get_by_id(
        map_info_storage.item.world_id).generator

    generator.clear_power_points()
    generator.clear_biomes()

    if generator.w != map_settings.WIDTH or generator.h != map_settings.HEIGHT:
        dx, dy = generator.resize(map_settings.WIDTH, map_settings.HEIGHT)
        places_storage.shift_all(dx, dy)
        buildings_storage.shift_all(dx, dy)

    for point in get_power_points():
        generator.add_power_point(point)

    for terrain in TERRAIN.records:
        generator.add_biom(Biom(id_=terrain))

    generator.do_step()

    biomes_map = generator.get_biomes_map()

    time = TimePrototype.get_current_time()

    draw_info = get_draw_info(biomes_map)

    terrain = []
    for y in xrange(0, generator.h):
        row = []
        terrain.append(row)
        for x in xrange(0, generator.w):
            row.append(biomes_map[y][x].id)

    map_info_storage.set_item(
        MapInfoPrototype.create(
            turn_number=time.turn_number,
            width=generator.w,
            height=generator.h,
            terrain=terrain,
            world=WorldInfoPrototype.create_from_generator(generator)))

    MapInfoPrototype.remove_old_infos()

    raw_draw_info = []
    for row in draw_info:
        raw_draw_info.append([])
        for cell in row:
            raw_draw_info[-1].append(cell.get_sprites())

    data = {
        'width':
        generator.w,
        'height':
        generator.h,
        'map_version':
        map_info_storage.version,
        'format_version':
        '0.1',
        'draw_info':
        raw_draw_info,
        'places':
        dict((place.id, place.map_info()) for place in places_storage.all()),
        # 'buildings': dict( (building.id, building.map_info() ) for building in buildings_storage.all() ),
        'roads':
        dict((road.id, road.map_info()) for road in roads_storage.all())
    }

    region_js_file = map_settings.GEN_REGION_OUTPUT % map_info_storage.version

    output_dir_name = os.path.dirname(region_js_file)
    if not os.path.exists(output_dir_name):
        os.makedirs(output_dir_name, 0755)

    with open(region_js_file, 'w') as region_json_file:
        region_json_file.write(s11n.to_json(data).encode('utf-8'))

    if project_settings.DEBUG:
        deworld.draw_world(index,
                           generator,
                           catalog=map_settings.GEN_WORLD_PROGRESSION)
예제 #37
0
    def create_place(self,
                     x,
                     y,
                     size,
                     roads_to,
                     persons=(),
                     name_forms=None,
                     is_frontier=False):  # pylint: disable=R0914

        place_power = int(
            max(place.power for place in places_storage.all()) * float(size) /
            places_settings.MAX_SIZE)

        place_power_steps = int(places_settings.POWER_HISTORY_LENGTH /
                                c.MAP_SYNC_TIME)
        place_power_per_step = (place_power / place_power_steps) + 1

        place = PlacePrototype.create(x=x,
                                      y=y,
                                      utg_name=name_forms.word,
                                      is_frontier=is_frontier,
                                      size=size)

        initial_turn = TimePrototype.get_current_turn_number(
        ) - places_settings.POWER_HISTORY_LENGTH
        for i in xrange(place_power_steps):
            place.push_power(int(initial_turn + i * c.MAP_SYNC_TIME),
                             int(place_power_per_step))

        for person_name_forms, power_percent, race, gender, tp in persons:
            person = PersonPrototype.create(place=place,
                                            race=race,
                                            gender=gender,
                                            tp=tp,
                                            name_forms=person_name_forms)

            person_power = place_power * power_percent
            person_power_steps = int(
                persons_conf.settings.POWER_HISTORY_LENGTH / c.MAP_SYNC_TIME)
            person_power_per_step = (person_power / person_power_steps) + 1
            initial_turn = TimePrototype.get_current_turn_number(
            ) - persons_conf.settings.POWER_HISTORY_LENGTH
            for i in xrange(person_power_steps):
                person.push_power(int(initial_turn + i * c.MAP_SYNC_TIME),
                                  int(person_power_per_step))
            person.save()

        place.sync_persons(force_add=True)

        power_delta = self.INITIAL_PERSON_POWER

        for person in place.persons:
            person.fill_power_evenly(power_delta)
            person.save()
            power_delta /= 2

        place.sync_race()
        place.save()

        for destination in roads_to:
            Road.objects.create(point_1=place._model,
                                point_2=destination._model)

        persons_storage.update_version()
        places_storage.update_version()
        roads_storage.update_version()

        persons_storage.refresh()
        places_storage.refresh()
        roads_storage.refresh()

        return place
예제 #38
0
    def create_map(self): # pylint: disable=R0914, R0915

        Place.objects.all().delete()
        Road.objects.all().delete()

        p1x1   = self.create_place(1,  1,  size=1)
        p14x1  = self.create_place(14, 1,  size=1)
        p27x1  = self.create_place(27, 1,  size=6)
        p5x3   = self.create_place(5,  3,  size=5)
        p1x9   = self.create_place(1,  9,  size=6)
        p5x12  = self.create_place(5,  12, size=1)
        p3x17  = self.create_place(3,  17, size=10)
        p10x18 = self.create_place(10, 18, size=3)
        p11x11 = self.create_place(11, 11, size=4)
        p11x6  = self.create_place(11, 6,  size=4)
        p19x5  = self.create_place(19, 5,  size=3)
        p20x8  = self.create_place(20, 8,  size=9)
        p24x8  = self.create_place(24, 8,  size=10)
        p17x12 = self.create_place(17, 12, size=2)
        p19x17 = self.create_place(19, 17, size=8)
        p24x13 = self.create_place(24, 13, size=1)
        p27x13 = self.create_place(27, 13, size=1)
        p28x19 = self.create_place(28, 19, size=3)

        self.create_road(p1x1,   p5x3)
        self.create_road(p5x3,   p1x9)
        self.create_road(p5x3,   p11x6)
        self.create_road(p1x9,   p5x12)
        self.create_road(p5x12,  p3x17)
        self.create_road(p5x12,  p11x11)
        self.create_road(p3x17,  p10x18)
        self.create_road(p11x11, p10x18)
        self.create_road(p11x11, p11x6)
        self.create_road(p11x11, p19x17)
        self.create_road(p11x11, p17x12)
        self.create_road(p11x11, p20x8)
        self.create_road(p11x6,  p14x1)
        self.create_road(p14x1,  p27x1)
        self.create_road(p27x1,  p24x8)
        self.create_road(p24x8,  p20x8)
        self.create_road(p24x8,  p24x13)
        self.create_road(p24x8,  p27x13)
        self.create_road(p20x8,  p19x5)
        self.create_road(p20x8,  p17x12)
        self.create_road(p19x17, p24x13)
        self.create_road(p28x19, p24x13)
        self.create_road(p28x19, p27x13)

        places_storage.update_version()
        roads_storage.update_version()

        for place in places_storage.all():
            place.sync_persons(force_add=True)

        persons_storage.update_version()

        terrain = []
        for y in xrange(0, map_settings.HEIGHT): # pylint: disable=W0612
            row = []
            terrain.append(row)
            for x in xrange(0, map_settings.WIDTH): # pylint: disable=W0612
                row.append(TERRAIN.PLANE_GREENWOOD)

        map_info_storage.set_item(MapInfoPrototype.create(turn_number=0,
                                                          width=map_settings.WIDTH,
                                                          height=map_settings.HEIGHT,
                                                          terrain=terrain,
                                                          world=WorldInfoPrototype.create(w=map_settings.WIDTH, h=map_settings.HEIGHT)))

        map_info_storage.update_version()
예제 #39
0
 def get_dominant_place(self, x, y):
     for place in places_storage.all():
         if (x, y) in place.nearest_cells:
             return place
     return None
예제 #40
0
def create_test_map():
    linguistics_logic.sync_static_restrictions()

    map_logic.create_test_my_info()

    p1 = PlacePrototype.create(
        x=1, y=1, size=1, utg_name=names.generator.get_test_name(name='1x1'))
    p2 = PlacePrototype.create(
        x=3, y=3, size=3, utg_name=names.generator.get_test_name(name='10x10'))
    p3 = PlacePrototype.create(
        x=1, y=3, size=3, utg_name=names.generator.get_test_name(name='1x10'))

    for place in places_storage.all():
        place.sync_persons(force_add=True)

    RoadPrototype.create(point_1=p1, point_2=p2).update()
    RoadPrototype.create(point_1=p2, point_2=p3).update()

    update_waymarks()

    update_nearest_cells()

    mob_1 = MobRecordPrototype.create_random('mob_1')
    mob_2 = MobRecordPrototype.create_random('mob_2')
    mob_3 = MobRecordPrototype.create_random('mob_3')

    ArtifactRecordPrototype.create_random('loot_1', mob=mob_1)
    ArtifactRecordPrototype.create_random('loot_2', mob=mob_2)
    ArtifactRecordPrototype.create_random('loot_3', mob=mob_3)

    ArtifactRecordPrototype.create_random('helmet_1',
                                          type_=ARTIFACT_TYPE.HELMET,
                                          mob=mob_1)
    ArtifactRecordPrototype.create_random('plate_1',
                                          type_=ARTIFACT_TYPE.PLATE,
                                          mob=mob_2)
    ArtifactRecordPrototype.create_random('boots_1',
                                          type_=ARTIFACT_TYPE.BOOTS,
                                          mob=mob_3)

    ArtifactRecordPrototype.create_random(DEFAULT_HERO_EQUIPMENT.PANTS,
                                          type_=ARTIFACT_TYPE.PANTS)
    ArtifactRecordPrototype.create_random(DEFAULT_HERO_EQUIPMENT.BOOTS,
                                          type_=ARTIFACT_TYPE.BOOTS)
    ArtifactRecordPrototype.create_random(DEFAULT_HERO_EQUIPMENT.PLATE,
                                          type_=ARTIFACT_TYPE.PLATE)
    ArtifactRecordPrototype.create_random(DEFAULT_HERO_EQUIPMENT.GLOVES,
                                          type_=ARTIFACT_TYPE.GLOVES)
    ArtifactRecordPrototype.create_random(DEFAULT_HERO_EQUIPMENT.WEAPON,
                                          type_=ARTIFACT_TYPE.MAIN_HAND)

    companions_logic.create_random_companion_record(
        'companion_1',
        dedication=companions_relations.DEDICATION.HEROIC,
        state=companions_relations.STATE.ENABLED)
    companions_logic.create_random_companion_record(
        'companion_2',
        dedication=companions_relations.DEDICATION.BOLD,
        state=companions_relations.STATE.ENABLED)
    companions_logic.create_random_companion_record(
        'companion_3',
        dedication=companions_relations.DEDICATION.BOLD,
        state=companions_relations.STATE.DISABLED)

    return p1, p2, p3
예제 #41
0
def all_places():
    return sorted(places_storage.all(), key=lambda p: p.name)
예제 #42
0
파일: views.py 프로젝트: Alkalit/the-tale
    def choose_preferences_dialog(self, type): # pylint: disable=W0622

        mobs = None
        places = None
        friends = None
        enemies = None
        equipment_slots = None
        favorite_items = None

        all_places = places_storage.all()
        all_places.sort(key=lambda x: x.name)

        if type.is_ENERGY_REGENERATION_TYPE:
            pass

        if type.is_MOB:
            all_mobs = mobs_storage.get_available_mobs_list(level=self.hero.level)
            all_mobs = sorted(all_mobs, key=lambda x: x.name)
            mobs = split_list(all_mobs)

        elif type.is_PLACE:
            places = split_list(all_places)

        elif type.is_FRIEND:
            friends = sorted([person for person in persons_storage.filter(state=PERSON_STATE.IN_GAME)],
                             key=lambda person: person.name)

        elif type.is_ENEMY:
            enemies = sorted([person for person in persons_storage.filter(state=PERSON_STATE.IN_GAME)],
                             key=lambda person: person.name)

        elif type.is_EQUIPMENT_SLOT:
            equipment_slots = split_list(list(relations.EQUIPMENT_SLOT.records))

        elif type.is_RISK_LEVEL:
            pass

        elif type.is_ARCHETYPE:
            pass

        elif type.is_COMPANION_DEDICATION:
            pass

        elif type.is_COMPANION_EMPATHY:
            pass

        elif type.is_FAVORITE_ITEM:
            favorite_items = {slot: self.hero.equipment.get(slot)
                              for slot in relations.EQUIPMENT_SLOT.records
                              if self.hero.equipment.get(slot) is not None}

        return self.template('heroes/choose_preferences.html',
                             {'type': type,
                              'mobs': mobs,
                              'places': places,
                              'all_places': places_storage.get_choices(),
                              'places_powers': {place.id: place.total_persons_power for place in all_places},
                              'friends': friends,
                              'enemies': enemies,
                              'equipment_slots': equipment_slots,
                              'favorite_items': favorite_items,
                              'PREFERENCES_CHANGE_DELAY': datetime.timedelta(seconds=c.PREFERENCES_CHANGE_DELAY),
                              'EQUIPMENT_SLOT': relations.EQUIPMENT_SLOT,
                              'RISK_LEVEL': relations.RISK_LEVEL,
                              'COMPANION_DEDICATION': relations.COMPANION_DEDICATION,
                              'COMPANION_EMPATHY': relations.COMPANION_EMPATHY,
                              'ARCHETYPE': game_relations.ARCHETYPE} )
예제 #43
0
    def sync_data(self, sheduled=True):

        self.logger.info('sync data')

        all_persons = persons_storage.persons_storage.filter(
            state=PERSON_STATE.IN_GAME)

        self.sync_persons_powers(persons=[
            person for person in all_persons if person.place.is_frontier
        ])
        self.sync_persons_powers(persons=[
            person for person in all_persons if not person.place.is_frontier
        ])

        for person in all_persons:
            person.update_friends_number()
            person.update_enemies_number()

        self.persons_power = {}

        self.sync_places_powers(places=[
            place for place in places_storage.all() if place.is_frontier
        ])
        self.sync_places_powers(places=[
            place for place in places_storage.all() if not place.is_frontier
        ])

        self.places_power = {}

        # update size
        if sheduled:
            self.sync_sizes(
                [place for place in places_storage.all() if place.is_frontier],
                hours=c.MAP_SYNC_TIME_HOURS,
                max_size=places_settings.MAX_FRONTIER_SIZE)

            self.sync_sizes([
                place
                for place in places_storage.all() if not place.is_frontier
            ],
                            hours=c.MAP_SYNC_TIME_HOURS,
                            max_size=places_settings.MAX_SIZE)

        for place in places_storage.all():
            place.sync_stability()
            place.sync_modifier()
            place.sync_habits()

            place.sync_parameters(
            )  # must be last operation to display and use real data

            place.update_heroes_number()
            place.update_heroes_habits()

            place.mark_as_updated()

        places_storage.save_all()

        persons_storage.persons_storage.remove_out_game_persons()
        persons_storage.persons_storage.save_all()

        persons_logic.sync_social_connections()

        if sheduled:
            for building in buildings_storage.all():
                building.amortize(c.MAP_SYNC_TIME)

        buildings_storage.save_all()

        self.logger.info('sync data completed')
예제 #44
0
def all_places():
    return sorted(places_storage.all(), key=lambda p: p.name)