# OpenMFOR # credits manually reinstated due to the comments being lost from the object code decompilation # Original release is Copyright (C) 2022 Kazuto88 # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # 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 from bps.diff import diff_bytearrays from bps.io import write_bps from bps.util import bps_progress version = '0.11.6' # FIXME: Debug should not be set here # Debug = False def ceiling(num, denom): return -(num // -denom) def fileHash(file): checksum = 0 try: with open(file, 'rb') as source: while True: s = source.read(65536) if not s: break checksum = zlib.crc32(s, checksum) except FileNotFoundError: sys.exit('Error:', file, 'could not be opened.') return checksum & 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 BombJump global Diffusion global HiJump global IBJ global Ice global IceMissiles global MissileDamage global Missiles global PowerBombs global SpringBall global SuperMissiles global UseBombs global WallJump if SeedSettings['MissilesWithoutMainData'] == True: Missiles = MainMissiles or SuperMissileItem or IceMissileItem or DiffusionItem else: Missiles = MainMissiles SuperMissiles = Missiles and SuperMissileItem IceMissiles = Missiles and IceMissileItem Diffusion = Missiles and DiffusionItem Ice = IceMissiles or IceBeam HiJump = HiJumpBoots or SpaceJump SpringBall = HiJumpBoots WallJump = SpaceJump or WallJumpSetting if SeedSettings['PowerBombsWithoutBombs'] == True: PowerBombs = MorphBall and MainPowerBombs else: PowerBombs = MorphBall and Bombs and MainPowerBombs UseBombs = MorphBall and (Bombs or PowerBombs) BombJump = MorphBall and (Bombs or SpringBall) IBJ = MorphBall and Bombs and 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): graph.requirements = { ('S0-06', 'S0-0B'): GreenDoors, ('S0-08', 'S0-0A'): Impossible, ('S0-08', 'S0-0C'): Impossible, ('S0-08', 'S0-0D'): MorphBall and 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'): MorphBall and PowerBombs, ('S0-0D', 'S0-0A'): Impossible, ('S0-0D', 'S0-0C'): Impossible, ('S0-0D', 'S0-0F'): MorphBall and PowerBombs and RedDoors, ('S0-0D', 'S0-11'): MorphBall and PowerBombs, ('S0-0F', 'S0-0A'): Impossible, ('S0-0F', 'S0-0C'): Impossible, ('S0-0F', 'S0-0D'): MorphBall and PowerBombs, ('S0-11', 'S0-0A'): Impossible, ('S0-11', 'S0-0C'): Impossible, ('S0-11', 'S0-0D'): MorphBall and PowerBombs, ('S0-11', 'S0-0F'): RedDoors, ('S0-0E', 'S0-6C'): MorphBall and PowerBombs, ('S0-6C', 'S0-0E'): MorphBall and PowerBombs or SpeedBooster, ('S0-6C', 'S0-13'): MorphBall and PowerBombs or SpeedBooster, ('S0-13', 'S0-6C'): MorphBall and PowerBombs, ('S0-53', 'S0-56'): Missiles or ChargeBeam, ('S0-54', 'S0-56'): Missiles or ChargeBeam, ('S0-55', 'S0-56'): Missiles or ChargeBeam, ('S0-16', 'S0-1B'): Missiles, ('S0-16', 'S0-41'): Missiles, ('S0-16', 'S0-8D'): Missiles, ('S0-16', 'S0-C1'): Missiles and RedDoors and (HiJump or WallJump or IBJ), ('S0-1B', 'S0-16'): Missiles, ('S0-1B', 'S0-C1'): RedDoors and (HiJump or WallJump or IBJ), ('S0-41', 'S0-16'): Missiles, ('S0-41', 'S0-C1'): RedDoors and (HiJump or WallJump or IBJ), ('S0-8D', 'S0-16'): Missiles, ('S0-8D', 'S0-C1'): RedDoors and (HiJump or WallJump or 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'): GreenDoors and (HiJump and Ice or Missiles or ChargeBeam) and (SpaceJump or WallJump or IBJ), ('S0-1E', 'S0-9E'): GreenDoors and (HiJump and Ice or Missiles or ChargeBeam) and (SpaceJump or WallJump or IBJ), ('S0-1F', 'S0-1E'): GreenDoors, ('S0-1F', 'S0-9D'): GreenDoors and (HiJump and Ice or Missiles or ChargeBeam) and (SpaceJump or WallJump or IBJ), ('S0-1F', 'S0-9E'): GreenDoors and (HiJump and Ice or Missiles or ChargeBeam) and (SpaceJump or WallJump or IBJ), ('S0-9D', 'S0-1E'): GreenDoors, ('S0-9D', 'S0-1F'): GreenDoors, ('S0-9D', 'S0-9E'): GreenDoors and (HiJump and Ice or Missiles or ChargeBeam) and (SpaceJump or WallJump or IBJ), ('S0-9E', 'S0-1E'): GreenDoors, ('S0-9E', 'S0-1F'): GreenDoors, ('S0-9E', 'S0-9D'): GreenDoors and (HiJump and Ice or Missiles or ChargeBeam) and (SpaceJump or WallJump or IBJ), ('S0-15', 'S0-84'): PowerBombs and GreenDoors, ('S0-15', 'S0-CB'): MorphBall and (UseBombs or ScrewAttack), ('S0-24', 'S0-15'): GreenDoors, ('S0-24', 'S0-84'): PowerBombs and GreenDoors, ('S0-24', 'S0-CB'): MorphBall and (UseBombs or ScrewAttack), ('S0-26', 'S0-15'): GreenDoors, ('S0-26', 'S0-84'): PowerBombs and GreenDoors, ('S0-26', 'S0-CB'): MorphBall and (UseBombs or ScrewAttack), ('S0-27', 'S0-15'): GreenDoors, ('S0-27', 'S0-84'): PowerBombs and GreenDoors, ('S0-27', 'S0-CB'): MorphBall and (UseBombs or ScrewAttack), ('S0-84', 'S0-15'): GreenDoors, ('S0-84', 'S0-CB'): MorphBall and (UseBombs or ScrewAttack), ('S0-CB', 'S0-15'): MorphBall and UseBombs and GreenDoors, ('S0-CB', 'S0-24'): MorphBall and UseBombs, ('S0-CB', 'S0-26'): MorphBall and UseBombs, ('S0-CB', 'S0-27'): MorphBall and UseBombs, ('S0-CB', 'S0-84'): MorphBall and PowerBombs and GreenDoors, ('S0-2A', 'S0-A8'): MorphBall, ('S0-2A', 'S0-CA'): MorphBall and ScrewAttack and BombJump and (HiJump or WallJump or IBJ), ('S0-A8', 'S0-2A'): MorphBall, ('S0-A8', 'S0-CA'): MorphBall and ScrewAttack and BombJump and (HiJump or WallJump or IBJ), ('S0-A8', 'S0-2B'): MorphBall, ('S0-A8', 'S0-68'): MorphBall, ('S0-CA', 'S0-2A'): MorphBall and ScrewAttack and BombJump, ('S0-CA', 'S0-A8'): MorphBall and ScrewAttack and BombJump, ('S0-CA', 'S0-2B'): MorphBall and ScrewAttack and BombJump, ('S0-CA', 'S0-68'): MorphBall and ScrewAttack and BombJump, ('S0-2B', 'S0-A8'): MorphBall, ('S0-2B', 'S0-CA'): MorphBall and ScrewAttack and BombJump and (HiJump or WallJump or IBJ), ('S0-68', 'S0-A8'): MorphBall, ('S0-68', 'S0-CA'): MorphBall and ScrewAttack and BombJump and (HiJump or WallJump or IBJ), ('S0-1D', 'S0-2C'): Missiles or PowerBombs or ScrewAttack, ('S0-1D', 'S0-2D'): Missiles or PowerBombs or ScrewAttack, ('S0-1D', 'S0-5B'): Missiles or PowerBombs or ScrewAttack, ('S0-2C', 'S0-1D'): Missiles or PowerBombs or ScrewAttack, ('S0-2D', 'S0-1D'): Missiles or PowerBombs or ScrewAttack, ('S0-5B', 'S0-1D'): Missiles or PowerBombs or ScrewAttack, ('S0-2F', 'S0-2E'): Ice or ((Missiles or ChargeBeam or ScrewAttack) and (SpaceJump or WallJump or IBJ)), ('S0-30', 'S0-4A'): MorphBall or (SpeedBooster and Difficulty >= 2), ('S0-4A', 'S0-30'): MorphBall or SpeedBooster, ('S0-4A', 'S0-A6'): MorphBall or SpeedBooster, ('S0-A6', 'S0-4A'): MorphBall or (SpeedBooster and 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'): (Missiles or ChargeBeam) and MorphBall and BombJump, ('S0-69', 'S0-40'): Impossible, ('S0-4E', 'S0-4F'): Impossible, ('S0-4F', 'S0-4E'): Missiles or PowerBombs or ScrewAttack, ('S0-4F', 'S0-65'): Missiles or PowerBombs or 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'): Missiles or ChargeBeam, ('S0-6D', 'S0-6F'): MorphBall and RedDoors, ('S0-6E', 'S0-6D'): RedDoors, ('S0-6E', 'S0-6F'): MorphBall and PowerBombs, ('S0-6F', 'S0-6D'): MorphBall and RedDoors, ('S0-6F', 'S0-6E'): MorphBall and PowerBombs, ('S0-70', 'S0-7D'): MorphBall and UseBombs and (SpaceJump or WallJump or IBJ), ('S0-7D', 'S0-70'): MorphBall and UseBombs, ('S0-7D', 'S0-71'): MorphBall and UseBombs, ('S0-7D', 'S0-7C'): MorphBall and UseBombs, ('S0-7D', 'S0-82'): MorphBall and UseBombs, ('S0-71', 'S0-7D'): MorphBall and UseBombs and (SpaceJump or WallJump or IBJ), ('S0-7C', 'S0-7D'): MorphBall and UseBombs and (SpaceJump or WallJump or IBJ), ('S0-82', 'S0-7D'): MorphBall and UseBombs and (SpaceJump or WallJump or IBJ), ('S0-77', 'S0-76'): WaveBeam, ('S0-7E', 'S0-7F'): MorphBall and UseBombs, ('S0-7F', 'S0-7E'): MorphBall and UseBombs, ('S0-86', 'S0-87'): MorphBall and (SpaceJump or IBJ), ('S0-87', 'S0-86'): MorphBall and (SpaceJump or IBJ), ('S0-87', 'S0-88'): MorphBall and UseBombs, ('S0-87', 'S0-89'): MorphBall and UseBombs, ('S0-87', 'S0-8A'): MorphBall and UseBombs, ('S0-88', 'S0-86'): SpaceJump or IBJ, ('S0-88', 'S0-87'): MorphBall and (SpaceJump or IBJ), ('S0-89', 'S0-86'): SpaceJump or IBJ, ('S0-89', 'S0-87'): MorphBall and (SpaceJump or IBJ), ('S0-8A', 'S0-86'): SpaceJump or IBJ, ('S0-8A', 'S0-87'): MorphBall and (SpaceJump or IBJ), ('S0-8F', 'S0-90'): MorphBall and RedDoors, ('S0-90', 'S0-8F'): MorphBall and ScrewAttack and (SpaceJump or 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'): SpeedBooster or 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'): SpeedBooster or 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'): Missiles and ChargeBeam and PlasmaBeam, ('S0-CC', 'S0-92'): Missiles and ChargeBeam and PlasmaBeam and RedDoors and (HiJump or WallJump or 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'): Missiles or SpeedBooster or PowerBombs or ScrewAttack, ('S1-0A', 'S1-09'): Missiles or SpeedBooster or PowerBombs or ScrewAttack, ('S1-0B', 'S1-0C'): Missiles or ChargeBeam or PowerBombs or ScrewAttack or (SpeedBooster and Difficulty >= 3), ('S1-0C', 'S1-0B'): Missiles or ChargeBeam or PowerBombs or ScrewAttack or (SpeedBooster and Difficulty >= 3), ('S1-17', 'S1-58'): Missiles and MorphBall or ChargeBeam or PowerBombs or ScrewAttack, ('S1-58', 'S1-17'): Missiles and MorphBall or ChargeBeam or PowerBombs or ScrewAttack or (SpeedBooster and Difficulty >= 3), ('S1-18', 'S1-5C'): Missiles and MorphBall, ('S1-5C', 'S1-18'): Missiles and MorphBall, ('S1-5C', 'S1-54'): Missiles and MorphBall, ('S1-54', 'S1-5C'): Missiles and MorphBall, ('S1-1D', 'S1-1E'): Missiles or ChargeBeam or PowerBombs or ScrewAttack, ('S1-1E', 'S1-1D'): Missiles or ChargeBeam or PowerBombs or ScrewAttack, ('S1-16', 'S1-59'): WaveBeam, ('S1-20', 'S1-21'): Missiles or ChargeBeam or PowerBombs or ScrewAttack, ('S1-20', 'S1-4B'): Missiles or ChargeBeam or PowerBombs or ScrewAttack, ('S1-21', 'S1-20'): Missiles or ChargeBeam or PowerBombs or ScrewAttack or (SpeedBooster and Difficulty >= 4), ('S1-21', 'S1-4B'): Missiles or ChargeBeam or PowerBombs or ScrewAttack or (SpeedBooster and Difficulty >= 4), ('S1-4B', 'S1-20'): Missiles or ChargeBeam or PowerBombs or ScrewAttack or (SpeedBooster and Difficulty >= 4), ('S1-4B', 'S1-21'): Missiles or ChargeBeam or PowerBombs or ScrewAttack or (SpeedBooster and Difficulty >= 4), ('S1-22', 'S1-23'): ScrewAttack, ('S1-23', 'S1-22'): SpaceJump and ScrewAttack, ('S1-23', 'S1-5E'): SpaceJump and ScrewAttack, ('S1-5E', 'S1-23'): ScrewAttack, ('S1-24', 'S1-25'): DamageRuns and Energy >= 199 or GravitySuit, ('S1-25', 'S1-24'): (DamageRuns and Energy >= 99 or GravitySuit) and GreenDoors, ('S1-26', 'S1-27'): MorphBall and ScrewAttack, ('S1-27', 'S1-26'): MorphBall and ScrewAttack, ('S1-2A', 'S1-2B'): (DamageRuns and Energy >= 99 or GravitySuit) and GreenDoors, ('S1-2A', 'S1-6A'): MorphBall and ScrewAttack, ('S1-2B', 'S1-2A'): (DamageRuns and Energy >= 99 or GravitySuit) and BlueDoors, ('S1-2B', 'S1-6A'): (DamageRuns and Energy >= 99 or GravitySuit) and MorphBall and ScrewAttack, ('S1-6A', 'S1-2A'): MorphBall and ScrewAttack and BlueDoors, ('S1-6A', 'S1-2B'): (DamageRuns and Energy >= 99 or GravitySuit) and MorphBall and ScrewAttack and GreenDoors, ('S1-2D', 'S1-2E'): Missiles and MorphBall and UseBombs, ('S1-2D', 'S1-2F'): MorphBall and UseBombs, ('S1-2D', 'S1-5F'): MorphBall and UseBombs, ('S1-2D', 'S1-6E'): MorphBall and UseBombs, ('S1-2E', 'S1-2D'): Missiles and MorphBall and UseBombs, ('S1-2E', 'S1-2F'): Missiles and MorphBall, ('S1-2E', 'S1-5F'): Missiles and MorphBall, ('S1-2E', 'S1-6E'): Missiles and MorphBall, ('S1-2F', 'S1-2D'): MorphBall and UseBombs and (HiJump or WallJump or IBJ), ('S1-2F', 'S1-2E'): Missiles and MorphBall and UseBombs and (HiJump or WallJump or IBJ), ('S1-5F', 'S1-2D'): MorphBall and UseBombs and (HiJump or WallJump or IBJ), ('S1-5F', 'S1-2E'): Missiles and MorphBall and UseBombs and (HiJump or WallJump or IBJ), ('S1-6E', 'S1-2D'): MorphBall and UseBombs and (HiJump or WallJump or IBJ), ('S1-6E', 'S1-2E'): Missiles and MorphBall and UseBombs and (HiJump or WallJump or IBJ), ('S1-30', 'S1-31'): MorphBall and UseBombs and (PowerBombs or WaveBeam) and (Missiles or ChargeBeam or ScrewAttack), ('S1-31', 'S1-30'): MorphBall and UseBombs, ('S1-38', 'S1-39'): Missiles or ChargeBeam, ('S1-3B', 'S1-29'): WaveBeam, ('S1-3E', 'S1-3F'): MorphBall and ScrewAttack and (SpaceJump or WallJump), ('S1-3F', 'S1-3E'): MorphBall and ScrewAttack and (SpaceJump or 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'): MorphBall and UseBombs, ('S1-49', 'S1-48'): Missiles or ChargeBeam, ('S1-07', 'S1-08'): MorphBall and SpaceJump and ScrewAttack, ('S1-08', 'S1-07'): MorphBall and WaveBeam and SpaceJump and ScrewAttack, ('S1-19', 'S1-4D'): MorphBall, ('S1-19', 'S1-53'): (Missiles or ChargeBeam) and MorphBall, ('S1-19', 'S1-64'): MorphBall and UseBombs, ('S1-4D', 'S1-19'): Impossible, ('S1-4D', 'S1-53'): Missiles or ChargeBeam, ('S1-4D', 'S1-64'): MorphBall and UseBombs, ('S1-53', 'S1-19'): Impossible, ('S1-53', 'S1-64'): MorphBall and UseBombs, ('S1-64', 'S1-19'): Impossible, ('S1-64', 'S1-4D'): MorphBall and UseBombs, ('S1-64', 'S1-53'): (Missiles or ChargeBeam) and MorphBall and UseBombs, ('S1-4F', 'S1-50'): MorphBall, ('S1-50', 'S1-4F'): MorphBall, ('S1-6F', 'S1-70'): (ChargeBeam and WaveBeam or PowerBombs) and (Missiles or ScrewAttack), ('S1-70', 'S1-6F'): HiJump, ('S2-01', 'S2-03'): MorphBall and PowerBombs, ('S2-01', 'S2-04'): BlueDoors, ('S2-01', 'S2-20'): MorphBall and UseBombs, ('S2-03', 'S2-01'): MorphBall and PowerBombs, ('S2-03', 'S2-04'): MorphBall and PowerBombs and BlueDoors, ('S2-03', 'S2-20'): MorphBall and PowerBombs, ('S2-03', 'S2-02'): MorphBall and PowerBombs, ('S2-03', 'S2-05'): MorphBall and PowerBombs, ('S2-03', 'S2-0F'): MorphBall and PowerBombs, ('S2-04', 'S2-03'): MorphBall and PowerBombs, ('S2-04', 'S2-20'): MorphBall and UseBombs, ('S2-20', 'S2-01'): MorphBall and UseBombs, ('S2-20', 'S2-03'): MorphBall and PowerBombs, ('S2-20', 'S2-04'): MorphBall and UseBombs and BlueDoors, ('S2-20', 'S2-02'): MorphBall and UseBombs, ('S2-20', 'S2-05'): MorphBall and UseBombs, ('S2-20', 'S2-0F'): MorphBall and UseBombs, ('S2-02', 'S2-03'): MorphBall and PowerBombs, ('S2-02', 'S2-04'): BlueDoors, ('S2-02', 'S2-20'): MorphBall and UseBombs, ('S2-05', 'S2-03'): MorphBall and PowerBombs, ('S2-05', 'S2-04'): BlueDoors, ('S2-05', 'S2-20'): MorphBall and UseBombs, ('S2-0F', 'S2-03'): MorphBall and PowerBombs, ('S2-0F', 'S2-04'): BlueDoors, ('S2-0F', 'S2-20'): MorphBall and 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'): ScrewAttack and BlueDoors, ('S2-80', 'S2-3C'): ScrewAttack, ('S2-3C', 'S2-3A'): BlueDoors, ('S2-3C', 'S2-80'): ScrewAttack, ('S2-14', 'S2-15'): MorphBall and UseBombs, ('S2-15', 'S2-14'): MorphBall and UseBombs and SpringBall and ScrewAttack, ('S2-16', 'S2-17'): MorphBall and UseBombs or ScrewAttack, ('S2-17', 'S2-16'): MorphBall and UseBombs and SpringBall or ScrewAttack, ('S2-18', 'S2-1B'): MorphBall and (UseBombs or WaveBeam or HiJump or WallJump or IBJ), ('S2-1B', 'S2-18'): MorphBall and (HiJump or WallJump or 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'): Missiles or ChargeBeam, ('S2-29', 'S2-46'): MorphBall and PowerBombs, ('S2-29', 'S2-6C'): MorphBall and PowerBombs, ('S2-46', 'S2-29'): MorphBall and PowerBombs, ('S2-46', 'S2-2A'): MorphBall and PowerBombs, ('S2-46', 'S2-58'): MorphBall and PowerBombs, ('S2-6C', 'S2-29'): MorphBall and PowerBombs, ('S2-6C', 'S2-2A'): MorphBall and PowerBombs, ('S2-6C', 'S2-58'): MorphBall and PowerBombs, ('S2-2A', 'S2-46'): MorphBall and PowerBombs, ('S2-2A', 'S2-6C'): MorphBall and PowerBombs, ('S2-58', 'S2-46'): MorphBall and PowerBombs, ('S2-58', 'S2-6C'): MorphBall and PowerBombs, ('S2-2E', 'S2-30'): Missiles or ChargeBeam, ('S2-2F', 'S2-30'): Missiles or 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'): SpaceJump or IBJ, ('S2-3B', 'S2-83'): ScrewAttack and (SpaceJump or WallJump or IBJ), ('S2-3D', 'S2-3B'): BlueDoors, ('S2-3D', 'S2-83'): ScrewAttack and (SpaceJump or WallJump or IBJ), ('S2-83', 'S2-3B'): ScrewAttack and BlueDoors, ('S2-83', 'S2-3D'): ScrewAttack and (SpaceJump or IBJ), ('S2-3E', 'S2-3F'): MorphBall, ('S2-3F', 'S2-3E'): MorphBall, ('S2-10', 'S2-12'): MorphBall and (UseBombs or ScrewAttack), ('S2-10', 'S2-45'): BlueDoors, ('S2-10', 'S2-54'): MorphBall and (UseBombs or ScrewAttack), ('S2-12', 'S2-10'): MorphBall and (UseBombs and SpringBall or (UseBombs and ScrewAttack) or (SpringBall and ScrewAttack)), ('S2-12', 'S2-45'): MorphBall and (UseBombs and SpringBall or (UseBombs and ScrewAttack) or (SpringBall and ScrewAttack)) and BlueDoors, ('S2-45', 'S2-12'): MorphBall and (UseBombs or ScrewAttack), ('S2-45', 'S2-54'): MorphBall and (UseBombs or ScrewAttack), ('S2-54', 'S2-10'): MorphBall and (UseBombs and SpringBall or (UseBombs and ScrewAttack) or (SpringBall and ScrewAttack)), ('S2-54', 'S2-45'): MorphBall and (UseBombs and SpringBall or (UseBombs and ScrewAttack) or (SpringBall and ScrewAttack)) and 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'): SpeedBooster or SpaceJump or IBJ, ('S2-50', 'S2-7A'): MorphBall and (SpeedBooster or SpaceJump or IBJ), ('S2-50', 'S2-4E'): SpeedBooster or SpaceJump or IBJ, ('S2-50', 'S2-4F'): SpeedBooster or SpaceJump or IBJ, ('S2-50', 'S2-79'): SpeedBooster or SpaceJump or IBJ, ('S2-51', 'S2-4D'): SpeedBooster or SpaceJump or IBJ, ('S2-51', 'S2-7A'): MorphBall and (SpeedBooster or SpaceJump or IBJ), ('S2-51', 'S2-4E'): SpeedBooster or SpaceJump or IBJ, ('S2-51', 'S2-4F'): SpeedBooster or SpaceJump or IBJ, ('S2-51', 'S2-79'): SpeedBooster or SpaceJump or 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'): MorphBall and (SpeedBooster or SpaceJump or WallJump or IBJ), ('S2-4E', 'S2-7A'): MorphBall, ('S2-4F', 'S2-7A'): MorphBall, ('S2-79', 'S2-7A'): MorphBall and (SpeedBooster or SpaceJump or WallJump or IBJ), ('S2-53', 'S2-91'): MorphBall, ('S2-91', 'S2-53'): MorphBall and (Ice or SpaceJump or IBJ), ('S2-38', 'S2-5F'): MorphBall and (UseBombs or WaveBeam or GravitySuit), ('S2-5F', 'S2-38'): MorphBall and (Ice or UseBombs or WaveBeam or (GravitySuit and (HiJump or WallJump or IBJ))), ('S2-64', 'S2-65'): MorphBall and UseBombs or ScrewAttack, ('S2-65', 'S2-64'): Impossible, ('S2-67', 'S2-66'): Impossible, ('S2-1E', 'S2-1F'): MorphBall and UseBombs and (HiJump or WallJump or IBJ), ('S2-1E', 'S2-71'): MorphBall and (HiJump or WallJump or IBJ), ('S2-1F', 'S2-1E'): MorphBall and UseBombs, ('S2-1F', 'S2-68'): MorphBall and UseBombs, ('S2-1F', 'S2-69'): MorphBall and UseBombs, ('S2-1F', 'S2-6A'): MorphBall and UseBombs, ('S2-1F', 'S2-6B'): MorphBall and UseBombs, ('S2-1F', 'S2-70'): MorphBall and UseBombs, ('S2-1F', 'S2-71'): MorphBall and UseBombs and (HiJump or WallJump or IBJ), ('S2-68', 'S2-1F'): MorphBall and UseBombs and (HiJump or WallJump or IBJ), ('S2-68', 'S2-71'): MorphBall and (HiJump or WallJump or IBJ), ('S2-69', 'S2-1F'): MorphBall and UseBombs and (HiJump or WallJump or IBJ), ('S2-69', 'S2-71'): MorphBall and (HiJump or WallJump or IBJ), ('S2-6A', 'S2-1F'): MorphBall and UseBombs and (HiJump or WallJump or IBJ), ('S2-6A', 'S2-71'): MorphBall and (HiJump or WallJump or IBJ), ('S2-6B', 'S2-1F'): MorphBall and UseBombs and (HiJump or WallJump or IBJ), ('S2-6B', 'S2-71'): MorphBall and (HiJump or WallJump or IBJ), ('S2-70', 'S2-1F'): MorphBall and UseBombs and (HiJump or WallJump or IBJ), ('S2-70', 'S2-71'): MorphBall and (HiJump or WallJump or IBJ), ('S2-71', 'S2-1E'): MorphBall, ('S2-71', 'S2-1F'): MorphBall and 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'): SpaceJump or WallJump or IBJ, ('S2-6E', 'S2-6D'): SpaceJump or WallJump or IBJ, ('S2-6E', 'S2-73'): SpaceJump or WallJump or IBJ, ('S2-73', 'S2-6D'): SpaceJump or WallJump or IBJ, ('S2-7B', 'S2-7C'): Impossible, ('S2-88', 'S2-89'): MorphBall and UseBombs, ('S2-89', 'S2-88'): MorphBall and UseBombs, ('S2-36', 'S2-8A'): Missiles and 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'): MorphBall or WaveBeam, ('S2-8D', 'S2-8E'): MorphBall or WaveBeam, ('S2-8F', 'S2-90'): MorphBall and UseBombs, ('S2-90', 'S2-8F'): MorphBall and UseBombs, ('S3-01', 'S3-04'): MorphBall and ScrewAttack and (SpeedBooster or Ice or 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'): MorphBall and ScrewAttack and (SpeedBooster or Ice or SpaceJump), ('S3-03', 'S3-04'): MorphBall and ScrewAttack and (SpeedBooster or Ice or SpaceJump), ('S3-35', 'S3-04'): MorphBall and ScrewAttack and (SpeedBooster or Ice or SpaceJump), ('S3-08', 'S3-09'): SpeedBooster and GreenDoors, ('S3-08', 'S3-4C'): MorphBall and UseBombs and BombJump and SpeedBooster, ('S3-09', 'S3-08'): SpeedBooster, ('S3-09', 'S3-4C'): MorphBall and UseBombs and BombJump and SpeedBooster, ('S3-4C', 'S3-08'): Impossible, ('S3-4C', 'S3-09'): Impossible, ('S3-0A', 'S3-4D'): Impossible, ('S3-4D', 'S3-0A'): MorphBall and GreenDoors, ('S3-0B', 'S3-0C'): GreenDoors, ('S3-3D', 'S3-0C'): GreenDoors, ('S3-0D', 'S3-0E'): (SuperMissiles or PowerBombs or ScrewAttack) and GreenDoors, ('S3-0D', 'S3-0F'): MorphBall and (SuperMissiles or PowerBombs or ScrewAttack), ('S3-0D', 'S3-3C'): MorphBall and (ScrewAttack or (UseBombs and (SuperMissiles or PowerBombs))), ('S3-0E', 'S3-0D'): (SuperMissiles or PowerBombs or ScrewAttack) and GreenDoors, ('S3-0E', 'S3-0F'): MorphBall, ('S3-0E', 'S3-3C'): MorphBall and (UseBombs or ScrewAttack), ('S3-0F', 'S3-0D'): MorphBall and (SpringBall and ScrewAttack or (BombJump and PowerBombs) or (UseBombs and (SuperMissiles or PowerBombs or ScrewAttack))) and GreenDoors, ('S3-0F', 'S3-0E'): MorphBall and (UseBombs or (SpringBall and ScrewAttack) or (BombJump and PowerBombs)) and GreenDoors, ('S3-0F', 'S3-3C'): MorphBall and (UseBombs or ScrewAttack), ('S3-3C', 'S3-0D'): Impossible, ('S3-3C', 'S3-0E'): Impossible, ('S3-3C', 'S3-0F'): Impossible, ('S3-11', 'S3-12'): MorphBall and UseBombs and (HiJump or WallJump or IBJ), ('S3-12', 'S3-11'): MorphBall and (UseBombs and SpringBall or ScrewAttack), ('S3-13', 'S3-53'): ScrewAttack, ('S3-13', 'S3-54'): (SpeedBooster or SpaceJump or IBJ) and ScrewAttack, ('S3-53', 'S3-13'): ScrewAttack, ('S3-53', 'S3-54'): (SpeedBooster or SpaceJump or IBJ) and 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'): (SpeedBooster or SpaceJump or IBJ) and 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'): VariaSuit and GreenDoors, ('S3-18', 'S3-19'): (Missiles or ChargeBeam or Ice or ScrewAttack) and VariaSuit, ('S3-19', 'S3-18'): VariaSuit, ('S3-1A', 'S3-1B'): VariaSuit, ('S3-1B', 'S3-1A'): VariaSuit, ('S3-1C', 'S3-1D'): Ice or SpaceJump or ((Missiles or ChargeBeam or ScrewAttack) and IBJ), ('S3-1E', 'S3-1F'): (Missiles or ChargeBeam or ScrewAttack) and VariaSuit, ('S3-1F', 'S3-1E'): (Missiles or ChargeBeam or ScrewAttack) and VariaSuit, ('S3-20', 'S3-21'): VariaSuit, ('S3-21', 'S3-20'): VariaSuit, ('S3-22', 'S3-31'): Missiles or ChargeBeam, ('S3-24', 'S3-2B'): GreenDoors, ('S3-28', 'S3-4B'): VariaSuit and WaveBeam, ('S3-28', 'S3-4E'): GravitySuit and WaveBeam and ScrewAttack, ('S3-4B', 'S3-28'): VariaSuit, ('S3-4B', 'S3-4E'): GravitySuit and ScrewAttack, ('S3-4E', 'S3-28'): GravitySuit and ScrewAttack, ('S3-4E', 'S3-4B'): GravitySuit and ScrewAttack, ('S3-2D', 'S3-10'): GreenDoors, ('S3-40', 'S3-10'): GreenDoors, ('S3-25', 'S3-2B'): (ChargeBeam or Difficulty > 0) and GreenDoors, ('S3-25', 'S3-2E'): ChargeBeam or Difficulty > 0, ('S3-2B', 'S3-25'): SpaceJump or ((ChargeBeam or Difficulty > 0) and GreenDoors), ('S3-2B', 'S3-2E'): ChargeBeam or Difficulty > 0, ('S3-2E', 'S3-25'): SpaceJump or ((ChargeBeam or Difficulty > 0) and GreenDoors), ('S3-2E', 'S3-2B'): (ChargeBeam or Difficulty > 0) and GreenDoors, ('S3-2F', 'S3-30'): MorphBall and (SuperMissiles or PowerBombs or ScrewAttack), ('S3-2F', 'S3-3F'): MorphBall and UseBombs and (SuperMissiles or PowerBombs or ScrewAttack), ('S3-30', 'S3-2F'): MorphBall and UseBombs and (SuperMissiles or PowerBombs or ScrewAttack) and GreenDoors, ('S3-30', 'S3-3F'): MorphBall and UseBombs, ('S3-3F', 'S3-2F'): Impossible, ('S3-3F', 'S3-30'): Impossible, ('S3-36', 'S3-37'): VariaSuit or (DamageRuns and (Energy >= 199 or SpeedBooster)), ('S3-37', 'S3-36'): VariaSuit or (DamageRuns and (Energy >= 199 or (SpeedBooster and (UseBombs or 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'): (MorphBall and UseBombs or ScrewAttack) and GreenDoors, ('S3-27', 'S3-4A'): HiJump and Ice or SpaceJump or IBJ or (MorphBall and UseBombs and Missiles and SpeedBooster and (Difficulty >= 4)), ('S3-47', 'S3-27'): MorphBall and UseBombs or ScrewAttack, ('S3-47', 'S3-4A'): (MorphBall and UseBombs or ScrewAttack) and (HiJump and Ice or SpaceJump or IBJ or (Missiles and SpeedBooster and (Difficulty >= 4))), ('S3-4A', 'S3-47'): (MorphBall and UseBombs or ScrewAttack) and GreenDoors, ('S3-4F', 'S3-50'): GravitySuit and SpeedBooster, ('S3-50', 'S3-4F'): Impossible, ('S4-08', 'S4-09'): MorphBall and (Diffusion or (WaveBeam and IceBeam)) and RedDoors, ('S4-08', 'S4-1B'): MorphBall and (WaterLowered or DamageRuns) and (Diffusion or (WaveBeam and IceBeam)) and RedDoors, ('S4-08', 'S4-54'): WaterLowered or DamageRuns, ('S4-09', 'S4-08'): MorphBall and (Diffusion or (WaveBeam and IceBeam)), ('S4-09', 'S4-1B'): RedDoors and (WaterLowered or DamageRuns), ('S4-09', 'S4-54'): MorphBall and (WaterLowered or DamageRuns) and (Diffusion or (WaveBeam and IceBeam)), ('S4-1B', 'S4-08'): MorphBall and (WaterLowered or DamageRuns) and (Diffusion or (WaveBeam and IceBeam)), ('S4-1B', 'S4-09'): RedDoors and (WaterLowered or DamageRuns), ('S4-1B', 'S4-54'): MorphBall and (WaterLowered or DamageRuns) and (Diffusion or (WaveBeam and IceBeam)), ('S4-54', 'S4-08'): WaterLowered or DamageRuns, ('S4-54', 'S4-09'): MorphBall and (WaterLowered or DamageRuns) and (Diffusion or (WaveBeam and IceBeam)) and RedDoors, ('S4-54', 'S4-1B'): MorphBall and (WaterLowered or DamageRuns) and (Diffusion or (WaveBeam and IceBeam)) and RedDoors, ('S4-0D', 'S4-0E'): MorphBall and UseBombs, ('S4-0D', 'S4-12'): MorphBall and UseBombs and SpeedBooster and (WaterLowered or (DamageRuns and GravitySuit)), ('S4-0D', 'S4-41'): MorphBall and UseBombs, ('S4-0E', 'S4-0D'): SpeedBooster or (MorphBall and (UseBombs or PowerBombs) and (SpaceJump or WallJump or IBJ)), ('S4-0E', 'S4-12'): SpeedBooster and (WaterLowered or (DamageRuns and GravitySuit)), ('S4-12', 'S4-0D'): SpeedBooster and (WaterLowered or (DamageRuns and GravitySuit)), ('S4-12', 'S4-0E'): SpeedBooster and (WaterLowered or (DamageRuns and GravitySuit)), ('S4-12', 'S4-41'): SpeedBooster and (WaterLowered or (DamageRuns and GravitySuit)), ('S4-41', 'S4-0D'): SpeedBooster or (MorphBall and (UseBombs or PowerBombs) and (SpaceJump or WallJump or IBJ)), ('S4-41', 'S4-12'): SpeedBooster and (WaterLowered or (DamageRuns and 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'): Missiles or ChargeBeam, ('S4-40', 'S4-16'): Impossible, ('S4-40', 'S4-3F'): GravitySuit, ('S4-58', 'S4-5F'): GravitySuit and (SpeedBooster or SpaceJump), ('S4-59', 'S4-5F'): GravitySuit and (SpeedBooster or SpaceJump), ('S4-1E', 'S4-1D'): Impossible, ('S4-75', 'S4-1D'): Impossible, ('S4-1F', 'S4-4F'): MorphBall, ('S4-21', 'S4-1F'): GravitySuit and (SpaceJump or IBJ), ('S4-21', 'S4-4F'): MorphBall and GravitySuit and (SpaceJump or IBJ), ('S4-21', 'S4-20'): GravitySuit and (SpaceJump or IBJ), ('S4-21', 'S4-60'): GravitySuit and (SpaceJump or IBJ), ('S4-22', 'S4-1F'): GravitySuit and (SpaceJump or IBJ), ('S4-22', 'S4-4F'): MorphBall and GravitySuit and (SpaceJump or IBJ), ('S4-22', 'S4-20'): GravitySuit and (SpaceJump or IBJ), ('S4-22', 'S4-60'): GravitySuit and (SpaceJump or 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'): GravitySuit and RedDoors, ('S4-29', 'S4-28'): RedDoors, ('S4-2A', 'S4-37'): MorphBall and GravitySuit and ScrewAttack, ('S4-2A', 'S4-5A'): MorphBall and (GravitySuit and ScrewAttack or (Ice and (BombJump and GravitySuit or SpringBall))), ('S4-2A', 'S4-74'): MorphBall, ('S4-37', 'S4-2A'): MorphBall and GravitySuit and ScrewAttack, ('S4-37', 'S4-5A'): GravitySuit and ScrewAttack, ('S4-37', 'S4-74'): GravitySuit and ScrewAttack, ('S4-5A', 'S4-2A'): MorphBall and (GravitySuit and ScrewAttack or (Diffusion and (BombJump and GravitySuit or SpringBall))), ('S4-5A', 'S4-37'): GravitySuit and (SpeedBooster or ScrewAttack), ('S4-5A', 'S4-74'): MorphBall and (GravitySuit and ScrewAttack or (Diffusion and (BombJump and GravitySuit or SpringBall))), ('S4-74', 'S4-2A'): MorphBall, ('S4-74', 'S4-37'): GravitySuit and ScrewAttack, ('S4-74', 'S4-5A'): MorphBall and Ice and (UseBombs and GravitySuit or SpringBall) or (GravitySuit and ScrewAttack), ('S4-11', 'S4-2B'): MorphBall and (UseBombs or ((HiJump or SpeedBooster) and (WaterLowered or (DamageRuns and GravitySuit)))), ('S4-11', 'S4-3B'): SpeedBooster and (WaterLowered or (DamageRuns and GravitySuit)), ('S4-11', 'S4-47'): MorphBall and (UseBombs or (ScrewAttack and (HiJump or SpeedBooster) and (WaterLowered or (DamageRuns and GravitySuit)))), ('S4-2B', 'S4-11'): MorphBall and (UseBombs or WaterLowered or DamageRuns), ('S4-2B', 'S4-3B'): MorphBall and SpeedBooster and (WaterLowered or (DamageRuns and GravitySuit)), ('S4-2B', 'S4-47'): MorphBall and UseBombs or ScrewAttack, ('S4-3B', 'S4-11'): SpeedBooster and (WaterLowered or (DamageRuns and GravitySuit)), ('S4-3B', 'S4-2B'): MorphBall and SpeedBooster and (WaterLowered or (DamageRuns and GravitySuit)), ('S4-3B', 'S4-47'): MorphBall and (UseBombs or ScrewAttack) and SpeedBooster and (WaterLowered or (DamageRuns and GravitySuit)), ('S4-47', 'S4-11'): MorphBall and (UseBombs or (ScrewAttack and (WaterLowered or DamageRuns))), ('S4-47', 'S4-2B'): MorphBall and UseBombs or ScrewAttack, ('S4-47', 'S4-3B'): MorphBall and (UseBombs or ScrewAttack) and SpeedBooster and (WaterLowered or (DamageRuns and GravitySuit)), ('S4-2C', 'S4-2D'): (WaterLowered or DamageRuns) and RedDoors, ('S4-2C', 'S4-2E'): MorphBall, ('S4-2C', 'S4-4B'): BlueDoors, ('S4-2D', 'S4-2C'): WaterLowered or DamageRuns, ('S4-2D', 'S4-2E'): MorphBall and (WaterLowered or DamageRuns), ('S4-2D', 'S4-4B'): (WaterLowered or DamageRuns) and BlueDoors, ('S4-2E', 'S4-2D'): (WaterLowered or DamageRuns) and RedDoors, ('S4-2E', 'S4-4B'): BlueDoors, ('S4-4B', 'S4-2D'): (WaterLowered or DamageRuns) and RedDoors, ('S4-4B', 'S4-2E'): MorphBall, ('S4-2F', 'S4-45'): MorphBall, ('S4-45', 'S4-2F'): MorphBall and UseBombs, ('S4-30', 'S4-35'): SpeedBooster and GravitySuit, ('S4-30', 'S4-4E'): MorphBall and GravitySuit and ScrewAttack, ('S4-35', 'S4-30'): Impossible, ('S4-35', 'S4-4D'): Impossible, ('S4-35', 'S4-4E'): Impossible, ('S4-4D', 'S4-30'): (HiJump or GravitySuit) and RedDoors, ('S4-4D', 'S4-35'): SpeedBooster and GravitySuit, ('S4-4D', 'S4-4E'): MorphBall and GravitySuit and ScrewAttack, ('S4-4E', 'S4-30'): MorphBall and GravitySuit and ScrewAttack and RedDoors, ('S4-4E', 'S4-35'): MorphBall and SpeedBooster and GravitySuit and ScrewAttack, ('S4-4E', 'S4-4D'): MorphBall and GravitySuit and ScrewAttack, ('S4-31', 'S4-50'): Missiles and MorphBall and (UseBombs and (SpringBall or GravitySuit) or (GravitySuit and ScrewAttack)), ('S4-36', 'S4-31'): RedDoors, ('S4-36', 'S4-50'): Missiles and MorphBall and (UseBombs and (SpringBall or GravitySuit) or (GravitySuit and ScrewAttack)), ('S4-50', 'S4-31'): Missiles and MorphBall and (UseBombs or (GravitySuit and ScrewAttack)) and RedDoors, ('S4-50', 'S4-36'): Missiles and MorphBall and (UseBombs or (GravitySuit and ScrewAttack)), ('S4-32', 'S4-33'): RedDoors, ('S4-32', 'S4-64'): MorphBall and (SpringBall or (UseBombs and GravitySuit)), ('S4-33', 'S4-32'): GravitySuit and RedDoors, ('S4-33', 'S4-53'): GravitySuit, ('S4-33', 'S4-64'): MorphBall and GravitySuit and BombJump, ('S4-53', 'S4-32'): RedDoors, ('S4-53', 'S4-33'): RedDoors, ('S4-53', 'S4-64'): MorphBall and (SpringBall or (UseBombs and GravitySuit)), ('S4-64', 'S4-32'): MorphBall and GravitySuit and RedDoors, ('S4-64', 'S4-33'): MorphBall and RedDoors, ('S4-64', 'S4-53'): MorphBall and GravitySuit, ('S4-34', 'S4-62'): Impossible, ('S4-62', 'S4-34'): RedDoors, ('S4-42', 'S4-43'): MorphBall and UseBombs, ('S4-42', 'S4-44'): Impossible, ('S4-42', 'S4-71'): Impossible, ('S4-43', 'S4-42'): MorphBall and 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'): HiJumpBoots or GravitySuit, ('S4-49', 'S4-46'): HiJumpBoots or GravitySuit, ('S4-48', 'S4-51'): Impossible, ('S4-48', 'S4-52'): Impossible, ('S4-51', 'S4-48'): MorphBall and (UseBombs or (GravitySuit and ScrewAttack)), ('S4-51', 'S4-52'): MorphBall and UseBombs or (GravitySuit and ScrewAttack), ('S4-52', 'S4-48'): MorphBall and (UseBombs or (GravitySuit and ScrewAttack)), ('S4-52', 'S4-51'): GravitySuit and ScrewAttack, ('S4-1C', 'S4-38'): MorphBall and Diffusion, ('S4-1C', 'S4-6D'): MorphBall and Diffusion and GravitySuit and ScrewAttack, ('S4-1C', 'S4-70'): MorphBall and Diffusion, ('S4-38', 'S4-1C'): Missiles and MorphBall and GravitySuit and (SpaceJump or (HiJump and Ice)), ('S4-38', 'S4-6D'): GravitySuit and ScrewAttack, ('S4-38', 'S4-70'): Missiles and MorphBall and GravitySuit and (SpaceJump or (HiJump and Ice)), ('S4-6D', 'S4-1C'): Missiles and MorphBall and GravitySuit and ScrewAttack and (SpaceJump or WallJump), ('S4-6D', 'S4-38'): GravitySuit and ScrewAttack and (SpaceJump or WallJump), ('S4-6D', 'S4-70'): Missiles and MorphBall and GravitySuit and ScrewAttack and (SpaceJump or WallJump), ('S4-70', 'S4-1C'): Missiles and MorphBall, ('S4-70', 'S4-38'): Missiles and MorphBall, ('S4-70', 'S4-6D'): Missiles and MorphBall and GravitySuit and ScrewAttack, ('S4-56', 'S4-57'): MorphBall and UseBombs, ('S4-57', 'S4-56'): MorphBall and UseBombs and RedDoors, ('S4-5D', 'S4-5E'): MorphBall and GravitySuit and ScrewAttack, ('S4-5E', 'S4-5D'): MorphBall and GravitySuit and ScrewAttack, ('S4-65', 'S4-66'): MorphBall and (PowerBombs or WaveBeam or (ChargeBeam and Difficulty >= 1)) and (Missiles or (ChargeBeam and 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'): Missiles and MorphBall, ('S5-01', 'S5-51'): YellowDoors, ('S5-42', 'S5-4D'): Missiles and MorphBall, ('S5-42', 'S5-51'): YellowDoors, ('S5-4D', 'S5-01'): Missiles and MorphBall, ('S5-4D', 'S5-42'): Missiles and MorphBall and YellowDoors, ('S5-4D', 'S5-51'): Missiles and MorphBall and YellowDoors, ('S5-51', 'S5-42'): YellowDoors, ('S5-51', 'S5-4D'): Missiles and MorphBall and YellowDoors, ('S5-07', 'S5-08'): HiJump and Ice or SpaceJump or IBJ, ('S5-08', 'S5-07'): YellowDoors, ('S5-09', 'S5-07'): YellowDoors, ('S5-09', 'S5-08'): HiJump and Ice or SpaceJump or IBJ, ('S5-4E', 'S5-07'): YellowDoors, ('S5-4E', 'S5-08'): HiJump and Ice or SpaceJump or IBJ, ('S5-34', 'S5-59'): YellowDoors, ('S5-59', 'S5-34'): YellowDoors, ('S5-0B', 'S5-0C'): HiJump and Ice or SpaceJump or IBJ, ('S5-0C', 'S5-0B'): YellowDoors, ('S5-0D', 'S5-0B'): YellowDoors, ('S5-0D', 'S5-0C'): HiJump and Ice or SpaceJump or IBJ, ('S5-50', 'S5-0B'): YellowDoors, ('S5-50', 'S5-0C'): HiJump and Ice or SpaceJump or IBJ, ('S5-0E', 'S5-0F'): VariaSuit, ('S5-0E', 'S5-10'): MorphBall and UseBombs and SpeedBooster and VariaSuit, ('S5-0E', 'S5-1E'): VariaSuit, ('S5-0E', 'S5-38'): MorphBall and VariaSuit and (PowerBombs or (UseBombs and ScrewAttack)), ('S5-0E', 'S5-63'): SpeedBooster and VariaSuit and YellowDoors, ('S5-0F', 'S5-0E'): VariaSuit, ('S5-0F', 'S5-10'): MorphBall and UseBombs and SpeedBooster and VariaSuit, ('S5-0F', 'S5-1E'): VariaSuit, ('S5-0F', 'S5-38'): MorphBall and VariaSuit and (PowerBombs or (UseBombs and ScrewAttack)), ('S5-0F', 'S5-63'): SpeedBooster and VariaSuit and YellowDoors, ('S5-10', 'S5-0E'): MorphBall and UseBombs and VariaSuit, ('S5-10', 'S5-0F'): MorphBall and UseBombs and VariaSuit, ('S5-10', 'S5-1E'): MorphBall and UseBombs and VariaSuit, ('S5-10', 'S5-38'): MorphBall and VariaSuit and (PowerBombs or (UseBombs and ScrewAttack)), ('S5-10', 'S5-63'): MorphBall and UseBombs and VariaSuit and YellowDoors, ('S5-1E', 'S5-0E'): VariaSuit, ('S5-1E', 'S5-0F'): VariaSuit, ('S5-1E', 'S5-10'): MorphBall and UseBombs and SpeedBooster and VariaSuit, ('S5-1E', 'S5-38'): MorphBall and VariaSuit and (PowerBombs or (UseBombs and ScrewAttack)), ('S5-1E', 'S5-63'): SpeedBooster and VariaSuit and YellowDoors, ('S5-38', 'S5-0E'): MorphBall and VariaSuit and (PowerBombs or (UseBombs and ScrewAttack)), ('S5-38', 'S5-0F'): MorphBall and VariaSuit and (PowerBombs or (UseBombs and ScrewAttack)), ('S5-38', 'S5-10'): MorphBall and SpeedBooster and VariaSuit and (PowerBombs or (UseBombs and ScrewAttack)), ('S5-38', 'S5-1E'): MorphBall and VariaSuit and (PowerBombs or (UseBombs and ScrewAttack)), ('S5-38', 'S5-63'): MorphBall and SpeedBooster and VariaSuit and YellowDoors and (PowerBombs or (UseBombs and ScrewAttack)), ('S5-63', 'S5-0E'): MorphBall and VariaSuit, ('S5-63', 'S5-0F'): MorphBall and VariaSuit, ('S5-63', 'S5-10'): MorphBall and UseBombs and VariaSuit, ('S5-63', 'S5-1E'): MorphBall and VariaSuit, ('S5-63', 'S5-38'): MorphBall and VariaSuit and (PowerBombs or (UseBombs and ScrewAttack)), ('S5-24', 'S5-40'): VariaSuit and WaveBeam, ('S5-40', 'S5-24'): VariaSuit, ('S5-12', 'S5-14'): VariaSuit and YellowDoors, ('S5-14', 'S5-12'): VariaSuit and YellowDoors, ('S5-28', 'S5-13'): YellowDoors, ('S5-15', 'S5-16'): MorphBall and UseBombs and VariaSuit, ('S5-16', 'S5-15'): MorphBall and UseBombs and VariaSuit, ('S5-18', 'S5-31'): VariaSuit and YellowDoors, ('S5-18', 'S5-4F'): MorphBall and BombJump and VariaSuit, ('S5-18', 'S5-5A'): VariaSuit and SpaceJump and YellowDoors, ('S5-31', 'S5-18'): VariaSuit and (Ice or SpaceJump), ('S5-31', 'S5-4F'): MorphBall and BombJump and VariaSuit, ('S5-31', 'S5-5A'): VariaSuit and SpaceJump and YellowDoors, ('S5-4F', 'S5-18'): MorphBall and VariaSuit and (Ice or SpaceJump), ('S5-4F', 'S5-31'): MorphBall and VariaSuit and YellowDoors, ('S5-4F', 'S5-5A'): MorphBall and VariaSuit and SpaceJump and YellowDoors, ('S5-5A', 'S5-18'): VariaSuit and (Ice or SpaceJump), ('S5-5A', 'S5-31'): VariaSuit and YellowDoors, ('S5-5A', 'S5-4F'): MorphBall and BombJump and VariaSuit, ('S5-1B', 'S5-1D'): MorphBall and UseBombs and SpeedBooster and GravitySuit, ('S5-1B', 'S5-39'): MorphBall and (PowerBombs or (UseBombs and ScrewAttack)), ('S5-1B', 'S5-46'): SpeedBooster and GravitySuit and YellowDoors, ('S5-1C', 'S5-1B'): HiJump or GravitySuit, ('S5-1C', 'S5-1D'): MorphBall and UseBombs and SpeedBooster and GravitySuit, ('S5-1C', 'S5-39'): MorphBall and (PowerBombs or (UseBombs and ScrewAttack)) and (HiJump or GravitySuit), ('S5-1C', 'S5-46'): SpeedBooster and GravitySuit and YellowDoors, ('S5-1C', 'S5-1F'): HiJump or GravitySuit, ('S5-1C', 'S5-35'): HiJump or GravitySuit, ('S5-1D', 'S5-1B'): MorphBall and UseBombs and GravitySuit, ('S5-1D', 'S5-1C'): MorphBall and UseBombs and GravitySuit, ('S5-1D', 'S5-39'): MorphBall and (PowerBombs or (UseBombs and ScrewAttack)) and GravitySuit, ('S5-1D', 'S5-46'): MorphBall and UseBombs and YellowDoors, ('S5-1D', 'S5-1F'): MorphBall and UseBombs and GravitySuit, ('S5-1D', 'S5-35'): MorphBall and UseBombs and GravitySuit, ('S5-39', 'S5-1B'): MorphBall and (PowerBombs or (UseBombs and ScrewAttack)), ('S5-39', 'S5-1C'): MorphBall and (PowerBombs or (UseBombs and ScrewAttack)), ('S5-39', 'S5-1D'): MorphBall and (PowerBombs or (UseBombs and ScrewAttack)) and SpeedBooster and GravitySuit, ('S5-39', 'S5-46'): MorphBall and (PowerBombs or (UseBombs and ScrewAttack)) and SpeedBooster and GravitySuit and YellowDoors, ('S5-39', 'S5-1F'): MorphBall and (PowerBombs or (UseBombs and ScrewAttack)), ('S5-39', 'S5-35'): MorphBall and (PowerBombs or (UseBombs and ScrewAttack)), ('S5-46', 'S5-1B'): MorphBall and GravitySuit, ('S5-46', 'S5-1C'): MorphBall and GravitySuit, ('S5-46', 'S5-1D'): MorphBall and UseBombs, ('S5-46', 'S5-39'): MorphBall and (PowerBombs or (UseBombs and ScrewAttack)) and GravitySuit, ('S5-46', 'S5-1F'): MorphBall and GravitySuit, ('S5-46', 'S5-35'): MorphBall and GravitySuit, ('S5-1F', 'S5-1D'): MorphBall and UseBombs and SpeedBooster and GravitySuit, ('S5-1F', 'S5-39'): MorphBall and (PowerBombs or (UseBombs and ScrewAttack)), ('S5-1F', 'S5-46'): SpeedBooster and GravitySuit and YellowDoors, ('S5-35', 'S5-1D'): MorphBall and UseBombs and SpeedBooster and GravitySuit, ('S5-35', 'S5-39'): MorphBall and (PowerBombs or (UseBombs and ScrewAttack)), ('S5-35', 'S5-46'): SpeedBooster and GravitySuit and YellowDoors, ('S5-5B', 'S5-5C'): YellowDoors, ('S5-5C', 'S5-5B'): SpaceJump or IBJ, ('S5-5C', 'S5-5D'): SpaceJump or IBJ, ('S5-5D', 'S5-5C'): YellowDoors, ('S5-22', 'S5-78'): MorphBall and PowerBombs, ('S5-3D', 'S5-22'): HiJump or IBJ, ('S5-3D', 'S5-78'): MorphBall and PowerBombs and (HiJump or IBJ), ('S5-3D', 'S5-23'): HiJump or IBJ, ('S5-3D', 'S5-77'): HiJump or IBJ, ('S5-3E', 'S5-22'): HiJump or IBJ, ('S5-3E', 'S5-78'): MorphBall and PowerBombs and (HiJump or IBJ), ('S5-3E', 'S5-23'): HiJump or IBJ, ('S5-3E', 'S5-77'): HiJump or IBJ, ('S5-78', 'S5-22'): MorphBall and UseBombs, ('S5-78', 'S5-3D'): MorphBall and UseBombs, ('S5-78', 'S5-3E'): MorphBall and UseBombs, ('S5-78', 'S5-23'): MorphBall and UseBombs, ('S5-78', 'S5-77'): MorphBall and UseBombs, ('S5-23', 'S5-78'): MorphBall and PowerBombs, ('S5-77', 'S5-78'): MorphBall and PowerBombs, ('S5-25', 'S5-26'): Missiles or ChargeBeam, ('S5-2A', 'S5-6C'): VariaSuit, ('S5-2A', 'S5-6D'): MorphBall and PowerBombs and VariaSuit, ('S5-2A', 'S5-6E'): MorphBall and PowerBombs and VariaSuit and (Ice or SpaceJump or WallJump), ('S5-6C', 'S5-2A'): VariaSuit, ('S5-6C', 'S5-6D'): MorphBall and PowerBombs and VariaSuit, ('S5-6C', 'S5-6E'): MorphBall and PowerBombs and VariaSuit and (Ice or SpaceJump or WallJump), ('S5-6D', 'S5-2A'): MorphBall and PowerBombs and VariaSuit, ('S5-6D', 'S5-6C'): MorphBall and PowerBombs and VariaSuit, ('S5-6D', 'S5-6E'): MorphBall and PowerBombs and VariaSuit and (Ice or SpaceJump or WallJump), ('S5-6E', 'S5-2A'): MorphBall and PowerBombs and VariaSuit, ('S5-6E', 'S5-6C'): MorphBall and PowerBombs and VariaSuit, ('S5-6E', 'S5-6D'): MorphBall and PowerBombs and VariaSuit, ('S5-19', 'S5-30'): YellowDoors, ('S5-19', 'S5-69'): MorphBall and PowerBombs, ('S5-30', 'S5-19'): SpaceJump or IBJ, ('S5-30', 'S5-68'): HiJump and Ice or SpaceJump or IBJ, ('S5-30', 'S5-69'): MorphBall and PowerBombs, ('S5-61', 'S5-19'): SpaceJump or IBJ, ('S5-61', 'S5-30'): YellowDoors, ('S5-61', 'S5-68'): HiJump and Ice or SpaceJump or IBJ, ('S5-61', 'S5-69'): MorphBall and PowerBombs, ('S5-68', 'S5-19'): SpaceJump or IBJ, ('S5-68', 'S5-30'): YellowDoors, ('S5-68', 'S5-69'): MorphBall and 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'): SpeedBooster and GravitySuit, ('S5-3C', 'S5-3B'): SpeedBooster and GravitySuit, ('S5-41', 'S5-11'): YellowDoors, ('S5-43', 'S5-49'): ScrewAttack, ('S5-49', 'S5-43'): ScrewAttack and 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'): SpeedBooster and VariaSuit and YellowDoors, ('S5-6A', 'S5-6B'): MorphBall and UseBombs, ('S5-6B', 'S5-6A'): MorphBall and UseBombs, ('S5-5E', 'S5-5F'): VariaSuit and YellowDoors, ('S5-5E', 'S5-60'): MorphBall and BombJump and VariaSuit, ('S5-5F', 'S5-5E'): VariaSuit and (Ice or SpaceJump), ('S5-5F', 'S5-60'): MorphBall and BombJump and VariaSuit, ('S5-60', 'S5-5E'): MorphBall and VariaSuit and (Ice or SpaceJump), ('S5-60', 'S5-5F'): MorphBall and VariaSuit and YellowDoors, ('S5-36', 'S5-44'): Missiles and MorphBall and Ice, ('S5-44', 'S5-36'): Missiles and MorphBall and GravitySuit and ScrewAttack and (SpaceJump or WallJump), ('S5-44', 'S5-70'): Missiles and MorphBall, ('S5-70', 'S5-36'): GravitySuit and ScrewAttack and (SpaceJump or WallJump), ('S5-70', 'S5-44'): Missiles and MorphBall and Ice, ('S5-73', 'S5-7B'): SpeedBooster and GravitySuit, ('S5-7B', 'S5-73'): SpeedBooster and 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'): SuperMissiles or PowerBombs or ScrewAttack or (SpeedBooster and Difficulty >= 1), ('S6-07', 'S6-32'): MorphBall and UseBombs, ('S6-07', 'S6-4B'): MorphBall and UseBombs and (SuperMissiles or PowerBombs or ScrewAttack or (SpeedBooster and Difficulty >= 1)), ('S6-08', 'S6-07'): SuperMissiles or PowerBombs or ScrewAttack, ('S6-08', 'S6-32'): MorphBall and UseBombs and (SuperMissiles or PowerBombs or ScrewAttack), ('S6-08', 'S6-4B'): MorphBall and UseBombs, ('S6-32', 'S6-07'): MorphBall and UseBombs, ('S6-32', 'S6-08'): MorphBall and UseBombs and (SuperMissiles or PowerBombs or ScrewAttack), ('S6-32', 'S6-4B'): MorphBall and UseBombs and (SuperMissiles or PowerBombs or ScrewAttack), ('S6-4B', 'S6-07'): MorphBall and UseBombs and (SuperMissiles or PowerBombs or ScrewAttack), ('S6-4B', 'S6-08'): MorphBall and UseBombs, ('S6-4B', 'S6-32'): MorphBall and UseBombs and (SuperMissiles or PowerBombs or 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'): SpeedBooster and 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'): SpeedBooster and ScrewAttack and (VariaSuit or Energy > 499), ('S6-0E', 'S6-52'): ScrewAttack, ('S6-0E', 'S6-55'): Impossible, ('S6-20', 'S6-30'): VariaSuit or Energy > 499, ('S6-30', 'S6-20'): VariaSuit or Energy > 499, ('S6-03', 'S6-21'): MorphBall and PowerBombs and (VariaSuit or Energy > 499), ('S6-21', 'S6-03'): MorphBall and PowerBombs and RedDoors and (VariaSuit or Energy > 499), ('S6-0F', 'S6-47'): MorphBall and ScrewAttack, ('S6-47', 'S6-0F'): MorphBall, ('S6-47', 'S6-10'): MorphBall, ('S6-10', 'S6-47'): MorphBall and 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'): MorphBall and UseBombs, ('S6-1B', 'S6-15'): MorphBall and UseBombs, ('S6-1B', 'S6-3D'): MorphBall and UseBombs, ('S6-15', 'S6-1B'): MorphBall, ('S6-3D', 'S6-1B'): MorphBall, ('S6-17', 'S6-18'): Missiles or (ChargeBeam and GreenDoors), ('S6-1A', 'S6-59'): SpeedBooster and ScrewAttack, ('S6-1C', 'S6-1A'): RedDoors, ('S6-1C', 'S6-59'): Impossible, ('S6-59', 'S6-1A'): MorphBall and RedDoors, ('S6-59', 'S6-1C'): MorphBall, ('S6-25', 'S6-58'): HiJump and ScrewAttack, ('S6-58', 'S6-25'): ScrewAttack, ('S6-28', 'S6-2A'): RedDoors, ('S6-29', 'S6-28'): HiJump or WallJump or IBJ, ('S6-29', 'S6-2A'): RedDoors, ('S6-2A', 'S6-28'): HiJump or WallJump or IBJ, ('S6-2C', 'S6-2D'): MorphBall and WaveBeam, ('S6-2D', 'S6-2C'): MorphBall and RedDoors, ('S6-35', 'S6-3E'): GreenDoors, ('S6-3E', 'S6-35'): GreenDoors, ('S6-13', 'S6-36'): MorphBall and UseBombs, ('S6-36', 'S6-13'): MorphBall and PowerBombs, ('S6-37', 'S6-38'): MorphBall and PowerBombs, ('S6-38', 'S6-37'): MorphBall and 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'): VariaSuit or Energy >= 599, ('S6-41', 'S6-44'): VariaSuit or Energy >= 599, ('S6-43', 'S6-41'): VariaSuit or Energy > 599, ('S6-43', 'S6-4D'): VariaSuit or Energy > 599, ('S6-44', 'S6-41'): VariaSuit or Energy > 599, ('S6-44', 'S6-4D'): VariaSuit or Energy > 599, ('S6-4D', 'S6-43'): VariaSuit or Energy > 599, ('S6-4D', 'S6-44'): VariaSuit or 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'): SpeedBooster and RedDoors and BackwardsLabs, ('S0-20', 'S0-22'): SpeedBooster and RedDoors and BackwardsLabs, ('Item S0-05-16', 'S0-20'): SpeedBooster and RedDoors, ('Item S0-05-16', 'S0-22'): SpeedBooster and RedDoors and BackwardsLabs, ('S0-22', 'S0-20'): SpeedBooster and RedDoors, ('S0-22', 'Item S0-05-16'): SpeedBooster and 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'): Missiles and MorphBall and ScrewAttack, ('Arachnus', 'Item S0-18-06'): MorphBall and ScrewAttack, ('Arachnus', 'S0-59'): MorphBall, ('Arachnus', 'S0-C8'): Missiles and MorphBall and ScrewAttack, ('S0-59', 'S0-58'): Missiles and MorphBall and ScrewAttack, ('S0-59', 'Item S0-18-06'): MorphBall and ScrewAttack, ('S0-59', 'Arachnus'): Missiles and MorphBall, ('S0-59', 'S0-C8'): Missiles and MorphBall and ScrewAttack, ('S0-C8', 'S0-58'): Missiles, ('S0-C8', 'Item S0-18-06'): Missiles, ('S0-C8', 'Arachnus'): Missiles, ('S0-C8', 'S0-59'): Missiles and MorphBall, ('S0-6B', 'Item S0-08-0B'): MorphBall and PowerBombs and (BombJump or SpringBall), ('Item S0-08-0B', 'S0-6B'): MorphBall and PowerBombs, ('Item S0-08-0B', 'S0-C4'): Impossible, ('S0-C4', 'Item S0-08-0B'): MorphBall and PowerBombs and (BombJump or SpringBall), ('S0-74', 'Item S0-16-12'): MorphBall, ('S0-74', 'S0-75'): (Missiles or ChargeBeam) and MorphBall and UseBombs, ('Item S0-16-12', 'S0-74'): MorphBall, ('Item S0-16-12', 'S0-75'): (Missiles or ChargeBeam) and MorphBall and UseBombs, ('S0-75', 'S0-74'): Impossible, ('S0-75', 'Item S0-16-12'): Impossible, ('S0-83', 'Item S0-0E-07'): MorphBall and BombJump, ('Item S0-0E-07', 'S0-83'): MorphBall and UseBombs and 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'): Missiles and ChargeBeam and PlasmaBeam, ('End-of-Game', 'S0-C2'): RedDoors, ('S0-03', 'Yakuza'): Missiles and (ChargeBeam or Difficulty > 0), ('S0-03', 'S0-79'): SpaceJump or IBJ, ('Yakuza', 'S0-03'): SpaceJump or IBJ, ('Yakuza', 'S0-79'): SpaceJump or IBJ, ('S0-79', 'S0-03'): SpaceJump or IBJ, ('S0-79', 'Yakuza'): Missiles and (ChargeBeam or 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'): GravitySuit and (SpaceJump or (SpeedBooster and Difficulty > 0)) or (DamageRuns and Energy >= 199), ('S1-24', 'Item S1-06-03'): GravitySuit or (DamageRuns and Energy >= 199), ('S1-24', 'Item S1-07-04'): MorphBall and (GravitySuit or (DamageRuns and (Energy >= 299 and VariaSuit or Energy >= 399))), ('Item S1-05-03', 'S1-24'): GreenDoors and (GravitySuit or (DamageRuns and Energy >= 199)), ('Item S1-05-03', 'S1-25'): GravitySuit or SpaceJump or (DamageRuns and 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'): SpaceJump or (SpeedBooster and Difficulty > 0), ('S1-25', 'Item S1-07-04'): MorphBall and (GravitySuit or (DamageRuns and (Energy >= 199 and VariaSuit or Energy >= 299))), ('Item S1-06-03', 'S1-24'): GreenDoors and (GravitySuit or (DamageRuns and 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'): MorphBall and GreenDoors and (GravitySuit or (DamageRuns and (Energy >= 299 and VariaSuit or Energy >= 399))), ('Item S1-07-04', 'Item S1-05-03'): Impossible, ('Item S1-07-04', 'S1-25'): MorphBall and (GravitySuit or (DamageRuns and (Energy >= 199 and VariaSuit or Energy >= 299))), ('Item S1-07-04', 'Item S1-06-03'): Impossible, ('S1-3A', 'Ridley'): Missiles and (Difficulty > 4 or (Difficulty > 3 and ChargeBeam) or (ChargeBeam and PlasmaBeam)), ('Ridley', 'S1-3A'): SpaceJump or WallJump or IBJ, ('S1-3E', 'Item S1-03-0A'): Missiles and MorphBall and Diffusion and (Ice or ScrewAttack), ('Item S1-03-0A', 'S1-3E'): Missiles and MorphBall and Diffusion and (Ice or ScrewAttack), ('Item S1-03-0A', 'S1-3F'): Missiles and MorphBall and Diffusion and (Ice or ScrewAttack), ('Item S1-03-0A', '3E'): MorphBall and BombJump, ('Item S1-03-0A', '3F'): MorphBall and BombJump, ('S1-3F', 'Item S1-03-0A'): Missiles and MorphBall and Diffusion and (Ice or ScrewAttack), ('3E', 'Item S1-03-0A'): MorphBall and BombJump, ('3F', 'Item S1-03-0A'): MorphBall and BombJump, ('S1-51', 'Item S1-07-00'): HiJump and ScrewAttack, ('S1-51', 'S1-66'): MorphBall and (SpaceJump or (HiJump and WallJump)) and ScrewAttack, ('Item S1-07-00', 'S1-51'): ScrewAttack and GreenDoors, ('Item S1-07-00', 'S1-66'): MorphBall, ('S1-66', 'S1-51'): MorphBall and BombJump and ScrewAttack and GreenDoors, ('S1-66', 'Item S1-07-00'): MorphBall and BombJump, ('S1-52', 'Item S1-09-04'): (Missiles or ChargeBeam) and 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'): Missiles and 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'): MorphBall and BombJump and SpeedBooster and GravitySuit, ('Item S1-0C-07', 'S1-65'): MorphBall and BombJump and SpeedBooster and GravitySuit, ('S1-6D', 'Item S1-11-02'): MorphBall, ('Item S1-11-02', 'S1-6D'): MorphBall, ('S2-0E', 'Item S2-09-03'): MorphBall and UseBombs, ('Item S2-09-03', 'S2-0E'): MorphBall and UseBombs and BlueDoors, ('Data S2', 'S2-13'): BlueDoors, ('S2-14', 'Item S2-00-05'): MorphBall and UseBombs, ('Item S2-00-05', 'S2-14'): MorphBall, ('Item S2-00-05', 'S2-15'): MorphBall and UseBombs, ('S2-15', 'Item S2-00-05'): MorphBall and UseBombs and HiJump, ('S2-16', 'Item S2-02-0E'): MorphBall and UseBombs, ('Item S2-02-0E', 'S2-16'): MorphBall and UseBombs and SpringBall, ('Item S2-02-0E', 'S2-17'): MorphBall and UseBombs, ('S2-17', 'Item S2-02-0E'): MorphBall and UseBombs, ('S2-26', 'Item S2-0C-0B'): Impossible, ('Item S2-0C-0B', 'S2-26'): Impossible, ('Item S2-0C-0B', 'S2-27'): Missiles or ChargeBeam, ('S2-28', 'Zazabi'): Missiles, ('S2-28', 'S2-85'): (Missiles or ChargeBeam) and ScrewAttack and (SpaceJump or WallJump or IBJ), ('Zazabi', 'S2-28'): HiJump or WallJump or IBJ, ('Zazabi', 'S2-85'): ScrewAttack and (SpaceJump or WallJump or IBJ), ('S2-85', 'S2-28'): (Missiles or ChargeBeam) and ScrewAttack and (HiJump or WallJump or IBJ), ('S2-85', 'Zazabi'): Missiles and 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'): Missiles and (ChargeBeam or Difficulty > 0), ('S2-33', 'Nettori'): Missiles and (ChargeBeam or Difficulty > 0), ('S2-39', 'Item S2-03-0C'): MorphBall and (UseBombs and (SpringBall or GravitySuit) or PowerBombs), ('Item S2-03-0C', 'S2-39'): MorphBall and (UseBombs and (SpringBall or GravitySuit) or PowerBombs), ('S2-83', 'Security-Level-1'): ScrewAttack, ('Security-Level-1', 'S2-83'): ScrewAttack and (SpaceJump or WallJump or IBJ), ('Security-Level-1', 'S2-3B'): BlueDoors, ('Security-Level-1', 'S2-3D'): SpaceJump or IBJ, ('S2-3E', 'Item S2-09-05'): MorphBall and UseBombs, ('Item S2-09-05', 'S2-3E'): MorphBall and UseBombs, ('Item S2-09-05', 'S2-3F'): MorphBall and UseBombs, ('S2-3F', 'Item S2-09-05'): MorphBall and UseBombs, ('S2-10', 'Item S2-04-04'): MorphBall and UseBombs, ('S2-12', 'Item S2-04-04'): MorphBall and UseBombs and (BombJump or ScrewAttack), ('Item S2-04-04', 'S2-10'): MorphBall and UseBombs, ('Item S2-04-04', 'S2-12'): MorphBall and (UseBombs or ScrewAttack), ('Item S2-04-04', 'S2-45'): MorphBall and UseBombs and BlueDoors, ('Item S2-04-04', 'S2-54'): MorphBall and (UseBombs or ScrewAttack), ('S2-45', 'Item S2-04-04'): MorphBall and UseBombs, ('S2-54', 'Item S2-04-04'): MorphBall and UseBombs and (BombJump or ScrewAttack), ('S2-49', 'Item S2-04-03'): HiJump or IBJ or Ice or SpeedBooster or ScrewAttack, ('Item S2-04-03', 'S2-7D'): ScrewAttack, ('S2-7D', 'Item S2-04-03'): ScrewAttack, ('S2-38', 'Item S2-04-0B'): MorphBall and ((UseBombs or WaveBeam) and (HiJump or SpaceJump) or (GravitySuit and (Ice or SpaceJump or WallJump or IBJ))), ('Item S2-04-0B', 'S2-38'): MorphBall and (Ice or UseBombs or WaveBeam or (GravitySuit and (HiJump or IBJ or WallJump))), ('S2-5F', 'Item S2-04-0B'): HiJump or SpaceJump or (GravitySuit and (Ice or IBJ or WallJump)), ('S2-6D', 'Item S2-08-08'): SpaceJump or WallJump or IBJ, ('Item S2-08-08', 'S2-6D'): SpaceJump or WallJump or IBJ, ('Item S2-08-08', 'S2-73'): SpaceJump or WallJump or IBJ, ('S2-6E', 'Item S2-08-08'): SpaceJump or WallJump or IBJ, ('S2-73', 'Item S2-08-08'): SpaceJump or WallJump or IBJ, ('S2-72', 'Item S2-05-08'): MorphBall and Ice, ('S2-72', 'Item S2-05-0A'): MorphBall and Ice, ('Item S2-05-08', 'S2-72'): MorphBall and UseBombs, ('Item S2-05-0A', 'S2-72'): MorphBall and UseBombs, ('S2-84', 'Item S2-05-00'): SpaceJump, ('S2-84', 'Item S2-05-01'): SpaceJump, ('Item S2-05-00', 'S2-84'): MorphBall and 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'): MorphBall and UseBombs and BombJump and 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'): MorphBall and (SuperMissiles or ScrewAttack), ('Item S3-0B-04', 'S3-0D'): MorphBall and UseBombs and (SuperMissiles or ScrewAttack) and GreenDoors, ('Item S3-0B-04', 'S3-0E'): MorphBall and UseBombs and GreenDoors, ('Item S3-0B-04', 'S3-0F'): MorphBall and UseBombs, ('Item S3-0B-04', 'S3-3C'): MorphBall and (UseBombs or ScrewAttack), ('S3-0E', 'Item S3-0B-04'): MorphBall, ('S3-0F', 'Item S3-0B-04'): MorphBall and (UseBombs or ScrewAttack), ('S3-3C', 'Item S3-0B-04'): Impossible, ('S3-11', 'Item S3-0A-01'): MorphBall and PowerBombs, ('S3-11', 'Item S3-0B-02'): MorphBall and UseBombs, ('Item S3-0A-01', 'S3-11'): MorphBall, ('Item S3-0A-01', 'S3-12'): MorphBall and UseBombs and HiJump, ('Item S3-0B-02', 'S3-11'): MorphBall and UseBombs and SpringBall or ScrewAttack, ('Item S3-0B-02', 'S3-12'): MorphBall and UseBombs and HiJump, ('S3-12', 'Item S3-0A-01'): MorphBall and PowerBombs, ('S3-12', 'Item S3-0B-02'): MorphBall and UseBombs, ('S3-13', 'Item S3-0F-00'): SpeedBooster, ('Item S3-0F-00', 'S3-53'): ScrewAttack, ('Item S3-0F-00', 'S3-54'): (SpeedBooster or SpaceJump or IBJ) and ScrewAttack, ('S3-26', 'Item S3-0F-00'): SpeedBooster, ('S3-53', 'Item S3-0F-00'): SpeedBooster and ScrewAttack, ('S3-54', 'Item S3-0F-00'): SpeedBooster and ScrewAttack, ('S3-18', 'Item S3-07-0B'): MorphBall and PowerBombs and (GravitySuit or (DamageRuns and (Energy >= 399 and VariaSuit or Energy >= 599))), ('Item S3-07-0B', 'S3-18'): MorphBall and PowerBombs and (GravitySuit or (DamageRuns and Energy >= 199)), ('Item S3-07-0B', 'S3-19'): MorphBall and PowerBombs and (Missiles or ChargeBeam or Ice or ScrewAttack) and (GravitySuit or (DamageRuns and (Energy >= 199 and VariaSuit or Energy >= 299))), ('S3-19', 'Item S3-07-0B'): MorphBall and PowerBombs and (GravitySuit or (DamageRuns and (Energy >= 399 and VariaSuit or Energy >= 599))), ('S3-28', 'Item S3-11-0A'): MorphBall and BombJump and (Ice or SpaceJump) and VariaSuit and WaveBeam, ('S3-28', 'Item S3-12-09'): MorphBall and (Ice or SpaceJump) and VariaSuit and WaveBeam, ('Item S3-11-0A', 'S3-28'): MorphBall and VariaSuit, ('Item S3-11-0A', 'Item S3-12-09'): MorphBall and VariaSuit, ('Item S3-11-0A', 'S3-4B'): MorphBall and VariaSuit, ('Item S3-11-0A', 'S3-4E'): MorphBall and GravitySuit and ScrewAttack, ('Item S3-12-09', 'S3-28'): MorphBall and (UseBombs or SpringBall or SpaceJump) and VariaSuit, ('Item S3-12-09', 'Item S3-11-0A'): MorphBall and VariaSuit, ('Item S3-12-09', 'S3-4B'): MorphBall and (UseBombs or SpringBall or SpaceJump) and VariaSuit, ('Item S3-12-09', 'S3-4E'): MorphBall and GravitySuit and ScrewAttack, ('S3-4B', 'Item S3-11-0A'): MorphBall and BombJump and (Ice or SpaceJump) and VariaSuit, ('S3-4B', 'Item S3-12-09'): MorphBall and (Ice or SpaceJump) and VariaSuit, ('S3-4E', 'Item S3-11-0A'): MorphBall and BombJump and (Ice or SpaceJump) and GravitySuit and ScrewAttack, ('S3-4E', 'Item S3-12-09'): MorphBall and (Ice or SpaceJump) and GravitySuit and ScrewAttack, ('Data S3', 'S3-2C'): GreenDoors, ('S3-32', 'Wide Core-X'): Missiles, ('S3-38', 'Item S3-01-02'): SpeedBooster and (MorphBall and UseBombs or ScrewAttack), ('S3-38', 'S3-57'): ScrewAttack, ('Item S3-01-02', 'S3-38'): MorphBall and UseBombs or ScrewAttack, ('Item S3-01-02', 'Item S3-03-04'): MorphBall and UseBombs or ScrewAttack, ('Item S3-01-02', 'S3-57'): ScrewAttack, ('Item S3-03-04', 'Item S3-01-02'): SpeedBooster and (MorphBall and UseBombs or ScrewAttack), ('Item S3-03-04', 'S3-57'): ScrewAttack, ('S3-57', 'S3-38'): ScrewAttack, ('S3-57', 'Item S3-01-02'): SpeedBooster and ScrewAttack, ('S3-57', 'Item S3-03-04'): ScrewAttack, ('S3-3A', 'Item S3-0B-06'): MorphBall and PowerBombs and (HiJump or Ice or IBJ), ('Item S3-0B-06', 'S3-3A'): MorphBall and PowerBombs and (HiJump or WallJump or IBJ), ('Item S3-0B-06', 'S3-3B'): Impossible, ('Item S3-0B-06', 'S3-3E'): Impossible, ('S3-3B', 'Item S3-0B-06'): MorphBall and PowerBombs and SpeedBooster and (HiJump or Ice or IBJ), ('S3-3E', 'Item S3-0B-06'): MorphBall and PowerBombs and SpeedBooster and (HiJump or Ice or IBJ), ('S3-45', 'Item S3-11-04'): SuperMissiles or PowerBombs or ScrewAttack, ('Item S3-11-04', 'S3-45'): SuperMissiles or PowerBombs or ScrewAttack, ('S3-27', 'Item S3-0E-0A'): MorphBall and UseBombs or ScrewAttack, ('Item S3-0E-0A', 'S3-27'): MorphBall and UseBombs or ScrewAttack, ('Item S3-0E-0A', 'S3-47'): GreenDoors, ('Item S3-0E-0A', 'S3-4A'): (MorphBall and UseBombs or ScrewAttack) and (HiJump and Ice or SpaceJump or IBJ), ('S3-4A', 'Item S3-0E-0A'): MorphBall and UseBombs or ScrewAttack, ('S3-4F', 'Item S3-14-03'): SpeedBooster and GravitySuit and ScrewAttack, ('S3-4F', 'Item S3-14-09'): SpeedBooster and GravitySuit, ('Item S3-14-03', 'S3-4F'): Impossible, ('Item S3-14-03', 'S3-50'): SpeedBooster and GravitySuit and ScrewAttack, ('Item S3-14-09', 'S3-4F'): Impossible, ('Item S3-14-09', 'S3-50'): SpeedBooster and GravitySuit, ('S3-50', 'Item S3-14-03'): Impossible, ('S3-50', 'Item S3-14-09'): Impossible, ('S3-58', 'Item S3-00-05'): MorphBall and UseBombs and (SpringBall or IBJ) or ScrewAttack, ('Item S3-00-05', 'S3-58'): MorphBall and UseBombs and (SpringBall or IBJ) or ScrewAttack, ('Item S3-00-05', 'S3-59'): MorphBall and UseBombs and (SpringBall or IBJ) or ScrewAttack, ('S3-59', 'Item S3-00-05'): MorphBall and UseBombs and (SpringBall or IBJ) or ScrewAttack, ('Data S4', 'S4-0A'): RedDoors, ('S4-0D', 'Item S4-0C-06'): MorphBall and PowerBombs and (WaterLowered or DamageRuns), ('Item S4-0C-06', 'S4-0D'): MorphBall and PowerBombs and (WaterLowered or DamageRuns), ('Item S4-0C-06', 'S4-0E'): MorphBall and PowerBombs and (WaterLowered or DamageRuns), ('Item S4-0C-06', 'S4-12'): MorphBall and PowerBombs and SpeedBooster and (WaterLowered or (DamageRuns and GravitySuit)), ('Item S4-0C-06', 'S4-41'): MorphBall and PowerBombs and (WaterLowered or DamageRuns), ('S4-0E', 'Item S4-0C-06'): MorphBall and PowerBombs and (WaterLowered or DamageRuns) and (SpaceJump or WallJump or IBJ or (SpeedBooster and (WaterLowered or (DamageRuns and GravitySuit)))), ('S4-12', 'Item S4-0C-06'): MorphBall and PowerBombs and SpeedBooster and (WaterLowered or (DamageRuns and GravitySuit)), ('S4-41', 'Item S4-0C-06'): MorphBall and PowerBombs and (SpaceJump or WallJump or IBJ or (SpeedBooster and (WaterLowered or (DamageRuns and 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'): MorphBall and UseBombs, ('S4-1D', 'Item S4-0E-02'): Missiles and MorphBall and UseBombs, ('Item S4-0D-01', 'S4-1D'): Impossible, ('Item S4-0D-01', 'S4-1E'): MorphBall and UseBombs, ('Item S4-0D-01', 'S4-75'): MorphBall and UseBombs, ('Item S4-0E-02', 'S4-1D'): Impossible, ('S4-1E', 'Item S4-0D-01'): MorphBall and UseBombs, ('S4-1E', 'Item S4-0E-02'): Missiles and MorphBall and UseBombs, ('S4-75', 'Item S4-0D-01'): MorphBall and UseBombs, ('S4-75', 'Item S4-0E-02'): Missiles and MorphBall and UseBombs, ('S4-23', 'Item S4-0B-08'): None, ('Item S4-0B-08', 'S4-23'): None, ('S4-26', 'Item S4-0A-0C'): MorphBall and PowerBombs, ('Item S4-0A-0C', 'S4-26'): GravitySuit and (SpaceJump or IBJ), ('Item S4-0A-0C', 'S4-27'): GravitySuit and (SpaceJump or IBJ), ('S4-27', 'Item S4-0A-0C'): MorphBall and PowerBombs, ('S4-30', 'Item S4-07-08'): GravitySuit and ScrewAttack, ('Item S4-07-08', 'S4-30'): GravitySuit and ScrewAttack and RedDoors, ('Item S4-07-08', 'S4-35'): SpeedBooster and GravitySuit and ScrewAttack, ('Item S4-07-08', 'S4-4D'): GravitySuit and ScrewAttack, ('Item S4-07-08', 'S4-4E'): MorphBall, ('S4-35', 'Item S4-07-08'): Impossible, ('S4-4D', 'Item S4-07-08'): GravitySuit and ScrewAttack, ('S4-4E', 'Item S4-07-08'): MorphBall, ('S4-31', 'Item S4-07-0A'): Missiles and MorphBall and (UseBombs and (SpringBall or GravitySuit) or (GravitySuit and ScrewAttack)), ('Item S4-07-0A', 'S4-31'): Missiles and MorphBall and (UseBombs or (GravitySuit and ScrewAttack)) and RedDoors, ('Item S4-07-0A', 'S4-36'): Missiles and MorphBall and (UseBombs or (GravitySuit and ScrewAttack)), ('Item S4-07-0A', 'S4-50'): MorphBall, ('S4-36', 'Item S4-07-0A'): Missiles and MorphBall and (UseBombs and (SpringBall or GravitySuit) or (GravitySuit and 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'): MorphBall and (SpeedBooster or (HiJump and (WaterLowered or (GravitySuit and DamageRuns)))), ('S4-4C', 'Water Pump'): SpeedBooster or (MorphBall and HiJump and GravitySuit and DamageRuns), ('Item S4-00-06', 'S4-4C'): MorphBall and BlueDoors and (WaterLowered and BombJump or (DamageRuns and (SpringBall or (UseBombs and GravitySuit)))), ('Item S4-00-06', 'Water Pump'): MorphBall and DamageRuns and (SpringBall or (UseBombs and GravitySuit)), ('Water Pump', 'S4-4C'): MorphBall and BombJump and BlueDoors and WaterLowered, ('Water Pump', 'Item S4-00-06'): MorphBall and WaterLowered, ('S4-55', 'Item S4-0F-06'): MorphBall and (WaterLowered and (SuperMissiles or PowerBombs or WaveBeam or ScrewAttack) or (DamageRuns and (SuperMissiles or PowerBombs or WaveBeam or (GravitySuit and ScrewAttack)))), ('S4-55', 'S4-5B'): MorphBall and (Diffusion or (WaveBeam and IceBeam)) and (WaterLowered or (DamageRuns and Energy >= 199)), ('S4-55', 'S4-5C'): MorphBall and (Diffusion or (WaveBeam and IceBeam)) and (WaterLowered or (DamageRuns and Energy >= 199)), ('Item S4-0F-06', 'S4-55'): MorphBall and (WaterLowered or (DamageRuns and Energy >= 199)), ('Item S4-0F-06', 'S4-5B'): MorphBall and (Diffusion or (WaveBeam and IceBeam)) and (WaterLowered or (DamageRuns and Energy >= 199)), ('Item S4-0F-06', 'S4-5C'): MorphBall and (Diffusion or (WaveBeam and IceBeam)) and (WaterLowered or (DamageRuns and Energy >= 199)), ('S4-5B', 'S4-55'): MorphBall and (Diffusion or (WaveBeam and IceBeam)) and (WaterLowered or (DamageRuns and Energy >= 199)), ('S4-5B', 'Item S4-0F-06'): MorphBall and (Diffusion or (WaveBeam and IceBeam)) and (WaterLowered and (SuperMissiles or PowerBombs or WaveBeam or ScrewAttack) or (DamageRuns and Energy >= 199 and (SuperMissiles or PowerBombs or WaveBeam or (GravitySuit and ScrewAttack)))), ('S4-5B', 'S4-5C'): WaterLowered or DamageRuns, ('S4-5C', 'S4-55'): MorphBall and (Diffusion or (WaveBeam and IceBeam)) and (WaterLowered or (DamageRuns and Energy >= 199)), ('S4-5C', 'Item S4-0F-06'): MorphBall and (Diffusion or (WaveBeam and IceBeam)) and (WaterLowered and (SuperMissiles or PowerBombs or WaveBeam or ScrewAttack) or (DamageRuns and Energy >= 199 and (SuperMissiles or PowerBombs or WaveBeam or (GravitySuit and ScrewAttack)))), ('S4-5C', 'S4-5B'): WaterLowered or DamageRuns, ('S4-5D', 'Item S4-13-07'): MorphBall and SpeedBooster and GravitySuit and ScrewAttack, ('Item S4-12-07', 'Item S4-13-07'): Impossible, ('Item S4-12-07', 'S4-5E'): MorphBall and GravitySuit and ScrewAttack, ('Item S4-13-07', 'S4-5D'): MorphBall and SpeedBooster and GravitySuit and ScrewAttack, ('Item S4-13-07', 'Item S4-12-07'): MorphBall and GravitySuit and ScrewAttack, ('Item S4-13-07', 'S4-5E'): MorphBall and SpeedBooster and GravitySuit, ('S4-5E', 'Item S4-12-07'): MorphBall and GravitySuit and ScrewAttack, ('S4-5E', 'Item S4-13-07'): MorphBall and SpeedBooster and GravitySuit, ('S4-67', 'Item S4-06-0E'): MorphBall and UseBombs and (SpringBall or (BombJump and GravitySuit)), ('Item S4-06-0E', 'S4-67'): MorphBall and 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'): SpeedBooster and (GravitySuit or (WaveBeam and HiJump and 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'): MorphBall and UseBombs and BombJump, ('Item S5-0C-07', 'S5-17'): MorphBall and UseBombs and BombJump, ('S5-45', 'Item S5-0F-07'): MorphBall and BombJump and VariaSuit, ('Item S5-0F-07', 'S5-45'): MorphBall, ('S5-22', 'Item S5-12-04'): MorphBall and PowerBombs, ('Item S5-12-04', 'S5-22'): MorphBall and UseBombs, ('Item S5-12-04', 'S5-23'): MorphBall and UseBombs, ('Item S5-12-04', 'S5-3D'): MorphBall and UseBombs, ('Item S5-12-04', 'S5-3E'): MorphBall and UseBombs, ('Item S5-12-04', 'S5-77'): MorphBall and UseBombs, ('Item S5-12-04', 'S5-78'): MorphBall and UseBombs, ('S5-23', 'Item S5-12-04'): MorphBall and PowerBombs, ('S5-3D', 'Item S5-12-04'): MorphBall and PowerBombs and (HiJump or IBJ), ('S5-3E', 'Item S5-12-04'): MorphBall and PowerBombs and (HiJump or IBJ), ('S5-77', 'Item S5-12-04'): MorphBall and PowerBombs, ('S5-78', 'Item S5-12-04'): MorphBall and UseBombs, ('S5-3A', 'Nightmare'): Missiles and (ChargeBeam or Difficulty > 0) and (HiJump or SpaceJump), ('S5-3A', 'S5-54'): Impossible, ('Nightmare', 'S5-54'): Impossible, ('S5-54', 'S5-3A'): Missiles and (ChargeBeam or Difficulty > 0) and (HiJump or SpaceJump), ('S5-54', 'Nightmare'): Missiles and (ChargeBeam or Difficulty > 0) and (HiJump or SpaceJump), ('S5-2A', 'Item S5-07-0B'): MorphBall and PowerBombs and VariaSuit, ('S5-6C', 'Item S5-07-0B'): MorphBall and PowerBombs and VariaSuit, ('Item S5-07-0B', 'S5-2A'): MorphBall and PowerBombs and VariaSuit, ('Item S5-07-0B', 'S5-6C'): MorphBall and PowerBombs and VariaSuit, ('Item S5-07-0B', 'S5-6D'): MorphBall and UseBombs and VariaSuit, ('Item S5-07-0B', 'S5-6E'): MorphBall and PowerBombs and VariaSuit and (Ice or SpaceJump or WallJump), ('S5-6D', 'Item S5-07-0B'): MorphBall and UseBombs and VariaSuit, ('S5-6E', 'Item S5-07-0B'): MorphBall and PowerBombs and VariaSuit, ('S5-37', 'Item S5-06-05'): MorphBall and BombJump and Ice and 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'): MorphBall and (UseBombs and SpringBall or ScrewAttack), ('Item S5-05-04', 'S5-03'): MorphBall and UseBombs and YellowDoors, ('Item S5-05-04', 'S5-52'): MorphBall and UseBombs and YellowDoors, ('S5-52', 'Item S5-05-04'): MorphBall and (UseBombs and SpringBall or ScrewAttack), ('S5-1A', 'Item S5-16-04'): Impossible, ('Item S5-16-04', 'S5-1A'): MorphBall and Missiles and ChargeBeam and SpaceJump, ('Item S5-16-04', 'S5-27'): Impossible, ('S5-27', 'Item S5-16-04'): MorphBall and UseBombs, ('S5-4B', 'Item S5-0B-01'): Missiles and MorphBall and (PowerBombs or ScrewAttack), ('Item S5-0B-01', 'S5-4B'): Missiles and MorphBall and (UseBombs or ScrewAttack), ('Item S5-0B-01', 'S5-57'): Missiles and MorphBall and (UseBombs or ScrewAttack), ('Item S5-0B-01', 'S5-58'): Missiles and MorphBall and (UseBombs or ScrewAttack), ('S5-57', 'Item S5-0B-01'): Missiles and MorphBall and (PowerBombs or ScrewAttack), ('S5-58', 'Item S5-0B-01'): Missiles and MorphBall and (PowerBombs or ScrewAttack), ('S5-76', 'Item S5-11-05'): MorphBall and PowerBombs, ('Item S5-11-05', 'S5-76'): MorphBall and PowerBombs, ('S5-73', 'Item S5-14-07'): SpeedBooster and GravitySuit, ('Item S5-14-07', 'S5-7B'): SpeedBooster and GravitySuit, ('S5-7B', 'Item S5-14-07'): SpeedBooster and GravitySuit, ('S5-2F', 'Item S5-0E-08'): MorphBall and VariaSuit and (Ice or SpaceJump), ('Item S5-0E-08', 'S5-2F'): MorphBall and 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'): Missiles and ChargeBeam, ('Mega Core-X', 'S6-19'): GreenDoors, ('S6-34', 'S6-19'): GreenDoors, ('S6-34', 'Mega Core-X'): Missiles and ChargeBeam, ('S6-1D', 'Item S6-05-0B'): MorphBall and UseBombs and (SpringBall or Ice or IBJ), ('Item S6-05-0B', 'S6-1D'): MorphBall and UseBombs, ('S6-1E', 'Wave Core-X'): Missiles and (ChargeBeam or Difficulty > 0) and MorphBall and UseBombs and (SpringBall or PowerBombs) and GravitySuit, ('S6-1E', 'S6-1F'): Missiles and (ChargeBeam or Difficulty > 0) and MorphBall and UseBombs and (SpringBall or PowerBombs) and GravitySuit, ('S6-1E', 'S6-24'): Missiles and (ChargeBeam or Difficulty > 0) and MorphBall and UseBombs and (SpringBall or PowerBombs) and GravitySuit, ('S6-1E', 'S6-57'): Missiles and (ChargeBeam or Difficulty > 0) and MorphBall and UseBombs and (SpringBall or PowerBombs) and GravitySuit and ScrewAttack, ('Wave Core-X', 'S6-1E'): Impossible, ('Wave Core-X', 'S6-57'): Impossible, ('S6-1F', 'S6-1E'): Impossible, ('S6-1F', 'Wave Core-X'): Missiles and (ChargeBeam or Difficulty > 0) and MorphBall and UseBombs and (SpringBall or PowerBombs) and GravitySuit, ('S6-1F', 'S6-24'): Missiles and (ChargeBeam or Difficulty > 0) and MorphBall and UseBombs and (SpringBall or PowerBombs) and GravitySuit, ('S6-1F', 'S6-57'): Impossible, ('S6-24', 'S6-1E'): Impossible, ('S6-24', 'Wave Core-X'): Missiles and (ChargeBeam or Difficulty > 0) and MorphBall and UseBombs and (SpringBall or PowerBombs) and GravitySuit, ('S6-24', 'S6-1F'): Missiles and (ChargeBeam or Difficulty > 0) and MorphBall and UseBombs and (SpringBall or PowerBombs) and GravitySuit, ('S6-24', 'S6-57'): Impossible, ('S6-57', 'S6-1E'): Missiles and (ChargeBeam or Difficulty > 0) and MorphBall and UseBombs and (SpringBall or PowerBombs) and GravitySuit and ScrewAttack, ('S6-57', 'Wave Core-X'): Missiles and (ChargeBeam or Difficulty > 0) and MorphBall and UseBombs and (SpringBall or PowerBombs) and GravitySuit and ScrewAttack, ('S6-57', 'S6-1F'): Missiles and (ChargeBeam or Difficulty > 0) and MorphBall and UseBombs and (SpringBall or PowerBombs) and GravitySuit and ScrewAttack, ('S6-57', 'S6-24'): Missiles and (ChargeBeam or Difficulty > 0) and MorphBall and UseBombs and (SpringBall or PowerBombs) and GravitySuit and ScrewAttack, ('S6-25', 'Item S6-09-05'): MorphBall and UseBombs and HiJump and ScrewAttack and (Diffusion or (WaveBeam and IceBeam)), ('S6-25', 'Item S6-0A-06'): WaveBeam, ('Item S6-09-05', 'S6-25'): MorphBall and UseBombs and ScrewAttack, ('Item S6-09-05', 'S6-58'): MorphBall and UseBombs, ('Item S6-0A-06', 'S6-25'): WaveBeam, ('Item S6-0A-06', 'S6-58'): HiJump and ScrewAttack, ('S6-58', 'Item S6-09-05'): MorphBall and UseBombs and (Diffusion or (WaveBeam and IceBeam)), ('S6-58', 'Item S6-0A-06'): WaveBeam and ScrewAttack, ('S6-31', 'Item S6-0E-03'): MorphBall and UseBombs, ('Item S6-0E-03', 'S6-31'): MorphBall and UseBombs, ('Data S6', 'S6-35'): GreenDoors, ('Data S6', 'S6-3E'): GreenDoors, ('Item S6-06-08', 'S6-36'): MorphBall and UseBombs, ('S6-36', 'Item S6-06-08'): MorphBall and PowerBombs, ('S6-3F', 'Item S6-0C-08'): Impossible, ('S6-3F', 'Item S6-0B-09'): MorphBall and (SpaceJump or IBJ or 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'): MorphBall and (SpaceJump or IBJ or WallJump), ('S6-42', 'Item S6-0B-09'): MorphBall, ('S6-4C', 'Item S6-08-03'): MorphBall and UseBombs, ('Item S6-08-03', 'S6-4C'): MorphBall and UseBombs and SpringBall, ('S6-56', 'Item S6-0E-04'): MorphBall and Bombs and SpeedBooster, ('Item S6-0E-04', 'S6-56'): MorphBall and Bombs and SpeedBooster, ('S6-5A', 'Item S6-03-04'): SpeedBooster, ('S6-5A', 'Item S6-01-06'): SpeedBooster and SpaceJump, ('Item S6-03-04', 'S6-5A'): SpeedBooster, ('Item S6-01-06', 'S6-5A'): SpeedBooster, ('S5-4D', 'S5-50'): SpeedBooster and GravitySuit or (HiJump and WaveBeam and YellowDoors), ('S5-0A', 'S5-0C'): SpeedBooster and GravitySuit or (HiJump and WaveBeam and YellowDoors), ('S5-03', 'S5-0B'): YellowDoors and SpeedBooster and GravitySuit or (HiJump and WaveBeam), ('S5-55', 'S5-1F'): SpeedBooster and GravitySuit or (HiJump and WaveBeam and YellowDoors), ('S5-37', 'S5-39'): SpeedBooster and GravitySuit or (HiJump and WaveBeam and YellowDoors), ('S5-24', 'S5-1C'): SpeedBooster and GravitySuit or (HiJump and WaveBeam and YellowDoors), ('S5-15', 'S5-1D'): SpeedBooster and GravitySuit or (HiJump and WaveBeam and YellowDoors), ('S5-64', 'S5-46'): YellowDoors and SpeedBooster and GravitySuit or (HiJump and WaveBeam), ('S5-56', 'S5-5C'): YellowDoors and SpeedBooster and GravitySuit or (HiJump and 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: if 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', depth=250) if path != None: enable_item(graph, 'BlueDoors') path = graph.get_path('Security-Level-1', StartLocation, depth=250) if path == None: disable_item(graph, 'BlueDoors') if GreenDoors == False: path = graph.get_path(StartLocation, 'Security-Level-2', depth=250) if path != None: enable_item(graph, 'GreenDoors') path = graph.get_path('Security-Level-2', StartLocation, depth=250) 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', depth=250) if path != None: enable_item(graph, 'YellowDoors') path = graph.get_path('Security-Level-3', StartLocation, depth=250) 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', depth=250) if path != None: enable_item(graph, 'RedDoors') path = graph.get_path('Security-Level-4', StartLocation, depth=250) 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 MaxETanks global MissileCount global NettoriOpen global PlacedETanks global PlacedMissiles global PlacedPowerBombs global areaLayout 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...') while 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: while areaLayout[2] != 1 and areaLayout[2] != 2 and areaLayout[3] != 1 and areaLayout[3] != 2: attemptedLayouts.append(areaLayout) while areaLayout in attemptedLayouts: areaLayout = random.sample(range(1, 7), 6) else: while areaLayout in attemptedLayouts: areaLayout = random.sample(range(1, 7), 6) 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: break if path == None: sys.exit('No accessible locations found with this start, try changing your game settings.') 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) break 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') weightInit = True if len(availableItems) < 1: sys.exit('No accessible locations found with this start, try changing your game settings.') 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]: if location not in locationsPerArea[area]: locationsPerArea[area].append(location) for area in range(0, 7): if len(locationsPerArea[area]) > 0: areaWeights[area] = weightValue[area] / len(locationsPerArea[area]) for location in AccessibleLocations: for area in range(0, 7): if location in AreaItemLocations[area]: locationWeights.append(areaWeights[area]) 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 while 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 if FirstItem == 'MainMissiles': if 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': if 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: if location not in AccessibleLocations: if location == 'Data S0' or location == 'Item S0-05-16': path = graph.get_path(location, StartLocation, depth=250) else: for area in range(0, 7): if location in AreaItemLocations[area]: if AreaOpen[area]: path = graph.get_path(AreaOpen[area], location, True) break if path != None: AccessibleLocations.append(location) MajorLocations.remove(location) newLocations.append(location) for area in range(0, 7): if location in AreaItemLocations[area]: if location not in locationsPerArea[area]: locationsPerArea[area].append(location) for area in range(0, 7): if len(locationsPerArea[area]) > 0: if 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]: if 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, weights=MajorWeights, k=1)[0] currentItemWeight = MajorWeights.pop(MajorList.index(item)) MajorList.remove(item) enable_item(graph, item) if SeedSettings['DamageRuns']: Energy = Energy / 2 while path == None and len(AccessibleLocations) > 0: itemLocation = random.choices(AccessibleLocations, weights=locationWeights, k=1)[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, depth=250) else: for area in range(0, 7): if itemLocation in AreaItemLocations[area]: if AreaOpen[area]: path = graph.get_path(itemLocation, AreaOpen[area], True) break if itemLocation in BossLocations: if 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, depth=250) if missilePath != None: missilePath = graph.get_path(missileLocation, StartLocation, depth=250) else: for area in range(0, 7): if missileLocation in AreaItemLocations[area]: if AreaOpen[area]: missilePath = graph.get_path(AreaOpen[area], missileLocation, True) if missilePath != None: missilePath = graph.get_path(missileLocation, AreaOpen[area], True) break if missilePath != None: PossibleMissileTanks.append(missileLocation) else: for missileLocation in AccessibleLocations: missilePath = None if missileLocation == 'Data S0' or missileLocation == 'Item S0-05-16': missilePath = graph.get_path(missileLocation, StartLocation, depth=250) else: for area in range(0, 7): if missileLocation in AreaItemLocations[area]: if AreaOpen[area]: missilePath = graph.get_path(missileLocation, AreaOpen[area], True) break if missilePath != None: if missileLocation not in BossLocations: PossibleMissileTanks.append(missileLocation) 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) 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 if item == 'MainMissiles': if 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': if SeedSettings['PowerBombsWithoutBombs'] == False: MajorList.append('MainPowerBombs') MajorWeights.append(WeightedMajors.get('MainPowerBombs')) if SeedSettings['MajorMinor'] == False: if len(AccessibleLocations) > 3: if 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 print('Game is beatable, placing remaining items (no logic)') for item in MajorItems: if item not in PlacedItems: if item not in MajorList: MajorList.append(item) MajorWeights.append(WeightedMajors.get(item)) MajorLocations.extend(AccessibleLocations) for item in MajorList: if item not in PlacedItems: location = random.choice(MajorLocations) while location in UsedLocations: MajorLocations.remove(location) location = random.choice(MajorLocations) UsedLocations.append(location) PlacedItems.append(item) if SeedSettings['MajorMinor']: for location in MajorLocations: if PlacedETanks < MaxETanks: if location not in UsedLocations: UsedLocations.append(location) PlacedItems.append(MinorItems[0]) PlacedETanks += 1 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: if 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') patch_game() def patch_game(): global FileName, BaseGame 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: error = False with open(BaseGame, 'rb') as source: with open(os.path.join('.', 'seeds', '{}.gba'.format(FileName)), 'wb') as target: with open(os.path.join('.', 'data', 'MFOR.bps'), 'rb') as patch: try: apply_to_files(patch, source, target) except Exception: error = True if error: os.remove(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.remove(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) with open(os.path.join('.', 'seeds', '{}.gba'.format(FileName)), 'rb+') as patchedGame: if Debug: sym = dict() sym.clear() with open(os.path.join('.', 'data', 'asm', 'temp.sym'), 'r') as symFile: for line in symFile: x = line.split() if len(x) > 1 and re.search('^[a-zA-Z]', x[1]): sym.update({ x[1]: x[0][2:] }) os.remove(os.path.join('.', 'data', 'asm', 'temp.sym')) roomEventOffset = int(sym.get('t_bossanddownloadevents'), 16) itemEventOffset = int(sym.get('t_obtainitemevents'), 16) securityOffset = int(sym.get('b_unlocklowerlevels'), 16) print('roomEventOffset: 0x{:06X}'.format(roomEventOffset)) print('itemEventOffset: 0x{:06X}'.format(itemEventOffset)) print('securityOffset: 0x{:06X}'.format(securityOffset)) else: roomEventOffset = 8326320 itemEventOffset = 5726112 securityOffset = 479192 for area in RoomNodes: areaIndex = list(RoomNodes.keys()).index(area) for node in RoomNodes[area]: name = node.get('Name') nodeType = node.get('Type') if nodeType != None: itemName = '' if 'Tank' in nodeType: itemName = PlacedItems[UsedLocations.index(name)] bg1 = int(node.get('BG1'), 16) clipdata = int(node.get('Clipdata'), 16) tileset = int(node.get('Tileset'), 16) if SeedSettings['HideItems']: if tileset == 33: blockValue = 7 elif tileset == 34: blockValue = 7 elif tileset == 40: blockValue = 7 elif tileset == 42: blockValue = 7 else: blockValue = 3 else: blockValue = ItemList.index(itemName) if blockValue < 2: blockValue = blockValue ^ 1 elif blockValue > 2: if tileset == 33: blockValue = 7 elif tileset == 34: blockValue = 7 elif tileset == 40: blockValue = 7 elif tileset == 42: blockValue = 7 else: blockValue = 3 blockValue += 70 if tileset == 9: blockValue += 1 elif tileset == 11: blockValue += 1 elif tileset == 25: blockValue += 1 elif tileset >= 30 and tileset <= 34: blockValue += 1 elif tileset == 40: blockValue += 1 elif tileset == 42: blockValue += 1 elif tileset == 48: blockValue += 1 elif tileset == 49: blockValue += 1 elif tileset == 52: blockValue += 1 elif tileset == 56: blockValue += 1 elif tileset == 61: blockValue += 1 elif tileset == 62: blockValue += 1 elif tileset == 64: blockValue += 1 elif tileset == 67: blockValue += 1 elif tileset == 72: blockValue += 1 clipValue = ItemList.index(itemName) if clipValue < 2: # Energy Tank or Missile Tank clipValue = clipValue ^ 99 if 'Hidden' in nodeType: clipValue += 2 elif 'Underwater' in nodeType: clipValue += 4 elif clipValue == 2: clipValue = 104 if 'Hidden' in nodeType: clipValue += 1 elif 'Underwater' in nodeType: clipValue += 2 elif clipValue >= 3: clipValue = (clipValue - 3)*3 + 120 if 'Hidden' in nodeType: clipValue += 1 elif 'Underwater' in nodeType: clipValue += 2 if 'Hidden' not in nodeType: patchedGame.seek(bg1) patchedGame.write(blockValue.to_bytes(1, 'little')) patchedGame.seek(clipdata) patchedGame.write(clipValue.to_bytes(1, 'little')) elif 'Boss' in nodeType or 'Data' in nodeType: itemName = PlacedItems[UsedLocations.index(name)] itemValue = ItemList.index(itemName) slot = BossDataList.index(name) roomEvent = roomEventOffset if roomEvent != None: roomEvent = roomEvent + 3 + slot*4 if itemValue < 3: itemValue += 1 else: itemValue -= 3 itemEvent = itemEventOffset if itemEvent != None: itemEvent = itemEvent + 1 + itemValue patchedGame.seek(itemEvent) itemValue = int.from_bytes(patchedGame.read(1), 'little') patchedGame.seek(roomEvent) patchedGame.write(itemValue.to_bytes(1, 'little')) if name == 'Data S5': roomEvent = roomEventOffset roomEvent = roomEvent + 3 + (slot + 1)*4 patchedGame.seek(roomEvent) patchedGame.write(itemValue.to_bytes(1, 'little')) if itemName in MajorItems: offset = CreditsOffsets.get(itemName) if 'Boss' in nodeType: location = name else: if 'S0' in name: location = 'Main Deck : ' else: location = 'Sector {} : '.format(name[6:7]) if 'Tank' in nodeType: location = location + name[8:] else: location = location + nodeType + ' Room' spaces = ceiling(30 - len(location), 2) location = ' '*spaces + location patchedGame.seek(offset) patchedGame.write(location.encode('ascii')) for x in range(len(location), 35): patchedGame.write((0).to_bytes(1, 'little')) if SeedSettings['HideItems']: patchedGame.seek(3926048) patchedGame.write((76).to_bytes(2, 'little')) patchedGame.write((77).to_bytes(2, 'little')) patchedGame.write((78).to_bytes(2, 'little')) patchedGame.write((79).to_bytes(2, 'little')) patchedGame.write((76).to_bytes(2, 'little')) patchedGame.write((77).to_bytes(2, 'little')) patchedGame.write((78).to_bytes(2, 'little')) patchedGame.write((79).to_bytes(2, 'little')) patchedGame.write((76).to_bytes(2, 'little')) patchedGame.write((77).to_bytes(2, 'little')) patchedGame.write((78).to_bytes(2, 'little')) patchedGame.write((79).to_bytes(2, 'little')) if SeedSettings['SplitSecurity'] == True: security = securityOffset patchedGame.seek(security) patchedGame.write((0).to_bytes(2, 'little')) if SeedSettings['MissilesWithoutMainData']: patchedGame.seek(24828) patchedGame.write((15).to_bytes(1, 'little')) patchedGame.seek(395742) patchedGame.write((15).to_bytes(1, 'little')) patchedGame.seek(465582) patchedGame.write((15).to_bytes(1, 'little')) if SeedSettings['PowerBombsWithoutBombs']: patchedGame.seek(24756) patchedGame.write((32).to_bytes(1, 'little')) patchedGame.seek(465672) patchedGame.write((32).to_bytes(1, 'little')) if SeedSettings['SectorShuffle'] == True: for currentArea in range(7): patchedGame.seek(7977108 + currentArea * 4, 0) data = patchedGame.read(4) unpacked = struct.unpack(' repeat: repeat = settings['Num'] settings.pop('Num') if settings['Patch']: Patch = True else: Patch = False settings.pop('Patch') for loop in range(repeat): initialize() SeedSettings = settings.copy() if Debug: print('Debug generation enabled') if loop > 0: SeedValue = str(random.randrange(sys.maxsize)) Difficulty = SeedSettings['Difficulty'] DamageRuns = SeedSettings['DamageRuns'] random.seed(SeedValue + str(SeedSettings)) World = Graph.Game(BaseGame) World.RemoveNodeFromRoom('Room-S2-07', 'S2-10') World.RemoveNodeFromRoom('Room-S2-0D', 'S2-1E') World.RemoveNodeFromRoom('Room-S3-07', 'S3-10') World.RemoveNodeFromRoom('Room-S3-12', 'S3-2B') World.RemoveNodeFromRoom('Room-S5-15', 'S5-2A') World.AddNodeToRoom('Room-S2-1F', 'S2-10') World.AddNodeToRoom('Room-S2-2E', 'S2-1E') World.AddNodeToRoom('Room-S3-16', 'S3-10') World.AddNodeToRoom('Room-S3-17', 'S3-2B') World.AddNodeToRoom('Room-S5-16', 'S5-2A') World.UpdateDoorConnection('S0-4A', 'S0-61') World.UpdateDoorConnection('S0-96', 'S0-22') World.UpdateDoorConnection('S0-98', 'S0-20') World.UpdateDoorConnection('S2-13', 'S2-45') World.UpdateDoorConnection('S2-19', 'S2-2F') World.UpdateDoorConnection('S2-1B', 'S2-68') World.UpdateDoorConnection('S2-23', 'S2-69') World.UpdateDoorConnection('S2-5F', 'S2-6A') World.UpdateDoorConnection('S2-6E', 'S2-70') World.UpdateDoorConnection('S3-2D', 'S3-2E') World.UpdateDoorConnection('S5-28', 'S5-6C') AreaItemLocations = list() for area in range(7): AreaItemLocations.append(list()) with open(os.path.join('.', 'data', 'NodeData.json')) as jsonFile: RoomNodes = json.load(jsonFile) for area in RoomNodes: areaIndex = list(RoomNodes.keys()).index(area) for node in RoomNodes[area]: name = node.get('Name') room = node.get('Room') item = node.get('Item') nodeType = node.get('Type') World.AddNodeToRoom('Room-S{}-{:02X}'.format(areaIndex, int(room, 16)), name) if item == 'Missile' or item == 'Power Bomb': World.add_to_minors(name) elif nodeType == 'Boss': World.add_to_majors(name) BossLocations.append(name) elif nodeType == 'Data' or item == 'E-Tank': World.add_to_majors(name) if name == 'Data S3': BossLocations.append(name) if 'Item' in name or nodeType == 'Boss' or nodeType == 'Data': AreaItemLocations[areaIndex].append(name) World.ConnectAllNodes() StartLocation = 'S0-00' startTime = time.time() randomize_game(World) seedTime = time.time() - startTime print(str(FileName)) print('Randomized in:', seedTime) totalRandoTime = time.time() - totalRandoTime print('All seeds took:', totalRandoTime) return FileName