def test_multiple_tagged_jump(self):
        facts_list = [
            facts.Start(uid='start', type='test', nesting=0),
            facts.Event(uid='event_tag',
                        members=('st_finish_1', 'st_finish_2'))
        ]
        finishes = [
            facts.Finish(uid='st_finish_1',
                         results={},
                         nesting=0,
                         start='start'),
            facts.Finish(uid='st_finish_2',
                         results={},
                         nesting=0,
                         start='start'),
        ]
        self.kb += facts_list
        self.kb += finishes

        transformators.activate_events(self.kb)

        self.check_in_knowledge_base(self.kb, facts_list)
        self.assertTrue(
            ('st_finish_1' in self.kb and 'st_finish_2' not in self.kb)
            or ('st_finish_2' in self.kb and 'st_finish_1' not in self.kb))
 def test_simple_tagged_jump(self):
     facts_list = [
         facts.Start(uid='start', type='test', nesting=0),
         facts.Finish(uid='st_finish', results={}, nesting=0,
                      start='start'),
         facts.Jump(state_from='start', state_to='st_finish'),
         facts.Event(uid='event_tag', members=('st_finish', ))
     ]
     self.kb += facts_list
     transformators.activate_events(self.kb)
     self.check_in_knowledge_base(self.kb, facts_list)
 def test_no_tag(self):
     facts_list = [
         facts.Start(uid='start', type='test', nesting=0),
         facts.Finish(uid='st_finish', results={}, nesting=0,
                      start='start'),
         facts.Jump(state_from='start', state_to='st_finish'),
         facts.Event(uid='event_tag', members=())
     ]
     self.kb += facts_list
     self.assertRaises(exceptions.NoEventMembersError,
                       transformators.activate_events, self.kb)
     self.check_in_knowledge_base(self.kb, facts_list)
示例#4
0
    def construct(cls, nesting, selector, initiator, initiator_position, receiver, receiver_position):

        ns = selector._kb.get_next_ns()

        start = facts.Start(uid=ns+'start',
                            type=cls.TYPE,
                            nesting=nesting,
                            description=u'Начало: самый простой квест')

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

        finish_successed = facts.Finish(uid=ns+'finish_successed',
                                        start=start.uid,
                                        results={initiator.uid: RESULTS.SUCCESSED,
                                                 initiator_position.uid: RESULTS.SUCCESSED,
                                                 receiver.uid: RESULTS.SUCCESSED,
                                                 receiver_position.uid: RESULTS.SUCCESSED},
                                        nesting=nesting,
                                        description=u'завершить задание удачно')

        finish_failed = facts.Finish(uid=ns+'finish_failed',
                                     start=start.uid,
                                     results={initiator.uid: RESULTS.FAILED,
                                              initiator_position.uid: RESULTS.FAILED,
                                              receiver.uid: RESULTS.FAILED,
                                              receiver_position.uid: RESULTS.FAILED},
                                     nesting=nesting,
                                     description=u'завершить задание плохо')

        event = facts.Event(uid=ns+'event', members=(finish_successed.uid, finish_failed.uid))

        line = [ start,
                 finish_successed,
                 finish_failed,
                 event,
                 facts.Jump(state_from=start.uid, state_to=finish_successed.uid),
                 facts.Jump(state_from=start.uid, state_to=finish_failed.uid) ]

        line.extend(participants)

        return line
示例#5
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],
                restrict_social_connections=(
                    (initiator.uid, relations.SOCIAL_RELATIONS.PARTNER),
                    (receiver.uid, relations.SOCIAL_RELATIONS.PARTNER)),
                social_connections=((initiator.uid,
                                     relations.SOCIAL_RELATIONS.CONCURRENT),
                                    (receiver.uid,
                                     relations.SOCIAL_RELATIONS.CONCURRENT)))
            antagonist_marker = facts.ProfessionMarker(
                person=antagonist.uid, profession=antagonist.profession)
        except exceptions.NoFactSelectedError:
            antagonist = selector.new_person(
                restrict_social_connections=(
                    (initiator.uid, relations.SOCIAL_RELATIONS.PARTNER),
                    (receiver.uid, relations.SOCIAL_RELATIONS.PARTNER)),
                social_connections=((initiator.uid,
                                     relations.SOCIAL_RELATIONS.CONCURRENT),
                                    (receiver.uid,
                                     relations.SOCIAL_RELATIONS.CONCURRENT)))

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

        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=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='Решение: доставить или украсть')

        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='Доставить посылку получателю',
            require=[
                requirements.LocatedIn(object=hero.uid,
                                       place=receiver_position.uid)
            ],
            actions=[
                actions.GiveReward(object=hero.uid, type='finish_delivery')
            ])

        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='Подделать письмо',
            require=[
                requirements.LocatedIn(object=hero.uid,
                                       place=receiver_position.uid)
            ],
            actions=[
                actions.GiveReward(object=hero.uid,
                                   type='finish_fake_delivery',
                                   scale=2.0)
            ])

        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=
            'заглушка, чтобы можно было управлять появлением подделки письма')

        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='Доставить посылку скупщику',
                                    require=[
                                        requirements.LocatedIn(
                                            object=hero.uid,
                                            place=antagonist_position.uid)
                                    ],
                                    actions=[
                                        actions.GiveReward(object=hero.uid,
                                                           type='finish_steal',
                                                           scale=1.5)
                                    ])

        delivery_stealed = facts.State(
            uid=ns + 'delivery_stealed',
            description='письмо украдено',
            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='Сразиться с вором',
            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='Герой не смог вернуть украденное письмо',
            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='Доставить посылку получателю',
            require=[
                requirements.LocatedIn(object=hero.uid,
                                       place=receiver_position.uid)
            ],
            actions=[
                actions.GiveReward(object=hero.uid, type='finish_delivery')
            ])

        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='Варианты доставки',
                        members=(delivery_stealed.uid, finish_delivery.uid)),
            facts.Event(uid=ns + 'lie_variants',
                        description='Варианты обмана',
                        members=(fake_delivery_dummy_state.uid,
                                 finish_fake_delivery.uid))
        ]

        line.extend(participants)

        if antagonist_marker:
            line.append(antagonist_marker)

        return line
示例#6
0
文件: spying.py 项目: mm3/questgen
    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'),
                actions.GivePower(object=initiator.uid, power=1),
                actions.GivePower(object=receiver.uid, power=-1)
            ])

        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),
                actions.GivePower(object=receiver.uid, power=-1)
            ])

        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'),
                actions.GivePower(object=initiator.uid, power=-1),
                actions.GivePower(object=receiver.uid, power=1)
            ])

        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),
                actions.GivePower(object=initiator.uid, power=-1.5),
                actions.GivePower(object=receiver.uid, power=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
            ),  #, start_actions=[actions.Message(type='move_to_report_data'),]),
            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