mirror of
https://github.com/ArchipelagoMW/Archipelago.git
synced 2026-03-21 15:03:18 -07:00
also give warnings about deprecated LttP options also fix FactorioClient.py getting stuck if send an unknown item id also fix !missing having an extra newline after each entry also default to no webui
67 lines
2.6 KiB
Python
67 lines
2.6 KiB
Python
"""Outputs a Factorio Mod to facilitate integration with Archipelago"""
|
|
|
|
import os
|
|
from typing import Optional
|
|
import threading
|
|
import json
|
|
|
|
import jinja2
|
|
import Utils
|
|
import shutil
|
|
from BaseClasses import MultiWorld
|
|
from .Technologies import tech_table
|
|
|
|
template: Optional[jinja2.Template] = None
|
|
locale_template: Optional[jinja2.Template] = None
|
|
|
|
template_load_lock = threading.Lock()
|
|
|
|
base_info = {
|
|
"version": Utils.__version__,
|
|
"title": "Archipelago",
|
|
"author": "Berserker",
|
|
"homepage": "https://archipelago.gg",
|
|
"description": "Integration client for the Archipelago Randomizer",
|
|
"factorio_version": "1.1"
|
|
}
|
|
|
|
def generate_mod(world: MultiWorld, player: int):
|
|
global template, locale_template
|
|
with template_load_lock:
|
|
if not template:
|
|
template = jinja2.Template(open(Utils.local_path("data", "factorio", "mod_template", "data-final-fixes.lua")).read())
|
|
locale_template = jinja2.Template(open(Utils.local_path("data", "factorio", "mod_template", "locale", "en", "locale.cfg")).read())
|
|
# get data for templates
|
|
player_names = {x: world.player_names[x][0] for x in world.player_ids}
|
|
locations = []
|
|
for location in world.get_filled_locations(player):
|
|
if not location.name.startswith("recipe-"): # introduce this as a new location property?
|
|
locations.append((location.name, location.item.name, location.item.player))
|
|
mod_name = f"archipelago-client-{world.seed}-{player}"
|
|
tech_cost = {0: 0.1,
|
|
1: 0.25,
|
|
2: 0.5,
|
|
3: 1,
|
|
4: 2,
|
|
5: 5,
|
|
6: 10}[world.tech_cost[player].value]
|
|
template_data = {"locations": locations, "player_names" : player_names, "tech_table": tech_table,
|
|
"mod_name": mod_name, "allowed_science_packs": world.max_science_pack[player].get_allowed_packs(),
|
|
"tech_cost": tech_cost}
|
|
|
|
mod_code = template.render(**template_data)
|
|
|
|
mod_dir = Utils.output_path(mod_name)
|
|
en_locale_dir = os.path.join(mod_dir, "locale", "en")
|
|
os.makedirs(en_locale_dir, exist_ok=True)
|
|
shutil.copytree(Utils.local_path("data", "factorio", "mod"), mod_dir, dirs_exist_ok=True)
|
|
with open(os.path.join(mod_dir, "data-final-fixes.lua"), "wt") as f:
|
|
f.write(mod_code)
|
|
locale_content = locale_template.render(**template_data)
|
|
with open(os.path.join(en_locale_dir, "locale.cfg"), "wt") as f:
|
|
f.write(locale_content)
|
|
info = base_info.copy()
|
|
info["name"] = mod_name
|
|
with open(os.path.join(mod_dir, "info.json"), "wt") as f:
|
|
json.dump(info, f, indent=4)
|