Factorio: add some more tech tree shapes

This commit is contained in:
Fabian Dill 2021-12-18 13:01:24 +01:00
parent 450e0eacf4
commit c42f53d64f
2 changed files with 52 additions and 0 deletions

View File

@ -94,6 +94,8 @@ class TechTreeLayout(Choice):
option_small_funnels = 7
option_medium_funnels = 8
option_large_funnels = 9
option_trees = 10
option_choices = 11
default = 0

View File

@ -1,4 +1,5 @@
from typing import Dict, List, Set
from collections import deque
from worlds.factorio.Options import TechTreeLayout
@ -189,6 +190,55 @@ def get_shapes(factorio_world) -> Dict[str, List[str]]:
prerequisites.setdefault(tech_name, set()).update(previous_slice[i:i+2])
previous_slice = slice
layer_size -= 1
elif layout == TechTreeLayout.option_trees:
# 0 |
# 1 2 |
# 3 |
# 4 5 6 7 |
# 8 |
# 9 10 11 12 13 14 |
# 15 |
# 16 |
slice_size = 17
while len(tech_names) > slice_size:
slice = tech_names[:slice_size]
tech_names = tech_names[slice_size:]
slice.sort(key=lambda tech_name: len(custom_technologies[tech_name].get_prior_technologies()))
prerequisites[slice[1]] = {slice[0]}
prerequisites[slice[2]] = {slice[0]}
prerequisites[slice[3]] = {slice[1], slice[2]}
prerequisites[slice[4]] = {slice[3]}
prerequisites[slice[5]] = {slice[3]}
prerequisites[slice[6]] = {slice[3]}
prerequisites[slice[7]] = {slice[3]}
prerequisites[slice[8]] = {slice[4], slice[5], slice[6], slice[7]}
prerequisites[slice[9]] = {slice[8]}
prerequisites[slice[10]] = {slice[8]}
prerequisites[slice[11]] = {slice[8]}
prerequisites[slice[12]] = {slice[8]}
prerequisites[slice[13]] = {slice[8]}
prerequisites[slice[14]] = {slice[8]}
prerequisites[slice[15]] = {slice[9], slice[10], slice[11], slice[12], slice[13], slice[14]}
prerequisites[slice[16]] = {slice[15]}
elif layout == TechTreeLayout.option_choices:
tech_names.sort(key=lambda tech_name: len(custom_technologies[tech_name].get_prior_technologies()))
current_choices = deque([tech_names[0]])
tech_names = tech_names[1:]
while len(tech_names) > 1:
source = current_choices.pop()
choices = tech_names[:2]
tech_names = tech_names[2:]
for choice in choices:
prerequisites[choice] = {source}
current_choices.extendleft(choices)
else:
raise NotImplementedError(f"Layout {layout} is not implemented.")
world.tech_tree_layout_prerequisites[player] = prerequisites
return prerequisites