Beispiel #1
0
    def satisfy_located_in(self, requirement):
        from . import logic

        object_fact = self.knowledge_base[requirement.object]

        if isinstance(object_fact, facts.Person):
            person_uid = object_fact.uid
            person = persons_storage.persons[object_fact.externals['id']]

            new_place_uid = uids.place(person.place.id)

            if new_place_uid not in self.knowledge_base:
                self.knowledge_base += logic.fact_place(person.place)

            # переписываем все ограничения в базе
            for fact in self.knowledge_base.filter(facts.State):
                for state_requirement in fact.require:
                    if isinstance(state_requirement, requirements.LocatedIn
                                  ) and state_requirement.object == person_uid:
                        state_requirement.place = new_place_uid

            return

        if not isinstance(
                object_fact,
                facts.Hero) or self.hero.id != object_fact.externals['id']:
            raise exceptions.UnknownRequirementError(requirement=requirement)

        self._move_hero_to(destination=places_storage.places[
            self.knowledge_base[requirement.place].externals['id']])
Beispiel #2
0
    def check_located_on_road(self, requirement):
        object_fact = self.knowledge_base[requirement.object]

        if isinstance(object_fact, facts.Person):
            return False

        if not isinstance(object_fact, facts.Hero):
            raise exceptions.UnknownRequirementError(requirement=requirement)

        if self.hero.id != object_fact.externals['id']:
            return False

        place_from = places_storage.places[self.knowledge_base[
            requirement.place_from].externals['id']]
        place_to = places_storage.places[self.knowledge_base[
            requirement.place_to].externals['id']]
        percents = requirement.percents

        path_to_position_length = self.hero.position.get_minumum_distance_to(
            place_from)
        path_from_position_length = self.hero.position.get_minumum_distance_to(
            place_to)

        full_path_length = path_to_position_length + path_from_position_length

        if path_to_position_length < E:
            current_percents = 0.0
        elif path_from_position_length < E:
            current_percents = 1.0
        else:
            current_percents = path_to_position_length / full_path_length

        return current_percents >= percents
    def satisfy_located_in(self, requirement):
        object_fact = self.knowledge_base[requirement.object]

        if not isinstance(
                object_fact,
                facts.Hero) or self.hero.id != object_fact.externals['id']:
            raise exceptions.UnknownRequirementError(requirement=requirement)

        self._move_hero_to(destination=places_storage[self.knowledge_base[
            requirement.place].externals['id']])
Beispiel #4
0
    def check_has_money(self, requirement):
        object_fact = self.knowledge_base[requirement.object]

        if isinstance(object_fact, facts.Person):
            return False

        if isinstance(object_fact, facts.Hero):
            if self.hero.id != object_fact.externals['id']:
                return False
            return self.hero.money >= requirement.money

        raise exceptions.UnknownRequirementError(requirement=requirement)
    def satisfy_located_on_road(self, requirement):
        object_fact = self.knowledge_base[requirement.object]

        if not isinstance(
                object_fact,
                facts.Hero) or self.hero.id != object_fact.externals['id']:
            raise exceptions.UnknownRequirementError(requirement=requirement)

        self._move_hero_on_road(place_from=places_storage[self.knowledge_base[
            requirement.place_from].externals['id']],
                                place_to=places_storage[self.knowledge_base[
                                    requirement.place_to].externals['id']],
                                percents=requirement.percents)
Beispiel #6
0
    def satisfy_located_near(self, requirement):
        object_fact = self.knowledge_base[requirement.object]

        if not isinstance(
                object_fact,
                facts.Hero) or self.hero.id != object_fact.externals['id']:
            raise exceptions.UnknownRequirementError(requirement=requirement)

        if requirement.place is None:
            self._move_hero_near(destination=None,
                                 terrains=requirement.terrains)
        else:
            self._move_hero_near(destination=places_storage.places.get(
                self.knowledge_base[requirement.place].externals['id']),
                                 terrains=requirement.terrains)
Beispiel #7
0
    def check_located_in(self, requirement):
        object_fact = self.knowledge_base[requirement.object]
        place_fact = self.knowledge_base[requirement.place]

        place = places_storage.places[place_fact.externals['id']]

        if isinstance(object_fact, facts.Person):
            person = persons_storage.persons[object_fact.externals['id']]
            return person.place.id == place.id

        if isinstance(object_fact, facts.Hero):
            return bool(self.hero.id == object_fact.externals['id']
                        and self.hero.position.place
                        and self.hero.position.place.id == place.id)

        raise exceptions.UnknownRequirementError(requirement=requirement)
Beispiel #8
0
    def check_located_near(self, requirement):
        object_fact = self.knowledge_base[requirement.object]
        place_fact = self.knowledge_base[requirement.place]

        place = places_storage.places[place_fact.externals['id']]

        if isinstance(object_fact, facts.Person):
            return False

        if isinstance(object_fact, facts.Hero):
            if self.hero.id != object_fact.externals['id']:
                return False

            if self.hero.position.place:
                return False

            hero_place = self.hero.position.get_nearest_dominant_place()
            return place.id == hero_place.id

        raise exceptions.UnknownRequirementError(requirement=requirement)
Beispiel #9
0
    def check_located_near(self, requirement):
        object_fact = self.knowledge_base[requirement.object]
        place_fact = self.knowledge_base[requirement.place]

        place = places_storage.places[place_fact.externals['id']]

        if isinstance(object_fact, facts.Person):
            return False

        if isinstance(object_fact, facts.Hero):
            if self.hero.id != object_fact.externals['id']:
                return False

            # если городу принадлежит только одна клетка, нак которой он находится,
            # то прогулкой в его окрестностях считается и нахождение в нём самом
            if self.hero.position.place and len(
                    self.hero.position.place.nearest_cells) > 1:
                return False

            hero_place = self.hero.position.get_nearest_dominant_place()
            return place.id == hero_place.id

        raise exceptions.UnknownRequirementError(requirement=requirement)
Beispiel #10
0
 def satisfy_is_alive(self, requirement):
     raise exceptions.UnknownRequirementError(requirement=requirement)
Beispiel #11
0
 def satisfy_has_money(self, requirement):
     raise exceptions.UnknownRequirementError(requirement=requirement)