I tried with a hunting quest, it's working with gameforge strings at least. Anyway, probably won't work for every quest, i'll leave the debug for you guys.
"""
resolve_gameforge_refs.py
Usage:
python resolve_gameforge_refs.py --quest path/to/name_of_quest.quest --translate path/to/translate.lua --out path/to/name_of_resolved_quest.quest
"""
import argparse
import re
from pathlib import Path
def parse_translate(path: Path) -> dict:
text = path.read_text(encoding="utf-8", errors="ignore")
assign_re = re.compile(r'^(gameforge(?:\.[A-Za-z0-9_]+)+)\s*=\s*(".*?")\s*$', re.M)
mapping = {}
for m in assign_re.finditer(text):
key = m.group(1)
val = m.group(2)
mapping[key] = val
return mapping
def extract_tokens(quest_text: str) -> list[str]:
return sorted(set(re.findall(r'\bgameforge(?:\.[A-Za-z0-9_]+)+', quest_text)))
def replace_tokens(quest_text: str, mapping: dict) -> tuple[str, dict, list]:
tokens = extract_tokens(quest_text)
to_replace = {t: mapping[t] for t in tokens if t in mapping}
missing = [t for t in tokens if t not in mapping]
replaced = quest_text
for key in sorted(to_replace.keys(), key=len, reverse=True):
pattern = r'\b' + re.escape(key) + r'\b'
replaced = re.sub(pattern, to_replace[key], replaced)
return replaced, to_replace, missing
def main():
ap = argparse.ArgumentParser()
ap.add_argument("--quest", required=True, type=Path, help="Path to the quest file")
ap.add_argument("--translate", required=True, type=Path, help="Path to translate.lua")
ap.add_argument("--out", required=True, type=Path, help="Output path for resolved quest")
args = ap.parse_args()
quest_text = args.quest.read_text(encoding="utf-8", errors="ignore")
mapping = parse_translate(args.translate)
replaced_text, to_replace, missing = replace_tokens(quest_text, mapping)
args.out.write_text(replaced_text, encoding="utf-8")
print(f"Wrote: {args.out} ({args.out.stat().st_size} bytes)")
print(f"Found {len(to_replace)} keys to replace out of {len(extract_tokens(quest_text))} tokens.")
if missing:
print("Missing keys (no translation found):")
for k in missing:
print(" -", k)
if __name__ == "__main__":
main()