diff --git a/worlds/subnautica/Items.py b/worlds/subnautica/Items.py index c9c886ac..a5ccc1fb 100644 --- a/worlds/subnautica/Items.py +++ b/worlds/subnautica/Items.py @@ -41,11 +41,11 @@ item_table: Dict[int, ItemDict] = { 35007: {'classification': ItemClassification.filler, 'count': 1, 'name': 'Stillsuit', - 'tech_type': 'Stillsuit'}, + 'tech_type': 'WaterFiltrationSuitFragment'}, 35008: {'classification': ItemClassification.progression, - 'count': 2, - 'name': 'Alien Containment Fragment', - 'tech_type': 'BaseWaterParkFragment'}, + 'count': 1, + 'name': 'Alien Containment', + 'tech_type': 'BaseWaterPark'}, 35009: {'classification': ItemClassification.useful, 'count': 1, 'name': 'Creature Decoy', @@ -91,15 +91,15 @@ item_table: Dict[int, ItemDict] = { 'name': 'Bioreactor Fragment', 'tech_type': 'BaseBioReactorFragment'}, 35020: {'classification': ItemClassification.progression, - 'count': 3, + 'count': 4, 'name': 'Cyclops Bridge Fragment', 'tech_type': 'CyclopsBridgeFragment'}, 35021: {'classification': ItemClassification.progression, - 'count': 3, + 'count': 4, 'name': 'Cyclops Engine Fragment', 'tech_type': 'CyclopsEngineFragment'}, 35022: {'classification': ItemClassification.progression, - 'count': 3, + 'count': 4, 'name': 'Cyclops Hull Fragment', 'tech_type': 'CyclopsHullFragment'}, 35023: {'classification': ItemClassification.filler, @@ -111,11 +111,11 @@ item_table: Dict[int, ItemDict] = { 'name': 'Laser Cutter Fragment', 'tech_type': 'LaserCutterFragment'}, 35025: {'classification': ItemClassification.filler, - 'count': 1, + 'count': 2, 'name': 'Light Stick Fragment', 'tech_type': 'TechlightFragment'}, 35026: {'classification': ItemClassification.progression, - 'count': 4, + 'count': 5, 'name': 'Mobile Vehicle Bay Fragment', 'tech_type': 'ConstructorFragment'}, 35027: {'classification': ItemClassification.progression, @@ -139,7 +139,7 @@ item_table: Dict[int, ItemDict] = { 'name': 'Power Transmitter Fragment', 'tech_type': 'PowerTransmitterFragment'}, 35032: {'classification': ItemClassification.progression, - 'count': 5, + 'count': 6, 'name': 'Prawn Suit Fragment', 'tech_type': 'ExosuitFragment'}, 35033: {'classification': ItemClassification.useful, @@ -163,7 +163,7 @@ item_table: Dict[int, ItemDict] = { 'name': 'Scanner Room Fragment', 'tech_type': 'BaseMapRoomFragment'}, 35038: {'classification': ItemClassification.progression, - 'count': 4, + 'count': 5, 'name': 'Seamoth Fragment', 'tech_type': 'SeamothFragment'}, 35039: {'classification': ItemClassification.progression, @@ -196,8 +196,8 @@ item_table: Dict[int, ItemDict] = { 'tech_type': 'PrecursorIonPowerCell'}, 35046: {'classification': ItemClassification.filler, 'count': 2, - 'name': 'Exterior Growbed Fragment', - 'tech_type': 'FarmingTrayFragment'}, + 'name': 'Exterior Growbed', + 'tech_type': 'FarmingTray'}, 35047: {'classification': ItemClassification.filler, 'count': 1, 'name': 'Picture Frame', @@ -219,23 +219,23 @@ item_table: Dict[int, ItemDict] = { 'name': 'Plant Shelf', 'tech_type': 'PlanterShelfFragment'}, 35052: {'classification': ItemClassification.filler, - 'count': 2, - 'name': 'Observatory Fragment', - 'tech_type': 'BaseObservatoryFragment'}, + 'count': 1, + 'name': 'Observatory', + 'tech_type': 'BaseObservatory'}, 35053: {'classification': ItemClassification.progression, 'count': 2, 'name': 'Multipurpose Room', 'tech_type': 'BaseRoom'}, 35054: {'classification': ItemClassification.useful, - 'count': 2, - 'name': 'Bulkhead Fragment', - 'tech_type': 'BaseBulkheadFragment'}, + 'count': 1, + 'name': 'Bulkhead', + 'tech_type': 'BaseBulkhead'}, 35055: {'classification': ItemClassification.filler, 'count': 1, 'name': 'Spotlight', 'tech_type': 'Spotlight'}, 35056: {'classification': ItemClassification.filler, - 'count': 2, + 'count': 1, 'name': 'Desk', 'tech_type': 'StarshipDesk'}, 35057: {'classification': ItemClassification.filler, @@ -251,7 +251,7 @@ item_table: Dict[int, ItemDict] = { 'name': 'Command Chair', 'tech_type': 'StarshipChair3'}, 35060: {'classification': ItemClassification.filler, - 'count': 2, + 'count': 1, 'name': 'Counter', 'tech_type': 'LabCounter'}, 35061: {'classification': ItemClassification.filler, @@ -267,11 +267,11 @@ item_table: Dict[int, ItemDict] = { 'name': 'Quilted Double Bed', 'tech_type': 'Bed2'}, 35064: {'classification': ItemClassification.filler, - 'count': 2, + 'count': 1, 'name': 'Coffee Vending Machine', 'tech_type': 'CoffeeVendingMachine'}, 35065: {'classification': ItemClassification.filler, - 'count': 2, + 'count': 1, 'name': 'Trash Can', 'tech_type': 'Trashcans'}, 35066: {'classification': ItemClassification.filler, @@ -338,6 +338,28 @@ item_table: Dict[int, ItemDict] = { 'count': 1, 'name': 'Ultra High Capacity Tank', 'tech_type': 'HighCapacityTank'}, + # these currently unlock through some special sauce in Subnautica, unlike any established other + # keeping here for later + 35082: {'classification': ItemClassification.progression, + 'count': 0, + 'name': 'Large Room', + 'tech_type': 'BaseLargeRoom'}, + 35083: {'classification': ItemClassification.filler, + 'count': 0, + 'name': 'Large Room Glass Dome', + 'tech_type': 'BaseLargeGlassDome'}, + 35084: {'classification': ItemClassification.filler, + 'count': 0, + 'name': 'Multipurpose Room Glass Dome', + 'tech_type': 'BaseGlassDome'}, + 35085: {'classification': ItemClassification.filler, + 'count': 0, + 'name': 'Partition', + 'tech_type': 'BasePartition'}, + 35086: {'classification': ItemClassification.filler, + 'count': 0, + 'name': 'Partition Door', + 'tech_type': 'BasePartitionDoor'}, } advancement_item_names: Set[str] = set() @@ -351,6 +373,9 @@ for item_id, item_data in item_table.items(): non_advancement_item_names.add(item_name) if False: # turn to True to export for Subnautica mod + from .Locations import location_table + itemcount = sum(item_data["count"] for item_data in item_table.values()) + assert itemcount == len(location_table), f"{itemcount} != {len(location_table)}" payload = {item_id: item_data["tech_type"] for item_id, item_data in item_table.items()} import json diff --git a/worlds/subnautica/Rules.py b/worlds/subnautica/Rules.py index c978b6a1..673c8442 100644 --- a/worlds/subnautica/Rules.py +++ b/worlds/subnautica/Rules.py @@ -113,7 +113,11 @@ def has_stasis_rifle(state: "CollectionState", player: int) -> bool: def has_containment(state: "CollectionState", player: int) -> bool: - return state.has("Alien Containment Fragment", player, 2) and state.has("Multipurpose Room", player) + return state.has("Alien Containment", player) and has_utility_room(state, player) + + +def has_utility_room(state: "CollectionState", player: int) -> bool: + return state.has("Large Room", player) or state.has("Multipurpose Room", player) # Either we have propulsion cannon, or prawn + propulsion cannon arm diff --git a/worlds/subnautica/__init__.py b/worlds/subnautica/__init__.py index 33d1f019..0f793af9 100644 --- a/worlds/subnautica/__init__.py +++ b/worlds/subnautica/__init__.py @@ -41,8 +41,8 @@ class SubnauticaWorld(World): location_name_to_id = all_locations option_definitions = Options.options - data_version = 7 - required_client_version = (0, 3, 6) + data_version = 8 + required_client_version = (0, 3, 7) creatures_to_scan: List[str] diff --git a/worlds/subnautica/docs/setup_en.md b/worlds/subnautica/docs/setup_en.md index bd4a92cc..f6ce09eb 100644 --- a/worlds/subnautica/docs/setup_en.md +++ b/worlds/subnautica/docs/setup_en.md @@ -3,17 +3,14 @@ ## Required Software - Subnautica from: [Subnautica Steam Store Page](https://store.steampowered.com/app/264710/Subnautica/) -- QModManager4 from: [QModManager4 Nexus Mods Page](https://www.nexusmods.com/subnautica/mods/201) - Archipelago Mod for Subnautica from: [Subnautica Archipelago Mod Releases Page](https://github.com/Berserker66/ArchipelagoSubnauticaModSrc/releases) ## Installation Procedure -1. Install QModManager4 as per its instructions. +1. Unpack the Archipelago Mod into your Subnautica folder, so that `Subnautica/BepInEx` is a valid path. -2. The Subnautica game directory should now contain a `QMods` folder. Unpack the Archipelago Mod into this folder, so that `Subnautica/QMods/Archipelago/` is a valid path. - -3. Start Subnautica. You should see a connect form with three text boxes in the top left of your main menu. +2. Start Subnautica. You should see a connect form with three text boxes in the top left of your main menu. ## Connecting @@ -36,6 +33,7 @@ Warning: Currently it is not checked whether a loaded savegame belongs to the mu ## Console Commands The mod adds the following console commands: + - `say` sends the text following it to Archipelago as a chat message. ! is not an allowed character, use / instead. - `silent` toggles Archipelago chat messages appearing. - `deathlink` toggles death link. @@ -51,6 +49,6 @@ To enter a console command, press `Enter`. ## Troubleshooting -If you don't see the connect form on the main menu screen, check whether you see a file named `qmodmanager_log-Subnautica.txt` in the Subnautica game directory. If not, -QModManager4 is not correctly installed, otherwise open it and look for `Loading [Archipelago`. If the file doesn't contain this text, then -QModManager4 didn't find the Archipelago mod, so check your paths. +If you don't see the connect form on the main menu screen, check whether you see a file named `LogOutput.txt` in the Subnautica/BepInEx directory. +If not, BepInEx is not correctly installed, otherwise open it and look for `Plugin Archipelago is loaded!`. +If the file doesn't contain this text, then BepInEx didn't find the Archipelago mod, so check your paths.