Exemple #1
0
def parse_equipment_sets(file_name):
    logging.debug('Parsing equipment sets...')

    ies_path = os.path.join(constants.PATH_PARSER_INPUT_IPF, 'ies.ipf', file_name)
    ies_file = open(ies_path, 'rb')
    ies_reader = csv.DictReader(ies_file, delimiter=',', quotechar='"')

    for row in ies_reader:
        obj = {}
        obj['$ID'] = int(row['ClassID'])
        obj['$ID_NAME'] = row['ClassName']
        obj['Name'] = parser_translations.translate(row['Name']) if 'Name' in row else None

        obj['Link_Items'] = []

        # Parse bonus
        obj['Bonus2'] = parser_translations.translate(row['EffectDesc_2']) if row['EffectDesc_2'] != '' else None
        obj['Bonus3'] = parser_translations.translate(row['EffectDesc_3']) if row['EffectDesc_3'] != '' else None
        obj['Bonus4'] = parser_translations.translate(row['EffectDesc_4']) if row['EffectDesc_4'] != '' else None
        obj['Bonus5'] = parser_translations.translate(row['EffectDesc_5']) if row['EffectDesc_5'] != '' else None
        obj['Bonus6'] = parser_translations.translate(row['EffectDesc_6']) if row['EffectDesc_6'] != '' else None
        obj['Bonus7'] = parser_translations.translate(row['EffectDesc_7']) if row['EffectDesc_7'] != '' else None

        globals.equipment_sets[obj['$ID']] = obj
        globals.equipment_sets_by_name[obj['$ID_NAME']] = obj
Exemple #2
0
def parse_gems_bonus():
    logging.debug('Parsing gems bonus...')

    xml_path = os.path.join(constants.PATH_PARSER_INPUT_IPF, 'xml.ipf',
                            'socket_property.xml')
    xml = ET.parse(xml_path).getroot()

    # example: <Item Name="gem_circle_1">
    for item in xml:
        gem = globals.gems_by_name[item.get('Name')]

        for level in item:
            if level.get('Level') == '0':
                continue

            for slot in ['TopLeg', 'Foot', 'Hand', 'Weapon', 'SubWeapon']:
                bonus = level.get('PropList_' + slot)
                penalty = level.get('PropList_' + slot + '_Penalty')

                for prop in [bonus, penalty]:
                    if prop is not None and prop != 'None':

                        if gem['TypeGem'] == GEM_TYPE.SKILL:
                            gem['Bonus' + parse_gems_slot(slot)].append({
                                'Stat':
                                parser_translations.translate(prop).replace(
                                    'OptDesc/', '')
                            })
                        elif gem['TypeGem'] == GEM_TYPE.STATS:
                            prop = prop.split('/')
                            prop[0] = 'ADD_DR' if prop[0] == 'DR' else prop[0]
                            prop[0] = 'ADD_DR' if prop[0] == 'DR' else prop[0]
                            prop[0] = 'ADD_HR' if prop[0] == 'HR' else prop[0]
                            prop[0] = 'ADD_MATK' if prop[
                                0] == 'MATK' else prop[0]
                            prop[0] = 'ADD_MDEF' if prop[
                                0] == 'MDEF' else prop[0]
                            prop[0] = 'ADD_PATK' if prop[
                                0] == 'PATK' else prop[0]
                            prop[
                                0] = 'ADD_DEF' if prop[0] == 'DEF' else prop[0]

                            gem['Bonus' + parse_gems_slot(slot)].append({
                                'Stat':
                                parser_items_equipment.parse_equipment_stat(
                                    prop[0]),
                                'Value':
                                int(prop[1])
                            })
def parse_books_dialog():
    logging.debug('Parsing books dialog...')

    ies_path = os.path.join(constants.PATH_PARSER_INPUT_IPF, 'ies_client.ipf', 'dialogtext.ies')
    ies_file = open(ies_path, 'rb')
    ies_reader = csv.DictReader(ies_file, delimiter=',', quotechar='"')

    for row in ies_reader:
        if row['ClassName'] not in globals.books_by_name:
            continue

        book = globals.books_by_name[row['ClassName']]
        book['Text'] = parser_translations.translate(row['Text'])

    ies_file.close()
Exemple #4
0
def parse_maps():
    logging.debug('Parsing maps...')

    ies_path = os.path.join(constants.PATH_PARSER_INPUT_IPF, 'ies.ipf',
                            'map.ies')
    ies_file = open(ies_path, 'rb')
    ies_reader = csv.DictReader(ies_file, delimiter=',', quotechar='"')

    for row in ies_reader:
        obj = {}
        obj['$ID'] = int(row['ClassID'])
        obj['$ID_NAME'] = row['ClassName']
        obj['Icon'] = ''
        obj['Name'] = parser_translations.translate(row['Name'])

        # TODO: parse remaining properties

        globals.maps[obj['$ID']] = obj
        globals.maps_by_name[obj['$ID_NAME']] = obj

    ies_file.close()
Exemple #5
0
def parse_items(file_name):
    logging.debug('Parsing %s...', file_name)

    ies_path = os.path.join(constants.PATH_PARSER_INPUT_IPF, "ies.ipf",
                            file_name)
    ies_file = open(ies_path, 'rb')
    ies_reader = csv.DictReader(ies_file, delimiter=',', quotechar='"')

    for row in ies_reader:
        item_type = ITEM_GROUP.RECIPE if file_name == 'recipe.ies' else ITEM_GROUP.value_of[
            row['GroupName'].upper()]
        item_type_equipment = parse_equipment_type_equipment(
            row['ClassType'].upper()) if 'ClassType' in row else None

        #logging.debug('Parsing item: %s :: %s', row['ClassID'], row['ClassName'])

        obj = {}
        obj['$ID'] = int(row['ClassID'])
        obj['$ID_NAME'] = row['ClassName']
        obj['Description'] = parser_translations.translate(
            row['Desc']) if 'Desc' in row else None
        obj['Icon'] = parser_assets.parse_entity_icon(row['Icon'])
        obj['Name'] = parser_translations.translate(
            row['Name']) if 'Name' in row else None

        obj['Price'] = row['SellPrice']
        obj['TimeCoolDown'] = float(int(row['ItemCoolDown']) /
                                    1000) if 'ItemCoolDown' in row else None
        obj['TimeLifeTime'] = float(int(
            row['LifeTime'])) if 'LifeTime' in row else None
        obj['Tradability'] = '%s%s%s%s' % (
            1 if row['MarketTrade'] == 'YES' else 0,  # Market
            1 if row['UserTrade'] == 'YES' else 0,  # Players
            1 if row['ShopTrade'] == 'YES' else 0,  # Shop
            1 if row['TeamTrade'] == 'YES' else 0,  # Team Storage
        )
        obj['Type'] = item_type
        obj['Weight'] = float(row['Weight']) if 'Weight' in row else None

        obj['Link_Collections'] = []
        obj['Link_Cubes'] = []
        obj['Link_MonsterDrops'] = []
        obj['Link_RecipeTarget'] = []
        obj['Link_RecipeMaterial'] = []

        if item_type == ITEM_GROUP.BOOK:
            globals.books[obj['$ID']] = obj
            globals.books_by_name[obj['$ID_NAME']] = obj
        elif item_type == ITEM_GROUP.CARD:
            globals.cards[obj['$ID']] = obj
            globals.cards_by_name[obj['$ID_NAME']] = obj
        elif item_type == ITEM_GROUP.COLLECTION:
            globals.collections[obj['$ID']] = obj
            globals.collections_by_name[obj['$ID_NAME']] = obj
        elif item_type == ITEM_GROUP.CUBE:
            globals.cubes[obj['$ID']] = obj
            globals.cubes_by_name[obj['$ID_NAME']] = obj
            globals.cubes_by_stringarg[row['StringArg']] = obj
        elif item_type == ITEM_GROUP.GEM:
            globals.gems[obj['$ID']] = obj
            globals.gems_by_name[obj['$ID_NAME']] = obj
        elif item_type == ITEM_GROUP.RECIPE:
            globals.recipes[obj['$ID']] = obj
            globals.recipes_by_name[obj['$ID_NAME']] = obj
        elif item_type in ITEM_GROUP_ITEM_WHITELIST and file_name != 'item_Equip.ies':
            globals.items[obj['$ID']] = obj
            globals.items_by_name[obj['$ID_NAME']] = obj
        elif item_type in ITEM_GROUP_FASHION_WHITELIST\
                or item_type_equipment in TYPE_EQUIPMENT_COSTUME_LIST or row['ClassType2'] == 'Premium':
            globals.equipment[obj['$ID']] = obj
            globals.equipment_by_name[obj['$ID_NAME']] = obj
        elif item_type in ITEM_GROUP_EQUIPMENT_WHITELIST and item_type_equipment is not None:
            globals.equipment[obj['$ID']] = obj
            globals.equipment_by_name[obj['$ID_NAME']] = obj

    ies_file.close()
Exemple #6
0
def parse_equipment():
    logging.debug('Parsing equipment...')

    ies_path = os.path.join(constants.PATH_PARSER_INPUT_IPF, 'ies.ipf',
                            'item_Equip.ies')
    ies_file = open(ies_path, 'rb')
    ies_reader = csv.DictReader(ies_file, delimiter=',', quotechar='"')

    for row in ies_reader:
        if int(row['ClassID']) not in globals.equipment:
            continue

        item_grade = equipment_grade_ratios[int(row['ItemGrade'])]
        obj = globals.equipment[int(row['ClassID'])]

        # Add additional fields
        obj['Bonus'] = []
        obj['Durability'] = int(row['MaxDur']) / 100
        obj['Durability'] = -1 if obj['Durability'] <= 0 else obj['Durability']
        obj['Grade'] = parse_equipment_grade(int(row['ItemGrade']))
        obj['Level'] = tosutil.tos_item_get_lv(row)
        obj['Material'] = parse_equipment_material(row['Material'].upper())
        obj['Potential'] = int(row['MaxPR'])
        obj['ReinforceRatio'] = int(row['ReinforceRatio']) / 100.0
        obj['RequiredClass'] = '%s%s%s%s' % (
            1 if any(j in row['UseJob']
                     for j in ['All', 'Char3']) else 0,  # Archer
            1 if any(j in row['UseJob']
                     for j in ['All', 'Char4']) else 0,  # Cleric
            1 if any(j in row['UseJob']
                     for j in ['All', 'Char1']) else 0,  # Swordsman
            1 if any(j in row['UseJob']
                     for j in ['All', 'Char2']) else 0,  # Wizard
        )
        obj['RequiredLevel'] = int(row['UseLv'])
        obj['Set'] = None
        obj['Sockets'] = int(row['BaseSocket'])
        obj['SocketsLimit'] = int(row['MaxSocket_COUNT'])
        obj['Stars'] = int(row['ItemStar'])
        obj['Stat_ATTACK_MAGICAL'] = int(
            tosutil.tos_item_get_basic_matk(row, item_grade))
        obj['Stat_ATTACK_PHYSICAL_MIN'] = int(
            tosutil.tos_item_get_basic_atk(row, item_grade)[0])
        obj['Stat_ATTACK_PHYSICAL_MAX'] = int(
            tosutil.tos_item_get_basic_atk(row, item_grade)[1])
        obj['Stat_DEFENSE_MAGICAL'] = int(
            tosutil.tos_item_get_basic_mdef(row, item_grade))
        obj['Stat_DEFENSE_PHYSICAL'] = int(
            tosutil.tos_item_get_basic_def(row, item_grade))
        obj['TypeAttack'] = parse_equipment_type_attack(
            row['AttackType'].upper())
        obj['TypeEquipment'] = parse_equipment_type_equipment(
            row['ClassType'].upper())
        obj['Unidentified'] = int(row['NeedAppraisal']) == 1
        obj['UnidentifiedRandom'] = int(row['NeedRandomOption']) == 1

        # HotFix: if it's a Rapier, use THRUST as the TypeAttack
        if obj['TypeEquipment'] == TYPE_EQUIPMENT.RAPIER:
            obj['TypeAttack'] = TYPE_ATTACK.THRUST

        # HotFix: in case it doesn't give physical nor magical defense (e.g. agny necklace)
        if 'ADD_FIRE' in row['BasicTooltipProp'].split(','):
            lv = tosutil.tos_item_get_lv(row)
            gradeRatio = (int(item_grade['BasicRatio']) / 100.0)

            row['ADD_FIRE'] = floor(lv * gradeRatio)

        # Bonus
        for stat in EQUIPMENT_STAT_COLUMNS:
            value = floor(float(row[stat]))

            if value != 0:
                obj['Bonus'].append([
                    parse_equipment_stat(stat),  # Stat
                    value  # Value
                ])

        # More Bonus
        if 'OptDesc' in row and len(row['OptDesc']) > 0:
            for bonus in parser_translations.translate(
                    row['OptDesc']).split('{nl}'):
                obj['Bonus'].append([
                    EQUIPMENT_STAT.UNKNOWN,  # Stat
                    bonus.replace('-', '').strip()  # Value
                ])
def parse_monsters(file_name):
    logging.debug('Parsing %s...', file_name)

    ies_path = os.path.join(constants.PATH_PARSER_INPUT_IPF, "ies.ipf", file_name)
    ies_file = open(ies_path, 'rb')
    ies_reader = csv.DictReader(ies_file, delimiter=',', quotechar='"')

    for row in ies_reader:
        if row['MonRank'].upper() not in MONSTER_RANK_WHITELIST:
            continue

        #logging.debug('Parsing monster: %s :: %s', row['ClassID'], row['ClassName'])

        level = tosutil.tos_mon_get_lv(row)
        stat_type = int(row['StatType'])

        monster_stat = statbase_monster[level] if level in statbase_monster else None
        monster_stat_type = statbase_monster_type[stat_type] if stat_type in statbase_monster_type else None

        obj = {}
        obj['$ID'] = int(row['ClassID'])
        obj['$ID_NAME'] = row['ClassName']
        obj['Description'] = parser_translations.translate(row['Desc'])
        obj['Icon'] = parser_assets.parse_entity_icon(row['Icon'])
        obj['Name'] = parser_translations.translate(row['Name'])

        obj['Armor'] = parse_equipment_material(row['ArmorMaterial'].upper())
        obj['Element'] = parse_monsters_element(row['Attribute'].upper())
        obj['Level'] = int(row['Level'])
        obj['Race'] = parse_monsters_race(row['RaceType'].upper())
        obj['Rank'] = MONSTER_RANK.value_of[row['MonRank'].upper()]
        obj['Size'] = MONSTER_SIZE.value_of[row['Size'].upper()]
        obj['EXP'] = int(tosutil.tos_mon_get_exp(row, monster_stat, monster_stat_type))
        obj['EXPClass'] = int(tosutil.tos_mon_get_jobexp(row, monster_stat, monster_stat_type))
        obj['Stat_CON'] = int(tosutil.tos_mon_get_stat(row, 'CON'))
        obj['Stat_DEX'] = int(tosutil.tos_mon_get_stat(row, 'DEX'))
        obj['Stat_INT'] = int(tosutil.tos_mon_get_stat(row, 'INT'))
        obj['Stat_SPR'] = int(tosutil.tos_mon_get_stat(row, 'SPR'))
        obj['Stat_STR'] = int(tosutil.tos_mon_get_stat(row, 'STR'))
        obj['Stat_HP'] = int(tosutil.tos_mon_get_mhp(row, monster_stat_type))
        obj['Stat_SP'] = int(tosutil.tos_mon_get_msp(row))
        obj['Stat_ATTACK_MAGICAL_MAX'] = int(tosutil.tos_mon_get_maxmatk(row, monster_stat_type))
        obj['Stat_ATTACK_MAGICAL_MIN'] = int(tosutil.tos_mon_get_minmatk(row, monster_stat_type))
        obj['Stat_ATTACK_PHYSICAL_MAX'] = int(tosutil.tos_mon_get_maxpatk(row, monster_stat_type))
        obj['Stat_ATTACK_PHYSICAL_MIN'] = int(tosutil.tos_mon_get_minpatk(row, monster_stat_type))
        obj['Stat_DEFENSE_MAGICAL'] = int(tosutil.tos_mon_get_mdef(row, monster_stat_type))
        obj['Stat_DEFENSE_PHYSICAL'] = int(tosutil.tos_mon_get_def(row, monster_stat_type))
        obj['Stat_Accuracy'] = int(tosutil.tos_mon_get_hr(row))
        obj['Stat_Evasion'] = int(tosutil.tos_mon_get_dr(row))
        obj['Stat_CriticalDamage'] = int(tosutil.tos_mon_get_crtatk(row))
        obj['Stat_CriticalDefense'] = int(tosutil.tos_mon_get_crtdr(row))
        obj['Stat_CriticalRate'] = int(tosutil.tos_mon_get_crthr(row))
        obj['Stat_BlockRate'] = int(tosutil.tos_mon_get_blk(row))
        obj['Stat_BlockPenetration'] = int(tosutil.tos_mon_get_blk_break(row))

        obj['Link_Drops'] = []
        obj['Link_Spawns'] = []

        globals.monsters[obj['$ID']] = obj
        globals.monsters_by_name[obj['$ID_NAME']] = obj

    ies_file.close()