Exemple #1
0
 def setUp(self):
     super(SingleStartStateWithNoEntersTests, self).setUp()
     self.start = facts.Start(uid='start', type='test', nesting=0)
     self.restriction = restrictions.SingleStartStateWithNoEnters()
Exemple #2
0
 def test_more_then_one_start__without_enters(self):
     self.kb += (self.start,
                 facts.Start(uid='start_2', type='test', nesting=0))
     self.assertRaises(self.restriction.Error, self.restriction.validate,
                       self.kb)
Exemple #3
0
    def construct(cls, nesting, selector, initiator, initiator_position,
                  receiver, receiver_position):

        hero = selector.heroes()[0]

        ns = selector._kb.get_next_ns()

        start = facts.Start(
            uid=ns + 'start',
            type=cls.TYPE,
            nesting=nesting,
            description='Начало: выбить долг',
            require=[
                requirements.LocatedIn(object=hero.uid,
                                       place=initiator_position.uid),
                requirements.LocatedIn(object=receiver.uid,
                                       place=receiver_position.uid)
            ],
            actions=[actions.Message(type='intro')])

        participants = [
            facts.QuestParticipant(start=start.uid,
                                   participant=initiator.uid,
                                   role=ROLES.INITIATOR),
            facts.QuestParticipant(start=start.uid,
                                   participant=receiver.uid,
                                   role=ROLES.RECEIVER)
        ]

        choose_method = facts.Choice(
            uid=ns + 'choose_method',
            description='Выбрать метод получения долга',
            require=[
                requirements.LocatedIn(object=hero.uid,
                                       place=receiver_position.uid)
            ],
            actions=[actions.Message(type='move_to_receiver')])

        attack = facts.Question(
            uid=ns + 'attack',
            description='сражение с подручными должника',
            require=[
                requirements.LocatedIn(object=hero.uid,
                                       place=receiver_position.uid)
            ],
            actions=[
                actions.Message(type='attack'),
                actions.Fight(mercenary=True)
            ],
            condition=[requirements.IsAlive(object=hero.uid)])

        finish_attack_successed = facts.Finish(
            uid=ns + 'finish_attack_successed',
            start=start.uid,
            results={
                initiator.uid: RESULTS.SUCCESSED,
                receiver.uid: RESULTS.FAILED
            },
            nesting=nesting,
            description='долг выбит',
            require=[
                requirements.LocatedIn(object=hero.uid,
                                       place=initiator_position.uid)
            ],
            actions=[
                actions.GiveReward(object=hero.uid,
                                   type='finish_attack_successed')
            ])

        finish_attack_failed = facts.Finish(
            uid=ns + 'finish_attack_failed',
            start=start.uid,
            results={
                initiator.uid: RESULTS.NEUTRAL,
                receiver.uid: RESULTS.NEUTRAL
            },
            nesting=nesting,
            description='не удалось выбить долг',
            actions=[actions.Message(type='finish_attack_failed')])

        help = facts.State(uid=ns + 'help',
                           description='помочь должнику',
                           require=[
                               requirements.LocatedIn(
                                   object=hero.uid,
                                   place=receiver_position.uid)
                           ])

        finish_help = facts.Finish(
            uid=ns + 'finish_help',
            start=start.uid,
            results={
                initiator.uid: RESULTS.SUCCESSED,
                receiver.uid: RESULTS.SUCCESSED
            },
            nesting=nesting,
            description='помощь оказана',
            require=[
                requirements.LocatedIn(object=hero.uid,
                                       place=initiator_position.uid)
            ],
            actions=[actions.GiveReward(object=hero.uid, type='finish_help')])

        help_quest = selector.create_quest_from_person(nesting=nesting + 1,
                                                       initiator=receiver,
                                                       tags=('can_continue', ))
        help_extra = []

        for help_fact in logic.filter_subquest(help_quest, nesting):
            if isinstance(help_fact, facts.Start):
                help_extra.append(
                    facts.Jump(
                        state_from=help.uid,
                        state_to=help_fact.uid,
                        start_actions=[actions.Message(type='before_help')]))
            elif isinstance(help_fact, facts.Finish):
                if help_fact.results[receiver.uid] == RESULTS.SUCCESSED:
                    help_extra.append(
                        facts.Jump(
                            state_from=help_fact.uid,
                            state_to=finish_help.uid,
                            start_actions=[
                                actions.Message(type='after_successed_help')
                            ]))
                else:
                    help_extra.append(
                        facts.Jump(
                            state_from=help_fact.uid,
                            state_to=attack.uid,
                            start_actions=[
                                actions.Message(type='after_failed_help')
                            ]))

        subquest = facts.SubQuest(
            uid=ns + 'help_subquest',
            members=logic.get_subquest_members(help_quest))

        line = [
            start,
            facts.Jump(state_from=start.uid,
                       state_to=choose_method.uid), choose_method,
            facts.Option(state_from=choose_method.uid,
                         state_to=attack.uid,
                         type='attack',
                         markers=[relations.OPTION_MARKERS.AGGRESSIVE]),
            facts.Option(state_from=choose_method.uid,
                         state_to=help.uid,
                         type='help',
                         markers=[relations.OPTION_MARKERS.UNAGGRESSIVE]),
            help, attack,
            facts.Answer(
                state_from=attack.uid,
                state_to=finish_attack_successed.uid,
                condition=True,
                start_actions=[actions.Message(type='attack_successed')]),
            facts.Answer(state_from=attack.uid,
                         state_to=finish_attack_failed.uid,
                         condition=False,
                         start_actions=[actions.Message(type='attack_failed')
                                        ]), finish_attack_successed,
            finish_attack_failed, finish_help, subquest
        ]

        line.extend(participants)
        line.extend(help_quest)
        line.extend(help_extra)

        return line
Exemple #4
0
    def construct(cls, nesting, selector, initiator, initiator_position,
                  receiver, receiver_position):

        hero = selector.heroes()[0]

        ns = selector._kb.get_next_ns()

        start = facts.Start(uid=ns + 'start',
                            type=cls.TYPE,
                            nesting=nesting,
                            description=u'Начало: «сложное» задание',
                            require=[
                                requirements.LocatedIn(
                                    object=hero.uid,
                                    place=initiator_position.uid)
                            ],
                            actions=[actions.Message(type='intro')])

        participants = [
            facts.QuestParticipant(start=start.uid,
                                   participant=receiver_position.uid,
                                   role=ROLES.RECEIVER_POSITION)
        ]

        arriving = facts.Choice(
            uid=ns + 'arriving',
            description=
            u'Заплатить пошлину при прибытии в город или махнуть через стену',
            require=[
                requirements.LocatedIn(object=hero.uid,
                                       place=receiver_position.uid)
            ])

        tax = facts.Question(
            uid=ns + 'tax',
            description=u'Хватит ли у героя денег на пошлину',
            condition=[requirements.HasMoney(object=hero.uid, money=100500)],
            actions=[actions.Message(type='tax_officer_conversation')])

        finish_not_paid = facts.Finish(
            uid=ns + 'finish_not_paid',
            start=start.uid,
            results={receiver_position.uid: RESULTS.FAILED},
            nesting=nesting,
            description=u'завершить задание',
            actions=[
                actions.GiveReward(object=hero.uid, type='finish'),
                actions.GivePower(object=receiver_position.uid, power=-1)
            ])

        finish_paid = facts.Finish(
            uid=ns + 'finish_paid',
            start=start.uid,
            results={receiver_position.uid: RESULTS.SUCCESSED},
            nesting=nesting,
            description=u'завершить задание',
            actions=[
                actions.GiveReward(object=hero.uid, type='finish'),
                actions.GivePower(object=receiver_position.uid, power=1)
            ])

        line = [
            start, arriving, tax, finish_not_paid, finish_paid,
            facts.Jump(state_from=start.uid, state_to=arriving.uid),
            facts.Option(state_from=arriving.uid,
                         state_to=finish_not_paid.uid,
                         type='not_paid',
                         markers=()),
            facts.Option(state_from=arriving.uid,
                         state_to=tax.uid,
                         type='pay_tax',
                         markers=()),
            facts.Answer(state_from=tax.uid,
                         state_to=finish_paid.uid,
                         condition=True),
            facts.Answer(state_from=tax.uid,
                         state_to=finish_not_paid.uid,
                         condition=False)
        ]

        line.extend(participants)

        return line
Exemple #5
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]))
Exemple #6
0
    def construct(cls, nesting, selector, initiator, initiator_position,
                  receiver, receiver_position):

        mob = cls.get_mob(selector)

        hero = selector.heroes()[0]

        ns = selector._kb.get_next_ns()

        start = facts.Start(uid=ns + 'start',
                            type=cls.TYPE,
                            nesting=nesting,
                            description='Начало: задание на охоту',
                            require=[
                                requirements.LocatedIn(
                                    object=hero.uid,
                                    place=initiator_position.uid)
                            ],
                            actions=[actions.Message(type='intro')])

        participants = [
            facts.QuestParticipant(start=start.uid,
                                   participant=receiver_position.uid,
                                   role=ROLES.RECEIVER_POSITION)
        ]

        start_hunting = facts.State(uid=ns + 'start_hunting',
                                    description='Прибытие в город охоты',
                                    require=[
                                        requirements.LocatedIn(
                                            object=hero.uid,
                                            place=receiver_position.uid)
                                    ])

        hunt_loop = []

        for i in range(random.randint(*cls.HUNT_LOOPS)):

            hunt = facts.State(uid=ns + 'hunt_%d' % i,
                               description='Охота',
                               actions=[
                                   actions.MoveNear(
                                       object=hero.uid,
                                       place=receiver_position.uid,
                                       terrains=mob.terrains)
                               ])

            fight = facts.State(uid=ns + 'fight_%d' % i,
                                description='Сражение с жертвой',
                                actions=[
                                    actions.Message(type='fight'),
                                    actions.Fight(mob=mob.uid)
                                ])

            if hunt_loop:
                hunt_loop.append(
                    facts.Jump(state_from=hunt_loop[-1].uid,
                               state_to=hunt.uid,
                               start_actions=[
                                   actions.Message(type='start_track'),
                               ]))

            hunt_loop.extend([
                hunt,
                facts.Jump(state_from=hunt.uid, state_to=fight.uid), fight
            ])

        sell_prey = facts.Finish(
            uid=ns + 'sell_prey',
            start=start.uid,
            results={receiver_position.uid: RESULTS.SUCCESSED},
            nesting=nesting,
            description='Продать добычу',
            require=[
                requirements.LocatedIn(object=hero.uid,
                                       place=receiver_position.uid)
            ],
            actions=[actions.GiveReward(object=hero.uid, type='sell_prey')])

        line = [
            start,
            start_hunting,
            sell_prey,
            facts.Jump(state_from=start.uid,
                       state_to=start_hunting.uid,
                       start_actions=[
                           actions.Message(type='move_to_hunt'),
                       ]),
            facts.Jump(state_from=start_hunting.uid,
                       state_to=hunt_loop[0].uid,
                       start_actions=[
                           actions.Message(type='start_track'),
                       ]),
            facts.Jump(state_from=hunt_loop[-1].uid,
                       state_to=sell_prey.uid,
                       start_actions=[
                           actions.Message(type='return_with_prey'),
                       ]),
        ]

        line.extend(hunt_loop)
        line.extend(participants)

        return line
Exemple #7
0
    def construct(cls, nesting, selector, initiator, initiator_position,
                  receiver, receiver_position):

        hero = selector.heroes()[0]

        ns = selector._kb.get_next_ns()

        antagonist_marker = None

        try:
            antagonist = selector.new_person(
                first_initiator=False,
                professions=[relations.PROFESSION.ROGUE])
            antagonist_marker = facts.ProfessionMarker(
                person=antagonist.uid, profession=antagonist.profession)
        except exceptions.NoFactSelectedError:
            antagonist = selector.new_person(first_initiator=False)

        antagonist_position = selector.place_for(objects=(antagonist.uid, ))

        start = facts.Start(uid=ns + 'start',
                            type=cls.TYPE,
                            nesting=nesting,
                            description=u'Начало: доставка',
                            require=[
                                requirements.LocatedIn(
                                    object=hero.uid,
                                    place=initiator_position.uid)
                            ],
                            actions=[actions.Message(type='intro')])

        participants = [
            facts.QuestParticipant(start=start.uid,
                                   participant=initiator.uid,
                                   role=ROLES.INITIATOR),
            facts.QuestParticipant(start=start.uid,
                                   participant=receiver.uid,
                                   role=ROLES.RECEIVER),
            facts.QuestParticipant(start=start.uid,
                                   participant=antagonist.uid,
                                   role=ROLES.ANTAGONIST)
        ]

        delivery_choice = facts.Choice(
            uid=ns + 'delivery_choice',
            description=u'Решение: доставить или украсть')

        finish_delivery = facts.Finish(
            uid=ns + 'finish_delivery',
            start=start.uid,
            results={
                initiator.uid: RESULTS.SUCCESSED,
                receiver.uid: RESULTS.SUCCESSED,
                antagonist.uid: RESULTS.NEUTRAL
            },
            nesting=nesting,
            description=u'Доставить посылку получателю',
            require=[
                requirements.LocatedIn(object=hero.uid,
                                       place=receiver_position.uid)
            ],
            actions=[
                actions.GiveReward(object=hero.uid, type='finish_delivery'),
                actions.GivePower(object=initiator.uid, power=1),
                actions.GivePower(object=receiver.uid, power=1)
            ])

        finish_fake_delivery = facts.Finish(
            uid=ns + 'finish_fake_delivery',
            start=start.uid,
            results={
                initiator.uid: RESULTS.FAILED,
                receiver.uid: RESULTS.FAILED,
                antagonist.uid: RESULTS.NEUTRAL
            },
            nesting=nesting,
            description=u'Подделать письмо',
            require=[
                requirements.LocatedIn(object=hero.uid,
                                       place=receiver_position.uid)
            ],
            actions=[
                actions.GiveReward(object=hero.uid,
                                   type='finish_fake_delivery',
                                   scale=2.0),
                actions.GivePower(object=initiator.uid, power=-1),
                actions.GivePower(object=receiver.uid, power=-1)
            ])

        fake_delivery_dummy_state = facts.FakeFinish(
            uid=ns + 'dummy_state',
            start=start.uid,
            results={
                initiator.uid: RESULTS.NEUTRAL,
                receiver.uid: RESULTS.NEUTRAL,
                antagonist.uid: RESULTS.NEUTRAL
            },
            nesting=nesting,
            description=
            u'заглушка, чтобы можно было управлять появлением подделки письма')

        finish_steal = facts.Finish(
            uid=ns + 'finish_steal',
            start=start.uid,
            results={
                initiator.uid: RESULTS.FAILED,
                receiver.uid: RESULTS.FAILED,
                antagonist.uid: RESULTS.SUCCESSED
            },
            nesting=nesting,
            description=u'Доставить посылку скупщику',
            require=[
                requirements.LocatedIn(object=hero.uid,
                                       place=antagonist_position.uid)
            ],
            actions=[
                actions.GiveReward(object=hero.uid,
                                   type='finish_steal',
                                   scale=1.5),
                actions.GivePower(object=initiator.uid, power=-1),
                actions.GivePower(object=receiver.uid, power=-1),
                actions.GivePower(object=antagonist.uid, power=1.0)
            ])

        delivery_stealed = facts.State(
            uid=ns + 'delivery_stealed',
            description=u'письмо украдено',
            require=[
                requirements.LocatedOnRoad(object=hero.uid,
                                           place_from=initiator_position.uid,
                                           place_to=receiver_position.uid,
                                           percents=random.uniform(0.6, 0.9))
            ],
            actions=[
                actions.Message(type='delivery_stealed'),
                actions.MoveNear(object=hero.uid)
            ])

        fight_for_stealed = facts.Question(
            uid=ns + 'fight_for_stealed',
            description=u'Сразиться с вором',
            actions=[
                actions.Message(type='fight_thief'),
                actions.Fight(mercenary=True)
            ],
            condition=[requirements.IsAlive(object=hero.uid)])

        finish_fight_for_stealed__hero_died = facts.Finish(
            uid=ns + 'finish_fight_for_stealed__hero_died',
            start=start.uid,
            results={
                initiator.uid: RESULTS.NEUTRAL,
                receiver.uid: RESULTS.NEUTRAL,
                antagonist.uid: RESULTS.NEUTRAL
            },
            nesting=nesting,
            description=u'Герой не смог вернуть украденное письмо',
            actions=[
                actions.Message(type='finish_fight_for_stealed__hero_died')
            ])

        finish_fight_for_stealed__delivery = facts.Finish(
            uid=ns + 'finish_fight_for_stealed__delivery',
            start=start.uid,
            results={
                initiator.uid: RESULTS.SUCCESSED,
                receiver.uid: RESULTS.SUCCESSED,
                antagonist.uid: RESULTS.NEUTRAL
            },
            nesting=nesting,
            description=u'Доставить посылку получателю',
            require=[
                requirements.LocatedIn(object=hero.uid,
                                       place=receiver_position.uid)
            ],
            actions=[
                actions.GiveReward(object=hero.uid, type='finish_delivery'),
                actions.GivePower(object=initiator.uid, power=1),
                actions.GivePower(object=receiver.uid, power=1)
            ])

        line = [
            start, delivery_choice, delivery_stealed, fight_for_stealed,
            finish_delivery, finish_steal, finish_fake_delivery,
            fake_delivery_dummy_state, finish_fight_for_stealed__hero_died,
            finish_fight_for_stealed__delivery,
            facts.Jump(state_from=start.uid, state_to=delivery_choice.uid),
            facts.Jump(state_from=delivery_stealed.uid,
                       state_to=fight_for_stealed.uid),
            facts.Option(state_from=delivery_choice.uid,
                         state_to=delivery_stealed.uid,
                         type='delivery',
                         markers=[relations.OPTION_MARKERS.HONORABLE],
                         start_actions=[
                             actions.Message(type='start_delivery'),
                         ]),
            facts.Option(state_from=delivery_choice.uid,
                         state_to=finish_delivery.uid,
                         type='delivery',
                         markers=[relations.OPTION_MARKERS.HONORABLE],
                         start_actions=[
                             actions.Message(type='start_delivery'),
                         ]),
            facts.Option(state_from=delivery_choice.uid,
                         state_to=finish_steal.uid,
                         type='steal',
                         markers=[relations.OPTION_MARKERS.DISHONORABLE],
                         start_actions=[
                             actions.Message(type='start_steal'),
                         ]),
            facts.Option(state_from=delivery_choice.uid,
                         state_to=finish_fake_delivery.uid,
                         type='fake',
                         markers=[relations.OPTION_MARKERS.DISHONORABLE],
                         start_actions=[
                             actions.Message(type='start_fake'),
                         ]),
            facts.Option(state_from=delivery_choice.uid,
                         state_to=fake_delivery_dummy_state.uid,
                         markers=[],
                         type='dummy_lie'),
            facts.Answer(
                state_from=fight_for_stealed.uid,
                state_to=finish_fight_for_stealed__delivery.uid,
                condition=True,
                start_actions=[actions.Message(type='delivery_returned')]),
            facts.Answer(state_from=fight_for_stealed.uid,
                         state_to=finish_fight_for_stealed__hero_died.uid,
                         condition=False),
            facts.Event(uid=ns + 'delivery_variants',
                        description=u'Варианты доставки',
                        members=(delivery_stealed.uid, finish_delivery.uid)),
            facts.Event(uid=ns + 'lie_variants',
                        description=u'Варианты обмана',
                        members=(fake_delivery_dummy_state.uid,
                                 finish_fake_delivery.uid))
        ]

        line.extend(participants)

        if antagonist_marker:
            line.append(antagonist_marker)

        return line
Exemple #8
0
    def construct(cls, nesting, selector, initiator, initiator_position,
                  receiver, receiver_position):

        hero = selector.heroes()[0]

        ns = selector._kb.get_next_ns()

        start = facts.Start(uid=ns + 'start',
                            type=cls.TYPE,
                            nesting=nesting,
                            description='Начало: навестить соратника',
                            require=[
                                requirements.LocatedIn(
                                    object=hero.uid,
                                    place=initiator_position.uid)
                            ],
                            actions=[actions.Message(type='intro')])

        participants = [
            facts.QuestParticipant(start=start.uid,
                                   participant=receiver.uid,
                                   role=ROLES.RECEIVER)
        ]

        meeting = facts.State(uid=ns + 'meeting',
                              description='встреча с соратником',
                              require=[
                                  requirements.LocatedIn(
                                      object=hero.uid,
                                      place=receiver_position.uid)
                              ])

        finish_meeting = facts.Finish(
            uid=ns + 'finish_meeting',
            start=start.uid,
            results={receiver.uid: RESULTS.SUCCESSED},
            nesting=nesting,
            description='соратнику оказана помощь',
            require=[
                requirements.LocatedIn(object=hero.uid,
                                       place=receiver_position.uid)
            ],
            actions=[
                actions.GiveReward(object=hero.uid, type='finish_meeting')
            ])

        help_quest = selector.create_quest_from_person(nesting=nesting + 1,
                                                       initiator=receiver,
                                                       tags=('can_continue', ))
        help_extra = []

        for help_fact in logic.filter_subquest(help_quest, nesting):
            if isinstance(help_fact, facts.Start):
                help_extra.append(
                    facts.Jump(
                        state_from=meeting.uid,
                        state_to=help_fact.uid,
                        start_actions=[actions.Message(type='before_help')]))
            elif isinstance(help_fact, facts.Finish):
                if help_fact.results[receiver.uid] == RESULTS.SUCCESSED:
                    help_extra.append(
                        facts.Jump(state_from=help_fact.uid,
                                   state_to=finish_meeting.uid,
                                   start_actions=[
                                       actions.Message(type='after_help')
                                   ]))

        subquest = facts.SubQuest(
            uid=ns + 'help_subquest',
            members=logic.get_subquest_members(help_quest))

        line = [
            start,
            facts.Jump(state_from=start.uid, state_to=meeting.uid), meeting,
            finish_meeting, subquest
        ]

        line.extend(participants)
        line.extend(help_quest)
        line.extend(help_extra)

        return line
Exemple #9
0
    def construct(cls, nesting, selector, initiator, initiator_position,
                  receiver, receiver_position):

        hero = selector.heroes()[0]

        ns = selector._kb.get_next_ns()

        antagonist = selector.new_person(first_initiator=False)
        antagonist_position = selector.place_for(objects=(antagonist.uid, ))

        start = facts.Start(uid=ns + 'start',
                            type=cls.TYPE,
                            nesting=nesting,
                            description=u'Начало: навредить противнику',
                            require=[
                                requirements.LocatedIn(
                                    object=hero.uid,
                                    place=initiator_position.uid)
                            ],
                            actions=[actions.Message(type='intro')])

        participants = [
            facts.QuestParticipant(start=start.uid,
                                   participant=receiver.uid,
                                   role=ROLES.RECEIVER),
            facts.QuestParticipant(start=start.uid,
                                   participant=antagonist_position.uid,
                                   role=ROLES.ANTAGONIST_POSITION)
        ]

        finish = facts.Finish(uid=ns + 'finish',
                              start=start.uid,
                              results={
                                  receiver.uid: RESULTS.FAILED,
                                  antagonist_position.uid: RESULTS.NEUTRAL
                              },
                              nesting=nesting,
                              description=u'навредили противнику',
                              actions=[
                                  actions.GiveReward(object=hero.uid,
                                                     type='finish'),
                                  actions.GivePower(object=receiver.uid,
                                                    power=-1),
                                  actions.GivePower(
                                      object=antagonist_position.uid, power=0)
                              ])

        help_quest = selector.create_quest_between_2(nesting=nesting + 1,
                                                     initiator=antagonist,
                                                     receiver=receiver,
                                                     tags=('can_continue', ))
        help_extra = []

        for help_fact in logic.filter_subquest(help_quest, nesting):
            if isinstance(help_fact, facts.Start):
                help_extra.append(
                    facts.Jump(state_from=start.uid, state_to=help_fact.uid))
            elif isinstance(help_fact, facts.Finish):
                if help_fact.results[receiver.uid] == RESULTS.FAILED:
                    help_extra.append(
                        facts.Jump(state_from=help_fact.uid,
                                   state_to=finish.uid,
                                   start_actions=[
                                       actions.Message(type='after_interfere')
                                   ]))

        subquest = facts.SubQuest(
            uid=ns + 'interfere_subquest',
            members=logic.get_subquest_members(help_quest))

        line = [start, finish, subquest]

        line.extend(participants)
        line.extend(help_quest)
        line.extend(help_extra)

        return line
Exemple #10
0
    def construct(cls, nesting, selector, initiator, initiator_position, receiver, receiver_position):

        hero = selector.heroes()[0]

        ns = selector._kb.get_next_ns()

        start = facts.Start(uid=ns+'start',
                      type=cls.TYPE,
                      nesting=nesting,
                      description=u'Начало: задание на шпионаж',
                      require=[requirements.LocatedIn(object=hero.uid, place=initiator_position.uid),
                               requirements.LocatedIn(object=receiver.uid, place=receiver_position.uid)],
                      actions=[actions.Message(type='intro')])

        participants = [facts.QuestParticipant(start=start.uid, participant=initiator.uid, role=ROLES.INITIATOR),
                        facts.QuestParticipant(start=start.uid, participant=receiver.uid, role=ROLES.RECEIVER) ]

        start_spying = facts.Choice(uid=ns+'start_spying',
                              description=u'Прибытие в город цели',
                              require=[requirements.LocatedIn(object=hero.uid, place=receiver_position.uid)],
                              actions=[actions.Message(type='arrived_to_target')])


        spying_middle = facts.Choice(uid=ns+'spying_middle',
                               description=u'Шпионаж',
                               actions=[actions.MoveNear(object=hero.uid, place=receiver_position.uid)])

        continue_spying = facts.State(uid=ns+'continue_spying',
                                      description=u'Продолжить шпионаж')

        success_spying = facts.State(uid=ns+'success_spying',
                                description=u'шпионим без происшествий',
                                require=[requirements.LocatedNear(object=hero.uid, place=receiver_position.uid)],
                                actions=[actions.Message(type='success_spying'),
                                         actions.MoveNear(object=hero.uid, place=receiver_position.uid)])

        witness = facts.State(uid=ns+'witness',
                              description=u'героя заметил один из работников цели',
                              require=[requirements.LocatedNear(object=hero.uid, place=receiver_position.uid)],
                              actions=[actions.Message(type='witness'),
                                       actions.MoveNear(object=hero.uid, place=receiver_position.uid)  ])

        witness_fight = facts.Question(uid=ns+'witness_fight',
                                       description=u'удалось ли победить свидетеля?',
                                       condition=[requirements.IsAlive(object=hero.uid)],
                                       actions=[actions.Message(type='witness_fight'),
                                                actions.Fight(mercenary=True)])

        open_up = facts.State(uid=ns+'open_up',
                        description=u'Раскрыться',
                        require=[requirements.LocatedIn(object=hero.uid, place=receiver_position.uid)],
                        actions=[actions.Message(type='open_up')])


        report_data = facts.Finish(uid=ns+'report_data',
                                   start=start.uid,
                                   results={initiator.uid: RESULTS.SUCCESSED,
                                            receiver.uid: RESULTS.FAILED},
                                   nesting=nesting,
                                   description=u'Сообщить сообранную информацию',
                                   require=[requirements.LocatedIn(object=hero.uid, place=initiator_position.uid)],
                                   actions=[actions.GiveReward(object=hero.uid, type='report_data')])

        finish_spying_choice = facts.Choice(uid=ns+'finish_spying_choice',
                                            description=u'Варианты выбора завершения шпионажа')

        blackmail_finish = facts.Finish(uid=ns+'blackmail_finish',
                                        start=start.uid,
                                        results={initiator.uid: RESULTS.NEUTRAL,
                                                 receiver.uid: RESULTS.FAILED},
                                        nesting=nesting,
                                        description=u'Шантажировать самостоятельно',
                                        require=[requirements.LocatedIn(object=hero.uid, place=receiver_position.uid)],
                                        actions=[actions.GiveReward(object=hero.uid, type='blackmail_finish', scale=1.25)])

        witness_failed = facts.Finish(uid=ns+'witness_failed',
                                      start=start.uid,
                                      results={initiator.uid: RESULTS.NEUTRAL,
                                               receiver.uid: RESULTS.NEUTRAL},
                                      nesting=nesting,
                                      description=u'свидетель смог скрыться',
                                      actions=[actions.Message(type='witness_failed') ])

        open_up_finish = facts.Finish(uid=ns+'open_up_finish',
                                      start=start.uid,
                                      results={initiator.uid: RESULTS.FAILED,
                                               receiver.uid: RESULTS.SUCCESSED},
                                      nesting=nesting,
                                      description=u'Завершить задание и остатсья в городе цели',
                                      require=[requirements.LocatedIn(object=hero.uid, place=receiver_position.uid)],
                                      actions=[actions.GiveReward(object=hero.uid, type='open_up_finish')])

        open_up_lying = facts.Finish(uid=ns+'open_up_lying',
                                     start=start.uid,
                                     results={initiator.uid: RESULTS.FAILED,
                                              receiver.uid: RESULTS.SUCCESSED},
                                     nesting=nesting,
                                     description=u'Вернуться к заказчику и сообщить ложную информацию',
                                     require=[requirements.LocatedIn(object=hero.uid, place=initiator_position.uid)],
                                     actions=[actions.GiveReward(object=hero.uid, type='open_up_lying', scale=1.5)])

        start_spying__spying_middle = facts.Option(state_from=start_spying.uid, state_to=spying_middle.uid, type='spy',
                                                   markers=[relations.OPTION_MARKERS.HONORABLE], start_actions=[actions.Message(type='start_spying'),])
        start_spying__spying_middle__blackmail = facts.Option(state_from=start_spying.uid,
                                                              state_to=spying_middle.uid,
                                                              type='blackmail',
                                                              markers=[relations.OPTION_MARKERS.DISHONORABLE],
                                                              start_actions=[actions.Message(type='start_spying'),])
        start_spying__open_up = facts.Option(state_from=start_spying.uid, state_to=open_up.uid, type='open_up',
                                             markers=[relations.OPTION_MARKERS.DISHONORABLE], start_actions=[actions.Message(type='start_open_up'),])

        spying_middle__continue_spying = facts.Option(state_from=spying_middle.uid, state_to=continue_spying.uid, type='spy',
                                                      markers=[relations.OPTION_MARKERS.HONORABLE])
        spying_middle__continue_spying__blackmail = facts.Option(state_from=spying_middle.uid, state_to=continue_spying.uid, type='blackmail',
                                                                 markers=[relations.OPTION_MARKERS.DISHONORABLE])
        spying_middle__open_up = facts.Option(state_from=spying_middle.uid, state_to=open_up.uid, type='open_up',
                                              markers=[relations.OPTION_MARKERS.DISHONORABLE], start_actions=[actions.Message(type='start_open_up'),])

        finish_spying__report_data = facts.Option(state_from=finish_spying_choice.uid,
                                                  state_to=report_data.uid,
                                                  type='spy',
                                                  markers=[relations.OPTION_MARKERS.HONORABLE],
                                                  start_actions=[actions.Message(type='go_report_data')])
        finish_spying__blackmail = facts.Option(state_from=finish_spying_choice.uid,
                                                state_to=blackmail_finish.uid,
                                                type='blackmail',
                                                markers=[relations.OPTION_MARKERS.DISHONORABLE],
                                                start_actions=[actions.Message(type='go_blackmail')])


        line = [ start,
                  start_spying,
                  spying_middle,
                  success_spying,
                  continue_spying,
                  open_up,
                  report_data,
                  open_up_finish,
                  open_up_lying,
                  witness,
                  witness_fight,
                  witness_failed,
                  finish_spying_choice,
                  blackmail_finish,

                  facts.Jump(state_from=start.uid, state_to=start_spying.uid),

                  facts.Jump(state_from=continue_spying.uid, state_to=success_spying.uid),
                  facts.Jump(state_from=continue_spying.uid, state_to=witness.uid),

                  start_spying__spying_middle,
                  start_spying__spying_middle__blackmail,
                  start_spying__open_up,

                  spying_middle__continue_spying,
                  spying_middle__continue_spying__blackmail,
                  spying_middle__open_up,

                  finish_spying__report_data,
                  finish_spying__blackmail,

                  facts.Jump(state_from=success_spying.uid, state_to=finish_spying_choice.uid),

                  facts.Jump(state_from=witness.uid, state_to=witness_fight.uid),

                  facts.Jump(state_from=open_up.uid, state_to=open_up_finish.uid),
                  facts.Jump(state_from=open_up.uid, state_to=open_up_lying.uid, start_actions=[actions.Message(type='move_to_report_lie'),]),

                  facts.OptionsLink(options=(start_spying__spying_middle.uid,
                                             spying_middle__continue_spying.uid,
                                             finish_spying__report_data.uid)),
                  facts.OptionsLink(options=(start_spying__spying_middle__blackmail.uid,
                                             spying_middle__continue_spying__blackmail.uid,
                                             finish_spying__blackmail.uid)),

                  facts.Answer(state_from=witness_fight.uid, state_to=finish_spying_choice.uid, condition=True),
                  facts.Answer(state_from=witness_fight.uid, state_to=witness_failed.uid, condition=False),

                  facts.Event(uid=ns+'open_up_variants', description=u'Варианты окончания раскрытия', members=(open_up_finish.uid, open_up_lying.uid)),
                  facts.Event(uid=ns+'spying_variants', description=u'Варианты событий при шпионаже', members=(success_spying.uid, witness.uid)),
                ]

        line.extend(participants)

        return line
Exemple #11
0
    def construct(cls, nesting, selector, initiator, initiator_position,
                  receiver, receiver_position):

        hero = selector.heroes()[0]

        ns = selector._kb.get_next_ns()

        start = facts.Start(uid=ns + 'start',
                            type=cls.TYPE,
                            nesting=nesting,
                            description=u'Начало: посетить святой город',
                            require=[
                                requirements.LocatedIn(
                                    object=hero.uid,
                                    place=initiator_position.uid)
                            ],
                            actions=[actions.Message(type='intro')])

        participants = [
            facts.QuestParticipant(start=start.uid,
                                   participant=receiver_position.uid,
                                   role=ROLES.RECEIVER_POSITION)
        ]

        arriving = facts.State(uid=ns + 'arriving',
                               description=u'Прибытие в город',
                               require=[
                                   requirements.LocatedIn(
                                       object=hero.uid,
                                       place=receiver_position.uid)
                               ])

        action_choices = [
            facts.State(uid=ns + 'speak_with_guru',
                        description=u'поговорить с гуру',
                        actions=[
                            actions.Message(type='speak_with_guru'),
                            actions.DoNothing(type='speak_with_guru')
                        ]),
            facts.State(uid=ns + 'stagger_holy_streets',
                        description=u'пошататься по улицам',
                        actions=[
                            actions.Message(type='stagger_holy_streets'),
                            actions.DoNothing(type='stagger_holy_streets')
                        ])
        ]

        holy_actions = random.sample(action_choices, 1)

        finish = facts.Finish(
            uid=ns + 'finish',
            start=start.uid,
            results={receiver_position.uid: RESULTS.SUCCESSED},
            nesting=nesting,
            description=u'завершить посещение города',
            actions=[actions.GiveReward(object=hero.uid, type='finish')])

        line = [
            start,
            facts.Jump(state_from=start.uid, state_to=arriving.uid), arriving,
            facts.Jump(state_from=arriving.uid, state_to=holy_actions[0].uid),
            facts.Jump(state_from=holy_actions[0].uid, state_to=finish.uid),
            finish
        ]

        line.extend(holy_actions)
        line.extend(participants)

        return line