maduck/GoWDiscordTeamBot

View on GitHub
data_source/pet.py

Summary

Maintainability
A
2 hrs
Test Coverage
from data_source.base_game_data import BaseGameData, BaseGameDataContainer
from util import convert_color_array

EFFECT_TRANSLATIONS = (
    '[PETTYPE_BUFFTEAMCOLOR]',
    '[PETTYPE_BUFFGEMMASTERY]',
    '[PETTYPE_BUFFTEAMKINGDOM]',
    '[PETTYPE_BUFFTEAMTROOPTYPE]',
    '[PETTYPE_LOOTSOULS]',
    '[PETTYPE_LOOTGOLD]',
    '[PETTYPE_LOOTXP]',
    '[PETTYPE_NOEFFECT]',
    '[PETTYPE_BONUSGNOMECHANCE]',
    '[PETTYPE_BONUSMAPTURNS]',
    '[PETTYPE_BUFFSINGLETROOP]',
)


class Pet(BaseGameData):
    def set_effect_data(self, value):
        self.data['effect_data'] = value


class PetContainer(BaseGameDataContainer):
    DATA_CLASS = Pet
    LOOKUP_KEYS = ['name', 'kingdom_name']
    EFFECT_BONUS = {}
    user_data = {}
    world_data = {}

    def __init__(self, data, user_data, world_data):
        super().__init__()
        self.user_data = user_data
        self.world_data = world_data
        self.data = {
            'id': data['Id'],
            'name': data['Name'],
            'colors': convert_color_array(data),
            'color_code': ''.join(convert_color_array(data)),
            'effect': EFFECT_TRANSLATIONS[data.get('Effect', 0)],
            'effect_data': data.get('EffectData'),
            'effect_title': '[BONUS]',
            'troop_type': data.get('EffectTroopType'),
            'reference_name': data['ReferenceName'],
            'filename': data['FileBase'],
            'kingdom_id': data['KingdomId'],
            'kingdom_name': f'[{data["KingdomId"]}_NAME]',
            'kingdom_title': '[KINGDOM]',
            'region_title': '[REGION_BONUS]',
            'region_sentence': '[PVP_BONUS_REGION_N]',
            'region_id': data.get('RegionId'),
            'region_name': f'[PVP_REGION_{data.get("RegionId")}]' if data.get('RegionId') else '',
        }
        self.populate_effect_data()
        self.translate()

    def populate_effect_data(self):
        effect = self.data['effect']

        if not self.EFFECT_BONUS:
            self.get_effect_bonuses()
        effect_levels = self.EFFECT_BONUS.get(effect, [])

        if effect == '[PETTYPE_BUFFTEAMCOLOR]':
            self.data['effect_data'] = None
            self.data['effect'] = '[PET_TEAM_BONUS]'
            self.data['effect_replacement'] = {
                '%1': '/'.join([f'`{b}`' for b in effect_levels]),
                '%2': f'[{self.data["color_code"].upper()}]',
            }
        elif effect == '[PETTYPE_BUFFGEMMASTERY]':
            self.data['effect_data'] = None
            self.data['effect'] = '[PET_MASTERY_BONUS]'
            self.data['effect_replacement'] = {
                '%1': '/'.join([f'`{b}`' for b in effect_levels]),
                '%2': f'[{self.data["color_code"].upper()}]',
            }
        elif effect == '[PETTYPE_BUFFTEAMKINGDOM]':
            self.data['effect'] = '[PET_TEAM_BONUS]'
            self.data['effect_replacement'] = {
                '%1': '/'.join([f'`{b}`' for b in effect_levels]),
                '%2': f'[{self.data["effect_data"]}_NAME]',
            }
            self.data['effect_data'] = None
        elif effect == '[PETTYPE_BUFFTEAMTROOPTYPE]':
            troop_type = self.data['troop_type'].upper()
            self.data['effect'] = '[PET_TEAM_BONUS]'
            self.data['effect_replacement'] = {
                '%1': '/'.join([f'`{b}`' for b in effect_levels]),
                '%2': f'[TROOPTYPE_{troop_type}]',
            }
            self.data['effect_data'] = None
        elif effect == '[PETTYPE_LOOTGOLD]':
            self.data['effect'] = '[PET_LOOT_BONUS]'
            self.data['effect_replacement'] = {
                '%1': '/'.join([f'`{b}`' for b in effect_levels]),
                '%2': '[GOLD]',
            }
        elif effect == '[PETTYPE_LOOTSOULS]':
            self.data['effect'] = '[PET_LOOT_BONUS]'
            self.data['effect_replacement'] = {
                '%1': '/'.join([f'`{b}`' for b in effect_levels]),
                '%2': '[SOULS]',
            }
        elif effect == '[PETTYPE_LOOTXP]':
            self.data['effect'] = '[PET_LOOT_BONUS]'
            self.data['effect_replacement'] = {
                '%1': '/'.join([f'`{b}`' for b in effect_levels]),
                '%2': '[XP]',
            }
        elif effect == '[PETTYPE_BONUSGNOMECHANCE]':
            self.data['effect'] = '[PET_GNOME_BONUS]'
            self.data['effect_replacement'] = {
                '%1': '/'.join([f'`{100 * b}`' for b in effect_levels]),
            }
        elif effect == '[PETTYPE_BONUSMAPTURNS]':
            self.data['effect'] = '[PET_MAPTURNS_BONUS]'
            self.data['effect_replacement'] = {
                '%1': '/'.join([f'`{b}`' for b in effect_levels]),
            }
        elif effect == '[PETTYPE_NOEFFECT]':
            self.data['effect'] = '[PET_NO_BONUS]'
            self.data['effect_data'] = '[PET_BONUS_DESCRIPTION_EVENT]'
        elif effect == '[PETTYPE_BUFFSINGLETROOP]':
            troop = self.world_data.get(self.data['effect_data'], {}).get('name')
            self.data['effect'] = '[PET_SINGLE_TROOP_BONUS_DESC]'
            self.data['effect_replacement'] = {
                '%1': '',
                '%2': troop,
            }
            self.data['effect_data'] = ''

    def get_effect_bonuses(self):
        for bonus in self.user_data['pEconomyModel']['PetEffects']:
            bonus_name = f'[PETTYPE_{bonus["EffectName"].upper()}]'
            self.EFFECT_BONUS[bonus_name] = bonus['Bonuses']

    def translate(self):
        super().translate()
        for translation in self.translations.values():
            if 'effect_replacement' in translation:
                for before, after in translation.data['effect_replacement'].items():
                    if after is None:
                        after = ''
                    translation.data['effect'] = translation.data['effect'].replace(before, after)

    def fill_untranslated_kingdom_name(self, kingdom_id, kingdom_reference_name):
        super().fill_untranslated_kingdom_name(kingdom_id, kingdom_reference_name)
        if self.data['effect'] == '[PETTYPE_BUFFTEAMKINGDOM]' \
                and self.is_untranslated(self.translations['en'].effect_data) \
                and str(kingdom_id) in self.translations['en'].effect_data:
            for pet in self.translations.values():
                pet.set_effect_data(kingdom_reference_name)

    def __repr__(self):
        return f'<{self.data["filename"]} id={self.data["id"]} name={self.data["reference_name"]!r} ' \
               f'kingdom_id={self.data["kingdom_id"]}>'