Beispiel #1
0
    def test_outer_circle(self):
        impacts = list(
            logic.tt_power_impacts(person_inner_circle=False,
                                   place_inner_circle=False,
                                   actor_type=self.actor_type,
                                   actor_id=self.actor_id,
                                   person=self.person,
                                   amount=self.amount,
                                   fame=self.fame))

        self.assertCountEqual(impacts, [
            tt_api_impacts.PowerImpact(
                type=tt_api_impacts.IMPACT_TYPE.OUTER_CIRCLE,
                actor_type=self.actor_type,
                actor_id=self.actor_id,
                target_type=tt_api_impacts.OBJECT_TYPE.PERSON,
                target_id=self.person.id,
                amount=self.expected_power),
            tt_api_impacts.PowerImpact(
                type=tt_api_impacts.IMPACT_TYPE.OUTER_CIRCLE,
                actor_type=self.actor_type,
                actor_id=self.actor_id,
                target_type=tt_api_impacts.OBJECT_TYPE.PLACE,
                target_id=self.person.place.id,
                amount=self.expected_power),
            tt_api_impacts.PowerImpact(
                type=tt_api_impacts.IMPACT_TYPE.FAME,
                actor_type=self.actor_type,
                actor_id=self.actor_id,
                target_type=tt_api_impacts.OBJECT_TYPE.PLACE,
                target_id=self.person.place.id,
                amount=self.fame * self.person.attrs.places_help_amount)
        ])
Beispiel #2
0
    def test_inner_circle(self):
        impacts = list(logic.tt_power_impacts(inner_circle=True,
                                              actor_type=self.actor_type,
                                              actor_id=self.actor_id,
                                              place=self.place_1,
                                              amount=self.amount,
                                              fame=self.fame))

        self.assertCountEqual(impacts,
                              [tt_api_impacts.PowerImpact(type=tt_api_impacts.IMPACT_TYPE.INNER_CIRCLE,
                                                          actor_type=self.actor_type,
                                                          actor_id=self.actor_id,
                                                          target_type=tt_api_impacts.OBJECT_TYPE.PLACE,
                                                          target_id=self.place_1.id,
                                                          amount=self.expected_power),
                              tt_api_impacts.PowerImpact(type=tt_api_impacts.IMPACT_TYPE.JOB,
                                                          actor_type=self.actor_type,
                                                          actor_id=self.actor_id,
                                                          target_type=tt_api_impacts.OBJECT_TYPE.JOB_PLACE_POSITIVE,
                                                          target_id=self.place_1.id,
                                                          amount=self.expected_power),
                              tt_api_impacts.PowerImpact(type=tt_api_impacts.IMPACT_TYPE.FAME,
                                                          actor_type=self.actor_type,
                                                          actor_id=self.actor_id,
                                                          target_type=tt_api_impacts.OBJECT_TYPE.PLACE,
                                                          target_id=self.place_1.id,
                                                          amount=self.fame)])
Beispiel #3
0
def update_job(job, actor_id):

    power = job.load_power(actor_id)

    if not job.is_completed(power):
        return ()

    inner_circle = job.load_inner_circle(actor_id)

    job_effect = job.get_apply_effect_method(power)

    effect_kwargs = {
        'actor_type': 'place',
        'actor_name': job.get_project_name(actor_id),
        'positive_heroes': inner_circle.positive_heroes,
        'negative_heroes': inner_circle.negative_heroes,
        'job_power': job.get_job_power(actor_id)
    }

    effect_kwargs.update(job.get_objects(actor_id))

    after_update_operations = job_effect(**effect_kwargs)

    effects_priorities = dict(job.get_effects_priorities(actor_id))

    if job.effect in effects_priorities:
        del effects_priorities[job.effect]

    new_effect = utils_logic.random_value_by_priority(
        effects_priorities.items())

    if power.positive > power.negative:
        impact = tt_api_impacts.PowerImpact(
            type=tt_api_impacts.IMPACT_TYPE.JOB,
            actor_type=job.ACTOR_TYPE,
            actor_id=actor_id,
            target_type=job.POSITIVE_TARGET_TYPE,
            target_id=actor_id,
            amount=-power.positive)
    else:
        impact = tt_api_impacts.PowerImpact(
            type=tt_api_impacts.IMPACT_TYPE.JOB,
            actor_type=job.ACTOR_TYPE,
            actor_id=actor_id,
            target_type=job.NEGATIVE_TARGET_TYPE,
            target_id=actor_id,
            amount=-power.negative)

    politic_power_logic.add_power_impacts([impact])

    job.name = create_name(job.ACTOR, new_effect)
    job.created_at_turn = turn.number()
    job.effect = new_effect
    job.power_required = job.NORMAL_POWER * new_effect.power_modifier

    return after_update_operations
Beispiel #4
0
    def test_has_building(self):
        places_logic.create_building(
            self.person, utg_name=names.generator().get_test_name())

        impacts = list(
            logic.tt_power_impacts(person_inner_circle=True,
                                   place_inner_circle=True,
                                   actor_type=self.actor_type,
                                   actor_id=self.actor_id,
                                   person=self.person,
                                   amount=self.amount,
                                   fame=self.fame))

        multiplier = (1 + c.BUILDING_PERSON_POWER_BONUS * 0.75)

        expected_power = round(self.person.place.attrs.freedom * self.amount *
                               multiplier)

        self.assertCountEqual(impacts, [
            tt_api_impacts.PowerImpact(
                type=tt_api_impacts.IMPACT_TYPE.INNER_CIRCLE,
                actor_type=self.actor_type,
                actor_id=self.actor_id,
                target_type=tt_api_impacts.OBJECT_TYPE.PERSON,
                target_id=self.person.id,
                amount=expected_power),
            tt_api_impacts.PowerImpact(
                type=tt_api_impacts.IMPACT_TYPE.JOB,
                actor_type=self.actor_type,
                actor_id=self.actor_id,
                target_type=tt_api_impacts.OBJECT_TYPE.JOB_PERSON_POSITIVE,
                target_id=self.person.id,
                amount=expected_power),
            tt_api_impacts.PowerImpact(
                type=tt_api_impacts.IMPACT_TYPE.JOB,
                actor_type=self.actor_type,
                actor_id=self.actor_id,
                target_type=tt_api_impacts.OBJECT_TYPE.JOB_PLACE_POSITIVE,
                target_id=self.person.place.id,
                amount=expected_power),
            tt_api_impacts.PowerImpact(
                type=tt_api_impacts.IMPACT_TYPE.INNER_CIRCLE,
                actor_type=self.actor_type,
                actor_id=self.actor_id,
                target_type=tt_api_impacts.OBJECT_TYPE.PLACE,
                target_id=self.person.place.id,
                amount=expected_power),
            tt_api_impacts.PowerImpact(
                type=tt_api_impacts.IMPACT_TYPE.FAME,
                actor_type=self.actor_type,
                actor_id=self.actor_id,
                target_type=tt_api_impacts.OBJECT_TYPE.PLACE,
                target_id=self.person.place.id,
                amount=self.fame * self.person.attrs.places_help_amount)
        ])
Beispiel #5
0
    def setUp(self):
        super().setUp()

        tt_api_impacts.debug_clear_service()

        impacts = []

        self.hero_id = 111
        self.person_id = 666
        self.place_id = 777

        impacts = [
            tt_api_impacts.PowerImpact(
                type=tt_api_impacts.IMPACT_TYPE.JOB,
                actor_type=tt_api_impacts.OBJECT_TYPE.HERO,
                actor_id=self.hero_id,
                target_type=tt_api_impacts.OBJECT_TYPE.JOB_PERSON_POSITIVE,
                target_id=self.person_id,
                amount=1000),
            tt_api_impacts.PowerImpact(
                type=tt_api_impacts.IMPACT_TYPE.JOB,
                actor_type=tt_api_impacts.OBJECT_TYPE.HERO,
                actor_id=self.hero_id,
                target_type=tt_api_impacts.OBJECT_TYPE.JOB_PERSON_NEGATIVE,
                target_id=self.person_id,
                amount=2000),
            tt_api_impacts.PowerImpact(
                type=tt_api_impacts.IMPACT_TYPE.JOB,
                actor_type=tt_api_impacts.OBJECT_TYPE.HERO,
                actor_id=self.hero_id,
                target_type=tt_api_impacts.OBJECT_TYPE.JOB_PLACE_POSITIVE,
                target_id=self.place_id,
                amount=3000),
            tt_api_impacts.PowerImpact(
                type=tt_api_impacts.IMPACT_TYPE.JOB,
                actor_type=tt_api_impacts.OBJECT_TYPE.HERO,
                actor_id=self.hero_id,
                target_type=tt_api_impacts.OBJECT_TYPE.JOB_PLACE_NEGATIVE,
                target_id=self.place_id,
                amount=4000)
        ]

        foreign_impacts = copy.deepcopy(impacts)
        for impact in foreign_impacts:
            impact.target_id += 1
            impact.amount = random.randint(1, 10000)

        logic.add_power_impacts(impacts)
        logic.add_power_impacts(foreign_impacts)
Beispiel #6
0
def tt_power_impacts(person_inner_circle, place_inner_circle, actor_type, actor_id, person, amount, fame):
    power_multiplier = 1

    if person.has_building:
        power_multiplier += c.BUILDING_PERSON_POWER_BONUS * person.building.logical_integrity

    # this power will go to person and to place
    place_power = amount * power_multiplier

    # this power, only to person
    person_power = round(amount * power_multiplier * person.place.attrs.freedom)

    impact_type = tt_api_impacts.IMPACT_TYPE.OUTER_CIRCLE

    if person_inner_circle:
        impact_type = tt_api_impacts.IMPACT_TYPE.INNER_CIRCLE

    yield tt_api_impacts.PowerImpact(type=impact_type,
                                     actor_type=actor_type,
                                     actor_id=actor_id,
                                     target_type=tt_api_impacts.OBJECT_TYPE.PERSON,
                                     target_id=person.id,
                                     amount=person_power)

    yield from places_logic.tt_power_impacts(inner_circle=place_inner_circle,
                                             actor_type=actor_type,
                                             actor_id=actor_id,
                                             place=person.place,
                                             amount=place_power,
                                             fame=fame * person.attrs.places_help_amount)

    if not person_inner_circle:
        return

    target_type = tt_api_impacts.OBJECT_TYPE.JOB_PERSON_POSITIVE

    if amount < 0:
        target_type = tt_api_impacts.OBJECT_TYPE.JOB_PERSON_NEGATIVE

    yield tt_api_impacts.PowerImpact(type=tt_api_impacts.IMPACT_TYPE.JOB,
                                     actor_type=actor_type,
                                     actor_id=actor_id,
                                     target_type=target_type,
                                     target_id=person.id,
                                     amount=abs(person_power))
Beispiel #7
0
    def give_power(self, impacts):
        impacts_to_apply = []

        for hero_id, impact in impacts:
            if impact > 0:
                impacts_to_apply.append(tt_api_impacts.PowerImpact(type=tt_api_impacts.IMPACT_TYPE.JOB,
                                                                   actor_type=tt_api_impacts.OBJECT_TYPE.HERO,
                                                                   actor_id=hero_id,
                                                                   target_type=self.job.POSITIVE_TARGET_TYPE,
                                                                   target_id=self.place_1.id,
                                                                   amount=impact))
            else:
                impacts_to_apply.append(tt_api_impacts.PowerImpact(type=tt_api_impacts.IMPACT_TYPE.JOB,
                                                                   actor_type=tt_api_impacts.OBJECT_TYPE.HERO,
                                                                   actor_id=hero_id,
                                                                   target_type=self.job.NEGATIVE_TARGET_TYPE,
                                                                   target_id=self.place_1.id,
                                                                   amount=-impact))

        politic_power_logic.add_power_impacts(impacts_to_apply)
Beispiel #8
0
    def test_amount_below_zero(self):
        impacts = list(
            logic.tt_power_impacts(person_inner_circle=True,
                                   place_inner_circle=True,
                                   actor_type=self.actor_type,
                                   actor_id=self.actor_id,
                                   person=self.person,
                                   amount=-self.amount,
                                   fame=0))

        self.assertCountEqual(impacts, [
            tt_api_impacts.PowerImpact(
                type=tt_api_impacts.IMPACT_TYPE.INNER_CIRCLE,
                actor_type=self.actor_type,
                actor_id=self.actor_id,
                target_type=tt_api_impacts.OBJECT_TYPE.PERSON,
                target_id=self.person.id,
                amount=-self.expected_power),
            tt_api_impacts.PowerImpact(
                type=tt_api_impacts.IMPACT_TYPE.JOB,
                actor_type=self.actor_type,
                actor_id=self.actor_id,
                target_type=tt_api_impacts.OBJECT_TYPE.JOB_PERSON_NEGATIVE,
                target_id=self.person.id,
                amount=abs(self.expected_power)),
            tt_api_impacts.PowerImpact(
                type=tt_api_impacts.IMPACT_TYPE.JOB,
                actor_type=self.actor_type,
                actor_id=self.actor_id,
                target_type=tt_api_impacts.OBJECT_TYPE.JOB_PLACE_NEGATIVE,
                target_id=self.person.place.id,
                amount=abs(self.expected_power)),
            tt_api_impacts.PowerImpact(
                type=tt_api_impacts.IMPACT_TYPE.INNER_CIRCLE,
                actor_type=self.actor_type,
                actor_id=self.actor_id,
                target_type=tt_api_impacts.OBJECT_TYPE.PLACE,
                target_id=self.person.place.id,
                amount=-self.expected_power)
        ])
Beispiel #9
0
    def prepair_filter_data(self):

        impacts = []

        for impact_type in (tt_api_impacts.IMPACT_TYPE.INNER_CIRCLE, tt_api_impacts.IMPACT_TYPE.OUTER_CIRCLE):
            for account_id in (self.account_1_id, self.account_2_id):

                for person_id in (self.person_1.id, self.person_2.id):
                    impacts.append(tt_api_impacts.PowerImpact.hero_2_person(type=impact_type,
                                                                            hero_id=account_id,
                                                                            person_id=person_id,
                                                                            amount=random.randint(1000000, 10000000)))
                    impacts.append(tt_api_impacts.PowerImpact(type=impact_type,
                                                              actor_type=tt_api_impacts.OBJECT_TYPE.ACCOUNT,
                                                              actor_id=account_id,
                                                              target_type=tt_api_impacts.OBJECT_TYPE.PERSON,
                                                              target_id=person_id,
                                                              amount=random.randint(1000000, 10000000),
                                                              turn=None,
                                                              transaction=None))

                for place_id in (self.place_1.id, self.place_2.id):
                    impacts.append(tt_api_impacts.PowerImpact.hero_2_place(type=impact_type,
                                                                           hero_id=account_id,
                                                                           place_id=place_id,
                                                                           amount=random.randint(1000000, 10000000)))
                    impacts.append(tt_api_impacts.PowerImpact(type=impact_type,
                                                              actor_type=tt_api_impacts.OBJECT_TYPE.ACCOUNT,
                                                              actor_id=account_id,
                                                              target_type=tt_api_impacts.OBJECT_TYPE.PLACE,
                                                              target_id=place_id,
                                                              amount=random.randint(1000000, 10000000),
                                                              turn=None,
                                                              transaction=None))

        for impact in impacts:
            logic.add_power_impacts([impact])

        return impacts
Beispiel #10
0
def tt_power_impacts(inner_circle, actor_type, actor_id, place, amount, fame):
    amount = round(amount * place.attrs.freedom)

    impact_type = tt_api_impacts.IMPACT_TYPE.OUTER_CIRCLE

    if inner_circle:
        impact_type = tt_api_impacts.IMPACT_TYPE.INNER_CIRCLE

    yield tt_api_impacts.PowerImpact(
        type=impact_type,
        actor_type=actor_type,
        actor_id=actor_id,
        target_type=tt_api_impacts.OBJECT_TYPE.PLACE,
        target_id=place.id,
        amount=amount)

    if actor_type.is_HERO and 0 < fame:
        yield tt_api_impacts.PowerImpact(
            type=tt_api_impacts.IMPACT_TYPE.FAME,
            actor_type=actor_type,
            actor_id=actor_id,
            target_type=tt_api_impacts.OBJECT_TYPE.PLACE,
            target_id=place.id,
            amount=fame)

    if not inner_circle:
        return

    target_type = tt_api_impacts.OBJECT_TYPE.JOB_PLACE_POSITIVE

    if amount < 0:
        target_type = tt_api_impacts.OBJECT_TYPE.JOB_PLACE_NEGATIVE

    yield tt_api_impacts.PowerImpact(type=tt_api_impacts.IMPACT_TYPE.JOB,
                                     actor_type=actor_type,
                                     actor_id=actor_id,
                                     target_type=target_type,
                                     target_id=place.id,
                                     amount=abs(amount))
Beispiel #11
0
    def test_fame_only_for_hero(self):
        actor_type = tt_api_impacts.OBJECT_TYPE.random(exclude=(tt_api_impacts.OBJECT_TYPE.HERO,))

        impacts = list(logic.tt_power_impacts(inner_circle=True,
                                              actor_type=actor_type,
                                              actor_id=self.actor_id,
                                              place=self.place_1,
                                              amount=self.amount,
                                              fame=self.fame))

        self.assertCountEqual(impacts,
                              [tt_api_impacts.PowerImpact(type=tt_api_impacts.IMPACT_TYPE.INNER_CIRCLE,
                                                          actor_type=actor_type,
                                                          actor_id=self.actor_id,
                                                          target_type=tt_api_impacts.OBJECT_TYPE.PLACE,
                                                          target_id=self.place_1.id,
                                                          amount=self.expected_power),
                              tt_api_impacts.PowerImpact(type=tt_api_impacts.IMPACT_TYPE.JOB,
                                                          actor_type=actor_type,
                                                          actor_id=self.actor_id,
                                                          target_type=tt_api_impacts.OBJECT_TYPE.JOB_PLACE_POSITIVE,
                                                          target_id=self.place_1.id,
                                                          amount=self.expected_power)])
Beispiel #12
0
def add_fame(hero_id, fames):
    impacts = []

    for place_id, fame in fames:
        impacts.append(
            tt_api_impacts.PowerImpact(
                type=tt_api_impacts.IMPACT_TYPE.FAME,
                actor_type=tt_api_impacts.OBJECT_TYPE.HERO,
                actor_id=hero_id,
                target_type=tt_api_impacts.OBJECT_TYPE.PLACE,
                target_id=place_id,
                amount=fame))

    politic_power_logic.add_power_impacts(impacts)
Beispiel #13
0
    def test_apply_effects(self):
        hero_id = self.accounts_factory.create_account().id

        politic_power_logic.add_power_impacts([tt_api_impacts.PowerImpact(type=tt_api_impacts.IMPACT_TYPE.INNER_CIRCLE,
                                                                          actor_type=tt_api_impacts.OBJECT_TYPE.HERO,
                                                                          actor_id=hero_id,
                                                                          target_type=tt_api_impacts.OBJECT_TYPE.PLACE,
                                                                          target_id=self.place_1.id,
                                                                          amount=1)])

        self.give_power([(hero_id, self.job.power_required)])

        operations = logic.update_job(self.job, self.place_1.id)

        self.assertTrue(operations)

        for operation in operations:
            operation()