From 47fbf1e44905dda830fc3cdf92488556fc908d20 Mon Sep 17 00:00:00 2001 From: Rob B Date: Thu, 7 Aug 2025 17:51:58 -0400 Subject: [PATCH 1/4] Update with changes from ToBeVerified branch --- worlds/satisfactory/docs/en_Satisfactory.md | 51 +++++++++------------ worlds/satisfactory/docs/setup_en.md | 9 +--- 2 files changed, 22 insertions(+), 38 deletions(-) diff --git a/worlds/satisfactory/docs/en_Satisfactory.md b/worlds/satisfactory/docs/en_Satisfactory.md index f7a4f1d121..8b9aa593e2 100644 --- a/worlds/satisfactory/docs/en_Satisfactory.md +++ b/worlds/satisfactory/docs/en_Satisfactory.md @@ -109,7 +109,7 @@ They will deposit surplus produced energy and draw energy from the shared storag Just like the base game, there is no limit to the discharge/draw rate of one building, and each Power Storage provides 100 MW of charging throughput. -The shared storage has unlimited capacity, and no energy is lost during depositing. +The shared storage has unlimited capacity, and only a small amount of energy is lost during depositing. The amount of energy currently in the shared storage is displayed in the Archipelago client and appears in the Power Storage building UI. @@ -150,7 +150,7 @@ the rest are filler or useful. ## Where do I run Archipelago commands? -You can use the game's build-in chat menu. +You can use the game's built-in chat menu. Check the game's keybinding options to see how to open it. Run the `/help` command to list all available commands. Note that Archipelago commands are *not* prefixed with `!` inside of Satisfactory. @@ -159,6 +159,21 @@ Note that multiple base-game bugs affect the chat menu's functionality and Archipelago can put a lot of info into the chat. You may wish to launch the Archipelago Text Client and use it to run commands instead of the game's chat. +### Hints + +Archipelago's hint system is available within Satisfactory via the `/hint` command. +Most multiworld item names have a prefix to distinguish recipes from bundles. +For example, to hint for the Assembler, run `/hint Building: Assembler`. + +Satisfactory's hint system has special behavior for Satisfactory crafting items. +If you hint the unprefixed name of an item with multiple recipes, the system will hint the recipe you are expected to find first in randomizer logic. +For example, hinting `Smart Plating` will return the logically first Smart Plating recipe, +but hinting `Recipe: Smart Plating` or `Recipe: Plastic Smart Plating` will hint that specific recipe for Smart Plating, +which may or may not be in logic. + +Exact Archipelago Item names (for hints/starting inventory/etc.) can be found +[on the mod's GitHub](https://github.com/Jarno458/Archipelago/blob/Satisfactory/worlds/satisfactory/Items.py). + ## Multiplayer and Dedicated Servers It is possible to host a Satisfactory Archipelago Slot using the game's built in multiplayer, @@ -175,8 +190,8 @@ Dedicated server support is only working for Windows at the moment. ## Additional Mods -It is possible to load other Satisfactory mods in tandem with the Archipelago Satisfactory mod. -However, no guarantee is made that any mods except the "Certified Compatible Mods" listed below will work correctly, +It is possible to use other Satisfactory mods in tandem with the Archipelago Satisfactory mod. +However, no guarantee is made that they will work correctly, especially if they affect game progression, recipes, or add unlocks to base-game technologies. Content added by unaffiliated mods may end up inaccessible based on your chosen slot settings, @@ -185,29 +200,5 @@ You may be able to write patches using [ContentLib](https://ficsit.app/mod/Conte to adjust other mods to work with your slot settings, but doing so is out of the scope of this guide. -Use unaffiliated mods at your own risk, support will not be offered. - -The following mods are **required dependencies** of the Archipelago mod and **will automatically be installed for you** -when you install it using the Satisfactory Mod Manager: - -- [ContentLib](https://ficsit.app/mod/ContentLib) - Runtime content generation. -- [Free Samples](https://ficsit.app/mod/FreeSamples) - Used to implement the Free Samples options. Even if you don't have this game option enabled, the mod will still be present, but its functionality will be disabled. -- [MAM Enhancer](https://ficsit.app/mod/MAMTips) - Allows viewing MAM research nodes in detail. Enables you to hover over the items/unlocks of a node to see more info, especially important when their names get long. -- [FixClientResourceSinkPoints](https://ficsit.app/mod/FixClientResourceSinkPoints) - Fixes a bug where AWESOME Sink points values aren't loaded properly on multiplayer clients. - -### Certified Compatible Mods - -The following mods are known to work with Archipelago: - - - -- [TFIT - FICSIT Information Tool](https://ficsit.app/mod/TFIT) - View how many Sink Points items are worth and how points-profitable recipes are. Helpful for the AWESOME Sink goals. -- [Faster Manual Crafting Redux](https://ficsit.app/mod/FasterManualCraftingRedux) - Reduce the early game manual crafting grind with a manual crafting speed that ramps up as you craft larger batches at once. - - - - -The following mods have been used successfully by other players but have not been thoroughly tested with Archipelago: - -- [Resource Roulette](https://ficsit.app/mod/ResourceRoulette) - Randomize the location of resource nodes -- [Infinite Zoop](https://ficsit.app/mod/InfiniteZoop) - Adds a research tree in the MAM where you can improve your Zoop capacity. Also enables multi-row & column Wall and Foundation construction. +[The Satisfactory Archipelago mod GitHub](https://github.com/Jarno458/SatisfactoryArchipelagoMod/blob/main/Docs/AdditionalMods.md) +maintains a list of additional mods that have been tested with Archipelago to some extent. diff --git a/worlds/satisfactory/docs/setup_en.md b/worlds/satisfactory/docs/setup_en.md index 8d23c43de9..37cdfa8a67 100644 --- a/worlds/satisfactory/docs/setup_en.md +++ b/worlds/satisfactory/docs/setup_en.md @@ -196,7 +196,7 @@ Next, enter the connection details in the relevant fields. - **Server URI**: Archipelago Server URI and port, for example, `archipelago.gg:49236` - **User Name**: The name you entered as your Player Name when you created your config file. It's also listed in the Name column of your room page. -- **Password**: The password for your slot, blank if you did not assign one. +- **Password**: The password for your Archipelago room, blank if you did not assign or receive one. Note that the Satisfactory Host/Client does *not* need a copy of your Archipelago config file. The mod communicates with the Archipelago Server, which already has your config file, @@ -231,10 +231,6 @@ Check out the HUB to get started! See the [Troubleshooting section below](#troubleshooting) if you encounter any issues. - - ### Allowing Other People to Join Your Game Additional players can join your game using the game's built-in multiplayer functionality. @@ -275,6 +271,3 @@ enter the updated Server URI, then save and reload the game. - Use the Mod Manager to generate a debug zip and attach that file. [Satisfactory Modding Documentation FAQ: Generating a debug zip](https://docs.ficsit.app/satisfactory-modding/latest/faq.html#_where_can_i_find_the_games_log_files) - Attach your Archipelago config file and spoiler to your report. -- If your early game power grid is repeatedly shutting down for unclear reasons, - ensure you are not wearing a Hover Pack, as they draw 100 MW. - From 965e94ade81707cf3aeeef959c69a2cdded7ae8a Mon Sep 17 00:00:00 2001 From: Rob B Date: Thu, 14 Aug 2025 22:01:42 -0400 Subject: [PATCH 2/4] Update note about gameplay options --- worlds/satisfactory/docs/setup_en.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/worlds/satisfactory/docs/setup_en.md b/worlds/satisfactory/docs/setup_en.md index 37cdfa8a67..292adafdcd 100644 --- a/worlds/satisfactory/docs/setup_en.md +++ b/worlds/satisfactory/docs/setup_en.md @@ -202,10 +202,10 @@ Note that the Satisfactory Host/Client does *not* need a copy of your Archipelag The mod communicates with the Archipelago Server, which already has your config file, to generate the required content at runtime. -Consider enabling Advanced Game Settings to allow dealing with bugs that may arise. -Within the Advanced Game Settings menus, -you may wish to switch the "Keep Inventory" setting to "Keep Everything" to avoid dropping items on death, -although this will never lock you out of progression. +Consider setting the following options in the "Options" > "Gameplay" section, especially because they are per-user and persist across your game saves: + +- **Creature Hostility**: `Default` (the game's default). Some of the mod's Traps involve creatures, and having them Passive or Retaliate cheapens the experience. +- **Keep Inventory**: `Keep Everything` or `Keep Equipment` (the game's default). Although dying and dropping items will never lock you out of progression, Free Samples and Bundles means you can easily gain items you can't easily replace. > Note: Satisfactory dedicated servers do not currently have a user interface for the Mod Savegame Setting system. > and [the starting inventory feature does not currently work on dedicated servers](https://github.com/Jarno458/SatisfactoryArchipelagoMod/issues/105). From 64fcfc7cc1f2204930a552276316941f2ca65eda Mon Sep 17 00:00:00 2001 From: Jarno Westhof Date: Thu, 28 Aug 2025 23:35:25 +0200 Subject: [PATCH 3/4] Improved universal tracker handling --- worlds/satisfactory/__init__.py | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/worlds/satisfactory/__init__.py b/worlds/satisfactory/__init__.py index c8094a2e32..797910717f 100644 --- a/worlds/satisfactory/__init__.py +++ b/worlds/satisfactory/__init__.py @@ -43,7 +43,7 @@ class SatisfactoryWorld(World): item_name_groups = Items.get_item_names_per_category(game_logic) def generate_early(self) -> None: - self.interpret_slot_data(None) + self.process_universal_tracker_slot_data_if_available() if self.critical_path_seed == None: self.critical_path_seed = self.random.random() @@ -168,18 +168,24 @@ class SatisfactoryWorld(World): } - def interpret_slot_data(self, slot_data: dict[str, Any] | None) -> dict[str, Any] | None: + @staticmethod + def interpret_slot_data(slot_data: dict[str, Any] | None) -> dict[str, Any] | None: + """Used by Universal Tracker, return value is passed to self.multiworld.re_gen_passthrough""" + return slot_data + + + def process_universal_tracker_slot_data_if_available(self) -> None: """Used by Universal Tracker to correctly rebuild state""" - if not slot_data \ - and hasattr(self.multiworld, "re_gen_passthrough") \ + slot_data: dict[str, Any] | None + if hasattr(self.multiworld, "re_gen_passthrough") \ and isinstance(self.multiworld.re_gen_passthrough, dict) \ and "Satisfactory" in self.multiworld.re_gen_passthrough: slot_data = self.multiworld.re_gen_passthrough["Satisfactory"] if not slot_data: - return None - + return + if (slot_data["Data"]["SlotDataVersion"] != 1): raise Exception("The slot_data version mismatch, the UT's Satisfactory .apworld is different from the one used during generation") @@ -204,8 +210,6 @@ class SatisfactoryWorld(World): self.critical_path_seed = slot_data["Data"]["UT"]["Seed"] self.options.randomize_starter_recipes.value = slot_data["Data"]["UT"]["RandomizeTier0"] - return slot_data - def write_spoiler_header(self, spoiler_handle: TextIO) -> None: if self.options.randomize_starter_recipes: From d8836c901fafa5c6c2e66cf7bbbff6cabaf0d553 Mon Sep 17 00:00:00 2001 From: Jarno Westhof Date: Fri, 29 Aug 2025 21:59:58 +0200 Subject: [PATCH 4/4] Added Recipe: Excited Photonic Matter --- worlds/satisfactory/GameLogic.py | 3 ++- worlds/satisfactory/Items.py | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/worlds/satisfactory/GameLogic.py b/worlds/satisfactory/GameLogic.py index 59cc4415d4..40947fcbfe 100644 --- a/worlds/satisfactory/GameLogic.py +++ b/worlds/satisfactory/GameLogic.py @@ -575,7 +575,8 @@ class GameLogic: #Recipe("Ficsonium", "Particle Accelerator", ("Plutonium Waste", "Singularity Cell"), additional_outputs=("Ficsonium", )), Recipe("Dark Matter Crystal", "Particle Accelerator", ("Diamonds", ), additional_outputs=("Dark Matter Crystal", )), Recipe("Dark Matter Crystallization", "Particle Accelerator", additional_outputs=("Dark Matter Crystal", )), - Recipe("Dark Matter Trap", "Particle Accelerator", ("Time Crystal", ), additional_outputs=("Dark Matter Crystal", ))), + Recipe("Dark Matter Trap", "Particle Accelerator", ("Time Crystal", ), additional_outputs=("Dark Matter Crystal", )), + Recipe("Dark Matter Residue", "Converter", ("Reanimated SAM", ) )), "Superposition Oscillator": ( Recipe("Superposition Oscillator", "Quantum Encoder", ("Dark Matter Residue", "Excited Photonic Matter", "Dark Matter Crystal", "Crystal Oscillator", "Alclad Aluminum Sheet")), ), "Neural-Quantum Processor": ( diff --git a/worlds/satisfactory/Items.py b/worlds/satisfactory/Items.py index 1184d3369e..4f59d906f4 100644 --- a/worlds/satisfactory/Items.py +++ b/worlds/satisfactory/Items.py @@ -472,8 +472,9 @@ class Items: "Recipe: Nobelisk Detonator": ItemData(G.Recipe, 1338465, C.progression), "Recipe: Portable Miner": ItemData(G.Recipe, 1338466, C.progression), # + "Recipe: Dark Matter Residue": ItemData(G.Recipe, 1338467, C.progression), - #1338467 - 1338599 Reserved for future recipes + #1338468 - 1338599 Reserved for future recipes #1338400 - 1338899 buildings / others "Building: Constructor": ItemData(G.Building, 1338600, C.progression), # unlocked by default "Building: Assembler": ItemData(G.Building, 1338601, C.progression),