# Source Generated with Decompyle++ # File: Randomizer.pyc (Python 3.8) import struct import random import time import re import sys import argparse import json import os import zlib import math import Fusion_Graph as Graph from Fusion_Items import * from bps.apply import apply_to_files version = '0.11.6' def ceiling(num, denom): return -(num // -denom) def fileHash(fileName): with open(fileName, 'rb') as fh: hash = 0 while True: s = fh.read(65536) if not s: break hash = zlib.crc32(s, hash) return (hash & 0xFFFFFFFF) def enable_item(graph, item): globals()[item] = True update_items(graph) update_requirements(graph) def disable_item(graph, item): globals()[item] = False update_items(graph) update_requirements(graph) def update_items(graph): global Missiles, Missiles, SuperMissiles, IceMissiles, Diffusion, Ice, HiJump, SpringBall, WallJump, PowerBombs, PowerBombs, UseBombs, BombJump, IBJ, MissileDamage, MissileDamage, MissileDamage, MissileDamage, MissileDamage if SeedSettings['MissilesWithoutMainData'] == True: if not MainMissiles and SuperMissileItem and IceMissileItem: pass Missiles = DiffusionItem else: Missiles = MainMissiles if Missiles: pass SuperMissiles = SuperMissileItem if Missiles: pass IceMissiles = IceMissileItem if Missiles: pass Diffusion = DiffusionItem if not IceMissiles: pass Ice = IceBeam if not HiJumpBoots: pass HiJump = SpaceJump SpringBall = HiJumpBoots if not SpaceJump: pass WallJump = WallJumpSetting if SeedSettings['PowerBombsWithoutBombs'] == True: if MorphBall: pass PowerBombs = MainPowerBombs elif MorphBall and Bombs: pass PowerBombs = MainPowerBombs if not MorphBall and Bombs: pass UseBombs = PowerBombs if not MorphBall and Bombs: pass BombJump = SpringBall if MorphBall and Bombs: pass IBJ = InfiniteBombJump MissileDamage = 0 if Missiles: if MainMissiles: MissileDamage += 10 if IceMissiles: MissileDamage += 10 if SuperMissiles: MissileDamage += 20 if Diffusion: MissileDamage += 5 def update_requirements(graph): if MorphBall: pass if MorphBall: pass if MorphBall and PowerBombs: pass if MorphBall: pass if MorphBall: pass if MorphBall: pass if MorphBall: pass if not MorphBall or PowerBombs: pass if not MorphBall or PowerBombs: pass if MorphBall: pass if not Missiles: pass if not Missiles: pass if not Missiles: pass if not Missiles and RedDoors and HiJump and WallJump: pass if not RedDoors and HiJump and WallJump: pass if not RedDoors and HiJump and WallJump: pass if not RedDoors and HiJump and WallJump: pass if GreenDoors: if not ((HiJump or Ice) and Missiles or ChargeBeam) and SpaceJump and WallJump: pass if GreenDoors: if not (HiJump and Ice and Missiles or ChargeBeam) and SpaceJump and WallJump: pass if GreenDoors: if not ((HiJump or Ice) and Missiles or ChargeBeam) and SpaceJump and WallJump: pass if GreenDoors: if not ((HiJump or Ice) and Missiles or ChargeBeam) and SpaceJump and WallJump: pass if GreenDoors: if not ((HiJump or Ice) and Missiles or ChargeBeam) and SpaceJump and WallJump: pass if GreenDoors: if not ((HiJump or Ice) and Missiles or ChargeBeam) and SpaceJump and WallJump: pass if PowerBombs: pass if not MorphBall and UseBombs: pass if PowerBombs: pass if not MorphBall and UseBombs: pass if PowerBombs: pass if not MorphBall and UseBombs: pass if PowerBombs: pass if not MorphBall and UseBombs: pass if not MorphBall and UseBombs: pass if MorphBall and UseBombs: pass if MorphBall: pass if MorphBall: pass if MorphBall: pass if MorphBall and PowerBombs: pass if not MorphBall and ScrewAttack and BombJump and HiJump and WallJump: pass if not MorphBall and ScrewAttack and BombJump and HiJump and WallJump: pass if MorphBall and ScrewAttack: pass if MorphBall and ScrewAttack: pass if MorphBall and ScrewAttack: pass if MorphBall and ScrewAttack: pass if not MorphBall and ScrewAttack and BombJump and HiJump and WallJump: pass if not MorphBall and ScrewAttack and BombJump and HiJump and WallJump: pass if not Missiles and PowerBombs: pass if not Missiles and PowerBombs: pass if not Missiles and PowerBombs: pass if not Missiles and PowerBombs: pass if not Missiles and PowerBombs: pass if not Missiles and PowerBombs: pass if not Ice: if not (Missiles and ChargeBeam or ScrewAttack) and SpaceJump and WallJump: pass if MorphBall and SpeedBooster: pass if not MorphBall: pass if not MorphBall: pass if MorphBall and SpeedBooster: pass if (Missiles or ChargeBeam) and MorphBall: pass if not Missiles and PowerBombs: pass if not Missiles and PowerBombs: pass if not Missiles: pass if MorphBall: pass if MorphBall: pass if MorphBall: pass if MorphBall: pass if not MorphBall and UseBombs and SpaceJump and WallJump: pass if MorphBall: pass if MorphBall: pass if MorphBall: pass if MorphBall: pass if not MorphBall and UseBombs and SpaceJump and WallJump: pass if not MorphBall and UseBombs and SpaceJump and WallJump: pass if not MorphBall and UseBombs and SpaceJump and WallJump: pass if MorphBall: pass if MorphBall: pass if not MorphBall and SpaceJump: pass if not MorphBall and SpaceJump: pass if MorphBall: pass if MorphBall: pass if MorphBall: pass if not SpaceJump: pass if not MorphBall and SpaceJump: pass if not SpaceJump: pass if not MorphBall and SpaceJump: pass if not SpaceJump: pass if not MorphBall and SpaceJump: pass if MorphBall: pass if not MorphBall and ScrewAttack and SpaceJump: pass if not SpeedBooster: pass if not SpeedBooster: pass if Missiles and ChargeBeam: pass if not Missiles and ChargeBeam and PlasmaBeam and RedDoors and HiJump and WallJump: pass if not Missiles and SpeedBooster and PowerBombs: pass if not Missiles and SpeedBooster and PowerBombs: pass if Missiles and ChargeBeam and PowerBombs and ScrewAttack and SpeedBooster: pass if Missiles and ChargeBeam and PowerBombs and ScrewAttack and SpeedBooster: pass if not (Missiles or MorphBall) and ChargeBeam and PowerBombs: pass if (Missiles or MorphBall) and ChargeBeam and PowerBombs and ScrewAttack and SpeedBooster: pass if Missiles: pass if Missiles: pass if Missiles: pass if Missiles: pass if not Missiles and ChargeBeam and PowerBombs: pass if not Missiles and ChargeBeam and PowerBombs: pass if not Missiles and ChargeBeam and PowerBombs: pass if not Missiles and ChargeBeam and PowerBombs: pass if Missiles and ChargeBeam and PowerBombs and ScrewAttack and SpeedBooster: pass if Missiles and ChargeBeam and PowerBombs and ScrewAttack and SpeedBooster: pass if Missiles and ChargeBeam and PowerBombs and ScrewAttack and SpeedBooster: pass if Missiles and ChargeBeam and PowerBombs and ScrewAttack and SpeedBooster: pass if SpaceJump: pass if SpaceJump: pass if not DamageRuns or Energy >= 199: pass if DamageRuns or Energy >= 99 or GravitySuit: pass if MorphBall: pass if MorphBall: pass if DamageRuns or Energy >= 99 or GravitySuit: pass if MorphBall: pass if DamageRuns or Energy >= 99 or GravitySuit: pass if (DamageRuns or Energy >= 99 or GravitySuit) and MorphBall: pass if MorphBall and ScrewAttack: pass if (DamageRuns or Energy >= 99 or GravitySuit) and MorphBall and ScrewAttack: pass if Missiles and MorphBall: pass if MorphBall: pass if MorphBall: pass if MorphBall: pass if Missiles and MorphBall: pass if Missiles: pass if Missiles: pass if Missiles: pass if not MorphBall and UseBombs and HiJump and WallJump: pass if not Missiles and MorphBall and UseBombs and HiJump and WallJump: pass if not MorphBall and UseBombs and HiJump and WallJump: pass if not Missiles and MorphBall and UseBombs and HiJump and WallJump: pass if not MorphBall and UseBombs and HiJump and WallJump: pass if not Missiles and MorphBall and UseBombs and HiJump and WallJump: pass if MorphBall and UseBombs: if not (PowerBombs or WaveBeam) and Missiles and ChargeBeam: pass if MorphBall: pass if not Missiles: pass if not MorphBall and ScrewAttack and SpaceJump: pass if not MorphBall and ScrewAttack and SpaceJump: pass if MorphBall: pass if not Missiles: pass if MorphBall and SpaceJump: pass if MorphBall and WaveBeam and SpaceJump: pass if Missiles or ChargeBeam: pass if MorphBall: pass if not Missiles: pass if MorphBall: pass if MorphBall: pass if MorphBall: pass if (Missiles or ChargeBeam) and MorphBall: pass if not (ChargeBeam or WaveBeam or PowerBombs) and Missiles: pass if MorphBall: pass if MorphBall: pass if MorphBall: pass if MorphBall and PowerBombs: pass if MorphBall: pass if MorphBall: pass if MorphBall: pass if MorphBall: pass if MorphBall: pass if MorphBall: pass if MorphBall: pass if MorphBall: pass if MorphBall and UseBombs: pass if MorphBall: pass if MorphBall: pass if MorphBall: pass if MorphBall: pass if MorphBall: pass if MorphBall: pass if MorphBall: pass if MorphBall: pass if MorphBall: pass if ScrewAttack: pass if MorphBall: pass if MorphBall and UseBombs and SpringBall: pass if not MorphBall or UseBombs: pass if not MorphBall and UseBombs or SpringBall: pass if not MorphBall and UseBombs and WaveBeam and HiJump and WallJump: pass if not MorphBall and HiJump and WallJump: pass if not Missiles: pass if MorphBall: pass if MorphBall: pass if MorphBall: pass if MorphBall: pass if MorphBall: pass if MorphBall: pass if MorphBall: pass if MorphBall: pass if MorphBall: pass if MorphBall: pass if MorphBall: pass if MorphBall: pass if not Missiles: pass if not Missiles: pass if not SpaceJump: pass if not ScrewAttack and SpaceJump and WallJump: pass if not ScrewAttack and SpaceJump and WallJump: pass if ScrewAttack: pass if not ScrewAttack and SpaceJump: pass if not MorphBall and UseBombs: pass if not MorphBall and UseBombs: pass if MorphBall: if not UseBombs or SpringBall: if (UseBombs or ScrewAttack) and SpringBall: pass if MorphBall: if not UseBombs or SpringBall: if (UseBombs or ScrewAttack or SpringBall) and ScrewAttack: pass if not MorphBall and UseBombs: pass if not MorphBall and UseBombs: pass if MorphBall: if not UseBombs or SpringBall: if (UseBombs or ScrewAttack) and SpringBall: pass if MorphBall: if not UseBombs or SpringBall: if (UseBombs or ScrewAttack or SpringBall) and ScrewAttack: pass if not SpeedBooster and SpaceJump: pass if not MorphBall and SpeedBooster and SpaceJump: pass if not SpeedBooster and SpaceJump: pass if not SpeedBooster and SpaceJump: pass if not SpeedBooster and SpaceJump: pass if not SpeedBooster and SpaceJump: pass if not MorphBall and SpeedBooster and SpaceJump: pass if not SpeedBooster and SpaceJump: pass if not SpeedBooster and SpaceJump: pass if not SpeedBooster and SpaceJump: pass if not MorphBall and SpeedBooster and SpaceJump and WallJump: pass if not MorphBall and SpeedBooster and SpaceJump and WallJump: pass if not MorphBall and Ice and SpaceJump: pass if not MorphBall and UseBombs and WaveBeam: pass if not MorphBall and Ice and UseBombs and WaveBeam and GravitySuit and HiJump and WallJump: pass if not MorphBall or UseBombs: pass if not MorphBall and UseBombs and HiJump and WallJump: pass if not MorphBall and HiJump and WallJump: pass if MorphBall: pass if MorphBall: pass if MorphBall: pass if MorphBall: pass if MorphBall: pass if MorphBall: pass if not MorphBall and UseBombs and HiJump and WallJump: pass if not MorphBall and UseBombs and HiJump and WallJump: pass if not MorphBall and HiJump and WallJump: pass if not MorphBall and UseBombs and HiJump and WallJump: pass if not MorphBall and HiJump and WallJump: pass if not MorphBall and UseBombs and HiJump and WallJump: pass if not MorphBall and HiJump and WallJump: pass if not MorphBall and UseBombs and HiJump and WallJump: pass if not MorphBall and HiJump and WallJump: pass if not MorphBall and UseBombs and HiJump and WallJump: pass if not MorphBall and HiJump and WallJump: pass if MorphBall: pass if not SpaceJump and WallJump: pass if not SpaceJump and WallJump: pass if not SpaceJump and WallJump: pass if not SpaceJump and WallJump: pass if MorphBall: pass if MorphBall: pass if Missiles: pass if not MorphBall: pass if not MorphBall: pass if MorphBall: pass if MorphBall: pass if not MorphBall and ScrewAttack and SpeedBooster and Ice: pass if not MorphBall and ScrewAttack and SpeedBooster and Ice: pass if not MorphBall and ScrewAttack and SpeedBooster and Ice: pass if not MorphBall and ScrewAttack and SpeedBooster and Ice: pass if SpeedBooster: pass if MorphBall and UseBombs and BombJump: pass if MorphBall and UseBombs and BombJump: pass if MorphBall: pass if SuperMissiles and PowerBombs or ScrewAttack: pass if not MorphBall and SuperMissiles and PowerBombs: pass if not MorphBall and ScrewAttack and UseBombs and SuperMissiles: pass if SuperMissiles and PowerBombs or ScrewAttack: pass if not MorphBall and UseBombs: pass if MorphBall: if not SpringBall or ScrewAttack: if BombJump or PowerBombs or UseBombs: if SuperMissiles and PowerBombs or ScrewAttack: pass if MorphBall: if not UseBombs: if (SpringBall or ScrewAttack or BombJump) and PowerBombs: pass if not MorphBall and UseBombs: pass if not MorphBall and UseBombs and HiJump and WallJump: pass if MorphBall: if not UseBombs or SpringBall: pass if SpeedBooster and SpaceJump or IBJ: pass if SpeedBooster and SpaceJump or IBJ: pass if SpeedBooster and SpaceJump or IBJ: pass if VariaSuit: pass if Missiles and ChargeBeam and Ice or ScrewAttack: pass if not Ice and SpaceJump: if Missiles and ChargeBeam or ScrewAttack: pass if Missiles and ChargeBeam or ScrewAttack: pass if Missiles and ChargeBeam or ScrewAttack: pass if not Missiles: pass if VariaSuit: pass if GravitySuit and WaveBeam: pass if GravitySuit: pass if GravitySuit: pass if GravitySuit: pass if ChargeBeam or Difficulty > 0: pass if not ChargeBeam: pass if not SpaceJump: if ChargeBeam or Difficulty > 0: pass if not ChargeBeam: pass if not SpaceJump: if ChargeBeam or Difficulty > 0: pass if ChargeBeam or Difficulty > 0: pass if not MorphBall and SuperMissiles and PowerBombs: pass if not MorphBall and UseBombs and SuperMissiles and PowerBombs: pass if MorphBall and UseBombs: if SuperMissiles and PowerBombs or ScrewAttack: pass if MorphBall: pass if not VariaSuit and DamageRuns and Energy >= 199: pass if not VariaSuit and DamageRuns and Energy >= 199 and SpeedBooster and UseBombs: pass if MorphBall or UseBombs or ScrewAttack: pass if (HiJump or Ice) and SpaceJump and IBJ and MorphBall and UseBombs and Missiles and SpeedBooster: pass if not MorphBall or UseBombs: pass if MorphBall or UseBombs or ScrewAttack: if (HiJump or Ice) and SpaceJump and IBJ and Missiles and SpeedBooster: pass if MorphBall or UseBombs or ScrewAttack: pass if GravitySuit: pass if MorphBall: if (Diffusion or WaveBeam) and IceBeam: pass if MorphBall: if WaterLowered or DamageRuns: if (Diffusion or WaveBeam) and IceBeam: pass if not WaterLowered: pass if MorphBall and Diffusion and WaveBeam: pass if not RedDoors and WaterLowered: pass if MorphBall: if (WaterLowered or DamageRuns) and Diffusion and WaveBeam: pass if MorphBall: if (WaterLowered or DamageRuns) and Diffusion and WaveBeam: pass if not RedDoors and WaterLowered: pass if MorphBall: if (WaterLowered or DamageRuns) and Diffusion and WaveBeam: pass if not WaterLowered: pass if MorphBall: if WaterLowered or DamageRuns: if (Diffusion or WaveBeam) and IceBeam: pass if MorphBall: if WaterLowered or DamageRuns: if (Diffusion or WaveBeam) and IceBeam: pass if MorphBall: pass if MorphBall and UseBombs and SpeedBooster and WaterLowered and DamageRuns: pass if MorphBall: pass if SpeedBooster and MorphBall: if not (UseBombs or PowerBombs) and SpaceJump and WallJump: pass if SpeedBooster and WaterLowered and DamageRuns: pass if SpeedBooster and WaterLowered and DamageRuns: pass if SpeedBooster and WaterLowered and DamageRuns: pass if SpeedBooster and WaterLowered and DamageRuns: pass if SpeedBooster and MorphBall: if not (UseBombs or PowerBombs) and SpaceJump and WallJump: pass if SpeedBooster and WaterLowered and DamageRuns: pass if not Missiles: pass if not GravitySuit and SpeedBooster: pass if not GravitySuit and SpeedBooster: pass if not GravitySuit and SpaceJump: pass if not MorphBall and GravitySuit and SpaceJump: pass if not GravitySuit and SpaceJump: pass if not GravitySuit and SpaceJump: pass if not GravitySuit and SpaceJump: pass if not MorphBall and GravitySuit and SpaceJump: pass if not GravitySuit and SpaceJump: pass if not GravitySuit and SpaceJump: pass if GravitySuit: pass if MorphBall and GravitySuit: pass if MorphBall: if (GravitySuit or ScrewAttack) and Ice: if not BombJump or GravitySuit: pass if MorphBall and GravitySuit: pass if GravitySuit: pass if GravitySuit: pass if MorphBall: if (GravitySuit or ScrewAttack) and Diffusion: if not BombJump or GravitySuit: pass if not GravitySuit and SpeedBooster: pass if MorphBall: if (GravitySuit or ScrewAttack) and Diffusion: if not BombJump or GravitySuit: pass if GravitySuit: pass if MorphBall and Ice: if (UseBombs or GravitySuit) and SpringBall and GravitySuit: pass if not MorphBall and UseBombs: if (HiJump or SpeedBooster) and WaterLowered and DamageRuns: pass if SpeedBooster and WaterLowered and DamageRuns: pass if MorphBall and UseBombs and ScrewAttack: if (HiJump or SpeedBooster) and WaterLowered and DamageRuns: pass if not MorphBall and UseBombs and WaterLowered: pass if MorphBall and SpeedBooster and WaterLowered and DamageRuns: pass if not MorphBall or UseBombs: pass if SpeedBooster and WaterLowered and DamageRuns: pass if MorphBall and SpeedBooster and WaterLowered and DamageRuns: pass if MorphBall: if (UseBombs or ScrewAttack) and SpeedBooster and WaterLowered and DamageRuns: pass if not MorphBall and UseBombs and ScrewAttack and WaterLowered: pass if not MorphBall or UseBombs: pass if MorphBall: if (UseBombs or ScrewAttack) and SpeedBooster and WaterLowered and DamageRuns: pass if WaterLowered or DamageRuns: pass if not WaterLowered: pass if not MorphBall and WaterLowered: pass if WaterLowered or DamageRuns: pass if WaterLowered or DamageRuns: pass if WaterLowered or DamageRuns: pass if MorphBall: pass if SpeedBooster: pass if MorphBall and GravitySuit: pass if HiJump or GravitySuit: pass if SpeedBooster: pass if MorphBall and GravitySuit: pass if MorphBall and GravitySuit and ScrewAttack: pass if MorphBall and SpeedBooster and GravitySuit: pass if MorphBall and GravitySuit: pass if Missiles and MorphBall: if (UseBombs or SpringBall) and GravitySuit and GravitySuit: pass if Missiles and MorphBall: if (UseBombs or SpringBall) and GravitySuit and GravitySuit: pass if Missiles and MorphBall: if (UseBombs or GravitySuit) and ScrewAttack: pass if Missiles and MorphBall and UseBombs and GravitySuit: pass if MorphBall and SpringBall and UseBombs: pass if GravitySuit: pass if MorphBall and GravitySuit: pass if MorphBall and SpringBall and UseBombs: pass if MorphBall and GravitySuit: pass if MorphBall: pass if MorphBall: pass if MorphBall: pass if MorphBall: pass if not HiJumpBoots: pass if not HiJumpBoots: pass if MorphBall and UseBombs and GravitySuit: pass if (MorphBall or UseBombs) and GravitySuit: pass if MorphBall and UseBombs and GravitySuit: pass if GravitySuit: pass if MorphBall: pass if MorphBall and Diffusion and GravitySuit: pass if MorphBall: pass if Missiles and MorphBall and GravitySuit and SpaceJump and HiJump: pass if GravitySuit: pass if Missiles and MorphBall and GravitySuit and SpaceJump and HiJump: pass if not Missiles and MorphBall and GravitySuit and ScrewAttack and SpaceJump: pass if not GravitySuit and ScrewAttack and SpaceJump: pass if not Missiles and MorphBall and GravitySuit and ScrewAttack and SpaceJump: pass if Missiles: pass if Missiles: pass if Missiles and MorphBall and GravitySuit: pass if MorphBall: pass if MorphBall and UseBombs: pass if MorphBall and GravitySuit: pass if MorphBall and GravitySuit: pass if MorphBall: if (PowerBombs and WaveBeam or ChargeBeam) and Difficulty >= 1 and Missiles and ChargeBeam: pass if Missiles: pass if Missiles: pass if Missiles: pass if Missiles and MorphBall: pass if Missiles and MorphBall: pass if Missiles and MorphBall: pass if not (HiJump or Ice) and SpaceJump: pass if not (HiJump or Ice) and SpaceJump: pass if not (HiJump or Ice) and SpaceJump: pass if not (HiJump or Ice) and SpaceJump: pass if not (HiJump or Ice) and SpaceJump: pass if not (HiJump or Ice) and SpaceJump: pass if MorphBall and UseBombs and SpeedBooster: pass if MorphBall and VariaSuit and PowerBombs and UseBombs: pass if SpeedBooster and VariaSuit: pass if MorphBall and UseBombs and SpeedBooster: pass if MorphBall and VariaSuit and PowerBombs and UseBombs: pass if SpeedBooster and VariaSuit: pass if MorphBall and UseBombs: pass if MorphBall and UseBombs: pass if MorphBall and UseBombs: pass if MorphBall and VariaSuit and PowerBombs and UseBombs: pass if MorphBall and UseBombs and VariaSuit: pass if MorphBall and UseBombs and SpeedBooster: pass if MorphBall and VariaSuit and PowerBombs and UseBombs: pass if SpeedBooster and VariaSuit: pass if MorphBall and VariaSuit and PowerBombs and UseBombs: pass if MorphBall and VariaSuit and PowerBombs and UseBombs: pass if MorphBall and SpeedBooster and VariaSuit and PowerBombs and UseBombs: pass if MorphBall and VariaSuit and PowerBombs and UseBombs: pass if MorphBall and SpeedBooster and VariaSuit and YellowDoors and PowerBombs and UseBombs: pass if MorphBall: pass if MorphBall: pass if MorphBall and UseBombs: pass if MorphBall: pass if MorphBall and VariaSuit and PowerBombs and UseBombs: pass if VariaSuit: pass if VariaSuit: pass if VariaSuit: pass if MorphBall and UseBombs: pass if MorphBall and UseBombs: pass if VariaSuit: pass if MorphBall and BombJump: pass if VariaSuit and SpaceJump: pass if not VariaSuit and Ice: pass if MorphBall and BombJump: pass if VariaSuit and SpaceJump: pass if not MorphBall and VariaSuit and Ice: pass if MorphBall and VariaSuit: pass if MorphBall and VariaSuit and SpaceJump: pass if not VariaSuit and Ice: pass if VariaSuit: pass if MorphBall and BombJump: pass if MorphBall and UseBombs and SpeedBooster: pass if MorphBall and PowerBombs and UseBombs: pass if SpeedBooster and GravitySuit: pass if not HiJump: pass if MorphBall and UseBombs and SpeedBooster: pass if MorphBall: if not (PowerBombs or UseBombs) and ScrewAttack and HiJump: pass if SpeedBooster and GravitySuit: pass if not HiJump: pass if not HiJump: pass if MorphBall and UseBombs: pass if MorphBall and UseBombs: pass if MorphBall: if (PowerBombs or UseBombs) and ScrewAttack: pass if MorphBall and UseBombs: pass if MorphBall and UseBombs: pass if MorphBall and UseBombs: pass if MorphBall and PowerBombs and UseBombs: pass if MorphBall and PowerBombs and UseBombs: pass if MorphBall: if (PowerBombs or UseBombs) and ScrewAttack and SpeedBooster: pass if MorphBall: if (PowerBombs or UseBombs) and ScrewAttack and SpeedBooster and GravitySuit: pass if MorphBall and PowerBombs and UseBombs: pass if MorphBall and PowerBombs and UseBombs: pass if MorphBall: pass if MorphBall: pass if MorphBall: pass if MorphBall: if (PowerBombs or UseBombs) and ScrewAttack: pass if MorphBall: pass if MorphBall: pass if MorphBall and UseBombs and SpeedBooster: pass if MorphBall and PowerBombs and UseBombs: pass if SpeedBooster and GravitySuit: pass if MorphBall and UseBombs and SpeedBooster: pass if MorphBall and PowerBombs and UseBombs: pass if SpeedBooster and GravitySuit: pass if not SpaceJump: pass if not SpaceJump: pass if MorphBall: pass if not HiJump: pass if not MorphBall and PowerBombs and HiJump: pass if not HiJump: pass if not HiJump: pass if not HiJump: pass if not MorphBall and PowerBombs and HiJump: pass if not HiJump: pass if not HiJump: pass if MorphBall: pass if MorphBall: pass if MorphBall: pass if MorphBall: pass if MorphBall: pass if MorphBall: pass if MorphBall: pass if not Missiles: pass if MorphBall and PowerBombs: pass if not MorphBall and PowerBombs and VariaSuit and Ice and SpaceJump: pass if MorphBall and PowerBombs: pass if not MorphBall and PowerBombs and VariaSuit and Ice and SpaceJump: pass if MorphBall and PowerBombs: pass if MorphBall and PowerBombs: pass if not MorphBall and PowerBombs and VariaSuit and Ice and SpaceJump: pass if MorphBall and PowerBombs: pass if MorphBall and PowerBombs: pass if MorphBall and PowerBombs: pass if MorphBall: pass if not SpaceJump: pass if not (HiJump or Ice) and SpaceJump: pass if MorphBall: pass if not SpaceJump: pass if not (HiJump or Ice) and SpaceJump: pass if MorphBall: pass if not SpaceJump: pass if MorphBall: pass if SpeedBooster: pass if SpeedBooster: pass if ScrewAttack: pass if SpeedBooster and VariaSuit: pass if MorphBall: pass if MorphBall: pass if VariaSuit: pass if MorphBall and BombJump: pass if not VariaSuit and Ice: pass if MorphBall and BombJump: pass if not MorphBall and VariaSuit and Ice: pass if MorphBall and VariaSuit: pass if Missiles and MorphBall: pass if not Missiles and MorphBall and GravitySuit and ScrewAttack and SpaceJump: pass if Missiles: pass if not GravitySuit and ScrewAttack and SpaceJump: pass if Missiles and MorphBall: pass if SpeedBooster: pass if SpeedBooster: pass if SuperMissiles and PowerBombs and ScrewAttack and SpeedBooster: pass if MorphBall: pass if MorphBall and UseBombs and SuperMissiles and PowerBombs and ScrewAttack and SpeedBooster: pass if not SuperMissiles and PowerBombs: pass if not MorphBall and UseBombs and SuperMissiles and PowerBombs: pass if MorphBall: pass if MorphBall: pass if not MorphBall and UseBombs and SuperMissiles and PowerBombs: pass if not MorphBall and UseBombs and SuperMissiles and PowerBombs: pass if not MorphBall and UseBombs and SuperMissiles and PowerBombs: pass if MorphBall: pass if not MorphBall and UseBombs and SuperMissiles and PowerBombs: pass if SpeedBooster: pass if not SpeedBooster and ScrewAttack and VariaSuit: pass if not VariaSuit: pass if not VariaSuit: pass if not MorphBall and PowerBombs and VariaSuit: pass if not MorphBall and PowerBombs and RedDoors and VariaSuit: pass if MorphBall: pass if MorphBall: pass if MorphBall: pass if MorphBall: pass if MorphBall: pass if Missiles and ChargeBeam: pass if SpeedBooster: pass if MorphBall: pass if HiJump: pass if not HiJump and WallJump: pass if not HiJump and WallJump: pass if MorphBall: pass if MorphBall: pass if MorphBall: pass if MorphBall: pass if MorphBall: pass if MorphBall: pass if not VariaSuit: pass if not VariaSuit: pass if not VariaSuit: pass if not VariaSuit: pass if not VariaSuit: pass if not VariaSuit: pass if not VariaSuit: pass if not VariaSuit: pass if SpeedBooster and RedDoors: pass if SpeedBooster and RedDoors: pass if SpeedBooster: pass if SpeedBooster and RedDoors: pass if SpeedBooster: pass if SpeedBooster: pass if Missiles and MorphBall: pass if MorphBall: pass if Missiles and MorphBall: pass if Missiles and MorphBall: pass if MorphBall: pass if Missiles: pass if Missiles and MorphBall: pass if Missiles: pass if not MorphBall and PowerBombs and BombJump: pass if MorphBall: pass if not MorphBall and PowerBombs and BombJump: pass if (Missiles or ChargeBeam) and MorphBall: pass if (Missiles or ChargeBeam) and MorphBall: pass if MorphBall: pass if MorphBall and UseBombs: pass if Missiles and ChargeBeam: pass if not Missiles and ChargeBeam: pass if not SpaceJump: pass if not SpaceJump: pass if not SpaceJump: pass if not SpaceJump: pass if not Missiles and ChargeBeam: pass if not GravitySuit or SpaceJump: if (SpeedBooster or Difficulty > 0) and DamageRuns: pass if GravitySuit and DamageRuns: pass if MorphBall and GravitySuit and DamageRuns: if not Energy >= 299 or VariaSuit: pass if GreenDoors and GravitySuit and DamageRuns: pass if GravitySuit and SpaceJump and DamageRuns: pass if SpaceJump and SpeedBooster: pass if MorphBall and GravitySuit and DamageRuns: if not Energy >= 199 or VariaSuit: pass if GreenDoors and GravitySuit and DamageRuns: pass if MorphBall and GreenDoors and GravitySuit and DamageRuns: if not Energy >= 299 or VariaSuit: pass if MorphBall and GravitySuit and DamageRuns: if not Energy >= 199 or VariaSuit: pass if not Missiles and Difficulty > 4: if (Difficulty > 3 or ChargeBeam) and ChargeBeam: pass if not SpaceJump and WallJump: pass if not Missiles and MorphBall and Diffusion and Ice: pass if not Missiles and MorphBall and Diffusion and Ice: pass if not Missiles and MorphBall and Diffusion and Ice: pass if MorphBall: pass if MorphBall: pass if not Missiles and MorphBall and Diffusion and Ice: pass if MorphBall: pass if MorphBall: pass if HiJump: pass if MorphBall: if (SpaceJump or HiJump) and WallJump: pass if ScrewAttack: pass if MorphBall and BombJump and ScrewAttack: pass if MorphBall: pass if Missiles or ChargeBeam: pass if Missiles: pass if MorphBall and BombJump and SpeedBooster: pass if MorphBall and BombJump and SpeedBooster: pass if MorphBall: pass if MorphBall and UseBombs: pass if MorphBall: pass if MorphBall: pass if MorphBall and UseBombs: pass if MorphBall: pass if MorphBall and UseBombs: pass if MorphBall: pass if MorphBall: pass if not Missiles: pass if not (Missiles or ChargeBeam) and ScrewAttack and SpaceJump and WallJump: pass if not HiJump and WallJump: pass if not ScrewAttack and SpaceJump and WallJump: pass if not (Missiles or ChargeBeam) and ScrewAttack and HiJump and WallJump: pass if Missiles: pass if not Missiles and ChargeBeam: pass if not Missiles and ChargeBeam: pass if MorphBall: if not (UseBombs or SpringBall) and GravitySuit: pass if MorphBall: if not (UseBombs or SpringBall) and GravitySuit: pass if not ScrewAttack and SpaceJump and WallJump: pass if not SpaceJump: pass if MorphBall: pass if MorphBall: pass if MorphBall: pass if MorphBall: pass if MorphBall: pass if not MorphBall and UseBombs and BombJump: pass if MorphBall: pass if not MorphBall and UseBombs: pass if MorphBall and UseBombs: pass if not MorphBall and UseBombs: pass if MorphBall: pass if not MorphBall and UseBombs and BombJump: pass if not HiJump and IBJ and Ice and SpeedBooster: pass if MorphBall: if not (UseBombs or WaveBeam or HiJump) and SpaceJump and GravitySuit and Ice and SpaceJump and WallJump: pass if not MorphBall and Ice and UseBombs and WaveBeam and GravitySuit and HiJump and IBJ: pass if not HiJump and SpaceJump and GravitySuit and Ice and IBJ: pass if not SpaceJump and WallJump: pass if not SpaceJump and WallJump: pass if not SpaceJump and WallJump: pass if not SpaceJump and WallJump: pass if not SpaceJump and WallJump: pass if MorphBall: pass if MorphBall: pass if MorphBall: pass if MorphBall: pass if MorphBall: pass if MorphBall and UseBombs and BombJump: pass if not MorphBall and SuperMissiles: pass if MorphBall and UseBombs: if SuperMissiles or ScrewAttack: pass if MorphBall and UseBombs: pass if MorphBall: pass if not MorphBall and UseBombs: pass if not MorphBall and UseBombs: pass if MorphBall: pass if MorphBall: pass if MorphBall and UseBombs: pass if not MorphBall and UseBombs or SpringBall: pass if MorphBall and UseBombs: pass if MorphBall: pass if MorphBall: pass if SpeedBooster and SpaceJump or IBJ: pass if SpeedBooster: pass if SpeedBooster: pass if MorphBall and PowerBombs and GravitySuit and DamageRuns: if not Energy >= 399 or VariaSuit: pass if MorphBall and PowerBombs and GravitySuit and DamageRuns: pass if MorphBall and PowerBombs: if (Missiles and ChargeBeam and Ice or ScrewAttack) and GravitySuit and DamageRuns: if not Energy >= 199 or VariaSuit: pass if MorphBall and PowerBombs and GravitySuit and DamageRuns: if not Energy >= 399 or VariaSuit: pass if MorphBall and BombJump: if (Ice or SpaceJump) and VariaSuit: pass if MorphBall: if (Ice or SpaceJump) and VariaSuit: pass if MorphBall: pass if MorphBall: pass if MorphBall: pass if MorphBall and GravitySuit: pass if MorphBall: if UseBombs and SpringBall or SpaceJump: pass if MorphBall: pass if MorphBall: if UseBombs and SpringBall or SpaceJump: pass if MorphBall and GravitySuit: pass if MorphBall and BombJump: if Ice or SpaceJump: pass if MorphBall: if Ice or SpaceJump: pass if MorphBall and BombJump: if (Ice or SpaceJump) and GravitySuit: pass if MorphBall: if (Ice or SpaceJump) and GravitySuit: pass if SpeedBooster: if not MorphBall or UseBombs: pass if not MorphBall or UseBombs: pass if not MorphBall or UseBombs: pass if SpeedBooster: if not MorphBall or UseBombs: pass if SpeedBooster: pass if not MorphBall and PowerBombs and HiJump and Ice: pass if not MorphBall and PowerBombs and HiJump and WallJump: pass if not MorphBall and PowerBombs and SpeedBooster and HiJump and Ice: pass if not MorphBall and PowerBombs and SpeedBooster and HiJump and Ice: pass if not SuperMissiles and PowerBombs: pass if not SuperMissiles and PowerBombs: pass if not MorphBall or UseBombs: pass if not MorphBall or UseBombs: pass if MorphBall or UseBombs or ScrewAttack: if not (HiJump or Ice) and SpaceJump: pass if not MorphBall or UseBombs: pass if SpeedBooster and GravitySuit: pass if SpeedBooster: pass if SpeedBooster and GravitySuit: pass if SpeedBooster: pass if not (MorphBall and UseBombs or SpringBall) and IBJ: pass if not (MorphBall and UseBombs or SpringBall) and IBJ: pass if not (MorphBall and UseBombs or SpringBall) and IBJ: pass if not (MorphBall and UseBombs or SpringBall) and IBJ: pass if not MorphBall and PowerBombs and WaterLowered: pass if not MorphBall and PowerBombs and WaterLowered: pass if not MorphBall and PowerBombs and WaterLowered: pass if MorphBall and PowerBombs and SpeedBooster and WaterLowered and DamageRuns: pass if not MorphBall and PowerBombs and WaterLowered: pass if MorphBall and PowerBombs: if (WaterLowered or DamageRuns) and SpaceJump and WallJump and IBJ and SpeedBooster and WaterLowered and DamageRuns: pass if MorphBall and PowerBombs and SpeedBooster and WaterLowered and DamageRuns: pass if MorphBall and PowerBombs and SpaceJump and WallJump and IBJ and SpeedBooster and WaterLowered and DamageRuns: pass if MorphBall: pass if Missiles and MorphBall: pass if MorphBall: pass if MorphBall: pass if MorphBall: pass if Missiles and MorphBall: pass if MorphBall: pass if Missiles and MorphBall: pass if MorphBall: pass if not GravitySuit and SpaceJump: pass if not GravitySuit and SpaceJump: pass if MorphBall: pass if GravitySuit: pass if GravitySuit and ScrewAttack: pass if SpeedBooster and GravitySuit: pass if GravitySuit: pass if GravitySuit: pass if Missiles and MorphBall: if (UseBombs or SpringBall) and GravitySuit and GravitySuit: pass if Missiles and MorphBall: if (UseBombs or GravitySuit) and ScrewAttack: pass if Missiles and MorphBall and UseBombs and GravitySuit: pass if Missiles and MorphBall: if (UseBombs or SpringBall) and GravitySuit and GravitySuit: pass if MorphBall and SpeedBooster and HiJump and WaterLowered and GravitySuit: pass if SpeedBooster and MorphBall and HiJump and GravitySuit: pass if MorphBall and BlueDoors: if (WaterLowered or BombJump) and DamageRuns and SpringBall and UseBombs: pass if MorphBall and DamageRuns and SpringBall and UseBombs: pass if MorphBall and BombJump and BlueDoors: pass if MorphBall: pass if MorphBall: if (WaterLowered or SuperMissiles) and PowerBombs and WaveBeam and ScrewAttack and DamageRuns and SuperMissiles and PowerBombs and WaveBeam and GravitySuit: pass if MorphBall: if (Diffusion or WaveBeam) and IceBeam and WaterLowered and DamageRuns: pass if MorphBall: if (Diffusion or WaveBeam) and IceBeam and WaterLowered and DamageRuns: pass if MorphBall and WaterLowered and DamageRuns: pass if MorphBall: if (Diffusion or WaveBeam) and IceBeam and WaterLowered and DamageRuns: pass if MorphBall: if (Diffusion or WaveBeam) and IceBeam and WaterLowered and DamageRuns: pass if MorphBall: if (Diffusion or WaveBeam) and IceBeam and WaterLowered and DamageRuns: pass if MorphBall: if (Diffusion or WaveBeam) and IceBeam: if (WaterLowered or SuperMissiles) and PowerBombs and WaveBeam and ScrewAttack and DamageRuns and Energy >= 199 and SuperMissiles and PowerBombs and WaveBeam and GravitySuit: pass if not WaterLowered: pass if MorphBall: if (Diffusion or WaveBeam) and IceBeam and WaterLowered and DamageRuns: pass if MorphBall: if (Diffusion or WaveBeam) and IceBeam: if (WaterLowered or SuperMissiles) and PowerBombs and WaveBeam and ScrewAttack and DamageRuns and Energy >= 199 and SuperMissiles and PowerBombs and WaveBeam and GravitySuit: pass if not WaterLowered: pass if MorphBall and SpeedBooster and GravitySuit: pass if MorphBall and GravitySuit: pass if MorphBall and SpeedBooster and GravitySuit: pass if MorphBall and GravitySuit: pass if MorphBall and SpeedBooster: pass if MorphBall and GravitySuit: pass if MorphBall and SpeedBooster: pass if MorphBall and UseBombs and SpringBall and BombJump: pass if MorphBall: pass if SpeedBooster and GravitySuit and WaveBeam and HiJump: pass if MorphBall and UseBombs: pass if MorphBall and UseBombs: pass if MorphBall and BombJump: pass if MorphBall: pass if MorphBall: pass if MorphBall: pass if MorphBall: pass if MorphBall: pass if MorphBall: pass if MorphBall: pass if MorphBall: pass if not MorphBall and PowerBombs and HiJump: pass if not MorphBall and PowerBombs and HiJump: pass if MorphBall: pass if MorphBall: pass if Missiles: if not (ChargeBeam or Difficulty > 0) and HiJump: pass if Missiles: if not (ChargeBeam or Difficulty > 0) and HiJump: pass if Missiles: if not (ChargeBeam or Difficulty > 0) and HiJump: pass if MorphBall and PowerBombs: pass if MorphBall and PowerBombs: pass if MorphBall and PowerBombs: pass if MorphBall and PowerBombs: pass if MorphBall and UseBombs: pass if not MorphBall and PowerBombs and VariaSuit and Ice and SpaceJump: pass if MorphBall and UseBombs: pass if MorphBall and PowerBombs: pass if MorphBall and BombJump and Ice: pass if MorphBall: if not UseBombs or SpringBall: pass if MorphBall and UseBombs: pass if MorphBall and UseBombs: pass if MorphBall: if not UseBombs or SpringBall: pass if MorphBall and Missiles and ChargeBeam: pass if MorphBall: pass if not Missiles and MorphBall and PowerBombs: pass if not Missiles and MorphBall and UseBombs: pass if not Missiles and MorphBall and UseBombs: pass if not Missiles and MorphBall and UseBombs: pass if not Missiles and MorphBall and PowerBombs: pass if not Missiles and MorphBall and PowerBombs: pass if MorphBall: pass if MorphBall: pass if SpeedBooster: pass if SpeedBooster: pass if SpeedBooster: pass if not MorphBall and VariaSuit and Ice: pass if MorphBall: pass if Missiles: pass if Missiles: pass if not MorphBall and UseBombs and SpringBall and Ice: pass if MorphBall: pass if Missiles: if (ChargeBeam or Difficulty > 0) and MorphBall and UseBombs: if SpringBall or PowerBombs: pass if Missiles: if (ChargeBeam or Difficulty > 0) and MorphBall and UseBombs: if SpringBall or PowerBombs: pass if Missiles: if (ChargeBeam or Difficulty > 0) and MorphBall and UseBombs: if SpringBall or PowerBombs: pass if Missiles: if (ChargeBeam or Difficulty > 0) and MorphBall and UseBombs: if (SpringBall or PowerBombs) and GravitySuit: pass if Missiles: if (ChargeBeam or Difficulty > 0) and MorphBall and UseBombs: if SpringBall or PowerBombs: pass if Missiles: if (ChargeBeam or Difficulty > 0) and MorphBall and UseBombs: if SpringBall or PowerBombs: pass if Missiles: if (ChargeBeam or Difficulty > 0) and MorphBall and UseBombs: if SpringBall or PowerBombs: pass if Missiles: if (ChargeBeam or Difficulty > 0) and MorphBall and UseBombs: if SpringBall or PowerBombs: pass if Missiles: if (ChargeBeam or Difficulty > 0) and MorphBall and UseBombs: if (SpringBall or PowerBombs) and GravitySuit: pass if Missiles: if (ChargeBeam or Difficulty > 0) and MorphBall and UseBombs: if (SpringBall or PowerBombs) and GravitySuit: pass if Missiles: if (ChargeBeam or Difficulty > 0) and MorphBall and UseBombs: if (SpringBall or PowerBombs) and GravitySuit: pass if Missiles: if (ChargeBeam or Difficulty > 0) and MorphBall and UseBombs: if (SpringBall or PowerBombs) and GravitySuit: pass if MorphBall and UseBombs and HiJump and ScrewAttack and Diffusion and WaveBeam: pass if MorphBall and UseBombs: pass if MorphBall: pass if HiJump: pass if MorphBall and UseBombs and Diffusion and WaveBeam: pass if WaveBeam: pass if MorphBall: pass if MorphBall: pass if MorphBall: pass if MorphBall: pass if not MorphBall and SpaceJump and IBJ: pass if not MorphBall and SpaceJump and IBJ: pass if MorphBall: pass if MorphBall and UseBombs: pass if MorphBall and Bombs: pass if MorphBall and Bombs: pass if SpeedBooster: pass if (SpeedBooster or GravitySuit) and HiJump and WaveBeam: pass if (SpeedBooster or GravitySuit) and HiJump and WaveBeam: pass if (YellowDoors and SpeedBooster or GravitySuit) and HiJump: pass if (SpeedBooster or GravitySuit) and HiJump and WaveBeam: pass if (SpeedBooster or GravitySuit) and HiJump and WaveBeam: pass if (SpeedBooster or GravitySuit) and HiJump and WaveBeam: pass if (SpeedBooster or GravitySuit) and HiJump and WaveBeam: pass if (YellowDoors and SpeedBooster or GravitySuit) and HiJump: pass if (YellowDoors and SpeedBooster or GravitySuit) and HiJump: pass graph.requirements = { ('S0-06', 'S0-0B'): GreenDoors, ('S0-08', 'S0-0A'): Impossible, ('S0-08', 'S0-0C'): Impossible, ('S0-08', 'S0-0D'): PowerBombs, ('S0-08', 'S0-0F'): RedDoors, ('S0-0A', 'S0-08'): Impossible, ('S0-0A', 'S0-0C'): Impossible, ('S0-0A', 'S0-0D'): Impossible, ('S0-0A', 'S0-0F'): Impossible, ('S0-0A', 'S0-11'): Impossible, ('S0-0C', 'S0-08'): Impossible, ('S0-0C', 'S0-0A'): Impossible, ('S0-0C', 'S0-0D'): Impossible, ('S0-0C', 'S0-0F'): Impossible, ('S0-0C', 'S0-11'): Impossible, ('S0-0D', 'S0-08'): PowerBombs, ('S0-0D', 'S0-0A'): Impossible, ('S0-0D', 'S0-0C'): Impossible, ('S0-0D', 'S0-0F'): RedDoors, ('S0-0D', 'S0-11'): PowerBombs, ('S0-0F', 'S0-0A'): Impossible, ('S0-0F', 'S0-0C'): Impossible, ('S0-0F', 'S0-0D'): PowerBombs, ('S0-11', 'S0-0A'): Impossible, ('S0-11', 'S0-0C'): Impossible, ('S0-11', 'S0-0D'): PowerBombs, ('S0-11', 'S0-0F'): RedDoors, ('S0-0E', 'S0-6C'): PowerBombs, ('S0-6C', 'S0-0E'): SpeedBooster, ('S0-6C', 'S0-13'): SpeedBooster, ('S0-13', 'S0-6C'): PowerBombs, ('S0-53', 'S0-56'): ChargeBeam, ('S0-54', 'S0-56'): ChargeBeam, ('S0-55', 'S0-56'): ChargeBeam, ('S0-16', 'S0-1B'): Missiles, ('S0-16', 'S0-41'): Missiles, ('S0-16', 'S0-8D'): Missiles, ('S0-16', 'S0-C1'): IBJ, ('S0-1B', 'S0-16'): Missiles, ('S0-1B', 'S0-C1'): IBJ, ('S0-41', 'S0-16'): Missiles, ('S0-41', 'S0-C1'): IBJ, ('S0-8D', 'S0-16'): Missiles, ('S0-8D', 'S0-C1'): IBJ, ('S0-C1', 'S0-16'): Missiles, ('S0-1C', 'S0-23'): MorphBall, ('S0-23', 'S0-1C'): MorphBall, ('S0-1E', 'S0-1F'): GreenDoors, ('S0-1E', 'S0-9D'): IBJ, ('S0-1E', 'S0-9E'): IBJ, ('S0-1F', 'S0-1E'): GreenDoors, ('S0-1F', 'S0-9D'): IBJ, ('S0-1F', 'S0-9E'): IBJ, ('S0-9D', 'S0-1E'): GreenDoors, ('S0-9D', 'S0-1F'): GreenDoors, ('S0-9D', 'S0-9E'): IBJ, ('S0-9E', 'S0-1E'): GreenDoors, ('S0-9E', 'S0-1F'): GreenDoors, ('S0-9E', 'S0-9D'): IBJ, ('S0-15', 'S0-84'): GreenDoors, ('S0-15', 'S0-CB'): ScrewAttack, ('S0-24', 'S0-15'): GreenDoors, ('S0-24', 'S0-84'): GreenDoors, ('S0-24', 'S0-CB'): ScrewAttack, ('S0-26', 'S0-15'): GreenDoors, ('S0-26', 'S0-84'): GreenDoors, ('S0-26', 'S0-CB'): ScrewAttack, ('S0-27', 'S0-15'): GreenDoors, ('S0-27', 'S0-84'): GreenDoors, ('S0-27', 'S0-CB'): ScrewAttack, ('S0-84', 'S0-15'): GreenDoors, ('S0-84', 'S0-CB'): ScrewAttack, ('S0-CB', 'S0-15'): GreenDoors, ('S0-CB', 'S0-24'): UseBombs, ('S0-CB', 'S0-26'): UseBombs, ('S0-CB', 'S0-27'): UseBombs, ('S0-CB', 'S0-84'): GreenDoors, ('S0-2A', 'S0-A8'): MorphBall, ('S0-2A', 'S0-CA'): IBJ, ('S0-A8', 'S0-2A'): MorphBall, ('S0-A8', 'S0-CA'): IBJ, ('S0-A8', 'S0-2B'): MorphBall, ('S0-A8', 'S0-68'): MorphBall, ('S0-CA', 'S0-2A'): BombJump, ('S0-CA', 'S0-A8'): BombJump, ('S0-CA', 'S0-2B'): BombJump, ('S0-CA', 'S0-68'): BombJump, ('S0-2B', 'S0-A8'): MorphBall, ('S0-2B', 'S0-CA'): IBJ, ('S0-68', 'S0-A8'): MorphBall, ('S0-68', 'S0-CA'): IBJ, ('S0-1D', 'S0-2C'): ScrewAttack, ('S0-1D', 'S0-2D'): ScrewAttack, ('S0-1D', 'S0-5B'): ScrewAttack, ('S0-2C', 'S0-1D'): ScrewAttack, ('S0-2D', 'S0-1D'): ScrewAttack, ('S0-5B', 'S0-1D'): ScrewAttack, ('S0-2F', 'S0-2E'): IBJ, ('S0-30', 'S0-4A'): Difficulty >= 2, ('S0-4A', 'S0-30'): SpeedBooster, ('S0-4A', 'S0-A6'): SpeedBooster, ('S0-A6', 'S0-4A'): Difficulty >= 2, ('S0-34', 'S0-35'): BlueDoors, ('S0-44', 'S0-35'): BlueDoors, ('S0-36', 'S0-37'): GreenDoors, ('S0-37', 'S0-36'): BlueDoors, ('S0-46', 'S0-36'): BlueDoors, ('S0-46', 'S0-37'): GreenDoors, ('S0-48', 'S0-38'): GreenDoors, ('S0-3A', 'S0-3B'): BlueDoors, ('S0-43', 'S0-3B'): BlueDoors, ('S0-3C', 'S0-3D'): GreenDoors, ('S0-3D', 'S0-3C'): BlueDoors, ('S0-45', 'S0-3C'): BlueDoors, ('S0-45', 'S0-3D'): GreenDoors, ('S0-47', 'S0-3E'): GreenDoors, ('S0-40', 'S0-69'): BombJump, ('S0-69', 'S0-40'): Impossible, ('S0-4E', 'S0-4F'): Impossible, ('S0-4F', 'S0-4E'): ScrewAttack, ('S0-4F', 'S0-65'): ScrewAttack, ('S0-65', 'S0-4F'): Impossible, ('S0-51', 'S0-52'): Impossible, ('S0-52', 'S0-51'): Impossible, ('S0-3F', 'S0-62'): Impossible, ('S0-62', 'S0-3F'): Impossible, ('S0-67', 'S0-6A'): Impossible, ('S0-67', 'S0-C3'): Impossible, ('S0-6A', 'S0-67'): Impossible, ('S0-6A', 'S0-C3'): MorphBall, ('S0-C3', 'S0-67'): Impossible, ('S0-C3', 'S0-6A'): Impossible, ('S0-6B', 'S0-C4'): Impossible, ('S0-C4', 'S0-6B'): ChargeBeam, ('S0-6D', 'S0-6F'): RedDoors, ('S0-6E', 'S0-6D'): RedDoors, ('S0-6E', 'S0-6F'): PowerBombs, ('S0-6F', 'S0-6D'): RedDoors, ('S0-6F', 'S0-6E'): PowerBombs, ('S0-70', 'S0-7D'): IBJ, ('S0-7D', 'S0-70'): UseBombs, ('S0-7D', 'S0-71'): UseBombs, ('S0-7D', 'S0-7C'): UseBombs, ('S0-7D', 'S0-82'): UseBombs, ('S0-71', 'S0-7D'): IBJ, ('S0-7C', 'S0-7D'): IBJ, ('S0-82', 'S0-7D'): IBJ, ('S0-77', 'S0-76'): WaveBeam, ('S0-7E', 'S0-7F'): UseBombs, ('S0-7F', 'S0-7E'): UseBombs, ('S0-86', 'S0-87'): IBJ, ('S0-87', 'S0-86'): IBJ, ('S0-87', 'S0-88'): UseBombs, ('S0-87', 'S0-89'): UseBombs, ('S0-87', 'S0-8A'): UseBombs, ('S0-88', 'S0-86'): IBJ, ('S0-88', 'S0-87'): IBJ, ('S0-89', 'S0-86'): IBJ, ('S0-89', 'S0-87'): IBJ, ('S0-8A', 'S0-86'): IBJ, ('S0-8A', 'S0-87'): IBJ, ('S0-8F', 'S0-90'): RedDoors, ('S0-90', 'S0-8F'): WallJump, ('S0-93', 'S0-94'): RedDoors, ('S0-94', 'S0-93'): RedDoors, ('S0-95', 'S0-96'): RedDoors, ('S0-96', 'S0-95'): RedDoors, ('S0-9A', 'S0-99'): RedDoors, ('S0-9B', 'S0-9C'): MorphBall, ('S0-9C', 'S0-9B'): MorphBall, ('S0-9F', 'S0-A0'): Impossible, ('S0-9F', 'S0-A1'): Impossible, ('S0-9F', 'S0-A2'): WaveBeam, ('S0-9F', 'S0-A3'): Impossible, ('S0-A0', 'S0-9F'): GreenDoors, ('S0-A0', 'S0-A1'): Impossible, ('S0-A0', 'S0-A2'): WaveBeam, ('S0-A0', 'S0-A3'): Impossible, ('S0-A1', 'S0-9F'): GreenDoors, ('S0-A1', 'S0-A0'): GreenDoors, ('S0-A1', 'S0-A2'): WaveBeam, ('S0-A1', 'S0-A3'): Impossible, ('S0-A2', 'S0-9F'): GreenDoors, ('S0-A2', 'S0-A0'): Impossible, ('S0-A2', 'S0-A1'): Impossible, ('S0-A2', 'S0-A3'): Impossible, ('S0-A3', 'S0-9F'): GreenDoors, ('S0-A3', 'S0-A0'): GreenDoors, ('S0-A3', 'S0-A1'): GreenDoors, ('S0-A3', 'S0-A2'): WaveBeam, ('S0-AC', 'S0-AF'): Missiles, ('S0-AF', 'S0-AC'): Missiles, ('S0-AF', 'S0-AD'): Missiles, ('S0-AF', 'S0-AE'): Missiles, ('S0-AD', 'S0-AF'): Missiles, ('S0-AE', 'S0-AF'): Missiles, ('S0-B1', 'S0-B0'): GreenDoors, ('S0-64', 'S0-B3'): GreenDoors, ('S0-B2', 'S0-B3'): GreenDoors, ('S0-B4', 'S0-B5'): Impossible, ('S0-B4', 'S0-B6'): Impossible, ('S0-B4', 'S0-B7'): Impossible, ('S0-B5', 'S0-B4'): Impossible, ('S0-B5', 'S0-B6'): Impossible, ('S0-B5', 'S0-B7'): Impossible, ('S0-B6', 'S0-B4'): Impossible, ('S0-B6', 'S0-B5'): Impossible, ('S0-B6', 'S0-B7'): RedDoors, ('S0-B7', 'S0-B4'): Impossible, ('S0-B7', 'S0-B5'): Impossible, ('S0-B7', 'S0-B6'): RedDoors, ('S0-B8', 'S0-B9'): RedDoors, ('S0-B8', 'S0-BA'): Impossible, ('S0-B9', 'S0-B8'): RedDoors, ('S0-B9', 'S0-BA'): Impossible, ('S0-BA', 'S0-B8'): Impossible, ('S0-BA', 'S0-B9'): Impossible, ('S0-BD', 'S0-BE'): Impossible, ('S0-BE', 'S0-BD'): SpaceJump, ('S0-BB', 'S0-BC'): RedDoors, ('S0-BC', 'S0-BB'): RedDoors, ('S0-C5', 'S0-C6'): Impossible, ('S0-C6', 'S0-C5'): Impossible, ('S0-C6', 'S0-C7'): Impossible, ('S0-C7', 'S0-C5'): RedDoors, ('S0-C7', 'S0-C6'): Impossible, ('S0-92', 'S0-CC'): PlasmaBeam, ('S0-CC', 'S0-92'): IBJ, ('S1-01', 'S1-4C'): GreenDoors, ('S1-4C', 'S1-01'): BlueDoors, ('S1-4C', 'S1-02'): GreenDoors, ('S1-4C', 'S1-03'): GreenDoors, ('S1-02', 'S1-01'): BlueDoors, ('S1-02', 'S1-4C'): GreenDoors, ('S1-03', 'S1-01'): BlueDoors, ('S1-03', 'S1-4C'): GreenDoors, ('S1-09', 'S1-0A'): ScrewAttack, ('S1-0A', 'S1-09'): ScrewAttack, ('S1-0B', 'S1-0C'): Difficulty >= 3, ('S1-0C', 'S1-0B'): Difficulty >= 3, ('S1-17', 'S1-58'): ScrewAttack, ('S1-58', 'S1-17'): Difficulty >= 3, ('S1-18', 'S1-5C'): MorphBall, ('S1-5C', 'S1-18'): MorphBall, ('S1-5C', 'S1-54'): MorphBall, ('S1-54', 'S1-5C'): MorphBall, ('S1-1D', 'S1-1E'): ScrewAttack, ('S1-1E', 'S1-1D'): ScrewAttack, ('S1-16', 'S1-59'): WaveBeam, ('S1-20', 'S1-21'): ScrewAttack, ('S1-20', 'S1-4B'): ScrewAttack, ('S1-21', 'S1-20'): Difficulty >= 4, ('S1-21', 'S1-4B'): Difficulty >= 4, ('S1-4B', 'S1-20'): Difficulty >= 4, ('S1-4B', 'S1-21'): Difficulty >= 4, ('S1-22', 'S1-23'): ScrewAttack, ('S1-23', 'S1-22'): ScrewAttack, ('S1-23', 'S1-5E'): ScrewAttack, ('S1-5E', 'S1-23'): ScrewAttack, ('S1-24', 'S1-25'): GravitySuit, ('S1-25', 'S1-24'): GreenDoors, ('S1-26', 'S1-27'): ScrewAttack, ('S1-27', 'S1-26'): ScrewAttack, ('S1-2A', 'S1-2B'): GreenDoors, ('S1-2A', 'S1-6A'): ScrewAttack, ('S1-2B', 'S1-2A'): BlueDoors, ('S1-2B', 'S1-6A'): ScrewAttack, ('S1-6A', 'S1-2A'): BlueDoors, ('S1-6A', 'S1-2B'): GreenDoors, ('S1-2D', 'S1-2E'): UseBombs, ('S1-2D', 'S1-2F'): UseBombs, ('S1-2D', 'S1-5F'): UseBombs, ('S1-2D', 'S1-6E'): UseBombs, ('S1-2E', 'S1-2D'): UseBombs, ('S1-2E', 'S1-2F'): MorphBall, ('S1-2E', 'S1-5F'): MorphBall, ('S1-2E', 'S1-6E'): MorphBall, ('S1-2F', 'S1-2D'): IBJ, ('S1-2F', 'S1-2E'): IBJ, ('S1-5F', 'S1-2D'): IBJ, ('S1-5F', 'S1-2E'): IBJ, ('S1-6E', 'S1-2D'): IBJ, ('S1-6E', 'S1-2E'): IBJ, ('S1-30', 'S1-31'): ScrewAttack, ('S1-31', 'S1-30'): UseBombs, ('S1-38', 'S1-39'): ChargeBeam, ('S1-3B', 'S1-29'): WaveBeam, ('S1-3E', 'S1-3F'): WallJump, ('S1-3F', 'S1-3E'): WallJump, ('S1-43', 'S1-46'): Impossible, ('S1-43', 'S1-47'): Impossible, ('S1-46', 'S1-43'): Impossible, ('S1-46', 'S1-47'): WaveBeam, ('S1-46', 'S1-44'): Impossible, ('S1-46', 'S1-45'): Impossible, ('S1-47', 'S1-43'): Impossible, ('S1-47', 'S1-44'): Impossible, ('S1-47', 'S1-45'): Impossible, ('S1-44', 'S1-46'): Impossible, ('S1-44', 'S1-47'): Impossible, ('S1-45', 'S1-46'): Impossible, ('S1-45', 'S1-47'): Impossible, ('S1-4A', 'S1-6C'): MorphBall, ('S1-6C', 'S1-4A'): UseBombs, ('S1-49', 'S1-48'): ChargeBeam, ('S1-07', 'S1-08'): ScrewAttack, ('S1-08', 'S1-07'): ScrewAttack, ('S1-19', 'S1-4D'): MorphBall, ('S1-19', 'S1-53'): MorphBall, ('S1-19', 'S1-64'): UseBombs, ('S1-4D', 'S1-19'): Impossible, ('S1-4D', 'S1-53'): ChargeBeam, ('S1-4D', 'S1-64'): UseBombs, ('S1-53', 'S1-19'): Impossible, ('S1-53', 'S1-64'): UseBombs, ('S1-64', 'S1-19'): Impossible, ('S1-64', 'S1-4D'): UseBombs, ('S1-64', 'S1-53'): UseBombs, ('S1-4F', 'S1-50'): MorphBall, ('S1-50', 'S1-4F'): MorphBall, ('S1-6F', 'S1-70'): ScrewAttack, ('S1-70', 'S1-6F'): HiJump, ('S2-01', 'S2-03'): PowerBombs, ('S2-01', 'S2-04'): BlueDoors, ('S2-01', 'S2-20'): UseBombs, ('S2-03', 'S2-01'): PowerBombs, ('S2-03', 'S2-04'): BlueDoors, ('S2-03', 'S2-20'): PowerBombs, ('S2-03', 'S2-02'): PowerBombs, ('S2-03', 'S2-05'): PowerBombs, ('S2-03', 'S2-0F'): PowerBombs, ('S2-04', 'S2-03'): PowerBombs, ('S2-04', 'S2-20'): UseBombs, ('S2-20', 'S2-01'): UseBombs, ('S2-20', 'S2-03'): PowerBombs, ('S2-20', 'S2-04'): BlueDoors, ('S2-20', 'S2-02'): UseBombs, ('S2-20', 'S2-05'): UseBombs, ('S2-20', 'S2-0F'): UseBombs, ('S2-02', 'S2-03'): PowerBombs, ('S2-02', 'S2-04'): BlueDoors, ('S2-02', 'S2-20'): UseBombs, ('S2-05', 'S2-03'): PowerBombs, ('S2-05', 'S2-04'): BlueDoors, ('S2-05', 'S2-20'): UseBombs, ('S2-0F', 'S2-03'): PowerBombs, ('S2-0F', 'S2-04'): BlueDoors, ('S2-0F', 'S2-20'): UseBombs, ('S2-0D', 'S2-3A'): BlueDoors, ('S2-0D', 'S2-80'): ScrewAttack, ('S2-3A', 'S2-80'): ScrewAttack, ('S2-80', 'S2-0D'): ScrewAttack, ('S2-80', 'S2-3A'): BlueDoors, ('S2-80', 'S2-3C'): ScrewAttack, ('S2-3C', 'S2-3A'): BlueDoors, ('S2-3C', 'S2-80'): ScrewAttack, ('S2-14', 'S2-15'): UseBombs, ('S2-15', 'S2-14'): ScrewAttack, ('S2-16', 'S2-17'): ScrewAttack, ('S2-17', 'S2-16'): ScrewAttack, ('S2-18', 'S2-1B'): IBJ, ('S2-1B', 'S2-18'): IBJ, ('S2-26', 'S2-27'): Impossible, ('S2-26', 'S2-5D'): Impossible, ('S2-27', 'S2-26'): Impossible, ('S2-5D', 'S2-26'): Impossible, ('S2-5D', 'S2-27'): ChargeBeam, ('S2-29', 'S2-46'): PowerBombs, ('S2-29', 'S2-6C'): PowerBombs, ('S2-46', 'S2-29'): PowerBombs, ('S2-46', 'S2-2A'): PowerBombs, ('S2-46', 'S2-58'): PowerBombs, ('S2-6C', 'S2-29'): PowerBombs, ('S2-6C', 'S2-2A'): PowerBombs, ('S2-6C', 'S2-58'): PowerBombs, ('S2-2A', 'S2-46'): PowerBombs, ('S2-2A', 'S2-6C'): PowerBombs, ('S2-58', 'S2-46'): PowerBombs, ('S2-58', 'S2-6C'): PowerBombs, ('S2-2E', 'S2-30'): ChargeBeam, ('S2-2F', 'S2-30'): ChargeBeam, ('S2-34', 'S2-35'): MorphBall, ('S2-35', 'S2-34'): MorphBall, ('S2-37', 'S2-87'): MorphBall, ('S2-87', 'S2-37'): Impossible, ('S2-3B', 'S2-3D'): IBJ, ('S2-3B', 'S2-83'): IBJ, ('S2-3D', 'S2-3B'): BlueDoors, ('S2-3D', 'S2-83'): IBJ, ('S2-83', 'S2-3B'): BlueDoors, ('S2-83', 'S2-3D'): IBJ, ('S2-3E', 'S2-3F'): MorphBall, ('S2-3F', 'S2-3E'): MorphBall, ('S2-10', 'S2-12'): ScrewAttack, ('S2-10', 'S2-45'): BlueDoors, ('S2-10', 'S2-54'): ScrewAttack, ('S2-12', 'S2-10'): ScrewAttack, ('S2-12', 'S2-45'): BlueDoors, ('S2-45', 'S2-12'): ScrewAttack, ('S2-45', 'S2-54'): ScrewAttack, ('S2-54', 'S2-10'): ScrewAttack, ('S2-54', 'S2-45'): BlueDoors, ('S2-2B', 'S2-47'): Impossible, ('S2-2B', 'S2-48'): Impossible, ('S2-2B', 'S2-75'): MorphBall, ('S2-47', 'S2-2B'): Impossible, ('S2-47', 'S2-75'): Impossible, ('S2-47', 'S2-2C'): Impossible, ('S2-47', 'S2-2D'): Impossible, ('S2-47', 'S2-78'): Impossible, ('S2-48', 'S2-2B'): Impossible, ('S2-48', 'S2-75'): Impossible, ('S2-48', 'S2-2C'): Impossible, ('S2-48', 'S2-2D'): Impossible, ('S2-48', 'S2-78'): Impossible, ('S2-75', 'S2-2B'): MorphBall, ('S2-75', 'S2-47'): Impossible, ('S2-75', 'S2-48'): Impossible, ('S2-75', 'S2-2C'): MorphBall, ('S2-75', 'S2-2D'): MorphBall, ('S2-75', 'S2-78'): MorphBall, ('S2-2C', 'S2-47'): Impossible, ('S2-2C', 'S2-48'): Impossible, ('S2-2C', 'S2-75'): MorphBall, ('S2-2D', 'S2-47'): Impossible, ('S2-2D', 'S2-48'): Impossible, ('S2-2D', 'S2-75'): MorphBall, ('S2-78', 'S2-47'): Impossible, ('S2-78', 'S2-48'): Impossible, ('S2-78', 'S2-75'): MorphBall, ('S2-49', 'S2-7D'): ScrewAttack, ('S2-7D', 'S2-49'): ScrewAttack, ('S2-4D', 'S2-7A'): MorphBall, ('S2-50', 'S2-4D'): IBJ, ('S2-50', 'S2-7A'): IBJ, ('S2-50', 'S2-4E'): IBJ, ('S2-50', 'S2-4F'): IBJ, ('S2-50', 'S2-79'): IBJ, ('S2-51', 'S2-4D'): IBJ, ('S2-51', 'S2-7A'): IBJ, ('S2-51', 'S2-4E'): IBJ, ('S2-51', 'S2-4F'): IBJ, ('S2-51', 'S2-79'): IBJ, ('S2-7A', 'S2-4D'): MorphBall, ('S2-7A', 'S2-50'): MorphBall, ('S2-7A', 'S2-51'): MorphBall, ('S2-7A', 'S2-4E'): MorphBall, ('S2-7A', 'S2-4F'): MorphBall, ('S2-7A', 'S2-79'): IBJ, ('S2-4E', 'S2-7A'): MorphBall, ('S2-4F', 'S2-7A'): MorphBall, ('S2-79', 'S2-7A'): IBJ, ('S2-53', 'S2-91'): MorphBall, ('S2-91', 'S2-53'): IBJ, ('S2-38', 'S2-5F'): GravitySuit, ('S2-5F', 'S2-38'): IBJ, ('S2-64', 'S2-65'): ScrewAttack, ('S2-65', 'S2-64'): Impossible, ('S2-67', 'S2-66'): Impossible, ('S2-1E', 'S2-1F'): IBJ, ('S2-1E', 'S2-71'): IBJ, ('S2-1F', 'S2-1E'): UseBombs, ('S2-1F', 'S2-68'): UseBombs, ('S2-1F', 'S2-69'): UseBombs, ('S2-1F', 'S2-6A'): UseBombs, ('S2-1F', 'S2-6B'): UseBombs, ('S2-1F', 'S2-70'): UseBombs, ('S2-1F', 'S2-71'): IBJ, ('S2-68', 'S2-1F'): IBJ, ('S2-68', 'S2-71'): IBJ, ('S2-69', 'S2-1F'): IBJ, ('S2-69', 'S2-71'): IBJ, ('S2-6A', 'S2-1F'): IBJ, ('S2-6A', 'S2-71'): IBJ, ('S2-6B', 'S2-1F'): IBJ, ('S2-6B', 'S2-71'): IBJ, ('S2-70', 'S2-1F'): IBJ, ('S2-70', 'S2-71'): IBJ, ('S2-71', 'S2-1E'): MorphBall, ('S2-71', 'S2-1F'): UseBombs, ('S2-71', 'S2-68'): MorphBall, ('S2-71', 'S2-69'): MorphBall, ('S2-71', 'S2-6A'): MorphBall, ('S2-71', 'S2-6B'): MorphBall, ('S2-71', 'S2-70'): MorphBall, ('S2-6D', 'S2-73'): IBJ, ('S2-6E', 'S2-6D'): IBJ, ('S2-6E', 'S2-73'): IBJ, ('S2-73', 'S2-6D'): IBJ, ('S2-7B', 'S2-7C'): Impossible, ('S2-88', 'S2-89'): UseBombs, ('S2-89', 'S2-88'): UseBombs, ('S2-36', 'S2-8A'): WaveBeam, ('S2-36', 'S2-8B'): Missiles, ('S2-8A', 'S2-36'): Missiles, ('S2-8B', 'S2-36'): Missiles, ('S2-8B', 'S2-8A'): WaveBeam, ('S2-52', 'S2-8E'): WaveBeam, ('S2-8D', 'S2-8E'): WaveBeam, ('S2-8F', 'S2-90'): UseBombs, ('S2-90', 'S2-8F'): UseBombs, ('S3-01', 'S3-04'): SpaceJump, ('S3-04', 'S3-01'): MorphBall, ('S3-04', 'S3-02'): MorphBall, ('S3-04', 'S3-03'): MorphBall, ('S3-04', 'S3-35'): MorphBall, ('S3-02', 'S3-04'): SpaceJump, ('S3-03', 'S3-04'): SpaceJump, ('S3-35', 'S3-04'): SpaceJump, ('S3-08', 'S3-09'): GreenDoors, ('S3-08', 'S3-4C'): SpeedBooster, ('S3-09', 'S3-08'): SpeedBooster, ('S3-09', 'S3-4C'): SpeedBooster, ('S3-4C', 'S3-08'): Impossible, ('S3-4C', 'S3-09'): Impossible, ('S3-0A', 'S3-4D'): Impossible, ('S3-4D', 'S3-0A'): GreenDoors, ('S3-0B', 'S3-0C'): GreenDoors, ('S3-3D', 'S3-0C'): GreenDoors, ('S3-0D', 'S3-0E'): GreenDoors, ('S3-0D', 'S3-0F'): ScrewAttack, ('S3-0D', 'S3-3C'): PowerBombs, ('S3-0E', 'S3-0D'): GreenDoors, ('S3-0E', 'S3-0F'): MorphBall, ('S3-0E', 'S3-3C'): ScrewAttack, ('S3-0F', 'S3-0D'): GreenDoors, ('S3-0F', 'S3-0E'): GreenDoors, ('S3-0F', 'S3-3C'): ScrewAttack, ('S3-3C', 'S3-0D'): Impossible, ('S3-3C', 'S3-0E'): Impossible, ('S3-3C', 'S3-0F'): Impossible, ('S3-11', 'S3-12'): IBJ, ('S3-12', 'S3-11'): ScrewAttack, ('S3-13', 'S3-53'): ScrewAttack, ('S3-13', 'S3-54'): ScrewAttack, ('S3-53', 'S3-13'): ScrewAttack, ('S3-53', 'S3-54'): ScrewAttack, ('S3-53', 'S3-26'): ScrewAttack, ('S3-54', 'S3-13'): ScrewAttack, ('S3-54', 'S3-53'): ScrewAttack, ('S3-54', 'S3-26'): ScrewAttack, ('S3-26', 'S3-53'): ScrewAttack, ('S3-26', 'S3-54'): ScrewAttack, ('S3-14', 'S3-15'): GreenDoors, ('S3-14', 'S3-46'): GreenDoors, ('S3-15', 'S3-46'): GreenDoors, ('S3-46', 'S3-15'): GreenDoors, ('S3-39', 'S3-15'): GreenDoors, ('S3-39', 'S3-46'): GreenDoors, ('S3-16', 'S3-17'): VariaSuit, ('S3-17', 'S3-16'): GreenDoors, ('S3-18', 'S3-19'): VariaSuit, ('S3-19', 'S3-18'): VariaSuit, ('S3-1A', 'S3-1B'): VariaSuit, ('S3-1B', 'S3-1A'): VariaSuit, ('S3-1C', 'S3-1D'): IBJ, ('S3-1E', 'S3-1F'): VariaSuit, ('S3-1F', 'S3-1E'): VariaSuit, ('S3-20', 'S3-21'): VariaSuit, ('S3-21', 'S3-20'): VariaSuit, ('S3-22', 'S3-31'): ChargeBeam, ('S3-24', 'S3-2B'): GreenDoors, ('S3-28', 'S3-4B'): WaveBeam, ('S3-28', 'S3-4E'): ScrewAttack, ('S3-4B', 'S3-28'): VariaSuit, ('S3-4B', 'S3-4E'): ScrewAttack, ('S3-4E', 'S3-28'): ScrewAttack, ('S3-4E', 'S3-4B'): ScrewAttack, ('S3-2D', 'S3-10'): GreenDoors, ('S3-40', 'S3-10'): GreenDoors, ('S3-25', 'S3-2B'): GreenDoors, ('S3-25', 'S3-2E'): Difficulty > 0, ('S3-2B', 'S3-25'): GreenDoors, ('S3-2B', 'S3-2E'): Difficulty > 0, ('S3-2E', 'S3-25'): GreenDoors, ('S3-2E', 'S3-2B'): GreenDoors, ('S3-2F', 'S3-30'): ScrewAttack, ('S3-2F', 'S3-3F'): ScrewAttack, ('S3-30', 'S3-2F'): GreenDoors, ('S3-30', 'S3-3F'): UseBombs, ('S3-3F', 'S3-2F'): Impossible, ('S3-3F', 'S3-30'): Impossible, ('S3-36', 'S3-37'): SpeedBooster, ('S3-37', 'S3-36'): ScrewAttack, ('S3-3A', 'S3-3B'): Impossible, ('S3-3A', 'S3-3E'): Impossible, ('S3-3B', 'S3-3A'): SpeedBooster, ('S3-3E', 'S3-3A'): SpeedBooster, ('S3-3E', 'S3-3B'): Impossible, ('S3-27', 'S3-47'): GreenDoors, ('S3-27', 'S3-4A'): Difficulty >= 4, ('S3-47', 'S3-27'): ScrewAttack, ('S3-47', 'S3-4A'): Difficulty >= 4, ('S3-4A', 'S3-47'): GreenDoors, ('S3-4F', 'S3-50'): SpeedBooster, ('S3-50', 'S3-4F'): Impossible, ('S4-08', 'S4-09'): RedDoors, ('S4-08', 'S4-1B'): RedDoors, ('S4-08', 'S4-54'): DamageRuns, ('S4-09', 'S4-08'): IceBeam, ('S4-09', 'S4-1B'): DamageRuns, ('S4-09', 'S4-54'): IceBeam, ('S4-1B', 'S4-08'): IceBeam, ('S4-1B', 'S4-09'): DamageRuns, ('S4-1B', 'S4-54'): IceBeam, ('S4-54', 'S4-08'): DamageRuns, ('S4-54', 'S4-09'): RedDoors, ('S4-54', 'S4-1B'): RedDoors, ('S4-0D', 'S4-0E'): UseBombs, ('S4-0D', 'S4-12'): GravitySuit, ('S4-0D', 'S4-41'): UseBombs, ('S4-0E', 'S4-0D'): IBJ, ('S4-0E', 'S4-12'): GravitySuit, ('S4-12', 'S4-0D'): GravitySuit, ('S4-12', 'S4-0E'): GravitySuit, ('S4-12', 'S4-41'): GravitySuit, ('S4-41', 'S4-0D'): IBJ, ('S4-41', 'S4-12'): GravitySuit, ('S4-14', 'S4-15'): MorphBall, ('S4-15', 'S4-14'): MorphBall, ('S4-15', 'S4-4A'): MorphBall, ('S4-4A', 'S4-15'): MorphBall, ('S4-17', 'S4-18'): SpeedBooster, ('S4-18', 'S4-17'): Impossible, ('S4-16', 'S4-3F'): Impossible, ('S4-16', 'S4-40'): Impossible, ('S4-3F', 'S4-16'): Impossible, ('S4-3F', 'S4-40'): ChargeBeam, ('S4-40', 'S4-16'): Impossible, ('S4-40', 'S4-3F'): GravitySuit, ('S4-58', 'S4-5F'): SpaceJump, ('S4-59', 'S4-5F'): SpaceJump, ('S4-1E', 'S4-1D'): Impossible, ('S4-75', 'S4-1D'): Impossible, ('S4-1F', 'S4-4F'): MorphBall, ('S4-21', 'S4-1F'): IBJ, ('S4-21', 'S4-4F'): IBJ, ('S4-21', 'S4-20'): IBJ, ('S4-21', 'S4-60'): IBJ, ('S4-22', 'S4-1F'): IBJ, ('S4-22', 'S4-4F'): IBJ, ('S4-22', 'S4-20'): IBJ, ('S4-22', 'S4-60'): IBJ, ('S4-4F', 'S4-1F'): MorphBall, ('S4-4F', 'S4-21'): MorphBall, ('S4-4F', 'S4-22'): MorphBall, ('S4-4F', 'S4-20'): MorphBall, ('S4-4F', 'S4-60'): MorphBall, ('S4-20', 'S4-4F'): MorphBall, ('S4-60', 'S4-4F'): MorphBall, ('S4-24', 'S4-25'): RedDoors, ('S4-29', 'S4-28'): RedDoors, ('S4-2A', 'S4-37'): ScrewAttack, ('S4-2A', 'S4-5A'): SpringBall, ('S4-2A', 'S4-74'): MorphBall, ('S4-37', 'S4-2A'): ScrewAttack, ('S4-37', 'S4-5A'): ScrewAttack, ('S4-37', 'S4-74'): ScrewAttack, ('S4-5A', 'S4-2A'): SpringBall, ('S4-5A', 'S4-37'): ScrewAttack, ('S4-5A', 'S4-74'): SpringBall, ('S4-74', 'S4-2A'): MorphBall, ('S4-74', 'S4-37'): ScrewAttack, ('S4-74', 'S4-5A'): ScrewAttack, ('S4-11', 'S4-2B'): GravitySuit, ('S4-11', 'S4-3B'): GravitySuit, ('S4-11', 'S4-47'): GravitySuit, ('S4-2B', 'S4-11'): DamageRuns, ('S4-2B', 'S4-3B'): GravitySuit, ('S4-2B', 'S4-47'): ScrewAttack, ('S4-3B', 'S4-11'): GravitySuit, ('S4-3B', 'S4-2B'): GravitySuit, ('S4-3B', 'S4-47'): GravitySuit, ('S4-47', 'S4-11'): DamageRuns, ('S4-47', 'S4-2B'): ScrewAttack, ('S4-47', 'S4-3B'): GravitySuit, ('S4-2C', 'S4-2D'): RedDoors, ('S4-2C', 'S4-2E'): MorphBall, ('S4-2C', 'S4-4B'): BlueDoors, ('S4-2D', 'S4-2C'): DamageRuns, ('S4-2D', 'S4-2E'): DamageRuns, ('S4-2D', 'S4-4B'): BlueDoors, ('S4-2E', 'S4-2D'): RedDoors, ('S4-2E', 'S4-4B'): BlueDoors, ('S4-4B', 'S4-2D'): RedDoors, ('S4-4B', 'S4-2E'): MorphBall, ('S4-2F', 'S4-45'): MorphBall, ('S4-45', 'S4-2F'): UseBombs, ('S4-30', 'S4-35'): GravitySuit, ('S4-30', 'S4-4E'): ScrewAttack, ('S4-35', 'S4-30'): Impossible, ('S4-35', 'S4-4D'): Impossible, ('S4-35', 'S4-4E'): Impossible, ('S4-4D', 'S4-30'): RedDoors, ('S4-4D', 'S4-35'): GravitySuit, ('S4-4D', 'S4-4E'): ScrewAttack, ('S4-4E', 'S4-30'): RedDoors, ('S4-4E', 'S4-35'): ScrewAttack, ('S4-4E', 'S4-4D'): ScrewAttack, ('S4-31', 'S4-50'): ScrewAttack, ('S4-36', 'S4-31'): RedDoors, ('S4-36', 'S4-50'): ScrewAttack, ('S4-50', 'S4-31'): RedDoors, ('S4-50', 'S4-36'): ScrewAttack, ('S4-32', 'S4-33'): RedDoors, ('S4-32', 'S4-64'): GravitySuit, ('S4-33', 'S4-32'): RedDoors, ('S4-33', 'S4-53'): GravitySuit, ('S4-33', 'S4-64'): BombJump, ('S4-53', 'S4-32'): RedDoors, ('S4-53', 'S4-33'): RedDoors, ('S4-53', 'S4-64'): GravitySuit, ('S4-64', 'S4-32'): RedDoors, ('S4-64', 'S4-33'): RedDoors, ('S4-64', 'S4-53'): GravitySuit, ('S4-34', 'S4-62'): Impossible, ('S4-62', 'S4-34'): RedDoors, ('S4-42', 'S4-43'): UseBombs, ('S4-42', 'S4-44'): Impossible, ('S4-42', 'S4-71'): Impossible, ('S4-43', 'S4-42'): UseBombs, ('S4-43', 'S4-44'): Impossible, ('S4-43', 'S4-71'): Impossible, ('S4-44', 'S4-42'): Impossible, ('S4-44', 'S4-43'): Impossible, ('S4-44', 'S4-71'): MorphBall, ('S4-71', 'S4-42'): Impossible, ('S4-71', 'S4-43'): Impossible, ('S4-71', 'S4-44'): MorphBall, ('S4-46', 'S4-49'): GravitySuit, ('S4-49', 'S4-46'): GravitySuit, ('S4-48', 'S4-51'): Impossible, ('S4-48', 'S4-52'): Impossible, ('S4-51', 'S4-48'): ScrewAttack, ('S4-51', 'S4-52'): ScrewAttack, ('S4-52', 'S4-48'): ScrewAttack, ('S4-52', 'S4-51'): ScrewAttack, ('S4-1C', 'S4-38'): Diffusion, ('S4-1C', 'S4-6D'): ScrewAttack, ('S4-1C', 'S4-70'): Diffusion, ('S4-38', 'S4-1C'): Ice, ('S4-38', 'S4-6D'): ScrewAttack, ('S4-38', 'S4-70'): Ice, ('S4-6D', 'S4-1C'): WallJump, ('S4-6D', 'S4-38'): WallJump, ('S4-6D', 'S4-70'): WallJump, ('S4-70', 'S4-1C'): MorphBall, ('S4-70', 'S4-38'): MorphBall, ('S4-70', 'S4-6D'): ScrewAttack, ('S4-56', 'S4-57'): UseBombs, ('S4-57', 'S4-56'): RedDoors, ('S4-5D', 'S4-5E'): ScrewAttack, ('S4-5E', 'S4-5D'): ScrewAttack, ('S4-65', 'S4-66'): WaveBeam, ('S4-66', 'S4-65'): MorphBall, ('S4-6E', 'S4-6F'): MorphBall, ('S4-6F', 'S4-6E'): MorphBall, ('S5-01', 'S5-42'): YellowDoors, ('S5-01', 'S5-4D'): MorphBall, ('S5-01', 'S5-51'): YellowDoors, ('S5-42', 'S5-4D'): MorphBall, ('S5-42', 'S5-51'): YellowDoors, ('S5-4D', 'S5-01'): MorphBall, ('S5-4D', 'S5-42'): YellowDoors, ('S5-4D', 'S5-51'): YellowDoors, ('S5-51', 'S5-42'): YellowDoors, ('S5-51', 'S5-4D'): YellowDoors, ('S5-07', 'S5-08'): IBJ, ('S5-08', 'S5-07'): YellowDoors, ('S5-09', 'S5-07'): YellowDoors, ('S5-09', 'S5-08'): IBJ, ('S5-4E', 'S5-07'): YellowDoors, ('S5-4E', 'S5-08'): IBJ, ('S5-34', 'S5-59'): YellowDoors, ('S5-59', 'S5-34'): YellowDoors, ('S5-0B', 'S5-0C'): IBJ, ('S5-0C', 'S5-0B'): YellowDoors, ('S5-0D', 'S5-0B'): YellowDoors, ('S5-0D', 'S5-0C'): IBJ, ('S5-50', 'S5-0B'): YellowDoors, ('S5-50', 'S5-0C'): IBJ, ('S5-0E', 'S5-0F'): VariaSuit, ('S5-0E', 'S5-10'): VariaSuit, ('S5-0E', 'S5-1E'): VariaSuit, ('S5-0E', 'S5-38'): ScrewAttack, ('S5-0E', 'S5-63'): YellowDoors, ('S5-0F', 'S5-0E'): VariaSuit, ('S5-0F', 'S5-10'): VariaSuit, ('S5-0F', 'S5-1E'): VariaSuit, ('S5-0F', 'S5-38'): ScrewAttack, ('S5-0F', 'S5-63'): YellowDoors, ('S5-10', 'S5-0E'): VariaSuit, ('S5-10', 'S5-0F'): VariaSuit, ('S5-10', 'S5-1E'): VariaSuit, ('S5-10', 'S5-38'): ScrewAttack, ('S5-10', 'S5-63'): YellowDoors, ('S5-1E', 'S5-0E'): VariaSuit, ('S5-1E', 'S5-0F'): VariaSuit, ('S5-1E', 'S5-10'): VariaSuit, ('S5-1E', 'S5-38'): ScrewAttack, ('S5-1E', 'S5-63'): YellowDoors, ('S5-38', 'S5-0E'): ScrewAttack, ('S5-38', 'S5-0F'): ScrewAttack, ('S5-38', 'S5-10'): ScrewAttack, ('S5-38', 'S5-1E'): ScrewAttack, ('S5-38', 'S5-63'): ScrewAttack, ('S5-63', 'S5-0E'): VariaSuit, ('S5-63', 'S5-0F'): VariaSuit, ('S5-63', 'S5-10'): VariaSuit, ('S5-63', 'S5-1E'): VariaSuit, ('S5-63', 'S5-38'): ScrewAttack, ('S5-24', 'S5-40'): WaveBeam, ('S5-40', 'S5-24'): VariaSuit, ('S5-12', 'S5-14'): YellowDoors, ('S5-14', 'S5-12'): YellowDoors, ('S5-28', 'S5-13'): YellowDoors, ('S5-15', 'S5-16'): VariaSuit, ('S5-16', 'S5-15'): VariaSuit, ('S5-18', 'S5-31'): YellowDoors, ('S5-18', 'S5-4F'): VariaSuit, ('S5-18', 'S5-5A'): YellowDoors, ('S5-31', 'S5-18'): SpaceJump, ('S5-31', 'S5-4F'): VariaSuit, ('S5-31', 'S5-5A'): YellowDoors, ('S5-4F', 'S5-18'): SpaceJump, ('S5-4F', 'S5-31'): YellowDoors, ('S5-4F', 'S5-5A'): YellowDoors, ('S5-5A', 'S5-18'): SpaceJump, ('S5-5A', 'S5-31'): YellowDoors, ('S5-5A', 'S5-4F'): VariaSuit, ('S5-1B', 'S5-1D'): GravitySuit, ('S5-1B', 'S5-39'): ScrewAttack, ('S5-1B', 'S5-46'): YellowDoors, ('S5-1C', 'S5-1B'): GravitySuit, ('S5-1C', 'S5-1D'): GravitySuit, ('S5-1C', 'S5-39'): GravitySuit, ('S5-1C', 'S5-46'): YellowDoors, ('S5-1C', 'S5-1F'): GravitySuit, ('S5-1C', 'S5-35'): GravitySuit, ('S5-1D', 'S5-1B'): GravitySuit, ('S5-1D', 'S5-1C'): GravitySuit, ('S5-1D', 'S5-39'): GravitySuit, ('S5-1D', 'S5-46'): YellowDoors, ('S5-1D', 'S5-1F'): GravitySuit, ('S5-1D', 'S5-35'): GravitySuit, ('S5-39', 'S5-1B'): ScrewAttack, ('S5-39', 'S5-1C'): ScrewAttack, ('S5-39', 'S5-1D'): GravitySuit, ('S5-39', 'S5-46'): YellowDoors, ('S5-39', 'S5-1F'): ScrewAttack, ('S5-39', 'S5-35'): ScrewAttack, ('S5-46', 'S5-1B'): GravitySuit, ('S5-46', 'S5-1C'): GravitySuit, ('S5-46', 'S5-1D'): UseBombs, ('S5-46', 'S5-39'): GravitySuit, ('S5-46', 'S5-1F'): GravitySuit, ('S5-46', 'S5-35'): GravitySuit, ('S5-1F', 'S5-1D'): GravitySuit, ('S5-1F', 'S5-39'): ScrewAttack, ('S5-1F', 'S5-46'): YellowDoors, ('S5-35', 'S5-1D'): GravitySuit, ('S5-35', 'S5-39'): ScrewAttack, ('S5-35', 'S5-46'): YellowDoors, ('S5-5B', 'S5-5C'): YellowDoors, ('S5-5C', 'S5-5B'): IBJ, ('S5-5C', 'S5-5D'): IBJ, ('S5-5D', 'S5-5C'): YellowDoors, ('S5-22', 'S5-78'): PowerBombs, ('S5-3D', 'S5-22'): IBJ, ('S5-3D', 'S5-78'): IBJ, ('S5-3D', 'S5-23'): IBJ, ('S5-3D', 'S5-77'): IBJ, ('S5-3E', 'S5-22'): IBJ, ('S5-3E', 'S5-78'): IBJ, ('S5-3E', 'S5-23'): IBJ, ('S5-3E', 'S5-77'): IBJ, ('S5-78', 'S5-22'): UseBombs, ('S5-78', 'S5-3D'): UseBombs, ('S5-78', 'S5-3E'): UseBombs, ('S5-78', 'S5-23'): UseBombs, ('S5-78', 'S5-77'): UseBombs, ('S5-23', 'S5-78'): PowerBombs, ('S5-77', 'S5-78'): PowerBombs, ('S5-25', 'S5-26'): ChargeBeam, ('S5-2A', 'S5-6C'): VariaSuit, ('S5-2A', 'S5-6D'): VariaSuit, ('S5-2A', 'S5-6E'): WallJump, ('S5-6C', 'S5-2A'): VariaSuit, ('S5-6C', 'S5-6D'): VariaSuit, ('S5-6C', 'S5-6E'): WallJump, ('S5-6D', 'S5-2A'): VariaSuit, ('S5-6D', 'S5-6C'): VariaSuit, ('S5-6D', 'S5-6E'): WallJump, ('S5-6E', 'S5-2A'): VariaSuit, ('S5-6E', 'S5-6C'): VariaSuit, ('S5-6E', 'S5-6D'): VariaSuit, ('S5-19', 'S5-30'): YellowDoors, ('S5-19', 'S5-69'): PowerBombs, ('S5-30', 'S5-19'): IBJ, ('S5-30', 'S5-68'): IBJ, ('S5-30', 'S5-69'): PowerBombs, ('S5-61', 'S5-19'): IBJ, ('S5-61', 'S5-30'): YellowDoors, ('S5-61', 'S5-68'): IBJ, ('S5-61', 'S5-69'): PowerBombs, ('S5-68', 'S5-19'): IBJ, ('S5-68', 'S5-30'): YellowDoors, ('S5-68', 'S5-69'): PowerBombs, ('S5-69', 'S5-19'): Impossible, ('S5-69', 'S5-30'): Impossible, ('S5-69', 'S5-61'): Impossible, ('S5-69', 'S5-68'): Impossible, ('S5-3B', 'S5-3C'): GravitySuit, ('S5-3C', 'S5-3B'): GravitySuit, ('S5-41', 'S5-11'): YellowDoors, ('S5-43', 'S5-49'): ScrewAttack, ('S5-49', 'S5-43'): YellowDoors, ('S5-03', 'S5-52'): YellowDoors, ('S5-52', 'S5-03'): YellowDoors, ('S5-1A', 'S5-27'): Impossible, ('S5-27', 'S5-1A'): MorphBall, ('S5-55', 'S5-56'): YellowDoors, ('S5-56', 'S5-55'): WaveBeam, ('S5-67', 'S5-66'): Ice, ('S5-64', 'S5-65'): Impossible, ('S5-65', 'S5-64'): YellowDoors, ('S5-6A', 'S5-6B'): UseBombs, ('S5-6B', 'S5-6A'): UseBombs, ('S5-5E', 'S5-5F'): YellowDoors, ('S5-5E', 'S5-60'): VariaSuit, ('S5-5F', 'S5-5E'): SpaceJump, ('S5-5F', 'S5-60'): VariaSuit, ('S5-60', 'S5-5E'): SpaceJump, ('S5-60', 'S5-5F'): YellowDoors, ('S5-36', 'S5-44'): Ice, ('S5-44', 'S5-36'): WallJump, ('S5-44', 'S5-70'): MorphBall, ('S5-70', 'S5-36'): WallJump, ('S5-70', 'S5-44'): Ice, ('S5-73', 'S5-7B'): GravitySuit, ('S5-7B', 'S5-73'): GravitySuit, ('S6-01', 'S6-33'): Impossible, ('S6-01', 'S6-4F'): ScrewAttack, ('S6-33', 'S6-01'): Impossible, ('S6-33', 'S6-4F'): Impossible, ('S6-33', 'S6-02'): Impossible, ('S6-4F', 'S6-01'): ScrewAttack, ('S6-4F', 'S6-33'): Impossible, ('S6-4F', 'S6-02'): ScrewAttack, ('S6-02', 'S6-33'): Impossible, ('S6-02', 'S6-4F'): ScrewAttack, ('S6-07', 'S6-08'): Difficulty >= 1, ('S6-07', 'S6-32'): UseBombs, ('S6-07', 'S6-4B'): Difficulty >= 1, ('S6-08', 'S6-07'): ScrewAttack, ('S6-08', 'S6-32'): ScrewAttack, ('S6-08', 'S6-4B'): UseBombs, ('S6-32', 'S6-07'): UseBombs, ('S6-32', 'S6-08'): ScrewAttack, ('S6-32', 'S6-4B'): ScrewAttack, ('S6-4B', 'S6-07'): ScrewAttack, ('S6-4B', 'S6-08'): UseBombs, ('S6-4B', 'S6-32'): ScrewAttack, ('S6-0B', 'S6-52'): ScrewAttack, ('S6-0B', 'S6-55'): Impossible, ('S6-52', 'S6-0B'): ScrewAttack, ('S6-52', 'S6-55'): Impossible, ('S6-52', 'S6-0C'): ScrewAttack, ('S6-52', 'S6-0D'): ScrewAttack, ('S6-52', 'S6-0E'): ScrewAttack, ('S6-55', 'S6-0B'): SpeedBooster, ('S6-55', 'S6-52'): ScrewAttack, ('S6-55', 'S6-0C'): SpeedBooster, ('S6-55', 'S6-0D'): SpeedBooster, ('S6-55', 'S6-0E'): SpeedBooster, ('S6-0C', 'S6-52'): ScrewAttack, ('S6-0C', 'S6-55'): Impossible, ('S6-0D', 'S6-52'): ScrewAttack, ('S6-0D', 'S6-55'): Energy > 499, ('S6-0E', 'S6-52'): ScrewAttack, ('S6-0E', 'S6-55'): Impossible, ('S6-20', 'S6-30'): Energy > 499, ('S6-30', 'S6-20'): Energy > 499, ('S6-03', 'S6-21'): Energy > 499, ('S6-21', 'S6-03'): Energy > 499, ('S6-0F', 'S6-47'): ScrewAttack, ('S6-47', 'S6-0F'): MorphBall, ('S6-47', 'S6-10'): MorphBall, ('S6-10', 'S6-47'): ScrewAttack, ('S6-11', 'S6-12'): SpeedBooster, ('S6-11', 'S6-2E'): SpeedBooster, ('S6-12', 'S6-11'): SpeedBooster, ('S6-2E', 'S6-11'): Impossible, ('S6-14', 'S6-1B'): MorphBall, ('S6-1B', 'S6-14'): UseBombs, ('S6-1B', 'S6-15'): UseBombs, ('S6-1B', 'S6-3D'): UseBombs, ('S6-15', 'S6-1B'): MorphBall, ('S6-3D', 'S6-1B'): MorphBall, ('S6-17', 'S6-18'): GreenDoors, ('S6-1A', 'S6-59'): ScrewAttack, ('S6-1C', 'S6-1A'): RedDoors, ('S6-1C', 'S6-59'): Impossible, ('S6-59', 'S6-1A'): RedDoors, ('S6-59', 'S6-1C'): MorphBall, ('S6-25', 'S6-58'): ScrewAttack, ('S6-58', 'S6-25'): ScrewAttack, ('S6-28', 'S6-2A'): RedDoors, ('S6-29', 'S6-28'): IBJ, ('S6-29', 'S6-2A'): RedDoors, ('S6-2A', 'S6-28'): IBJ, ('S6-2C', 'S6-2D'): WaveBeam, ('S6-2D', 'S6-2C'): RedDoors, ('S6-35', 'S6-3E'): GreenDoors, ('S6-3E', 'S6-35'): GreenDoors, ('S6-13', 'S6-36'): UseBombs, ('S6-36', 'S6-13'): PowerBombs, ('S6-37', 'S6-38'): PowerBombs, ('S6-38', 'S6-37'): PowerBombs, ('S6-39', 'S6-3A'): MorphBall, ('S6-3A', 'S6-39'): MorphBall, ('S6-3F', 'S6-42'): Impossible, ('S6-40', 'S6-42'): Impossible, ('S6-41', 'S6-43'): Energy >= 599, ('S6-41', 'S6-44'): Energy >= 599, ('S6-43', 'S6-41'): Energy > 599, ('S6-43', 'S6-4D'): Energy > 599, ('S6-44', 'S6-41'): Energy > 599, ('S6-44', 'S6-4D'): Energy > 599, ('S6-4D', 'S6-43'): Energy > 599, ('S6-4D', 'S6-44'): Energy > 599, ('S0-0E', 'Item S0-0E-0B'): PowerBombs, ('Item S0-0E-0B', 'S0-0E'): PowerBombs, ('Item S0-0E-0B', 'S0-13'): PowerBombs, ('Item S0-0E-0B', 'S0-6C'): PowerBombs, ('S0-13', 'Item S0-0E-0B'): PowerBombs, ('S0-6C', 'Item S0-0E-0B'): PowerBombs, ('S0-20', 'Item S0-05-16'): BackwardsLabs, ('S0-20', 'S0-22'): BackwardsLabs, ('Item S0-05-16', 'S0-20'): RedDoors, ('Item S0-05-16', 'S0-22'): BackwardsLabs, ('S0-22', 'S0-20'): RedDoors, ('S0-22', 'Item S0-05-16'): RedDoors, ('Item S0-14-07', 'S0-4F'): Impossible, ('S0-4F', 'Item S0-14-07'): Missiles, ('S0-58', 'Arachnus'): Missiles, ('S0-58', 'S0-59'): MorphBall, ('S0-58', 'S0-C8'): Missiles, ('Item S0-18-06', 'S0-58'): Missiles, ('Item S0-18-06', 'Arachnus'): Missiles, ('Item S0-18-06', 'S0-59'): MorphBall, ('Item S0-18-06', 'S0-C8'): Missiles, ('Arachnus', 'S0-58'): ScrewAttack, ('Arachnus', 'Item S0-18-06'): ScrewAttack, ('Arachnus', 'S0-59'): MorphBall, ('Arachnus', 'S0-C8'): ScrewAttack, ('S0-59', 'S0-58'): ScrewAttack, ('S0-59', 'Item S0-18-06'): ScrewAttack, ('S0-59', 'Arachnus'): MorphBall, ('S0-59', 'S0-C8'): ScrewAttack, ('S0-C8', 'S0-58'): Missiles, ('S0-C8', 'Item S0-18-06'): Missiles, ('S0-C8', 'Arachnus'): Missiles, ('S0-C8', 'S0-59'): MorphBall, ('S0-6B', 'Item S0-08-0B'): SpringBall, ('Item S0-08-0B', 'S0-6B'): PowerBombs, ('Item S0-08-0B', 'S0-C4'): Impossible, ('S0-C4', 'Item S0-08-0B'): SpringBall, ('S0-74', 'Item S0-16-12'): MorphBall, ('S0-74', 'S0-75'): UseBombs, ('Item S0-16-12', 'S0-74'): MorphBall, ('Item S0-16-12', 'S0-75'): UseBombs, ('S0-75', 'S0-74'): Impossible, ('S0-75', 'Item S0-16-12'): Impossible, ('S0-83', 'Item S0-0E-07'): BombJump, ('Item S0-0E-07', 'S0-83'): GreenDoors, ('S0-9F', 'Item S0-09-04'): WaveBeam, ('Item S0-09-04', 'S0-9F'): GreenDoors, ('Item S0-09-04', 'S0-A0'): Impossible, ('Item S0-09-04', 'S0-A1'): Impossible, ('Item S0-09-04', 'S0-A2'): WaveBeam, ('Item S0-09-04', 'S0-A3'): Impossible, ('S0-A0', 'Item S0-09-04'): WaveBeam, ('S0-A9', 'Item S0-0C-09'): MorphBall, ('Item S0-0C-09', 'S0-A9'): MorphBall, ('S0-AA', 'Item S0-05-08'): SpeedBooster, ('Item S0-05-08', 'S0-AA'): SpeedBooster, ('S0-C2', 'End-of-Game'): PlasmaBeam, ('End-of-Game', 'S0-C2'): RedDoors, ('S0-03', 'Yakuza'): Difficulty > 0, ('S0-03', 'S0-79'): IBJ, ('Yakuza', 'S0-03'): IBJ, ('Yakuza', 'S0-79'): IBJ, ('S0-79', 'S0-03'): IBJ, ('S0-79', 'Yakuza'): Difficulty > 0, ('S1-0D', 'Item S1-0D-02'): MorphBall, ('Item S1-0D-02', 'S1-0D'): MorphBall, ('Item S1-0D-02', 'S1-0E'): MorphBall, ('S1-0E', 'Item S1-0D-02'): MorphBall, ('S1-24', 'Item S1-05-03'): Energy >= 199, ('S1-24', 'Item S1-06-03'): Energy >= 199, ('S1-24', 'Item S1-07-04'): Energy >= 399, ('Item S1-05-03', 'S1-24'): Energy >= 199, ('Item S1-05-03', 'S1-25'): Energy >= 199, ('Item S1-05-03', 'Item S1-06-03'): Impossible, ('Item S1-05-03', 'Item S1-07-04'): Impossible, ('S1-25', 'Item S1-05-03'): Difficulty > 0, ('S1-25', 'Item S1-07-04'): Energy >= 299, ('Item S1-06-03', 'S1-24'): Energy >= 199, ('Item S1-06-03', 'Item S1-05-03'): Impossible, ('Item S1-06-03', 'Item S1-07-04'): Impossible, ('Item S1-07-04', 'S1-24'): Energy >= 399, ('Item S1-07-04', 'Item S1-05-03'): Impossible, ('Item S1-07-04', 'S1-25'): Energy >= 299, ('Item S1-07-04', 'Item S1-06-03'): Impossible, ('S1-3A', 'Ridley'): PlasmaBeam, ('Ridley', 'S1-3A'): IBJ, ('S1-3E', 'Item S1-03-0A'): ScrewAttack, ('Item S1-03-0A', 'S1-3E'): ScrewAttack, ('Item S1-03-0A', 'S1-3F'): ScrewAttack, ('Item S1-03-0A', '3E'): BombJump, ('Item S1-03-0A', '3F'): BombJump, ('S1-3F', 'Item S1-03-0A'): ScrewAttack, ('3E', 'Item S1-03-0A'): BombJump, ('3F', 'Item S1-03-0A'): BombJump, ('S1-51', 'Item S1-07-00'): ScrewAttack, ('S1-51', 'S1-66'): ScrewAttack, ('Item S1-07-00', 'S1-51'): GreenDoors, ('Item S1-07-00', 'S1-66'): MorphBall, ('S1-66', 'S1-51'): GreenDoors, ('S1-66', 'Item S1-07-00'): BombJump, ('S1-52', 'Item S1-09-04'): SpeedBooster, ('S1-52', 'Charge Core-X'): Missiles, ('S1-52', 'S1-55'): Missiles, ('Item S1-09-04', 'S1-52'): Missiles, ('Item S1-09-04', 'Charge Core-X'): Missiles, ('Item S1-09-04', 'S1-55'): Missiles, ('Charge Core-X', 'Item S1-09-04'): Impossible, ('S1-55', 'S1-52'): Missiles, ('S1-55', 'Item S1-09-04'): SpeedBooster, ('S1-55', 'Charge Core-X'): Missiles, ('S1-5D', 'Item S1-0A-04'): MorphBall, ('Item S1-0A-04', 'S1-5D'): MorphBall, ('S1-65', 'Item S1-0C-07'): GravitySuit, ('Item S1-0C-07', 'S1-65'): GravitySuit, ('S1-6D', 'Item S1-11-02'): MorphBall, ('Item S1-11-02', 'S1-6D'): MorphBall, ('S2-0E', 'Item S2-09-03'): UseBombs, ('Item S2-09-03', 'S2-0E'): BlueDoors, ('Data S2', 'S2-13'): BlueDoors, ('S2-14', 'Item S2-00-05'): UseBombs, ('Item S2-00-05', 'S2-14'): MorphBall, ('Item S2-00-05', 'S2-15'): UseBombs, ('S2-15', 'Item S2-00-05'): HiJump, ('S2-16', 'Item S2-02-0E'): UseBombs, ('Item S2-02-0E', 'S2-16'): SpringBall, ('Item S2-02-0E', 'S2-17'): UseBombs, ('S2-17', 'Item S2-02-0E'): UseBombs, ('S2-26', 'Item S2-0C-0B'): Impossible, ('Item S2-0C-0B', 'S2-26'): Impossible, ('Item S2-0C-0B', 'S2-27'): ChargeBeam, ('S2-28', 'Zazabi'): Missiles, ('S2-28', 'S2-85'): IBJ, ('Zazabi', 'S2-28'): IBJ, ('Zazabi', 'S2-85'): IBJ, ('S2-85', 'S2-28'): IBJ, ('S2-85', 'Zazabi'): ScrewAttack, ('S2-31', 'Item S2-0C-04'): MorphBall, ('Item S2-0C-04', 'S2-31'): MorphBall, ('S2-32', 'Nettori'): Impossible, ('S2-32', 'S2-33'): Impossible, ('Nettori', 'S2-33'): Impossible, ('S2-33', 'S2-32'): Difficulty > 0, ('S2-33', 'Nettori'): Difficulty > 0, ('S2-39', 'Item S2-03-0C'): PowerBombs, ('Item S2-03-0C', 'S2-39'): PowerBombs, ('S2-83', 'Security-Level-1'): ScrewAttack, ('Security-Level-1', 'S2-83'): IBJ, ('Security-Level-1', 'S2-3B'): BlueDoors, ('Security-Level-1', 'S2-3D'): IBJ, ('S2-3E', 'Item S2-09-05'): UseBombs, ('Item S2-09-05', 'S2-3E'): UseBombs, ('Item S2-09-05', 'S2-3F'): UseBombs, ('S2-3F', 'Item S2-09-05'): UseBombs, ('S2-10', 'Item S2-04-04'): UseBombs, ('S2-12', 'Item S2-04-04'): ScrewAttack, ('Item S2-04-04', 'S2-10'): UseBombs, ('Item S2-04-04', 'S2-12'): ScrewAttack, ('Item S2-04-04', 'S2-45'): BlueDoors, ('Item S2-04-04', 'S2-54'): ScrewAttack, ('S2-45', 'Item S2-04-04'): UseBombs, ('S2-54', 'Item S2-04-04'): ScrewAttack, ('S2-49', 'Item S2-04-03'): ScrewAttack, ('Item S2-04-03', 'S2-7D'): ScrewAttack, ('S2-7D', 'Item S2-04-03'): ScrewAttack, ('S2-38', 'Item S2-04-0B'): IBJ, ('Item S2-04-0B', 'S2-38'): WallJump, ('S2-5F', 'Item S2-04-0B'): WallJump, ('S2-6D', 'Item S2-08-08'): IBJ, ('Item S2-08-08', 'S2-6D'): IBJ, ('Item S2-08-08', 'S2-73'): IBJ, ('S2-6E', 'Item S2-08-08'): IBJ, ('S2-73', 'Item S2-08-08'): IBJ, ('S2-72', 'Item S2-05-08'): Ice, ('S2-72', 'Item S2-05-0A'): Ice, ('Item S2-05-08', 'S2-72'): UseBombs, ('Item S2-05-0A', 'S2-72'): UseBombs, ('S2-84', 'Item S2-05-00'): SpaceJump, ('S2-84', 'Item S2-05-01'): SpaceJump, ('Item S2-05-00', 'S2-84'): UseBombs, ('S2-86', 'Item S2-10-0C'): SpeedBooster, ('S2-86', 'Item S2-10-0E'): SpeedBooster, ('S3-08', 'Item S3-06-06'): SpeedBooster, ('Item S3-06-06', 'S3-08'): SpeedBooster, ('Item S3-06-06', 'S3-09'): GreenDoors, ('Item S3-06-06', 'S3-4C'): SpeedBooster, ('S3-4C', 'Item S3-06-06'): Impossible, ('Security-Level-2', 'S3-0A'): GreenDoors, ('Security-Level-2', 'S3-4D'): Impossible, ('S3-4D', 'Security-Level-2'): MorphBall, ('S3-0D', 'Item S3-0B-04'): ScrewAttack, ('Item S3-0B-04', 'S3-0D'): GreenDoors, ('Item S3-0B-04', 'S3-0E'): GreenDoors, ('Item S3-0B-04', 'S3-0F'): UseBombs, ('Item S3-0B-04', 'S3-3C'): ScrewAttack, ('S3-0E', 'Item S3-0B-04'): MorphBall, ('S3-0F', 'Item S3-0B-04'): ScrewAttack, ('S3-3C', 'Item S3-0B-04'): Impossible, ('S3-11', 'Item S3-0A-01'): PowerBombs, ('S3-11', 'Item S3-0B-02'): UseBombs, ('Item S3-0A-01', 'S3-11'): MorphBall, ('Item S3-0A-01', 'S3-12'): HiJump, ('Item S3-0B-02', 'S3-11'): ScrewAttack, ('Item S3-0B-02', 'S3-12'): HiJump, ('S3-12', 'Item S3-0A-01'): PowerBombs, ('S3-12', 'Item S3-0B-02'): UseBombs, ('S3-13', 'Item S3-0F-00'): SpeedBooster, ('Item S3-0F-00', 'S3-53'): ScrewAttack, ('Item S3-0F-00', 'S3-54'): ScrewAttack, ('S3-26', 'Item S3-0F-00'): SpeedBooster, ('S3-53', 'Item S3-0F-00'): ScrewAttack, ('S3-54', 'Item S3-0F-00'): ScrewAttack, ('S3-18', 'Item S3-07-0B'): Energy >= 599, ('Item S3-07-0B', 'S3-18'): Energy >= 199, ('Item S3-07-0B', 'S3-19'): Energy >= 299, ('S3-19', 'Item S3-07-0B'): Energy >= 599, ('S3-28', 'Item S3-11-0A'): WaveBeam, ('S3-28', 'Item S3-12-09'): WaveBeam, ('Item S3-11-0A', 'S3-28'): VariaSuit, ('Item S3-11-0A', 'Item S3-12-09'): VariaSuit, ('Item S3-11-0A', 'S3-4B'): VariaSuit, ('Item S3-11-0A', 'S3-4E'): ScrewAttack, ('Item S3-12-09', 'S3-28'): VariaSuit, ('Item S3-12-09', 'Item S3-11-0A'): VariaSuit, ('Item S3-12-09', 'S3-4B'): VariaSuit, ('Item S3-12-09', 'S3-4E'): ScrewAttack, ('S3-4B', 'Item S3-11-0A'): VariaSuit, ('S3-4B', 'Item S3-12-09'): VariaSuit, ('S3-4E', 'Item S3-11-0A'): ScrewAttack, ('S3-4E', 'Item S3-12-09'): ScrewAttack, ('Data S3', 'S3-2C'): GreenDoors, ('S3-32', 'Wide Core-X'): Missiles, ('S3-38', 'Item S3-01-02'): ScrewAttack, ('S3-38', 'S3-57'): ScrewAttack, ('Item S3-01-02', 'S3-38'): ScrewAttack, ('Item S3-01-02', 'Item S3-03-04'): ScrewAttack, ('Item S3-01-02', 'S3-57'): ScrewAttack, ('Item S3-03-04', 'Item S3-01-02'): ScrewAttack, ('Item S3-03-04', 'S3-57'): ScrewAttack, ('S3-57', 'S3-38'): ScrewAttack, ('S3-57', 'Item S3-01-02'): ScrewAttack, ('S3-57', 'Item S3-03-04'): ScrewAttack, ('S3-3A', 'Item S3-0B-06'): IBJ, ('Item S3-0B-06', 'S3-3A'): IBJ, ('Item S3-0B-06', 'S3-3B'): Impossible, ('Item S3-0B-06', 'S3-3E'): Impossible, ('S3-3B', 'Item S3-0B-06'): IBJ, ('S3-3E', 'Item S3-0B-06'): IBJ, ('S3-45', 'Item S3-11-04'): ScrewAttack, ('Item S3-11-04', 'S3-45'): ScrewAttack, ('S3-27', 'Item S3-0E-0A'): ScrewAttack, ('Item S3-0E-0A', 'S3-27'): ScrewAttack, ('Item S3-0E-0A', 'S3-47'): GreenDoors, ('Item S3-0E-0A', 'S3-4A'): IBJ, ('S3-4A', 'Item S3-0E-0A'): ScrewAttack, ('S3-4F', 'Item S3-14-03'): ScrewAttack, ('S3-4F', 'Item S3-14-09'): GravitySuit, ('Item S3-14-03', 'S3-4F'): Impossible, ('Item S3-14-03', 'S3-50'): ScrewAttack, ('Item S3-14-09', 'S3-4F'): Impossible, ('Item S3-14-09', 'S3-50'): GravitySuit, ('S3-50', 'Item S3-14-03'): Impossible, ('S3-50', 'Item S3-14-09'): Impossible, ('S3-58', 'Item S3-00-05'): ScrewAttack, ('Item S3-00-05', 'S3-58'): ScrewAttack, ('Item S3-00-05', 'S3-59'): ScrewAttack, ('S3-59', 'Item S3-00-05'): ScrewAttack, ('Data S4', 'S4-0A'): RedDoors, ('S4-0D', 'Item S4-0C-06'): DamageRuns, ('Item S4-0C-06', 'S4-0D'): DamageRuns, ('Item S4-0C-06', 'S4-0E'): DamageRuns, ('Item S4-0C-06', 'S4-12'): GravitySuit, ('Item S4-0C-06', 'S4-41'): DamageRuns, ('S4-0E', 'Item S4-0C-06'): GravitySuit, ('S4-12', 'Item S4-0C-06'): GravitySuit, ('S4-41', 'Item S4-0C-06'): GravitySuit, ('Item S4-09-02', 'S4-3F'): Impossible, ('Item S4-09-02', 'S4-40'): Impossible, ('S4-3F', 'Item S4-09-02'): Impossible, ('S4-40', 'Item S4-09-02'): Impossible, ('S4-1D', 'Item S4-0D-01'): UseBombs, ('S4-1D', 'Item S4-0E-02'): UseBombs, ('Item S4-0D-01', 'S4-1D'): Impossible, ('Item S4-0D-01', 'S4-1E'): UseBombs, ('Item S4-0D-01', 'S4-75'): UseBombs, ('Item S4-0E-02', 'S4-1D'): Impossible, ('S4-1E', 'Item S4-0D-01'): UseBombs, ('S4-1E', 'Item S4-0E-02'): UseBombs, ('S4-75', 'Item S4-0D-01'): UseBombs, ('S4-75', 'Item S4-0E-02'): UseBombs, ('S4-23', 'Item S4-0B-08'): None, ('Item S4-0B-08', 'S4-23'): None, ('S4-26', 'Item S4-0A-0C'): PowerBombs, ('Item S4-0A-0C', 'S4-26'): IBJ, ('Item S4-0A-0C', 'S4-27'): IBJ, ('S4-27', 'Item S4-0A-0C'): PowerBombs, ('S4-30', 'Item S4-07-08'): ScrewAttack, ('Item S4-07-08', 'S4-30'): RedDoors, ('Item S4-07-08', 'S4-35'): ScrewAttack, ('Item S4-07-08', 'S4-4D'): ScrewAttack, ('Item S4-07-08', 'S4-4E'): MorphBall, ('S4-35', 'Item S4-07-08'): Impossible, ('S4-4D', 'Item S4-07-08'): ScrewAttack, ('S4-4E', 'Item S4-07-08'): MorphBall, ('S4-31', 'Item S4-07-0A'): ScrewAttack, ('Item S4-07-0A', 'S4-31'): RedDoors, ('Item S4-07-0A', 'S4-36'): ScrewAttack, ('Item S4-07-0A', 'S4-50'): MorphBall, ('S4-36', 'Item S4-07-0A'): ScrewAttack, ('S4-50', 'Item S4-07-0A'): MorphBall, ('Security-Level-4', 'S4-34'): RedDoors, ('Security-Level-4', 'S4-62'): Impossible, ('S4-04', 'Item S4-09-06'): MorphBall, ('Item S4-09-06', 'S4-04'): MorphBall, ('Item S4-09-06', 'S4-3C'): MorphBall, ('S4-3C', 'Item S4-09-06'): MorphBall, ('S4-4C', 'Item S4-00-06'): DamageRuns, ('S4-4C', 'Water Pump'): DamageRuns, ('Item S4-00-06', 'S4-4C'): GravitySuit, ('Item S4-00-06', 'Water Pump'): GravitySuit, ('Water Pump', 'S4-4C'): WaterLowered, ('Water Pump', 'Item S4-00-06'): WaterLowered, ('S4-55', 'Item S4-0F-06'): ScrewAttack, ('S4-55', 'S4-5B'): Energy >= 199, ('S4-55', 'S4-5C'): Energy >= 199, ('Item S4-0F-06', 'S4-55'): Energy >= 199, ('Item S4-0F-06', 'S4-5B'): Energy >= 199, ('Item S4-0F-06', 'S4-5C'): Energy >= 199, ('S4-5B', 'S4-55'): Energy >= 199, ('S4-5B', 'Item S4-0F-06'): ScrewAttack, ('S4-5B', 'S4-5C'): DamageRuns, ('S4-5C', 'S4-55'): Energy >= 199, ('S4-5C', 'Item S4-0F-06'): ScrewAttack, ('S4-5C', 'S4-5B'): DamageRuns, ('S4-5D', 'Item S4-13-07'): ScrewAttack, ('Item S4-12-07', 'Item S4-13-07'): Impossible, ('Item S4-12-07', 'S4-5E'): ScrewAttack, ('Item S4-13-07', 'S4-5D'): ScrewAttack, ('Item S4-13-07', 'Item S4-12-07'): ScrewAttack, ('Item S4-13-07', 'S4-5E'): GravitySuit, ('S4-5E', 'Item S4-12-07'): ScrewAttack, ('S4-5E', 'Item S4-13-07'): GravitySuit, ('S4-67', 'Item S4-06-0E'): GravitySuit, ('Item S4-06-0E', 'S4-67'): UseBombs, ('S4-1A', 'Serris'): Missiles, ('S4-1A', 'S4-68'): Missiles, ('S4-68', 'S4-1A'): Missiles, ('S4-68', 'Serris'): Missiles, ('S4-72', 'Item S4-05-03'): MorphBall, ('Item S4-05-03', 'S4-72'): MorphBall, ('S5-0A', 'Item S5-04-01'): YellowDoors, ('Item S5-05-01', 'Item S5-04-01'): Impossible, ('Data S5', 'S5-34'): YellowDoors, ('Data S5', 'S5-59'): YellowDoors, ('Security-Level-3', 'S5-13'): YellowDoors, ('S5-28', 'S5-13'): YellowDoors, ('S5-17', 'Item S5-0C-07'): BombJump, ('Item S5-0C-07', 'S5-17'): BombJump, ('S5-45', 'Item S5-0F-07'): VariaSuit, ('Item S5-0F-07', 'S5-45'): MorphBall, ('S5-22', 'Item S5-12-04'): PowerBombs, ('Item S5-12-04', 'S5-22'): UseBombs, ('Item S5-12-04', 'S5-23'): UseBombs, ('Item S5-12-04', 'S5-3D'): UseBombs, ('Item S5-12-04', 'S5-3E'): UseBombs, ('Item S5-12-04', 'S5-77'): UseBombs, ('Item S5-12-04', 'S5-78'): UseBombs, ('S5-23', 'Item S5-12-04'): PowerBombs, ('S5-3D', 'Item S5-12-04'): IBJ, ('S5-3E', 'Item S5-12-04'): IBJ, ('S5-77', 'Item S5-12-04'): PowerBombs, ('S5-78', 'Item S5-12-04'): UseBombs, ('S5-3A', 'Nightmare'): SpaceJump, ('S5-3A', 'S5-54'): Impossible, ('Nightmare', 'S5-54'): Impossible, ('S5-54', 'S5-3A'): SpaceJump, ('S5-54', 'Nightmare'): SpaceJump, ('S5-2A', 'Item S5-07-0B'): VariaSuit, ('S5-6C', 'Item S5-07-0B'): VariaSuit, ('Item S5-07-0B', 'S5-2A'): VariaSuit, ('Item S5-07-0B', 'S5-6C'): VariaSuit, ('Item S5-07-0B', 'S5-6D'): VariaSuit, ('Item S5-07-0B', 'S5-6E'): WallJump, ('S5-6D', 'Item S5-07-0B'): VariaSuit, ('S5-6E', 'Item S5-07-0B'): VariaSuit, ('S5-37', 'Item S5-06-05'): VariaSuit, ('Item S5-06-05', 'S5-37'): VariaSuit, ('Item S5-03-04', 'S5-43'): YellowDoors, ('Item S5-03-04', 'S5-49'): ScrewAttack, ('S5-49', 'Item S5-03-04'): ScrewAttack, ('S5-03', 'Item S5-05-04'): ScrewAttack, ('Item S5-05-04', 'S5-03'): YellowDoors, ('Item S5-05-04', 'S5-52'): YellowDoors, ('S5-52', 'Item S5-05-04'): ScrewAttack, ('S5-1A', 'Item S5-16-04'): Impossible, ('Item S5-16-04', 'S5-1A'): SpaceJump, ('Item S5-16-04', 'S5-27'): Impossible, ('S5-27', 'Item S5-16-04'): UseBombs, ('S5-4B', 'Item S5-0B-01'): ScrewAttack, ('Item S5-0B-01', 'S5-4B'): ScrewAttack, ('Item S5-0B-01', 'S5-57'): ScrewAttack, ('Item S5-0B-01', 'S5-58'): ScrewAttack, ('S5-57', 'Item S5-0B-01'): ScrewAttack, ('S5-58', 'Item S5-0B-01'): ScrewAttack, ('S5-76', 'Item S5-11-05'): PowerBombs, ('Item S5-11-05', 'S5-76'): PowerBombs, ('S5-73', 'Item S5-14-07'): GravitySuit, ('Item S5-14-07', 'S5-7B'): GravitySuit, ('S5-7B', 'Item S5-14-07'): GravitySuit, ('S5-2F', 'Item S5-0E-08'): SpaceJump, ('Item S5-0E-08', 'S5-2F'): VariaSuit, ('S6-01', 'Item S6-05-03'): Impossible, ('Item S6-05-03', 'S6-01'): Impossible, ('Item S6-05-03', 'S6-02'): Impossible, ('Item S6-05-03', 'S6-33'): MorphBall, ('Item S6-05-03', 'S6-4F'): Impossible, ('S6-02', 'Item S6-05-03'): Impossible, ('S6-33', 'Item S6-05-03'): MorphBall, ('S6-4F', 'Item S6-05-03'): Impossible, ('S6-19', 'Mega Core-X'): ChargeBeam, ('Mega Core-X', 'S6-19'): GreenDoors, ('S6-34', 'S6-19'): GreenDoors, ('S6-34', 'Mega Core-X'): ChargeBeam, ('S6-1D', 'Item S6-05-0B'): IBJ, ('Item S6-05-0B', 'S6-1D'): UseBombs, ('S6-1E', 'Wave Core-X'): GravitySuit, ('S6-1E', 'S6-1F'): GravitySuit, ('S6-1E', 'S6-24'): GravitySuit, ('S6-1E', 'S6-57'): ScrewAttack, ('Wave Core-X', 'S6-1E'): Impossible, ('Wave Core-X', 'S6-57'): Impossible, ('S6-1F', 'S6-1E'): Impossible, ('S6-1F', 'Wave Core-X'): GravitySuit, ('S6-1F', 'S6-24'): GravitySuit, ('S6-1F', 'S6-57'): Impossible, ('S6-24', 'S6-1E'): Impossible, ('S6-24', 'Wave Core-X'): GravitySuit, ('S6-24', 'S6-1F'): GravitySuit, ('S6-24', 'S6-57'): Impossible, ('S6-57', 'S6-1E'): ScrewAttack, ('S6-57', 'Wave Core-X'): ScrewAttack, ('S6-57', 'S6-1F'): ScrewAttack, ('S6-57', 'S6-24'): ScrewAttack, ('S6-25', 'Item S6-09-05'): IceBeam, ('S6-25', 'Item S6-0A-06'): WaveBeam, ('Item S6-09-05', 'S6-25'): ScrewAttack, ('Item S6-09-05', 'S6-58'): UseBombs, ('Item S6-0A-06', 'S6-25'): WaveBeam, ('Item S6-0A-06', 'S6-58'): ScrewAttack, ('S6-58', 'Item S6-09-05'): IceBeam, ('S6-58', 'Item S6-0A-06'): ScrewAttack, ('S6-31', 'Item S6-0E-03'): UseBombs, ('Item S6-0E-03', 'S6-31'): UseBombs, ('Data S6', 'S6-35'): GreenDoors, ('Data S6', 'S6-3E'): GreenDoors, ('Item S6-06-08', 'S6-36'): UseBombs, ('S6-36', 'Item S6-06-08'): PowerBombs, ('S6-3F', 'Item S6-0C-08'): Impossible, ('S6-3F', 'Item S6-0B-09'): WallJump, ('Item S6-0C-08', 'S6-42'): Impossible, ('Item S6-0B-09', 'S6-3F'): MorphBall, ('Item S6-0B-09', 'S6-40'): MorphBall, ('Item S6-0B-09', 'S6-42'): Impossible, ('S6-40', 'Item S6-0C-08'): Impossible, ('S6-40', 'Item S6-0B-09'): WallJump, ('S6-42', 'Item S6-0B-09'): MorphBall, ('S6-4C', 'Item S6-08-03'): UseBombs, ('Item S6-08-03', 'S6-4C'): SpringBall, ('S6-56', 'Item S6-0E-04'): SpeedBooster, ('Item S6-0E-04', 'S6-56'): SpeedBooster, ('S6-5A', 'Item S6-03-04'): SpeedBooster, ('S6-5A', 'Item S6-01-06'): SpaceJump, ('Item S6-03-04', 'S6-5A'): SpeedBooster, ('Item S6-01-06', 'S6-5A'): SpeedBooster, ('S5-4D', 'S5-50'): YellowDoors, ('S5-0A', 'S5-0C'): YellowDoors, ('S5-03', 'S5-0B'): WaveBeam, ('S5-55', 'S5-1F'): YellowDoors, ('S5-37', 'S5-39'): YellowDoors, ('S5-24', 'S5-1C'): YellowDoors, ('S5-15', 'S5-1D'): YellowDoors, ('S5-64', 'S5-46'): WaveBeam, ('S5-56', 'S5-5C'): WaveBeam } def find_available_areas(graph): check = int(StartLocation[1:2]) AreaOpen[check] = StartLocation if AreaOpen[0] == None: check = 'S0-32' path = graph.get_path(StartLocation, check) if path != None: path = graph.get_path(check, StartLocation) if path != None: AreaOpen[0] = check if AreaOpen[1] == None: check = 'S1-00' path = graph.get_path(StartLocation, check) if path != None: path = graph.get_path(check, StartLocation) if path != None: AreaOpen[1] = check if ScrewAttack: if AreaOpen[1] == None: check = 'S1-6B' path = graph.get_path(StartLocation, check) if path != None: path = graph.get_path(check, StartLocation) if path != None: AreaOpen[1] = check if AreaOpen[1] == None: check = 'S1-68' path = graph.get_path(StartLocation, check) if path != None: path = graph.get_path(check, StartLocation) if path != None: AreaOpen[1] = check if AreaOpen[2] == None: check = 'S2-00' path = graph.get_path(StartLocation, check) if path != None: path = graph.get_path(check, StartLocation) if path != None: AreaOpen[2] = check if ScrewAttack: if AreaOpen[2] == None: check = 'S2-7F' path = graph.get_path(StartLocation, check) if path != None: path = graph.get_path(check, StartLocation) if path != None: AreaOpen[2] = check if AreaOpen[2] == None: check = 'S2-82' path = graph.get_path(StartLocation, check) if path != None: path = graph.get_path(check, StartLocation) if path != None: AreaOpen[2] = check if AreaOpen[3] == None: check = 'S3-00' path = graph.get_path(StartLocation, check) if path != None: path = graph.get_path(check, StartLocation) if path != None: AreaOpen[3] = check if ScrewAttack: if AreaOpen[3] == None: check = 'S3-56' path = graph.get_path(StartLocation, check) if path != None: path = graph.get_path(check, StartLocation) if path != None: AreaOpen[3] = check if AreaOpen[3] == None: check = 'S3-59' path = graph.get_path(StartLocation, check) if path != None: path = graph.get_path(check, StartLocation) if path != None: AreaOpen[3] = check if AreaOpen[4] == None: check = 'S4-00' path = graph.get_path(StartLocation, check) if path != None: path = graph.get_path(check, StartLocation) if path != None: AreaOpen[4] = check if ScrewAttack: if AreaOpen[4] == None: check = 'S4-6A' path = graph.get_path(StartLocation, check) if path != None: path = graph.get_path(check, StartLocation) if path != None: AreaOpen[4] = check if AreaOpen[4] == None: check = 'S4-6C' path = graph.get_path(StartLocation, check) if path != None: path = graph.get_path(check, StartLocation) if path != None: AreaOpen[4] = check if AreaOpen[5] == None: check = 'S5-00' path = graph.get_path(StartLocation, check) if path != None: path = graph.get_path(check, StartLocation) if path != None: AreaOpen[5] = check if ScrewAttack and AreaOpen[5] == None: check = 'S5-53' path = graph.get_path(StartLocation, check) if path != None: path = graph.get_path(check, StartLocation) if path != None: AreaOpen[5] = check if AreaOpen[6] == None: check = 'S6-00' path = graph.get_path(StartLocation, check) if path != None: path = graph.get_path(check, StartLocation) if path != None: AreaOpen[6] = check if ScrewAttack: if AreaOpen[6] == None: check = 'S6-51' path = graph.get_path(StartLocation, check) if path != None: path = graph.get_path(check, StartLocation) if path != None: AreaOpen[6] = check if AreaOpen[6] == None: check = 'S6-54' path = graph.get_path(StartLocation, check) if path != None: path = graph.get_path(check, StartLocation) if path != None: AreaOpen[6] = check if BlueDoors == False: path = graph.get_path(StartLocation, 'Security-Level-1', 250, **('depth',)) if path != None: enable_item(graph, 'BlueDoors') path = graph.get_path('Security-Level-1', StartLocation, 250, **('depth',)) if path == None: disable_item(graph, 'BlueDoors') if GreenDoors == False: path = graph.get_path(StartLocation, 'Security-Level-2', 250, **('depth',)) if path != None: enable_item(graph, 'GreenDoors') path = graph.get_path('Security-Level-2', StartLocation, 250, **('depth',)) if path == None: disable_item(graph, 'GreenDoors') elif SeedSettings['SplitSecurity'] == False: enable_item(graph, 'BlueDoors') if YellowDoors == False: path = graph.get_path(StartLocation, 'Security-Level-3', 250, **('depth',)) if path != None: enable_item(graph, 'YellowDoors') path = graph.get_path('Security-Level-3', StartLocation, 250, **('depth',)) if path == None: disable_item(graph, 'YellowDoors') elif SeedSettings['SplitSecurity'] == False: enable_item(graph, 'GreenDoors') enable_item(graph, 'BlueDoors') if RedDoors == False: path = graph.get_path(StartLocation, 'Security-Level-4', 250, **('depth',)) if path != None: enable_item(graph, 'RedDoors') path = graph.get_path('Security-Level-4', StartLocation, 250, **('depth',)) if path == None: disable_item(graph, 'RedDoors') elif SeedSettings['SplitSecurity'] == False: enable_item(graph, 'YellowDoors') enable_item(graph, 'GreenDoors') enable_item(graph, 'BlueDoors') if WaterLowered == False: path = graph.get_path(StartLocation, 'S4-00') if path != None: path = graph.get_path('S4-00', 'Water Pump', True) if path != None: enable_item(graph, 'WaterLowered') path = graph.get_path('Water Pump', 'S4-00', True) if path == None: disable_item(graph, 'WaterLowered') def randomize_game(graph): global PlacedETanks, PlacedMissiles, PlacedPowerBombs, areaLayout, areaLayout, areaLayout, PlacedETanks, PlacedMissiles, PlacedPowerBombs, MissileCount, NettoriOpen, PlacedMissiles, MissileCount, PlacedETanks, PlacedETanks, MaxETanks, PlacedETanks, PlacedMissiles, PlacedPowerBombs update_requirements(graph) PlacedETanks = PlacedMissiles = PlacedPowerBombs = 0 gameBeatable = False init = False weightInit = False startingWeights = list() availableItems = list() areaWeights = list() MajorLocations = list() MinorLocations = list() PossibleMissileTanks = list() AllItemLocations = list() locationWeights = list() locationsPerArea = list() weightValue = list() newLocations = list() invalidItems = list() invalidWeights = list() oldLocations = list() oldWeights = list() FirstItem = None AddETank = False attemptedLayouts = [ [ 5, 3, 1, 2, 4, 6]] WeightedMajors = { 'MainMissiles': 16, 'MorphBall': 16, 'ChargeBeam': 8, 'Bombs': 14, 'HiJumpBoots': 14, 'SpeedBooster': 8, 'SuperMissileItem': 8, 'VariaSuit': 12, 'IceMissileItem': 6, 'WideBeam': 4, 'MainPowerBombs': 6, 'SpaceJump': 4, 'PlasmaBeam': 2, 'GravitySuit': 4, 'DiffusionItem': 6, 'WaveBeam': 4, 'ScrewAttack': 2, 'IceBeam': 2 } BossHealths = { 'Arachnus': 0, 'Yakuza': 1000, 'Ridley': 4500, 'Charge Core-X': 0, 'Zazabi': 100, 'Nettori': 2000, 'Data S3': 300, 'Wide Core-X': 0, 'Serris': 50, 'Nightmare': 1800, 'Mega Core-X': 0, 'Box-2': 500 } print('Generating, please wait...') if gameBeatable == False: if init == False: if SeedSettings['SectorShuffle'] == True: areaDoors = { 1: [ 'S1-6B', 'S1-68'], 2: [ 'S2-7F', 'S2-82'], 3: [ 'S3-59', 'S3-56'], 4: [ 'S4-6C', 'S4-6A'], 5: [ 'S5-02', 'S5-53'], 6: [ 'S6-51', 'S6-54'] } areaLayout = random.sample(range(1, 7), 6) if (SeedSettings['MajorMinor'] == True or areaLayout[2] != 1) and areaLayout[2] != 2 and areaLayout[3] != 1 and areaLayout[3] != 2: attemptedLayouts.append(areaLayout) if areaLayout in attemptedLayouts: areaLayout = random.sample(range(1, 7), 6) # continue # continue elif areaLayout in attemptedLayouts: areaLayout = random.sample(range(1, 7), 6) # continue attemptedLayouts.append(areaLayout) for area in areaLayout: elevator = areaLayout.index(area) if elevator == 0: leftArea = areaLayout[5] else: leftArea = areaLayout[areaLayout.index(area) - 1] if elevator == 5: rightArea = areaLayout[0] else: rightArea = areaLayout[areaLayout.index(area) + 1] if area == 1: topTile = 19 bottomTile = 35 leftTile = 179 rightTile = 180 tileset = 17 if leftArea > 2: leftTube = 226 + leftArea else: leftTube = 235 + leftArea if rightArea > 2: rightTube = 9 + rightArea elif rightArea == 2: rightTube = 4 else: rightTube = 1 graph.patcher.update({ 4857211: leftTube }) graph.patcher.update({ 4857224: leftTube + 16 }) graph.patcher.update({ 4856958: rightTube }) graph.patcher.update({ 4856975: rightTube + 16 }) elif area == 2: topTile = 20 bottomTile = 36 leftTile = 181 rightTile = 182 tileset = 35 if leftArea > 2: leftTube = 9 + leftArea elif leftArea == 2: leftTube = 4 else: leftTube = 1 if rightArea > 2: rightTube = 226 + rightArea else: rightTube = 235 + rightArea graph.patcher.update({ 5091931: leftTube }) graph.patcher.update({ 5091944: leftTube + 16 }) graph.patcher.update({ 5092202: rightTube }) graph.patcher.update({ 5092219: rightTube + 16 }) elif area == 3: topTile = 21 bottomTile = 37 leftTile = 183 rightTile = 184 tileset = 36 if leftArea > 2: leftTube = 226 + leftArea else: leftTube = 235 + leftArea if rightArea > 2: rightTube = 9 + rightArea elif rightArea == 2: rightTube = 4 else: rightTube = 1 graph.patcher.update({ 5254431: leftTube }) graph.patcher.update({ 5254447: leftTube + 16 }) graph.patcher.update({ 5254714: rightTube }) graph.patcher.update({ 5254731: rightTube + 16 }) elif area == 4: topTile = 51 bottomTile = 67 leftTile = 195 rightTile = 196 tileset = 37 if leftArea > 2: leftTube = 9 + leftArea elif leftArea == 2: leftTube = 4 else: leftTube = 1 if rightArea > 2: rightTube = 226 + rightArea else: rightTube = 235 + rightArea graph.patcher.update({ 5512395: leftTube }) graph.patcher.update({ 5512408: leftTube + 16 }) graph.patcher.update({ 5512134: rightTube }) graph.patcher.update({ 5512151: rightTube + 16 }) elif area == 5: topTile = 52 bottomTile = 68 leftTile = 197 rightTile = 198 tileset = 38 if leftArea > 2: leftTube = 226 + leftArea else: leftTube = 235 + leftArea if rightArea > 2: rightTube = 226 + rightArea else: rightTube = 235 + rightArea graph.patcher.update({ 5358711: leftTube }) graph.patcher.update({ 5358724: leftTube + 16 }) graph.patcher.update({ 5361542: rightTube }) graph.patcher.update({ 5361559: rightTube + 16 }) elif area == 6: topTile = 24 bottomTile = 40 leftTile = 199 rightTile = 200 tileset = 39 if leftArea > 2: leftTube = 226 + leftArea else: leftTube = 235 + leftArea if rightArea > 2: rightTube = 226 + rightArea else: rightTube = 235 + rightArea graph.patcher.update({ 5598427: leftTube }) graph.patcher.update({ 5598440: leftTube + 16 }) graph.patcher.update({ 5598706: rightTube }) graph.patcher.update({ 5598723: rightTube + 16 }) if elevator == 0: graph.patcher.update({ 4669078: leftTile }) graph.patcher.update({ 4669079: rightTile }) graph.patcher.update({ 4669026: leftTile }) graph.patcher.update({ 4669027: rightTile }) graph.patcher.update({ 4670120: leftTile }) graph.patcher.update({ 4670121: rightTile }) graph.patcher.update({ 4670922: leftTile }) graph.patcher.update({ 4670923: rightTile }) graph.patcher.update({ 4671720: leftTile }) graph.patcher.update({ 4671721: rightTile }) graph.patcher.update({ 4672508: leftTile }) graph.patcher.update({ 4672509: rightTile }) graph.patcher.update({ 4673296: leftTile }) graph.patcher.update({ 4673297: rightTile }) graph.patcher.update({ 4674087: topTile }) graph.patcher.update({ 4674099: bottomTile }) graph.patcher.update({ 3945300: tileset }) graph.patcher.update({ 5713644: 171 + area }) source = 'S0-47' elif elevator == 1: graph.patcher.update({ 4669038: leftTile }) graph.patcher.update({ 4669039: rightTile }) graph.patcher.update({ 4669028: leftTile }) graph.patcher.update({ 4669029: rightTile }) graph.patcher.update({ 4670106: leftTile }) graph.patcher.update({ 4670107: rightTile }) graph.patcher.update({ 4670908: leftTile }) graph.patcher.update({ 4670909: rightTile }) graph.patcher.update({ 4671708: leftTile }) graph.patcher.update({ 4671709: rightTile }) graph.patcher.update({ 4672494: leftTile }) graph.patcher.update({ 4672495: rightTile }) graph.patcher.update({ 4674067: leftTile }) graph.patcher.update({ 4674068: rightTile }) graph.patcher.update({ 4673301: topTile }) graph.patcher.update({ 4673315: bottomTile }) graph.patcher.update({ 3945240: tileset }) graph.patcher.update({ 5713617: 171 + area }) source = 'S0-45' elif elevator == 2: graph.patcher.update({ 4669001: leftTile }) graph.patcher.update({ 4669002: rightTile }) graph.patcher.update({ 4669030: leftTile }) graph.patcher.update({ 4669031: rightTile }) graph.patcher.update({ 4670094: leftTile }) graph.patcher.update({ 4670095: rightTile }) graph.patcher.update({ 4670896: leftTile }) graph.patcher.update({ 4670897: rightTile }) graph.patcher.update({ 4671696: leftTile }) graph.patcher.update({ 4671697: rightTile }) graph.patcher.update({ 4673279: leftTile }) graph.patcher.update({ 4673280: rightTile }) graph.patcher.update({ 4674079: leftTile }) graph.patcher.update({ 4674080: rightTile }) graph.patcher.update({ 4672499: topTile }) graph.patcher.update({ 4672513: bottomTile }) graph.patcher.update({ 3945180: tileset }) graph.patcher.update({ 5713597: 171 + area }) source = 'S0-43' elif elevator == 3: graph.patcher.update({ 4669012: leftTile }) graph.patcher.update({ 4669013: rightTile }) graph.patcher.update({ 4669057: leftTile }) graph.patcher.update({ 4669058: rightTile }) graph.patcher.update({ 4670884: leftTile }) graph.patcher.update({ 4670885: rightTile }) graph.patcher.update({ 4671684: leftTile }) graph.patcher.update({ 4671685: rightTile }) graph.patcher.update({ 4672489: leftTile }) graph.patcher.update({ 4672490: rightTile }) graph.patcher.update({ 4673291: leftTile }) graph.patcher.update({ 4673292: rightTile }) graph.patcher.update({ 4674091: leftTile }) graph.patcher.update({ 4674092: rightTile }) graph.patcher.update({ 4670111: topTile }) graph.patcher.update({ 4670125: bottomTile }) graph.patcher.update({ 3945000: tileset }) graph.patcher.update({ 5713600: 171 + area }) source = 'S0-44' elif elevator == 4: graph.patcher.update({ 4669049: leftTile }) graph.patcher.update({ 4669050: rightTile }) graph.patcher.update({ 4669059: leftTile }) graph.patcher.update({ 4669060: rightTile }) graph.patcher.update({ 4670115: leftTile }) graph.patcher.update({ 4670116: rightTile }) graph.patcher.update({ 4671672: leftTile }) graph.patcher.update({ 4671673: rightTile }) graph.patcher.update({ 4672503: leftTile }) graph.patcher.update({ 4672504: rightTile }) graph.patcher.update({ 4673305: leftTile }) graph.patcher.update({ 4673306: rightTile }) graph.patcher.update({ 4674103: leftTile }) graph.patcher.update({ 4674104: rightTile }) graph.patcher.update({ 4670913: topTile }) graph.patcher.update({ 4670927: bottomTile }) graph.patcher.update({ 3945060: tileset }) graph.patcher.update({ 5713621: 171 + area }) source = 'S0-46' elif elevator == 5: graph.patcher.update({ 4669089: leftTile }) graph.patcher.update({ 4669090: rightTile }) graph.patcher.update({ 4669061: leftTile }) graph.patcher.update({ 4669062: rightTile }) graph.patcher.update({ 4670129: leftTile }) graph.patcher.update({ 4670130: rightTile }) graph.patcher.update({ 4670917: leftTile }) graph.patcher.update({ 4670918: rightTile }) graph.patcher.update({ 4672517: leftTile }) graph.patcher.update({ 4672518: rightTile }) graph.patcher.update({ 4673319: leftTile }) graph.patcher.update({ 4673320: rightTile }) graph.patcher.update({ 4674115: leftTile }) graph.patcher.update({ 4674116: rightTile }) graph.patcher.update({ 4671701: topTile }) graph.patcher.update({ 4671713: bottomTile }) graph.patcher.update({ 3945120: tileset }) graph.patcher.update({ 5713647: 171 + area }) source = 'S0-48' destination = 'S{}-00'.format(area) graph.UpdateDoorConnection(source, destination) graph.UpdateDoorConnection(destination, source) source = areaDoors.get(area)[0] destination = areaDoors.get(leftArea)[1] graph.UpdateDoorConnection(source, destination) source = areaDoors.get(area)[1] destination = areaDoors.get(rightArea)[0] graph.UpdateDoorConnection(source, destination) graph.ConnectAllNodes() PlacedETanks = PlacedMissiles = PlacedPowerBombs = 0 if SeedSettings['DamageRuns']: Energy = PlacedETanks * 100 + 99 MissileCount = 10 locationWeights.clear() locationsPerArea.clear() areaWeights.clear() weightValue.clear() MajorLocations.clear() MinorLocations.clear() AllItemLocations.clear() newLocations.clear() AccessibleLocations.clear() UsedLocations.clear() PlacedItems.clear() NettoriOpen = False invalidItems.clear() invalidWeights.clear() oldLocations.clear() oldWeights.clear() MajorLocations.extend(graph.majorItemLocations) if SeedSettings['MajorMinor'] == False: MajorLocations.extend(graph.minorItemLocations) MinorLocations.extend(graph.minorItemLocations) AllItemLocations.extend(graph.majorItemLocations) AllItemLocations.extend(graph.minorItemLocations) random.shuffle(MajorLocations) random.shuffle(MinorLocations) random.shuffle(AllItemLocations) for item in MajorItems: disable_item(graph, item) disable_item(graph, 'BlueDoors') disable_item(graph, 'GreenDoors') disable_item(graph, 'YellowDoors') disable_item(graph, 'RedDoors') disable_item(graph, 'WaterLowered') for area in range(0, 7): AreaOpen[area] = None locationsPerArea.append(list()) areaWeights.append(1) weightValue.append(1) MajorList = list(WeightedMajors.keys()) if SeedSettings['MissilesWithoutMainData']: WeightedMajors.update({ 'MainMissiles': 8 }) WeightedMajors.update({ 'SuperMissileItem': 8 }) WeightedMajors.update({ 'IceMissileItem': 8 }) WeightedMajors.update({ 'DiffusionItem': 8 }) if SeedSettings['PowerBombsWithoutBombs']: WeightedMajors.update({ 'Bombs': 10 }) WeightedMajors.update({ 'MainPowerBombs': 10 }) if SeedSettings['DamageRuns']: WeightedMajors.update({ 'VariaSuit': 4 }) MajorWeights = list(WeightedMajors.values()) MajorWeights.pop(MajorList.index('Bombs')) MajorList.remove('Bombs') MajorWeights.pop(MajorList.index('MainPowerBombs')) MajorList.remove('MainPowerBombs') if SeedSettings['MissilesWithoutMainData'] == False: MajorWeights.pop(MajorList.index('IceMissileItem')) MajorList.remove('IceMissileItem') MajorWeights.pop(MajorList.index('SuperMissileItem')) MajorList.remove('SuperMissileItem') MajorWeights.pop(MajorList.index('DiffusionItem')) MajorList.remove('DiffusionItem') if weightInit == False: availableItems.clear() path = None for location in MajorLocations: path = graph.get_path(StartLocation, location) if path != None: pass if path == None: print('No accessible locations found with this start, try changing your game settings.') sys.exit(1) else: for item in MajorItems: enable_item(graph, item) currentItemWeight = 0 find_available_areas(graph) for location in MajorLocations: path = graph.get_path(StartLocation, location) if path != None: currentItemWeight += 1 if currentItemWeight > 1: availableItems.append(item) for area in range(0, 7): AreaOpen[area] = None disable_item(graph, item) disable_item(graph, 'WaterLowered') disable_item(graph, 'BlueDoors') disable_item(graph, 'GreenDoors') disable_item(graph, 'YellowDoors') disable_item(graph, 'RedDoors') continue weightInit = True if len(availableItems) < 1: print('No accessible locations found with this start, try changing your game settings.') sys.exit(1) find_available_areas(graph) for location in MajorLocations: path = graph.get_path(StartLocation, location) if path != None: AccessibleLocations.append(location) for area in range(0, 7): if location in AreaItemLocations[area] and location not in locationsPerArea[area]: locationsPerArea[area].append(location) continue continue for area in range(0, 7): if len(locationsPerArea[area]) > 0: areaWeights[area] = weightValue[area] / len(locationsPerArea[area]) continue for location in AccessibleLocations: for area in range(0, 7): if location in AreaItemLocations[area]: locationWeights.append(areaWeights[area]) continue continue if FirstItem == None: FirstItem = random.choice(availableItems) MajorWeights.pop(MajorList.index(FirstItem)) MajorList.remove(FirstItem) enable_item(graph, FirstItem) path = None if SeedSettings['DamageRuns']: Energy = Energy / 2 if path == None: location = random.choice(AccessibleLocations) path = graph.get_path(location, StartLocation) if path != None: locationWeights.pop(AccessibleLocations.index(location)) AccessibleLocations.remove(location) UsedLocations.append(location) PlacedItems.append(FirstItem) for area in range(0, 7): if location not in AreaItemLocations[area]: weightValue[area] += 1 continue continue if FirstItem == 'MainMissiles' or SeedSettings['MissilesWithoutMainData'] == False: MajorList.append('IceMissileItem') MajorWeights.append(WeightedMajors.get('IceMissileItem')) MajorList.append('SuperMissileItem') MajorWeights.append(WeightedMajors.get('SuperMissileItem')) MajorList.append('DiffusionItem') MajorWeights.append(WeightedMajors.get('DiffusionItem')) elif FirstItem == 'MorphBall': MajorList.append('Bombs') MajorWeights.append(WeightedMajors.get('Bombs')) if SeedSettings['PowerBombsWithoutBombs'] == True: MajorList.append('MainPowerBombs') MajorWeights.append(WeightedMajors.get('MainPowerBombs')) elif FirstItem == 'Bombs' and SeedSettings['PowerBombsWithoutBombs'] == False: MajorList.append('MainPowerBombs') MajorWeights.append(WeightedMajors.get('MainPowerBombs')) init = True if SeedSettings['DamageRuns']: Energy = PlacedETanks * 100 + 99 find_available_areas(graph) path = graph.get_path(StartLocation, 'End-of-Game') if path != None: path = graph.get_path('End-of-Game', 'S0-00') if path != None: gameBeatable = True if gameBeatable == False: newLocations.clear() locationWeights.clear() for location in MajorLocations: path = None if location not in UsedLocations and location not in AccessibleLocations or location == 'Data S0' or location == 'Item S0-05-16': path = graph.get_path(location, StartLocation, 250, **('depth',)) else: for area in range(0, 7): if location in AreaItemLocations[area] and AreaOpen[area]: path = graph.get_path(AreaOpen[area], location, True) if path != None: AccessibleLocations.append(location) MajorLocations.remove(location) newLocations.append(location) for area in range(0, 7): if location in AreaItemLocations[area] and location not in locationsPerArea[area]: locationsPerArea[area].append(location) continue continue for area in range(0, 7): if len(locationsPerArea[area]) > 0 or SeedSettings['MajorMinor']: areaWeights[area] = weightValue[area] / len(locationsPerArea[area]) else: areaWeights[area] = weightValue[area] / len(locationsPerArea[area]) + area for location in AccessibleLocations: for area in range(0, 7): if location in AreaItemLocations[area] or location in newLocations: locationWeights.append(areaWeights[area] * 1.8) elif location in BossLocations and SeedSettings['MajorMinor'] == False: locationWeights.append(areaWeights[area] * 1.5) else: locationWeights.append(areaWeights[area]) if len(MajorList) > 0: itemLocation = None path = None item = random.choices(MajorList, MajorWeights, 1, **('weights', 'k'))[0] currentItemWeight = MajorWeights.pop(MajorList.index(item)) MajorList.remove(item) enable_item(graph, item) if SeedSettings['DamageRuns']: Energy = Energy / 2 if path == None and len(AccessibleLocations) > 0: itemLocation = random.choices(AccessibleLocations, locationWeights, 1, **('weights', 'k'))[0] oldLocationWeight = locationWeights.pop(AccessibleLocations.index(itemLocation)) AccessibleLocations.remove(itemLocation) if itemLocation == 'Data S0' or itemLocation == 'Item S0-05-16': path = graph.get_path(itemLocation, StartLocation, 250, **('depth',)) else: for area in range(0, 7): if itemLocation in AreaItemLocations[area] and AreaOpen[area]: path = graph.get_path(itemLocation, AreaOpen[area], True) if itemLocation in BossLocations and path != None: disable_item(graph, item) if ChargeBeam == False and SeedSettings['Difficulty'] > 0: healthCheck = BossHealths.get(itemLocation) if SeedSettings['Difficulty'] > 4: healthCheck = healthCheck * 1.02 elif SeedSettings['Difficulty'] > 2: healthCheck = healthCheck * 1.05 else: healthCheck = healthCheck * 1.1 healthCheck = healthCheck - MissileDamage * MissileCount if healthCheck > 0: if MissileDamage > 0: tankCheck = math.ceil(healthCheck / MissileDamage / 5) PossibleMissileTanks.clear() if SeedSettings['MajorMinor']: for missileLocation in MinorLocations: if missileLocation not in UsedLocations: missilePath = None if missileLocation == 'Item S0-05-16': missilePath = graph.get_path(StartLocation, missileLocation, 250, **('depth',)) if missilePath != None: missilePath = graph.get_path(missileLocation, StartLocation, 250, **('depth',)) else: for area in range(0, 7): if missileLocation in AreaItemLocations[area] and AreaOpen[area]: missilePath = graph.get_path(AreaOpen[area], missileLocation, True) if missilePath != None: missilePath = graph.get_path(missileLocation, AreaOpen[area], True) if missilePath != None: PossibleMissileTanks.append(missileLocation) continue else: for missileLocation in AccessibleLocations: missilePath = None if missileLocation == 'Data S0' or missileLocation == 'Item S0-05-16': missilePath = graph.get_path(missileLocation, StartLocation, 250, **('depth',)) else: for area in range(0, 7): if missileLocation in AreaItemLocations[area] and AreaOpen[area]: missilePath = graph.get_path(missileLocation, AreaOpen[area], True) if missilePath != None and missileLocation not in BossLocations: PossibleMissileTanks.append(missileLocation) continue if len(PossibleMissileTanks) > int(tankCheck): for x in range(0, int(tankCheck)): missileLocation = random.choice(PossibleMissileTanks) PossibleMissileTanks.remove(missileLocation) if SeedSettings['MajorMinor'] == False: locationWeights.pop(AccessibleLocations.index(missileLocation)) AccessibleLocations.remove(missileLocation) UsedLocations.append(missileLocation) PlacedItems.append('Missile Tank') PlacedMissiles += 1 MissileCount = 10 + PlacedMissiles * 5 update_items(graph) else: path = None else: path = None enable_item(graph, item) if path == None: oldLocations.append(itemLocation) oldWeights.append(oldLocationWeight) continue if path == None: if len(MajorList) > 0 and len(PlacedItems) > 4: invalidItems.append(item) invalidWeights.append(currentItemWeight) AccessibleLocations.extend(oldLocations) oldLocations.clear() locationWeights.extend(oldWeights) oldWeights.clear() disable_item(graph, item) else: for item in MajorItems: disable_item(graph, item) print("Couldn't find a path forward, trying again") init = False else: UsedLocations.append(itemLocation) PlacedItems.append(item) MajorList.extend(invalidItems) invalidItems.clear() MajorWeights.extend(invalidWeights) invalidWeights.clear() AccessibleLocations.extend(oldLocations) oldLocations.clear() locationWeights.extend(oldWeights) oldWeights.clear() for area in range(0, 7): if itemLocation in locationsPerArea[area]: locationsPerArea[area].remove(itemLocation) if itemLocation not in AreaItemLocations[area]: weightValue[area] += 1 continue if item == 'MainMissiles' or SeedSettings['MissilesWithoutMainData'] == False: MajorList.append('IceMissileItem') MajorWeights.append(WeightedMajors.get('IceMissileItem')) MajorList.append('SuperMissileItem') MajorWeights.append(WeightedMajors.get('SuperMissileItem')) MajorList.append('DiffusionItem') MajorWeights.append(WeightedMajors.get('DiffusionItem')) elif item == 'MorphBall': MajorList.append('Bombs') MajorWeights.append(WeightedMajors.get('Bombs')) if SeedSettings['PowerBombsWithoutBombs'] == True: MajorList.append('MainPowerBombs') MajorWeights.append(WeightedMajors.get('MainPowerBombs')) elif item == 'Bombs' and SeedSettings['PowerBombsWithoutBombs'] == False: MajorList.append('MainPowerBombs') MajorWeights.append(WeightedMajors.get('MainPowerBombs')) if SeedSettings['MajorMinor'] == False and len(AccessibleLocations) > 3 and PlacedETanks < MaxETanks: itemLocation = random.choice(AccessibleLocations) locationWeights.pop(AccessibleLocations.index(itemLocation)) AccessibleLocations.remove(itemLocation) UsedLocations.append(itemLocation) PlacedItems.append('Energy Tank') PlacedETanks += 1 else: for item in MajorItems: disable_item(graph, item) print("Couldn't find a path forward, trying again") init = False # continue print('Game is beatable, placing remaining items (no logic)') for item in MajorItems: if item not in PlacedItems and item not in MajorList: MajorList.append(item) MajorWeights.append(WeightedMajors.get(item)) continue MajorLocations.extend(AccessibleLocations) for item in MajorList: if item not in PlacedItems: location = random.choice(MajorLocations) if location in UsedLocations: MajorLocations.remove(location) location = random.choice(MajorLocations) continue UsedLocations.append(location) PlacedItems.append(item) if SeedSettings['MajorMinor']: for location in MajorLocations: if PlacedETanks < MaxETanks and location not in UsedLocations: UsedLocations.append(location) PlacedItems.append(MinorItems[0]) PlacedETanks += 1 continue MaxETanks = PlacedETanks if PlacedETanks >= MaxETanks: MinorItems.remove('Energy Tank') if PlacedMissiles >= MaxMissiles: MinorItems.remove('Missile Tank') if PlacedPowerBombs >= MaxPowerBombs: MinorItems.remove('Power Bomb Tank') for location in AllItemLocations: if len(MinorItems) > 0 and location not in UsedLocations: item = random.choice(MinorItems) UsedLocations.append(location) PlacedItems.append(item) if item == 'Energy Tank': PlacedETanks += 1 if PlacedETanks >= MaxETanks: MinorItems.remove('Energy Tank') elif item == 'Missile Tank': PlacedMissiles += 1 if PlacedMissiles >= MaxMissiles: MinorItems.remove('Missile Tank') elif item == 'Power Bomb Tank': PlacedPowerBombs += 1 if PlacedPowerBombs >= MaxPowerBombs: MinorItems.remove('Power Bomb Tank') continue patch_game() continue return None def patch_game(): global FileName, FileName, FileName CreditsOffsets = { 'ChargeBeam': 7655617, 'WideBeam': 7655725, 'PlasmaBeam': 7655833, 'WaveBeam': 7655941, 'IceBeam': 7656049, 'MainMissiles': 7656157, 'SuperMissileItem': 7656265, 'IceMissileItem': 7656373, 'DiffusionItem': 7656481, 'Bombs': 7656589, 'MainPowerBombs': 7656697, 'MorphBall': 7656805, 'HiJumpBoots': 7656913, 'SpeedBooster': 7657021, 'SpaceJump': 7657129, 'ScrewAttack': 7657237, 'VariaSuit': 7657345, 'GravitySuit': 7657453, 'GreenDoors': 7657561, 'BlueDoors': 7657669, 'YellowDoors': 7657777, 'RedDoors': 7657885 } print('Patching game, please wait') HashValue = random.sample(HashList, 4) FileName = 'MFOR -' if Debug: FileName = 'Debug -' for x in HashValue: FileName = FileName + ' {}'.format(x) if Debug: # FIXME: whenever Kazuto decides to drop the original ASM reintroduce debug mode # armips is FOSS and further documentation should be provided on how to build it os.system('.\\armips\\armips.exe "Metroid Fusion Open Randomizer.asm" -root ".\\data\\asm" -sym ".\\temp.sym"') os.replace('.\\data\\MFOR.gba', '.\\seeds\\{}.gba'.format(FileName)) else: source = open(BaseName, 'rb') target = open(os.path.join('.', 'seeds', '{}.gba'.format(FileName)), 'wb') patch = open(os.path.join('.', 'data', 'MFOR.bps'), 'rb') try: apply_to_files(patch, source, target) except: target.close() os.unlink(os.path.join('.', 'seeds', '{}.gba'.format(FileName))) print('Error: failed to patch game with base patch!') sys.exit(1) checksum = fileHash(os.path.join('.', 'seeds', '{}.gba'.format(FileName))) if checksum != 2455114263: os.unlink(os.path.join('.', 'seeds', '{}.gba'.format(FileName))) print('Error: Base patch file has been modified. Please go to https://metroidconstruction.com/ and re-download MFOR.') sys.exit(1) # WARNING: Decompyle incomplete def initialize(): global HashList, HashList HashList = list() # WARNING: Decompyle incomplete def start_randomizer(rom, settings): global BaseGame, Debug, SeedValue, SeedValue, Patch, Patch, SeedSettings, SeedValue, Difficulty, DamageRuns, World, AreaItemLocations, RoomNodes print('DEBUG: entered start_randomizer') BaseGame = rom print(BaseGame) if BaseGame == None or BaseGame == '': print('Error: no base game provided.') sys.exit(1) checksum = fileHash(BaseGame) if checksum != 1819625372: print('Only Metroid Fusion (U) is supported. Check the CRC32 value: it should be 6C75479C') sys.exit(1) Debug = settings['Debug'] settings.pop('Debug') if Debug == False: checksum = fileHash(os.path.join('.', 'data', 'MFOR.bps')) if checksum != 558161692: print('Error: Base patch file has been modified. Please go to https://metroidconstruction.com/ and re-download MFOR.') sys.exit(1) totalRandoTime = time.time() if settings['Seed']: SeedValue = str(settings['Seed']).strip(' \n') else: SeedValue = str(random.randrange(sys.maxsize)) print(SeedValue) settings.pop('Seed') repeat = 1 if settings['Num'] and settings['Num'] > repeat: repeat = settings['Num'] settings.pop('Num') if settings['Patch']: Patch = True else: Patch = False settings.pop('Patch') patch_game() # WARNING: Decompyle incomplete