From da0207f5cb419baa1f7b05c448bead91dbaa0bd4 Mon Sep 17 00:00:00 2001 From: Fabian Dill Date: Fri, 2 May 2025 23:39:14 +0200 Subject: [PATCH] Factorio: implement custom filler items (#4945) --- worlds/AutoWorld.py | 2 +- worlds/factorio/__init__.py | 14 ++++++++++---- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/worlds/AutoWorld.py b/worlds/AutoWorld.py index 67455a1a..f0004a9f 100644 --- a/worlds/AutoWorld.py +++ b/worlds/AutoWorld.py @@ -485,7 +485,7 @@ class World(metaclass=AutoWorldRegister): def get_filler_item_name(self) -> str: """Called when the item pool needs to be filled with additional items to match location count.""" logging.warning(f"World {self} is generating a filler item without custom filler pool.") - return self.multiworld.random.choice(tuple(self.item_name_to_id.keys())) + return self.random.choice(tuple(self.item_name_to_id.keys())) @classmethod def create_group(cls, multiworld: "MultiWorld", new_player_id: int, players: Set[int]) -> World: diff --git a/worlds/factorio/__init__.py b/worlds/factorio/__init__.py index ddebc7e3..0e96e7f8 100644 --- a/worlds/factorio/__init__.py +++ b/worlds/factorio/__init__.py @@ -115,6 +115,7 @@ class Factorio(World): settings: typing.ClassVar[FactorioSettings] trap_names: tuple[str] = ("Evolution", "Attack", "Teleport", "Grenade", "Cluster Grenade", "Artillery", "Atomic Rocket", "Atomic Cliff Remover", "Inventory Spill") + want_progressives: dict[str, bool] = collections.defaultdict(lambda: False) def __init__(self, world, player: int): super(Factorio, self).__init__(world, player) @@ -133,6 +134,8 @@ class Factorio(World): self.options.max_tech_cost.value, self.options.min_tech_cost.value self.tech_mix = self.options.tech_cost_mix.value self.skip_silo = self.options.silo.value == Silo.option_spawn + self.want_progressives = collections.defaultdict( + lambda: self.options.progressive.want_progressives(self.random)) def create_regions(self): player = self.player @@ -201,9 +204,6 @@ class Factorio(World): range(getattr(self.options, f"{trap_name.lower().replace(' ', '_')}_traps"))) - want_progressives = collections.defaultdict(lambda: self.options.progressive. - want_progressives(self.random)) - cost_sorted_locations = sorted(self.science_locations, key=lambda location: location.name) special_index = {"automation": 0, "logistics": 1, @@ -218,7 +218,7 @@ class Factorio(World): for tech_name in base_tech_table: if tech_name not in self.removed_technologies: progressive_item_name = tech_to_progressive_lookup.get(tech_name, tech_name) - want_progressive = want_progressives[progressive_item_name] + want_progressive = self.want_progressives[progressive_item_name] item_name = progressive_item_name if want_progressive else tech_name tech_item = self.create_item(item_name) index = special_index.get(tech_name, None) @@ -233,6 +233,12 @@ class Factorio(World): loc.place_locked_item(tech_item) loc.revealed = True + def get_filler_item_name(self) -> str: + tech_name: str = self.random.choice(tuple(tech_table)) + progressive_item_name: str = tech_to_progressive_lookup.get(tech_name, tech_name) + want_progressive: bool = self.want_progressives[progressive_item_name] + return progressive_item_name if want_progressive else tech_name + def set_rules(self): player = self.player shapes = get_shapes(self)