コード例 #1
0
def build_kinsects(session: sqlalchemy.orm.Session, mhdata):
    # Prepass to determine which entries are "final"
    # Those that are a previous to another are "not final"
    all_final = set(mhdata.kinsect_map.keys())
    for entry in mhdata.kinsect_map.values():
        if not entry.get('previous_en', None):
            continue
        try:
            prev_id = mhdata.kinsect_map.id_of('en', entry['previous_en'])
            all_final.remove(prev_id)
        except KeyError:
            pass

    # Store next recipe id ahead of time
    next_recipe_id = calculate_next_recipe_id(session)

    # Save kinsects
    for entry in mhdata.kinsect_map.values():
        kinsect = db.Kinsect(id=entry.id,
                             rarity=entry['rarity'],
                             previous_kinsect_id=mhdata.kinsect_map.id_of(
                                 'en', entry['previous_en']),
                             attack_type=entry['attack_type'],
                             dust_effect=entry['dust_effect'],
                             power=entry['power'],
                             speed=entry['speed'],
                             heal=entry['heal'],
                             final=entry.id in all_final)

        # Add language translations
        for language in cfg.supported_languages:
            kinsect.translations.append(
                db.KinsectText(lang_id=language,
                               name=get_translated(entry, 'name', language)))

        # Save kinsect recipe
        recipe = entry.get('craft', None)
        if recipe:
            for item, quantity in datafn.iter_recipe(recipe):
                item_id = mhdata.item_map.id_of("en", item)
                ensure(
                    item_id, f"Kinsect {entry.name('en')} refers to " +
                    f"item {item}, which doesn't exist.")
                kinsect.craft_items.append(
                    db.RecipeItem(recipe_id=next_recipe_id,
                                  item_id=item_id,
                                  quantity=quantity))
            next_recipe_id += 1

        session.add(kinsect)

    print("Built Kinsects")
コード例 #2
0
def build_charms(session: sqlalchemy.orm.Session, mhdata):
    item_map = mhdata.item_map
    skill_map = mhdata.skill_map
    charm_map = mhdata.charm_map

    # Store next recipe id ahead of time
    next_recipe_id = calculate_next_recipe_id(session)

    for order_id, entry in enumerate(charm_map.values()):
        # Note: previous is ok to be None
        previous = charm_map.id_of('en', entry['previous_en'])

        charm = db.Charm(id=entry.id,
                         order_id=order_id,
                         previous_id=previous,
                         rarity=entry['rarity'])

        for language in cfg.supported_languages:
            charm.translations.append(
                db.CharmText(lang_id=language,
                             name=get_translated(entry, 'name', language)))

        # Add charm skills
        for skill_en, level in datafn.iter_skill_levels(entry, amount=2):
            skill_id = skill_map.id_of('en', skill_en)
            ensure(
                skill_id, f"Charm {entry.name('en')} refers to " +
                f"skill {skill_en}, which doesn't exist.")

            charm.skills.append(
                db.CharmSkill(skilltree_id=skill_id, level=level))

        # Add Charm Recipe
        if entry.get('craft'):
            for item_en, quantity in datafn.iter_recipe(entry['craft'][0]):
                item_id = item_map.id_of('en', item_en)
                ensure(
                    item_id, f"Charm {entry.name('en')} refers to " +
                    f"item {item_en}, which doesn't exist.")

                charm.craft_items.append(
                    db.RecipeItem(recipe_id=next_recipe_id,
                                  item_id=item_id,
                                  quantity=quantity))
            next_recipe_id += 1

        session.add(charm)

    print("Built Charms")
コード例 #3
0
def build_weapons(session: sqlalchemy.orm.Session, mhdata):
    item_map = mhdata.item_map
    weapon_map = mhdata.weapon_map

    # Save all weapon ammo configurations
    for entry in mhdata.weapon_ammo_map.values():
        ammo = db.WeaponAmmo(id=entry.id,
                             deviation=entry['deviation'],
                             special_ammo=entry['special'])

        # helper to assign the entirety of a group to the db
        def assign_group(ammotype):
            group = entry[ammotype]
            setattr(ammo, ammotype + "_clip", group['clip'])
            setattr(ammo, ammotype + "_rapid", group['rapid'])
            setattr(ammo, ammotype + "_recoil", group.get('recoil', None) or 0)
            setattr(ammo, ammotype + "_reload", group.get('reload', None))

        assign_group('normal1')
        assign_group('normal2')
        assign_group('normal3')
        assign_group('pierce1')
        assign_group('pierce2')
        assign_group('pierce3')
        assign_group('spread1')
        assign_group('spread2')
        assign_group('spread3')
        assign_group('sticky1')
        assign_group('sticky2')
        assign_group('sticky3')
        assign_group('cluster1')
        assign_group('cluster2')
        assign_group('recover1')
        assign_group('recover2')
        assign_group('poison1')
        assign_group('poison2')
        assign_group('paralysis1')
        assign_group('paralysis2')
        assign_group('sleep1')
        assign_group('sleep2')
        assign_group('exhaust1')
        assign_group('exhaust2')
        assign_group('flaming')
        assign_group('water')
        assign_group('freeze')
        assign_group('thunder')
        assign_group('dragon')

        assign_group('slicing')
        assign_group('demon')
        assign_group('armor')
        assign_group('tranq')

        ammo.wyvern_clip = entry['wyvern']['clip']
        ammo.wyvern_reload = entry['wyvern']['reload']

        session.add(ammo)

    # Save all weapon melodies
    for melody_entry in mhdata.weapon_melodies.values():
        melody = db.WeaponMelody(base_duration=melody_entry['base_duration'],
                                 base_extension=melody_entry['base_extension'],
                                 m1_duration=melody_entry['m1_duration'],
                                 m1_extension=melody_entry['m1_extension'],
                                 m2_duration=melody_entry['m2_duration'],
                                 m2_extension=melody_entry['m2_extension'])

        for language in cfg.supported_languages:
            melody.translations.append(
                db.WeaponMelodyText(
                    lang_id=language,
                    name=get_translated(melody_entry, 'name', language),
                    effect1=get_translated(melody_entry, 'effect1', language),
                    effect2=get_translated(melody_entry, 'effect2', language)))

        for note_entry in melody_entry['notes']:
            melody.notes.append(
                db.WeaponMelodyNotes(notes=note_entry['notes']))

        session.add(melody)

    # Prepass to determine which weapons are "final"
    # All items that are a previous to another are "not final"
    all_final = set(weapon_map.keys())
    for entry in weapon_map.values():
        if not entry.get('previous_en', None):
            continue
        try:
            prev_id = weapon_map.id_of('en', entry['previous_en'],
                                       entry['weapon_type'])
            all_final.remove(prev_id)
        except KeyError:
            pass

    # Query next recipe id beforehand
    next_recipe_id = calculate_next_recipe_id(session)

    # now iterate over actual weapons
    for idx, entry in enumerate(weapon_map.values()):
        weapon_id = entry.id
        weapon_type = entry['weapon_type']

        weapon = db.Weapon(
            id=weapon_id,
            order_id=idx,
            weapon_type=weapon_type,
        )

        # Add language translations
        for language in cfg.supported_languages:
            weapon.translations.append(
                db.WeaponText(lang_id=language,
                              name=get_translated(entry, 'name', language)))

        weapon.category = entry['category']
        weapon.rarity = entry['rarity']
        weapon.attack = entry['attack']
        weapon.attack_true = int(entry['attack'] /
                                 cfg.weapon_multiplier[weapon_type])
        weapon.affinity = entry['affinity']
        weapon.defense = entry['defense'] or 0
        weapon.slot_1 = entry['slot_1']
        weapon.slot_2 = entry['slot_2']
        weapon.slot_3 = entry['slot_3']

        weapon.element1 = entry['element1']
        weapon.element1_attack = entry['element1_attack']
        weapon.element2 = entry['element2']
        weapon.element2_attack = entry['element2_attack']
        weapon.element_hidden = entry['element_hidden']
        weapon.elderseal = entry['elderseal']

        if entry.get('sharpness', None):
            weapon.sharpness = datafn.merge_sharpness(entry)
            weapon.sharpness_maxed = entry['sharpness']['maxed']

        weapon.kinsect_bonus = entry['kinsect_bonus']
        weapon.phial = entry['phial']
        weapon.phial_power = entry['phial_power']
        weapon.shelling = entry['shelling']
        weapon.shelling_level = entry['shelling_level']
        weapon.notes = entry['notes']

        weapon.craftable = False  # set to true later if it can be crafted
        weapon.final = weapon_id in all_final

        previous_weapon_name = entry.get('previous_en', None)
        if previous_weapon_name:
            previous_weapon_id = weapon_map.id_of("en", previous_weapon_name,
                                                  weapon_type)
            ensure(previous_weapon_id,
                   f"Weapon {previous_weapon_name} does not exist")
            weapon.previous_weapon_id = previous_weapon_id

        # Add crafting/upgrade recipes
        for recipe in entry.get('craft', {}):
            recipe_type = recipe['type']
            if recipe_type == "Create":
                weapon.craftable = True
                weapon.create_recipe_id = next_recipe_id
            else:
                weapon.upgrade_recipe_id = next_recipe_id

            for item, quantity in datafn.iter_recipe(recipe):
                item_id = item_map.id_of("en", item)
                session.add(
                    db.RecipeItem(recipe_id=next_recipe_id,
                                  item_id=item_id,
                                  quantity=quantity))

            next_recipe_id += 1

        # Bow data (if any)
        if entry.get("bow", None):
            bow_data = entry['bow']
            weapon.coating_close = bow_data['close']
            weapon.coating_power = bow_data['power']
            weapon.coating_poison = bow_data['poison']
            weapon.coating_paralysis = bow_data['paralysis']
            weapon.coating_sleep = bow_data['sleep']
            weapon.coating_blast = bow_data['blast']

        # Gun data mapping (if any)
        ammo_config_name = entry.get('ammo_config', None)
        if ammo_config_name:
            weapon.ammo_id = mhdata.weapon_ammo_map[ammo_config_name].id

        # Skills
        if entry['skill']:
            skill_id = mhdata.skill_map.id_of('en', entry['skill'])
            weapon.skills.append(db.WeaponSkill(skilltree_id=skill_id,
                                                level=1))

        session.add(weapon)

    print("Built Weapons")