995 lines
		
	
	
		
			46 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			995 lines
		
	
	
		
			46 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| 
								 | 
							
								from logic.helpers import Bosses
							 | 
						||
| 
								 | 
							
								from utils.parameters import Settings
							 | 
						||
| 
								 | 
							
								from rom.rom_patches import RomPatches
							 | 
						||
| 
								 | 
							
								from logic.smbool import SMBool
							 | 
						||
| 
								 | 
							
								from graph.location import locationsDict
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								locationsDict["Energy Tank, Gauntlet"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'Landing Site': lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Energy Tank, Gauntlet"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: sm.wor(sm.canEnterAndLeaveGauntlet(),
							 | 
						||
| 
								 | 
							
								                      sm.wand(sm.canShortCharge(),
							 | 
						||
| 
								 | 
							
								                              sm.canEnterAndLeaveGauntletQty(1, 0)), # thanks ponk! https://youtu.be/jil5zTBCF1s
							 | 
						||
| 
								 | 
							
								                      sm.canDoLowGauntlet())
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Bomb"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'Landing Site': lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Bomb"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: sm.wand(sm.haveItem('Morph'),
							 | 
						||
| 
								 | 
							
								                       sm.traverse('FlywayRight'))
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Bomb"].PostAvailable = (
							 | 
						||
| 
								 | 
							
								    lambda sm: sm.wor(sm.knowsAlcatrazEscape(),
							 | 
						||
| 
								 | 
							
								                      sm.canPassBombPassages())
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Energy Tank, Terminator"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'Landing Site': lambda sm: sm.canPassTerminatorBombWall(),
							 | 
						||
| 
								 | 
							
								    'Lower Mushrooms Left': lambda sm: sm.canPassCrateriaGreenPirates(),
							 | 
						||
| 
								 | 
							
								    'Gauntlet Top': lambda sm: sm.haveItem('Morph')
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Energy Tank, Terminator"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Reserve Tank, Brinstar"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'Green Brinstar Elevator': lambda sm: sm.wor(RomPatches.has(sm.player, RomPatches.BrinReserveBlueDoors), sm.traverse('MainShaftRight'))
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Reserve Tank, Brinstar"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: sm.wand(sm.wor(sm.canMockball(),
							 | 
						||
| 
								 | 
							
								                              sm.haveItem('SpeedBooster')),
							 | 
						||
| 
								 | 
							
								                       sm.wor(RomPatches.has(sm.player, RomPatches.BrinReserveBlueDoors), sm.traverse('EarlySupersRight')))
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Charge Beam"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'Big Pink': lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Charge Beam"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: sm.canPassBombPassages()
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Morphing Ball"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'Blue Brinstar Elevator Bottom': lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Morphing Ball"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Energy Tank, Brinstar Ceiling"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'Blue Brinstar Elevator Bottom': lambda sm: sm.wor(RomPatches.has(sm.player, RomPatches.BlueBrinstarBlueDoor), sm.traverse('ConstructionZoneRight'))
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Energy Tank, Brinstar Ceiling"].Available = (
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    lambda sm: sm.wor(sm.knowsCeilingDBoost(),
							 | 
						||
| 
								 | 
							
								                      sm.canFly(),
							 | 
						||
| 
								 | 
							
								                      sm.wor(sm.haveItem('HiJump'),
							 | 
						||
| 
								 | 
							
								                             sm.haveItem('Ice'),
							 | 
						||
| 
								 | 
							
								                             sm.wand(sm.canUsePowerBombs(),
							 | 
						||
| 
								 | 
							
								                                     sm.haveItem('SpeedBooster')),
							 | 
						||
| 
								 | 
							
								                             sm.canSimpleShortCharge()))
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Energy Tank, Etecoons"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'Etecoons Bottom': lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Energy Tank, Etecoons"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Energy Tank, Waterway"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'Big Pink': lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Energy Tank, Waterway"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: sm.wand(sm.canUsePowerBombs(),
							 | 
						||
| 
								 | 
							
								                       sm.traverse('BigPinkBottomLeft'),
							 | 
						||
| 
								 | 
							
								                       sm.haveItem('SpeedBooster'),
							 | 
						||
| 
								 | 
							
								                       sm.wor(sm.haveItem('Gravity'),
							 | 
						||
| 
								 | 
							
								                              sm.canSimpleShortCharge())) # from the blocks above the water
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Energy Tank, Brinstar Gate"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'Big Pink': lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Energy Tank, Brinstar Gate"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: sm.wand(sm.traverse('BigPinkRight'),
							 | 
						||
| 
								 | 
							
								                       sm.wor(sm.haveItem('Wave'),
							 | 
						||
| 
								 | 
							
								                              sm.wand(sm.haveItem('Super'),
							 | 
						||
| 
								 | 
							
								                                      sm.haveItem('HiJump'),
							 | 
						||
| 
								 | 
							
								                                      sm.knowsReverseGateGlitch()),
							 | 
						||
| 
								 | 
							
								                              sm.wand(sm.haveItem('Super'),
							 | 
						||
| 
								 | 
							
								                                      sm.knowsReverseGateGlitchHiJumpLess())))
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["X-Ray Scope"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'Red Tower Top Left': lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["X-Ray Scope"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: sm.wand(sm.canUsePowerBombs(),
							 | 
						||
| 
								 | 
							
								                       sm.traverse('RedTowerLeft'),
							 | 
						||
| 
								 | 
							
								                       sm.traverse('RedBrinstarFirefleaLeft'),
							 | 
						||
| 
								 | 
							
								                       sm.wor(sm.haveItem('Grapple'),
							 | 
						||
| 
								 | 
							
								                              sm.haveItem('SpaceJump'),
							 | 
						||
| 
								 | 
							
								                              sm.wand(sm.energyReserveCountOkHardRoom('X-Ray'),
							 | 
						||
| 
								 | 
							
								                                      sm.wor(sm.knowsXrayDboost(),
							 | 
						||
| 
								 | 
							
								                                             sm.wand(sm.haveItem('Ice'),
							 | 
						||
| 
								 | 
							
								                                                     sm.wor(sm.haveItem('HiJump'), sm.knowsXrayIce())),
							 | 
						||
| 
								 | 
							
								                                             sm.canInfiniteBombJump(),
							 | 
						||
| 
								 | 
							
								                                             sm.wand(sm.haveItem('HiJump'),
							 | 
						||
| 
								 | 
							
								                                                     sm.wor(sm.haveItem('SpeedBooster'),
							 | 
						||
| 
								 | 
							
								                                                            sm.canSpringBallJump()))))))
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Spazer"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'East Tunnel Right': lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Spazer"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: sm.wand(sm.traverse('BelowSpazerTopRight'),
							 | 
						||
| 
								 | 
							
								                       sm.wor(sm.canPassBombPassages(),
							 | 
						||
| 
								 | 
							
								                              sm.wand(sm.haveItem('Morph'),
							 | 
						||
| 
								 | 
							
								                                      RomPatches.has(sm.player, RomPatches.SpazerShotBlock))))
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Energy Tank, Kraid"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'Warehouse Zeela Room Left': lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Energy Tank, Kraid"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: sm.wand(Bosses.bossDead(sm, 'Kraid'),
							 | 
						||
| 
								 | 
							
								                       # kill the beetoms to unlock the door to get out
							 | 
						||
| 
								 | 
							
								                       sm.canKillBeetoms())
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Kraid"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'KraidRoomIn': lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Kraid"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: sm.enoughStuffsKraid()
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Varia Suit"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'KraidRoomIn': lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Varia Suit"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: Bosses.bossDead(sm, 'Kraid')
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Ice Beam"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'Business Center': lambda sm: sm.traverse('BusinessCenterTopLeft')
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Ice Beam"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: sm.wand(sm.canHellRun(**Settings.hellRunsTable['Ice']['Norfair Entrance -> Ice Beam']),
							 | 
						||
| 
								 | 
							
								                       sm.wor(sm.canPassBombPassages(), # to exit, or if you fail entrance
							 | 
						||
| 
								 | 
							
								                              sm.wand(sm.haveItem('Ice'), # harder strat
							 | 
						||
| 
								 | 
							
								                                      sm.haveItem('Morph'),
							 | 
						||
| 
								 | 
							
								                                      sm.knowsIceEscape())),
							 | 
						||
| 
								 | 
							
								                       sm.wor(sm.wand(sm.haveItem('Morph'),
							 | 
						||
| 
								 | 
							
								                                      sm.knowsMockball()),
							 | 
						||
| 
								 | 
							
								                              sm.haveItem('SpeedBooster')))
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Energy Tank, Crocomire"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'Crocomire Room Top': lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Energy Tank, Crocomire"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: sm.wand(sm.enoughStuffCroc(),
							 | 
						||
| 
								 | 
							
								                       sm.wor(sm.haveItem('Grapple'),
							 | 
						||
| 
								 | 
							
								                              sm.haveItem('SpaceJump'),
							 | 
						||
| 
								 | 
							
								                              sm.energyReserveCountOk(3/sm.getDmgReduction()[0])))
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Hi-Jump Boots"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'Business Center': lambda sm: sm.wor(RomPatches.has(sm.player, RomPatches.HiJumpAreaBlueDoor), sm.traverse('BusinessCenterBottomLeft'))
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Hi-Jump Boots"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: sm.haveItem('Morph')
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Hi-Jump Boots"].PostAvailable = (
							 | 
						||
| 
								 | 
							
								    lambda sm: sm.wor(sm.canPassBombPassages(),
							 | 
						||
| 
								 | 
							
								                      sm.wand(sm.haveItem('Morph'), RomPatches.has(sm.player, RomPatches.HiJumpShotBlock)))
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Grapple Beam"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'Crocomire Room Top': lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Grapple Beam"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: sm.wand(sm.enoughStuffCroc(),
							 | 
						||
| 
								 | 
							
								                       sm.wor(sm.wand(sm.haveItem('Morph'),
							 | 
						||
| 
								 | 
							
								                                      sm.canFly()),
							 | 
						||
| 
								 | 
							
								                              sm.wand(sm.haveItem('SpeedBooster'),
							 | 
						||
| 
								 | 
							
								                                      sm.wor(sm.knowsShortCharge(),
							 | 
						||
| 
								 | 
							
								                                             sm.canUsePowerBombs())),
							 | 
						||
| 
								 | 
							
								                              sm.wand(sm.haveItem('Morph'),
							 | 
						||
| 
								 | 
							
								                                      sm.wor(sm.haveItem('SpeedBooster'),
							 | 
						||
| 
								 | 
							
								                                             sm.canSpringBallJump()),
							 | 
						||
| 
								 | 
							
								                                      sm.haveItem('HiJump')), # jump from the yellow plateform ennemy
							 | 
						||
| 
								 | 
							
								                              sm.canGreenGateGlitch()))
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Grapple Beam"].PostAvailable = (
							 | 
						||
| 
								 | 
							
								    lambda sm: sm.wor(sm.haveItem('Morph'), # regular exit
							 | 
						||
| 
								 | 
							
								                      sm.wand(sm.haveItem('Super'), # grapple escape reverse
							 | 
						||
| 
								 | 
							
								                              sm.wor(sm.canFly(), # Grapple Tutorial Room 2
							 | 
						||
| 
								 | 
							
								                                     sm.haveItem('HiJump'),
							 | 
						||
| 
								 | 
							
								                                     sm.haveItem('Grapple')),
							 | 
						||
| 
								 | 
							
								                              sm.wor(sm.haveItem('Gravity'), # Grapple Tutorial Room 3
							 | 
						||
| 
								 | 
							
								                                     sm.haveItem('SpaceJump'),
							 | 
						||
| 
								 | 
							
								                                     sm.haveItem('Grapple'))))
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Reserve Tank, Norfair"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'Bubble Mountain': lambda sm: sm.canEnterNorfairReserveAreaFromBubbleMoutain(),
							 | 
						||
| 
								 | 
							
								    'Bubble Mountain Top': lambda sm: sm.canEnterNorfairReserveAreaFromBubbleMoutainTop(),
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Reserve Tank, Norfair"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: sm.wand(sm.haveItem('Morph'), sm.canHellRun(**Settings.hellRunsTable['MainUpperNorfair']['Bubble -> Norfair Reserve']))
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Speed Booster"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'Bubble Mountain Top': lambda sm: sm.wor(RomPatches.has(sm.player, RomPatches.SpeedAreaBlueDoors),
							 | 
						||
| 
								 | 
							
								                                             sm.wand(sm.traverse('BubbleMountainTopRight'),
							 | 
						||
| 
								 | 
							
								                                                     sm.traverse('SpeedBoosterHallRight')))
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Speed Booster"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: sm.canHellRunToSpeedBooster()
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Wave Beam"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'Bubble Mountain Top': lambda sm: sm.canAccessDoubleChamberItems()
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Wave Beam"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: sm.traverse('DoubleChamberRight')
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Wave Beam"].PostAvailable = (
							 | 
						||
| 
								 | 
							
								    lambda sm: sm.wor(sm.haveItem('Morph'), # exit through lower passage under the spikes
							 | 
						||
| 
								 | 
							
								                      sm.wand(sm.wor(sm.haveItem('SpaceJump'), # exit through blue gate
							 | 
						||
| 
								 | 
							
								                                     sm.haveItem('Grapple')),
							 | 
						||
| 
								 | 
							
								                              sm.wor(sm.wand(sm.canBlueGateGlitch(), sm.heatProof()), # hell run + green gate glitch is too much
							 | 
						||
| 
								 | 
							
								                                     sm.haveItem('Wave'))))
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Ridley"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'RidleyRoomIn': lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Ridley"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: sm.wand(sm.canHellRun(**Settings.hellRunsTable['LowerNorfair']['Main']), sm.enoughStuffsRidley())
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Energy Tank, Ridley"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'RidleyRoomIn': lambda sm: sm.haveItem('Ridley')
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Energy Tank, Ridley"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: sm.haveItem('Morph')
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Screw Attack"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'Screw Attack Bottom': lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Screw Attack"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Screw Attack"].PostAvailable = (
							 | 
						||
| 
								 | 
							
								    lambda sm: sm.canExitScrewAttackArea()
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Energy Tank, Firefleas"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'Firefleas': lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Energy Tank, Firefleas"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: sm.wor(RomPatches.has(sm.player, RomPatches.FirefleasRemoveFune),
							 | 
						||
| 
								 | 
							
								                      # get past the fune
							 | 
						||
| 
								 | 
							
								                                     sm.haveItem('Super'),
							 | 
						||
| 
								 | 
							
								                      sm.canPassBombPassages(),
							 | 
						||
| 
								 | 
							
								                      sm.canUseSpringBall())
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Energy Tank, Firefleas"].PostAvailable = (
							 | 
						||
| 
								 | 
							
								    lambda sm: sm.wor(sm.knowsFirefleasWalljump(),
							 | 
						||
| 
								 | 
							
								                      sm.wor(sm.haveItem('Ice'),
							 | 
						||
| 
								 | 
							
								                             sm.haveItem('HiJump'),
							 | 
						||
| 
								 | 
							
								                             sm.canFly(),
							 | 
						||
| 
								 | 
							
								                             sm.canSpringBallJump()))
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Reserve Tank, Wrecked Ship"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'Wrecked Ship Main': lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Reserve Tank, Wrecked Ship"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: sm.wand(sm.canUsePowerBombs(),
							 | 
						||
| 
								 | 
							
								                       sm.haveItem('SpeedBooster'),
							 | 
						||
| 
								 | 
							
								                       sm.canPassBowling())
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Energy Tank, Wrecked Ship"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'Wrecked Ship Back': lambda sm: sm.wor(RomPatches.has(sm.player, RomPatches.WsEtankBlueDoor),
							 | 
						||
| 
								 | 
							
								                                           sm.traverse('ElectricDeathRoomTopLeft'))
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Energy Tank, Wrecked Ship"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: sm.wor(Bosses.bossDead(sm, 'Phantoon'),
							 | 
						||
| 
								 | 
							
								                      RomPatches.has(sm.player, RomPatches.WsEtankPhantoonAlive))
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Phantoon"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'PhantoonRoomIn': lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Phantoon"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: sm.enoughStuffsPhantoon()
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Right Super, Wrecked Ship"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'Wrecked Ship Main': lambda sm: Bosses.bossDead(sm, 'Phantoon')
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Right Super, Wrecked Ship"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: sm.canPassBombPassages()
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Gravity Suit"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'Wrecked Ship Main': lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Gravity Suit"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: sm.wand(sm.canPassBombPassages(),
							 | 
						||
| 
								 | 
							
								                       sm.canPassBowling())
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Energy Tank, Mama turtle"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'Main Street Bottom': lambda sm: sm.wand(sm.canDoOuterMaridia(),
							 | 
						||
| 
								 | 
							
								                                             sm.wor(sm.traverse('FishTankRight'),
							 | 
						||
| 
								 | 
							
								                                                    RomPatches.has(sm.player, RomPatches.MamaTurtleBlueDoor)),
							 | 
						||
| 
								 | 
							
								                                             sm.wor(sm.wor(sm.canFly(),
							 | 
						||
| 
								 | 
							
								                                                           sm.wand(sm.haveItem('Gravity'),
							 | 
						||
| 
								 | 
							
								                                                                   sm.haveItem('SpeedBooster')),
							 | 
						||
| 
								 | 
							
								                                                           sm.wand(sm.haveItem('HiJump'),
							 | 
						||
| 
								 | 
							
								                                                                   sm.haveItem('SpeedBooster'),
							 | 
						||
| 
								 | 
							
								                                                                   sm.knowsHiJumpMamaTurtle())),
							 | 
						||
| 
								 | 
							
								                                                    sm.wor(sm.wand(sm.canUseSpringBall(),
							 | 
						||
| 
								 | 
							
								                                                                   sm.wor(sm.wand(sm.haveItem('HiJump'),
							 | 
						||
| 
								 | 
							
								                                                                                  sm.knowsSpringBallJump()),
							 | 
						||
| 
								 | 
							
								                                                                          sm.knowsSpringBallJumpFromWall())),
							 | 
						||
| 
								 | 
							
								                                                           sm.haveItem('Grapple')))),
							 | 
						||
| 
								 | 
							
								    'Mama Turtle': lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Energy Tank, Mama turtle"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Plasma Beam"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'Toilet Top': lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Plasma Beam"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: Bosses.bossDead(sm, 'Draygon')
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Plasma Beam"].PostAvailable = (
							 | 
						||
| 
								 | 
							
								    lambda sm: sm.wand(sm.wor(sm.wand(sm.canShortCharge(),
							 | 
						||
| 
								 | 
							
								                                      sm.knowsKillPlasmaPiratesWithSpark()),
							 | 
						||
| 
								 | 
							
								                              sm.wand(sm.canFireChargedShots(),
							 | 
						||
| 
								 | 
							
								                                      sm.knowsKillPlasmaPiratesWithCharge(),
							 | 
						||
| 
								 | 
							
								                                      # 160/80/40 dmg * 4 ground plasma pirates
							 | 
						||
| 
								 | 
							
								                                      # => 640/320/160 damage take required
							 | 
						||
| 
								 | 
							
								                                      # check below is 1099/599/299 (give margin for taking dmg a bit)
							 | 
						||
| 
								 | 
							
								                                      # (* 4 for nerfed charge, since you need to take hits 4 times instead of one)
							 | 
						||
| 
								 | 
							
								                                                       sm.energyReserveCountOk(int(10.0 * sm.getPiratesPseudoScrewCoeff()/sm.getDmgReduction(False)[0]))),
							 | 
						||
| 
								 | 
							
								                              sm.haveItem('ScrewAttack'),
							 | 
						||
| 
								 | 
							
								                              sm.haveItem('Plasma')),
							 | 
						||
| 
								 | 
							
								                       sm.wor(sm.canFly(),
							 | 
						||
| 
								 | 
							
								                              sm.wand(sm.haveItem('HiJump'),
							 | 
						||
| 
								 | 
							
								                                      sm.knowsGetAroundWallJump()),
							 | 
						||
| 
								 | 
							
								                              sm.canShortCharge(),
							 | 
						||
| 
								 | 
							
								                              sm.wand(sm.canSpringBallJump(),
							 | 
						||
| 
								 | 
							
								                                      sm.knowsSpringBallJumpFromWall())))
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Reserve Tank, Maridia"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'Left Sandpit': lambda sm: sm.canClimbWestSandHole()
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Reserve Tank, Maridia"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: sm.canAccessItemsInWestSandHole()
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Spring Ball"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'Oasis Bottom': lambda sm: sm.canTraverseSandPits()
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Spring Ball"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: sm.wand(sm.canUsePowerBombs(), # in Shaktool room to let Shaktool access the sand blocks
							 | 
						||
| 
								 | 
							
								                       sm.wor(sm.wand(sm.haveItem('Ice'), # puyo clip
							 | 
						||
| 
								 | 
							
								                                      sm.wor(sm.wand(sm.haveItem('Gravity'),
							 | 
						||
| 
								 | 
							
								                                                     sm.knowsPuyoClip()),
							 | 
						||
| 
								 | 
							
								                                             sm.wand(sm.haveItem('Gravity'),
							 | 
						||
| 
								 | 
							
								                                                     sm.haveItem('XRayScope'),
							 | 
						||
| 
								 | 
							
								                                                     sm.knowsPuyoClipXRay()),
							 | 
						||
| 
								 | 
							
								                                             sm.knowsSuitlessPuyoClip())),
							 | 
						||
| 
								 | 
							
								                              sm.wand(sm.haveItem('Grapple'), # go through grapple block
							 | 
						||
| 
								 | 
							
								                                      sm.wor(sm.wand(sm.haveItem('Gravity'),
							 | 
						||
| 
								 | 
							
								                                                     sm.wor(sm.wor(sm.wand(sm.haveItem('HiJump'), sm.knowsAccessSpringBallWithHiJump()),
							 | 
						||
| 
								 | 
							
								                                                                   sm.haveItem('SpaceJump')),
							 | 
						||
| 
								 | 
							
								                                                            sm.knowsAccessSpringBallWithGravJump(),
							 | 
						||
| 
								 | 
							
								                                                            sm.wand(sm.haveItem('Bomb'),
							 | 
						||
| 
								 | 
							
								                                                                    sm.wor(sm.knowsAccessSpringBallWithBombJumps(),
							 | 
						||
| 
								 | 
							
								                                                                           sm.wand(sm.haveItem('SpringBall'),
							 | 
						||
| 
								 | 
							
								                                                                                   sm.knowsAccessSpringBallWithSpringBallBombJumps()))),
							 | 
						||
| 
								 | 
							
								                                                            sm.wand(sm.haveItem('SpringBall'), sm.knowsAccessSpringBallWithSpringBallJump()))),
							 | 
						||
| 
								 | 
							
								                                             sm.wand(sm.haveItem('SpaceJump'), sm.knowsAccessSpringBallWithFlatley()))),
							 | 
						||
| 
								 | 
							
								                              sm.wand(sm.haveItem('XRayScope'), sm.knowsAccessSpringBallWithXRayClimb()), # XRay climb
							 | 
						||
| 
								 | 
							
								                              sm.canCrystalFlashClip()),
							 | 
						||
| 
								 | 
							
								                       sm.wor(sm.haveItem('Gravity'), sm.canUseSpringBall())) # acess the item in spring ball room
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Spring Ball"].PostAvailable = (
							 | 
						||
| 
								 | 
							
								    lambda sm: sm.wor(sm.wand(sm.haveItem('Gravity'),
							 | 
						||
| 
								 | 
							
								                              sm.wor(sm.haveItem('HiJump'),
							 | 
						||
| 
								 | 
							
								                                     sm.canFly(),
							 | 
						||
| 
								 | 
							
								                                     sm.knowsMaridiaWallJumps())),
							 | 
						||
| 
								 | 
							
								                      sm.canSpringBallJump())
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Energy Tank, Botwoon"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'Post Botwoon': lambda sm: sm.canJumpUnderwater()
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Energy Tank, Botwoon"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: sm.haveItem('Morph')
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Draygon"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'Draygon Room Bottom': lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Draygon"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Space Jump"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'Draygon Room Bottom': lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Space Jump"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Space Jump"].PostAvailable = (
							 | 
						||
| 
								 | 
							
								    lambda sm: Bosses.bossDead(sm, 'Draygon')
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Mother Brain"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'Golden Four': lambda sm: Bosses.allBossesDead(sm)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Mother Brain"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: sm.enoughStuffTourian()
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Power Bomb (Crateria surface)"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'Landing Site': lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Power Bomb (Crateria surface)"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: sm.wand(sm.traverse('LandingSiteTopRight'),
							 | 
						||
| 
								 | 
							
								                       sm.wor(sm.haveItem('SpeedBooster'),
							 | 
						||
| 
								 | 
							
								                              sm.canFly()))
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (outside Wrecked Ship bottom)"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'West Ocean Left': lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (outside Wrecked Ship bottom)"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: sm.haveItem('Morph')
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (outside Wrecked Ship bottom)"].PostAvailable = (
							 | 
						||
| 
								 | 
							
								    lambda sm: sm.canPassBombPassages()
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (outside Wrecked Ship top)"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'Wrecked Ship Main': lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (outside Wrecked Ship top)"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: Bosses.bossDead(sm, 'Phantoon')
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (outside Wrecked Ship middle)"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'Wrecked Ship Main': lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (outside Wrecked Ship middle)"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: sm.wand(sm.haveItem('Super'), sm.haveItem('Morph'), Bosses.bossDead(sm, 'Phantoon'))
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (Crateria moat)"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'Moat Left': lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (Crateria moat)"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (Crateria bottom)"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'Landing Site': lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (Crateria bottom)"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: sm.wor(sm.canDestroyBombWalls(),
							 | 
						||
| 
								 | 
							
								                      sm.wand(sm.haveItem('SpeedBooster'),
							 | 
						||
| 
								 | 
							
								                              sm.knowsOldMBWithSpeed()))
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (Crateria gauntlet right)"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'Landing Site': lambda sm: sm.wor(sm.wand(sm.canEnterAndLeaveGauntlet(),
							 | 
						||
| 
								 | 
							
								                                              sm.canPassBombPassages()),
							 | 
						||
| 
								 | 
							
								                                      sm.canDoLowGauntlet()),
							 | 
						||
| 
								 | 
							
								    'Gauntlet Top': lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (Crateria gauntlet right)"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (Crateria gauntlet left)"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'Landing Site': lambda sm: sm.wor(sm.wand(sm.canEnterAndLeaveGauntlet(),
							 | 
						||
| 
								 | 
							
								                                              sm.canPassBombPassages()),
							 | 
						||
| 
								 | 
							
								                                      sm.canDoLowGauntlet()),
							 | 
						||
| 
								 | 
							
								    'Gauntlet Top': lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (Crateria gauntlet left)"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Super Missile (Crateria)"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'Landing Site': lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Super Missile (Crateria)"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: sm.wand(sm.canPassBombPassages(),
							 | 
						||
| 
								 | 
							
								                       sm.traverse("ClimbRight"),
							 | 
						||
| 
								 | 
							
								                       sm.haveItem('SpeedBooster'),
							 | 
						||
| 
								 | 
							
								                       # reserves are hard to trigger midspark when not having ETanks
							 | 
						||
| 
								 | 
							
								                                      sm.wor(sm.wand(sm.energyReserveCountOk(2), sm.itemCountOk('ETank', 1)), # need energy to get out
							 | 
						||
| 
								 | 
							
								                                             sm.wand(sm.itemCountOk('ETank', 1),
							 | 
						||
| 
								 | 
							
								                                                     sm.wor(sm.haveItem('Grapple'), # use grapple/space or dmg protection to get out
							 | 
						||
| 
								 | 
							
								                                                            sm.haveItem('SpaceJump'),
							 | 
						||
| 
								 | 
							
								                                                            sm.heatProof()))),
							 | 
						||
| 
								 | 
							
								                       sm.wor(sm.haveItem('Ice'),
							 | 
						||
| 
								 | 
							
								                              sm.wand(sm.canSimpleShortCharge(), sm.canUsePowerBombs()))) # there's also a dboost involved in simple short charge or you have to kill the yellow enemies with some power bombs
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (Crateria middle)"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'Landing Site': lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (Crateria middle)"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: sm.canPassBombPassages()
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Power Bomb (green Brinstar bottom)"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'Etecoons Bottom': lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Power Bomb (green Brinstar bottom)"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: sm.wand(sm.haveItem('Morph'),
							 | 
						||
| 
								 | 
							
								                       sm.canKillBeetoms())
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Super Missile (pink Brinstar)"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'Big Pink': lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Super Missile (pink Brinstar)"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: sm.wor(sm.wand(sm.traverse('BigPinkTopRight'),
							 | 
						||
| 
								 | 
							
								                              sm.enoughStuffSporeSpawn()),
							 | 
						||
| 
								 | 
							
								                      # back way into spore spawn
							 | 
						||
| 
								 | 
							
								                                     sm.wand(sm.canOpenGreenDoors(),
							 | 
						||
| 
								 | 
							
								                                             sm.canPassBombPassages()))
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Super Missile (pink Brinstar)"].PostAvailable = (
							 | 
						||
| 
								 | 
							
								    lambda sm: sm.wand(sm.canOpenGreenDoors(),
							 | 
						||
| 
								 | 
							
								                       sm.canPassBombPassages())
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (green Brinstar below super missile)"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'Green Brinstar Elevator': lambda sm: sm.wor(RomPatches.has(sm.player, RomPatches.BrinReserveBlueDoors), sm.traverse('MainShaftRight'))
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (green Brinstar below super missile)"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (green Brinstar below super missile)"].PostAvailable = (
							 | 
						||
| 
								 | 
							
								    lambda sm: sm.wor(RomPatches.has(sm.player, RomPatches.EarlySupersShotBlock), sm.canPassBombPassages())
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Super Missile (green Brinstar top)"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'Green Brinstar Elevator': lambda sm: sm.wor(RomPatches.has(sm.player, RomPatches.BrinReserveBlueDoors), sm.traverse('MainShaftRight'))
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Super Missile (green Brinstar top)"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: sm.wor(sm.canMockball(),
							 | 
						||
| 
								 | 
							
								                      sm.haveItem('SpeedBooster'))
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (green Brinstar behind missile)"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'Green Brinstar Elevator': lambda sm: sm.wor(RomPatches.has(sm.player, RomPatches.BrinReserveBlueDoors), sm.traverse('MainShaftRight'))
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (green Brinstar behind missile)"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: sm.wand(sm.haveItem('Morph'),
							 | 
						||
| 
								 | 
							
								                       sm.wor(sm.canMockball(),
							 | 
						||
| 
								 | 
							
								                              sm.haveItem('SpeedBooster')),
							 | 
						||
| 
								 | 
							
								                       sm.traverse('EarlySupersRight'),
							 | 
						||
| 
								 | 
							
								                       sm.wor(sm.canPassBombPassages(),
							 | 
						||
| 
								 | 
							
								                              sm.wand(sm.knowsRonPopeilScrew(),
							 | 
						||
| 
								 | 
							
								                                      sm.haveItem('ScrewAttack'))))
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (green Brinstar behind reserve tank)"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'Green Brinstar Elevator': lambda sm: sm.wor(RomPatches.has(sm.player, RomPatches.BrinReserveBlueDoors), sm.traverse('MainShaftRight'))
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (green Brinstar behind reserve tank)"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: sm.wand(sm.traverse('EarlySupersRight'),
							 | 
						||
| 
								 | 
							
								                       sm.haveItem('Morph'),
							 | 
						||
| 
								 | 
							
								                       sm.wor(sm.canMockball(),
							 | 
						||
| 
								 | 
							
								                              sm.haveItem('SpeedBooster')))
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (pink Brinstar top)"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'Big Pink': lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (pink Brinstar top)"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (pink Brinstar bottom)"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'Big Pink': lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (pink Brinstar bottom)"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Power Bomb (pink Brinstar)"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'Big Pink': lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Power Bomb (pink Brinstar)"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: sm.wand(sm.canUsePowerBombs(),
							 | 
						||
| 
								 | 
							
								                       sm.haveItem('Super'))
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (green Brinstar pipe)"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'Green Hill Zone Top Right': lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (green Brinstar pipe)"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: sm.haveItem('Morph')
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Power Bomb (blue Brinstar)"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'Blue Brinstar Elevator Bottom': lambda sm: sm.canUsePowerBombs(),
							 | 
						||
| 
								 | 
							
								    'Morph Ball Room Left': lambda sm: sm.wor(sm.canPassBombPassages(),
							 | 
						||
| 
								 | 
							
								                                              sm.wand(sm.haveItem('Morph'),
							 | 
						||
| 
								 | 
							
								                                                      sm.canShortCharge())) # speedball
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Power Bomb (blue Brinstar)"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (blue Brinstar middle)"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'Blue Brinstar Elevator Bottom': lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (blue Brinstar middle)"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: sm.wand(sm.wor(RomPatches.has(sm.player, RomPatches.BlueBrinstarMissile), sm.haveItem('Morph')),
							 | 
						||
| 
								 | 
							
								                       sm.wor(RomPatches.has(sm.player, RomPatches.BlueBrinstarBlueDoor), sm.traverse('ConstructionZoneRight')))
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Super Missile (green Brinstar bottom)"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'Etecoons Supers': lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Super Missile (green Brinstar bottom)"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (blue Brinstar bottom)"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'Blue Brinstar Elevator Bottom': lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (blue Brinstar bottom)"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: sm.haveItem('Morph')
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (blue Brinstar top)"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'Blue Brinstar Elevator Bottom': lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (blue Brinstar top)"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: sm.canAccessBillyMays()
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (blue Brinstar behind missile)"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'Blue Brinstar Elevator Bottom': lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (blue Brinstar behind missile)"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: sm.canAccessBillyMays()
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Power Bomb (red Brinstar sidehopper room)"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'Red Brinstar Elevator': lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Power Bomb (red Brinstar sidehopper room)"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: sm.wand(sm.traverse('RedTowerElevatorTopLeft'),
							 | 
						||
| 
								 | 
							
								                       sm.canUsePowerBombs())
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Power Bomb (red Brinstar spike room)"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'Red Brinstar Elevator': lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Power Bomb (red Brinstar spike room)"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: sm.traverse('RedTowerElevatorBottomLeft')
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (red Brinstar spike room)"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'Red Brinstar Elevator': lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (red Brinstar spike room)"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: sm.wand(sm.traverse('RedTowerElevatorBottomLeft'),
							 | 
						||
| 
								 | 
							
								                       sm.canUsePowerBombs())
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (Kraid)"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'Warehouse Zeela Room Left': lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (Kraid)"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: sm.canUsePowerBombs()
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (lava room)"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'Cathedral': lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (lava room)"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: sm.haveItem('Morph')
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (below Ice Beam)"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'Business Center': lambda sm: sm.wand(sm.traverse('BusinessCenterTopLeft'),
							 | 
						||
| 
								 | 
							
								                                          sm.canUsePowerBombs(),
							 | 
						||
| 
								 | 
							
								                                          sm.canHellRun(**Settings.hellRunsTable['Ice']['Norfair Entrance -> Ice Beam']),
							 | 
						||
| 
								 | 
							
								                                          sm.wor(sm.wand(sm.haveItem('Morph'),
							 | 
						||
| 
								 | 
							
								                                                         sm.knowsMockball()),
							 | 
						||
| 
								 | 
							
								                                                 sm.haveItem('SpeedBooster'))),
							 | 
						||
| 
								 | 
							
								    'Crocomire Speedway Bottom': lambda sm: sm.wand(sm.canUseCrocRoomToChargeSpeed(),
							 | 
						||
| 
								 | 
							
								                                                    sm.canHellRun(**Settings.hellRunsTable['MainUpperNorfair']['Croc -> Ice Missiles']),
							 | 
						||
| 
								 | 
							
								                                                    sm.haveItem('SpeedBooster'),
							 | 
						||
| 
								 | 
							
								                                                    sm.knowsIceMissileFromCroc())
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (below Ice Beam)"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (above Crocomire)"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'Crocomire Speedway Bottom': lambda sm: sm.canHellRun(**Settings.hellRunsTable['MainUpperNorfair']['Croc -> Grapple Escape Missiles'])
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (above Crocomire)"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: sm.canGrappleEscape()
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (Hi-Jump Boots)"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'Business Center': lambda sm: sm.wor(RomPatches.has(sm.player, RomPatches.HiJumpAreaBlueDoor), sm.traverse('BusinessCenterBottomLeft'))
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (Hi-Jump Boots)"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: sm.haveItem('Morph')
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (Hi-Jump Boots)"].PostAvailable = (
							 | 
						||
| 
								 | 
							
								    lambda sm: sm.wor(sm.canPassBombPassages(),
							 | 
						||
| 
								 | 
							
								                      sm.wand(RomPatches.has(sm.player, RomPatches.HiJumpShotBlock), sm.haveItem('Morph')))
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Energy Tank (Hi-Jump Boots)"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'Business Center': lambda sm: sm.wor(RomPatches.has(sm.player, RomPatches.HiJumpAreaBlueDoor), sm.traverse('BusinessCenterBottomLeft'))
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Energy Tank (Hi-Jump Boots)"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Power Bomb (Crocomire)"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'Crocomire Room Top': lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Power Bomb (Crocomire)"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: sm.wand(sm.traverse('PostCrocomireUpperLeft'),
							 | 
						||
| 
								 | 
							
								                       sm.enoughStuffCroc(),
							 | 
						||
| 
								 | 
							
								                       sm.wor(sm.wor(sm.canFly(),
							 | 
						||
| 
								 | 
							
								                                     sm.haveItem('Grapple'),
							 | 
						||
| 
								 | 
							
								                                     sm.wand(sm.haveItem('SpeedBooster'),
							 | 
						||
| 
								 | 
							
								                                             sm.wor(sm.heatProof(),
							 | 
						||
| 
								 | 
							
								                                                    sm.energyReserveCountOk(1)))), # spark from the room before
							 | 
						||
| 
								 | 
							
								                              sm.wor(sm.haveItem('HiJump'), # run and jump from yellow platform
							 | 
						||
| 
								 | 
							
								                                     sm.wand(sm.haveItem('Ice'),
							 | 
						||
| 
								 | 
							
								                                             sm.knowsCrocPBsIce()),
							 | 
						||
| 
								 | 
							
								                                     sm.knowsCrocPBsDBoost())))
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (below Crocomire)"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'Crocomire Room Top': lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (below Crocomire)"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: sm.wand(sm.traverse('PostCrocomireShaftRight'), sm.enoughStuffCroc(), sm.haveItem('Morph'))
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (Grapple Beam)"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'Crocomire Room Top': lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (Grapple Beam)"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: sm.wand(sm.enoughStuffCroc(),
							 | 
						||
| 
								 | 
							
								                       sm.wor(sm.wor(sm.wand(sm.haveItem('Morph'), # from below
							 | 
						||
| 
								 | 
							
								                                             sm.canFly()),
							 | 
						||
| 
								 | 
							
								                                     sm.wand(sm.haveItem('SpeedBooster'),
							 | 
						||
| 
								 | 
							
								                                             sm.wor(sm.knowsShortCharge(),
							 | 
						||
| 
								 | 
							
								                                                    sm.canUsePowerBombs()))),
							 | 
						||
| 
								 | 
							
								                              sm.wand(sm.canGreenGateGlitch(), # from grapple room
							 | 
						||
| 
								 | 
							
								                                      sm.canFly()))) # TODO::test if accessible with a spark (short charge), and how many etanks required
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (Grapple Beam)"].PostAvailable = (
							 | 
						||
| 
								 | 
							
								    lambda sm: sm.wor(sm.haveItem('Morph'), # normal exit
							 | 
						||
| 
								 | 
							
								                      sm.wand(sm.haveItem('Super'), # go back to grapple room
							 | 
						||
| 
								 | 
							
								                              sm.wor(sm.haveItem('SpaceJump'),
							 | 
						||
| 
								 | 
							
								                                     sm.wand(sm.haveItem('SpeedBooster'), sm.haveItem('HiJump'))))) # jump from the yellow plateform ennemy
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (Norfair Reserve Tank)"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'Bubble Mountain': lambda sm: sm.canEnterNorfairReserveAreaFromBubbleMoutain(),
							 | 
						||
| 
								 | 
							
								    'Bubble Mountain Top': lambda sm: sm.canEnterNorfairReserveAreaFromBubbleMoutainTop()
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (Norfair Reserve Tank)"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: sm.wand(sm.haveItem('Morph'), sm.canHellRun(**Settings.hellRunsTable['MainUpperNorfair']['Bubble -> Norfair Reserve']))
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (bubble Norfair green door)"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'Bubble Mountain': lambda sm: sm.canEnterNorfairReserveAreaFromBubbleMoutain(),
							 | 
						||
| 
								 | 
							
								    'Bubble Mountain Top': lambda sm: sm.canEnterNorfairReserveAreaFromBubbleMoutainTop()
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (bubble Norfair green door)"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: sm.canHellRun(**Settings.hellRunsTable['MainUpperNorfair']['Bubble -> Norfair Reserve Missiles'])
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (bubble Norfair)"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'Bubble Mountain': lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (bubble Norfair)"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (Speed Booster)"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'Bubble Mountain Top': lambda sm: sm.wor(RomPatches.has(sm.player, RomPatches.SpeedAreaBlueDoors),
							 | 
						||
| 
								 | 
							
								                                             sm.traverse('BubbleMountainTopRight'))
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (Speed Booster)"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: sm.canHellRunToSpeedBooster()
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (Wave Beam)"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'Bubble Mountain Top': lambda sm: sm.canAccessDoubleChamberItems()
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (Wave Beam)"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (Gold Torizo)"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'LN Above GT': lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (Gold Torizo)"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: sm.canHellRun(**Settings.hellRunsTable['LowerNorfair']['Main'])
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (Gold Torizo)"].PostAvailable = (
							 | 
						||
| 
								 | 
							
								    lambda sm: sm.enoughStuffGT()
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Super Missile (Gold Torizo)"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'Screw Attack Bottom': lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Super Missile (Gold Torizo)"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Super Missile (Gold Torizo)"].PostAvailable = (
							 | 
						||
| 
								 | 
							
								    lambda sm: sm.enoughStuffGT()
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (Mickey Mouse room)"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'LN Entrance': lambda sm: sm.wand(sm.canUsePowerBombs(), sm.canPassWorstRoom()),
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (Mickey Mouse room)"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: sm.canHellRun(**Settings.hellRunsTable['LowerNorfair']['Main'])
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (lower Norfair above fire flea room)"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'Firefleas': lambda sm: sm.canHellRun(**Settings.hellRunsTable['LowerNorfair']['Main'])
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (lower Norfair above fire flea room)"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Power Bomb (lower Norfair above fire flea room)"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'Firefleas Top': lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Power Bomb (lower Norfair above fire flea room)"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Power Bomb (Power Bombs of shame)"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'Ridley Zone': lambda sm: sm.canUsePowerBombs()
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Power Bomb (Power Bombs of shame)"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: sm.canHellRun(**Settings.hellRunsTable['LowerNorfair']['Main'])
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (lower Norfair near Wave Beam)"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'Firefleas': lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (lower Norfair near Wave Beam)"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: sm.wand(sm.canHellRun(**Settings.hellRunsTable['LowerNorfair']['Main']),
							 | 
						||
| 
								 | 
							
								                       sm.canDestroyBombWalls(),
							 | 
						||
| 
								 | 
							
								                       sm.haveItem('Morph'))
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (Wrecked Ship middle)"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'Wrecked Ship Main': lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (Wrecked Ship middle)"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: sm.canPassBombPassages()
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (Gravity Suit)"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'Wrecked Ship Main': lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (Gravity Suit)"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: sm.wand(sm.canPassBowling(),
							 | 
						||
| 
								 | 
							
								                       sm.canPassBombPassages())
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (Wrecked Ship top)"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'Wrecked Ship Main': lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (Wrecked Ship top)"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: Bosses.bossDead(sm, 'Phantoon')
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Super Missile (Wrecked Ship left)"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'Wrecked Ship Main': lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Super Missile (Wrecked Ship left)"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: Bosses.bossDead(sm, 'Phantoon')
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (green Maridia shinespark)"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'Main Street Bottom': lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (green Maridia shinespark)"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: sm.wand(sm.haveItem('Gravity'),
							 | 
						||
| 
								 | 
							
								                       sm.haveItem('SpeedBooster'),
							 | 
						||
| 
								 | 
							
								                       sm.wor(sm.wand(sm.traverse('MainStreetBottomRight'), # run from room on the right
							 | 
						||
| 
								 | 
							
								                                      sm.wor(RomPatches.has(sm.player, RomPatches.AreaRandoGatesOther),
							 | 
						||
| 
								 | 
							
								                                             sm.haveItem('Super')),
							 | 
						||
| 
								 | 
							
								                                      sm.itemCountOk('ETank', 1)), # etank for the spark since sparking from low ground
							 | 
						||
| 
								 | 
							
								                              sm.canSimpleShortCharge())) # run from above
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Super Missile (green Maridia)"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'Main Street Bottom': lambda sm: sm.canDoOuterMaridia()
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Super Missile (green Maridia)"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: sm.haveItem('Morph')
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (green Maridia tatori)"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'Main Street Bottom': lambda sm: sm.wand(sm.wor(sm.traverse('FishTankRight'),
							 | 
						||
| 
								 | 
							
								                                                    RomPatches.has(sm.player, RomPatches.MamaTurtleBlueDoor)),
							 | 
						||
| 
								 | 
							
								                                             sm.canDoOuterMaridia()),
							 | 
						||
| 
								 | 
							
								    'Mama Turtle': lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (green Maridia tatori)"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Super Missile (yellow Maridia)"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'Watering Hole Bottom': lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Super Missile (yellow Maridia)"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (yellow Maridia super missile)"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'Watering Hole Bottom': lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (yellow Maridia super missile)"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (yellow Maridia false wall)"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'Beach': lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (yellow Maridia false wall)"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (left Maridia sand pit room)"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'Left Sandpit': lambda sm: sm.canClimbWestSandHole()
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (left Maridia sand pit room)"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: sm.canAccessItemsInWestSandHole()
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (right Maridia sand pit room)"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'Right Sandpit': lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (right Maridia sand pit room)"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: sm.wor(sm.haveItem('Gravity'),
							 | 
						||
| 
								 | 
							
								                      sm.wand(sm.haveItem('HiJump'),
							 | 
						||
| 
								 | 
							
								                              sm.knowsGravLessLevel3()))
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Power Bomb (right Maridia sand pit room)"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'Right Sandpit': lambda sm: sm.haveItem('Morph')
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Power Bomb (right Maridia sand pit room)"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: sm.wor(sm.haveItem('Gravity'),
							 | 
						||
| 
								 | 
							
								                      sm.wand(sm.knowsGravLessLevel3(),
							 | 
						||
| 
								 | 
							
								                              sm.haveItem('HiJump'),
							 | 
						||
| 
								 | 
							
								                              sm.canSpringBallJump())) # https://www.youtube.com/watch?v=7LYYxphRRT0
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (pink Maridia)"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'Aqueduct': lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (pink Maridia)"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Super Missile (pink Maridia)"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'Aqueduct': lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Super Missile (pink Maridia)"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (Draygon)"].AccessFrom = {
							 | 
						||
| 
								 | 
							
								    'Precious Room Top': lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								locationsDict["Missile (Draygon)"].Available = (
							 | 
						||
| 
								 | 
							
								    lambda sm: SMBool(True)
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# TODO::use the dict in solver/randomizer
							 | 
						||
| 
								 | 
							
								# create the list that the solver/randomizer use
							 | 
						||
| 
								 | 
							
								locations = [loc for loc in locationsDict.values()]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class LocationsHelper:
							 | 
						||
| 
								 | 
							
								    # used by FillerRandom to know how many front fill steps it must perform
							 | 
						||
| 
								 | 
							
								    def getRandomFillHelp(startLocation):
							 | 
						||
| 
								 | 
							
								        helpByAp = {
							 | 
						||
| 
								 | 
							
								            "Firefleas Top": 3,
							 | 
						||
| 
								 | 
							
								            "Aqueduct": 1,
							 | 
						||
| 
								 | 
							
								            "Mama Turtle": 1,
							 | 
						||
| 
								 | 
							
								            "Watering Hole": 2,
							 | 
						||
| 
								 | 
							
								            "Etecoons Supers": 2,
							 | 
						||
| 
								 | 
							
								            "Gauntlet Top":1,
							 | 
						||
| 
								 | 
							
								            "Bubble Mountain":1
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        return helpByAp[startLocation] if startLocation in helpByAp else 0
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # for a given start AP, gives:
							 | 
						||
| 
								 | 
							
								    # - locations that can be used as majors/chozo in the start area
							 | 
						||
| 
								 | 
							
								    # - locations to preserve in the split
							 | 
						||
| 
								 | 
							
								    # - number of necessary majors locations to add in the start area,
							 | 
						||
| 
								 | 
							
								    # - number of necessary chozo locations to add in the start area
							 | 
						||
| 
								 | 
							
								    # locs are taken in the first n in the list
							 | 
						||
| 
								 | 
							
								    def getStartMajors(startLocation):
							 | 
						||
| 
								 | 
							
								        majLocsByAp = {
							 | 
						||
| 
								 | 
							
								            'Gauntlet Top': ([
							 | 
						||
| 
								 | 
							
								                "Missile (Crateria gauntlet right)",
							 | 
						||
| 
								 | 
							
								                "Missile (Crateria gauntlet left)"
							 | 
						||
| 
								 | 
							
								            ], ["Energy Tank, Terminator"], 1, 2),
							 | 
						||
| 
								 | 
							
								            'Green Brinstar Elevator': ([
							 | 
						||
| 
								 | 
							
								                "Missile (green Brinstar below super missile)"
							 | 
						||
| 
								 | 
							
								            ], ["Reserve Tank, Brinstar"], 1, 1),
							 | 
						||
| 
								 | 
							
								            'Big Pink': ([
							 | 
						||
| 
								 | 
							
								                "Missile (pink Brinstar top)",
							 | 
						||
| 
								 | 
							
								                "Missile (pink Brinstar bottom)"
							 | 
						||
| 
								 | 
							
								            ], ["Charge Beam"], 1, 2),
							 | 
						||
| 
								 | 
							
								            'Etecoons Supers': ([
							 | 
						||
| 
								 | 
							
								                "Energy Tank, Etecoons",
							 | 
						||
| 
								 | 
							
								                "Super Missile (green Brinstar bottom)",
							 | 
						||
| 
								 | 
							
								            ], ["Energy Tank, Etecoons"], 1, 2),
							 | 
						||
| 
								 | 
							
								            'Firefleas Top': ([
							 | 
						||
| 
								 | 
							
								                "Power Bomb (lower Norfair above fire flea room)",
							 | 
						||
| 
								 | 
							
								                "Energy Tank, Firefleas",
							 | 
						||
| 
								 | 
							
								                "Missile (lower Norfair near Wave Beam)",
							 | 
						||
| 
								 | 
							
								                "Missile (lower Norfair above fire flea room)"
							 | 
						||
| 
								 | 
							
								            ], ["Energy Tank, Firefleas"], 3, 4),
							 | 
						||
| 
								 | 
							
								            'Business Center': ([
							 | 
						||
| 
								 | 
							
								                "Energy Tank (Hi-Jump Boots)",
							 | 
						||
| 
								 | 
							
								            ], ["Hi-Jump Boots"], 1, 1),
							 | 
						||
| 
								 | 
							
								            'Bubble Mountain': ([
							 | 
						||
| 
								 | 
							
								                "Missile (bubble Norfair)"
							 | 
						||
| 
								 | 
							
								            ], ["Speed Booster", "Wave Beam"], 1, 1),
							 | 
						||
| 
								 | 
							
								            'Mama Turtle': ([
							 | 
						||
| 
								 | 
							
								                "Energy Tank, Mama turtle",
							 | 
						||
| 
								 | 
							
								                "Missile (green Maridia tatori)",
							 | 
						||
| 
								 | 
							
								                "Super Missile (green Maridia)"
							 | 
						||
| 
								 | 
							
								            ], ["Energy Tank, Mama turtle"], 2, 3),
							 | 
						||
| 
								 | 
							
								            'Watering Hole': ([
							 | 
						||
| 
								 | 
							
								                "Missile (yellow Maridia super missile)",
							 | 
						||
| 
								 | 
							
								                "Super Missile (yellow Maridia)",
							 | 
						||
| 
								 | 
							
								                "Missile (yellow Maridia false wall)"
							 | 
						||
| 
								 | 
							
								            ], [], 2, 3),
							 | 
						||
| 
								 | 
							
								            'Aqueduct': ([
							 | 
						||
| 
								 | 
							
								                "Missile (pink Maridia)",
							 | 
						||
| 
								 | 
							
								                "Super Missile (pink Maridia)",
							 | 
						||
| 
								 | 
							
								                "Missile (right Maridia sand pit room)"
							 | 
						||
| 
								 | 
							
								            ], ["Reserve Tank, Maridia"], 2, 3)
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        return majLocsByAp[startLocation] if startLocation in majLocsByAp else ([],[],0,0)
							 |