From b05f4d30dffd9693f511cc3a6ad963546dc88806 Mon Sep 17 00:00:00 2001 From: Ixrec Date: Tue, 17 Sep 2024 23:39:32 +0100 Subject: [PATCH] implement split translator --- worlds/outer_wilds/__init__.py | 8 +- worlds/outer_wilds/items.py | 26 +- worlds/outer_wilds/locations_and_regions.py | 16 +- worlds/outer_wilds/options.py | 9 + .../shared_static_logic/items.jsonc | 8 +- .../shared_static_logic/locations.jsonc | 294 +++++++++--------- .../shared_static_logic/static_logic.pickle | Bin 57370 -> 59996 bytes worlds/outer_wilds/test/__init__.py | 26 ++ 8 files changed, 230 insertions(+), 157 deletions(-) diff --git a/worlds/outer_wilds/__init__.py b/worlds/outer_wilds/__init__.py index 6d94a606e456..b84569f8328b 100644 --- a/worlds/outer_wilds/__init__.py +++ b/worlds/outer_wilds/__init__.py @@ -142,7 +142,13 @@ def set_rules(self) -> None: self.multiworld.completion_condition[self.player] = lambda state: state.has(goal_item, self.player) def fill_slot_data(self): - slot_data = self.options.as_dict("goal", "death_link", "logsanity", "spawn", "enable_eote_dlc", "dlc_only") + slot_data = self.options.as_dict( + "death_link", # a client/mod feature + "goal", "spawn", # affects tons of stuff, but also a client/mod faeture + "logsanity", "enable_eote_dlc", "dlc_only", # changes AP locations, needed by in-game tracker + "split_translator" # changes AP items, and how client/mod implements Translator + ) + # more client/mod features, these are only in the apworld because we want them fixed per-slot/at gen time slot_data["eotu_coordinates"] = self.eotu_coordinates slot_data["db_layout"] = self.db_layout slot_data["planet_order"] = self.planet_order diff --git a/worlds/outer_wilds/items.py b/worlds/outer_wilds/items.py index 65305d2cdb52..2c7ddced8a9f 100644 --- a/worlds/outer_wilds/items.py +++ b/worlds/outer_wilds/items.py @@ -20,6 +20,7 @@ class OuterWildsItemData(NamedTuple): code: Optional[int] = None type: ItemClassification = ItemClassification.filler category: Optional[str] = None + split_translator: Optional[bool] = None pickled_data = pkgutil.get_data(__name__, "shared_static_logic/static_logic.pickle") @@ -38,6 +39,7 @@ class OuterWildsItemData(NamedTuple): code=(items_data_entry["code"] if "code" in items_data_entry else None), type=item_types_map[items_data_entry["type"]], category=(items_data_entry["category"] if "category" in items_data_entry else None), + split_translator=(items_data_entry["split_translator"] if "split_translator" in items_data_entry else None), ) all_non_event_items_table = {name: data.code for name, data in item_data_table.items() if data.code is not None} @@ -80,6 +82,12 @@ class OuterWildsItemData(NamedTuple): }, "Tools": { "Translator", + "Translator (Hourglass Twins)", + "Translator (Timber Hearth)", + "Translator (Brittle Hollow)", + "Translator (Giant's Deep)", + "Translator (Dark Bramble)", + "Translator (Other)", "Signalscope", "Scout", "Ghost Matter Wavelength", @@ -181,6 +189,8 @@ def create_items(world: "OuterWildsWorld") -> None: instances = 1 if name in repeated_prog_useful_items: instances = repeated_prog_useful_items[name] + if item.split_translator is not None and item.split_translator != options.split_translator: + instances = 0 for _ in range(0, instances): prog_and_useful_items.append(create_item(player, name)) @@ -230,14 +240,26 @@ def create_items(world: "OuterWildsWorld") -> None: multiworld.itempool += itempool if options.early_key_item: + relevant_translator = "Translator" + if options.split_translator: + if options.spawn == Spawn.option_hourglass_twins: + relevant_translator = "Translator (Hourglass Twins)" + if options.spawn == Spawn.option_timber_hearth: + relevant_translator = "Translator (Timber Hearth)" + if options.spawn == Spawn.option_brittle_hollow: + relevant_translator = "Translator (Brittle Hollow)" + if options.spawn == Spawn.option_giants_deep: + relevant_translator = "Translator (Giant's Deep)" + # ignore stranger spawn since it won't offer a Translator at all + key_item = None if options.early_key_item == EarlyKeyItem.option_any: if options.spawn == Spawn.option_stranger: key_item = random.choice(["Launch Codes", "Stranger Light Modulator"]) else: - key_item = random.choice(["Translator", "Nomai Warp Codes", "Launch Codes"]) + key_item = random.choice([relevant_translator, "Nomai Warp Codes", "Launch Codes"]) elif options.early_key_item == EarlyKeyItem.option_translator: - key_item = "Translator" + key_item = relevant_translator elif options.early_key_item == EarlyKeyItem.option_nomai_warp_codes: key_item = "Nomai Warp Codes" elif options.early_key_item == EarlyKeyItem.option_launch_codes: diff --git a/worlds/outer_wilds/locations_and_regions.py b/worlds/outer_wilds/locations_and_regions.py index 39ae1cb6217a..3efda32f4c01 100644 --- a/worlds/outer_wilds/locations_and_regions.py +++ b/worlds/outer_wilds/locations_and_regions.py @@ -119,6 +119,8 @@ def create_regions(world: "OuterWildsWorld") -> None: for region_name in region_data_table.keys(): mw.regions.append(Region(region_name, p, mw)) + split_translator = options.split_translator + # add locations and connections to each region for region_name, region_data in region_data_table.items(): region = mw.get_region(region_name, p) @@ -131,7 +133,7 @@ def create_regions(world: "OuterWildsWorld") -> None: for connection in exit_connections: to = connection["to"] requires = connection["requires"] - rule = None if len(requires) == 0 else lambda state, r=requires: eval_rule(state, p, r) + rule = None if len(requires) == 0 else lambda state, r=requires, st=split_translator: eval_rule(state, p, r, st) entrance = region.connect(mw.get_region(to, p), None, rule) indirect_regions = regions_referenced_by_rule(requires) for indirect_region in indirect_regions: @@ -141,7 +143,7 @@ def create_regions(world: "OuterWildsWorld") -> None: for ld in locations_data: if ld["name"] in locations_to_create and len(ld["requires"]) > 0: set_rule(mw.get_location(ld["name"], p), - lambda state, r=ld["requires"]: eval_rule(state, p, r)) + lambda state, r=ld["requires"], st=split_translator: eval_rule(state, p, r, st)) # add dynamic logic, i.e. connections based on player options menu = mw.get_region("Menu", p) @@ -211,11 +213,11 @@ def rule(state: CollectionState) -> bool: # In particular: this eval_rule() function is the main piece of code which will have to # be implemented in both languages, so it's important we keep the implementations in sync -def eval_rule(state: CollectionState, p: int, rule: [Any]) -> bool: - return all(eval_criterion(state, p, criterion) for criterion in rule) +def eval_rule(state: CollectionState, p: int, rule: [Any], split_translator: bool) -> bool: + return all(eval_criterion(state, p, criterion, split_translator) for criterion in rule) -def eval_criterion(state: CollectionState, p: int, criterion: Any) -> bool: +def eval_criterion(state: CollectionState, p: int, criterion: Any, split_translator: bool) -> bool: # all valid criteria are dicts if isinstance(criterion, dict): # we're only using JSON objects / Python dicts here as discriminated unions, @@ -227,9 +229,11 @@ def eval_criterion(state: CollectionState, p: int, criterion: Any) -> bool: # { "item": "..." } and { "anyOf": [ ... ] } and { "location": "foo" } and { "region": "bar" } # mean exactly what they sound like, and those are the only kinds of criteria. if key == "item" and isinstance(value, str): + if not split_translator and value.startswith("Translator ("): + return state.has("Translator", p) return state.has(value, p) elif key == "anyOf" and isinstance(value, list): - return any(eval_criterion(state, p, sub_criterion) for sub_criterion in value) + return any(eval_criterion(state, p, sub_criterion, split_translator) for sub_criterion in value) elif key == "location" and isinstance(value, str): return state.can_reach(value, "Location", p) elif key == "region" and isinstance(value, str): diff --git a/worlds/outer_wilds/options.py b/worlds/outer_wilds/options.py index 5d51d620b040..15f68157c6dc 100644 --- a/worlds/outer_wilds/options.py +++ b/worlds/outer_wilds/options.py @@ -183,6 +183,14 @@ class DLCOnly(Toggle): display_name = "DLC Only" +class SplitTranslator(Toggle): + """ + Splits the "Translator" item into 6 items: 5 for the main planets and their satellites, plus a + "Translator (Other)" for smaller parts of the vanilla system and systems added by story mods. + """ + display_name = "Split Translator" + + @dataclass class OuterWildsGameOptions(PerGameCommonOptions): start_inventory_from_pool: StartInventoryPool @@ -200,6 +208,7 @@ class OuterWildsGameOptions(PerGameCommonOptions): death_link: DeathLink logsanity: Logsanity shuffle_spacesuit: ShuffleSpacesuit + split_translator: SplitTranslator def get_creation_settings(options: OuterWildsGameOptions) -> Set[str]: diff --git a/worlds/outer_wilds/shared_static_logic/items.jsonc b/worlds/outer_wilds/shared_static_logic/items.jsonc index 5e90781a17eb..eb15c409c6dc 100644 --- a/worlds/outer_wilds/shared_static_logic/items.jsonc +++ b/worlds/outer_wilds/shared_static_logic/items.jsonc @@ -6,7 +6,13 @@ { "code": 1734473681, "name": "Launch Codes", "type": "progression" }, { "code": 1734473732, "name": "Spacesuit", "type": "progression" }, - { "category": "base", "code": 1734473682, "name": "Translator", "type": "progression" }, + { "category": "base", "split_translator": false, "code": 1734473682, "name": "Translator", "type": "progression" }, + { "category": "base", "split_translator": true, "code": 1734473746, "name": "Translator (Hourglass Twins)", "type": "progression" }, + { "category": "base", "split_translator": true, "code": 1734473747, "name": "Translator (Timber Hearth)", "type": "progression" }, + { "category": "base", "split_translator": true, "code": 1734473748, "name": "Translator (Brittle Hollow)", "type": "progression" }, + { "category": "base", "split_translator": true, "code": 1734473749, "name": "Translator (Giant's Deep)", "type": "progression" }, + { "category": "base", "split_translator": true, "code": 1734473750, "name": "Translator (Dark Bramble)", "type": "progression" }, + { "category": "base", "split_translator": true, "code": 1734473751, "name": "Translator (Other)", "type": "progression" }, { "category": "base", "code": 1734473683, "name": "Signalscope", "type": "progression" }, { "code": 1734473684, "name": "Scout", "type": "progression" }, { "code": 1734473685, "name": "Ghost Matter Wavelength", "type": "progression" }, diff --git a/worlds/outer_wilds/shared_static_logic/locations.jsonc b/worlds/outer_wilds/shared_static_logic/locations.jsonc index a6a47fdccac0..39d2233080e1 100644 --- a/worlds/outer_wilds/shared_static_logic/locations.jsonc +++ b/worlds/outer_wilds/shared_static_logic/locations.jsonc @@ -5,42 +5,42 @@ // positive 32-bit integers to avoid conflicts with other AP games { "category": "base", "address": 1085038250, "name": "Sun Station (Projection Stone Text)", - "region": "Sun Station", "requires": [ { "item": "Translator" } ] + "region": "Sun Station", "requires": [ { "item": "Translator (Other)" } ] }, // Ember Twin { "category": "base", "address": 1085038251, "name": "ET: High Energy Lab (Upper Text Wall)", - "region": "Hourglass Twins", "requires": [ { "item": "Translator" }, { "item": "Spacesuit" } ] + "region": "Hourglass Twins", "requires": [ { "item": "Translator (Hourglass Twins)" }, { "item": "Spacesuit" } ] }, { "category": "base", "address": 1085038252, "name": "ET: Sunless City Shrine (Entrance Text Wall)", "region": "Hourglass Twins", "requires": [ - { "item": "Translator" }, + { "item": "Translator (Hourglass Twins)" }, { "item": "Ghost Matter Wavelength" }, { "item": "Spacesuit" } ] }, { "category": "base", "address": 1085038253, "name": "ET: QM Locator (2nd Scroll)", - "region": "Hourglass Twins", "requires": [ { "item": "Translator" } ] + "region": "Hourglass Twins", "requires": [ { "item": "Translator (Hourglass Twins)" } ] }, { "category": "base", "address": 1085038254, "name": "ET: Fossil (Children's Text)", "region": "Hourglass Twins", "requires": [ - { "item": "Translator" }, + { "item": "Translator (Hourglass Twins)" }, { "item": "Scout" }, { "item": "Spacesuit" } ] }, { "category": "base", "address": 1085038255, "name": "ET: Lakebed Cave (Floor Text)", - "region": "Hourglass Twins", "requires": [ { "item": "Translator" }, { "item": "Spacesuit" } ] + "region": "Hourglass Twins", "requires": [ { "item": "Translator (Hourglass Twins)" }, { "item": "Spacesuit" } ] }, { "category": "base", "address": 1085038256, "name": "ET: Coleus' Cave (Text Wall)", "region": "Hourglass Twins", "requires": [ - { "item": "Translator" }, + { "item": "Translator (Hourglass Twins)" }, { "item": "Entanglement Rule" }, { "item": "Spacesuit" } ] @@ -69,11 +69,11 @@ }, { "category": "base", "address": 1085038322, "name": "AT: HGT Towers (Text Wall)", - "region": "Hourglass Twins", "requires": [ { "item": "Translator" } ] + "region": "Hourglass Twins", "requires": [ { "item": "Translator (Hourglass Twins)" } ] }, { "category": "base", "address": 1085038323, "name": "AT: BH Tower (Text Wall)", - "region": "Hourglass Twins", "requires": [ { "item": "Translator" }, { "item": "Spacesuit" } ] + "region": "Hourglass Twins", "requires": [ { "item": "Translator (Hourglass Twins)" }, { "item": "Spacesuit" } ] }, // Timber Hearth @@ -99,7 +99,7 @@ }, { "category": "base", "address": 1085038263, "name": "TH: Mines (Text Wall)", - "region": "Timber Hearth", "requires": [ { "item": "Translator" } ] + "region": "Timber Hearth", "requires": [ { "item": "Translator (Timber Hearth)" } ] }, { "category": "base", "address": 1085038309, "name": "TH: Hornfels' Radio Tower Campfire Note", @@ -113,7 +113,7 @@ // Attlerock { "category": "base", "address": 1085038264, "name": "AR: Signal Locator (Text Wall)", - "region": "Space", "requires": [ { "item": "Translator" } ] + "region": "Space", "requires": [ { "item": "Translator (Timber Hearth)" } ] }, { "category": "base", "address": 1085038311, "name": "AR: Riebeck's Signal Locator Recorder", @@ -139,7 +139,7 @@ // Brittle Hollow { "category": "base", "address": 1085038265, "name": "BH: Southern Observatory (Tornado Text Wall)", - "region": "Brittle Hollow", "requires": [ { "item": "Translator" }, { "item": "Spacesuit" } ] + "region": "Brittle Hollow", "requires": [ { "item": "Translator (Brittle Hollow)" }, { "item": "Spacesuit" } ] }, { "category": "base", "address": 1085038266, "name": "BH: Old Settlement Murals", @@ -148,11 +148,11 @@ { "category": "base", "address": 1085038267, "name": "BH: Forge (2nd Scroll)", "region": "Black Hole Forge", - "requires": [ { "item": "Translator" } ] + "requires": [ { "item": "Translator (Brittle Hollow)" } ] }, { "category": "base", "address": 1085038268, "name": "BH: Tower (Top Floor Text Wall)", - "region": "Brittle Hollow", "requires": [ { "item": "Translator" }, { "item": "Spacesuit" } ] + "region": "Brittle Hollow", "requires": [ { "item": "Translator (Brittle Hollow)" }, { "item": "Spacesuit" } ] }, { "category": "base", "address": 1085038314, "name": "BH: Feldspar's Spare Fuel Note", @@ -170,11 +170,11 @@ "category": "base", "address": 1085038317, "name": "BH: Solanum's Class Report (2nd Scroll)", // Sadly does not require GM Wavelength. You have to avoid a lot of GM, but just looking at // the crystals tell you where the GM is so the camera provides no new information. - "region": "Brittle Hollow", "requires": [ { "item": "Translator" }, { "item": "Spacesuit" } ] + "region": "Brittle Hollow", "requires": [ { "item": "Translator (Brittle Hollow)" }, { "item": "Spacesuit" } ] }, { "category": "base", "address": 1085038318, "name": "BH: Hanging City Shrine (Text Wall)", - "region": "Brittle Hollow", "requires": [ { "item": "Translator" } ] + "region": "Brittle Hollow", "requires": [ { "item": "Translator (Brittle Hollow)" } ] }, { "category": "base", "address": 1085038324, "name": "BH: Visit Hanging City", @@ -192,14 +192,14 @@ // Hollow's Lantern { "category": "base", "address": 1085038269, "name": "HL: Volcanic Testing Site (Text Wall)", - "region": "Space", "requires": [ { "item": "Translator" } ] + "region": "Space", "requires": [ { "item": "Translator (Brittle Hollow)" } ] }, // White Hole Station { "category": "base", "address": 1085038270, "name": "WHS (Text Wall)", // this is a one-location region because it has a warp pad - "region": "White Hole Station", "requires": [ { "item": "Translator" } ] + "region": "White Hole Station", "requires": [ { "item": "Translator (Other)" } ] }, // Giant's Deep @@ -211,7 +211,7 @@ }, { "category": "base", "address": 1085038272, "name": "GD: Control Module Logs (Text Wheels)", - "region": "Space", "requires": [ { "item": "Translator" }, { "item": "Spacesuit" } ] + "region": "Space", "requires": [ { "item": "Translator (Giant's Deep)" }, { "item": "Spacesuit" } ] }, { "category": "base", "address": 1085038273, "name": "GD: Bramble Island Recorder", @@ -219,20 +219,20 @@ }, { "category": "base", "address": 1085038274, "name": "GD: Construction Yard (Text Wall)", - "region": "Giant's Deep", "requires": [ { "item": "Translator" } ] + "region": "Giant's Deep", "requires": [ { "item": "Translator (Giant's Deep)" } ] }, { "category": "base", "address": 1085038275, "name": "GD: Statue Island Workshop (Text Wheel)", - "region": "Giant's Deep", "requires": [ { "item": "Translator" } ] + "region": "Giant's Deep", "requires": [ { "item": "Translator (Giant's Deep)" } ] }, { "category": "base", "address": 1085038276, "name": "GD: Tower Rule (Pedestal Text)", - "region": "Space", "requires": [ { "item": "Translator" }, { "item": "Spacesuit" } ] + "region": "Space", "requires": [ { "item": "Translator (Giant's Deep)" }, { "item": "Spacesuit" } ] }, { "category": "base", "address": 1085038277, "name": "GD: Complete the Tower (Text Wall)", "region": "Space", "requires": [ - { "item": "Translator" }, + { "item": "Translator (Giant's Deep)" }, { "item": "Imaging Rule" }, { "item": "Spacesuit" } ] @@ -270,12 +270,12 @@ // Interloper { "category": "base", "address": 1085038281, "name": "Frozen Shuttle Log (Text Wheel)", - "region": "Frozen Shuttle Log", "requires": [ { "item": "Translator" } ] + "region": "Frozen Shuttle Log", "requires": [ { "item": "Translator (Other)" } ] }, { // spoiler-free name, as opposed to e.g. "Interloper Core" "category": "base", "address": 1085038282, "name": "Ruptured Core (Text Wheel)", - "region": "Interloper Core", "requires": [ { "item": "Translator" } ] + "region": "Interloper Core", "requires": [ { "item": "Translator (Other)" } ] }, // Quantum Moon @@ -285,7 +285,7 @@ }, { "category": "base", "address": 1085038284, "name": "Solanum's Shuttle Log (Text Wheel)", - "region": "Solanum's Shuttle Interior", "requires": [ { "item": "Translator" } ] // text wheel inside shuttle + "region": "Solanum's Shuttle Interior", "requires": [ { "item": "Translator (Other)" } ] // text wheel inside shuttle }, { // spoiler-free name, as opposed to e.g. "Meet Solanum" @@ -307,7 +307,7 @@ }, { "category": "base", "address": 1085038287, "name": "DB: Nomai Grave (Text Wheel)", - "region": "Nomai Grave", "requires": [ { "item": "Translator" } ] + "region": "Nomai Grave", "requires": [ { "item": "Translator (Dark Bramble)" } ] }, { "category": "base", "address": 1085038288, "name": "DB: Find The Vessel", @@ -406,19 +406,19 @@ { "category": "base", "logsanity": true, "address": 1085039000, "name": "Ship Log: Sun Station 1 - Purpose", - "region": "Sun Station", "requires": [ { "item": "Translator" } ] + "region": "Sun Station", "requires": [ { "item": "Translator (Other)" } ] }, { "category": "base", "logsanity": true, "address": 1085039001, "name": "Ship Log: Sun Station 2 - Test Result", - "region": "Sun Station", "requires": [ { "item": "Translator" } ] + "region": "Sun Station", "requires": [ { "item": "Translator (Other)" } ] }, { "category": "base", "logsanity": true, "address": 1085039002, "name": "Ship Log: Sun Station 3 - Comet", - "region": "Sun Station", "requires": [ { "item": "Translator" } ] + "region": "Sun Station", "requires": [ { "item": "Translator (Other)" } ] }, { "category": "base", "logsanity": true, "address": 1085039003, "name": "Ship Log: Sun Station 4 - Current Status", - "region": "Sun Station", "requires": [ { "item": "Translator" } ] + "region": "Sun Station", "requires": [ { "item": "Translator (Other)" } ] }, { @@ -443,15 +443,15 @@ }, { "category": "base", "logsanity": true, "address": 1085039009, "name": "ET Ship Log: QM Locator 1 - Purpose", - "region": "Hourglass Twins", "requires": [ { "item": "Translator" } ] + "region": "Hourglass Twins", "requires": [ { "item": "Translator (Hourglass Twins)" } ] }, { "category": "base", "logsanity": true, "address": 1085039010, "name": "ET Ship Log: QM Locator 2 - Hypothesis", - "region": "Hourglass Twins", "requires": [ { "item": "Translator" } ] + "region": "Hourglass Twins", "requires": [ { "item": "Translator (Hourglass Twins)" } ] }, { "category": "base", "logsanity": true, "address": 1085039011, "name": "ET Ship Log: QM Locator 3 - Five Locations", - "region": "Hourglass Twins", "requires": [ { "item": "Translator" } ] + "region": "Hourglass Twins", "requires": [ { "item": "Translator (Hourglass Twins)" } ] }, { "category": "base", "logsanity": true, "address": 1085039012, "name": "ET Ship Log: Gravity Cannon 1 - Activate", @@ -463,23 +463,23 @@ }, { "category": "base", "logsanity": true, "address": 1085039014, "name": "ET Ship Log: Escape Pod 2 1 - Identify", - "region": "Hourglass Twins", "requires": [ { "item": "Translator" }, { "item": "Spacesuit" } ] + "region": "Hourglass Twins", "requires": [ { "item": "Translator (Hourglass Twins)" }, { "item": "Spacesuit" } ] }, { "category": "base", "logsanity": true, "address": 1085039015, "name": "ET Ship Log: Escape Pod 2 2 - Vessel", - "region": "Hourglass Twins", "requires": [ { "item": "Translator" }, { "item": "Spacesuit" } ] + "region": "Hourglass Twins", "requires": [ { "item": "Translator (Hourglass Twins)" }, { "item": "Spacesuit" } ] }, { "category": "base", "logsanity": true, "address": 1085039016, "name": "ET Ship Log: High Energy Lab 1 - Temporal Anomaly", - "region": "Hourglass Twins", "requires": [ { "item": "Translator" }, { "item": "Spacesuit" } ] + "region": "Hourglass Twins", "requires": [ { "item": "Translator (Hourglass Twins)" }, { "item": "Spacesuit" } ] }, { "category": "base", "logsanity": true, "address": 1085039017, "name": "ET Ship Log: High Energy Lab 2 - Increasing Interval", - "region": "Hourglass Twins", "requires": [ { "item": "Translator" }, { "item": "Spacesuit" } ] + "region": "Hourglass Twins", "requires": [ { "item": "Translator (Hourglass Twins)" }, { "item": "Spacesuit" } ] }, { "category": "base", "logsanity": true, "address": 1085039018, "name": "ET Ship Log: High Energy Lab 3 - ATP", - "region": "Hourglass Twins", "requires": [ { "item": "Translator" }, { "item": "Spacesuit" } ] + "region": "Hourglass Twins", "requires": [ { "item": "Translator (Hourglass Twins)" }, { "item": "Spacesuit" } ] }, { "category": "base", "logsanity": true, "address": 1085039019, "name": "ET Ship Log: AT Tower Designs 1 - Identify", @@ -487,15 +487,15 @@ }, { "category": "base", "logsanity": true, "address": 1085039020, "name": "ET Ship Log: AT Tower Designs 2 - Different Planets", - "region": "Hourglass Twins", "requires": [ { "item": "Translator" }, { "item": "Spacesuit" } ] + "region": "Hourglass Twins", "requires": [ { "item": "Translator (Hourglass Twins)" }, { "item": "Spacesuit" } ] }, { "category": "base", "logsanity": true, "address": 1085039021, "name": "ET Ship Log: AT Tower Designs 3 - Reflect Destinations", - "region": "Hourglass Twins", "requires": [ { "item": "Translator" }, { "item": "Spacesuit" } ] + "region": "Hourglass Twins", "requires": [ { "item": "Translator (Hourglass Twins)" }, { "item": "Spacesuit" } ] }, { "category": "base", "logsanity": true, "address": 1085039022, "name": "ET Ship Log: AT Tower Designs 4 - ATP", - "region": "Hourglass Twins", "requires": [ { "item": "Translator" }, { "item": "Spacesuit" } ] + "region": "Hourglass Twins", "requires": [ { "item": "Translator (Hourglass Twins)" }, { "item": "Spacesuit" } ] }, { "category": "base", "logsanity": true, "address": 1085039023, "name": "ET Ship Log: Sunless City 1 - Identify", @@ -503,27 +503,27 @@ }, { "category": "base", "logsanity": true, "address": 1085039024, "name": "ET Ship Log: Sunless City 2 - Sun Station Debate", - "region": "Hourglass Twins", "requires": [ { "item": "Translator" }, { "item": "Spacesuit" } ] + "region": "Hourglass Twins", "requires": [ { "item": "Translator (Hourglass Twins)" }, { "item": "Spacesuit" } ] }, { "category": "base", "logsanity": true, "address": 1085039025, "name": "ET Ship Log: Sunless City 3 - Signal", - "region": "Hourglass Twins", "requires": [ { "item": "Translator" }, { "item": "Ghost Matter Wavelength" }, { "item": "Spacesuit" } ] + "region": "Hourglass Twins", "requires": [ { "item": "Translator (Hourglass Twins)" }, { "item": "Ghost Matter Wavelength" }, { "item": "Spacesuit" } ] }, { "category": "base", "logsanity": true, "address": 1085039026, "name": "ET Ship Log: Anglerfish Fossil 1 - Children's Game", - "region": "Hourglass Twins", "requires": [ { "item": "Translator" }, { "item": "Scout" }, { "item": "Spacesuit" } ] + "region": "Hourglass Twins", "requires": [ { "item": "Translator (Hourglass Twins)" }, { "item": "Scout" }, { "item": "Spacesuit" } ] }, { "category": "base", "logsanity": true, "address": 1085039027, "name": "ET Ship Log: Anglerfish Fossil 2 - Blindfold Rule", - "region": "Hourglass Twins", "requires": [ { "item": "Translator" }, { "item": "Scout" }, { "item": "Spacesuit" } ] + "region": "Hourglass Twins", "requires": [ { "item": "Translator (Hourglass Twins)" }, { "item": "Scout" }, { "item": "Spacesuit" } ] }, { "category": "base", "logsanity": true, "address": 1085039028, "name": "ET Ship Log: Anglerfish Fossil 3 - Adult Response", - "region": "Hourglass Twins", "requires": [ { "item": "Translator" }, { "item": "Scout" }, { "item": "Spacesuit" } ] + "region": "Hourglass Twins", "requires": [ { "item": "Translator (Hourglass Twins)" }, { "item": "Scout" }, { "item": "Spacesuit" } ] }, { "category": "base", "logsanity": true, "address": 1085039029, "name": "ET Ship Log: Quantum Caves 1 - Wandering Rock", - "region": "Hourglass Twins", "requires": [ { "item": "Translator" }, { "item": "Spacesuit" } ] + "region": "Hourglass Twins", "requires": [ { "item": "Translator (Hourglass Twins)" }, { "item": "Spacesuit" } ] }, { "category": "base", "logsanity": true, "address": 1085039030, "name": "ET Ship Log: Quantum Caves 2 - Quantum Signal", @@ -531,23 +531,23 @@ }, { "category": "base", "logsanity": true, "address": 1085039031, "name": "ET Ship Log: Lakebed Cave 1 - Coleus Disappeared", - "region": "Hourglass Twins", "requires": [ { "item": "Translator" }, { "item": "Spacesuit" } ] // this is the floor text in Lakebed Cave itself + "region": "Hourglass Twins", "requires": [ { "item": "Translator (Hourglass Twins)" }, { "item": "Spacesuit" } ] // this is the floor text in Lakebed Cave itself }, { "category": "base", "logsanity": true, "address": 1085039032, "name": "ET Ship Log: Lakebed Cave 2 - Entanglement Rule", - "region": "Hourglass Twins", "requires": [ { "item": "Translator" }, { "item": "Entanglement Rule" }, { "item": "Spacesuit" } ] // wall text where Coleus was trapped + "region": "Hourglass Twins", "requires": [ { "item": "Translator (Hourglass Twins)" }, { "item": "Entanglement Rule" }, { "item": "Spacesuit" } ] // wall text where Coleus was trapped }, { "category": "base", "logsanity": true, "address": 1085039033, "name": "ET Ship Log: Lakebed Cave 3 - Theorizing", - "region": "Hourglass Twins", "requires": [ { "item": "Translator" }, { "item": "Entanglement Rule" }, { "item": "Spacesuit" } ] // wall text where Coleus was trapped + "region": "Hourglass Twins", "requires": [ { "item": "Translator (Hourglass Twins)" }, { "item": "Entanglement Rule" }, { "item": "Spacesuit" } ] // wall text where Coleus was trapped }, { "category": "base", "logsanity": true, "address": 1085039034, "name": "AT Ship Log: Towers 1 - Identify", - "region": "Hourglass Twins", "requires": [ { "item": "Translator" } ] + "region": "Hourglass Twins", "requires": [ { "item": "Translator (Hourglass Twins)" } ] }, { "category": "base", "logsanity": true, "address": 1085039035, "name": "AT Ship Log: Towers 2 - WHS", - "region": "Hourglass Twins", "requires": [ { "item": "Translator" }, { "item": "Spacesuit" } ] + "region": "Hourglass Twins", "requires": [ { "item": "Translator (Hourglass Twins)" }, { "item": "Spacesuit" } ] }, { "category": "base", "logsanity": true, "address": 1085039036, "name": "AT Ship Log: ATP 1 - Entered", @@ -555,19 +555,19 @@ }, { "category": "base", "logsanity": true, "address": 1085039037, "name": "AT Ship Log: ATP 2 - Monoliths", - "region": "Ash Twin Interior", "requires": [ { "item": "Translator" } ] + "region": "Ash Twin Interior", "requires": [ { "item": "Translator (Hourglass Twins)" } ] }, { "category": "base", "logsanity": true, "address": 1085039038, "name": "AT Ship Log: ATP 3 - Energy", - "region": "Ash Twin Interior", "requires": [ { "item": "Translator" } ] + "region": "Ash Twin Interior", "requires": [ { "item": "Translator (Hourglass Twins)" } ] }, { "category": "base", "logsanity": true, "address": 1085039039, "name": "AT Ship Log: ATP 4 - Sun Station", - "region": "Ash Twin Interior", "requires": [ { "item": "Translator" } ] + "region": "Ash Twin Interior", "requires": [ { "item": "Translator (Hourglass Twins)" } ] }, { "category": "base", "logsanity": true, "address": 1085039040, "name": "AT Ship Log: ATP 5 - Core", - "region": "Ash Twin Interior", "requires": [ { "item": "Translator" } ] + "region": "Ash Twin Interior", "requires": [ { "item": "Translator (Hourglass Twins)" } ] }, { "category": "base", "logsanity": true, "address": 1085039041, "name": "TH Ship Log: Village 1 - Identify", @@ -600,15 +600,15 @@ }, { "category": "base", "logsanity": true, "address": 1085039049, "name": "TH Ship Log: Nomai Mines 1 - Shell", - "region": "Timber Hearth", "requires": [ { "item": "Translator" } ] + "region": "Timber Hearth", "requires": [ { "item": "Translator (Timber Hearth)" } ] }, { "category": "base", "logsanity": true, "address": 1085039050, "name": "TH Ship Log: Nomai Mines 2 - No Physical Entrance", - "region": "Timber Hearth", "requires": [ { "item": "Translator" } ] + "region": "Timber Hearth", "requires": [ { "item": "Translator (Timber Hearth)" } ] }, { "category": "base", "logsanity": true, "address": 1085039051, "name": "TH Ship Log: Nomai Mines 3 - Four-Eyed Lifeforms", - "region": "Timber Hearth", "requires": [ { "item": "Translator" } ] + "region": "Timber Hearth", "requires": [ { "item": "Translator (Timber Hearth)" } ] }, { "category": "base", "logsanity": true, "address": 1085039052, "name": "TH Ship Log: Quantum Grove 1 - Quantum Signal", @@ -628,11 +628,11 @@ }, { "category": "base", "logsanity": true, "address": 1085039056, "name": "AR Ship Log: Eye Signal Locator 1 - Identify", - "region": "Space", "requires": [ { "item": "Translator" } ] + "region": "Space", "requires": [ { "item": "Translator (Timber Hearth)" } ] }, { "category": "base", "logsanity": true, "address": 1085039057, "name": "AR Ship Log: Eye Signal Locator 2 - Failure", - "region": "Space", "requires": [ { "item": "Translator" } ] + "region": "Space", "requires": [ { "item": "Translator (Timber Hearth)" } ] }, { "category": "base", "logsanity": true, "address": 1085039058, "name": "BH Ship Log: Riebeck's Camp 1 - Visit", @@ -652,59 +652,59 @@ }, { "category": "base", "logsanity": true, "address": 1085039062, "name": "BH Ship Log: Tower 1 - Sixth Location", - "region": "Brittle Hollow", "requires": [ { "item": "Translator" }, { "item": "Spacesuit" } ] + "region": "Brittle Hollow", "requires": [ { "item": "Translator (Brittle Hollow)" }, { "item": "Spacesuit" } ] }, { "category": "base", "logsanity": true, "address": 1085039063, "name": "BH Ship Log: Tower 2 - Pilgrimage", - "region": "Brittle Hollow", "requires": [ { "item": "Translator" }, { "item": "Spacesuit" } ] + "region": "Brittle Hollow", "requires": [ { "item": "Translator (Brittle Hollow)" }, { "item": "Spacesuit" } ] }, { "category": "base", "logsanity": true, "address": 1085039064, "name": "BH Ship Log: Tower 3 - United Goal", - "region": "Brittle Hollow", "requires": [ { "item": "Translator" }, { "item": "Spacesuit" } ] + "region": "Brittle Hollow", "requires": [ { "item": "Translator (Brittle Hollow)" }, { "item": "Spacesuit" } ] }, { "category": "base", "logsanity": true, "address": 1085039065, "name": "BH Ship Log: Tower Shard 1 - Grove Objects", - "region": "Brittle Hollow", "requires": [ { "item": "Translator" } ] + "region": "Brittle Hollow", "requires": [ { "item": "Translator (Brittle Hollow)" } ] }, { "category": "base", "logsanity": true, "address": 1085039066, "name": "BH Ship Log: Tower Shard 2 - Hypothesis", - "region": "Brittle Hollow", "requires": [ { "item": "Translator" } ] + "region": "Brittle Hollow", "requires": [ { "item": "Translator (Brittle Hollow)" } ] }, { "category": "base", "logsanity": true, "address": 1085039067, "name": "BH Ship Log: Tower Shard 3 - QM Signal", - "region": "Brittle Hollow", "requires": [ { "item": "Translator" } ] + "region": "Brittle Hollow", "requires": [ { "item": "Translator (Brittle Hollow)" } ] }, { "category": "base", "logsanity": true, "address": 1085039068, "name": "BH Ship Log: Northern Glacier 1 - Identify", - "region": "Brittle Hollow", "requires": [ { "item": "Translator" } ] // Nomai text in either NG building + "region": "Brittle Hollow", "requires": [ { "item": "Translator (Brittle Hollow)" } ] // Nomai text in either NG building }, { "category": "base", "logsanity": true, "address": 1085039069, "name": "BH Ship Log: Northern Glacier 2 - WHS", - "region": "Brittle Hollow", "requires": [ { "item": "Translator" } ] // Nomai text in the larger, lower NG building + "region": "Brittle Hollow", "requires": [ { "item": "Translator (Brittle Hollow)" } ] // Nomai text in the larger, lower NG building }, { "category": "base", "logsanity": true, "address": 1085039070, "name": "BH Ship Log: Escape Pod 1 1 - Identify", - "region": "Brittle Hollow", "requires": [ { "item": "Translator" } ] + "region": "Brittle Hollow", "requires": [ { "item": "Translator (Brittle Hollow)" } ] }, { "category": "base", "logsanity": true, "address": 1085039071, "name": "BH Ship Log: Escape Pod 1 2 - Vessel", - "region": "Brittle Hollow", "requires": [ { "item": "Translator" }, { "item": "Spacesuit" } ] + "region": "Brittle Hollow", "requires": [ { "item": "Translator (Brittle Hollow)" }, { "item": "Spacesuit" } ] }, { "category": "base", "logsanity": true, "address": 1085039072, "name": "BH Ship Log: Old Settlement 1 - Identify", - "region": "Brittle Hollow", "requires": [ { "item": "Translator" } ] + "region": "Brittle Hollow", "requires": [ { "item": "Translator (Brittle Hollow)" } ] }, { "category": "base", "logsanity": true, "address": 1085039073, "name": "BH Ship Log: Old Settlement 2 - Eye-Shaped Signal", - "region": "Brittle Hollow", "requires": [ { "item": "Translator" } ] + "region": "Brittle Hollow", "requires": [ { "item": "Translator (Brittle Hollow)" } ] }, { "category": "base", "logsanity": true, "address": 1085039074, "name": "BH Ship Log: Old Settlement 3 - Named", - "region": "Brittle Hollow", "requires": [ { "item": "Translator" } ] + "region": "Brittle Hollow", "requires": [ { "item": "Translator (Brittle Hollow)" } ] }, { "category": "base", "logsanity": true, "address": 1085039075, "name": "BH Ship Log: Old Settlement 4 - Abandoned", - "region": "Brittle Hollow", "requires": [ { "item": "Translator" } ] + "region": "Brittle Hollow", "requires": [ { "item": "Translator (Brittle Hollow)" } ] }, { "category": "base", "logsanity": true, "address": 1085039076, "name": "BH Ship Log: Old Settlement Mural 1", @@ -728,31 +728,31 @@ }, { "category": "base", "logsanity": true, "address": 1085039081, "name": "BH Ship Log: Hanging City 3 - Warp Core", - "region": "Brittle Hollow", "requires": [ { "item": "Translator" } ] // meltwater district text wall + "region": "Brittle Hollow", "requires": [ { "item": "Translator (Brittle Hollow)" } ] // meltwater district text wall }, { "category": "base", "logsanity": true, "address": 1085039082, "name": "BH Ship Log: Hanging City 4 - Signal", - "region": "Brittle Hollow", "requires": [ { "item": "Translator" } ] // eye shrine text wall + "region": "Brittle Hollow", "requires": [ { "item": "Translator (Brittle Hollow)" } ] // eye shrine text wall }, { "category": "base", "logsanity": true, "address": 1085039083, "name": "BH Ship Log: Black Hole Forge 1 - Astral Body Alignment", - "region": "Black Hole Forge", "requires": [ { "item": "Translator" } ] + "region": "Black Hole Forge", "requires": [ { "item": "Translator (Brittle Hollow)" } ] }, { "category": "base", "logsanity": true, "address": 1085039084, "name": "BH Ship Log: Black Hole Forge 2 - Receiver Location", - "region": "Black Hole Forge", "requires": [ { "item": "Translator" } ] + "region": "Black Hole Forge", "requires": [ { "item": "Translator (Brittle Hollow)" } ] }, { "category": "base", "logsanity": true, "address": 1085039085, "name": "BH Ship Log: Black Hole Forge 3 - Hourglass Twins", - "region": "Black Hole Forge", "requires": [ { "item": "Translator" } ] + "region": "Black Hole Forge", "requires": [ { "item": "Translator (Brittle Hollow)" } ] }, { "category": "base", "logsanity": true, "address": 1085039086, "name": "BH Ship Log: Black Hole Forge 4 - Ash Twin Towers", - "region": "Black Hole Forge", "requires": [ { "item": "Translator" } ] + "region": "Black Hole Forge", "requires": [ { "item": "Translator (Brittle Hollow)" } ] }, { "category": "base", "logsanity": true, "address": 1085039087, "name": "BH Ship Log: Black Hole Forge 5 - Poke's Warp Core", - "region": "Black Hole Forge", "requires": [ { "item": "Translator" } ] + "region": "Black Hole Forge", "requires": [ { "item": "Translator (Brittle Hollow)" } ] }, { "category": "base", "logsanity": true, "address": 1085039088, "name": "BH Ship Log: Alignment Angle Diagram 1 - Identify", @@ -760,51 +760,51 @@ }, { "category": "base", "logsanity": true, "address": 1085039089, "name": "BH Ship Log: Alignment Angle Diagram 2 - Five Degrees", - "region": "Black Hole Forge", "requires": [ { "item": "Translator" } ] + "region": "Black Hole Forge", "requires": [ { "item": "Translator (Brittle Hollow)" } ] }, { "category": "base", "logsanity": true, "address": 1085039090, "name": "BH Ship Log: Alignment Angle Diagram 3 - Several Seconds", - "region": "Black Hole Forge", "requires": [ { "item": "Translator" } ] + "region": "Black Hole Forge", "requires": [ { "item": "Translator (Brittle Hollow)" } ] }, { "category": "base", "logsanity": true, "address": 1085039091, "name": "BH Ship Log: Alignment Angle Diagram 4 - Active Window", - "region": "Black Hole Forge", "requires": [ { "item": "Translator" } ] + "region": "Black Hole Forge", "requires": [ { "item": "Translator (Brittle Hollow)" } ] }, { "category": "base", "logsanity": true, "address": 1085039092, "name": "BH Ship Log: Southern Observatory 1 - Signal", - "region": "Brittle Hollow", "requires": [ { "item": "Translator" }, { "item": "Spacesuit" } ] + "region": "Brittle Hollow", "requires": [ { "item": "Translator (Brittle Hollow)" }, { "item": "Spacesuit" } ] }, { "category": "base", "logsanity": true, "address": 1085039093, "name": "BH Ship Log: Southern Observatory 2 - Distant Orbit", - "region": "Brittle Hollow", "requires": [ { "item": "Translator" }, { "item": "Spacesuit" } ] + "region": "Brittle Hollow", "requires": [ { "item": "Translator (Brittle Hollow)" }, { "item": "Spacesuit" } ] }, { "category": "base", "logsanity": true, "address": 1085039094, "name": "BH Ship Log: Southern Observatory 3 - Deep Space Probe", - "region": "Brittle Hollow", "requires": [ { "item": "Translator" }, { "item": "Spacesuit" } ] + "region": "Brittle Hollow", "requires": [ { "item": "Translator (Brittle Hollow)" }, { "item": "Spacesuit" } ] }, { "category": "base", "logsanity": true, "address": 1085039095, "name": "BH Ship Log: Southern Observatory 4 - Probability", - "region": "Brittle Hollow", "requires": [ { "item": "Translator" }, { "item": "Spacesuit" } ] + "region": "Brittle Hollow", "requires": [ { "item": "Translator (Brittle Hollow)" }, { "item": "Spacesuit" } ] }, { "category": "base", "logsanity": true, "address": 1085039096, "name": "BH Ship Log: Tornado Simulation 1 - Most Cyclones", - "region": "Brittle Hollow", "requires": [ { "item": "Translator" }, { "item": "Spacesuit" } ] + "region": "Brittle Hollow", "requires": [ { "item": "Translator (Brittle Hollow)" }, { "item": "Spacesuit" } ] }, { "category": "base", "logsanity": true, "address": 1085039097, "name": "BH Ship Log: Tornado Simulation 2 - Below", - "region": "Brittle Hollow", "requires": [ { "item": "Translator" }, { "item": "Spacesuit" } ] + "region": "Brittle Hollow", "requires": [ { "item": "Translator (Brittle Hollow)" }, { "item": "Spacesuit" } ] }, { "category": "base", "logsanity": true, "address": 1085039098, "name": "HL Ship Log: Volcanic Testing Site 1 - Purpose", - "region": "Space", "requires": [ { "item": "Translator" } ] + "region": "Space", "requires": [ { "item": "Translator (Brittle Hollow)" } ] }, { "category": "base", "logsanity": true, "address": 1085039099, "name": "HL Ship Log: Volcanic Testing Site 2 - Shell", - "region": "Space", "requires": [ { "item": "Translator" } ] + "region": "Space", "requires": [ { "item": "Translator (Brittle Hollow)" } ] }, { "category": "base", "logsanity": true, "address": 1085039100, "name": "HL Ship Log: Volcanic Testing Site 3 - Smallest Crack", - "region": "Space", "requires": [ { "item": "Translator" } ] + "region": "Space", "requires": [ { "item": "Translator (Brittle Hollow)" } ] }, { "category": "base", "logsanity": true, "address": 1085039101, "name": "GD Ship Log: Ocean Depths 1 - Electrical Field", @@ -832,15 +832,15 @@ }, { "category": "base", "logsanity": true, "address": 1085039107, "name": "GD Ship Log: Construction Yard 1 - Built OPC", - "region": "Giant's Deep", "requires": [ { "item": "Translator" } ] + "region": "Giant's Deep", "requires": [ { "item": "Translator (Giant's Deep)" } ] }, { "category": "base", "logsanity": true, "address": 1085039108, "name": "GD Ship Log: Construction Yard 2 - Hiatus", - "region": "Giant's Deep", "requires": [ { "item": "Translator" }, { "item": "Spacesuit" } ] + "region": "Giant's Deep", "requires": [ { "item": "Translator (Giant's Deep)" }, { "item": "Spacesuit" } ] }, { "category": "base", "logsanity": true, "address": 1085039109, "name": "GD Ship Log: Construction Yard 3 - Launch", - "region": "Giant's Deep", "requires": [ { "item": "Translator" }, { "item": "Spacesuit" } ] + "region": "Giant's Deep", "requires": [ { "item": "Translator (Giant's Deep)" }, { "item": "Spacesuit" } ] }, { "category": "base", "logsanity": true, "address": 1085039110, "name": "GD Ship Log: Bramble Island", @@ -848,7 +848,7 @@ }, { "category": "base", "logsanity": true, "address": 1085039111, "name": "GD Ship Log: Statue Island 1 - Purpose", - "region": "Giant's Deep", "requires": [ { "item": "Translator" } ] + "region": "Giant's Deep", "requires": [ { "item": "Translator (Giant's Deep)" } ] }, { "category": "base", "logsanity": true, "address": 1085039112, "name": "GD Ship Log: Statue Island 2 - Beach Statue", @@ -856,31 +856,31 @@ }, { "category": "base", "logsanity": true, "address": 1085039113, "name": "GD Ship Log: Island Workshop 1 - Memories", - "region": "Giant's Deep", "requires": [ { "item": "Translator" } ] + "region": "Giant's Deep", "requires": [ { "item": "Translator (Giant's Deep)" } ] }, { "category": "base", "logsanity": true, "address": 1085039114, "name": "GD Ship Log: Island Workshop 2 - Masks", - "region": "Giant's Deep", "requires": [ { "item": "Translator" } ] + "region": "Giant's Deep", "requires": [ { "item": "Translator (Giant's Deep)" } ] }, { "category": "base", "logsanity": true, "address": 1085039115, "name": "GD Ship Log: Island Workshop 3 - Activation", - "region": "Giant's Deep", "requires": [ { "item": "Translator" } ] + "region": "Giant's Deep", "requires": [ { "item": "Translator (Giant's Deep)" } ] }, { "category": "base", "logsanity": true, "address": 1085039116, "name": "GD Ship Log: Tower 1 - Journey", - "region": "Space", "requires": [ { "item": "Translator" } ] + "region": "Space", "requires": [ { "item": "Translator (Giant's Deep)" } ] }, { "category": "base", "logsanity": true, "address": 1085039117, "name": "GD Ship Log: Tower 2 - Observing", - "region": "Space", "requires": [ { "item": "Translator" }, { "item": "Spacesuit" } ] + "region": "Space", "requires": [ { "item": "Translator (Giant's Deep)" }, { "item": "Spacesuit" } ] }, { "category": "base", "logsanity": true, "address": 1085039118, "name": "GD Ship Log: Tower 3 - Rule of Imaging", - "region": "Space", "requires": [ { "item": "Translator" }, { "item": "Imaging Rule" }, { "item": "Spacesuit" } ] + "region": "Space", "requires": [ { "item": "Translator (Giant's Deep)" }, { "item": "Imaging Rule" }, { "item": "Spacesuit" } ] }, { "category": "base", "logsanity": true, "address": 1085039119, "name": "GD Ship Log: Tower 4 - Other Shards", - "region": "Space", "requires": [ { "item": "Translator" }, { "item": "Imaging Rule" }, { "item": "Spacesuit" } ] + "region": "Space", "requires": [ { "item": "Translator (Giant's Deep)" }, { "item": "Imaging Rule" }, { "item": "Spacesuit" } ] }, { "category": "base", "logsanity": true, "address": 1085039120, "name": "GD Ship Log: OPC 1 - Entered", @@ -888,27 +888,27 @@ }, { "category": "base", "logsanity": true, "address": 1085039121, "name": "GD Ship Log: OPC 2 - Purpose", - "region": "Space", "requires": [ { "item": "Translator" }, { "item": "Spacesuit" } ] // control module projection stone text + "region": "Space", "requires": [ { "item": "Translator (Giant's Deep)" }, { "item": "Spacesuit" } ] // control module projection stone text }, { "category": "base", "logsanity": true, "address": 1085039122, "name": "GD Ship Log: OPC 3 - Maximum Power", - "region": "Space", "requires": [ { "item": "Translator" }, { "item": "Spacesuit" } ] // control module projection stone text + "region": "Space", "requires": [ { "item": "Translator (Giant's Deep)" }, { "item": "Spacesuit" } ] // control module projection stone text }, { "category": "base", "logsanity": true, "address": 1085039123, "name": "GD Ship Log: Probe Tracking Module 1 - Millions", - "region": "GD Core", "requires": [ { "item": "Translator" } ] + "region": "GD Core", "requires": [ { "item": "Translator (Giant's Deep)" } ] }, { "category": "base", "logsanity": true, "address": 1085039124, "name": "GD Ship Log: Probe Tracking Module 2 - Anomaly Located", - "region": "GD Core", "requires": [ { "item": "Translator" } ] + "region": "GD Core", "requires": [ { "item": "Translator (Giant's Deep)" } ] }, { "category": "base", "logsanity": true, "address": 1085039125, "name": "GD Ship Log: Probe Tracking Module 3 - Statue", - "region": "GD Core", "requires": [ { "item": "Translator" } ] + "region": "GD Core", "requires": [ { "item": "Translator (Giant's Deep)" } ] }, { "category": "base", "logsanity": true, "address": 1085039126, "name": "GD Ship Log: Probe Tracking Module 4 - Coordinates", - "region": "GD Core", "requires": [ { "item": "Translator" } ] // this requires translating the terminal, not just seeing the coords + "region": "GD Core", "requires": [ { "item": "Translator (Giant's Deep)" } ] // this requires translating the terminal, not just seeing the coords }, { "category": "base", "logsanity": true, "address": 1085039127, "name": "GD Ship Log: Launch Module 1 - Damaged", @@ -916,19 +916,19 @@ }, { "category": "base", "logsanity": true, "address": 1085039128, "name": "GD Ship Log: Launch Module 2 - Only Once", - "region": "Space", "requires": [ { "item": "Translator" }, { "item": "Spacesuit" } ] // launch module projection stone text + "region": "Space", "requires": [ { "item": "Translator (Giant's Deep)" }, { "item": "Spacesuit" } ] // launch module projection stone text }, { "category": "base", "logsanity": true, "address": 1085039129, "name": "GD Ship Log: Launch Module 3 - Receive Data", - "region": "Space", "requires": [ { "item": "Translator" }, { "item": "Spacesuit" } ] // launch module projection stone text + "region": "Space", "requires": [ { "item": "Translator (Giant's Deep)" }, { "item": "Spacesuit" } ] // launch module projection stone text }, { "category": "base", "logsanity": true, "address": 1085039130, "name": "GD Ship Log: Control Module 1 - Request", - "region": "Space", "requires": [ { "item": "Translator" }, { "item": "Spacesuit" } ] + "region": "Space", "requires": [ { "item": "Translator (Giant's Deep)" }, { "item": "Spacesuit" } ] }, { "category": "base", "logsanity": true, "address": 1085039131, "name": "GD Ship Log: Control Module 2 - Status", - "region": "Space", "requires": [ { "item": "Translator" }, { "item": "Spacesuit" } ] + "region": "Space", "requires": [ { "item": "Translator (Giant's Deep)" }, { "item": "Spacesuit" } ] }, { "category": "base", "logsanity": true, "address": 1085039132, "name": "DB Ship Log: Feldspar's Camp 1 - Status", @@ -956,27 +956,27 @@ }, { "category": "base", "logsanity": true, "address": 1085039138, "name": "DB Ship Log: Escape Pod 3 1 - Identify", - "region": "Nomai Grave", "requires": [ { "item": "Translator" }, { "item": "Spacesuit" } ] + "region": "Nomai Grave", "requires": [ { "item": "Translator (Dark Bramble)" }, { "item": "Spacesuit" } ] }, { "category": "base", "logsanity": true, "address": 1085039139, "name": "DB Ship Log: Escape Pod 3 2 - Vessel", - "region": "Nomai Grave", "requires": [ { "item": "Translator" }, { "item": "Spacesuit" } ] + "region": "Nomai Grave", "requires": [ { "item": "Translator (Dark Bramble)" }, { "item": "Spacesuit" } ] }, { "category": "base", "logsanity": true, "address": 1085039140, "name": "DB Ship Log: Escape Pod 3 3 - Two Beacons", - "region": "Nomai Grave", "requires": [ { "item": "Translator" }, { "item": "Spacesuit" } ] + "region": "Nomai Grave", "requires": [ { "item": "Translator (Dark Bramble)" }, { "item": "Spacesuit" } ] }, { "category": "base", "logsanity": true, "address": 1085039141, "name": "DB Ship Log: Nomai Grave 1 - Followed Beacon", - "region": "Nomai Grave", "requires": [ { "item": "Translator" } ] // text wheel + "region": "Nomai Grave", "requires": [ { "item": "Translator (Dark Bramble)" } ] // text wheel }, { "category": "base", "logsanity": true, "address": 1085039142, "name": "DB Ship Log: Nomai Grave 2 - Within the Seed", - "region": "Nomai Grave", "requires": [ { "item": "Translator" } ] // text wheel + "region": "Nomai Grave", "requires": [ { "item": "Translator (Dark Bramble)" } ] // text wheel }, { "category": "base", "logsanity": true, "address": 1085039143, "name": "DB Ship Log: Nomai Grave 3 - Beacon Dying", - "region": "Nomai Grave", "requires": [ { "item": "Translator" } ] // text wheel + "region": "Nomai Grave", "requires": [ { "item": "Translator (Dark Bramble)" } ] // text wheel }, { "category": "base", "logsanity": true, "address": 1085039144, "name": "DB Ship Log: Nomai Grave 4 - Scout Photos", @@ -996,24 +996,24 @@ }, { "category": "base", "logsanity": true, "address": 1085039148, "name": "DB Ship Log: The Vessel 4 - Call For Help", - "region": "The Vessel", "requires": [ { "item": "Translator" } ] // upper right text wall + "region": "The Vessel", "requires": [ { "item": "Translator (Dark Bramble)" } ] // upper right text wall }, { "category": "base", "logsanity": true, "address": 1085039149, "name": "DB Ship Log: The Vessel 5 - Clans Regrouping", - "region": "The Vessel", "requires": [ { "item": "Translator" } ] // upper left text wall + "region": "The Vessel", "requires": [ { "item": "Translator (Dark Bramble)" } ] // upper left text wall }, { "category": "base", "logsanity": true, "address": 1085039150, "name": "DB Ship Log: The Vessel 6 - Original Recording", - "region": "The Vessel", "requires": [ { "item": "Translator" } ] // text wheel on lower level + "region": "The Vessel", "requires": [ { "item": "Translator (Dark Bramble)" } ] // text wheel on lower level }, { "category": "base", "logsanity": true, "address": 1085039151, "name": "Ship Log: WHS 1 - Warp Towers", - "region": "White Hole Station", "requires": [ { "item": "Translator" } ] // text wall in WHS + "region": "White Hole Station", "requires": [ { "item": "Translator (Other)" } ] // text wall in WHS }, { "category": "base", "logsanity": true, "address": 1085039152, "name": "Ship Log: WHS 2 - Alignment", "region": "White Hole Station", "requires": [ - { "item": "Translator" }, // This is projection stone text, which requires carrying it back to BH. + { "item": "Translator (Brittle Hollow)" }, // This is projection stone text, which requires carrying it back to BH. { "item": "Launch Codes" } // Because of warp rando, we can't assume warp codes let you warp from WHS to BH, // so for logic we only accept Launch Codes (see also HCC->BHF connection). ] @@ -1021,29 +1021,29 @@ { "category": "base", "logsanity": true, "address": 1085039153, "name": "Ship Log: WHS 3 - Temporal Anomaly", "region": "White Hole Station", "requires": [ - { "item": "Translator" }, // more projection stone text, see previous comment + { "item": "Translator (Brittle Hollow)" }, // more projection stone text, see previous comment { "item": "Launch Codes" } ] }, { "category": "base", "logsanity": true, "address": 1085039154, "name": "Ship Log: WHS 4 - Miniscule Interval", - "region": "White Hole Station", "requires": [ { "item": "Translator" } ] // text wall in WHS + "region": "White Hole Station", "requires": [ { "item": "Translator (Other)" } ] // text wall in WHS }, { "category": "base", "logsanity": true, "address": 1085039155, "name": "Ship Log: Frozen Shuttle 1 - Identify", - "region": "Space", "requires": [ { "item": "Translator" } ] // text wheel just outside the shuttle, on Interloper surface + "region": "Space", "requires": [ { "item": "Translator (Other)" } ] // text wheel just outside the shuttle, on Interloper surface }, { "category": "base", "logsanity": true, "address": 1085039156, "name": "Ship Log: Frozen Shuttle 2 - Energy Readings", - "region": "Hourglass Twins", "requires": [ { "item": "Translator" } ] // text wheel inside the shuttle, read by recalling to ET + "region": "Hourglass Twins", "requires": [ { "item": "Translator (Other)" } ] // text wheel inside the shuttle, read by recalling to ET }, { "category": "base", "logsanity": true, "address": 1085039157, "name": "Ship Log: Frozen Shuttle 3 - Stayed", - "region": "Space", "requires": [ { "item": "Translator" } ] // text wheel just outside the shuttle, on Interloper surface + "region": "Space", "requires": [ { "item": "Translator (Other)" } ] // text wheel just outside the shuttle, on Interloper surface }, { "category": "base", "logsanity": true, "address": 1085039158, "name": "Ship Log: Frozen Shuttle 4 - Lost Contact", - "region": "Hourglass Twins", "requires": [ { "item": "Translator" } ] // text wheel inside the shuttle, read by recalling to ET + "region": "Hourglass Twins", "requires": [ { "item": "Translator (Other)" } ] // text wheel inside the shuttle, read by recalling to ET }, { "category": "base", "logsanity": true, "address": 1085039159, "name": "Ship Log: Ruptured Core 1 - Missing Crew", @@ -1051,15 +1051,15 @@ }, { "category": "base", "logsanity": true, "address": 1085039160, "name": "Ship Log: Ruptured Core 2 - Exotic Matter", - "region": "Interloper Core", "requires": [ { "item": "Translator" } ] // text wheel + "region": "Interloper Core", "requires": [ { "item": "Translator (Other)" } ] // text wheel }, { "category": "base", "logsanity": true, "address": 1085039161, "name": "Ship Log: Ruptured Core 3 - Instant Blanket", - "region": "Interloper Core", "requires": [ { "item": "Translator" } ] // text wheel + "region": "Interloper Core", "requires": [ { "item": "Translator (Other)" } ] // text wheel }, { "category": "base", "logsanity": true, "address": 1085039162, "name": "Ship Log: Ruptured Core 4 - Warn the Others", - "region": "Interloper Core", "requires": [ { "item": "Translator" } ] // text wheel + "region": "Interloper Core", "requires": [ { "item": "Translator (Other)" } ] // text wheel }, { "category": "base", "logsanity": true, "address": 1085039163, "name": "QM Ship Log: QM 1 - Land", @@ -1071,27 +1071,27 @@ }, { "category": "base", "logsanity": true, "address": 1085039165, "name": "Ship Log: Solanum's Shuttle 1 - Landing", - "region": "Solanum's Shuttle Interior", "requires": [ { "item": "Translator" } ] // text wheel inside shuttle + "region": "Solanum's Shuttle Interior", "requires": [ { "item": "Translator (Other)" } ] // text wheel inside shuttle }, { "category": "base", "logsanity": true, "address": 1085039166, "name": "Ship Log: Solanum's Shuttle 2 - South Pole", - "region": "Solanum's Shuttle Interior", "requires": [ { "item": "Translator" } ] // text wheel inside shuttle + "region": "Solanum's Shuttle Interior", "requires": [ { "item": "Translator (Other)" } ] // text wheel inside shuttle }, { "category": "base", "logsanity": true, "address": 1085039167, "name": "QM Ship Log: Quantum Shrine 1 - Identify", - "region": "Quantum Shrine", "requires": [ { "item": "Translator" } ] + "region": "Quantum Shrine", "requires": [ { "item": "Translator (Other)" } ] }, { "category": "base", "logsanity": true, "address": 1085039168, "name": "QM Ship Log: Quantum Shrine 2 - Imaging Rule", - "region": "Quantum Shrine", "requires": [ { "item": "Translator" } ] + "region": "Quantum Shrine", "requires": [ { "item": "Translator (Other)" } ] }, { "category": "base", "logsanity": true, "address": 1085039169, "name": "QM Ship Log: Quantum Shrine 3 - Entanglement Rule", - "region": "Quantum Shrine", "requires": [ { "item": "Translator" } ] + "region": "Quantum Shrine", "requires": [ { "item": "Translator (Other)" } ] }, { "category": "base", "logsanity": true, "address": 1085039170, "name": "QM Ship Log: Quantum Shrine 4 - Sixth Location Rule", - "region": "Quantum Shrine", "requires": [ { "item": "Translator" } ] + "region": "Quantum Shrine", "requires": [ { "item": "Translator (Other)" } ] }, { "category": "base", "logsanity": true, "address": 1085039171, "name": "QM Ship Log: Sixth Location 1 - Visit", @@ -1099,23 +1099,23 @@ }, { "category": "base", "logsanity": true, "address": 1085039172, "name": "QM Ship Log: Sixth Location 2 - Moon", - "region": "Sixth Location", "requires": [ { "item": "Translator" } ] + "region": "Sixth Location", "requires": [ { "item": "Translator (Other)" } ] }, { "category": "base", "logsanity": true, "address": 1085039173, "name": "QM Ship Log: Sixth Location 3 - Reflection", - "region": "Sixth Location", "requires": [ { "item": "Translator" } ] + "region": "Sixth Location", "requires": [ { "item": "Translator (Other)" } ] }, { "category": "base", "logsanity": true, "address": 1085039174, "name": "QM Ship Log: Sixth Location 4 - Source", - "region": "Sixth Location", "requires": [ { "item": "Translator" } ] + "region": "Sixth Location", "requires": [ { "item": "Translator (Other)" } ] }, { "category": "base", "logsanity": true, "address": 1085039175, "name": "QM Ship Log: Sixth Location 5 - Conscious Observer", - "region": "Sixth Location", "requires": [ { "item": "Translator" } ] + "region": "Sixth Location", "requires": [ { "item": "Translator (Other)" } ] }, { "category": "base", "logsanity": true, "address": 1085039176, "name": "QM Ship Log: Sixth Location 6 - Status", - "region": "Sixth Location", "requires": [ { "item": "Translator" } ] + "region": "Sixth Location", "requires": [ { "item": "Translator (Other)" } ] }, // I didn't add these until DLC integration because a) I wasn't sure if a DLC-less game had any of all of these, diff --git a/worlds/outer_wilds/shared_static_logic/static_logic.pickle b/worlds/outer_wilds/shared_static_logic/static_logic.pickle index ed45ce56d1f8aa3df9948112f39497b1ce26f72c..9fea26975aefc57c5ec8b0669bd0f3f958db1b47 100644 GIT binary patch literal 59996 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 literal 57370 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 TN^Jhgf5c`8B=^1U)o=TMN_cbq diff --git a/worlds/outer_wilds/test/__init__.py b/worlds/outer_wilds/test/__init__.py index b11e50ec8db2..b0ca98ac8c9b 100644 --- a/worlds/outer_wilds/test/__init__.py +++ b/worlds/outer_wilds/test/__init__.py @@ -143,6 +143,32 @@ def test_default_world(self): self.song_of_five_required_items + self.song_of_the_nomai_additional_required_items) +class TestSplitTranslator(OuterWildsTestBase): + options = { + "split_translator": True + } + + def test_split_translator(self): + self.assertReachableWith("ET: High Energy Lab (Upper Text Wall)", [ + "Launch Codes", "Translator (Hourglass Twins)" + ]) + self.assertReachableWith("TH: Mines (Text Wall)", [ + "Launch Codes", "Translator (Timber Hearth)" + ]) + self.assertReachableWith("BH: Southern Observatory (Tornado Text Wall)", [ + "Launch Codes", "Translator (Brittle Hollow)" + ]) + self.assertReachableWith("GD: Control Module Logs (Text Wheels)", [ + "Launch Codes", "Translator (Giant's Deep)" + ]) + self.assertReachableWith("DB: Nomai Grave (Text Wheel)", [ + "Launch Codes", "Silent Running Mode", "Signalscope", "Distress Beacon Frequency", "Escape Pod 3 Signal", "Translator (Dark Bramble)" + ]) + self.assertReachableWith("Ruptured Core (Text Wheel)", [ + "Launch Codes", "Scout", "Ghost Matter Wavelength", "Translator (Other)" + ]) + + class TestSongOfNomaiWorld(OuterWildsTestBase): options = { "goal": Goal.option_song_of_the_nomai