Files
Grinch-AP/worlds/witness/regions.py
NewSoupVi 4fcde135e5 The Witness: Renaming, Options, Logic Fixes (#1000)
Fixes to postgame detection for "shuffle_postgame"
Renamed many locations to be symbol-independent ("Outside Tutorial Dots Introduction" becomes "Outside Tutorial Shed Row"). This is to set up future alternate modes, like Sigma Expert, which use completely different symbols.
Renamed most door items to be shorter, more consistent, and less... stupid. ("Bunker Bunker Entry Door" -> "Bunker Entry")
Removed "shuffle_uncommon"
Many logic fixes
2022-09-18 04:20:59 +02:00

101 lines
3.8 KiB
Python

"""
Defines Region for The Witness, assigns locations to them,
and connects them with the proper requirements
"""
from BaseClasses import MultiWorld, Entrance
from . import StaticWitnessLogic
from .locations import WitnessPlayerLocations
from .player_logic import WitnessPlayerLogic
class WitnessRegions:
"""Class that defines Witness Regions"""
locat = None
logic = None
def make_lambda(self, panel_hex_to_solve_set, world, player, player_logic):
"""
Lambdas are made in a for loop, so the values have to be captured
This function is for that purpose
"""
return lambda state: state._witness_can_solve_panels(
panel_hex_to_solve_set, world, player, player_logic, self.locat
)
def connect(self, world: MultiWorld, player: int, source: str, target: str, player_logic: WitnessPlayerLogic,
panel_hex_to_solve_set=None):
"""
connect two regions and set the corresponding requirement
"""
source_region = world.get_region(source, player)
target_region = world.get_region(target, player)
#print(source_region)
#print(target_region)
#print("---")
connection = Entrance(
player,
source + " to " + target + " via " + str(panel_hex_to_solve_set),
source_region
)
connection.access_rule = self.make_lambda(panel_hex_to_solve_set, world, player, player_logic)
source_region.exits.append(connection)
connection.connect(target_region)
def create_regions(self, world, player: int, player_logic: WitnessPlayerLogic):
"""
Creates all the regions for The Witness
"""
from . import create_region
world.regions += [
create_region(world, player, 'Menu', self.locat, None, ["The Splashscreen?"]),
]
all_locations = set()
for region_name, region in StaticWitnessLogic.ALL_REGIONS_BY_NAME.items():
locations_for_this_region = [
StaticWitnessLogic.CHECKS_BY_HEX[panel]["checkName"] for panel in region["panels"]
if StaticWitnessLogic.CHECKS_BY_HEX[panel]["checkName"] in self.locat.CHECK_LOCATION_TABLE
]
locations_for_this_region += [
StaticWitnessLogic.CHECKS_BY_HEX[panel]["checkName"] + " Solved" for panel in region["panels"]
if StaticWitnessLogic.CHECKS_BY_HEX[panel]["checkName"] + " Solved" in self.locat.EVENT_LOCATION_TABLE
]
all_locations = all_locations | set(locations_for_this_region)
world.regions += [
create_region(world, player, region_name, self.locat, locations_for_this_region)
]
for region_name, region in StaticWitnessLogic.ALL_REGIONS_BY_NAME.items():
for connection in player_logic.CONNECTIONS_BY_REGION_NAME[region_name]:
if connection[0] == "Entry":
continue
if connection[1] == frozenset({frozenset(["TrueOneWay"])}):
self.connect(world, player, region_name, connection[0], player_logic, frozenset({frozenset()}))
continue
for subset in connection[1]:
if all({panel in player_logic.DOOR_ITEMS_BY_ID for panel in subset}):
if all({StaticWitnessLogic.CHECKS_BY_HEX[panel]["id"] is None for panel in subset}):
self.connect(world, player, connection[0], region_name, player_logic, frozenset({subset}))
self.connect(world, player, region_name, connection[0], player_logic, connection[1])
world.get_entrance("The Splashscreen?", player).connect(
world.get_region('First Hallway', player)
)
def __init__(self, locat: WitnessPlayerLocations):
self.locat = locat