From 0d61192c675f70f6dec78e970e1c1f01dd254945 Mon Sep 17 00:00:00 2001 From: Fabian Dill Date: Thu, 18 Aug 2022 01:33:40 +0200 Subject: [PATCH] Factorio: make apworld compatible(#935) --- worlds/factorio/Mod.py | 25 ++++++++++++++++++++++--- worlds/factorio/Shapes.py | 2 +- worlds/factorio/Technologies.py | 4 ++-- worlds/factorio/__init__.py | 2 +- 4 files changed, 26 insertions(+), 7 deletions(-) diff --git a/worlds/factorio/Mod.py b/worlds/factorio/Mod.py index 8c7dcf66..37c503b0 100644 --- a/worlds/factorio/Mod.py +++ b/worlds/factorio/Mod.py @@ -78,9 +78,14 @@ def generate_mod(world, output_directory: str): global data_final_template, locale_template, control_template, data_template, settings_template with template_load_lock: if not data_final_template: - mod_template_folder = os.path.join(os.path.dirname(__file__), "data", "mod_template") + def load_template(name: str): + import pkgutil + data = pkgutil.get_data(__name__, "data/mod_template/" + name).decode() + return data, name, lambda: False + template_env: Optional[jinja2.Environment] = \ - jinja2.Environment(loader=jinja2.FileSystemLoader([mod_template_folder])) + jinja2.Environment(loader=jinja2.FunctionLoader(load_template)) + data_template = template_env.get_template("data.lua") data_final_template = template_env.get_template("data-final-fixes.lua") locale_template = template_env.get_template(r"locale/en/locale.cfg") @@ -158,7 +163,21 @@ def generate_mod(world, output_directory: str): mod_dir = os.path.join(output_directory, mod_name + "_" + Utils.__version__) en_locale_dir = os.path.join(mod_dir, "locale", "en") os.makedirs(en_locale_dir, exist_ok=True) - shutil.copytree(os.path.join(os.path.dirname(__file__), "data", "mod"), mod_dir, dirs_exist_ok=True) + + if world.zip_path: + # Maybe investigate read from zip, write to zip, without temp file? + with zipfile.ZipFile(world.zip_path) as zf: + for file in zf.infolist(): + if not file.is_dir() and "/data/mod/" in file.filename: + path_part = Utils.get_text_after(file.filename, "/data/mod/") + target = os.path.join(mod_dir, path_part) + os.makedirs(os.path.split(target)[0], exist_ok=True) + + with open(target, "wb") as f: + f.write(zf.read(file)) + else: + shutil.copytree(os.path.join(os.path.dirname(__file__), "data", "mod"), mod_dir, dirs_exist_ok=True) + with open(os.path.join(mod_dir, "data.lua"), "wt") as f: f.write(data_template_code) with open(os.path.join(mod_dir, "data-final-fixes.lua"), "wt") as f: diff --git a/worlds/factorio/Shapes.py b/worlds/factorio/Shapes.py index eaf44ac1..f42da4d2 100644 --- a/worlds/factorio/Shapes.py +++ b/worlds/factorio/Shapes.py @@ -1,7 +1,7 @@ from typing import Dict, List, Set from collections import deque -from worlds.factorio.Options import TechTreeLayout +from .Options import TechTreeLayout funnel_layers = {TechTreeLayout.option_small_funnels: 3, TechTreeLayout.option_medium_funnels: 4, diff --git a/worlds/factorio/Technologies.py b/worlds/factorio/Technologies.py index f89dc53e..b88cc9b1 100644 --- a/worlds/factorio/Technologies.py +++ b/worlds/factorio/Technologies.py @@ -19,8 +19,8 @@ pool = ThreadPoolExecutor(1) def load_json_data(data_name: str) -> Union[List[str], Dict[str, Any]]: - with open(os.path.join(source_folder, f"{data_name}.json")) as f: - return json.load(f) + import pkgutil + return json.loads(pkgutil.get_data(__name__, "data/" + data_name + ".json").decode()) techs_future = pool.submit(load_json_data, "techs") diff --git a/worlds/factorio/__init__.py b/worlds/factorio/__init__.py index 26e761d4..a01abac7 100644 --- a/worlds/factorio/__init__.py +++ b/worlds/factorio/__init__.py @@ -1,7 +1,7 @@ import collections import typing -from ..AutoWorld import World, WebWorld +from worlds.AutoWorld import World, WebWorld from BaseClasses import Region, Entrance, Location, Item, RegionType, Tutorial, ItemClassification from .Technologies import base_tech_table, recipe_sources, base_technology_table, \