# Buggy code
def organize_nyan_objects(modpack, full_data_set):
    """
    Put available nyan objects into a given modpack.
    """
    created_nyan_files = {}

    # Access all raw API objects
    raw_api_objects = []
    raw_api_objects.extend(full_data_set.pregen_nyan_objects.values())

    for unit_line in full_data_set.unit_lines.values():
        raw_api_objects.extend(unit_line.get_raw_api_objects().values())

    for building_line in full_data_set.building_lines.values():
        raw_api_objects.extend(building_line.get_raw_api_objects().values())

    for ambient_group in full_data_set.ambient_groups.values():
        raw_api_objects.extend(ambient_group.get_raw_api_objects().values())

    for variant_group in full_data_set.variant_groups.values():
        raw_api_objects.extend(variant_group.get_raw_api_objects().values())

    for tech_group in full_data_set.tech_groups.values():
        raw_api_objects.extend(tech_group.get_raw_api_objects().values())

    for terrain_group in full_data_set.terrain_groups.values():
        raw_api_objects.extend(terrain_group.get_raw_api_objects().values())

    for civ_group in full_data_set.civ_groups.values():
        raw_api_objects.extend(civ_group.get_raw_api_objects().values())

    # Create the files
    for raw_api_object in raw_api_objects:
        obj_location = raw_api_object.get_location()

        if isinstance(obj_location, ForwardRef):
            # Resolve location and add nested object
            nyan_object = obj_location.resolve()
            nyan_object.add_nested_object(raw_api_object.get_nyan_object())
            continue

        obj_filename = raw_api_object.get_filename()
        nyan_file_path = f"{modpack.info.name}/{obj_location}{obj_filename}"

        if nyan_file_path in created_nyan_files.keys():
            nyan_file = created_nyan_files[nyan_file_path]

        else:
            nyan_file = NyanFile(obj_location, obj_filename, modpack.info.name)
            created_nyan_files.update({nyan_file.get_relative_file_path(): nyan_file})
            modpack.add_data_export(nyan_file)

        nyan_file.add_nyan_object(raw_api_object.get_nyan_object())

    # Create an import tree from the files
    import_tree = ImportTree()

    for nyan_file in created_nyan_files.values():
        import_tree.expand_from_file(nyan_file)

    for nyan_object in full_data_set.nyan_api_objects.values():
        import_tree.expand_from_object(nyan_object)

    for nyan_file in created_nyan_files.values():
        nyan_file.set_import_tree(import_tree)


# Traceback (KeyError)
INFO [py] launching openage v0.4.1-377-g2be30ba76
INFO [py] compiled by GNU 10.2.0
Do you want to convert assets? [Y/n]
Y
Should we call wine to determine an AOE installation? [Y/n]
n
Could not find any installation directory automatically.
Please enter an AOE2 install path manually.
/home/schatzi/nvme/Steam/steamapps/common/AoE2DE/
converting from '/home/schatzi/nvme/Steam/steamapps/common/AoE2DE'
INFO [py] Game edition detected:
INFO [py]  * Age of Empires 2: Definitive Edition
INFO [py] converting metadata
INFO [py] [0] palette
INFO [py] [1] empires.dat
INFO [py] Starting conversion...
INFO [py] Extracting Genie data...
INFO [py] Creating API-like objects...
INFO [py] Linking API-like objects...
INFO [py] Generating auxiliary objects...
INFO [py] Creating nyan objects...
Traceback (most recent call last):
File "/usr/bin/openage", line 15, in <module>
main()
File "/usr/lib/python3.9/site-packages/openage/__main__.py", line 132, in main
return args.entrypoint(args, cli.error)
File "/usr/lib/python3.9/site-packages/openage/game/main.py", line 71, in main
used_asset_path = convert_assets(
File "/usr/lib/python3.9/site-packages/openage/convert/main.py", line 100, in convert_assets
for current_item in convert(args):
File "/usr/lib/python3.9/site-packages/openage/convert/tool/driver.py", line 48, in convert
yield from convert_metadata(args)
File "/usr/lib/python3.9/site-packages/openage/convert/tool/driver.py", line 96, in convert_metadata
modpacks = args.converter.convert(gamespec,
File "/usr/lib/python3.9/site-packages/openage/convert/processor/conversion/de2/processor.py", line 63, in convert
modpacks = cls._post_processor(dataset)
File "/usr/lib/python3.9/site-packages/openage/convert/processor/conversion/de2/processor.py", line 153, in _post_processor
DE2NyanSubprocessor.convert(full_data_set)
File "/usr/lib/python3.9/site-packages/openage/convert/processor/conversion/de2/nyan_subprocessor.py", line 38, in convert
cls._process_game_entities(gamedata)
File "/usr/lib/python3.9/site-packages/openage/convert/processor/conversion/de2/nyan_subprocessor.py", line 120, in _process_game_entities
cls.tech_group_to_tech(tech_group)
File "/usr/lib/python3.9/site-packages/openage/convert/processor/conversion/de2/nyan_subprocessor.py", line 596, in tech_group_to_tech
patches.extend(DE2TechSubprocessor.get_patches(tech_group))
File "/usr/lib/python3.9/site-packages/openage/convert/processor/conversion/de2/tech_subprocessor.py", line 147, in get_patches
patches.extend(cls.resource_modify_effect(converter_group,
File "/usr/lib/python3.9/site-packages/openage/convert/processor/conversion/de2/tech_subprocessor.py", line 276, in resource_modify_effect
upgrade_func = DE2TechSubprocessor.upgrade_resource_funcs[resource_id]
KeyError:  208

# Fixed code
def organize_nyan_objects(modpack, full_data_set):
    """
    Put available nyan objects into a given modpack.
    """
    created_nyan_files = {}

    # Access all raw API objects
    raw_api_objects = []
    raw_api_objects.extend(full_data_set.pregen_nyan_objects.values())

    for unit_line in full_data_set.unit_lines.values():
        raw_api_objects.extend(unit_line.get_raw_api_objects().values())

    for building_line in full_data_set.building_lines.values():
        raw_api_objects.extend(building_line.get_raw_api_objects().values())

    for ambient_group in full_data_set.ambient_groups.values():
        raw_api_objects.extend(ambient_group.get_raw_api_objects().values())

    for variant_group in full_data_set.variant_groups.values():
        raw_api_objects.extend(variant_group.get_raw_api_objects().values())

    for tech_group in full_data_set.tech_groups.values():
        raw_api_objects.extend(tech_group.get_raw_api_objects().values())

    for terrain_group in full_data_set.terrain_groups.values():
        raw_api_objects.extend(terrain_group.get_raw_api_objects().values())

    for civ_group in full_data_set.civ_groups.values():
        raw_api_objects.extend(civ_group.get_raw_api_objects().values())

    # Create the files
    for raw_api_object in raw_api_objects:
        obj_location = raw_api_object.get_location()

        if isinstance(obj_location, ForwardRef):
            # Resolve location and add nested object
            nyan_object = obj_location.resolve()
            nyan_object.add_nested_object(raw_api_object.get_nyan_object())
            continue

        obj_filename = raw_api_object.get_filename()
        nyan_file_path = f"{modpack.info.name}/{obj_location}{obj_filename}"

        if nyan_file_path in created_nyan_files.keys():
            nyan_file = created_nyan_files[nyan_file_path]

        else:
            nyan_file = NyanFile(obj_location, obj_filename, modpack.info.name)
            created_nyan_files.update({nyan_file.get_relative_file_path(): nyan_file})
            modpack.add_data_export(nyan_file)

        nyan_file.add_nyan_object(raw_api_object.get_nyan_object())

    # Create an import tree from the files
    import_tree = ImportTree()

    for nyan_file in created_nyan_files.values():
        import_tree.expand_from_file(nyan_file)

    for nyan_object in full_data_set.nyan_api_objects.values():
        import_tree.expand_from_object(nyan_object)

    for nyan_file in created_nyan_files.values():
        nyan_file.set_import_tree(import_tree)

    AoCModpackSubprocessor._set_static_aliases(modpack, import_tree)