187 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			187 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| 
								 | 
							
								from typing import Dict, List, Set, NamedTuple, Optional
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# ladders in overworld, since it is the most complex area for ladder storage
							 | 
						||
| 
								 | 
							
								class OWLadderInfo(NamedTuple):
							 | 
						||
| 
								 | 
							
								    ladders: Set[str]  # ladders where the top or bottom is at the same elevation
							 | 
						||
| 
								 | 
							
								    portals: List[str]  # portals at the same elevation, only those without doors
							 | 
						||
| 
								 | 
							
								    regions: List[str]  # regions where a melee enemy can hit you out of ladder storage
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# groups for ladders at the same elevation, for use in determing whether you can ls to entrances in diff rulesets
							 | 
						||
| 
								 | 
							
								ow_ladder_groups: Dict[str, OWLadderInfo] = {
							 | 
						||
| 
								 | 
							
								    # lowest elevation
							 | 
						||
| 
								 | 
							
								    "LS Elev 0": OWLadderInfo({"Ladders in Overworld Town", "Ladder to Ruined Atoll", "Ladder to Swamp"},
							 | 
						||
| 
								 | 
							
								                              ["Swamp Redux 2_conduit", "Overworld Cave_", "Atoll Redux_lower", "Maze Room_",
							 | 
						||
| 
								 | 
							
								                              "Town Basement_beach", "Archipelagos Redux_lower", "Archipelagos Redux_lowest"],
							 | 
						||
| 
								 | 
							
								                              ["Overworld Beach"]),
							 | 
						||
| 
								 | 
							
								    # also the east filigree room
							 | 
						||
| 
								 | 
							
								    "LS Elev 1": OWLadderInfo({"Ladders near Weathervane", "Ladders in Overworld Town", "Ladder to Swamp"},
							 | 
						||
| 
								 | 
							
								                              ["Furnace_gyro_lower", "Swamp Redux 2_wall"],
							 | 
						||
| 
								 | 
							
								                              ["Overworld Tunnel Turret"]),
							 | 
						||
| 
								 | 
							
								    # also the fountain filigree room and ruined passage door
							 | 
						||
| 
								 | 
							
								    "LS Elev 2": OWLadderInfo({"Ladders near Weathervane", "Ladders to West Bell"},
							 | 
						||
| 
								 | 
							
								                              ["Archipelagos Redux_upper", "Ruins Passage_east"],
							 | 
						||
| 
								 | 
							
								                              ["After Ruined Passage"]),
							 | 
						||
| 
								 | 
							
								    # also old house door
							 | 
						||
| 
								 | 
							
								    "LS Elev 3": OWLadderInfo({"Ladders near Weathervane", "Ladder to Quarry", "Ladders to West Bell",
							 | 
						||
| 
								 | 
							
								                               "Ladders in Overworld Town"},
							 | 
						||
| 
								 | 
							
								                              [],
							 | 
						||
| 
								 | 
							
								                              ["Overworld after Envoy", "East Overworld"]),
							 | 
						||
| 
								 | 
							
								    # skip top of top ladder next to weathervane level, does not provide logical access to anything
							 | 
						||
| 
								 | 
							
								    "LS Elev 4": OWLadderInfo({"Ladders near Dark Tomb", "Ladder to Quarry", "Ladders to West Bell", "Ladders in Well",
							 | 
						||
| 
								 | 
							
								                               "Ladders in Overworld Town"},
							 | 
						||
| 
								 | 
							
								                              ["Darkwoods Tunnel_"],
							 | 
						||
| 
								 | 
							
								                              []),
							 | 
						||
| 
								 | 
							
								    "LS Elev 5": OWLadderInfo({"Ladders near Overworld Checkpoint", "Ladders near Patrol Cave"},
							 | 
						||
| 
								 | 
							
								                              ["PatrolCave_", "Forest Belltower_", "Fortress Courtyard_", "ShopSpecial_"],
							 | 
						||
| 
								 | 
							
								                              ["East Overworld"]),
							 | 
						||
| 
								 | 
							
								    # skip top of belltower, middle of dark tomb ladders, and top of checkpoint, does not grant access to anything
							 | 
						||
| 
								 | 
							
								    "LS Elev 6": OWLadderInfo({"Ladders near Patrol Cave", "Ladder near Temple Rafters"},
							 | 
						||
| 
								 | 
							
								                              ["Temple_rafters"],
							 | 
						||
| 
								 | 
							
								                              ["Overworld above Patrol Cave"]),
							 | 
						||
| 
								 | 
							
								    # in-line with the chest above dark tomb, gets you up the mountain stairs
							 | 
						||
| 
								 | 
							
								    "LS Elev 7": OWLadderInfo({"Ladders near Patrol Cave", "Ladder near Temple Rafters", "Ladders near Dark Tomb"},
							 | 
						||
| 
								 | 
							
								                              ["Mountain_"],
							 | 
						||
| 
								 | 
							
								                              ["Upper Overworld"]),
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# ladders accessible within different regions of overworld, only those that are relevant
							 | 
						||
| 
								 | 
							
								# other scenes will just have them hardcoded since this type of structure is not necessary there
							 | 
						||
| 
								 | 
							
								region_ladders: Dict[str, Set[str]] = {
							 | 
						||
| 
								 | 
							
								    "Overworld": {"Ladders near Weathervane", "Ladders near Overworld Checkpoint", "Ladders near Dark Tomb",
							 | 
						||
| 
								 | 
							
								                  "Ladders in Overworld Town", "Ladder to Swamp", "Ladders in Well"},
							 | 
						||
| 
								 | 
							
								    "Overworld Beach": {"Ladder to Ruined Atoll"},
							 | 
						||
| 
								 | 
							
								    "Overworld at Patrol Cave": {"Ladders near Patrol Cave"},
							 | 
						||
| 
								 | 
							
								    "Overworld Quarry Entry": {"Ladder to Quarry"},
							 | 
						||
| 
								 | 
							
								    "Overworld Belltower": {"Ladders to West Bell"},
							 | 
						||
| 
								 | 
							
								    "Overworld after Temple Rafters": {"Ladders near Temple Rafters"},
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class LadderInfo(NamedTuple):
							 | 
						||
| 
								 | 
							
								    origin: str  # origin region
							 | 
						||
| 
								 | 
							
								    destination: str  # destination portal
							 | 
						||
| 
								 | 
							
								    ladders_req: Optional[str] = None  # ladders required to do this
							 | 
						||
| 
								 | 
							
								    dest_is_region: bool = False  # whether it is a region that you are going to
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								easy_ls: List[LadderInfo] = [
							 | 
						||
| 
								 | 
							
								    # In the furnace
							 | 
						||
| 
								 | 
							
								    # Furnace ladder to the fuse entrance
							 | 
						||
| 
								 | 
							
								    LadderInfo("Furnace Ladder Area", "Furnace, Overworld Redux_gyro_upper_north"),
							 | 
						||
| 
								 | 
							
								    # Furnace ladder to Dark Tomb
							 | 
						||
| 
								 | 
							
								    LadderInfo("Furnace Ladder Area", "Furnace, Crypt Redux_"),
							 | 
						||
| 
								 | 
							
								    # Furnace ladder to the West Garden connector
							 | 
						||
| 
								 | 
							
								    LadderInfo("Furnace Ladder Area", "Furnace, Overworld Redux_gyro_west"),
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # West Garden
							 | 
						||
| 
								 | 
							
								    # exit after Garden Knight
							 | 
						||
| 
								 | 
							
								    LadderInfo("West Garden", "Archipelagos Redux, Overworld Redux_upper"),
							 | 
						||
| 
								 | 
							
								    # West Garden laurels exit
							 | 
						||
| 
								 | 
							
								    LadderInfo("West Garden", "Archipelagos Redux, Overworld Redux_lowest"),
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # Atoll, use the little ladder you fix at the beginning
							 | 
						||
| 
								 | 
							
								    LadderInfo("Ruined Atoll", "Atoll Redux, Overworld Redux_lower"),
							 | 
						||
| 
								 | 
							
								    LadderInfo("Ruined Atoll", "Atoll Redux, Frog Stairs_mouth"),  # special case
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # East Forest
							 | 
						||
| 
								 | 
							
								    # Entrance by the dancing fox holy cross spot
							 | 
						||
| 
								 | 
							
								    LadderInfo("East Forest", "East Forest Redux, East Forest Redux Laddercave_upper"),
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # From the west side of Guard House 1 to the east side
							 | 
						||
| 
								 | 
							
								    LadderInfo("Guard House 1 West", "East Forest Redux Laddercave, East Forest Redux_gate"),
							 | 
						||
| 
								 | 
							
								    LadderInfo("Guard House 1 West", "East Forest Redux Laddercave, Forest Boss Room_"),
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # Fortress Exterior
							 | 
						||
| 
								 | 
							
								    # shop, ls at the ladder by the telescope
							 | 
						||
| 
								 | 
							
								    LadderInfo("Fortress Exterior from Overworld", "Fortress Courtyard, Shop_"),
							 | 
						||
| 
								 | 
							
								    # Fortress main entry and grave path lower entry, ls at the ladder by the telescope
							 | 
						||
| 
								 | 
							
								    LadderInfo("Fortress Exterior from Overworld", "Fortress Courtyard, Fortress Main_Big Door"),
							 | 
						||
| 
								 | 
							
								    LadderInfo("Fortress Exterior from Overworld", "Fortress Courtyard, Fortress Reliquary_Lower"),
							 | 
						||
| 
								 | 
							
								    # Use the top of the ladder by the telescope
							 | 
						||
| 
								 | 
							
								    LadderInfo("Fortress Exterior from Overworld", "Fortress Courtyard, Fortress Reliquary_Upper"),
							 | 
						||
| 
								 | 
							
								    LadderInfo("Fortress Exterior from Overworld", "Fortress Courtyard, Fortress East_"),
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # same as above, except from the east side of the area
							 | 
						||
| 
								 | 
							
								    LadderInfo("Fortress Exterior from East Forest", "Fortress Courtyard, Overworld Redux_"),
							 | 
						||
| 
								 | 
							
								    LadderInfo("Fortress Exterior from East Forest", "Fortress Courtyard, Shop_"),
							 | 
						||
| 
								 | 
							
								    LadderInfo("Fortress Exterior from East Forest", "Fortress Courtyard, Fortress Main_Big Door"),
							 | 
						||
| 
								 | 
							
								    LadderInfo("Fortress Exterior from East Forest", "Fortress Courtyard, Fortress Reliquary_Lower"),
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # same as above, except from the Beneath the Vault entrance ladder
							 | 
						||
| 
								 | 
							
								    LadderInfo("Fortress Exterior near cave", "Fortress Courtyard, Overworld Redux_", "Ladder to Beneath the Vault"),
							 | 
						||
| 
								 | 
							
								    LadderInfo("Fortress Exterior near cave", "Fortress Courtyard, Fortress Main_Big Door",
							 | 
						||
| 
								 | 
							
								               "Ladder to Beneath the Vault"),
							 | 
						||
| 
								 | 
							
								    LadderInfo("Fortress Exterior near cave", "Fortress Courtyard, Fortress Reliquary_Lower",
							 | 
						||
| 
								 | 
							
								               "Ladder to Beneath the Vault"),
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # Swamp to Gauntlet
							 | 
						||
| 
								 | 
							
								    LadderInfo("Swamp Mid", "Swamp Redux 2, Cathedral Arena_", "Ladders in Swamp"),
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # Ladder by the hero grave
							 | 
						||
| 
								 | 
							
								    LadderInfo("Back of Swamp", "Swamp Redux 2, Overworld Redux_conduit"),
							 | 
						||
| 
								 | 
							
								    LadderInfo("Back of Swamp", "Swamp Redux 2, Shop_"),
							 | 
						||
| 
								 | 
							
								]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# if we can gain elevation or get knocked down, add the harder ones
							 | 
						||
| 
								 | 
							
								medium_ls: List[LadderInfo] = [
							 | 
						||
| 
								 | 
							
								    # region-destination versions of easy ls spots
							 | 
						||
| 
								 | 
							
								    LadderInfo("East Forest", "East Forest Dance Fox Spot", dest_is_region=True),
							 | 
						||
| 
								 | 
							
								    # fortress courtyard knockdowns are never logically relevant, the fuse requires upper
							 | 
						||
| 
								 | 
							
								    LadderInfo("Back of Swamp", "Swamp Mid", dest_is_region=True),
							 | 
						||
| 
								 | 
							
								    LadderInfo("Back of Swamp", "Swamp Front", dest_is_region=True),
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # gain height off the northeast fuse ramp
							 | 
						||
| 
								 | 
							
								    LadderInfo("Ruined Atoll", "Atoll Redux, Frog Stairs_eye"),
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # Upper exit from the Forest Grave Path, use LS at the ladder by the gate switch
							 | 
						||
| 
								 | 
							
								    LadderInfo("Forest Grave Path Main", "Sword Access, East Forest Redux_upper"),
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # Upper exits from the courtyard. Use the ramp in the courtyard, then the blocks north of the first fuse
							 | 
						||
| 
								 | 
							
								    LadderInfo("Fortress Exterior from Overworld", "Fortress Courtyard Upper", dest_is_region=True),
							 | 
						||
| 
								 | 
							
								    LadderInfo("Fortress Exterior from East Forest", "Fortress Courtyard, Fortress Reliquary_Upper"),
							 | 
						||
| 
								 | 
							
								    LadderInfo("Fortress Exterior from East Forest", "Fortress Courtyard, Fortress East_"),
							 | 
						||
| 
								 | 
							
								    LadderInfo("Fortress Exterior from East Forest", "Fortress Courtyard Upper", dest_is_region=True),
							 | 
						||
| 
								 | 
							
								    LadderInfo("Fortress Exterior near cave", "Fortress Courtyard, Fortress Reliquary_Upper",
							 | 
						||
| 
								 | 
							
								               "Ladder to Beneath the Vault"),
							 | 
						||
| 
								 | 
							
								    LadderInfo("Fortress Exterior near cave", "Fortress Courtyard, Fortress East_", "Ladder to Beneath the Vault"),
							 | 
						||
| 
								 | 
							
								    LadderInfo("Fortress Exterior near cave", "Fortress Courtyard Upper", "Ladder to Beneath the Vault",
							 | 
						||
| 
								 | 
							
								               dest_is_region=True),
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # need to gain height to get up the stairs
							 | 
						||
| 
								 | 
							
								    LadderInfo("Lower Mountain", "Mountain, Mountaintop_"),
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # Where the rope is behind Monastery
							 | 
						||
| 
								 | 
							
								    LadderInfo("Quarry Entry", "Quarry Redux, Monastery_back"),
							 | 
						||
| 
								 | 
							
								    LadderInfo("Quarry Monastery Entry", "Quarry Redux, Monastery_back"),
							 | 
						||
| 
								 | 
							
								    LadderInfo("Quarry Back", "Quarry Redux, Monastery_back"),
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    LadderInfo("Rooted Ziggurat Lower Back", "ziggurat2020_3, ziggurat2020_2_"),
							 | 
						||
| 
								 | 
							
								    LadderInfo("Rooted Ziggurat Lower Back", "Rooted Ziggurat Lower Front", dest_is_region=True),
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # Swamp to Overworld upper
							 | 
						||
| 
								 | 
							
								    LadderInfo("Swamp Mid", "Swamp Redux 2, Overworld Redux_wall", "Ladders in Swamp"),
							 | 
						||
| 
								 | 
							
								    LadderInfo("Back of Swamp", "Swamp Redux 2, Overworld Redux_wall"),
							 | 
						||
| 
								 | 
							
								]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								hard_ls: List[LadderInfo] = [
							 | 
						||
| 
								 | 
							
								    # lower ladder, go into the waterfall then above the bonfire, up a ramp, then through the right wall
							 | 
						||
| 
								 | 
							
								    LadderInfo("Beneath the Well Front", "Sewer, Sewer_Boss_", "Ladders in Well"),
							 | 
						||
| 
								 | 
							
								    LadderInfo("Beneath the Well Front", "Sewer, Overworld Redux_west_aqueduct", "Ladders in Well"),
							 | 
						||
| 
								 | 
							
								    LadderInfo("Beneath the Well Front", "Beneath the Well Back", "Ladders in Well", dest_is_region=True),
							 | 
						||
| 
								 | 
							
								    # go through the hexagon engraving above the vault door
							 | 
						||
| 
								 | 
							
								    LadderInfo("Frog's Domain", "frog cave main, Frog Stairs_Exit", "Ladders to Frog's Domain"),
							 | 
						||
| 
								 | 
							
								    # the turret at the end here is not affected by enemy rando
							 | 
						||
| 
								 | 
							
								    LadderInfo("Frog's Domain", "Frog's Domain Back", "Ladders to Frog's Domain", dest_is_region=True),
							 | 
						||
| 
								 | 
							
								    # todo: see if we can use that new laurels strat here
							 | 
						||
| 
								 | 
							
								    # LadderInfo("Rooted Ziggurat Lower Back", "ziggurat2020_3, ziggurat2020_FTRoom_"),
							 | 
						||
| 
								 | 
							
								    # go behind the cathedral to reach the door, pretty easily doable
							 | 
						||
| 
								 | 
							
								    LadderInfo("Swamp Mid", "Swamp Redux 2, Cathedral Redux_main", "Ladders in Swamp"),
							 | 
						||
| 
								 | 
							
								    LadderInfo("Back of Swamp", "Swamp Redux 2, Cathedral Redux_main"),
							 | 
						||
| 
								 | 
							
								    # need to do hc midair, probably cannot get into this without hc
							 | 
						||
| 
								 | 
							
								    LadderInfo("Swamp Mid", "Swamp Redux 2, Cathedral Redux_secret", "Ladders in Swamp"),
							 | 
						||
| 
								 | 
							
								    LadderInfo("Back of Swamp", "Swamp Redux 2, Cathedral Redux_secret"),
							 | 
						||
| 
								 | 
							
								]
							 |