From a85ca9cc87a1ceb7455a9aa4380244956b85c73c Mon Sep 17 00:00:00 2001 From: Fabian Dill Date: Thu, 16 Feb 2023 00:40:19 +0100 Subject: [PATCH] Subnautica: add logic dumper for mod (#1386) * Subnautica: add logic dumper for mod * Subnautica: export more data * Subnautica: fix some Cyclops logic --- worlds/subnautica/Locations.py | 32 +++++++++++++++++++++++++++++--- worlds/subnautica/Rules.py | 4 ++-- worlds/subnautica/__init__.py | 4 +++- 3 files changed, 34 insertions(+), 6 deletions(-) diff --git a/worlds/subnautica/Locations.py b/worlds/subnautica/Locations.py index 2dfeaf3b..9408094d 100644 --- a/worlds/subnautica/Locations.py +++ b/worlds/subnautica/Locations.py @@ -571,9 +571,35 @@ location_table: Dict[int, LocationDict] = { 'need_laser_cutter': False, 'position': {'x': 83.2, 'y': -276.4, 'z': -345.5}}, } -if False: # turn to True to export for Subnautica mod - payload = {location_id: location_data["position"] for location_id, location_data in location_table.items()} - import json +if False: # turn to True to export for Subnautica mod + import json + import math + + payload = {location_id: location_data["position"] for location_id, location_data in location_table.items()} with open("locations.json", "w") as f: json.dump(payload, f) + + def radiated(pos: Vector): + aurora_dist = math.sqrt((pos["x"] - 1038.0) ** 2 + (pos["y"] - -3.4) ** 2 + (pos["y"] - -163.1) ** 2) + return aurora_dist < 950 + + def far_away(pos: Vector): + return (pos["x"] ** 2 + pos["z"] ** 2) > (800 ** 2) + + payload = { + # "LaserCutter" in Subnautica ID + "761": [location_id for location_id, location_data + in location_table.items() if location_data["need_laser_cutter"]], + # PropulsionCannon in Subnautica ID + "757": [location_id for location_id, location_data + in location_table.items() if location_data.get("need_propulsion_cannon", False)], + # Radiation Suit in Subnautica ID + "519": [location_id for location_id, location_data + in location_table.items() if radiated(location_data["position"])], + # SeaGlide in Subnautica ID + "751": [location_id for location_id, location_data + in location_table.items() if far_away(location_data["position"])], + } + with open("logic.json", "w") as f: + json.dump(payload, f) diff --git a/worlds/subnautica/Rules.py b/worlds/subnautica/Rules.py index 62830264..48db25a8 100644 --- a/worlds/subnautica/Rules.py +++ b/worlds/subnautica/Rules.py @@ -71,8 +71,8 @@ def has_cyclops(state: "CollectionState", player: int) -> bool: def has_cyclops_depth_module_mk1(state: "CollectionState", player: int) -> bool: - return state.has("Cyclops Depth Module MK1", player) and \ - has_modification_station(state, player) + # Crafted in the Cyclops, so we don't need to check for crafting station + return state.has("Cyclops Depth Module MK1", player) def has_cyclops_depth_module_mk2(state: "CollectionState", player: int) -> bool: diff --git a/worlds/subnautica/__init__.py b/worlds/subnautica/__init__.py index 9186fad4..b70e4acb 100644 --- a/worlds/subnautica/__init__.py +++ b/worlds/subnautica/__init__.py @@ -34,7 +34,7 @@ class SubnauticaWorld(World): an unknown bacteria. The planet's automatic quarantine will shoot you down if you try to leave. You must find a cure for yourself, build an escape rocket, and leave the planet. """ - game: str = "Subnautica" + game = "Subnautica" web = SubnaticaWeb() item_name_to_id = {data["name"]: item_id for item_id, data in Items.item_table.items()} @@ -112,6 +112,7 @@ class SubnauticaWorld(World): def fill_slot_data(self) -> Dict[str, Any]: goal: Options.Goal = self.multiworld.goal[self.player] item_pool: Options.ItemPool = self.multiworld.item_pool[self.player] + swim_rule: Options.SwimRule = self.multiworld.swim_rule[self.player] vanilla_tech: List[str] = [] if item_pool == Options.ItemPool.option_valuable: for item in Items.item_table.values(): @@ -120,6 +121,7 @@ class SubnauticaWorld(World): slot_data: Dict[str, Any] = { "goal": goal.current_key, + "swim_rule": swim_rule.current_key, "vanilla_tech": vanilla_tech, "creatures_to_scan": self.creatures_to_scan, "death_link": self.multiworld.death_link[self.player].value,