Subnautica: add logic dumper for mod (#1386)

* Subnautica: add logic dumper for mod

* Subnautica: export more data

* Subnautica: fix some Cyclops logic
This commit is contained in:
Fabian Dill 2023-02-16 00:40:19 +01:00 committed by GitHub
parent ad4846cedd
commit a85ca9cc87
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 34 additions and 6 deletions

View File

@ -571,9 +571,35 @@ location_table: Dict[int, LocationDict] = {
'need_laser_cutter': False, 'need_laser_cutter': False,
'position': {'x': 83.2, 'y': -276.4, 'z': -345.5}}, '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: with open("locations.json", "w") as f:
json.dump(payload, 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)

View File

@ -71,8 +71,8 @@ def has_cyclops(state: "CollectionState", player: int) -> bool:
def has_cyclops_depth_module_mk1(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 \ # Crafted in the Cyclops, so we don't need to check for crafting station
has_modification_station(state, player) return state.has("Cyclops Depth Module MK1", player)
def has_cyclops_depth_module_mk2(state: "CollectionState", player: int) -> bool: def has_cyclops_depth_module_mk2(state: "CollectionState", player: int) -> bool:

View File

@ -34,7 +34,7 @@ class SubnauticaWorld(World):
an unknown bacteria. The planet's automatic quarantine will shoot you down if you try to leave. 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. You must find a cure for yourself, build an escape rocket, and leave the planet.
""" """
game: str = "Subnautica" game = "Subnautica"
web = SubnaticaWeb() web = SubnaticaWeb()
item_name_to_id = {data["name"]: item_id for item_id, data in Items.item_table.items()} 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]: def fill_slot_data(self) -> Dict[str, Any]:
goal: Options.Goal = self.multiworld.goal[self.player] goal: Options.Goal = self.multiworld.goal[self.player]
item_pool: Options.ItemPool = self.multiworld.item_pool[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] = [] vanilla_tech: List[str] = []
if item_pool == Options.ItemPool.option_valuable: if item_pool == Options.ItemPool.option_valuable:
for item in Items.item_table.values(): for item in Items.item_table.values():
@ -120,6 +121,7 @@ class SubnauticaWorld(World):
slot_data: Dict[str, Any] = { slot_data: Dict[str, Any] = {
"goal": goal.current_key, "goal": goal.current_key,
"swim_rule": swim_rule.current_key,
"vanilla_tech": vanilla_tech, "vanilla_tech": vanilla_tech,
"creatures_to_scan": self.creatures_to_scan, "creatures_to_scan": self.creatures_to_scan,
"death_link": self.multiworld.death_link[self.player].value, "death_link": self.multiworld.death_link[self.player].value,