def check_quest(self, quest_class): self.kb += quest_class.construct_from_place( nesting=0, selector=self.selector, start_place=self.selector.new_place(candidates=('place_1', ))) self.kb.validate_consistency([ restrictions.SingleStartStateWithNoEnters(), restrictions.FinishStateExists(), restrictions.AllStatesHasJumps(), restrictions.SingleLocationForObject(), restrictions.ReferencesIntegrity(), restrictions.ConnectedStateJumpGraph(), restrictions.NoCirclesInStateJumpGraph(), # restrictions.MultipleJumpsFromNormalState(), restrictions.ChoicesConsistency(), restrictions.QuestionsConsistency(), restrictions.FinishResultsConsistency(), restrictions.RequirementsConsistency(), restrictions.ActionsConsistency() ])
def setUp(self): super(FinishResultsConsistencyTests, self).setUp() self.restriction = restrictions.FinishResultsConsistency() self.finish_1 = facts.Finish(start='start_1', uid='finish_1', results={ 'p1': 0, 'p2': 0 }, nesting=0) self.finish_2 = facts.Finish(start='start_2', uid='finish_2', results={ 'p3': 0, 'p4': 0, 'p5': 0 }, nesting=0) self.kb += [ facts.Start(uid='start_1', type='test', nesting=0), facts.Start(uid='start_2', type='test', nesting=0), self.finish_1, self.finish_2, facts.QuestParticipant(start='start_1', participant='p1', role='role'), facts.QuestParticipant(start='start_1', participant='p2', role='role'), facts.QuestParticipant(start='start_2', participant='p3', role='role'), facts.QuestParticipant(start='start_2', participant='p4', role='role'), facts.QuestParticipant(start='start_2', participant='p5', role='role') ]
] # список ограничений для графа задания QUEST_RESTRICTIONS = [ restrictions.SingleStartStateWithNoEnters( ), # только одна начальная вершина для задания restrictions.FinishStateExists(), # существуют завершающие вершины restrictions.AllStatesHasJumps(), # существуют переходы из всех состояний restrictions.ConnectedStateJumpGraph(), # граф связаный restrictions.NoCirclesInStateJumpGraph(), # граф без циклов restrictions.MultipleJumpsFromNormalState( ), # каждая обычная вершина имеет только одну исходящую дугу restrictions.ChoicesConsistency(), # проверяем целостность развилок restrictions.QuestionsConsistency( ), # проверяем целостность условных узлов restrictions.FinishResultsConsistency( ) # проверяем, что для каждого окончания квеста указаны результаты для каждого его участника ] # создаём задание # эта функция может вызвать исключение questgen.exceptions.RollBackError и это её нормальное поведение # исключение означает, что создать задание не получилось и надо повторить попытку def create_quest(): # формируем список заданий для генерации qb = QuestsBase() qb += [ Spying, Hunt, Hometown, SearchSmith, Delivery, Caravan, CollectDebt, HelpFriend, InterfereEnemy, Help ]
facts.UpgradeEquipmentCost(money=777) ] selector = Selector(kb, qb) kb += Quest.construct_from_place( nesting=0, selector=selector, start_place=selector.new_place(candidates=('place_1', ))) try: kb.validate_consistency([ restrictions.SingleStartStateWithNoEnters(), restrictions.FinishStateExists(), restrictions.AllStatesHasJumps(), restrictions.SingleLocationForObject(), restrictions.ReferencesIntegrity(), restrictions.ConnectedStateJumpGraph(), restrictions.NoCirclesInStateJumpGraph(), # restrictions.MultipleJumpsFromNormalState(), restrictions.ChoicesConsistency(), # restrictions.QuestionsConsistency(), restrictions.FinishResultsConsistency() ]) pass except Exception: print('quesr %s is invalid' % Quest.TYPE) raise drawer = Drawer(knowledge_base=kb) drawer.draw('./svgs/%s.svg' % Quest.TYPE)