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']])
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']])
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)
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)
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)
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)
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)
def satisfy_is_alive(self, requirement): raise exceptions.UnknownRequirementError(requirement=requirement)
def satisfy_has_money(self, requirement): raise exceptions.UnknownRequirementError(requirement=requirement)