From 7affb885ba533e4abfc74f276eaad3bbb0431e9e Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Tue, 16 Jan 2024 13:13:44 +0100 Subject: [PATCH] The Witness: Add "Town Desert Laser Redirect Control (Panel)" as an item (#2669) --- worlds/witness/Options.py | 10 +++++++--- worlds/witness/WitnessItems.txt | 4 +++- worlds/witness/WitnessLogic.txt | 6 +++--- worlds/witness/WitnessLogicExpert.txt | 6 +++--- worlds/witness/WitnessLogicVanilla.txt | 6 +++--- worlds/witness/player_logic.py | 3 ++- worlds/witness/rules.py | 19 +++++++++++++------ .../Complex_Additional_Panels.txt | 1 + .../settings/Door_Shuffle/Simple_Panels.txt | 2 +- worlds/witness/static_logic.py | 1 - 10 files changed, 36 insertions(+), 22 deletions(-) diff --git a/worlds/witness/Options.py b/worlds/witness/Options.py index 4c4b4f76..84855bf8 100644 --- a/worlds/witness/Options.py +++ b/worlds/witness/Options.py @@ -114,9 +114,13 @@ class ShufflePostgame(Toggle): class VictoryCondition(Choice): - """Change the victory condition from the original game's ending (elevator) to beating the Challenge - or solving the mountaintop box, either using the short solution - (7 lasers or whatever you've changed it to) or the long solution (11 lasers or whatever you've changed it to).""" + """Set the victory condition for this world. + Elevator: Start the elevator at the bottom of the mountain (requires Mountain Lasers). + Challenge: Beat the secret Challenge (requires Challenge Lasers). + Mountain Box Short: Input the short solution to the Mountaintop Box (requires Mountain Lasers). + Mountain Box Long: Input the long solution to the Mountaintop Box (requires Challenge Lasers). + It is important to note that while the Mountain Box requires Desert Laser to be redirected in Town for that laser + to count, the laser locks on the Elevator and Challenge Timer panels do not.""" display_name = "Victory Condition" option_elevator = 0 option_challenge = 1 diff --git a/worlds/witness/WitnessItems.txt b/worlds/witness/WitnessItems.txt index 750d6bd4..64571179 100644 --- a/worlds/witness/WitnessItems.txt +++ b/worlds/witness/WitnessItems.txt @@ -69,6 +69,7 @@ Doors: 1167 - Town Maze Rooftop Bridge (Panel) - 0x2896A 1169 - Town Windmill Entry (Panel) - 0x17F5F 1172 - Town Cargo Box Entry (Panel) - 0x0A0C8 +1173 - Town Desert Laser Redirect Control (Panel) - 0x09F98 1182 - Windmill Turn Control (Panel) - 0x17D02 1184 - Theater Entry (Panel) - 0x17F89 1185 - Theater Video Input (Panel) - 0x00815 @@ -234,7 +235,7 @@ Doors: 2000 - Desert Control Panels - 0x09FAA,0x1C2DF,0x1831E,0x1C260,0x1831C,0x1C2F3,0x1831D,0x1C2B1,0x1831B 2005 - Quarry Stoneworks Control Panels - 0x03678,0x03676,0x03679,0x03675 2010 - Quarry Boathouse Control Panels - 0x03852,0x03858,0x275FA -2015 - Town Control Panels - 0x2896A,0x334D8 +2015 - Town Control Panels - 0x2896A,0x334D8,0x09F98 2020 - Windmill & Theater Control Panels - 0x17D02,0x00815 2025 - Bunker Control Panels - 0x34BC5,0x34BC6,0x0A079 2030 - Swamp Control Panels - 0x00609,0x18488,0x181F5,0x17E2B,0x17C0A,0x17E07 @@ -250,6 +251,7 @@ Doors: 2125 - Monastery Panels - 0x09D9B,0x00C92,0x00B10 2130 - Town Church & RGB House Panels - 0x28998,0x28A0D,0x334D8 2135 - Town Maze Panels - 0x2896A,0x28A79 +2137 - Town Dockside House Panels - 0x0A0C8,0x09F98 2140 - Windmill & Theater Panels - 0x17D02,0x00815,0x17F5F,0x17F89,0x0A168,0x33AB2 2145 - Treehouse Panels - 0x0A182,0x0288C,0x02886,0x2700B,0x17CBC,0x037FF 2150 - Bunker Panels - 0x34BC5,0x34BC6,0x0A079,0x0A099,0x17C2E diff --git a/worlds/witness/WitnessLogic.txt b/worlds/witness/WitnessLogic.txt index acfbe8c1..424f990c 100644 --- a/worlds/witness/WitnessLogic.txt +++ b/worlds/witness/WitnessLogic.txt @@ -474,7 +474,7 @@ Town (Town) - Main Island - True - The Ocean - 0x0A054 - Town Maze Rooftop - 0x2 158218 - 0x0A054 (Boat Spawn) - 0x17CA6 | 0x17CDF | 0x09DB8 | 0x17C95 - Boat 158219 - 0x0A0C8 (Cargo Box Entry Panel) - True - Black/White Squares & Shapers Door - 0x0A0C9 (Cargo Box Entry) - 0x0A0C8 -158707 - 0x09F98 (Desert Laser Redirect) - True - True +158707 - 0x09F98 (Desert Laser Redirect Control) - True - True 158220 - 0x18590 (Transparent) - True - Symmetry 158221 - 0x28AE3 (Vines) - 0x18590 - True 158222 - 0x28938 (Apple Tree) - 0x28AE3 - True @@ -895,9 +895,9 @@ Mountainside Vault (Mountainside): Mountaintop (Mountaintop) - Mountain Top Layer - 0x17C34: 158405 - 0x0042D (River Shape) - True - True -158406 - 0x09F7F (Box Short) - 7 Lasers - True +158406 - 0x09F7F (Box Short) - 7 Lasers + Redirect - True 158407 - 0x17C34 (Mountain Entry Panel) - 0x09F7F - Stars & Black/White Squares & Stars + Same Colored Symbol -158800 - 0xFFF00 (Box Long) - 11 Lasers & 0x17C34 - True +158800 - 0xFFF00 (Box Long) - 11 Lasers + Redirect & 0x17C34 - True 159300 - 0x001A3 (River Shape EP) - True - True 159320 - 0x3370E (Arch Black EP) - True - True 159324 - 0x336C8 (Arch White Right EP) - True - True diff --git a/worlds/witness/WitnessLogicExpert.txt b/worlds/witness/WitnessLogicExpert.txt index b1d9b8e3..accb640e 100644 --- a/worlds/witness/WitnessLogicExpert.txt +++ b/worlds/witness/WitnessLogicExpert.txt @@ -474,7 +474,7 @@ Town (Town) - Main Island - True - The Ocean - 0x0A054 - Town Maze Rooftop - 0x2 158218 - 0x0A054 (Boat Spawn) - 0x17CA6 | 0x17CDF | 0x09DB8 | 0x17C95 - Boat 158219 - 0x0A0C8 (Cargo Box Entry Panel) - True - Squares & Black/White Squares & Shapers & Triangles Door - 0x0A0C9 (Cargo Box Entry) - 0x0A0C8 -158707 - 0x09F98 (Desert Laser Redirect) - True - True +158707 - 0x09F98 (Desert Laser Redirect Control) - True - True 158220 - 0x18590 (Transparent) - True - Symmetry 158221 - 0x28AE3 (Vines) - 0x18590 - True 158222 - 0x28938 (Apple Tree) - 0x28AE3 - True @@ -895,9 +895,9 @@ Mountainside Vault (Mountainside): Mountaintop (Mountaintop) - Mountain Top Layer - 0x17C34: 158405 - 0x0042D (River Shape) - True - True -158406 - 0x09F7F (Box Short) - 7 Lasers - True +158406 - 0x09F7F (Box Short) - 7 Lasers + Redirect - True 158407 - 0x17C34 (Mountain Entry Panel) - 0x09F7F - Stars & Black/White Squares & Stars + Same Colored Symbol & Triangles -158800 - 0xFFF00 (Box Long) - 11 Lasers & 0x17C34 - True +158800 - 0xFFF00 (Box Long) - 11 Lasers + Redirect & 0x17C34 - True 159300 - 0x001A3 (River Shape EP) - True - True 159320 - 0x3370E (Arch Black EP) - True - True 159324 - 0x336C8 (Arch White Right EP) - True - True diff --git a/worlds/witness/WitnessLogicVanilla.txt b/worlds/witness/WitnessLogicVanilla.txt index 779ead6b..4c5e52c5 100644 --- a/worlds/witness/WitnessLogicVanilla.txt +++ b/worlds/witness/WitnessLogicVanilla.txt @@ -474,7 +474,7 @@ Town (Town) - Main Island - True - The Ocean - 0x0A054 - Town Maze Rooftop - 0x2 158218 - 0x0A054 (Boat Spawn) - 0x17CA6 | 0x17CDF | 0x09DB8 | 0x17C95 - Boat 158219 - 0x0A0C8 (Cargo Box Entry Panel) - True - Black/White Squares & Shapers Door - 0x0A0C9 (Cargo Box Entry) - 0x0A0C8 -158707 - 0x09F98 (Desert Laser Redirect) - True - True +158707 - 0x09F98 (Desert Laser Redirect Control) - True - True 158220 - 0x18590 (Transparent) - True - Symmetry 158221 - 0x28AE3 (Vines) - 0x18590 - True 158222 - 0x28938 (Apple Tree) - 0x28AE3 - True @@ -895,9 +895,9 @@ Mountainside Vault (Mountainside): Mountaintop (Mountaintop) - Mountain Top Layer - 0x17C34: 158405 - 0x0042D (River Shape) - True - True -158406 - 0x09F7F (Box Short) - 7 Lasers - True +158406 - 0x09F7F (Box Short) - 7 Lasers + Redirect - True 158407 - 0x17C34 (Mountain Entry Panel) - 0x09F7F - Black/White Squares -158800 - 0xFFF00 (Box Long) - 11 Lasers & 0x17C34 - True +158800 - 0xFFF00 (Box Long) - 11 Lasers + Redirect & 0x17C34 - True 159300 - 0x001A3 (River Shape EP) - True - True 159320 - 0x3370E (Arch Black EP) - True - True 159324 - 0x336C8 (Arch White Right EP) - True - True diff --git a/worlds/witness/player_logic.py b/worlds/witness/player_logic.py index e1ef1ae4..e05199c2 100644 --- a/worlds/witness/player_logic.py +++ b/worlds/witness/player_logic.py @@ -103,7 +103,8 @@ class WitnessPlayerLogic: if option_entity in self.EVENT_NAMES_BY_HEX: new_items = frozenset({frozenset([option_entity])}) - elif option_entity in {"7 Lasers", "11 Lasers", "PP2 Weirdness", "Theater to Tunnels"}: + elif option_entity in {"7 Lasers", "11 Lasers", "7 Lasers + Redirect", "11 Lasers + Redirect", + "PP2 Weirdness", "Theater to Tunnels"}: new_items = frozenset({frozenset([option_entity])}) else: new_items = self.reduce_req_within_region(option_entity) diff --git a/worlds/witness/rules.py b/worlds/witness/rules.py index 75c662ac..5eded11a 100644 --- a/worlds/witness/rules.py +++ b/worlds/witness/rules.py @@ -29,8 +29,9 @@ laser_hexes = [ ] -def _has_laser(laser_hex: str, world: "WitnessWorld", player: int) -> Callable[[CollectionState], bool]: - if laser_hex == "0x012FB": +def _has_laser(laser_hex: str, world: "WitnessWorld", player: int, + redirect_required: bool) -> Callable[[CollectionState], bool]: + if laser_hex == "0x012FB" and redirect_required: return lambda state: ( _can_solve_panel(laser_hex, world, world.player, world.player_logic, world.locat)(state) and state.has("Desert Laser Redirection", player) @@ -39,11 +40,11 @@ def _has_laser(laser_hex: str, world: "WitnessWorld", player: int) -> Callable[[ return _can_solve_panel(laser_hex, world, world.player, world.player_logic, world.locat) -def _has_lasers(amount: int, world: "WitnessWorld") -> Callable[[CollectionState], bool]: +def _has_lasers(amount: int, world: "WitnessWorld", redirect_required: bool) -> Callable[[CollectionState], bool]: laser_lambdas = [] for laser_hex in laser_hexes: - has_laser_lambda = _has_laser(laser_hex, world, world.player) + has_laser_lambda = _has_laser(laser_hex, world, world.player, redirect_required) laser_lambdas.append(has_laser_lambda) @@ -155,10 +156,16 @@ def _has_item(item: str, world: "WitnessWorld", player: int, return lambda state: state.can_reach(item, "Region", player) if item == "7 Lasers": laser_req = world.options.mountain_lasers.value - return _has_lasers(laser_req, world) + return _has_lasers(laser_req, world, False) + if item == "7 Lasers + Redirect": + laser_req = world.options.mountain_lasers.value + return _has_lasers(laser_req, world, True) if item == "11 Lasers": laser_req = world.options.challenge_lasers.value - return _has_lasers(laser_req, world) + return _has_lasers(laser_req, world, False) + if item == "11 Lasers + Redirect": + laser_req = world.options.challenge_lasers.value + return _has_lasers(laser_req, world, True) elif item == "PP2 Weirdness": return lambda state: _can_do_expert_pp2(state, world) elif item == "Theater to Tunnels": diff --git a/worlds/witness/settings/Door_Shuffle/Complex_Additional_Panels.txt b/worlds/witness/settings/Door_Shuffle/Complex_Additional_Panels.txt index 79bda7ea..f7acbb2e 100644 --- a/worlds/witness/settings/Door_Shuffle/Complex_Additional_Panels.txt +++ b/worlds/witness/settings/Door_Shuffle/Complex_Additional_Panels.txt @@ -10,6 +10,7 @@ Quarry Boathouse Hook Control (Panel) Monastery Shutters Control (Panel) Town Maze Rooftop Bridge (Panel) Town RGB Control (Panel) +Town Desert Laser Redirect Control (Panel) Windmill Turn Control (Panel) Theater Video Input (Panel) Bunker Drop-Down Door Controls (Panel) diff --git a/worlds/witness/settings/Door_Shuffle/Simple_Panels.txt b/worlds/witness/settings/Door_Shuffle/Simple_Panels.txt index 79da1544..42258bca 100644 --- a/worlds/witness/settings/Door_Shuffle/Simple_Panels.txt +++ b/worlds/witness/settings/Door_Shuffle/Simple_Panels.txt @@ -10,7 +10,7 @@ Monastery Panels Town Church & RGB House Panels Town Maze Panels Windmill & Theater Panels -Town Cargo Box Entry (Panel) +Town Dockside House Panels Treehouse Panels Bunker Panels Swamp Panels diff --git a/worlds/witness/static_logic.py b/worlds/witness/static_logic.py index 29c171d4..0e8d649a 100644 --- a/worlds/witness/static_logic.py +++ b/worlds/witness/static_logic.py @@ -109,7 +109,6 @@ class StaticWitnessLogicObj: "Laser", "Laser Hedges", "Laser Pressure Plates", - "Desert Laser Redirect" } is_vault_or_video = "Vault" in entity_name or "Video" in entity_name