예제 #1
0
    def make_choice(self, option_uid):
        choice, options, defaults = self.get_nearest_choice()

        if self.knowledge_base[option_uid].state_from != choice.uid:
            return False

        if not any(option.uid == option_uid for option in options):
            return False

        if not defaults[0].default:
            return False

        if not transformators.change_choice(knowledge_base=self.knowledge_base,
                                            new_option_uid=option_uid,
                                            default=False):
            return False

        self.machine.sync_pointer()

        if self.quests_stack:
            self.current_info.sync_choices(self.knowledge_base, self.hero,
                                           *self.get_nearest_choice())

        self.hero.actions.request_replane()
        return True
예제 #2
0
    def test_linked_choices__without_path(self):
        # in some cases, not all linked choices can have default path
        start = facts.Start(uid="start", type="test", nesting=0)
        choice_1 = facts.Choice(uid="choice_1")
        choice_2 = facts.Choice(uid="choice_2")
        finish_1 = facts.Finish(uid="finish_1", results={}, nesting=0, start="start")
        finish_2 = facts.Finish(uid="finish_2", results={}, nesting=0, start="start")

        option_1 = facts.Option(state_from=choice_1.uid, state_to=finish_1.uid, type="opt_1", markers=())
        option_2 = facts.Option(state_from=choice_1.uid, state_to=choice_2.uid, type="opt_2", markers=())

        option_2_1 = facts.Option(state_from=choice_2.uid, state_to=finish_1.uid, type="opt_2_1", markers=())
        option_2_2 = facts.Option(state_from=choice_2.uid, state_to=finish_2.uid, type="opt_2_2", markers=())

        facts_list = [
            start,
            choice_1,
            choice_2,
            finish_1,
            finish_2,
            option_1,
            option_2,
            option_2_1,
            option_2_2,
            facts.OptionsLink(options=(option_1.uid, option_2_1.uid)),
            facts.OptionsLink(options=(option_2.uid, option_2_2.uid)),
        ]

        self.kb += facts_list

        choices = [
            facts.ChoicePath(choice=choice_1.uid, option=option_2.uid, default=True)
        ]  # defaul path specified only for one choice

        self.kb += choices

        transformators.change_choice(self.kb, option_1.uid, default=False)

        self.check_in_knowledge_base(self.kb, facts_list)
        self.check_not_in_knowledge_base(self.kb, choices)

        self.assertEqual(len(list(self.kb.filter(facts.ChoicePath))), 2)
        self.assertEqual(len(set([path.choice for path in self.kb.filter(facts.ChoicePath)])), 2)

        self.assertEqual(
            set([path.option for path in self.kb.filter(facts.ChoicePath)]), set([option_1.uid, option_2_1.uid])
        )
예제 #3
0
    def test_linked_choices(self):
        start = facts.Start(uid='start', type='test', nesting=0)
        choice_1 = facts.Choice(uid='choice_1')
        choice_2 = facts.Choice(uid='choice_2')
        finish_1 = facts.Finish(uid='finish_1', results={}, nesting=0, start='start')
        finish_2 = facts.Finish(uid='finish_2', results={}, nesting=0, start='start')

        option_1 = facts.Option(state_from=choice_1.uid, state_to=finish_1.uid, type='opt_1', markers=())
        option_2 = facts.Option(state_from=choice_1.uid, state_to=choice_2.uid, type='opt_2', markers=())

        option_2_1 = facts.Option(state_from=choice_2.uid, state_to=finish_1.uid, type='opt_2_1', markers=())
        option_2_2 = facts.Option(state_from=choice_2.uid, state_to=finish_2.uid, type='opt_2_2', markers=())

        facts_list = [ start,
                  choice_1,
                  choice_2,
                  finish_1,
                  finish_2,

                  option_1,
                  option_2,
                  option_2_1,
                  option_2_2,

                  facts.OptionsLink(options=(option_1.uid, option_2_1.uid)),
                  facts.OptionsLink(options=(option_2.uid, option_2_2.uid))
                ]

        self.kb += facts_list

        choices = [facts.ChoicePath(choice=choice_1.uid, option=option_2.uid, default=True),
                   facts.ChoicePath(choice=choice_2.uid, option=option_2_2.uid, default=True)]

        self.kb += choices

        transformators.change_choice(self.kb, option_1.uid, default=False)

        self.check_in_knowledge_base(self.kb, facts_list)
        self.check_not_in_knowledge_base(self.kb, choices)

        self.assertEqual(len(list(self.kb.filter(facts.ChoicePath))), 2)
        self.assertEqual(len(set([path.choice for path in self.kb.filter(facts.ChoicePath)])), 2)

        self.assertEqual(set([path.option for path in self.kb.filter(facts.ChoicePath)]),
                         set([option_1.uid, option_2_1.uid]))
예제 #4
0
    def test_single_choice(self):
        start = facts.Start(uid="start", type="test", nesting=0)
        choice_1 = facts.Choice(uid="choice_1")
        choice_2 = facts.Choice(uid="choice_2")
        finish_1 = facts.Finish(uid="finish_1", results={}, nesting=0, start="start")
        finish_2 = facts.Finish(uid="finish_2", results={}, nesting=0, start="start")

        option_1 = facts.Option(state_from=choice_1.uid, state_to=finish_1.uid, type="opt_1", markers=())
        option_2 = facts.Option(state_from=choice_1.uid, state_to=choice_2.uid, type="opt_2", markers=())

        option_2_1 = facts.Option(state_from=choice_2.uid, state_to=finish_1.uid, type="opt_2_1", markers=())
        option_2_2 = facts.Option(state_from=choice_2.uid, state_to=finish_2.uid, type="opt_2_2", markers=())

        facts_list = [
            start,
            choice_1,
            choice_2,
            finish_1,
            finish_2,
            option_1,
            option_2,
            option_2_1,
            option_2_2,
            facts.ChoicePath(choice=choice_2.uid, option=option_2_2.uid, default=True),
        ]

        self.kb += facts_list

        choices = [facts.ChoicePath(choice=choice_1.uid, option=option_2.uid, default=True)]

        self.kb += choices

        transformators.change_choice(self.kb, option_1.uid, default=False)

        self.check_in_knowledge_base(self.kb, facts_list)
        self.check_not_in_knowledge_base(self.kb, choices)

        self.assertEqual(len(list(self.kb.filter(facts.ChoicePath))), 2)
        self.assertEqual(len(set([path.choice for path in self.kb.filter(facts.ChoicePath)])), 2)

        self.assertEqual(
            set([path.option for path in self.kb.filter(facts.ChoicePath)]), set([option_1.uid, option_2_2.uid])
        )
예제 #5
0
    def make_choice(self, option_uid):
        choice, options, defaults = self.get_nearest_choice()

        if self.knowledge_base[option_uid].state_from != choice.uid:
            return False

        if not any(option.uid == option_uid for option in options):
            return False

        if not defaults[0].default:
            return False

        if not transformators.change_choice(knowledge_base=self.knowledge_base, new_option_uid=option_uid, default=False):
            return False

        self.machine.sync_pointer()

        if self.quests_stack:
            self.current_info.sync_choices(self.knowledge_base, self.hero, *self.get_nearest_choice())

        self.hero.actions.request_replane()
        return True
예제 #6
0
    def test_linked_choices(self):
        start = facts.Start(uid='start', type='test', nesting=0)
        choice_1 = facts.Choice(uid='choice_1')
        choice_2 = facts.Choice(uid='choice_2')
        finish_1 = facts.Finish(uid='finish_1',
                                results={},
                                nesting=0,
                                start='start')
        finish_2 = facts.Finish(uid='finish_2',
                                results={},
                                nesting=0,
                                start='start')

        option_1 = facts.Option(state_from=choice_1.uid,
                                state_to=finish_1.uid,
                                type='opt_1',
                                markers=())
        option_2 = facts.Option(state_from=choice_1.uid,
                                state_to=choice_2.uid,
                                type='opt_2',
                                markers=())

        option_2_1 = facts.Option(state_from=choice_2.uid,
                                  state_to=finish_1.uid,
                                  type='opt_2_1',
                                  markers=())
        option_2_2 = facts.Option(state_from=choice_2.uid,
                                  state_to=finish_2.uid,
                                  type='opt_2_2',
                                  markers=())

        facts_list = [
            start, choice_1, choice_2, finish_1, finish_2, option_1, option_2,
            option_2_1, option_2_2,
            facts.OptionsLink(options=(option_1.uid, option_2_1.uid)),
            facts.OptionsLink(options=(option_2.uid, option_2_2.uid))
        ]

        self.kb += facts_list

        choices = [
            facts.ChoicePath(choice=choice_1.uid,
                             option=option_2.uid,
                             default=True),
            facts.ChoicePath(choice=choice_2.uid,
                             option=option_2_2.uid,
                             default=True)
        ]

        self.kb += choices

        transformators.change_choice(self.kb, option_1.uid, default=False)

        self.check_in_knowledge_base(self.kb, facts_list)
        self.check_not_in_knowledge_base(self.kb, choices)

        self.assertEqual(len(list(self.kb.filter(facts.ChoicePath))), 2)
        self.assertEqual(
            len(set([path.choice
                     for path in self.kb.filter(facts.ChoicePath)])), 2)

        self.assertEqual(
            set([path.option for path in self.kb.filter(facts.ChoicePath)]),
            set([option_1.uid, option_2_1.uid]))