Subnautica: 2.0 compatibility (#1329)
This commit is contained in:
parent
37b7f0d32d
commit
e0be79639c
worlds/subnautica
|
@ -41,11 +41,11 @@ item_table: Dict[int, ItemDict] = {
|
||||||
35007: {'classification': ItemClassification.filler,
|
35007: {'classification': ItemClassification.filler,
|
||||||
'count': 1,
|
'count': 1,
|
||||||
'name': 'Stillsuit',
|
'name': 'Stillsuit',
|
||||||
'tech_type': 'Stillsuit'},
|
'tech_type': 'WaterFiltrationSuitFragment'},
|
||||||
35008: {'classification': ItemClassification.progression,
|
35008: {'classification': ItemClassification.progression,
|
||||||
'count': 2,
|
'count': 1,
|
||||||
'name': 'Alien Containment Fragment',
|
'name': 'Alien Containment',
|
||||||
'tech_type': 'BaseWaterParkFragment'},
|
'tech_type': 'BaseWaterPark'},
|
||||||
35009: {'classification': ItemClassification.useful,
|
35009: {'classification': ItemClassification.useful,
|
||||||
'count': 1,
|
'count': 1,
|
||||||
'name': 'Creature Decoy',
|
'name': 'Creature Decoy',
|
||||||
|
@ -91,15 +91,15 @@ item_table: Dict[int, ItemDict] = {
|
||||||
'name': 'Bioreactor Fragment',
|
'name': 'Bioreactor Fragment',
|
||||||
'tech_type': 'BaseBioReactorFragment'},
|
'tech_type': 'BaseBioReactorFragment'},
|
||||||
35020: {'classification': ItemClassification.progression,
|
35020: {'classification': ItemClassification.progression,
|
||||||
'count': 3,
|
'count': 4,
|
||||||
'name': 'Cyclops Bridge Fragment',
|
'name': 'Cyclops Bridge Fragment',
|
||||||
'tech_type': 'CyclopsBridgeFragment'},
|
'tech_type': 'CyclopsBridgeFragment'},
|
||||||
35021: {'classification': ItemClassification.progression,
|
35021: {'classification': ItemClassification.progression,
|
||||||
'count': 3,
|
'count': 4,
|
||||||
'name': 'Cyclops Engine Fragment',
|
'name': 'Cyclops Engine Fragment',
|
||||||
'tech_type': 'CyclopsEngineFragment'},
|
'tech_type': 'CyclopsEngineFragment'},
|
||||||
35022: {'classification': ItemClassification.progression,
|
35022: {'classification': ItemClassification.progression,
|
||||||
'count': 3,
|
'count': 4,
|
||||||
'name': 'Cyclops Hull Fragment',
|
'name': 'Cyclops Hull Fragment',
|
||||||
'tech_type': 'CyclopsHullFragment'},
|
'tech_type': 'CyclopsHullFragment'},
|
||||||
35023: {'classification': ItemClassification.filler,
|
35023: {'classification': ItemClassification.filler,
|
||||||
|
@ -111,11 +111,11 @@ item_table: Dict[int, ItemDict] = {
|
||||||
'name': 'Laser Cutter Fragment',
|
'name': 'Laser Cutter Fragment',
|
||||||
'tech_type': 'LaserCutterFragment'},
|
'tech_type': 'LaserCutterFragment'},
|
||||||
35025: {'classification': ItemClassification.filler,
|
35025: {'classification': ItemClassification.filler,
|
||||||
'count': 1,
|
'count': 2,
|
||||||
'name': 'Light Stick Fragment',
|
'name': 'Light Stick Fragment',
|
||||||
'tech_type': 'TechlightFragment'},
|
'tech_type': 'TechlightFragment'},
|
||||||
35026: {'classification': ItemClassification.progression,
|
35026: {'classification': ItemClassification.progression,
|
||||||
'count': 4,
|
'count': 5,
|
||||||
'name': 'Mobile Vehicle Bay Fragment',
|
'name': 'Mobile Vehicle Bay Fragment',
|
||||||
'tech_type': 'ConstructorFragment'},
|
'tech_type': 'ConstructorFragment'},
|
||||||
35027: {'classification': ItemClassification.progression,
|
35027: {'classification': ItemClassification.progression,
|
||||||
|
@ -139,7 +139,7 @@ item_table: Dict[int, ItemDict] = {
|
||||||
'name': 'Power Transmitter Fragment',
|
'name': 'Power Transmitter Fragment',
|
||||||
'tech_type': 'PowerTransmitterFragment'},
|
'tech_type': 'PowerTransmitterFragment'},
|
||||||
35032: {'classification': ItemClassification.progression,
|
35032: {'classification': ItemClassification.progression,
|
||||||
'count': 5,
|
'count': 6,
|
||||||
'name': 'Prawn Suit Fragment',
|
'name': 'Prawn Suit Fragment',
|
||||||
'tech_type': 'ExosuitFragment'},
|
'tech_type': 'ExosuitFragment'},
|
||||||
35033: {'classification': ItemClassification.useful,
|
35033: {'classification': ItemClassification.useful,
|
||||||
|
@ -163,7 +163,7 @@ item_table: Dict[int, ItemDict] = {
|
||||||
'name': 'Scanner Room Fragment',
|
'name': 'Scanner Room Fragment',
|
||||||
'tech_type': 'BaseMapRoomFragment'},
|
'tech_type': 'BaseMapRoomFragment'},
|
||||||
35038: {'classification': ItemClassification.progression,
|
35038: {'classification': ItemClassification.progression,
|
||||||
'count': 4,
|
'count': 5,
|
||||||
'name': 'Seamoth Fragment',
|
'name': 'Seamoth Fragment',
|
||||||
'tech_type': 'SeamothFragment'},
|
'tech_type': 'SeamothFragment'},
|
||||||
35039: {'classification': ItemClassification.progression,
|
35039: {'classification': ItemClassification.progression,
|
||||||
|
@ -196,8 +196,8 @@ item_table: Dict[int, ItemDict] = {
|
||||||
'tech_type': 'PrecursorIonPowerCell'},
|
'tech_type': 'PrecursorIonPowerCell'},
|
||||||
35046: {'classification': ItemClassification.filler,
|
35046: {'classification': ItemClassification.filler,
|
||||||
'count': 2,
|
'count': 2,
|
||||||
'name': 'Exterior Growbed Fragment',
|
'name': 'Exterior Growbed',
|
||||||
'tech_type': 'FarmingTrayFragment'},
|
'tech_type': 'FarmingTray'},
|
||||||
35047: {'classification': ItemClassification.filler,
|
35047: {'classification': ItemClassification.filler,
|
||||||
'count': 1,
|
'count': 1,
|
||||||
'name': 'Picture Frame',
|
'name': 'Picture Frame',
|
||||||
|
@ -219,23 +219,23 @@ item_table: Dict[int, ItemDict] = {
|
||||||
'name': 'Plant Shelf',
|
'name': 'Plant Shelf',
|
||||||
'tech_type': 'PlanterShelfFragment'},
|
'tech_type': 'PlanterShelfFragment'},
|
||||||
35052: {'classification': ItemClassification.filler,
|
35052: {'classification': ItemClassification.filler,
|
||||||
'count': 2,
|
'count': 1,
|
||||||
'name': 'Observatory Fragment',
|
'name': 'Observatory',
|
||||||
'tech_type': 'BaseObservatoryFragment'},
|
'tech_type': 'BaseObservatory'},
|
||||||
35053: {'classification': ItemClassification.progression,
|
35053: {'classification': ItemClassification.progression,
|
||||||
'count': 2,
|
'count': 2,
|
||||||
'name': 'Multipurpose Room',
|
'name': 'Multipurpose Room',
|
||||||
'tech_type': 'BaseRoom'},
|
'tech_type': 'BaseRoom'},
|
||||||
35054: {'classification': ItemClassification.useful,
|
35054: {'classification': ItemClassification.useful,
|
||||||
'count': 2,
|
'count': 1,
|
||||||
'name': 'Bulkhead Fragment',
|
'name': 'Bulkhead',
|
||||||
'tech_type': 'BaseBulkheadFragment'},
|
'tech_type': 'BaseBulkhead'},
|
||||||
35055: {'classification': ItemClassification.filler,
|
35055: {'classification': ItemClassification.filler,
|
||||||
'count': 1,
|
'count': 1,
|
||||||
'name': 'Spotlight',
|
'name': 'Spotlight',
|
||||||
'tech_type': 'Spotlight'},
|
'tech_type': 'Spotlight'},
|
||||||
35056: {'classification': ItemClassification.filler,
|
35056: {'classification': ItemClassification.filler,
|
||||||
'count': 2,
|
'count': 1,
|
||||||
'name': 'Desk',
|
'name': 'Desk',
|
||||||
'tech_type': 'StarshipDesk'},
|
'tech_type': 'StarshipDesk'},
|
||||||
35057: {'classification': ItemClassification.filler,
|
35057: {'classification': ItemClassification.filler,
|
||||||
|
@ -251,7 +251,7 @@ item_table: Dict[int, ItemDict] = {
|
||||||
'name': 'Command Chair',
|
'name': 'Command Chair',
|
||||||
'tech_type': 'StarshipChair3'},
|
'tech_type': 'StarshipChair3'},
|
||||||
35060: {'classification': ItemClassification.filler,
|
35060: {'classification': ItemClassification.filler,
|
||||||
'count': 2,
|
'count': 1,
|
||||||
'name': 'Counter',
|
'name': 'Counter',
|
||||||
'tech_type': 'LabCounter'},
|
'tech_type': 'LabCounter'},
|
||||||
35061: {'classification': ItemClassification.filler,
|
35061: {'classification': ItemClassification.filler,
|
||||||
|
@ -267,11 +267,11 @@ item_table: Dict[int, ItemDict] = {
|
||||||
'name': 'Quilted Double Bed',
|
'name': 'Quilted Double Bed',
|
||||||
'tech_type': 'Bed2'},
|
'tech_type': 'Bed2'},
|
||||||
35064: {'classification': ItemClassification.filler,
|
35064: {'classification': ItemClassification.filler,
|
||||||
'count': 2,
|
'count': 1,
|
||||||
'name': 'Coffee Vending Machine',
|
'name': 'Coffee Vending Machine',
|
||||||
'tech_type': 'CoffeeVendingMachine'},
|
'tech_type': 'CoffeeVendingMachine'},
|
||||||
35065: {'classification': ItemClassification.filler,
|
35065: {'classification': ItemClassification.filler,
|
||||||
'count': 2,
|
'count': 1,
|
||||||
'name': 'Trash Can',
|
'name': 'Trash Can',
|
||||||
'tech_type': 'Trashcans'},
|
'tech_type': 'Trashcans'},
|
||||||
35066: {'classification': ItemClassification.filler,
|
35066: {'classification': ItemClassification.filler,
|
||||||
|
@ -338,6 +338,28 @@ item_table: Dict[int, ItemDict] = {
|
||||||
'count': 1,
|
'count': 1,
|
||||||
'name': 'Ultra High Capacity Tank',
|
'name': 'Ultra High Capacity Tank',
|
||||||
'tech_type': 'HighCapacityTank'},
|
'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()
|
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)
|
non_advancement_item_names.add(item_name)
|
||||||
|
|
||||||
if False: # turn to True to export for Subnautica mod
|
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()}
|
payload = {item_id: item_data["tech_type"] for item_id, item_data in item_table.items()}
|
||||||
import json
|
import json
|
||||||
|
|
||||||
|
|
|
@ -113,7 +113,11 @@ def has_stasis_rifle(state: "CollectionState", player: int) -> bool:
|
||||||
|
|
||||||
|
|
||||||
def has_containment(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
|
# Either we have propulsion cannon, or prawn + propulsion cannon arm
|
||||||
|
|
|
@ -41,8 +41,8 @@ class SubnauticaWorld(World):
|
||||||
location_name_to_id = all_locations
|
location_name_to_id = all_locations
|
||||||
option_definitions = Options.options
|
option_definitions = Options.options
|
||||||
|
|
||||||
data_version = 7
|
data_version = 8
|
||||||
required_client_version = (0, 3, 6)
|
required_client_version = (0, 3, 7)
|
||||||
|
|
||||||
creatures_to_scan: List[str]
|
creatures_to_scan: List[str]
|
||||||
|
|
||||||
|
|
|
@ -3,17 +3,14 @@
|
||||||
## Required Software
|
## Required Software
|
||||||
|
|
||||||
- Subnautica from: [Subnautica Steam Store Page](https://store.steampowered.com/app/264710/Subnautica/)
|
- 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
|
- Archipelago Mod for Subnautica
|
||||||
from: [Subnautica Archipelago Mod Releases Page](https://github.com/Berserker66/ArchipelagoSubnauticaModSrc/releases)
|
from: [Subnautica Archipelago Mod Releases Page](https://github.com/Berserker66/ArchipelagoSubnauticaModSrc/releases)
|
||||||
|
|
||||||
## Installation Procedure
|
## 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.
|
2. Start Subnautica. You should see a connect form with three text boxes in the top left of your main menu.
|
||||||
|
|
||||||
3. Start Subnautica. You should see a connect form with three text boxes in the top left of your main menu.
|
|
||||||
|
|
||||||
## Connecting
|
## Connecting
|
||||||
|
|
||||||
|
@ -36,6 +33,7 @@ Warning: Currently it is not checked whether a loaded savegame belongs to the mu
|
||||||
## Console Commands
|
## Console Commands
|
||||||
|
|
||||||
The mod adds the following 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.
|
- `silent` toggles Archipelago chat messages appearing.
|
||||||
- `deathlink` toggles death link.
|
- `deathlink` toggles death link.
|
||||||
|
|
||||||
|
@ -51,6 +49,6 @@ To enter a console command, press `Enter`.
|
||||||
|
|
||||||
## Troubleshooting
|
## 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,
|
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.
|
||||||
QModManager4 is not correctly installed, otherwise open it and look for `Loading [Archipelago`. If the file doesn't contain this text, then
|
If not, BepInEx is not correctly installed, otherwise open it and look for `Plugin Archipelago is loaded!`.
|
||||||
QModManager4 didn't find the Archipelago mod, so check your paths.
|
If the file doesn't contain this text, then BepInEx didn't find the Archipelago mod, so check your paths.
|
||||||
|
|
Loading…
Reference in New Issue