76 lines
1.7 KiB
Python
Executable File
76 lines
1.7 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
|
|
"""
|
|
This script takes a list of target components and tries to visualise a
|
|
(hopefully efficient) factory layout to produce the components.
|
|
"""
|
|
|
|
import satisfactory
|
|
|
|
import os
|
|
|
|
from dataclasses import dataclass
|
|
from typing import Iterable, Dict
|
|
|
|
|
|
@dataclass
|
|
class entry:
|
|
rank: int = -1
|
|
|
|
def fold(self, rhs):
|
|
self.rank = max(self.rank, rhs.rank)
|
|
|
|
def advance(self):
|
|
self.rank += 1
|
|
|
|
|
|
class layout(object):
|
|
cache: Dict[str, entry] = dict()
|
|
cookbook: satisfactory.Cookbook
|
|
|
|
def __init__(self, cookbook):
|
|
self.cookbook = cookbook
|
|
|
|
def score(self, target: str):
|
|
if target in self.cache:
|
|
return self.cache[target]
|
|
|
|
res = entry()
|
|
for required in self.cookbook.recipes(target)[0].input:
|
|
res.fold(self.score(required))
|
|
|
|
res.advance()
|
|
self.cache[target] = res
|
|
return res
|
|
|
|
|
|
if __name__ == '__main__':
|
|
def main():
|
|
import argparse
|
|
|
|
root = os.path.dirname(__file__)
|
|
recipe_root = os.path.join(root, 'data', 'recipes')
|
|
|
|
parser = argparse.ArgumentParser()
|
|
parser.add_argument('--data', type=str, default=recipe_root)
|
|
parser.add_argument('--target', type=str, nargs="*")
|
|
parser.add_argument('--prefer', type=str, nargs="*")
|
|
|
|
args = parser.parse_args()
|
|
|
|
recipes = satisfactory.Cookbook(args.data)
|
|
|
|
if args.prefer:
|
|
for alternative in args.prefer:
|
|
recipes.prefer(alternative)
|
|
|
|
l = layout(recipes)
|
|
targets = args.target if args.target else recipes.components()
|
|
for t in targets:
|
|
l.score(t)
|
|
|
|
for name, data in l.cache.items():
|
|
print(name, data)
|
|
|
|
main()
|