Merge branch 'OriginOverworldShuffle' into OverworldShuffle

This commit is contained in:
2024-02-28 16:53:09 -06:00
98 changed files with 9378 additions and 1273 deletions

View File

@@ -48,11 +48,13 @@ class CustomSettings(object):
meta = defaultdict(lambda: None, self.file_source['meta'])
return meta['players']
def adjust_args(self, args):
def adjust_args(self, args, resolve_weighted=True):
def get_setting(value: Any, default):
if value or value == 0:
if isinstance(value, dict):
return random.choices(list(value.keys()), list(value.values()), k=1)[0]
if resolve_weighted:
return random.choices(list(value.keys()), list(value.values()), k=1)[0]
return None
else:
return value
return default
@@ -79,6 +81,10 @@ class CustomSettings(object):
args.ow_shuffle[p] = get_setting(settings['ow_shuffle'], args.ow_shuffle[p])
args.ow_terrain[p] = get_setting(settings['ow_terrain'], args.ow_terrain[p])
args.ow_crossed[p] = get_setting(settings['ow_crossed'], args.ow_crossed[p])
if args.ow_crossed[p] == 'chaos':
import logging
logging.getLogger('').info("Crossed OWR option 'chaos' is deprecated. Use 'unrestricted' instead.")
args.ow_crossed[p] = 'unrestricted'
args.ow_keepsimilar[p] = get_setting(settings['ow_keepsimilar'], args.ow_keepsimilar[p])
args.ow_mixed[p] = get_setting(settings['ow_mixed'], args.ow_mixed[p])
args.ow_whirlpool[p] = get_setting(settings['ow_whirlpool'], args.ow_whirlpool[p])
@@ -143,8 +149,8 @@ class CustomSettings(object):
args.mapshuffle[p] = True
args.compassshuffle[p] = True
args.shufflebosses[p] = get_setting(settings['boss_shuffle'], args.shufflebosses[p])
args.shuffleenemies[p] = get_setting(settings['enemy_shuffle'], args.shuffleenemies[p])
args.shufflebosses[p] = get_setting(settings['boss_shuffle'], get_setting(settings['shufflebosses'], args.shufflebosses[p]))
args.shuffleenemies[p] = get_setting(settings['enemy_shuffle'], get_setting(settings['shuffleenemies'], args.shuffleenemies[p]))
args.enemy_health[p] = get_setting(settings['enemy_health'], args.enemy_health[p])
args.enemy_damage[p] = get_setting(settings['enemy_damage'], args.enemy_damage[p])
args.shufflepots[p] = get_setting(settings['shufflepots'], args.shufflepots[p])
@@ -163,6 +169,7 @@ class CustomSettings(object):
args.triforce_min_difference[p] = get_setting(settings['triforce_min_difference'], args.triforce_min_difference[p])
args.triforce_max_difference[p] = get_setting(settings['triforce_max_difference'], args.triforce_max_difference[p])
args.beemizer[p] = get_setting(settings['beemizer'], args.beemizer[p])
args.aga_randomness[p] = get_setting(settings['aga_randomness'], args.aga_randomness[p])
# mystery usage
args.usestartinventory[p] = get_setting(settings['usestartinventory'], args.usestartinventory[p])
@@ -179,6 +186,8 @@ class CustomSettings(object):
args.ow_palettes[p] = get_setting(settings['ow_palettes'], args.ow_palettes[p])
args.uw_palettes[p] = get_setting(settings['uw_palettes'], args.uw_palettes[p])
args.shuffle_sfx[p] = get_setting(settings['shuffle_sfx'], args.shuffle_sfx[p])
args.shuffle_sfxinstruments[p] = get_setting(settings['shuffle_sfxinstruments'], args.shuffle_sfxinstruments[p])
args.shuffle_songinstruments[p] = get_setting(settings['shuffle_songinstruments'], args.shuffle_songinstruments[p])
args.msu_resume[p] = get_setting(settings['msu_resume'], args.msu_resume[p])
def get_item_pool(self):
@@ -196,6 +205,21 @@ class CustomSettings(object):
return self.file_source['advanced_placements']
return None
def get_owedges(self):
if 'ow-edges' in self.file_source:
return self.file_source['ow-edges']
return None
def get_owcrossed(self):
if 'ow-crossed' in self.file_source:
return self.file_source['ow-crossed']
return None
def get_whirlpools(self):
if 'ow-whirlpools' in self.file_source:
return self.file_source['ow-whirlpools']
return None
def get_owtileflips(self):
if 'ow-tileflips' in self.file_source:
return self.file_source['ow-tileflips']
@@ -242,10 +266,11 @@ class CustomSettings(object):
self.world_rep['meta'] = meta_dict
meta_dict['players'] = world.players
meta_dict['algorithm'] = world.algorithm
meta_dict['seed'] = world.seed
meta_dict['race'] = settings.race
meta_dict['user_notes'] = settings.notes
self.world_rep['settings'] = settings_dict
if world.precollected_items:
self.world_rep['start_inventory'] = start_inv = {}
for p in self.player_range:
settings_dict[p] = {}
settings_dict[p]['ow_shuffle'] = world.owShuffle[p]
@@ -290,8 +315,8 @@ class CustomSettings(object):
settings_dict[p]['keyshuffle'] = world.keyshuffle[p]
settings_dict[p]['mapshuffle'] = world.mapshuffle[p]
settings_dict[p]['compassshuffle'] = world.compassshuffle[p]
settings_dict[p]['shufflebosses'] = world.boss_shuffle[p]
settings_dict[p]['shuffleenemies'] = world.enemy_shuffle[p]
settings_dict[p]['boss_shuffle'] = world.boss_shuffle[p]
settings_dict[p]['enemy_shuffle'] = world.enemy_shuffle[p]
settings_dict[p]['enemy_health'] = world.enemy_health[p]
settings_dict[p]['enemy_damage'] = world.enemy_damage[p]
settings_dict[p]['shufflepots'] = world.potshuffle[p]
@@ -303,6 +328,11 @@ class CustomSettings(object):
settings_dict[p]['triforce_goal'] = world.treasure_hunt_count[p]
settings_dict[p]['triforce_pool'] = world.treasure_hunt_total[p]
settings_dict[p]['beemizer'] = world.beemizer[p]
settings_dict[p]['aga_randomness'] = world.aga_randomness[p]
if world.precollected_items:
start_inv[p] = []
for item in world.precollected_items:
start_inv[item.player].append(item.name)
# rom adjust stuff
# settings_dict[p]['sprite'] = world.sprite[p]
@@ -315,34 +345,42 @@ class CustomSettings(object):
# settings_dict[p]['ow_palettes'] = world.ow_palettes[p]
# settings_dict[p]['uw_palettes'] = world.uw_palettes[p]
# settings_dict[p]['shuffle_sfx'] = world.shuffle_sfx[p]
# settings_dict[p]['shuffle_songinstruments'] = world.shuffle_songinstruments[p]
# more settings?
def record_info(self, world):
self.world_rep['meta']['seed'] = world.seed
self.world_rep['bosses'] = bosses = {}
self.world_rep['start_inventory'] = start_inv = {}
self.world_rep['medallions'] = medallions = {}
for p in self.player_range:
bosses[p] = {}
start_inv[p] = []
medallions[p] = {}
for dungeon in world.dungeons:
for level, boss in dungeon.bosses.items():
location = dungeon.name if level is None else f'{dungeon.name} ({level})'
if boss and 'Agahnim' not in boss.name:
bosses[dungeon.player][location] = boss.name
for item in world.precollected_items:
start_inv[item.player].append(item.name)
def record_item_pool(self, world):
self.world_rep['item_pool'] = item_pool = {}
self.world_rep['medallions'] = medallions = {}
for p in self.player_range:
item_pool[p] = defaultdict(int)
medallions[p] = {}
for item in world.itempool:
item_pool[item.player][item.name] += 1
for p, req_medals in world.required_medallions.items():
medallions[p]['Misery Mire'] = req_medals[0]
medallions[p]['Turtle Rock'] = req_medals[1]
def record_item_pool(self, world, use_custom_pool=False):
if not use_custom_pool or world.custom:
self.world_rep['item_pool'] = item_pool = {}
for p in self.player_range:
if not use_custom_pool or p in world.customitemarray:
item_pool[p] = defaultdict(int)
if use_custom_pool and world.custom:
import source.classes.constants as CONST
for p in world.customitemarray:
for i, c in world.customitemarray[p].items():
if c > 0:
item = CONST.CUSTOMITEMLABELS[CONST.CUSTOMITEMS.index(i)]
item_pool[p][item] += c
else:
for item in world.itempool:
item_pool[item.player][item.name] += 1
def record_item_placements(self, world):
self.world_rep['placements'] = placements = {}
for p in self.player_range:
@@ -355,21 +393,40 @@ class CustomSettings(object):
placements[location.player][location.name] = location.item.name
def record_overworld(self, world):
self.world_rep['ow-edges'] = edges = {}
self.world_rep['ow-whirlpools'] = whirlpools = {}
self.world_rep['ow-tileflips'] = flips = {}
for p in self.player_range:
if p in world.owswaps and len(world.owswaps[p][0]) > 0:
flips[p] = {}
flips[p]['force_flip'] = list(HexInt(f) for f in world.owswaps[p][0] if f < 0x40 or f >= 0x80)
flips[p]['force_flip'].sort()
flips[p]['undefined_chance'] = 0
self.world_rep['ow-flutespots'] = flute = {}
for p in self.player_range:
connections = edges[p] = {}
connections['two-way'] = {}
connections['one-way'] = {}
whirlconnects = whirlpools[p] = {}
whirlconnects['two-way'] = {}
whirlconnects['one-way'] = {}
# tile flips
if p in world.owswaps and len(world.owswaps[p][0]) > 0:
flips[p] = {}
flips[p]['force_flip'] = list(HexInt(f) for f in world.owswaps[p][0] if f & 0x40 == 0)
flips[p]['force_flip'].sort()
flips[p]['undefined_chance'] = 0
# flute spots
flute[p] = {}
if p in world.owflutespots:
flute[p]['force'] = list(HexInt(id) for id in sorted(world.owflutespots[p]))
else:
flute[p]['force'] = list(HexInt(id) for id in sorted(default_flute_connections))
flute[p]['forbid'] = []
for key, data in world.spoiler.overworlds.items():
player = data['player'] if 'player' in data else 1
connections = edges[player]
sub = 'two-way' if data['direction'] == 'both' else 'one-way'
connections[sub][data['entrance']] = data['exit']
for key, data in world.spoiler.whirlpools.items():
player = data['player'] if 'player' in data else 1
whirlconnects = whirlconnects[player]
sub = 'two-way' if data['direction'] == 'both' else 'one-way'
whirlconnects[sub][data['entrance']] = data['exit']
def record_entrances(self, world):
self.world_rep['entrances'] = entrances = {}

View File

@@ -1,9 +1,9 @@
from enum import IntEnum
import random
from Utils import int16_as_bytes, snes_to_pc
class SFX(object):
def __init__(self, name, sfx_set, orig_id, addr, chain, accomp=False):
self.name = name
self.sfx_set = sfx_set
@@ -16,6 +16,91 @@ class SFX(object):
self.target_id = None
self.target_chain = None
class SPCMusicType(IntEnum):
NONE = 0x00,
Ambient = 0x01,
Melody = 0x02,
Rhythm = 0x04,
Beat = 0x08
class SFXType(IntEnum):
NONE = 0x00,
Ambient = 0x01,
Melody = 0x02,
Beat = 0x04,
Short = 0x08,
Long = 0x10,
Soft = 0x20,
Hard = 0x40,
ALL = 0xFF
class Instrument(object):
def __init__(self, name, id, srcn, adsr, gain, mult):
self.name = name
self.id = id
self.srcn = srcn
self.adsr = adsr
self.gain = gain
self.mult = mult
self.primary_type = 0
self.target_id = None
self.replacements = []
def add_type(self, type, force_primary):
if force_primary or self.type == 0:
self.primary_type |= type
self.type |= type
return self
class SFXInstrument(Instrument):
def __init__(self, name, id, srcn, adsr, gain, mult):
Instrument.__init__(self, name, id, srcn, adsr, gain, mult)
self.type = SFXType.NONE
def amb(self, force_primary=False): return self.add_type(SFXType.Ambient, force_primary)
def mel(self, force_primary=False): return self.add_type(SFXType.Melody, force_primary)
def beat(self, force_primary=False): return self.add_type(SFXType.Beat, force_primary)
def short(self, force_primary=False): return self.add_type(SFXType.Short, force_primary)
def long(self, force_primary=False): return self.add_type(SFXType.Long, force_primary)
def soft(self, force_primary=False): return self.add_type(SFXType.Soft, force_primary)
def hard(self, force_primary=False): return self.add_type(SFXType.Hard, force_primary)
class SPCInstrument(Instrument):
def __init__(self, name, srcn, adsr, gain, mult, min=9999, max=0):
Instrument.__init__(self, name, srcn, srcn, adsr, gain, mult)
self.type = SPCMusicType.NONE
def amb(self, force_primary=False): return self.add_type(SPCMusicType.Ambient, force_primary)
def mel(self, force_primary=False): return self.add_type(SPCMusicType.Melody, force_primary)
def bass(self, force_primary=False): return self.add_type(SPCMusicType.Rhythm, force_primary)
def beat(self, force_primary=False): return self.add_type(SPCMusicType.Beat, force_primary)
class InstrumentChange(object):
def __init__(self, orig_instrument, type, ban=[], inc=[]):
self.orig_instrument = orig_instrument
self.type = type
self.banned_list = ban
self.include_list = inc
self.target_instrument = None
class SFXInstrumentChange(InstrumentChange):
def __init__(self, sfx_set, sfx_id, orig_instrument, addresses, type=SFXType.Ambient | SFXType.Melody | SFXType.Beat, ban=[], inc=[]):
InstrumentChange.__init__(self, orig_instrument, type, ban, inc)
self.sfx_set = sfx_set
self.sfx_id = sfx_id
self.addresses = addresses
class SPCInstrumentChange(InstrumentChange):
def __init__(self, song_id, segment_id, tracks, orig_instrument, type=SPCMusicType.NONE, ban=[], inc=[]):
InstrumentChange.__init__(self, orig_instrument, type, ban, inc)
self.song_id = song_id
self.segment_id = segment_id
self.tracks = tracks
def init_sfx_data():
sfx_pool = [SFX('Slash1', 0x02, 0x01, 0x2614, []), SFX('Slash2', 0x02, 0x02, 0x2625, []),
@@ -178,3 +263,878 @@ def randomize_sfx(rom):
last = chained
rom.write_byte(ac_base + last - 1, 0)
def output_song_data(rom, filepath, outfilebase):
with open(filepath, 'w') as outfile:
last_song = 0
last_segment = -1
outfile.write(f'{outfilebase}\n')
if "SFX" in filepath:
for change in sfx_instrument_changes:
outfile.write(f'\nSFX{change.sfx_set:1d}.{change.sfx_id:02X} = {rom.read_byte(snes_to_pc(change.addresses[0])):02X}')
else:
for change in spc_instrument_changes:
if last_song != change.song_id:
last_song = change.song_id
last_segment = change.segment_id
outfile.write(f'\nSong{change.song_id:02X}.{change.segment_id:02X}.')
elif last_segment != change.segment_id:
last_segment = change.segment_id
outfile.write(f'\n {change.segment_id:02X}.')
else:
outfile.write(f'\n ')
tracks = 8
for track_id in change.tracks.keys():
outfile.write(f'{track_id:01X}')
tracks -= 1
if tracks > 0:
outfile.write(' ' * tracks)
outfile.write(f' = {rom.read_byte(snes_to_pc(next(iter(change.tracks.values()))[0])):02X}')
def prep_instruments(instruments, types):
for instrument in instruments.values():
for ins, lst in types.items():
if instrument.type & ins > 0:
lst.append(instrument)
if hasattr(instruments[0], 'primary_type'):
for instrument in instruments.values():
for ins, lst in types.items():
if instrument.primary_type & ins > 0:
instrument.replacements += [i for i in lst if i not in instrument.replacements]
def shuffle_instruments(instrument_changes, instruments, types, match_patterns=[0xFF]):
# randomize each instrument change
for change in instrument_changes:
if type(change.type) is list:
candidates = [instruments[i] for i in change.type]
elif change.type != 0:
candidates = []
for n, match in enumerate(match_patterns):
cand = []
for ins, lst in types.items():
if match & ins > 0 and (change.type & ins > 0 or (n == 0 and change.type & match == 0)):
cand += [i for i in lst if i not in cand]
if n == 0:
if not len(cand):
for ins, lst in types.items():
if match & ins > 0:
cand += [i for i in lst if i not in cand]
candidates = cand.copy()
elif len(cand):
candidates = [i for i in cand if i in candidates]
else:
candidates = instruments[change.orig_instrument].replacements
candidates += [instruments[i] for i in change.include_list if instruments[i] not in candidates]
candidates = [i for i in candidates if i.id not in change.banned_list]
change.target_instrument = random.choice(candidates).id
def randomize_sfxinstruments(rom):
# categorize instruments in pools
ambients, melodies, beats, shorts, longs, softs, hards = [], [], [], [], [], [], []
inst_lists = {
SFXType.Ambient: ambients,
SFXType.Melody: melodies,
SFXType.Beat: beats,
SFXType.Short: shorts,
SFXType.Long: longs,
SFXType.Soft: softs,
SFXType.Hard: hards,
}
match_patterns = [SFXType.Ambient | SFXType.Melody | SFXType.Beat,
SFXType.Short | SFXType.Long,
SFXType.Soft | SFXType.Hard]
prep_instruments(sfx_instruments, inst_lists)
shuffle_instruments(sfx_instrument_changes, sfx_instruments, inst_lists, match_patterns)
for change in sfx_instrument_changes:
for addr in change.addresses:
rom.write_byte(snes_to_pc(addr), change.target_instrument)
def randomize_songinstruments(rom):
# categorize instruments in pools
ambients, melodies, rhythms, beats = [], [], [], []
inst_lists = {
SPCMusicType.Ambient: ambients,
SPCMusicType.Melody: melodies,
SPCMusicType.Rhythm: rhythms,
SPCMusicType.Beat: beats
}
prep_instruments(spc_instruments, inst_lists)
shuffle_instruments(spc_instrument_changes, spc_instruments, inst_lists)
for change in spc_instrument_changes:
for track_addresses in change.tracks.values():
for addr in track_addresses:
rom.write_byte(snes_to_pc(addr), change.target_instrument)
sfx_instruments = { # table @ $1A9C04
0x00: SFXInstrument("Fwoosh", 0x00, 0x00, [0xF6, 0x6A], 0xB8, 0x03).amb().long().soft(),
0x01: SFXInstrument("Swish", 0x01, 0x01, [0x8E, 0xE0], 0xB8, 0x02).amb().long().soft(),
0x02: SFXInstrument("Bomp", 0x02, 0x14, [0xFE, 0x6A], 0xB8, 0x02).beat().short().hard(),
0x03: SFXInstrument("Ting", 0x03, 0x03, [0xFE, 0xF8], 0xB8, 0x0D).beat().short().hard(),
0x04: SFXInstrument("Rrrrr", 0x04, 0x04, [0xFE, 0x6A], 0x7F, 0x03).mel().long().hard(),
0x05: SFXInstrument("Clunk", 0x05, 0x02, [0xFE, 0x6A], 0x7F, 0x03).beat().short().hard(),
0x06: SFXInstrument("Ching", 0x06, 0x05, [0xFE, 0x6A], 0x70, 0x03).amb().long().hard(),
0x07: SFXInstrument("Fwomp", 0x07, 0x06, [0xFE, 0x6A], 0x70, 0x03).mel().long().hard(),
0x08: SFXInstrument("Squee", 0x08, 0x08, [0xFA, 0x6A], 0x70, 0x03).mel().short().soft(),
0x09: SFXInstrument("Unused", 0x09, 0x06, [0xFE, 0x6A], 0x70, 0x01).mel().long().hard(),
0x0A: SFXInstrument("Bzzzrt", 0x0A, 0x07, [0xFE, 0x6A], 0x70, 0x05).mel().long().hard(),
0x0B: SFXInstrument("Brrfft", 0x0B, 0x0B, [0xFE, 0x6A], 0xB8, 0x03).mel().long().hard(),
0x0C: SFXInstrument("Brrwwww", 0x0C, 0x0C, [0xFE, 0xE0], 0xB8, 0x02).beat().short().hard(),
0x0D: SFXInstrument("Twee", 0x0D, 0x0D, [0xF9, 0x6E], 0xB8, 0x03).mel().long().hard(),
0x0E: SFXInstrument("Pwing", 0x0E, 0x0E, [0xFE, 0xF5], 0xB8, 0x07).mel().short().hard(),#?on melody since flute song has a bad note
0x0F: SFXInstrument("Pling", 0x0F, 0x0F, [0xFE, 0xF5], 0xB8, 0x06).mel().short().hard(),
0x10: SFXInstrument("Chshtsh", 0x10, 0x01, [0xFE, 0xFC], 0xB8, 0x03).beat().short().soft(),
0x11: SFXInstrument("Splssh", 0x11, 0x10, [0x8E, 0xE0], 0xB8, 0x03).amb().short().soft(),
0x12: SFXInstrument("Weewoo", 0x12, 0x08, [0x8E, 0xE0], 0xB8, 0x02).mel().short().soft(),
0x13: SFXInstrument("Brbrbrb", 0x13, 0x14, [0x8E, 0xE0], 0xB8, 0x02).amb().beat().short().hard(),
0x14: SFXInstrument("Bwow", 0x14, 0x0A, [0x88, 0xE0], 0xB8, 0x02).mel().long().hard(),
0x15: SFXInstrument("Uughf", 0x15, 0x17, [0x8E, 0xE0], 0xB8, 0x02).mel().short().hard(),
0x16: SFXInstrument("Aaaaaa", 0x16, 0x15, [0xFF, 0xE0], 0xB8, 0x04).mel().long().hard(),
0x17: SFXInstrument("Twing", 0x17, 0x03, [0xDF, 0x11], 0xB8, 0x0F).beat().short().hard(),
0x18: SFXInstrument("Whooo", 0x18, 0x01, [0x88, 0xE0], 0xB8, 0x01).amb().long().soft()
}
spc_instruments = { # table @ $19FB1C
0x00: SPCInstrument("Noise", 0x00, [0xFF, 0xE0], 0xB8, 0x0470),
0x01: SPCInstrument("Rain", 0x01, [0xFF, 0xE0], 0xB8, 0x0790).amb(),
0x02: SPCInstrument("Timpani", 0x02, [0xFF, 0xE0], 0xB8, 0x09C0).beat(),
0x03: SPCInstrument("Square Wave", 0x03, [0xFF, 0xE0], 0xB8, 0x0400).bass().mel(),
0x04: SPCInstrument("Saw Wave", 0x04, [0xFF, 0xE0], 0xB8, 0x0400).bass(),
0x05: SPCInstrument("Clink", 0x05, [0xFF, 0xE0], 0xB8, 0x0470),
0x06: SPCInstrument("Wobbly Lead", 0x06, [0xFF, 0xE0], 0xB8, 0x0470).amb(),
0x07: SPCInstrument("Compound Saw", 0x07, [0xFF, 0xE0], 0xB8, 0x0470),
0x08: SPCInstrument("Tweet", 0x08, [0xFF, 0xE0], 0xB8, 0x07A0).amb().beat(),
0x09: SPCInstrument("Strings A", 0x09, [0x8F, 0xE9], 0xB8, 0x01E0).mel().bass(True),
0x0A: SPCInstrument("Strings B", 0x0A, [0x8A, 0xE9], 0xB8, 0x01E0).mel().bass(True),
0x0B: SPCInstrument("Trombone", 0x0B, [0xFF, 0xE0], 0xB8, 0x0300).mel().bass(True).beat(),
0x0C: SPCInstrument("Cymbal", 0x0C, [0xFF, 0xE0], 0xB8, 0x03A0).beat(),
0x0D: SPCInstrument("Ocarina", 0x0D, [0xFF, 0xE0], 0xB8, 0x0100).bass(),
0x0E: SPCInstrument("Chimes", 0x0E, [0xFF, 0xEF], 0xB8, 0x0EA0).amb(),
0x0F: SPCInstrument("Harp", 0x0F, [0xFF, 0xEF], 0xB8, 0x0600).mel().bass(True).beat(),
0x10: SPCInstrument("Splash", 0x10, [0xFF, 0xE0], 0xB8, 0x03D0).amb().beat(),
0x11: SPCInstrument("Trumpet", 0x11, [0x8F, 0xE0], 0xB8, 0x0300).mel().bass(True),
0x12: SPCInstrument("Horn", 0x12, [0x8F, 0xE0], 0xB8, 0x06F0).mel().bass(True),
0x13: SPCInstrument("Snare A", 0x13, [0xFD, 0xE0], 0xB8, 0x07A0).beat(),
0x14: SPCInstrument("Snare B", 0x14, [0xFF, 0xE0], 0xB8, 0x07A0).beat(),
0x15: SPCInstrument("Choir", 0x15, [0xFF, 0xE0], 0xB8, 0x03D0).mel().bass(True),
0x16: SPCInstrument("Flute", 0x16, [0x8F, 0xE0], 0xB8, 0x0300).mel().bass(True),
0x17: SPCInstrument("Oof", 0x17, [0xFF, 0xE0], 0xB8, 0x02C0).amb().beat(True),
0x18: SPCInstrument("Piano", 0x18, [0xFE, 0x8F], 0xB8, 0x06F0).mel().bass(True)
}
Am = SFXType.Ambient
Me = SFXType.Melody
Be = SFXType.Beat
Sf = SFXType.Soft
Hd = SFXType.Hard
Sh = SFXType.Short
Lg = SFXType.Long
sfx_instrument_changes = [
SFXInstrumentChange(0x01, 0x01, 0x01, [0x1A9A03, 0x1A9A13], type=Am, ban=[0x00, 0x06, 0x11]), # accompanied $01+02
SFXInstrumentChange(0x01, 0x03, 0x01, [0x1A9A28, 0x1A9A38], type=Am, ban=[0x00, 0x06, 0x11]), # accompanied $03+04
SFXInstrumentChange(0x01, 0x07, 0x13, [0x1A9AEA], type=Am|Be|Hd, inc=[0x08, 0x12]),
SFXInstrumentChange(0x01, 0x09, 0x18, [0x1A903F, 0x1A906D], type=Am, ban=[0x00, 0x06, 0x11]), # accompanied $09+0A
SFXInstrumentChange(0x01, 0x0B, 0x0D, [0x1A8F54, 0x1A8F13], type=Me, ban=[0x0F]), # accompanied $0B+0C
SFXInstrumentChange(0x01, 0x0D, 0x0E, [0x1A8EBF, 0x1A8ECE], ban=[0x00, 0x01, 0x06, 0x0C, 0x18]), # accompanied $0D+0E
SFXInstrumentChange(0x01, 0x0F, 0x0E, [0x1A8EDD, 0x1A8EEF], ban=[0x06, 0x0C]), # accompanied $0F+10
SFXInstrumentChange(0x01, 0x11, 0x16, [0x1A925D, 0x1A9279], type=Me|Be, ban=[0x02, 0x09, 0x0C, 0x13, 0x15]), # accompanied $11+12
SFXInstrumentChange(0x01, 0x13, 0x00, [0x1A8E83, 0x1A8E92], ban=[0x10]), # accompanied $13+14
SFXInstrumentChange(0x01, 0x15, 0x0A, [0x1A8EA1, 0x1A8EB0], ban=[0x09, 0x10, 0x15]), # accompanied $15+16
SFXInstrumentChange(0x01, 0x17, 0x0D, [0x1A8FD5, 0x1A8F94], type=Me, ban=[0x0F]), # accompanied $17+18
SFXInstrumentChange(0x02, 0x01, 0x01, [0x1A99C5], type=Am, ban=[0x06], inc=[0x02]),
SFXInstrumentChange(0x02, 0x02, 0x01, [0x1A99D6], type=Am, ban=[0x06], inc=[0x02]),
SFXInstrumentChange(0x02, 0x03, 0x02, [0x1A99E5], type=Am, ban=[0x06], inc=[0x02]),
SFXInstrumentChange(0x02, 0x04, 0x02, [0x1A99F4], type=Am, ban=[0x06], inc=[0x02]),
SFXInstrumentChange(0x02, 0x05, 0x06, [0x1A998E], ban=[0x01, 0x03, 0x16, 0x17]),
SFXInstrumentChange(0x02, 0x06, 0x03, [0x1A9986], type=Hd, ban=[0x06, 0x09], inc=[0x12]),
SFXInstrumentChange(0x02, 0x08, 0x02, [0x1A9994], ban=[0x10, 0x18]),
SFXInstrumentChange(0x02, 0x08, 0x02, [0x1A999D], type=Me|Lg, inc=[0x02, 0x0C, 0x13]),
SFXInstrumentChange(0x02, 0x09, 0x00, [0x1A995E], ban=[0x08, 0x13]),
SFXInstrumentChange(0x02, 0x0A, 0x06, [0x1A9978], ban=[0x00, 0x03, 0x0C, 0x0E, 0x13, 0x14, 0x17, 0x18]),
SFXInstrumentChange(0x02, 0x0B, 0x02, [0x1A9829], type=Hd, ban=[0x09], inc=[0x12]),
SFXInstrumentChange(0x02, 0x0C, 0x13, [0x1A9A4D], type=Sh, ban=[0x10]),
SFXInstrumentChange(0x02, 0x0D, 0x00, [0x1A97C5], type=Am, ban=[0x13], inc=[0x10]), # accompanied $0D+3F
SFXInstrumentChange(0x02, 0x0E, 0x00, [0x1A97B5], type=Lg, ban=[0x09, 0x18], inc=[0x13]),
SFXInstrumentChange(0x02, 0x0F, 0x06, [0x1A9874], type=Lg, ban=[0x18]),
SFXInstrumentChange(0x02, 0x10, 0x05, [0x1A97AB], ban=[0x00, 0x09, 0x14, 0x18]),
SFXInstrumentChange(0x02, 0x11, 0x05, [0x1A97A1], ban=[0x00, 0x08, 0x10, 0x18]),
SFXInstrumentChange(0x02, 0x12, 0x02, [0x1A977E], ban=[0x00, 0x10]),
SFXInstrumentChange(0x02, 0x12, 0x01, [0x1A9787], ban=[0x10]),
SFXInstrumentChange(0x02, 0x13, 0x0D, [0x1A9751, 0x1A9766], type=Me, ban=[0x0F]), # accompanied $13+3E
SFXInstrumentChange(0x02, 0x14, 0x07, [0x1A9731], type=Hd, ban=[0x09]),
SFXInstrumentChange(0x02, 0x15, 0x07, [0x1A9741], type=Hd, ban=[0x09]),
SFXInstrumentChange(0x02, 0x16, 0x10, [0x1A96DD], ban=[0x00, 0x01, 0x06, 0x0C, 0x18]),
SFXInstrumentChange(0x02, 0x17, 0x10, [0x1A96F5], ban=[0x00, 0x01, 0x06, 0x0C, 0x18]),
SFXInstrumentChange(0x02, 0x18, 0x10, [0x1A9707], ban=[0x00, 0x01, 0x06, 0x0C, 0x18]),
SFXInstrumentChange(0x02, 0x19, 0x10, [0x1A971F], ban=[0x00, 0x01, 0x06, 0x0C, 0x18]),
SFXInstrumentChange(0x02, 0x1A, 0x01, [0x1A96C7], type=Am, ban=[0x06, 0x13], inc=[0x08, 0x0F, 0x10, 0x12, 0x15, 0x17]),
SFXInstrumentChange(0x02, 0x1B, 0x11, [0x1A96B8], type=Am, ban=[0x06, 0x13], inc=[0x08, 0x0F, 0x10, 0x12, 0x15, 0x17]),
SFXInstrumentChange(0x02, 0x1C, 0x11, [0x1A96B2], type=Am, ban=[0x06, 0x13], inc=[0x08, 0x0F, 0x10, 0x12, 0x15, 0x17]),
SFXInstrumentChange(0x02, 0x1D, 0x16, [0x1A966C], ban=[0x09, 0x10, 0x11, 0x13, 0x15, 0x18]),
SFXInstrumentChange(0x02, 0x1E, 0x01, [0x1A9928], type=Lg, ban=[0x06]),
SFXInstrumentChange(0x02, 0x1F, 0x02, [0x1A969A], type=Me|Be|Hd, ban=[0x09]),
SFXInstrumentChange(0x02, 0x1F, 0x01, [0x1A96A0], ban=[0x00, 0x06, 0x18]),
SFXInstrumentChange(0x02, 0x20, 0x0D, [0x1A968B], type=Me|Lg, ban=[0x09]),
SFXInstrumentChange(0x02, 0x21, 0x02, [0x1A9680], type=Be|Hd),
SFXInstrumentChange(0x02, 0x21, 0x01, [0x1A9685], type=Sf, ban=[0x18]),
SFXInstrumentChange(0x02, 0x22, 0x05, [0x1A948E, 0x1A94B8], type=[0x01, 0x05, 0x0E, 0x0F, 0x10, 0x17]), # chained $3-18->22
SFXInstrumentChange(0x02, 0x23, 0x01, [0x1A9662], ban=[0x06, 0x0C, 0x0E, 0x13]),
SFXInstrumentChange(0x02, 0x24, 0x11, [0x1A9656, 0x1A965C], type=Me|Lg, ban=[0x09, 0x0D, 0x16], inc=[0x11]), # accompanied $24+3D
SFXInstrumentChange(0x02, 0x25, 0x11, [0x1A9647], ban=[0x00, 0x01, 0x06, 0x0C, 0x10]),
SFXInstrumentChange(0x02, 0x26, 0x15, [0x1A9BF5], type=Me|Hd, inc=[0x11]),
SFXInstrumentChange(0x02, 0x27, 0x0B, [0x1A9603], type=Me|Lg, inc=[0x0E, 0x17]),
SFXInstrumentChange(0x02, 0x27, 0x13, [0x1A9631], type=Hd, inc=[0x08, 0x11, 0x12]),
SFXInstrumentChange(0x02, 0x28, 0x11, [0x1A9638], type=[0x10, 0x11, 0x12]),
SFXInstrumentChange(0x02, 0x29, 0x01, [0x1A97F0], type=Sf), # accompanied $29+3B
SFXInstrumentChange(0x02, 0x2A, 0x0C, [0x1A93E4], type=Be, inc=[0x08, 0x0D, 0x0E, 0x0F, 0x11, 0x12, 0x16]),
SFXInstrumentChange(0x02, 0x2B, 0x0E, [0x1A93A3], type=Me, ban=[0x08, 0x09, 0x0D], inc=[0x03, 0x11, 0x17]),
SFXInstrumentChange(0x02, 0x2C, 0x00, [0x1A938A, 0x1A9398], type=Sh, ban=[0x13]), # chained $2C->3A
SFXInstrumentChange(0x02, 0x2C, 0x17, [0x1A9393, 0x1A939D], type=Me|Sh, ban=[0x0E], inc=[0x03, 0x11, 0x17]), # chained $2C->3A
SFXInstrumentChange(0x02, 0x2D, 0x0F, [0x1A9457], type=Me, ban=[0x09], inc=[0x03, 0x17]),
SFXInstrumentChange(0x02, 0x2E, 0x11, [0x1A937B], type=Sh, ban=[0x03, 0x10, 0x15, 0x17]), # accompanied $2E+39
SFXInstrumentChange(0x02, 0x2F, 0x01, [0x1A92F8], type=Lg|Sf, ban=[0x00]), # accompanied $2F+38
SFXInstrumentChange(0x02, 0x30, 0x15, [0x1A92A2], type=Me, inc=[0x03, 0x11, 0x17]),
SFXInstrumentChange(0x02, 0x31, 0x0D, [0x1A947F], type=Me, ban=[0x0E], inc=[0x17]),
SFXInstrumentChange(0x02, 0x32, 0x01, [0x1A90F8], type=Lg, ban=[0x00, 0x06]),
SFXInstrumentChange(0x02, 0x33, 0x07, [0x1A908D], type=Me|Lg),
SFXInstrumentChange(0x02, 0x35, 0x13, [0x1A9018], type=Am|Be, ban=[0x00, 0x06, 0x18], inc=[0x08, 0x12]),
SFXInstrumentChange(0x02, 0x37, 0x0E, [0x1A8DF4], type=Me, ban=[0x09], inc=[0x03, 0x17]),
SFXInstrumentChange(0x02, 0x38, 0x11, [0x1A9320], type=Me|Am, ban=[0x00, 0x09], inc=[0x17]), # accompanied $2F+38
SFXInstrumentChange(0x02, 0x39, 0x01, [0x1A934D], type=Am|Lg, ban=[0x00]), # accompanied $2E+39
SFXInstrumentChange(0x02, 0x3B, 0x06, [0x1A9813], type=Hd, ban=[0x0C, 0x13, 0x14]), # accompanied $29+3B
SFXInstrumentChange(0x02, 0x3C, 0x04, [0x1A8DE8], type=Me, ban=[0x09], inc=[0x17]),
SFXInstrumentChange(0x02, 0x3F, 0x0D, [0x1A97E6], type=Me|Be|Hd, inc=[0x12]), # accompanied $0D+3F
SFXInstrumentChange(0x03, 0x01, 0x07, [0x1A8DC9], type=Me, ban=[0x0D, 0x0E, 0x14, 0x16], inc=[0x03, 0x17]),
SFXInstrumentChange(0x03, 0x02, 0x01, [0x1A98FF], ban=[0x03, 0x06, 0x09, 0x17]),
SFXInstrumentChange(0x03, 0x03, 0x13, [0x1A95FB], type=Me|Be, ban=[0x03, 0x09, 0x10, 0x14, 0x16, 0x17]),
SFXInstrumentChange(0x03, 0x04, 0x12, [0x1A95BF], type=Me, ban=[0x09]),
SFXInstrumentChange(0x03, 0x04, 0x06, [0x1A95C7], ban=[0x00, 0x18]),
SFXInstrumentChange(0x03, 0x05, 0x00, [0x1A9968], ban=[0x09, 0x10, 0x18]),
SFXInstrumentChange(0x03, 0x06, 0x02, [0x1A95A6], type=Sh, ban=[0x0C, 0x0E, 0x10, 0x11]),
SFXInstrumentChange(0x03, 0x07, 0x0C, [0x1A95EE], type=Me|Be, ban=[0x02, 0x09, 0x10, 0x13]),
SFXInstrumentChange(0x03, 0x08, 0x0C, [0x1A9597], type=Me|Be, ban=[0x02, 0x09, 0x10, 0x13]),
SFXInstrumentChange(0x03, 0x09, 0x0C, [0x1A9572], type=Me|Be, ban=[0x09, 0x10]),
SFXInstrumentChange(0x03, 0x0A, 0x03, [0x1A955A], type=Me|Be, ban=[0x10, 0x17], inc=[0x11, 0x13]),
SFXInstrumentChange(0x03, 0x0B, 0x0B, [0x1A9549], type=Me|Be, ban=[0x02, 0x13], inc=[0x11]),
SFXInstrumentChange(0x03, 0x0C, 0x0D, [0x1A953F], type=Me, ban=[0x09, 0x0A, 0x0B, 0x14, 0x15], inc=[0x03, 0x11, 0x17]),
SFXInstrumentChange(0x03, 0x0D, 0x0E, [0x1A9566], type=Me, ban=[0x14], inc=[0x03, 0x11, 0x17]),
SFXInstrumentChange(0x03, 0x0E, 0x02, [0x1A9533], ban=[0x00, 0x08, 0x0C, 0x0D, 0x0E, 0x13, 0x14, 0x18]),
SFXInstrumentChange(0x03, 0x0F, 0x0B, [0x1A986A, 0x1A983B, 0x1A9845, 0x1A9831], type=[0x03, 0x04, 0x08, 0x0B, 0x0D, 0x0F, 0x12, 0x17]), # accompanied $0F+3C+3D+3E+3F
SFXInstrumentChange(0x03, 0x10, 0x0E, [0x1A951E, 0x1A9527], type=Sh|Hd, ban=[0x03]), # accompanied $10+3B
SFXInstrumentChange(0x03, 0x11, 0x07, [0x1A9500], type=Me, ban=[0x09], inc=[0x03, 0x17]),
SFXInstrumentChange(0x03, 0x12, 0x07, [0x1A950F], type=Me, ban=[0x09], inc=[0x03, 0x17]),
SFXInstrumentChange(0x03, 0x13, 0x0D, [0x1A94EC], type=Me, ban=[0x09, 0x0B], inc=[0x03, 0x11, 0x17]),
SFXInstrumentChange(0x03, 0x14, 0x06, [0x1A981D], type=Hd, ban=[0x03, 0x09, 0x14], inc=[0x12]),
SFXInstrumentChange(0x03, 0x15, 0x13, [0x1A94E0], type=Hd, ban=[0x09, 0x14], inc=[0x12]),
SFXInstrumentChange(0x03, 0x16, 0x13, [0x1A94D4], type=Be, ban=[0x0C, 0x17]),
SFXInstrumentChange(0x03, 0x17, 0x08, [0x1A9957], type=Me, ban=[0x09, 0x0A, 0x0E]),
SFXInstrumentChange(0x03, 0x19, 0x07, [0x1A98BB], type=Me, ban=[0x08, 0x09], inc=[0x03, 0x05, 0x17]),
SFXInstrumentChange(0x03, 0x1A, 0x0F, [0x1A923B], type=Me|Lg, inc=[0x0F]), # accompanied $1A+38, but OWR
SFXInstrumentChange(0x03, 0x1B, 0x0E, [0x1A9467, 0x1A9471], type=Me, ban=[0x08]), # accompanied $1B+3A
SFXInstrumentChange(0x03, 0x1C, 0x0A, [0x1A8E13], type=Me, ban=[0x09], inc=[0x03, 0x17]),
SFXInstrumentChange(0x03, 0x1E, 0x01, [0x1A9442], ban=[0x03, 0x06, 0x0C, 0x0E]),
SFXInstrumentChange(0x03, 0x1F, 0x16, [0x1A93FC], type=Me|Lg, ban=[0x09]),
SFXInstrumentChange(0x03, 0x20, 0x0F, [0x1A9B1D], type=Me|Be|Hd),
SFXInstrumentChange(0x03, 0x21, 0x14, [0x1A9B93], type=Me, ban=[0x09, 0x0B, 0x15], inc=[0x17]),
SFXInstrumentChange(0x03, 0x22, 0x14, [0x1A9A80], type=Me|Lg, ban=[0x09, 0x0A]),
SFXInstrumentChange(0x03, 0x23, 0x01, [0x1A93B2], type=Am|Me|Lg, ban=[0x00], inc=[0x13]), # accompanied $23+39
SFXInstrumentChange(0x03, 0x24, 0x0D, [0x1A93F4], type=Me, ban=[0x09], inc=[0x03, 0x17]),
SFXInstrumentChange(0x03, 0x25, 0x13, [0x1A924E], type=Am|Be, ban=[0x00, 0x06, 0x18], inc=[0x09]),
SFXInstrumentChange(0x03, 0x25, 0x06, [0x1A9254], type=Hd, ban=[0x02, 0x05, 0x09, 0x0C, 0x13, 0x14, 0x15]),
SFXInstrumentChange(0x03, 0x26, 0x00, [0x1A922C], type=Lg, ban=[0x06]),
SFXInstrumentChange(0x03, 0x27, 0x07, [0x1A91F1], type=Me|Hd),
SFXInstrumentChange(0x03, 0x28, 0x07, [0x1A9AA8], type=Me|Lg|Hd),
SFXInstrumentChange(0x03, 0x29, 0x07, [0x1A91D2], type=Me|Hd),
SFXInstrumentChange(0x03, 0x2A, 0x0A, [0x1A91C3], type=Me|Lg, inc=[0x03, 0x0E, 0x0F, 0x12, 0x17]),
SFXInstrumentChange(0x03, 0x2B, 0x0A, [0x1A91A4], ban=[0x06, 0x09, 0x18]),
SFXInstrumentChange(0x03, 0x2C, 0x0A, [0x1A9171], type=Me, ban=[0x09], inc=[0x17]),
SFXInstrumentChange(0x03, 0x2D, 0x0F, [0x1A915A, 0x1A9165], type=Me, ban=[0x08, 0x0E, 0x12]), # accompanied $2D+37
SFXInstrumentChange(0x03, 0x2E, 0x0B, [0x1A910E, 0x1A9124, 0x1A9117], type=Me|Lg, ban=[0x14, 0x16]), # accompanied $2E+35+34
SFXInstrumentChange(0x03, 0x2F, 0x0E, [0x1A9131, 0x1A9144], type=Me|Be|Hd, inc=[0x13]), # accompanied $2F+33
SFXInstrumentChange(0x03, 0x30, 0x03, [0x1A8F04], type=Me|Be, ban=[0x0C, 0x13], inc=[0x11]),
SFXInstrumentChange(0x03, 0x31, 0x01, [0x1A8E7B], ban=[0x03, 0x06, 0x09, 0x0E, 0x17, 0x18]),
SFXInstrumentChange(0x03, 0x32, 0x04, [0x1A8E29], type=Me, ban=[0x08], inc=[0x03, 0x05, 0x17]),
SFXInstrumentChange(0x03, 0x36, 0x07, [0x1A8E58], type=Me|Lg, inc=[0x03, 0x0F, 0x17]),
# SFXInstrumentChange(0x03, 0x38, 0x0F, [0x1A9244]), # sound used for OWR function
SFXInstrumentChange(0x03, 0x39, 0x07, [0x1A93C8], type=Me|Be), # accompanied $23+39
SFXInstrumentChange(0x03, 0x3E, 0x05, [0x1A984F], type=Be, ban=[0x02, 0x0C], inc=[0x0D, 0x0E, 0x0F])
]
Me = SPCMusicType.Melody
Rh = SPCMusicType.Rhythm
Be = SPCMusicType.Beat
Am = SPCMusicType.Ambient
spc_instrument_changes = [
SPCInstrumentChange(0x01, 0x00, {0x00: [0x1A9F5B],
0x01: [0x1A9F9D],
0x02: [0x1A9FBB],
0x03: [0x1A9FDA],
0x04: [0x1A9FE8]}, 0x0F),
SPCInstrumentChange(0x01, 0x01, {0x00: [0x1ACA1A],
0x01: [0x1ACA39],
0x02: [0x1ACA5E],
0x07: [0x1ACC01]}, 0x0B),
SPCInstrumentChange(0x01, 0x01, {0x03: [0x1ACAA3],
0x04: [0x1ACAE2]}, 0x11),
SPCInstrumentChange(0x01, 0x01, {0x05: [0x1ACB25, 0x1ACC78]}, 0x02),
SPCInstrumentChange(0x01, 0x01, {0x05: [0x1ACB3A, 0x1ACC51],
0x06: [0x1ACBA9, 0x1ACC7D]}, 0x13),
SPCInstrumentChange(0x01, 0x01, {0x06: [0x1ACB94, 0x1ACCA3]}, 0x0C),
SPCInstrumentChange(0x02, 0x00, {0x00: [0x1AA04B],
0x03: [0x1AA10E],
0x04: [0x1AA143],
0x07: [0x1AA1D1]}, 0x0B),
SPCInstrumentChange(0x02, 0x00, {0x01: [0x1AA087],
0x05: [0x1AA176]}, 0x11),
SPCInstrumentChange(0x02, 0x00, {0x02: [0x1AA0CC],
0x06: [0x1AA1BF]}, 0x13),
SPCInstrumentChange(0x02, 0x00, {0x06: [0x1AA1C7]}, 0x0C),
SPCInstrumentChange(0x02, 0x01, {0x02: [0x1AA27B]}, 0x13),
SPCInstrumentChange(0x02, 0x01, {0x03: [0x1AA2A2]}, 0x0A),
SPCInstrumentChange(0x02, 0x01, {0x04: [0x1AA2CD]}, 0x02),
SPCInstrumentChange(0x02, 0x01, {0x05: [0x1AA2E0],
0x07: [0x1AA34D]}, 0x0B),
SPCInstrumentChange(0x02, 0x02, {0x00: [0x1AA5A8],
0x05: [0x1AA449]}, 0x0B),
SPCInstrumentChange(0x02, 0x02, {0x03: [0x1AA3FF],
0x04: [0x1AA42A]}, 0x0A),
SPCInstrumentChange(0x02, 0x02, {0x06: [0x1AA49E, 0x1AA4CB]}, 0x13),
SPCInstrumentChange(0x02, 0x02, {0x06: [0x1AA4C0, 0x1AA4EA]}, 0x0C),
SPCInstrumentChange(0x02, 0x02, {0x06: [0x1AA752]}, 0x02),
SPCInstrumentChange(0x03, 0x00, {0x00: [0x1AA84A],
0x01: [0x1AA864],
0x03: [0x1AA885]}, 0x0A),
SPCInstrumentChange(0x03, 0x01, {0x00: [0x1AA89E],
0x01: [0x1AA8B8],
0x03: [0x1AA8D9]}, 0x12),
SPCInstrumentChange(0x03, 0x01, {0x02: [0x1AAB86],
0x04: [0x1AA8F2],
0x05: [0x1AA93C]}, 0x0A),
SPCInstrumentChange(0x04, 0x00, {0x00: [0x1AACA3],
0x01: [0x1AACB1],
0x02: [0x1AACC7]}, 0x12),
SPCInstrumentChange(0x04, 0x01, {0x00: [0x1AABF5],
0x01: [0x1AAC0B]}, 0x12),
SPCInstrumentChange(0x04, 0x01, {0x02: [0x1AAC21]}, 0x12),
SPCInstrumentChange(0x04, 0x02, {0x01: [0x1AAC55],
0x02: [0x1AAC6B]}, 0x12),
SPCInstrumentChange(0x04, 0x03, {0x00: [0x1AAD93],
0x01: [0x1AACED],
0x02: [0x1AAD07],
0x03: [0x1AAD75],
0x04: [0x1AADB1]}, 0x12),
SPCInstrumentChange(0x05, 0x00, {0x00: [0x1AAE3F],
0x02: [0x1AAE72],
0x03: [0x1AAEAD],
0x07: [0x1AAF02]}, 0x0A),
SPCInstrumentChange(0x05, 0x00, {0x01: [0x1AAE64]}, 0x09),
SPCInstrumentChange(0x05, 0x00, {0x04: [0x1AAEE8]}, 0x16),
SPCInstrumentChange(0x05, 0x01, {0x00: [0x1AB156],
0x03: [0x1AAF48],
0x04: [0x1AAF71],
0x07: [0x1AB1D3]}, 0x0A),
SPCInstrumentChange(0x05, 0x01, {0x02: [0x1AB186]}, 0x16),
SPCInstrumentChange(0x05, 0x02, {0x00: [0x1AB088],
0x03: [0x1AB0CF],
0x04: [0x1AB0F8],
0x07: [0x1AB11F]}, 0x0A),
SPCInstrumentChange(0x05, 0x02, {0x02: [0x1AB0A7]}, 0x16),
SPCInstrumentChange(0x06, 0x00, {0x00: [0x1AB338]}, 0x0A),
SPCInstrumentChange(0x06, 0x01, {0x01: [0x1AB68F],
0x02: [0x1AB69D],
0x03: [0x1AB6B2],
0x05: [0x1AB3D7]}, 0x0A),
SPCInstrumentChange(0x06, 0x02, {0x00: [0x1AB622],
0x01: [0x1AB63A],
0x02: [0x1AB648],
0x03: [0x1AB670],
0x04: [0x1AB6C4],
0x05: [0x1AB49D]}, 0x0A),
SPCInstrumentChange(0x06, 0x03, {0x05: [0x1AB548]}, 0x0A),
SPCInstrumentChange(0x06, 0x04, {0x00: [0x1AB722],
0x01: [0x1AB739],
0x02: [0x1AB745],
0x03: [0x1AB759],
0x04: [0x1AB765],
0x05: [0x1AB5E3]}, 0x0A),
SPCInstrumentChange(0x07, 0x00, {0x00: [0x1ABB1F]}, 0x0A),
SPCInstrumentChange(0x07, 0x00, {0x01: [0x1ABB31],
0x02: [0x1ABBE6],
0x03: [0x1ABC0B]}, 0x09),
SPCInstrumentChange(0x07, 0x00, {0x04: [0x1ABB53, 0x1AB8C9]}, 0x16),
SPCInstrumentChange(0x07, 0x01, {0x04: [0x1AB8E6]}, 0x0E, type=Am|Me|Rh, ban=[0x01, 0x05, 0x06, 0x17]),
SPCInstrumentChange(0x07, 0x01, {0x05: [0x1AB8EB]}, 0x0A),
SPCInstrumentChange(0x07, 0x02, {0x04: [0x1AB981]}, 0x16),
SPCInstrumentChange(0x07, 0x03, {0x02: [0x1ABC37],
0x03: [0x1ABC66]}, 0x09),
SPCInstrumentChange(0x07, 0x03, {0x04: [0x1ABA09]}, 0x16),
SPCInstrumentChange(0x07, 0x03, {0x05: [0x1ABC8F]}, 0x0A),
SPCInstrumentChange(0x07, 0x05, {0x02: [0x1ABC9D],
0x03: [0x1ABCBA]}, 0x09),
SPCInstrumentChange(0x07, 0x05, {0x05: [0x1ABCD1]}, 0x0A),
SPCInstrumentChange(0x07, 0x06, {0x00: [0x1ABB72]}, 0x0A),
SPCInstrumentChange(0x07, 0x06, {0x01: [0x1ABB83],
0x02: [0x1ABB95],
0x03: [0x1ABBAA]}, 0x09),
SPCInstrumentChange(0x07, 0x06, {0x04: [0x1ABBBD]}, 0x16),
SPCInstrumentChange(0x07, 0x06, {0x05: [0x1ABCE6]}, 0x0A),
SPCInstrumentChange(0x08, 0x00, {0x00: [0x1ABD3A],
0x01: [0x1ABD5B]}, 0x06, type=Me|Rh|Am, ban=[0x05]),
SPCInstrumentChange(0x08, 0x00, {0x02: [0x1ABD70],
0x05: [0x1ABE06]}, 0x0F),
SPCInstrumentChange(0x08, 0x00, {0x03: [0x1ABDAC]}, 0x0A),
SPCInstrumentChange(0x08, 0x00, {0x04: [0x1ABDC8]}, 0x01),
SPCInstrumentChange(0x08, 0x00, {0x06: [0x1ABE3A]}, 0x09),
SPCInstrumentChange(0x09, 0x00, {0x00: [0x1AC25A],
0x05: [0x1AC28E]}, 0x0A),
SPCInstrumentChange(0x09, 0x00, {0x01: [0x1AC26E]}, 0x14, type=Am|Be, ban=[0x05, 0x06]),
SPCInstrumentChange(0x09, 0x01, {0x01: [0x1ABF0A]}, 0x14, type=Am|Be, ban=[0x05, 0x06]),
SPCInstrumentChange(0x09, 0x01, {0x06: [0x1ABF43]}, 0x09),
SPCInstrumentChange(0x09, 0x02, {0x00: [0x1AC450],
0x05: [0x1AC56D],
0x07: [0x1AC595]}, 0x0A),
SPCInstrumentChange(0x09, 0x02, {0x01: [0x1AC2AF]}, 0x14, type=Am|Be, ban=[0x05, 0x06]),
SPCInstrumentChange(0x09, 0x02, {0x03: [0x1AC4B3],
0x04: [0x1AC510]}, 0x11),
SPCInstrumentChange(0x09, 0x02, {0x06: [0x1AC2E9]}, 0x09),
SPCInstrumentChange(0x09, 0x03, {0x00: [0x1ABF63]}, 0x0A),
SPCInstrumentChange(0x09, 0x03, {0x01: [0x1ABF80]}, 0x14, type=Am|Be, ban=[0x05, 0x06]),
SPCInstrumentChange(0x09, 0x03, {0x03: [0x1ABFA4]}, 0x11),
SPCInstrumentChange(0x09, 0x03, {0x05: [0x1AC01C]}, 0x16),
SPCInstrumentChange(0x09, 0x04, {0x00: [0x1AC04D]}, 0x0A),
SPCInstrumentChange(0x09, 0x04, {0x01: [0x1AC05D]}, 0x14, type=Am|Be, ban=[0x05, 0x06]),
SPCInstrumentChange(0x09, 0x04, {0x02: [0x1AC5CF]}, 0x18),
SPCInstrumentChange(0x09, 0x04, {0x03: [0x1AC085],
0x04: [0x1AC5ED]}, 0x11),
SPCInstrumentChange(0x09, 0x04, {0x05: [0x1AC137]}, 0x16),
SPCInstrumentChange(0x09, 0x04, {0x06: [0x1AC146]}, 0x12),
SPCInstrumentChange(0x09, 0x05, {0x00: [0x1AC178],
0x07: [0x1AC229]}, 0x0A),
SPCInstrumentChange(0x09, 0x05, {0x01: [0x1AC196]}, 0x14, type=Am|Be, ban=[0x05, 0x06]),
SPCInstrumentChange(0x09, 0x05, {0x02: [0x1AC19E]}, 0x18),
SPCInstrumentChange(0x09, 0x05, {0x03: [0x1AC1D3],
0x04: [0x1AC1F4]}, 0x12),
SPCInstrumentChange(0x09, 0x06, {0x00: [0x1AC317],
0x07: [0x1AC3ED]}, 0x0A),
SPCInstrumentChange(0x09, 0x06, {0x01: [0x1AC332]}, 0x14, type=Am|Be, ban=[0x05, 0x06]),
SPCInstrumentChange(0x09, 0x06, {0x02: [0x1AC33A]}, 0x18),
SPCInstrumentChange(0x09, 0x06, {0x03: [0x1AC36F],
0x04: [0x1AC3A4],
0x05: [0x1AC3D9]}, 0x12),
SPCInstrumentChange(0x09, 0x07, {0x00: [0x1AC40A],
0x05: [0x1AC43C]}, 0x0A),
SPCInstrumentChange(0x09, 0x07, {0x01: [0x1AC41C]}, 0x14, type=Am|Be, ban=[0x05, 0x06]),
SPCInstrumentChange(0x09, 0x07, {0x02: [0x1AC492]}, 0x18),
SPCInstrumentChange(0x09, 0x07, {0x03: [0x1AC680],
0x04: [0x1AC6C1]}, 0x11),
SPCInstrumentChange(0x0A, 0x00, {0x00: [0x1AC72F],
0x01: [0x1AC751],
0x02: [0x1AC772],
0x03: [0x1AC793]}, 0x0F),
SPCInstrumentChange(0x0A, 0x00, {0x00: [0x1AC740],
0x01: [0x1AC765],
0x02: [0x1AC786],
0x03: [0x1AC7A7],
0x04: [0x1AC7B4, 0x1AC7C9],
0x05: [0x1AC7D1]}, 0x09),
SPCInstrumentChange(0x0B, 0x00, {0x00: [0x1A9EEC, 0x1A9D26]}, 0x0F, ban=[0x0B]),
SPCInstrumentChange(0x0B, 0x01, {0x01: [0x1A9D3F],
0x02: [0x1A9D5A],
0x03: [0x1A9D75],
0x04: [0x1A9D90],
0x05: [0x1A9DBB],
0x06: [0x1A9DE9]}, 0x0F),
SPCInstrumentChange(0x0C, 0x00, {0x00: [0x1AC83A],
0x01: [0x1AC84A],
0x02: [0x1AC857],
0x03: [0x1AC864],
0x04: [0x1AC871],
0x05: [0x1AC87E]}, 0x0B),
SPCInstrumentChange(0x0C, 0x01, {0x02: [0x1AC89A],
0x03: [0x1AC8AD]}, 0x11),
SPCInstrumentChange(0x0C, 0x01, {0x04: [0x1AC8B7]}, 0x0E, type=Rh|Am, ban=[0x05]),
SPCInstrumentChange(0x0C, 0x01, {0x05: [0x1AC8C3]}, 0x02),
SPCInstrumentChange(0x0C, 0x02, {0x02: [0x1AC8E0],
0x03: [0x1AC8F3]}, 0x11),
SPCInstrumentChange(0x0C, 0x02, {0x04: [0x1AC8FD]}, 0x0E, type=Rh|Am, ban=[0x05]),
SPCInstrumentChange(0x0C, 0x02, {0x05: [0x1AC909]}, 0x02),
SPCInstrumentChange(0x0D, 0x00, {0x00: [0x1AD003],
0x03: [0x1AD02C],
0x04: [0x1AD03A]}, 0x11),
SPCInstrumentChange(0x0D, 0x00, {0x01: [0x1AD010]}, 0x02, type=Am|Be, ban=[0x01, 0x05, 0x06, 0x10, 0x17]),
SPCInstrumentChange(0x0D, 0x00, {0x02: [0x1AD07F]}, 0x14),
SPCInstrumentChange(0x0D, 0x01, {0x00: [0x1ACD10],
0x04: [0x1ACD9A]}, 0x0B),
SPCInstrumentChange(0x0D, 0x01, {0x01: [0x1ACD41]}, 0x02, type=Am|Be, ban=[0x01, 0x05, 0x06, 0x10, 0x17]),
SPCInstrumentChange(0x0D, 0x01, {0x03: [0x1ACD7F],
0x05: [0x1ACDCA]}, 0x11),
SPCInstrumentChange(0x0D, 0x03, {0x00: [0x1ACE8E],
0x01: [0x1ACEB8]}, 0x0A),
SPCInstrumentChange(0x0D, 0x03, {0x02: [0x1ACED4]}, 0x14),
SPCInstrumentChange(0x0D, 0x03, {0x03: [0x1ACEE0],
0x04: [0x1ACF07]}, 0x11),
SPCInstrumentChange(0x0D, 0x04, {0x05: [0x1ACFE3]}, 0x02, type=Am|Be, ban=[0x01, 0x05, 0x06, 0x10, 0x17]),
SPCInstrumentChange(0x0E, 0x00, {0x00: [0x1AD29C]}, 0x16),
SPCInstrumentChange(0x0E, 0x00, {0x01: [0x1AD2AD],
0x03: [0x1AD2CB],
0x04: [0x1AD2D9]}, 0x18),
SPCInstrumentChange(0x0E, 0x00, {0x02: [0x1AD2BB]}, 0x12),
SPCInstrumentChange(0x0E, 0x01, {0x00: [0x1AD1A6]}, 0x16),
SPCInstrumentChange(0x0E, 0x01, {0x01: [0x1AD1AF],
0x03: [0x1AD1CD]}, 0x18),
SPCInstrumentChange(0x0E, 0x01, {0x02: [0x1AD1C5]}, 0x0A),
SPCInstrumentChange(0x0E, 0x02, {0x00: [0x1AD24C]}, 0x16),
SPCInstrumentChange(0x0E, 0x02, {0x01: [0x1AD255],
0x03: [0x1AD273]}, 0x18),
SPCInstrumentChange(0x0E, 0x02, {0x02: [0x1AD26B]}, 0x0A),
SPCInstrumentChange(0x0E, 0x03, {0x00: [0x1AD1E4],
0x01: [0x1AD1ED],
0x03: [0x1AD212],
0x04: [0x1AD22F]}, 0x18),
SPCInstrumentChange(0x0E, 0x03, {0x02: [0x1AD20A]}, 0x12),
SPCInstrumentChange(0x10, 0x00, {0x00: [0x1B816D],
0x02: [0x1B81A0],
0x03: [0x1B81C0],
0x07: [0x1B827F]}, 0x0B),
SPCInstrumentChange(0x10, 0x00, {0x01: [0x1B818C]}, 0x11),
SPCInstrumentChange(0x10, 0x00, {0x04: [0x1B81E0],
0x05: [0x1B8220, 0x1B8229]}, 0x02),
SPCInstrumentChange(0x10, 0x00, {0x05: [0x1B8224]}, 0x0C),
SPCInstrumentChange(0x10, 0x00, {0x06: [0x1B825F]}, 0x16),
SPCInstrumentChange(0x10, 0x01, {0x00: [0x1B811F]}, 0x0B),
SPCInstrumentChange(0x10, 0x01, {0x03: [0x1B813B],
0x05: [0x1B814E]}, 0x0A),
SPCInstrumentChange(0x10, 0x02, {0x00: [0x1B829E],
0x05: [0x1B8310]}, 0x0B),
SPCInstrumentChange(0x10, 0x02, {0x01: [0x1B82C0],
0x03: [0x1B82E3],
0x06: [0x1B8342]}, 0x0A),
SPCInstrumentChange(0x10, 0x02, {0x04: [0x1B8308],
0x04: [0x1B83F2]}, 0x02),
SPCInstrumentChange(0x10, 0x03, {0x00: [0x1B8360],
0x02: [0x1B83AD],
0x05: [0x1B83FA]}, 0x0B),
SPCInstrumentChange(0x10, 0x03, {0x01: [0x1B8396],
0x03: [0x1B83CC],
0x06: [0x1B842E]}, 0x0A),
SPCInstrumentChange(0x10, 0x04, {0x00: [0x1B844D],
0x02: [0x1B84A0]}, 0x0B),
SPCInstrumentChange(0x10, 0x04, {0x01: [0x1B847B],
0x03: [0x1B84CD]}, 0x0A),
SPCInstrumentChange(0x10, 0x04, {0x04: [0x1B84ED],
0x05: [0x1B84F5]}, 0x02),
SPCInstrumentChange(0x10, 0x05, {0x00: [0x1B8548],
0x01: [0x1B8575],
0x03: [0x1B85B6]}, 0x0A),
SPCInstrumentChange(0x10, 0x05, {0x02: [0x1B859B],
0x07: [0x1B867F]}, 0x0B),
SPCInstrumentChange(0x10, 0x05, {0x04: [0x1B85D0],
0x05: [0x1B862C]}, 0x02),
SPCInstrumentChange(0x10, 0x06, {0x02: [0x1B8726],
0x06: [0x1B8745]}, 0x0A),
SPCInstrumentChange(0x10, 0x07, {0x00: [0x1B8768]}, 0x0B),
SPCInstrumentChange(0x10, 0x07, {0x00: [0x1B8B04],
0x01: [0x1B8B10],
0x02: [0x1B8775],
0x06: [0x1B87AD]}, 0x0A),
SPCInstrumentChange(0x10, 0x07, {0x05: [0x1B8792]}, 0x16),
SPCInstrumentChange(0x10, 0x08, {0x02: [0x1B86B3]}, 0x0A),
SPCInstrumentChange(0x10, 0x09, {0x00: [0x1B8A63],
0x05: [0x1B8879],
0x06: [0x1B8AED]}, 0x0B),
SPCInstrumentChange(0x10, 0x09, {0x01: [0x1B8A87],
0x02: [0x1B87E5]}, 0x0A),
SPCInstrumentChange(0x10, 0x0A, {0x00: [0x1B88C8],
0x02: [0x1B8946],
0x03: [0x1B88E5]}, 0x0B),
SPCInstrumentChange(0x10, 0x0A, {0x01: [0x1B892C],
0x07: [0x1B8905]}, 0x0A),
SPCInstrumentChange(0x10, 0x0A, {0x04: [0x1B897D]}, 0x02),
SPCInstrumentChange(0x11, 0x00, {0x00: [0x1B8C95],
0x01: [0x1B8CA2],
0x02: [0x1B8CB1],
0x03: [0x1B8CC0],
0x04: [0x1B8CCF]}, 0x0A, type=Me, ban=[0x0D]),
SPCInstrumentChange(0x11, 0x01, {0x05: [0x1B8CFF]}, 0x0A, ban=[0x04]),
SPCInstrumentChange(0x11, 0x02, {0x03: [0x1B8D6B]}, 0x09),
SPCInstrumentChange(0x11, 0x04, {0x04: [0x1B8E2B]}, 0x11),
SPCInstrumentChange(0x11, 0x05, {0x05: [0x1B90F6]}, 0x11),
SPCInstrumentChange(0x12, 0x00, {0x00: [0x1B9275],
0x01: [0x1B9282],
0x05: [0x1B92DE]}, 0x0A),
SPCInstrumentChange(0x12, 0x00, {0x02: [0x1B9290],
0x03: [0x1B92AB]}, 0x11),
SPCInstrumentChange(0x12, 0x00, {0x04: [0x1B92C6]}, 0x02),
SPCInstrumentChange(0x12, 0x00, {0x05: [0x1B92D3]}, 0x10, type=[0x08, 0x10, 0x17]),
SPCInstrumentChange(0x12, 0x01, {0x00: [0x1B917D],
0x01: [0x1B918A],
0x05: [0x1B91E6],
0x06: [0x1B9229]}, 0x0A),
SPCInstrumentChange(0x12, 0x01, {0x02: [0x1B9198],
0x03: [0x1B91B3]}, 0x11),
SPCInstrumentChange(0x12, 0x01, {0x04: [0x1B91CE]}, 0x02),
SPCInstrumentChange(0x12, 0x01, {0x05: [0x1B91DB],
0x06: [0x1B921E]}, 0x10, type=[0x08, 0x10, 0x17]),
SPCInstrumentChange(0x12, 0x02, {0x00: [0x1B9313],
0x01: [0x1B9320],
0x05: [0x1B937C],
0x06: [0x1B93BF]}, 0x0A),
SPCInstrumentChange(0x12, 0x02, {0x02: [0x1B932E],
0x03: [0x1B9349]}, 0x11),
SPCInstrumentChange(0x12, 0x02, {0x04: [0x1B9364]}, 0x02),
SPCInstrumentChange(0x12, 0x02, {0x05: [0x1B9371],
0x06: [0x1B93B4]}, 0x10, type=[0x08, 0x10, 0x17]),
SPCInstrumentChange(0x13, 0x00, {0x00: [0x1B9458],
0x02: [0x1B94DA],
0x03: [0x1B953E],
0x04: [0x1B95A2],
0x05: [0x1B9606]}, 0x0B),
SPCInstrumentChange(0x13, 0x00, {0x01: [0x1B94A4]}, 0x11),
SPCInstrumentChange(0x13, 0x00, {0x06: [0x1B9650],
0x07: [0x1B9696]}, 0x0F),
SPCInstrumentChange(0x13, 0x00, {0x06: [0x1B967B],
0x07: [0x1B96C0]}, 0x02, ban=[0x0B]),
SPCInstrumentChange(0x14, 0x00, {0x00: [0x1B9901, 0x1B97A8]}, 0x15),
SPCInstrumentChange(0x14, 0x01, {0x01: [0x1B97C4],
0x02: [0x1B97DE],
0x03: [0x1B97FD],
0x04: [0x1B9813],
0x05: [0x1B982A]}, 0x15),
SPCInstrumentChange(0x15, 0x00, {0x00: [0x1B9A32],
0x01: [0x1B9A50],
0x02: [0x1B9A6D],
0x03: [0x1B9A8A]}, 0x0B),
SPCInstrumentChange(0x15, 0x00, {0x04: [0x1B9AA0]}, 0x02, type=Am|Be, ban=[0x01, 0x05, 0x10]),
SPCInstrumentChange(0x15, 0x01, {0x00: [0x1B9971]}, 0x02, type=Am|Be, ban=[0x01, 0x05, 0x10]),
SPCInstrumentChange(0x15, 0x01, {0x01: [0x1B9984],
0x02: [0x1B99AA],
0x03: [0x1B99D7]}, 0x0B),
SPCInstrumentChange(0x15, 0x01, {0x04: [0x1B9A04]}, 0x14),
SPCInstrumentChange(0x15, 0x02, {0x00: [0x1B9B45]}, 0x02, type=Am|Be, ban=[0x01, 0x05, 0x10]),
SPCInstrumentChange(0x15, 0x02, {0x01: [0x1B9B58],
0x02: [0x1B9B7E],
0x03: [0x1B9BAB]}, 0x0B),
SPCInstrumentChange(0x15, 0x02, {0x04: [0x1B9BD8]}, 0x14),
SPCInstrumentChange(0x16, 0x00, {0x00: [0x1B9CE6],
0x01: [0x1B9CF1]}, 0x09),
SPCInstrumentChange(0x16, 0x01, {0x00: [0x1B9C82],
0x01: [0x1B9C8B],
0x02: [0x1B9C93],
0x03: [0x1B9CAA]}, 0x09),
SPCInstrumentChange(0x16, 0x01, {0x04: [0x1B9CBA]}, 0x09),
SPCInstrumentChange(0x16, 0x02, {0x00: [0x1B9CFB],
0x01: [0x1B9D44]}, 0x09),
SPCInstrumentChange(0x16, 0x03, {0x00: [0x1B9DBE],
0x01: [0x1B9E47],
0x05: [0x1B9EE4]}, 0x09),
SPCInstrumentChange(0x17, 0x00, {0x00: [0x1BA287],
0x03: [0x1BA26A]}, 0x0E, type=[0x0E, 0x0F, 0x18]),
SPCInstrumentChange(0x17, 0x01, {0x01: [0x1BA20F],
0x03: [0x1BA24F]}, 0x0E, type=Rh, ban=[0x0B, 0x0D, 0x16]),
SPCInstrumentChange(0x17, 0x01, {0x02: [0x1BA231]}, 0x0F),
SPCInstrumentChange(0x19, 0x00, {0x00: [0x1BA476],
0x01: [0x1BA49C],
0x02: [0x1BA4C1],
0x03: [0x1BA4D5],
0x04: [0x1BA4F4],
0x05: [0x1BA513]}, 0x0A),
SPCInstrumentChange(0x19, 0x01, {0x00: [0x1BA357],
0x01: [0x1BA379],
0x03: [0x1BA38C],
0x04: [0x1BA39D]}, 0x0A),
SPCInstrumentChange(0x19, 0x02, {0x02: [0x1BA3D3]}, 0x15),
SPCInstrumentChange(0x19, 0x03, {0x00: [0x1BA3F8]}, 0x16),
SPCInstrumentChange(0x19, 0x03, {0x02: [0x1BA40D]}, 0x0A),
SPCInstrumentChange(0x1A, 0x00, {0x00: [0x1BA70E, 0x1BA71A],
0x01: [0x1BA729],
0x02: [0x1BA743],
0x03: [0x1BA763],
0x04: [0x1BA783],
0x05: [0x1BA7A2],
0x06: [0x1BA7B9],
0x07: [0x1BA7D0]}, 0x0E, type=Rh|Am, ban=[0x01, 0x05, 0x06, 0x10]),
SPCInstrumentChange(0x1A, 0x01, {0x00: [0x1BA5C1],
0x05: [0x1BA68F],
0x06: [0x1BA6A6],
0x07: [0x1BA6DD]}, 0x0A),
SPCInstrumentChange(0x1B, 0x00, {0x00: [0x1BAA55],
0x01: [0x1BAA66],
0x02: [0x1BAA75],
0x03: [0x1BAA86],
0x04: [0x1BAA97]}, 0x0F),
SPCInstrumentChange(0x1B, 0x01, {0x00: [0x1BA956],
0x01: [0x1BA96F],
0x02: [0x1BA98A],
0x03: [0x1BA9A5],
0x04: [0x1BA9C0],
0x05: [0x1BA9EB],
0x06: [0x1BAA19]}, 0x0F),
SPCInstrumentChange(0x1C, 0x00, {0x00: [0x1BACB6, 0x1BABAD]}, 0x09),
SPCInstrumentChange(0x1C, 0x01, {0x01: [0x1BABC7],
0x02: [0x1BABE0],
0x03: [0x1BABF4],
0x04: [0x1BAC0B]}, 0x09),
SPCInstrumentChange(0x1C, 0x02, {0x00: [0x1BAC26],
0x01: [0x1BAC44],
0x02: [0x1BAC61]}, 0x09),
SPCInstrumentChange(0x1D, 0x00, {0x00: [0x1BACEA],
0x01: [0x1BAD06],
0x02: [0x1BAD23],
0x03: [0x1BAD40],
0x04: [0x1BAD5D]}, 0x0B),
SPCInstrumentChange(0x1E, 0x00, {0x00: [0x1BB14D],
0x01: [0x1BB169],
0x02: [0x1BB17E],
0x03: [0x1BB193],
0x04: [0x1BB1A8]}, 0x09),
SPCInstrumentChange(0x1E, 0x00, {0x05: [0x1BB1BD]}, 0x02),
SPCInstrumentChange(0x1F, 0x00, {0x00: [0x1BAE86],
0x03: [0x1BAEC6],
0x04: [0x1BAEE4]}, 0x0B),
SPCInstrumentChange(0x1F, 0x00, {0x00: [0x1BAE9C]}, 0x18),
SPCInstrumentChange(0x1F, 0x00, {0x02: [0x1BAEBC]}, 0x13, type=Am|Be, ban=[0x01, 0x05, 0x0F]),
SPCInstrumentChange(0x1F, 0x00, {0x06: [0x1BAF02]}, 0x02, ban=[0x10]),
SPCInstrumentChange(0x1F, 0x01, {0x03: [0x1BAE15],
0x04: [0x1BAE32],
0x05: [0x1BAE4F]}, 0x11),
SPCInstrumentChange(0x1F, 0x02, {0x01: [0x1BAF2C]}, 0x0B),
SPCInstrumentChange(0x1F, 0x02, {0x03: [0x1BAF53],
0x04: [0x1BAF69],
0x05: [0x1BAF7F]}, 0x11),
SPCInstrumentChange(0x1F, 0x04, {0x02: [0x1BAFAA]}, 0x13, type=Am|Be, ban=[0x01, 0x05, 0x0F]),
SPCInstrumentChange(0x20, 0x00, {0x00: [0x1AD49A],
0x01: [0x1AD4BA],
0x02: [0x1AD4D3],
0x03: [0x1AD4EE],
0x04: [0x1AD507]}, 0x0A),
SPCInstrumentChange(0x20, 0x01, {0x05: [0x1AD475]}, 0x18),
SPCInstrumentChange(0x21, 0x00, {0x00: [0x1AE8E3],
0x01: [0x1AF18E],
0x02: [0x1AF1A9],
0x03: [0x1AF1B7],
0x04: [0x1AF1D2],
0x05: [0x1AF1E4],
0x06: [0x1AF201],
0x07: [0x1AF21C]}, 0x0F),
SPCInstrumentChange(0x21, 0x01, {0x00: [0x1AE518]}, 0x12),
SPCInstrumentChange(0x21, 0x01, {0x01: [0x1AE540],
0x03: [0x1AE58D]}, 0x0B),
SPCInstrumentChange(0x21, 0x01, {0x02: [0x1AE564]}, 0x09),
SPCInstrumentChange(0x21, 0x01, {0x04: [0x1AE5B1],
0x05: [0x1AE5D4]}, 0x0A),
SPCInstrumentChange(0x21, 0x01, {0x06: [0x1AE5EB, 0x1AE60F]}, 0x02, ban=[0x04]),
SPCInstrumentChange(0x21, 0x01, {0x06: [0x1AE5F9],
0x07: [0x1AE61B]}, 0x0C),
SPCInstrumentChange(0x21, 0x02, {0x03: [0x1AE651],
0x05: [0x1AE69A]}, 0x0A),
SPCInstrumentChange(0x21, 0x03, {0x00: [0x1AEC5E],
0x01: [0x1AEC71],
0x02: [0x1AEC90]}, 0x0A),
SPCInstrumentChange(0x21, 0x04, {0x01: [0x1AECB6]}, 0x0A),
SPCInstrumentChange(0x21, 0x04, {0x07: [0x1AF3A3]}, 0x0F),
SPCInstrumentChange(0x21, 0x05, {0x00: [0x1AE6D5],
0x01: [0x1AE6FD],
0x03: [0x1AE748],
0x04: [0x1AE75E]}, 0x0A),
SPCInstrumentChange(0x21, 0x05, {0x02: [0x1AE72A]}, 0x09),
SPCInstrumentChange(0x21, 0x06, {0x00: [0x1AE774]}, 0x0A),
SPCInstrumentChange(0x21, 0x06, {0x02: [0x1AE7BE],
0x04: [0x1AE825]}, 0x09),
SPCInstrumentChange(0x21, 0x07, {0x00: [0x1AED48],
0x01: [0x1AED7B],
0x03: [0x1AEDCD],
0x04: [0x1AEDF4]}, 0x0A),
SPCInstrumentChange(0x21, 0x07, {0x02: [0x1AEDB1]}, 0x09),
SPCInstrumentChange(0x21, 0x08, {0x00: [0x1AE876],
0x01: [0x1AE881]}, 0x0A),
SPCInstrumentChange(0x21, 0x0A, {0x02: [0x1AF17C],
0x03: [0x1AE8BB]}, 0x09),
SPCInstrumentChange(0x21, 0x0B, {0x00: [0x1AEE0F]}, 0x11),
SPCInstrumentChange(0x21, 0x0B, {0x01: [0x1AEE22],
0x03: [0x1AEE46],
0x04: [0x1AEE74]}, 0x0A),
SPCInstrumentChange(0x21, 0x0C, {0x01: [0x1AEECD],
0x03: [0x1AEEF9],
0x04: [0x1AEF2B]}, 0x0A),
SPCInstrumentChange(0x21, 0x0D, {0x00: [0x1AE954],
0x03: [0x1AE9D4],
0x04: [0x1AEA03]}, 0x18),
SPCInstrumentChange(0x21, 0x0D, {0x00: [0x1AE971]}, 0x12),
SPCInstrumentChange(0x21, 0x0D, {0x01: [0x1AE983]}, 0x09),
SPCInstrumentChange(0x21, 0x0D, {0x01: [0x1AE9A6],
0x03: [0x1AE9F3]}, 0x0B),
SPCInstrumentChange(0x21, 0x0D, {0x02: [0x1AE9B6]}, 0x0A),
SPCInstrumentChange(0x21, 0x0E, {0x00: [0x1AEA4F]}, 0x12),
SPCInstrumentChange(0x21, 0x0E, {0x01: [0x1AEA84],
0x03: [0x1AEAE7],
0x05: [0x1AEB94]}, 0x0B),
SPCInstrumentChange(0x21, 0x0E, {0x02: [0x1AEAAF]}, 0x09),
SPCInstrumentChange(0x21, 0x0E, {0x04: [0x1AEB69]}, 0x0A),
SPCInstrumentChange(0x21, 0x0E, {0x06: [0x1AEC03]}, 0x02),
SPCInstrumentChange(0x21, 0x0E, {0x07: [0x1AEC3C]}, 0x0C),
SPCInstrumentChange(0x22, 0x00, {0x00: [0x1ADA2D],
0x01: [0x1ADA41],
0x02: [0x1ADA51],
0x03: [0x1ADA6C],
0x04: [0x1ADA83]}, 0x0A),
SPCInstrumentChange(0x22, 0x01, {0x05: [0x1ADAC9]}, 0x0A),
SPCInstrumentChange(0x22, 0x02, {0x07: [0x1ADB60]}, 0x0A),
SPCInstrumentChange(0x22, 0x03, {0x06: [0x1ADC10]}, 0x16),
SPCInstrumentChange(0x22, 0x05, {0x05: [0x1AD7CC]}, 0x09),
SPCInstrumentChange(0x22, 0x05, {0x06: [0x1AD803]}, 0x11),
SPCInstrumentChange(0x22, 0x05, {0x07: [0x1AD81B]}, 0x0A),
SPCInstrumentChange(0x22, 0x06, {0x02: [0x1AD8A6]}, 0x11),
SPCInstrumentChange(0x22, 0x06, {0x03: [0x1AD959]}, 0x13),
SPCInstrumentChange(0x22, 0x06, {0x06: [0x1AD9B7]}, 0x16),
SPCInstrumentChange(0x22, 0x07, {0x00: [0x1ADCCD]}, 0x0B),
SPCInstrumentChange(0x22, 0x07, {0x02: [0x1ADD73]}, 0x11),
SPCInstrumentChange(0x22, 0x07, {0x04: [0x1ADDE0],
0x07: [0x1ADE9E]}, 0x0A),
SPCInstrumentChange(0x22, 0x07, {0x05: [0x1ADE14]}, 0x12),
SPCInstrumentChange(0x22, 0x07, {0x06: [0x1ADE62]}, 0x16),
SPCInstrumentChange(0x22, 0x08, {0x00: [0x1ADF02],
0x04: [0x1ADFA8]}, 0x0B),
SPCInstrumentChange(0x22, 0x08, {0x01: [0x1ADF2A]}, 0x11),
SPCInstrumentChange(0x22, 0x08, {0x02: [0x1ADF83],
0x05: [0x1ADFED]}, 0x09),
SPCInstrumentChange(0x22, 0x08, {0x06: [0x1AE02D],
0x07: [0x1AE047]}, 0x0A)
]

View File

@@ -57,6 +57,7 @@ SETTINGSTOPROCESS = {
"item": {
"hints": "hints",
"pseudoboots": "pseudoboots",
'collection_rate': 'collection_rate',
"race": "race",
"worldstate": "mode",
@@ -139,8 +140,9 @@ SETTINGSTOPROCESS = {
"uwpalettes": "uw_palettes",
"reduce_flashing": "reduce_flashing",
"shuffle_sfx": "shuffle_sfx",
"shuffle_sfxinstruments": "shuffle_sfxinstruments",
"shuffle_songinstruments": "shuffle_songinstruments",
'msu_resume': 'msu_resume',
'collection_rate': 'collection_rate',
},
"generation": {
"bps": "bps",
@@ -148,7 +150,7 @@ SETTINGSTOPROCESS = {
"createrom": "create_rom",
"calcplaythrough": "calc_playthrough",
"print_custom_yaml": "print_custom_yaml",
"saveonexit": "saveonexit"
"settingsonload": "settingsonload"
}
},
"startinventory": {

View File

@@ -72,11 +72,13 @@ def generate_dungeon_find_proposal(builder, entrance_region_names, split_dungeon
entrance_regions = [x for x in entrance_regions if x not in excluded.keys()]
doors_to_connect, idx = {}, 0
all_regions = set()
bk_special = False
for sector in builder.sectors:
for door in sector.outstanding_doors:
doors_to_connect[door.name] = door, idx
idx += 1
all_regions.update(sector.regions)
bk_special |= check_for_special(sector.regions)
finished = False
# flag if standard and this is hyrule castle
paths = determine_paths_for_dungeon(world, player, all_regions, name)
@@ -95,9 +97,9 @@ def generate_dungeon_find_proposal(builder, entrance_region_names, split_dungeon
if hash_code not in hash_code_set:
hash_code_set.add(hash_code)
explored_state = explore_proposal(name, entrance_regions, all_regions, proposed_map, doors_to_connect,
world, player)
bk_special, world, player)
if check_valid(name, explored_state, proposed_map, doors_to_connect, all_regions,
paths, entrance_regions, world, player):
paths, entrance_regions, bk_special, world, player):
finished = True
else:
proposed_map, hash_code = modify_proposal(proposed_map, explored_state, doors_to_connect,
@@ -229,21 +231,24 @@ def modify_proposal(proposed_map, explored_state, doors_to_connect, hash_code_se
return proposed_map, hash_code
def explore_proposal(name, entrance_regions, all_regions, proposed_map, valid_doors, world, player):
def explore_proposal(name, entrance_regions, all_regions, proposed_map, valid_doors, bk_special, world, player):
start = ExplorationState(dungeon=name)
bk_relevant = (world.door_type_mode[player] == 'original' and not world.bigkeyshuffle[player]) or bk_special
start.big_key_special = bk_special
original_state = extend_reachable_state_lenient(entrance_regions, start, proposed_map,
all_regions, valid_doors, world, player)
all_regions, valid_doors, bk_relevant, world, player)
return original_state
def check_valid(name, exploration_state, proposed_map, doors_to_connect, all_regions,
paths, entrance_regions, world, player):
paths, entrance_regions, bk_special, world, player):
all_visited = set()
all_visited.update(exploration_state.visited_blue)
all_visited.update(exploration_state.visited_orange)
if len(all_regions.difference(all_visited)) > 0:
return False
if not valid_paths(name, paths, entrance_regions, doors_to_connect, all_regions, proposed_map, world, player):
if not valid_paths(name, paths, entrance_regions, doors_to_connect, all_regions, proposed_map,
bk_special, world, player):
return False
return True
@@ -266,7 +271,7 @@ def check_for_special(regions):
return False
def valid_paths(name, paths, entrance_regions, valid_doors, all_regions, proposed_map, world, player):
def valid_paths(name, paths, entrance_regions, valid_doors, all_regions, proposed_map, bk_special, world, player):
for path in paths:
if type(path) is tuple:
target = path[1]
@@ -278,12 +283,13 @@ def valid_paths(name, paths, entrance_regions, valid_doors, all_regions, propose
else:
target = path
start_regions = entrance_regions
if not valid_path(name, start_regions, target, valid_doors, proposed_map, all_regions, world, player):
if not valid_path(name, start_regions, target, valid_doors, proposed_map, all_regions,
bk_special, world, player):
return False
return True
def valid_path(name, starting_regions, target, valid_doors, proposed_map, all_regions, world, player):
def valid_path(name, starting_regions, target, valid_doors, proposed_map, all_regions, bk_special, world, player):
target_regions = set()
if type(target) is not list:
for region in all_regions:
@@ -296,8 +302,10 @@ def valid_path(name, starting_regions, target, valid_doors, proposed_map, all_re
target_regions.add(region)
start = ExplorationState(dungeon=name)
bk_relevant = (world.door_type_mode[player] == 'original' and not world.bigkeyshuffle[player]) or bk_special
start.big_key_special = bk_special
original_state = extend_reachable_state_lenient(starting_regions, start, proposed_map, all_regions,
valid_doors, world, player)
valid_doors, bk_relevant, world, player)
for exp_door in original_state.unattached_doors:
if not exp_door.door.blocked or exp_door.door.trapFlag != 0:
@@ -531,7 +539,7 @@ class ExplorationState(object):
self.crystal = exp_door.crystal
return exp_door
def visit_region(self, region, key_region=None, key_checks=False, bk_flag=False):
def visit_region(self, region, key_region=None, key_checks=False, bk_relevant=False):
if region.type != RegionType.Dungeon:
self.crystal = CrystalBarrier.Orange
if self.crystal == CrystalBarrier.Either:
@@ -552,8 +560,14 @@ class ExplorationState(object):
self.ttl_locations += 1
if location not in self.found_locations:
self.found_locations.append(location)
if not bk_flag:
self.bk_found.add(location)
if bk_relevant:
if self.big_key_special:
if special_big_key_found(self):
self.bk_found.add(location)
self.re_add_big_key_doors()
else:
self.bk_found.add(location)
self.re_add_big_key_doors()
if location.name in dungeon_events and location.name not in self.events:
if self.flooded_key_check(location):
self.perform_event(location.name, key_region)
@@ -574,6 +588,14 @@ class ExplorationState(object):
return True
return False
def re_add_big_key_doors(self):
self.big_key_opened = True
queue = collections.deque(self.big_doors)
while len(queue) > 0:
exp_door = queue.popleft()
self.avail_doors.append(exp_door)
self.big_doors.remove(exp_door)
def perform_event(self, location_name, key_region):
self.events.add(location_name)
queue = collections.deque(self.event_doors)
@@ -640,7 +662,7 @@ class ExplorationState(object):
self.append_door_to_list(door, self.avail_doors, flag)
# same as above but traps are ignored, and flag is not used
def add_all_doors_check_proposed_2(self, region, proposed_map, valid_doors, world, player):
def add_all_doors_check_proposed_2(self, region, proposed_map, valid_doors, bk_relevant, world, player):
for door in get_doors(world, region, player):
if door in proposed_map and door.name in valid_doors:
self.visited_doors.add(door)
@@ -654,14 +676,18 @@ class ExplorationState(object):
other = self.find_door_in_list(door, self.unattached_doors)
if self.crystal != other.crystal:
other.crystal = CrystalBarrier.Either
elif door.req_event is not None and door.req_event not in self.events and not self.in_door_list(door,
self.event_doors):
elif (door.req_event is not None and door.req_event not in self.events
and not self.in_door_list(door, self.event_doors)):
self.append_door_to_list(door, self.event_doors)
elif (bk_relevant and (door.bigKey or door.name in get_special_big_key_doors(world, player))
and not self.big_key_opened):
if not self.in_door_list(door, self.big_doors):
self.append_door_to_list(door, self.big_doors)
elif not self.in_door_list(door, self.avail_doors):
self.append_door_to_list(door, self.avail_doors)
# same as above but traps are checked for
def add_all_doors_check_proposed_3(self, region, proposed_map, valid_doors, world, player):
def add_all_doors_check_proposed_3(self, region, proposed_map, valid_doors, bk_relevant, world, player):
for door in get_doors(world, region, player):
if door in proposed_map and door.name in valid_doors:
self.visited_doors.add(door)
@@ -675,9 +701,13 @@ class ExplorationState(object):
other = self.find_door_in_list(door, self.unattached_doors)
if self.crystal != other.crystal:
other.crystal = CrystalBarrier.Either
elif door.req_event is not None and door.req_event not in self.events and not self.in_door_list(door,
self.event_doors):
elif (door.req_event is not None and door.req_event not in self.events
and not self.in_door_list(door, self.event_doors)):
self.append_door_to_list(door, self.event_doors)
elif (bk_relevant and (door.bigKey or door.name in get_special_big_key_doors(world, player))
and not self.big_key_opened):
if not self.in_door_list(door, self.big_doors):
self.append_door_to_list(door, self.big_doors)
elif not self.in_door_list(door, self.avail_doors):
self.append_door_to_list(door, self.avail_doors)
@@ -863,16 +893,22 @@ def extend_reachable_state_improved(search_regions, state, proposed_map, all_reg
return local_state
def extend_reachable_state_lenient(search_regions, state, proposed_map, all_regions, valid_doors, world, player):
# bk_relevant means the big key doors need to be checks
def extend_reachable_state_lenient(search_regions, state, proposed_map, all_regions, valid_doors, bk_relevant,
world, player):
local_state = state.copy()
for region in search_regions:
local_state.visit_region(region)
local_state.visit_region(region, bk_relevant=bk_relevant)
if world.trap_door_mode[player] == 'vanilla':
local_state.add_all_doors_check_proposed_3(region, proposed_map, valid_doors, world, player)
local_state.add_all_doors_check_proposed_3(region, proposed_map, valid_doors, bk_relevant, world, player)
else:
local_state.add_all_doors_check_proposed_2(region, proposed_map, valid_doors, world, player)
local_state.add_all_doors_check_proposed_2(region, proposed_map, valid_doors, bk_relevant, world, player)
while len(local_state.avail_doors) > 0:
explorable_door = local_state.next_avail_door()
if explorable_door.door.bigKey:
if bk_relevant and (not special_big_key_found(local_state) if local_state.big_key_special
else local_state.count_locations_exclude_specials(world, player) == 0):
continue
if explorable_door.door in proposed_map:
connect_region = world.get_entrance(proposed_map[explorable_door.door].name, player).parent_region
else:
@@ -880,11 +916,13 @@ def extend_reachable_state_lenient(search_regions, state, proposed_map, all_regi
if connect_region is not None:
if (valid_region_to_explore_in_regions(connect_region, all_regions, world, player)
and not local_state.visited(connect_region)):
local_state.visit_region(connect_region)
local_state.visit_region(connect_region, bk_relevant=bk_relevant)
if world.trap_door_mode[player] == 'vanilla':
local_state.add_all_doors_check_proposed_3(connect_region, proposed_map, valid_doors, world, player)
local_state.add_all_doors_check_proposed_3(connect_region, proposed_map, valid_doors,
bk_relevant, world, player)
else:
local_state.add_all_doors_check_proposed_2(connect_region, proposed_map, valid_doors, world, player)
local_state.add_all_doors_check_proposed_2(connect_region, proposed_map, valid_doors,
bk_relevant, world, player)
return local_state

View File

@@ -0,0 +1,710 @@
UwGeneralDeny:
- [ 0x0002, 0, [ "RollerVerticalDown", "Statue" ] ] #"Sewers - Rat Pots - Rat 1"
- [ 0x0002, 1, [ "RollerVerticalDown", "Statue" ] ] #"Sewers - Rat Pots - Rat 2"
- [ 0x0002, 2, [ "RollerVerticalUp", "Statue" ] ] #"Sewers - Rat Pots - Rat 3"
- [ 0x0002, 3, [ "RollerVerticalUp", "Statue" ] ] #"Sewers - Rat Pots - Rat 4"
- [ 0x0002, 4, [ "Statue" ] ] #"Sewers - Rat Pots - Rat 5"
- [ 0x0002, 15, [ "RollerVerticalDown", "RollerVerticalUp", "RollerHorizontalRight", "RollerHorizontalLeft" ] ] #"Sewers - Rat Pots - Rat 6"
- [ 0x0002, 16, [ "RollerVerticalDown", "RollerVerticalUp", "RollerHorizontalRight", "RollerHorizontalLeft" ] ] #"Sewers - Rat Pots - Rat 7"
- [ 0x0004, 1, ["Statue"]]
- [ 0x0004, 2, ["Statue"]]
- [ 0x0004, 3, ["Statue"]]
- [ 0x0004, 4, ["Statue"]]
- [ 0x0004, 15, ["Statue"]]
- [ 0x000a, 0, [ "RollerVerticalDown", "RollerVerticalUp" ] ] #"Palace of Darkness - Basement Ledge - Terrorpin 1"
- [ 0x000a, 1, [ "RollerHorizontalRight", "RollerHorizontalLeft" ] ] #"Palace of Darkness - Basement Ledge - Terrorpin 2"
- [ 0x000b, 1, [ "RollerVerticalDown", "RollerHorizontalRight", "Beamos", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Palace of Darkness - Callback - Terrorpin 1"
- [ 0x000e, 0, [ "RollerVerticalDown", "RollerVerticalUp", "RollerHorizontalRight", "RollerHorizontalLeft" ] ] #"Ice Palace - Entrance - Freezor"
- [ 0x000e, 1, [ "RollerVerticalDown", "RollerVerticalUp", "RollerHorizontalRight", "RollerHorizontalLeft" ] ] #"Ice Palace - Bari Key - Top Bari"
- [ 0x000e, 2, [ "RollerVerticalDown", "RollerVerticalUp", "RollerHorizontalRight", "RollerHorizontalLeft" ] ] #"Ice Palace - Bari Key - Middle Bari"
- [ 0x0016, 0, [ "RollerVerticalDown", "RollerVerticalUp", "Beamos", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Swamp Palace - Pool - Zol 1"
- [ 0x0016, 1, [ "RollerVerticalDown", "RollerVerticalUp", "RollerHorizontalRight", "RollerHorizontalLeft", "Beamos", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Swamp Palace - Pool - Zol 2"
- [ 0x0016, 2, [ "SparkCW", "SparkCCW", "RollerVerticalDown", "RollerVerticalUp", "RollerHorizontalRight", "RollerHorizontalLeft", "Beamos", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Swamp Palace - Pool - Blue Bari"
- [ 0x0016, 3, [ "RollerVerticalDown", "RollerVerticalUp", "RollerHorizontalRight", "RollerHorizontalLeft", "Beamos", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Swamp Palace - Pool - Zol 3"
- [ 0x0017, 5, [ "Beamos", "AntiFairyCircle", "SpikeBlock", "Bumper" ] ] #"Tower Of Hera - Bumper Room - Fire Bar (Clockwise)"
- [ 0x0019, 0, [ "SparkCW", "SparkCCW", "RollerVerticalDown", "Beamos", "AntiFairyCircle", "BigSpike", "Bumper" ] ] #"Palace of Darkness - Dark Maze - Kodongo 1"
- [ 0x0019, 1, [ "RollerVerticalUp" ] ] #"Palace of Darkness - Dark Maze - Kodongo 2"
- [ 0x0019, 2, [ "RollerVerticalDown", "RollerVerticalUp" ] ] #"Palace of Darkness - Dark Maze - Kodongo 3"
- [ 0x0019, 3, [ "RollerVerticalDown", "RollerVerticalUp", "RollerHorizontalRight", "RollerHorizontalLeft" ] ] #"Palace of Darkness - Dark Maze - Kodongo 4"
- [ 0x001a, 0, [ "SparkCW", "SparkCCW", "RollerVerticalDown", "RollerVerticalUp", "RollerHorizontalRight", "RollerHorizontalLeft", "Beamos", "AntiFairyCircle", "BigSpike", "FirebarCW", "FirebarCCW", "SpikeBlock", "Bumper" ] ] #"Palace of Darkness - Compass Room - Mini Helmasaur 1"
- [ 0x001a, 5, [ "SparkCW", "SparkCCW", "RollerVerticalDown", "RollerVerticalUp", "RollerHorizontalRight", "RollerHorizontalLeft", "Beamos", "AntiFairyCircle", "BigSpike", "FirebarCW", "FirebarCCW", "SpikeBlock", "Bumper" ] ] #"Palace of Darkness - Compass Room - Mini Helmasaur 2"
- [ 0x001b, 3, [ "Beamos", "AntiFairyCircle", "Bumper" ] ] #"Palace of Darkness - Mimics 2 - Red Eyegore"
- [ 0x001b, 4, [ "RollerVerticalUp" ] ] #"Palace of Darkness - Mimics 2 - Green Eyegore L"
- [ 0x001e, 3, [ "RollerVerticalDown", "RollerVerticalUp", "RollerHorizontalRight", "RollerHorizontalLeft", "BigSpike", "Bumper" ] ] #"Ice Palace - Blob Ambush - Red Bari 3"
- [ 0x001e, 4, [ "RollerVerticalDown", "RollerVerticalUp", "RollerHorizontalRight", "RollerHorizontalLeft", "BigSpike", "Bumper" ] ] #"Ice Palace - Blob Ambush - Red Bari 4"
- [ 0x001e, 5, [ "SparkCW", "SparkCCW", "RollerVerticalDown", "RollerHorizontalRight", "Beamos", "AntiFairyCircle", "BigSpike", "Bumper" ] ] #"Ice Palace - Blob Ambush - Zol 1"
- [ 0x001e, 6, [ "SparkCW", "SparkCCW", "RollerVerticalDown", "RollerVerticalUp", "RollerHorizontalRight", "RollerHorizontalLeft", "Beamos", "AntiFairyCircle", "BigSpike", "Bumper" ] ] #"Ice Palace - Blob Ambush - Zol 2"
- [ 0x001f, 0, [ "RollerHorizontalRight" ] ] #"Ice Palace - Big Key View - Pengator 1"
- [ 0x001f, 3, [ "Wizzrobe", "Statue" ] ] # Wizzrobes can't spawn on pots
- [ 0x0021, 3, [ "RollerVerticalDown", "RollerVerticalUp" ] ] #"Sewers - Dark U - Rat 2"
- [ 0x0021, 4, [ "RollerVerticalDown", "RollerVerticalUp" ] ] #"Sewers - Dark U - Rat 3"
- [ 0x0024, 6, [ "Wizzrobe", "Statue" ] ] # Wizzrobes can't spawn on pots
- [ 0x0026, 1, [ "SparkCW", "SparkCCW", "RollerVerticalDown", "RollerVerticalUp", "RollerHorizontalRight", "RollerHorizontalLeft", "Beamos", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper", "Statue" ] ] #"Swamp Palace - Big Spoon - Red Bari 1"
- [ 0x0026, 8, [ "AntiFairyCircle", "Bumper", "Statue" ] ] #"Swamp Palace - Big Spoon - Red Bari 3"
- [ 0x0026, 9, [ "RollerHorizontalRight", "Statue" ] ] #"Swamp Palace - Big Spoon - Kyameron"
- [ 0x0026, 10, [ "Statue" ] ] # multiple push statues in this room can cause issues
- [ 0x0026, 11, [ "Statue" ] ] # multiple push statues in this room can cause issues
- [ 0x0027, 0, [ "SparkCW", "SparkCCW", "RollerVerticalDown", "RollerVerticalUp", "RollerHorizontalLeft", "FirebarCW" ] ] #"Tower Of Hera - Petting Zoo - Mini Moldorm 1"
- [ 0x0027, 1, [ "RollerVerticalDown", "RollerVerticalUp", "RollerHorizontalRight", "RollerHorizontalLeft", "AntiFairyCircle", "SpikeBlock", "Bumper" ] ] #"Tower Of Hera - Petting Zoo - Mini Moldorm 2"
- [ 0x0027, 2, [ "RollerVerticalDown", "RollerVerticalUp", "RollerHorizontalRight", "RollerHorizontalLeft", "AntiFairyCircle", "SpikeBlock", "Bumper" ] ] #"Tower Of Hera - Petting Zoo - Mini Moldorm 3"
- [ 0x0027, 4, ["Bumper", "BigSpike", "AntiFairyCircle", "RollerVerticalDown", "RollerVerticalUp"]]
- [ 0x0027, 5, [ "SparkCW", "SparkCCW", "RollerVerticalDown", "RollerVerticalUp", "RollerHorizontalLeft", "Beamos", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Tower Of Hera - Petting Zoo - Kodongo 1"
- [ 0x0028, 4, [ "RollerVerticalUp" ] ] #"Swamp Palace - Entrance Ledge - Spike Trap"
- [ 0x002a, 2, [ "SparkCW", "SparkCCW", "RollerHorizontalRight", "RollerHorizontalLeft", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper"]] #"Palace of Darkness - Arena Main - Hardhat Beetle 1"
- [ 0x002a, 3, [ "Statue", "SparkCW", "SparkCCW", "RollerVerticalDown", "RollerVerticalUp", "RollerHorizontalRight", "RollerHorizontalLeft", "Beamos", "AntiFairyCircle", "BigSpike", "FirebarCW", "FirebarCCW", "SpikeBlock", "Bumper" ] ] #"Palace of Darkness - Arena Main - Hardhat Beetle 2"
- [ 0x002a, 4, [ "Statue", "Beamos", "AntiFairyCircle", "BigSpike", "Bumper" ]]
- [ 0x002a, 6, [ "RollerVerticalUp", "RollerHorizontalRight", "RollerHorizontalLeft", "Beamos", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Palace of Darkness - Arena Main - Hardhat Beetle 5"
- [ 0x002b, 5, [ "RollerHorizontalRight" ] ] #"Palace of Darkness - Fairies - Red Bari 2"
- [ 0x002e, 0, [ "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight", "BigSpike", "FirebarCW", "FirebarCCW" ] ] #"Ice Palace - Penguin Chest - Pengator 1"
- [ 0x002e, 1, [ "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight", "BigSpike", "FirebarCW", "FirebarCCW" ] ] #"Ice Palace - Penguin Chest - Pengator 2"
- [ 0x002e, 2, [ "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight", "BigSpike", "FirebarCW", "FirebarCCW" ] ] #"Ice Palace - Penguin Chest - Pengator 3"
- [ 0x002e, 3, [ "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight", "BigSpike", "FirebarCW", "FirebarCCW" ] ] #"Ice Palace - Penguin Chest - Pengator 4"
- [ 0x002e, 4, [ "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight", "BigSpike", "FirebarCW", "FirebarCCW" ] ] #"Ice Palace - Penguin Chest - Pengator 5"
- [ 0x002e, 5, [ "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight", "BigSpike", "FirebarCW", "FirebarCCW" ] ] #"Ice Palace - Penguin Chest - Pengator 6"
- [ 0x0034, 0, [ "SparkCW", "SparkCCW", "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Swamp Palace - West Wing - Hover 1"
- [ 0x0034, 1, [ "SparkCW", "SparkCCW", "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Swamp Palace - West Wing - Hover 2"
- [ 0x0034, 2, [ "SparkCW", "SparkCCW", "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Swamp Palace - West Wing - Kyameron"
- [ 0x0034, 4, [ "Statue", "SparkCW", "SparkCCW", "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight", "Beamos", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Swamp Palace - West Wing - Zol"
- [ 0x0035, 6, [ "RollerHorizontalRight" ] ] #"Swamp Palace - West Lever - Stalfos 2"
- [ 0x0035, 9, [ "RollerHorizontalRight", "Beamos", "AntiFairyCircle", "Bumper" ] ] #"Swamp Palace - West Lever - Blue Bari"
- [ 0x0036, 7, [ "RollerHorizontalRight", "Beamos", "AntiFairyCircle", "BigSpike", "FirebarCW", "FirebarCCW", "SpikeBlock", "Bumper" ] ] #"Swamp Palace - Lobby - Hover 3"
- [ 0x0037, 7, [ "RollerHorizontalRight" ] ] #"Swamp Palace - Water 1 - Blue Bari"
- [ 0x0038, 4, [ "RollerHorizontalRight" ] ] #"Swamp Palace - Long Hall - Kyameron 2"
- [ 0x0039, 3, [ "RollerVerticalUp", "RollerHorizontalLeft" ] ] #"Skull Woods - Play Pen - Mini Helmasaur"
- [ 0x0039, 4, [ "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight", "FirebarCW", "FirebarCCW" ] ] #"Skull Woods - Play Pen - Spike Trap 1"
- [ 0x0039, 5, [ "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft" ] ] #"Skull Woods - Play Pen - Hardhat Beetle"
- [ 0x0039, 6, [ "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight", "FirebarCW", "FirebarCCW" ] ] #"Skull Woods - Play Pen - Spike Trap 2"
- [ 0x003b, 1, [ "Bumper" ]]
- [ 0x003c, 0, ["BigSpike"]]
- [ 0x003c, 1, [ "SparkCW", "SparkCCW", "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight", "Beamos", "AntiFairyCircle", "BigSpike", "Bumper" ] ] #"Hookshot Cave - Blue Bari 1"
- [ 0x003c, 2, [ "SparkCW", "SparkCCW", "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight", "Beamos", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Hookshot Cave - Blue Bari 2"
- [ 0x003d, 9, [ "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Ganon's Tower - Torches 2 - Spark (Counterclockwise)"
- [ 0x003d, 10, [ "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Ganon's Tower - Torches 2 - Spark (Clockwise) 1"
- [ 0x003d, 12, [ "AntiFairyCircle", "Bumper" ] ] #"Ganon's Tower - Torches 2 - Bunny Beam"
- [ 0x003d, 13, [ "AntiFairyCircle", "Bumper" ] ] #"Ganon's Tower - Torches 2 - Antifairy"
- [ 0x003f, 1, [ "RollerHorizontalLeft", "RollerHorizontalRight", "AntiFairyCircle", "BigSpike", "FirebarCW", "FirebarCCW", "SpikeBlock", "Bumper", "Statue"] ] #"Ice Palace - P Room - Stalfos Knight 1"
- [ 0x003f, 3, [ "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper", "Statue"] ] #"Ice Palace - P Room - Stalfos Knight 2"
- [ 0x003f, 4, [ "Wizzrobe", "Statue", "Bumper", "BigSpike", "AntiFairyCircle"]] # Wizzrobes can't spawn on pots
- [ 0x0040, 0, [ "RollerVerticalUp", "RollerVerticalDown", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] # Agahnims Tower - Bridge - Blue Guard 1
- [ 0x0040, 1, [ "Statue", "RollerVerticalUp", "RollerVerticalDown", "Beamos", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] # Agahnims Tower - Bridge - Blue Guard 2
- [ 0x0041, 0, [ "RollerHorizontalLeft" ] ] #"Sewers - Dark Cactus - Rat 1"
- [ 0x0041, 1, [ "RollerVerticalDown", "RollerHorizontalRight" ] ] #"Sewers - Dark Cactus - Rat 2"
- [ 0x0041, 2, [ "RollerVerticalUp" ] ] #"Sewers - Dark Cactus - Rat 3"
- [ 0x0042, 0, [ "SparkCW", "SparkCCW", "RollerHorizontalLeft", "Beamos", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Sewers - Dark Rope Corridor - Rope 1"
- [ 0x0042, 1, [ "SparkCW", "SparkCCW", "RollerHorizontalLeft", "Beamos", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Sewers - Dark Rope Corridor - Rope 2"
- [ 0x0042, 2, [ "SparkCW", "SparkCCW", "RollerHorizontalLeft", "Beamos", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Sewers - Dark Rope Corridor - Rope 3"
- [ 0x0042, 3, [ "SparkCW", "SparkCCW", "RollerHorizontalLeft", "Beamos", "AntiFairyCircle", "BigSpike", "Bumper" ] ] #"Sewers - Dark Rope Corridor - Rope 4"
- [ 0x0042, 4, [ "SparkCW", "SparkCCW", "RollerHorizontalLeft", "Beamos", "AntiFairyCircle", "BigSpike", "Bumper" ] ] #"Sewers - Dark Rope Corridor - Rope 5"
- [ 0x0042, 5, [ "SparkCW", "SparkCCW", "RollerHorizontalLeft", "Beamos", "AntiFairyCircle", "BigSpike", "Bumper" ] ] #"Sewers - Dark Rope Corridor - Rope 6"
- [ 0x0044, 4, [ "RollerVerticalUp", "RollerHorizontalLeft", "RollerHorizontalRight", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Thieves' Town - Joke Room - Zol"
- [ 0x0044, 6, [ "RollerVerticalUp", "RollerVerticalDown", "Beamos", "BigSpike" ] ] #"Thieves' Town - Joke Room - Red Bari"
- [ 0x0044, 8, [ "Statue", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight", "AntiFairyCircle", "SpikeBlock", "Bumper" ] ] #"Thieves' Town - Joke Room - Blue Bari 4"
- [ 0x0045, 1, [ "RollerVerticalUp", "RollerVerticalDown" ] ] #"Thieves' Town - Basement Block Totems - Red Zazak"
- [ 0x0045, 4, [ "Wizzrobe", "Statue" ] ] # Wizzrobes can't spawn on pots
- [ 0x0045, 7, [ "AntiFairyCircle", "Bumper" ] ] #"Thieves' Town - Cells - Blue Zazak 4"
- [ 0x0045, 8, [ "RollerHorizontalRight" ] ] #"Thieves' Town - Cells - Zol"
- [ 0x0046, 0, [ "RollerVerticalUp", "RollerHorizontalRight", "AntiFairyCircle", "BigSpike", "Bumper", "Statue" ] ] #"Swamp Palace - Big O Top - Hover 1"
- [ 0x0046, 2, [ "RollerVerticalDown", "RollerHorizontalLeft", "AntiFairyCircle", "BigSpike", "Bumper", "Statue" ] ] #"Swamp Palace - Big O Top - Hover 2"
- [ 0x0046, 4, [ "RollerHorizontalLeft", "RollerHorizontalRight", "AntiFairyCircle", "BigSpike", "Bumper", "Statue" ] ] #"Swamp Palace - Big O Top - Hover 3"
- [ 0x0049, 5, [ "RollerVerticalUp", "RollerVerticalDown" ] ] #"Skull Woods - Bari Pits - Gibdo 2"
- [ 0x0049, 7, [ "RollerVerticalUp", "RollerVerticalDown" ] ] #"Skull Woods - Bari Pits - Gibdo 4"
- [ 0x0049, 8, [ "Beamos", "AntiFairyCircle", "Bumper" ] ] #"Skull Woods - Bari Pits - Gibdo 5"
- [ 0x004b, 0, [ "Beamos", "AntiFairyCircle", "Bumper" ] ] #"Palace of Darkness - Mimics 1 - Red Eyegore"
- [ 0x004b, 1, [ "RollerHorizontalRight" ] ] #"Palace of Darkness - Warp Hint - Antifairy 1"
- [ 0x004b, 5, [ "RollerHorizontalLeft", "RollerHorizontalRight", "AntiFairyCircle", "BigSpike", "Bumper" ] ] #"Palace of Darkness - Jelly Hall - Blue Bari 1"
- [ 0x004b, 6, [ "AntiFairyCircle", "BigSpike" ] ] #"Palace of Darkness - Jelly Hall - Blue Bari 2"
- [ 0x004b, 7, [ "AntiFairyCircle", "BigSpike" ] ] #"Palace of Darkness - Jelly Hall - Blue Bari 3"
- [ 0x004e, 0, [ "RollerHorizontalLeft", "RollerHorizontalRight", "Beamos", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Ice Palace - Blob Alley - Zol 1"
- [ 0x004e, 1, [ "RollerHorizontalLeft", "RollerHorizontalRight", "Beamos", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Ice Palace - Blob Alley - Zol 2"
- [ 0x004e, 2, [ "RollerHorizontalLeft", "RollerHorizontalRight", "Beamos", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Ice Palace - Blob Alley - Zol 3"
- [ 0x0050, 0, [ "RollerVerticalUp", "RollerVerticalDown" ] ] #"Hyrule Castle - North West Passage - Green Guard"
- [ 0x0050, 1, [ "RollerVerticalUp", "RollerVerticalDown" ] ] #"Hyrule Castle - North West Passage - Green Knife Guard 1"
- [ 0x0050, 2, [ "RollerVerticalUp", "RollerVerticalDown" ] ] #"Hyrule Castle - North West Passage - Green Knife Guard 2"
- [ 0x0052, 0, [ "RollerVerticalUp", "RollerVerticalDown", "AntiFairyCircle", "Bumper" ] ] #"Hyrule Castle - North East Passage - Green Guard"
- [ 0x0052, 1, [ "RollerVerticalUp", "RollerVerticalDown", "AntiFairyCircle", "Bumper" ] ] #"Hyrule Castle - North East Passage - Green Knife Guard 1"
- [ 0x0052, 2, [ "RollerVerticalUp", "RollerVerticalDown", "AntiFairyCircle", "Bumper" ] ] #"Hyrule Castle - North East Passage - Green Knife Guard 2"
- [ 0x0053, 1, [ "AntiFairyCircle", "Bumper" ] ] #"Desert Palace - Bridge - Beamos 1"
- [ 0x0053, 5, [ "RollerVerticalDown" ] ] #"Desert Palace - Popo Genocide - Popo TL"
- [ 0x0053, 7, [ "Beamos", "AntiFairyCircle", "Bumper" ] ] #"Desert Palace - Bridge - Popo 5"
- [ 0x0055, 1, [ "RollerVerticalUp", "RollerHorizontalRight", "AntiFairyCircle", "BigSpike", "Bumper" ] ] #"Secret Passage Exit - Green Knife Guard 1"
- [ 0x0057, 0, [ "Wizzrobe", "Statue" ] ] # Wizzrobes can't spawn on pots
- [ 0x0057, 1, ["Statue"]] # Statue switch issues
- [ 0x0057, 2, [ "RollerVerticalUp", "AntiFairyCircle", "Bumper", "Statue" ] ] #"Skull Woods - Big Key Room - Spike Trap"
- [ 0x0057, 3, ["Statue"]] # Statue switch issues
- [ 0x0057, 4, ["Statue"]] # Statue switch issues
- [ 0x0057, 5, ["Statue"]] # Statue switch issues
- [ 0x0057, 7, [ "RollerVerticalUp", "RollerVerticalDown", "Statue" ] ] #"Skull Woods - Big Key Room - Gibdo 2"
- [ 0x0057, 8, ["Statue"]] # Statue switch issues
- [ 0x0057, 9, ["Statue"]] # Statue switch issues
- [ 0x0057, 10, ["Statue"]] # Statue switch issues
- [ 0x0057, 11, ["Statue"]] # Statue switch issues
- [ 0x0057, 12, [ "RollerVerticalUp", "RollerVerticalDown", "Beamos", "AntiFairyCircle", "Bumper", "BigSpike", "SpikeBlock", "Statue"]] #"Skull Woods - Big Key Room - Gibdo 6"
- [ 0x0057, 13, [ "RollerVerticalDown", "Beamos", "AntiFairyCircle", "Bumper", "Statue" ] ] #"Skull Woods - Big Key Room - Blue Bari 1"
- [ 0x0057, 14, [ "RollerVerticalDown", "Beamos", "AntiFairyCircle", "Bumper", "Statue" ] ] #"Skull Woods - Big Key Room - Blue Bari 2"
- [ 0x0058, 0, ["Statue"]]
- [ 0x0058, 1, ["Statue"]]
- [ 0x0058, 2, ["Statue"]]
- [ 0x0058, 3, ["Statue"]]
- [ 0x0058, 4, ["Statue"]]
- [ 0x0058, 6, ["Statue"]]
- [ 0x0058, 7, [ "RollerHorizontalLeft", "Statue" ] ] #"Skull Woods - Lever Room - Hardhat Beetle 2"
- [ 0x0058, 8, ["Statue"]]
- [ 0x0059, 0, [ "RollerVerticalUp", "RollerVerticalDown", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Skull Woods - Bridge Room - Mini Moldorm 1"
- [ 0x0059, 1, [ "RollerVerticalUp", "RollerVerticalDown", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Skull Woods - Bridge Room - Mini Moldorm 2"
- [ 0x0059, 9, [ "RollerVerticalUp", "RollerVerticalDown", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Skull Woods - Bridge Room - Gibdo 1"
- [ 0x005e, 3, [ "RollerHorizontalLeft", "RollerHorizontalRight", "Beamos", "AntiFairyCircle", "SpikeBlock", "Bumper" ] ] #"Ice Palace - Pit Trap - Big Spike Trap"
- [ 0x005e, 4, [ "RollerVerticalUp", "RollerVerticalDown" ] ] #"Ice Palace - Pit Trap - Fire Bar (Clockwise)"
- [ 0x005f, 0, [ "RollerVerticalDown", "RollerHorizontalLeft" ] ] #"Ice Palace - Bari University - Blue Bari 1"
- [ 0x005f, 1, [ "RollerVerticalDown", "RollerHorizontalRight" ] ] #"Ice Palace - Bari University - Blue Bari 2"
- [ 0x0060, 0, [ "RollerVerticalUp", "RollerHorizontalLeft", "AntiFairyCircle", "BigSpike", "Bumper" ] ] #"Hyrule Castle - West - Blue Guard"
- [ 0x0062, 0, [ "RollerVerticalUp", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Hyrule Castle - East - Blue Guard"
- [ 0x0064, 2, [ "Bumper" , "Beamos" ] ] #"Thieves' Town - Attic Hall Left - Keese 2"
- [ 0x0064, 3, [ "Wizzrobe", "Statue" ] ] # Wizzrobes can't spawn on pots
- [ 0x0064, 4, [ "RollerHorizontalLeft", "RollerHorizontalRight" ] ] #"Thieves' Town - Attic Hall Left - Rat 1"
- [ 0x0065, 0, [ "RollerVerticalUp", "Beamos", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Thieves' Town - Attic Window - Rat 1"
- [ 0x0065, 1, [ "RollerHorizontalLeft", "RollerHorizontalRight" ] ] #"Thieves' Town - Attic Window - Rat 2"
- [ 0x0065, 2, [ "Beamos", "AntiFairyCircle", "Bumper" ] ] #"Thieves' Town - Attic Window - Rat 3"
- [ 0x0066, 0, [ "Beamos", "AntiFairyCircle", "BigSpike", "Bumper" ] ] #"Swamp Palace - Waterfall Room - Hover 1"
- [ 0x0066, 2, [ "AntiFairyCircle", "Bumper"]]
- [ 0x0067, 1, [ "RollerVerticalUp", "RollerVerticalDown" ] ] #"Skull Woods - Firebar Pits - Blue Bari 1"
- [ 0x0067, 2, ["Bumper"]] #"Skull Woods - Firebar Pits - Blue Bari 2"
- [ 0x0067, 3, [ "RollerVerticalUp", "RollerVerticalDown" ] ] #"Skull Woods - Firebar Pits - Hardhat Beetle 1"
- [ 0x0067, 4, [ "AntiFairyCircle", "Bumper" ]]
- [ 0x0067, 5, [ "RollerVerticalDown" ] ] #"Skull Woods - Firebar Pits - Hardhat Beetle 3"
- [ 0x0067, 6, [ "RollerVerticalDown" ] ] #"Skull Woods - Firebar Pits - Hardhat Beetle 4"
- [ 0x0067, 7, [ "Beamos", "AntiFairyCircle", "Bumper", "BunnyBeam" ] ] #"Skull Woods - Firebar Pits - Fire Bar (Clockwise)"
- [ 0x006a, 0, [ "RollerVerticalUp", "RollerVerticalDown", "Beamos", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Palace of Darkness - Dark Alley - Terrorpin 1"
- [ 0x006a, 1, [ "RollerVerticalUp", "RollerVerticalDown", "Beamos", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Palace of Darkness - Dark Alley - Terrorpin 2"
- [ 0x006a, 2, [ "RollerVerticalUp", "RollerVerticalDown" ] ] #"Palace of Darkness - Dark Alley - Antifairy 1"
- [ 0x006a, 4, [ "RollerVerticalUp", "RollerVerticalDown", "Beamos", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Palace of Darkness - Dark Alley - Terrorpin 3"
- [ 0x006a, 5, [ "RollerVerticalUp", "RollerVerticalDown", "Beamos", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Palace of Darkness - Dark Alley - Terrorpin 4"
- [ 0x006b, 7, [ "RollerHorizontalLeft", "Beamos", "AntiFairyCircle", "Bumper" ] ] #"Ganon's Tower - Mimics 1 - Spike Trap 1"
- [ 0x0071, 0, [ "RollerHorizontalLeft" ] ] #"Hyrule Castle - Basement Trap - Green Guard"
- [ 0x0074, 0, [ "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Desert Palace - North Hallway - Red Devalant 1"
- [ 0x0074, 1, [ "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Desert Palace - North Hallway - Red Devalant 2"
- [ 0x0074, 4, [ "AntiFairyCircle", "Bumper" ] ] #"Desert Palace - North Hallway - Leever 1"
- [ 0x0074, 5, [ "AntiFairyCircle", "Bumper" ] ] #"Desert Palace - North Hallway - Leever 2"
- [ 0x0076, 1, [ "RollerVerticalUp", "RollerVerticalDown", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Swamp Palace - Toilet Left - Hover 1"
- [ 0x0076, 2, [ "RollerVerticalUp", "RollerVerticalDown", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Swamp Palace - Toilet Left - Kyameron"
- [ 0x0076, 3, [ "RollerVerticalUp", "RollerVerticalDown", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Swamp Palace - Toilet Left - Hover 2"
- [ 0x0076, 4, [ "RollerVerticalUp", "RollerVerticalDown", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Swamp Palace - Toilet Left - Zol"
- [ 0x0076, 6, [ "RollerVerticalDown", "RollerHorizontalRight", "Beamos", "AntiFairyCircle", "BigSpike", "Bumper" ] ] #"Swamp Palace - Toilet Left - Blue Bari"
- [ 0x007b, 0, [ "RollerHorizontalLeft", "RollerHorizontalRight", "AntiFairyCircle", "BigSpike", "Bumper" ] ] #"Ganon's Tower - DMs Room - Blue Bari 1"
- [ 0x007b, 1, [ "AntiFairyCircle", "BigSpike", "Bumper" ] ] #"Ganon's Tower - DMs Room - Blue Bari 2"
- [ 0x007b, 6, [ "Beamos", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Ganon's Tower - DMs Room - Statue"
- [ 0x007b, 7, [ "Beamos", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Ganon's Tower - DMs Room - Hardhat Beetle"
- [ 0x007c, 1, [ "RollerVerticalUp", "RollerVerticalDown", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Ganon's Tower - Randomizer Room - Fire Bar (Counterclockwise)"
- [ 0x007c, 2, [ "RollerVerticalUp", "RollerVerticalDown", "AntiFairyCircle", "BigSpike", "Bumper" ] ] #"Ganon's Tower - Randomizer Room - Spike Trap"
- [ 0x007c, 3, [ "RollerVerticalUp", "RollerVerticalDown", "AntiFairyCircle", "BigSpike", "Bumper" ] ] #"Ganon's Tower - Randomizer Room - Fire Bar (Clockwise)"
- [ 0x007c, 4, [ "RollerVerticalUp", "RollerVerticalDown", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Ganon's Tower - Randomizer Room - Hardhat Beetle"
- [ 0x007d, 0, [ "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight", "AntiFairyCircle", "BigSpike", "Bumper" ] ] #"Ganon's Tower - The Zoo - Fire Snake 1"
- [ 0x007d, 1, [ "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight", "AntiFairyCircle", "BigSpike", "Bumper" ] ] #"Ganon's Tower - The Zoo - Fire Snake 2"
- [ 0x007d, 2, [ "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight", "AntiFairyCircle", "BigSpike", "Bumper" ] ] #"Ganon's Tower - The Zoo - Fire Snake 3"
- [ 0x007d, 3, [ "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight", "AntiFairyCircle", "BigSpike", "Bumper" ] ] #"Ganon's Tower - The Zoo - Fire Snake 4"
- [ 0x007d, 4, ["StalfosKnight", "Geldman", "Blob", "Stal"]]
- [ 0x007d, 7, ["RollerVerticalUp", "RollerHorizontalLeft", "StalfosKnight", "Geldman", "Blob", "Stal"]] #"Ganon's Tower - The Zoo - Mini Helmasaur"
- [ 0x007d, 8, ["RollerVerticalUp", "RollerHorizontalLeft", "RollerHorizontalRight", "StalfosKnight", "Geldman", "Blob", "Stal"]] #"Ganon's Tower - The Zoo - Red Bari"
- [ 0x007d, 10, ["StalfosKnight", "Geldman", "Blob", "Stal"]]
# todo - consider adding firesnake to 0-3: has a hard time moving, could block hookshots for quite a while
- [ 0x007f, 0, [ "Statue", "SparkCW", "SparkCCW", "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight", "Beamos", "AntiFairyCircle", "BigSpike", "FirebarCW", "FirebarCCW", "SpikeBlock", "Bumper" ] ] #"Ice Palace - Big Spikes - Red Bari 1"
- [ 0x007f, 1, [ "Statue", "SparkCW", "SparkCCW", "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight", "Beamos", "AntiFairyCircle", "BigSpike", "FirebarCW", "FirebarCCW", "SpikeBlock", "Bumper", "ArmosStatue" ] ] #"Ice Palace - Big Spikes - Red Bari 2"
- [ 0x007f, 2, [ "Statue", "SparkCW", "SparkCCW", "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight", "Beamos", "AntiFairyCircle", "BigSpike", "FirebarCW", "FirebarCCW", "SpikeBlock", "Bumper" ] ] #"Ice Palace - Big Spikes - Red Bari 3"
- [ 0x007f, 3, [ "Statue", "SparkCW", "SparkCCW", "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight", "Beamos", "AntiFairyCircle", "BigSpike", "FirebarCW", "FirebarCCW", "SpikeBlock", "Bumper" ] ] #"Ice Palace - Big Spikes - Red Bari 4"
- [ 0x007f, 4, [ "RollerVerticalDown" ] ] #"Ice Palace - Big Spikes - Big Spike Trap 1"
- [ 0x007f, 5, [ "RollerVerticalDown" ] ] #"Ice Palace - Big Spikes - Big Spike Trap 2"
- [ 0x0082, 0, [ "RollerVerticalDown" ] ] #"Hyrule Castle - Basement Playpit - Blue Guard 1"
- [ 0x0082, 2, [ "RollerVerticalUp" ] ] #"Hyrule Castle - Basement Playpit - Blue Guard 3"
- [ 0x0083, 0, [ "RollerVerticalUp", "RollerVerticalDown" ] ] #"Desert Palace - Left Hallway - Blue Devalant 1"
- [ 0x0084, 0, [ "RollerVerticalDown", "RollerHorizontalLeft", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Desert Palace - Main Room - Left - Leever 1"
- [ 0x0084, 1, [ "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalRight", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Desert Palace - Main Room - Left - Leever 2"
- [ 0x0085, 2, [ "RollerHorizontalRight" ] ] #"Desert Palace - Compass Room - Popo TL"
- [ 0x0085, 7, [ "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight", "Beamos", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Desert Palace - Right Hallway - Leever 2"
- [ 0x008b, 3, ["RollerHorizontalRight"]]
- [ 0x008b, 4, [ "Statue", "RollerVerticalUp", "RollerVerticalDown", "Beamos", "AntiFairyCircle", "Bumper", "BigSpike"]] #"Ganon's Tower - Map Room - Spike Trap"
- [ 0x008b, 6, [ "Beamos", "AntiFairyCircle", "BigSpike", "Bumper" ] ] #"Ganon's Tower - Map Room - Fire Bar (Clockwise)"
- [ 0x008b, 7, [ "Beamos", "AntiFairyCircle", "BigSpike", "Bumper" ] ] #"Ganon's Tower - Map Room - Fire Bar (Counterclockwise)"
- [ 0x008c, 14, ["AntiFairyCircle", "BigSpike", "Bumper"]]
- [ 0x008d, 1, [ "AntiFairyCircle", "Bumper" ] ] #"Ganon's Tower - Tile Room - Yomo Medusa T"
- [ 0x008d, 7, [ "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "Beamos", "AntiFairyCircle", "BigSpike", "Bumper" ] ] #"Ganon's Tower - Tile Room - Spike Trap"
- [ 0x008d, 8, [ "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Ganon's Tower - Tile Room - Stalfos"
- [ 0x008d, 9, [ "Statue", "Beamos", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Ganon's Tower - Tile Room - Fire Bar (Clockwise)"
- [ 0x008d, 10, [ "RollerVerticalUp", "RollerVerticalDown" ] ] #"Ganon's Tower - Tile Room - Blue Bari 1"
- [ 0x008d, 12, [ "RollerVerticalUp", "RollerVerticalDown" ] ] #"Ganon's Tower - Tile Room - Blue Bari 2"
- [ 0x008e, 2, [ "Wizzrobe", "Statue"] ] # Wizzrobes can't spawn on pots
- [ 0x0092, 8, [ "RollerVerticalUp", "Beamos", "AntiFairyCircle", "Bumper" ] ] #"Misery Mire - Dark Weave - Spike Trap"
- [ 0x0092, 9, [ "RollerHorizontalRight" ] ] #"Misery Mire - Dark Weave - Antifairy 3"
- [ 0x0092, 10, [ "RollerHorizontalLeft" ] ] #"Misery Mire - Dark Weave - Stalfos"
- [ 0x0095, 0, [ "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalRight", "AntiFairyCircle", "BigSpike", "SpikeBlock" ] ] #"Ganon's Tower - Conveyer Falling Bridge - Red Spear Guard 1"
- [ 0x0095, 1, [ "Statue", "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalRight", "Beamos", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Ganon's Tower - Conveyer Falling Bridge - Red Spear Guard 2"
- [ 0x0095, 2, [ "Statue", "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "Beamos", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Ganon's Tower - Conveyer Falling Bridge - Red Spear Guard 3"
- [ 0x0095, 3, [ "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "AntiFairyCircle", "BigSpike", "SpikeBlock" ] ] #"Ganon's Tower - Conveyer Falling Bridge - Red Spear Guard 4"
- [ 0x0096, 0, [ "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight", "Beamos", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Ganon's Tower - Torches 1 - Fire Bar (Clockwise)"
- [ 0x0098, 0, [ "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight", "Beamos", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Misery Mire - Entrance - Zol 1"
- [ 0x0098, 1, [ "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight", "Beamos", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Misery Mire - Entrance - Zol 2"
- [ 0x0098, 2, [ "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight", "Beamos", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Misery Mire - Entrance - Zol 3"
- [ 0x0098, 3, [ "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight", "Beamos", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Misery Mire - Entrance - Zol 4"
- [ 0x0098, 4, [ "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight", "Beamos", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Misery Mire - Entrance - Zol 5"
- [ 0x009b, 3, [ "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight", "Beamos", "AntiFairyCircle", "BigSpike", "Bumper" ] ] #"Ganon's Tower - Spike Switch - Spike Trap 1"
- [ 0x009b, 4, [ "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight", "Beamos", "AntiFairyCircle", "BigSpike", "Bumper" ] ] #"Ganon's Tower - Spike Switch - Spike Trap 2"
- [ 0x009b, 5, [ "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight", "Beamos", "AntiFairyCircle", "BigSpike", "Bumper" ] ]
- [ 0x009b, 7, [ "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight", "Beamos", "AntiFairyCircle", "BigSpike", "Bumper" ] ] #"Ganon's Tower - Spike Switch - Spike Trap 4"
- [ 0x009b, 8, [ "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight", "Beamos", "AntiFairyCircle", "BigSpike", "Bumper" ] ] #"Ganon's Tower - Spike Switch - Spike Trap 5"
- [ 0x009b, 9, [ "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight", "Beamos", "AntiFairyCircle", "BigSpike", "Bumper" ] ] #"Ganon's Tower - Spike Switch - Spike Trap 6"
- [ 0x009b, 10, [ "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight", "Beamos", "AntiFairyCircle", "BigSpike", "Bumper" ] ] #"Ganon's Tower - Spike Switch - Spike Trap 7"
- [ 0x009c, 1, [ "RollerVerticalUp", "RollerVerticalDown", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Ganon's Tower - Invisible Floor Maze - Mini Helmasaur"
- [ 0x009c, 2, [ "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Ganon's Tower - Invisible Floor Maze - Hardhat Beetle 2"
- [ 0x009c, 3, [ "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Ganon's Tower - Invisible Floor Maze - Hardhat Beetle 3"
- [ 0x009c, 4, [ "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight", "AntiFairyCircle", "BigSpike", "Bumper" ] ] #"Ganon's Tower - Invisible Floor Maze - Hardhat Beetle 4"
- [ 0x009c, 5, [ "RollerVerticalUp", "AntiFairyCircle", "BigSpike", "Bumper" ] ] #"Ganon's Tower - Invisible Floor Maze - Hardhat Beetle 5"
- [ 0x009d, 3, [ "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Ganon's Tower - Compass Room - Gibdo 2"
- [ 0x009d, 6, [ "RollerHorizontalLeft", "RollerHorizontalRight" ] ] #"Ganon's Tower - Compass Room - Blue Bari 1"
- [ 0x009d, 7, [ "RollerHorizontalLeft", "RollerHorizontalRight", "AntiFairyCircle", "BigSpike", "Bumper" ] ] #"Ganon's Tower - Compass Room - Blue Bari 2"
- [ 0x009d, 8, [ "RollerHorizontalLeft", "RollerHorizontalRight" ] ] #"Ganon's Tower - Compass Room - Blue Bari 3"
- [ 0x009e, 0, [ "RollerVerticalUp", "RollerVerticalDown", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Ice Palace - Fairy Drop - blue - Red Bari 1"
- [ 0x009e, 1, [ "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Ice Palace - Fairy Drop - blue - Red Bari 2"
- [ 0x009e, 2, [ "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Ice Palace - Fairy Drop - blue - Stalfos Knight"
- [ 0x009e, 3, [ "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Ice Palace - Fairy Drop - blue - Red Bari 3"
- [ 0x00a0, 1, [ "RollerHorizontalLeft", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Misery Mire - Boss Antechamber - Antifairy"
- [ 0x00a1, 2, [ "Statue", "RollerHorizontalRight", "Beamos", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Misery Mire - Fish Room - Spark (Clockwise) 2"
- [ 0x00a1, 7, [ "Wizzrobe", "Statue"] ] # Wizzrobes can't spawn on pots
- [ 0x00a5, 2, [ "BigSpike" ] ] #"GT Wizzrobes 1 - Wizzrobe 3"
- [ 0x00a5, 10, [ "RollerHorizontalLeft", "RollerHorizontalRight", "AntiFairyCircle", "BigSpike", "Bumper" ] ] #"Ganon's Tower - Laser Bridge - Red Spear Guard"
- [ 0x00a8, 1, [ "RollerVerticalUp", "RollerHorizontalLeft" ] ] #"Eastern Palace - West Wing - Top - Stalfos 2"
- [ 0x00a8, 3, [ "RollerVerticalDown", "RollerHorizontalLeft" ] ] #"Eastern Palace - West Wing - Top - Stalfos 4"
- [ 0x00a9, 1, [ "RollerHorizontalRight", "RollerHorizontalLeft" ] ]
- [ 0x00aa, 4, [ "AntiFairyCircle", "BigSpike", "Bumper" ] ] #"Eastern Palace - East Wing - Top - Stalfos 3"
- [ 0x00aa, 5, [ "Beamos", "AntiFairyCircle", "BigSpike", "Bumper" ] ] #"Eastern Palace - East Wing - Top - Popo B 2"
- [ 0x00ab, 7, [ "RollerVerticalUp", "RollerHorizontalLeft" ] ] #"Thieves' Town - Spike Dodge - Spike Trap 6"
- [ 0x00ae, 0, [ "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "AntiFairyCircle", "BigSpike", "Bumper" ] ] #"Ice Palace - Ice T - Blue Bari 1"
- [ 0x00ae, 1, [ "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "AntiFairyCircle", "BigSpike", "Bumper" ] ] #"Ice Palace - Ice T - Blue Bari 2"
- [ 0x00af, 0, [ "RollerHorizontalRight", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Ice Palace - Ice Clock - Fire Bar (Clockwise)"
- [ 0x00b1, 2, [ "RollerVerticalUp", "RollerVerticalDown" ] ] #"Misery Mire - Hourglass - Spike Trap 1"
- [ 0x00b1, 3, [ "RollerVerticalUp", "RollerVerticalDown" ] ] #"Misery Mire - Hourglass - Spike Trap 2"
- [ 0x00b1, 4, ["Bumper", "BigSpike", "AntiFairyCircle" ]]
- [ 0x00b2, 1, [ "Wizzrobe", "Statue" ] ] # Wizzrobes can't spawn on pots
- [ 0x00b2, 3, [ "Wizzrobe", "Statue" ] ] # Wizzrobes can't spawn on pots
- [ 0x00b2, 6, [ "RollerVerticalUp", "RollerHorizontalLeft" ] ] #"Misery Mire - Sluggula Cross - Sluggula TR"
- [ 0x00b2, 8, [ "RollerVerticalDown" ] ] #"Misery Mire - Popo Push - Medusa 1"
- [ 0x00b2, 9, [ "RollerVerticalUp" ] ] #"Misery Mire - Sluggula Cross - Sluggula BL"
- [ 0x00b3, 0, [ "RollerVerticalUp", "RollerHorizontalRight", "BigSpike", "SpikeBlock" ] ] #"Misery Mire - Spike Room - Stalfos 1"
- [ 0x00b3, 2, [ "Statue", "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight", "Beamos", "AntiFairyCircle", "BigSpike", "FirebarCW", "Bumper" ] ] #"Misery Mire - Spike Room - Beamos"
- [ 0x00b3, 3, [ "AntiFairyCircle", "Bumper" ] ] #"Misery Mire - Spike Room - Yomo Medusa"
- [ 0x00b6, 7, [ "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Turtle Rock - Tile Room - Zol 1"
- [ 0x00b6, 8, [ "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Turtle Rock - Tile Room - Zol 2"
- [ 0x00ba, 1, [ "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight", "Beamos", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Eastern Palace - Dark Stalfos - Antifairy 1"
- [ 0x00ba, 3, [ "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight", "Beamos", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Eastern Palace - Dark Stalfos - Antifairy 2"
- [ 0x00ba, 4, [ "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight", "Beamos", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Eastern Palace - Dark Stalfos - Popo B 1"
- [ 0x00ba, 6, [ "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight", "Beamos", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Eastern Palace - Dark Stalfos - Popo B 2"
- [ 0x00bb, 1, [ "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight" ] ] #"Thieves' Town - Spikeveyer - Gibo 1"
- [ 0x00bb, 4, [ "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight", "AntiFairyCircle", "Bumper" ] ] #"Thieves' Town - Spikeveyer - Antifairy 1"
- [ 0x00bb, 5, [ "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Thieves' Town - Spikeveyer - Gibo 3"
- [ 0x00bb, 6, [ "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight" ] ] #"Thieves' Town - Spikeveyer - Fire Snake"
- [ 0x00bb, 7, [ "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight", "AntiFairyCircle", "SpikeBlock", "Bumper" ] ] #"Thieves' Town - Spikeveyer - Gibo 4"
- [ 0x00bb, 8, [ "RollerHorizontalLeft", "RollerHorizontalRight" ] ] #"Thieves' Town - Spikeveyer - Gibo 5"
- [ 0x00bb, 9, [ "RollerHorizontalLeft", "RollerHorizontalRight" ] ] #"Thieves' Town - Spikeveyer - Antifairy 2"
- [ 0x00bc, 6, [ "AntiFairyCircle", "SpikeBlock", "Bumper" ] ] #"Thieves' Town - Toilet - Stalfos 2"
- [ 0x00bc, 7, [ "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Thieves' Town - Toilet - Stalfos 3"
- [ 0x00bc, 8, [ "RollerVerticalUp", "RollerVerticalDown" ] ] #"Thieves' Town - Toilet - Stalfos 4"
- [ 0x00bf, 0, [ "Wizzrobe", "Statue" ] ] # Wizzrobes can't spawn on collision
- [ 0x00c1, 3, [ "RollerVerticalUp", "RollerHorizontalLeft" ] ] #"Misery Mire - 4 Rails - Stalfos 1"
- [ 0x00c2, 0, [ "RollerHorizontalLeft", "RollerHorizontalRight" ] ] #"Misery Mire - Main Lobby - blue - Fire Snake 1"
- [ 0x00c2, 5, [ "Wizzrobe", "Statue" ] ] # Wizzrobes can't spawn on pots
- [ 0x00c5, 6, [ "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight", "Beamos", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Turtle Rock - Catwalk - Mini Helmasaur"
- [ 0x00c5, 7, [ "Statue" ] ] #"Turtle Rock - Catwalk - Laser Eye (Left) 4"
- [ 0x00cb, 0, [ "Wizzrobe", "Statue" ] ] # Wizzrobes can't spawn on pots
- [ 0x00cb, 3, [ "RollerVerticalUp", "RollerVerticalDown", "Beamos", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Thieves' Town - Grand Room NW - Zol 1"
- [ 0x00cb, 5, [ "RollerVerticalUp", "RollerVerticalDown", "Beamos", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Thieves' Town - Grand Room NW - Zol 2"
- [ 0x00cb, 9, [ "RollerVerticalUp", "RollerVerticalDown", "Beamos", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ]
- [ 0x00cb, 10, [ "RollerVerticalUp", "RollerVerticalDown", "Beamos", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ]
- [ 0x00cb, 11, [ "Wizzrobe", "Statue" ] ] # Wizzrobes can't spawn on pots
- [ 0x00cc, 8, [ "RollerVerticalUp", "RollerVerticalDown", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #Prevents Pot access (Beamos okay?)
- [ 0x00cc, 12, [ "RollerVerticalUp", "RollerVerticalDown", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #Prevents Pot access (Beamos okay?)
- [ 0x00ce, 0, [ "RollerVerticalDown", "RollerVerticalUp", "RollerHorizontalRight", "RollerHorizontalLeft", "AntiFairyCircle", "Antifairy", "BigSpike", "FirebarCCW", "Bumper" ] ] #"Ice Palace - Over Boss - top - Red Bari 1"
- [ 0x00ce, 1, [ "RollerVerticalDown", "RollerVerticalUp", "RollerHorizontalRight", "RollerHorizontalLeft", "AntiFairyCircle", "Antifairy", "BigSpike", "FirebarCW", "Bumper" ] ] #"Ice Palace - Over Boss - top - Red Bari 2"
- [ 0x00ce, 3, [ "SparkCW", "SparkCCW", "RollerVerticalDown", "RollerVerticalUp", "RollerHorizontalRight", "RollerHorizontalLeft", "Beamos", "AntiFairyCircle", "Antifairy", "BigSpike", "FirebarCW", "FirebarCCW", "SpikeBlock", "Bumper" ] ] #"Ice Palace - Over Boss - top - Statue"
- [ 0x00ce, 4, [ "RollerVerticalDown", "RollerVerticalUp", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Beamos", "Bumper", "FirebarCW", "FirebarCCW"]]
- [ 0x00ce, 5, [ "RollerVerticalDown", "RollerVerticalUp", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Beamos", "Bumper", "FirebarCW", "FirebarCCW"]]
- [ 0x00ce, 6, [ "RollerVerticalDown", "RollerVerticalUp", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Beamos", "Bumper", "FirebarCW", "FirebarCCW"]]
- [ 0x00ce, 7, [ "RollerVerticalDown", "RollerVerticalUp", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Beamos", "Bumper", "FirebarCW", "FirebarCCW"]]
- [ 0x00d0, 0, [ "Statue", "Beamos", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper"]]
- [ 0x00d0, 1, [ "AntiFairyCircle", "BigSpike", "Bumper"]]
- [ 0x00d0, 4, [ "Statue", "Beamos", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper"]]
- [ 0x00d0, 5, [ "Statue", "Beamos", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper"]]
- [ 0x00d0, 6, [ "Statue", "Beamos", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper"]]
- [ 0x00d0, 7, [ "Statue", "Beamos", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper"]]
- [ 0x00d0, 9, [ "AntiFairyCircle", "BigSpike", "Bumper"]]
- [ 0x00d0, 6, [ "Statue", "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "Beamos", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] # Agahnims Tower - Dark Maze - Blue Guard 2
- [ 0x00d2, 8, [ "RollerVerticalDown", "RollerHorizontalLeft", "Beamos", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Misery Mire - Mire 2 - Popo BL"
- [ 0x00d5, 4, [ "Statue", "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "Beamos", "AntiFairyCircle", "BigSpike", "FirebarCW", "FirebarCCW", "SpikeBlock", "Bumper" ] ] #"Turtle Rock - Eye Bridge - Hardhat Beetle"
- [ 0x00d8, 0, [ "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight", "Beamos", "AntiFairyCircle", "BigSpike", "Bumper" ] ] #"Eastern Palace - Kill Room 2 - Red Eyegore L"
- [ 0x00d8, 1, [ "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight", "Beamos", "AntiFairyCircle", "BigSpike", "Bumper" ] ] #"Eastern Palace - Kill Room 2 - Red Eyegore R"
- [ 0x00d8, 2, [ "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight", "Beamos", "AntiFairyCircle", "BigSpike", "Bumper" ] ] #"Eastern Palace - Kill Room 2 - Popo B TL"
- [ 0x00d8, 3, [ "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight", "Beamos", "AntiFairyCircle", "BigSpike", "Bumper" ] ] #"Eastern Palace - Kill Room 2 - Popo B TR"
- [ 0x00d8, 4, [ "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight", "Beamos", "AntiFairyCircle", "BigSpike", "Bumper" ] ] #"Eastern Palace - Kill Room 2 - Popo B LT"
- [ 0x00d8, 5, [ "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight", "Beamos", "AntiFairyCircle", "BigSpike", "Bumper" ] ] #"Eastern Palace - Kill Room 2 - Popo B RT"
- [ 0x00d8, 6, [ "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight", "Beamos", "AntiFairyCircle", "BigSpike", "Bumper" ] ] #"Eastern Palace - Kill Room 2 - Popo LB"
- [ 0x00d8, 7, [ "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight", "Beamos", "AntiFairyCircle", "BigSpike", "Bumper" ] ] #"Eastern Palace - Kill Room 2 - Popo RB"
- [ 0x00d8, 8, [ "Beamos", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Eastern Palace - Kill Room 1 - Red Eyegore"
- [ 0x00d9, 1, [ "RollerHorizontalRight" ] ] #"Eastern Palace - Dodgeball - Green Eyegore 1"
- [ 0x00db, 0, [ "Wizzrobe", "Statue" ] ] # Wizzrobes can't spawn on pots
- [ 0x00dc, 2, [ "AntiFairyCircle", "BigSpike", "Bumper" ] ]
- [ 0x00dc, 9, [ "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight", "Beamos", "AntiFairyCircle", "BigSpike", "Bumper" ] ] #"Thieves' Town - Grand Room SE - Fire Snake 2"
- [ 0x00df, 0, [ "RollerVerticalDown", "RollerHorizontalRight", "Beamos", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Paradox Cave - Top - Mini Moldorm 1"
- [ 0x00df, 1, [ "RollerVerticalDown", "RollerHorizontalRight", "AntiFairyCircle" ] ] #"Paradox Cave - Top - Mini Moldorm 2"
- [ 0x00e4, 0, [ "RollerHorizontalLeft", "RollerHorizontalRight", "Beamos", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Old Man Home - Keese 1"
- [ 0x00e4, 1, [ "RollerHorizontalLeft", "RollerHorizontalRight", "Beamos", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Old Man Home - Keese 2"
- [ 0x00e4, 2, [ "RollerHorizontalLeft", "RollerHorizontalRight", "Beamos", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Old Man Home - Keese 3"
- [ 0x00e5, 4, [ "RollerVerticalDown", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Old Man Home Circle - Keese 5"
- [ 0x00e5, 5, [ "RollerVerticalDown", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Old Man Home Circle - Keese 6"
- [ 0x00e7, 0, [ "RollerVerticalUp", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Death Mountain Descent Cave Right - Keese 1"
- [ 0x00e7, 1, [ "RollerVerticalUp", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Death Mountain Descent Cave Right - Keese 2"
- [ 0x00e7, 2, [ "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalRight" ] ] #"Death Mountain Descent Cave Right - Keese 3"
- [ 0x00e7, 3, [ "RollerVerticalDown", "Beamos", "AntiFairyCircle", "Bumper" ] ] #"Death Mountain Descent Cave Right - Keese 4"
- [ 0x00e7, 4, [ "RollerVerticalDown", "Beamos", "AntiFairyCircle", "Bumper" ] ] #"Death Mountain Descent Cave Right - Keese 5"
- [ 0x00e7, 5, [ "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalRight" ] ] #"Death Mountain Descent Cave Right - Keese 6"
- [ 0x00e7, 6, [ "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalRight" ] ] #"Death Mountain Descent Cave Right - Keese 7"
- [ 0x00e8, 0, [ "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight", "AntiFairyCircle", "SpikeBlock", "Bumper" ] ] #"Super Bunny Exit - Hardhat Beetle 1"
- [ 0x00e8, 1, [ "RollerVerticalUp", "RollerVerticalDown", "Beamos", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Super Bunny Exit - Hardhat Beetle 2"
- [ 0x00ee, 0, [ "RollerHorizontalLeft", "RollerHorizontalRight", "Beamos", "AntiFairyCircle", "BigSpike", "Bumper" ] ] #"Sprial Cave Top - Mini Moldorm 1"
- [ 0x00ee, 1, [ "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight", "Beamos", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Sprial Cave Top - Mini Moldorm 2"
- [ 0x00ee, 2, [ "RollerHorizontalLeft", "Beamos", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Sprial Cave Top - Mini Moldorm 3"
- [ 0x00ee, 3, [ "RollerVerticalUp", "RollerVerticalDown", "Beamos", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Sprial Cave Top - Blue Bari 1"
- [ 0x00ee, 4, [ "RollerVerticalUp", "RollerVerticalDown", "Beamos", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Sprial Cave Top - Blue Bari 2"
- [ 0x00ef, 1, [ "RollerVerticalUp", "RollerVerticalDown" ] ] #"Paradox Cave - Middle - Mini Moldorm 2"
- [ 0x00f1, 0, [ "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight" ] ] #"Old Man Maze - Keese 1"
- [ 0x00f1, 1, [ "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight" ] ] #"Old Man Maze - Keese 2"
- [ 0x00f1, 2, [ "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight" ] ] #"Old Man Maze - Keese 3"
- [ 0x00f1, 3, [ "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight" ] ] #"Old Man Maze - Keese 4"
- [ 0x00f1, 4, [ "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight" ] ] #"Old Man Maze - Keese 5"
- [ 0x00f1, 5, [ "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight" ] ] #"Old Man Maze - Keese 6"
- [ 0x00fd, 0, [ "Bumper" ] ]
- [ 0x0107, 1, ["Beamos", "Bumper", "BigSpike", "AntiFairyCircle"]]
- [ 0x0107, 2, ["Beamos", "Bumper", "BigSpike", "AntiFairyCircle"]]
- [0x010b, 6, ["RollerHorizontalRight"]]
- [0x010c, 6, ["StalfosKnight", "Geldman", "Blob", "Stal", "Wizzrobe"]]
- [0x010c, 7, ["StalfosKnight", "Geldman", "Blob", "Stal", "Wizzrobe"]]
OwGeneralDeny:
- [0x03, 2, ["Gibo"]] # OldMan eating Gibo
- [0x03, 4, ["Gibo"]] # OldMan eating Gibo
- [0x03, 5, ["Gibo"]] # OldMan eating Gibo
- [0x03, 6, ["Gibo"]] # OldMan eating Gibo
- [0x03, 8, ["Gibo"]] # OldMan eating Gibo
- [0x03, 9, ["Gibo"]] # OldMan eating Gibo
- [0x03, 10, ["Gibo"]] # OldMan eating Gibo
- [0x05, 11, ["Bumper", "AntiFairyCircle"]] # Blocks path to portal
- [0x1e, 3, ["Beamos", "Bumper", "BigSpike", "AntiFairyCircle"]] # forbid a beamos here
- [0x40, 0, ["Beamos", "Bumper", "BigSpike", "AntiFairyCircle", "Thief"]]
- [0x40, 7, ["Beamos", "Bumper", "BigSpike", "AntiFairyCircle", "Thief"]]
- [0x40, 13, ["Beamos", "Bumper", "BigSpike", "AntiFairyCircle", "Thief"]]
- [0x40, 14, ["Beamos", "Bumper", "BigSpike", "AntiFairyCircle", "Thief"]]
- [0x5e, 0, ["Gibo"]] # kiki eating Gibo
- [0x5e, 1, ["Gibo"]] # kiki eating Gibo
- [0x5e, 2, ["Gibo"]] # kiki eating Gibo
- [0x5e, 3, ["Gibo"]] # kiki eating Gibo
- [0x5e, 4, ["RollerVerticalUp", "Gibo"]] # forbid that one roller for kiki pod, and the kiki eating Gibo
- [0x5e, 5, ["Gibo"]] # kiki eating Gibo
- [0x5e, 6, ["Gibo"]] # kiki eating Gibo
- [0x5e, 7, ["Gibo"]] # kiki eating Gibo
- [0x5e, 8, ["Gibo"]] # kiki eating Gibo
- [0x5e, 9, ["Gibo"]] # kiki eating Gibo
- [0x5e, 10, ["Gibo"]] # kiki eating Gibo
- [0x5e, 11, ["Gibo"]] # kiki eating Gibo
- [0x5e, 12, ["Gibo"]] # kiki eating Gibo
- [0x5e, 13, ["Gibo"]] # kiki eating Gibo
- [0x5e, 14, ["Gibo"]] # kiki eating Gibo
- [0x5e, 15, ["Gibo"]] # kiki eating Gibo
- [0x5e, 16, ["Gibo"]] # kiki eating Gibo
- [0x5e, 17, ["Gibo"]] # kiki eating Gibo
- [0x5e, 18, ["Gibo"]] # kiki eating Gibo
- [0x5e, 19, ["Gibo"]] # kiki eating Gibo
- [0x5e, 20, ["Gibo"]] # kiki eating Gibo
- [0x77, 1, ["Bumper"]] # soft-lock potential near ladder
UwEnemyDrop:
- [0x0085, 9, ["Babasu"]] # ran off the edge and didn't return
- [0x00cb, 3, ["Zoro"]] # layer issues
- [0x00cb, 5, ["Zoro"]] # layer issues
- [0x00cb, 9, ["Zoro"]] # layer issues
- [0x00cb, 10, ["Zoro"]] # layer issues
- [0x00cc, 5, ["Babasu"]] # little hard to see and kill appropriately
# the following are behind rails or otherwise unactivate-able
- [0x0077, 4, ["StalfosKnight", "Geldman", "Blob", "Stal", "Wizzrobe"]] # can't activate here
- [0x0077, 5, ["StalfosKnight", "Geldman", "Blob", "Stal", "Wizzrobe"]]
- [0x008D, 10, ["StalfosKnight", "Geldman", "Blob", "Stal"]]
- [0x008D, 12, ["StalfosKnight", "Geldman", "Blob", "Stal"]]
- [0x00b0, 7, ["StalfosKnight", "Blob", "Stal", "Wizzrobe"]] # blocked, but Geldmen are probably okay
- [0x00b0, 8, ["StalfosKnight", "Blob", "Stal", "Wizzrobe"]] # blocked, but Geldmen are probably okay
# the following are not allowed at certain pits (or on conveyors near pits)
# because they despawned or clipped away or immediately fell, etc
- [0x003d, 9, ["HardhatBeetle", "Wizzrobe", "MiniHelmasaur", "BlueGuard", "GreenGuard", "RedSpearGuard",
"BluesainBolt", "UsainBolt", "BlueArcher", "GreenBushGuard", "RedJavelinGuard", "RedBushGuard",
"BombGuard", "GreenKnifeGuard", "Stal", "GreenMimic", "RedMimic", "StalfosKnight", "Geldman", "Blob"]]
- [0x003d, 10, ["HardhatBeetle", "Wizzrobe", "MiniHelmasaur", "BlueGuard", "GreenGuard", "RedSpearGuard",
"BluesainBolt", "UsainBolt", "BlueArcher", "GreenBushGuard", "RedJavelinGuard", "RedBushGuard",
"BombGuard", "GreenKnifeGuard", "Stal", "GreenMimic", "RedMimic", "StalfosKnight", "Geldman", "Blob"]]
- [0x0044, 0, ["HardhatBeetle", "Wizzrobe", "MiniHelmasaur", "BlueGuard", "GreenGuard", "RedSpearGuard",
"BluesainBolt", "UsainBolt", "BlueArcher", "GreenBushGuard", "RedJavelinGuard", "RedBushGuard",
"BombGuard", "GreenKnifeGuard", "Stal", "GreenMimic", "RedMimic"]]
- [0x0044, 1, ["HardhatBeetle", "Wizzrobe", "MiniHelmasaur", "BlueGuard", "GreenGuard", "RedSpearGuard",
"BluesainBolt", "UsainBolt", "BlueArcher", "GreenBushGuard", "RedJavelinGuard", "RedBushGuard",
"BombGuard", "GreenKnifeGuard", "Stal", "GreenMimic", "RedMimic"]]
- [0x0044, 2, ["HardhatBeetle", "Wizzrobe", "MiniHelmasaur", "BlueGuard", "GreenGuard", "RedSpearGuard",
"BluesainBolt", "UsainBolt", "BlueArcher", "GreenBushGuard", "RedJavelinGuard", "RedBushGuard",
"BombGuard", "GreenKnifeGuard", "Stal", "GreenMimic", "RedMimic"]]
- [0x0044, 3, ["HardhatBeetle", "Wizzrobe", "MiniHelmasaur", "BlueGuard", "GreenGuard", "RedSpearGuard",
"BluesainBolt", "UsainBolt", "BlueArcher", "GreenBushGuard", "RedJavelinGuard", "RedBushGuard",
"BombGuard", "GreenKnifeGuard", "Stal", "GreenMimic", "RedMimic"]]
- [0x0044, 4, ["HardhatBeetle", "Wizzrobe", "MiniHelmasaur", "BlueGuard", "GreenGuard", "RedSpearGuard",
"BluesainBolt", "UsainBolt", "BlueArcher", "GreenBushGuard", "RedJavelinGuard", "RedBushGuard",
"BombGuard", "GreenKnifeGuard", "Stal", "GreenMimic", "RedMimic"]]
- [0x0044, 5, ["HardhatBeetle", "Wizzrobe", "MiniHelmasaur", "BlueGuard", "GreenGuard", "RedSpearGuard",
"BluesainBolt", "UsainBolt", "BlueArcher", "GreenBushGuard", "RedJavelinGuard", "RedBushGuard",
"BombGuard", "GreenKnifeGuard", "Stal", "GreenMimic", "RedMimic"]]
- [0x0044, 6, ["HardhatBeetle", "Wizzrobe", "MiniHelmasaur", "BlueGuard", "GreenGuard", "RedSpearGuard",
"BluesainBolt", "UsainBolt", "BlueArcher", "GreenBushGuard", "RedJavelinGuard", "RedBushGuard",
"BombGuard", "GreenKnifeGuard", "Stal", "GreenMimic", "RedMimic"]]
- [0x0044, 8, ["HardhatBeetle", "Wizzrobe", "MiniHelmasaur", "BlueGuard", "GreenGuard", "RedSpearGuard",
"BluesainBolt", "UsainBolt", "BlueArcher", "GreenBushGuard", "RedJavelinGuard", "RedBushGuard",
"BombGuard", "GreenKnifeGuard", "Stal", "GreenMimic", "RedMimic"]]
- [0x0049, 10, ["HardhatBeetle", "Wizzrobe", "MiniHelmasaur", "BlueGuard", "GreenGuard", "RedSpearGuard",
"BluesainBolt", "UsainBolt", "BlueArcher", "GreenBushGuard", "RedJavelinGuard", "RedBushGuard",
"BombGuard", "GreenKnifeGuard", "Stal", "GreenMimic", "RedMimic"]]
- [0x007b, 0, ["HardhatBeetle", "Wizzrobe", "MiniHelmasaur", "BlueGuard", "GreenGuard", "RedSpearGuard",
"BluesainBolt", "UsainBolt", "BlueArcher", "GreenBushGuard", "RedJavelinGuard", "RedBushGuard",
"BombGuard", "GreenKnifeGuard", "Stal", "GreenMimic", "RedMimic"]]
- [0x007b, 1, ["HardhatBeetle", "Wizzrobe", "MiniHelmasaur", "BlueGuard", "GreenGuard", "RedSpearGuard",
"BluesainBolt", "UsainBolt", "BlueArcher", "GreenBushGuard", "RedJavelinGuard", "RedBushGuard",
"BombGuard", "GreenKnifeGuard", "Stal", "GreenMimic", "RedMimic"]]
- [0x007f, 0, ["HardhatBeetle", "Wizzrobe", "MiniHelmasaur", "BlueGuard", "GreenGuard", "RedSpearGuard",
"BluesainBolt", "UsainBolt", "BlueArcher", "GreenBushGuard", "RedJavelinGuard", "RedBushGuard",
"BombGuard", "GreenKnifeGuard", "Stal", "GreenMimic", "RedMimic", "StalfosKnight", "Geldman", "Blob"]]
- [0x007f, 1, ["HardhatBeetle", "Wizzrobe", "MiniHelmasaur", "BlueGuard", "GreenGuard", "RedSpearGuard",
"BluesainBolt", "UsainBolt", "BlueArcher", "GreenBushGuard", "RedJavelinGuard", "RedBushGuard",
"BombGuard", "GreenKnifeGuard", "Stal", "GreenMimic", "RedMimic", "StalfosKnight", "Geldman", "Blob"]]
- [0x007f, 2, ["HardhatBeetle", "Wizzrobe", "MiniHelmasaur", "BlueGuard", "GreenGuard", "RedSpearGuard",
"BluesainBolt", "UsainBolt", "BlueArcher", "GreenBushGuard", "RedJavelinGuard", "RedBushGuard",
"BombGuard", "GreenKnifeGuard", "Stal", "GreenMimic", "RedMimic", "StalfosKnight", "Geldman", "Blob"]]
- [0x007f, 3, ["HardhatBeetle", "Wizzrobe", "MiniHelmasaur", "BlueGuard", "GreenGuard", "RedSpearGuard",
"BluesainBolt", "UsainBolt", "BlueArcher", "GreenBushGuard", "RedJavelinGuard", "RedBushGuard",
"BombGuard", "GreenKnifeGuard", "Stal", "GreenMimic", "RedMimic", "StalfosKnight", "Geldman", "Blob"]]
- [0x0095, 0, ["HardhatBeetle", "Wizzrobe", "MiniHelmasaur", "BlueGuard", "GreenGuard", "RedSpearGuard",
"BluesainBolt", "UsainBolt", "BlueArcher", "GreenBushGuard", "RedJavelinGuard", "RedBushGuard",
"BombGuard", "GreenKnifeGuard", "Stal", "GreenMimic", "RedMimic"]]
- [0x0095, 1, ["HardhatBeetle", "Wizzrobe", "MiniHelmasaur", "BlueGuard", "GreenGuard", "RedSpearGuard",
"BluesainBolt", "UsainBolt", "BlueArcher", "GreenBushGuard", "RedJavelinGuard", "RedBushGuard",
"BombGuard", "GreenKnifeGuard", "Stal", "GreenMimic", "RedMimic", "StalfosKnight", "Geldman", "Blob"]]
- [0x0095, 2, ["HardhatBeetle", "Wizzrobe", "MiniHelmasaur", "BlueGuard", "GreenGuard", "RedSpearGuard",
"BluesainBolt", "UsainBolt", "BlueArcher", "GreenBushGuard", "RedJavelinGuard", "RedBushGuard",
"BombGuard", "GreenKnifeGuard", "Stal", "GreenMimic", "RedMimic", "StalfosKnight", "Geldman", "Blob"]]
- [0x0095, 3, ["HardhatBeetle", "Wizzrobe", "MiniHelmasaur", "BlueGuard", "GreenGuard", "RedSpearGuard",
"BluesainBolt", "UsainBolt", "BlueArcher", "GreenBushGuard", "RedJavelinGuard", "RedBushGuard",
"BombGuard", "GreenKnifeGuard", "Stal", "GreenMimic", "RedMimic"]]
- [0x00b5, 0, ["HardhatBeetle", "Wizzrobe", "MiniHelmasaur", "BlueGuard", "GreenGuard", "RedSpearGuard",
"BluesainBolt", "UsainBolt", "BlueArcher", "GreenBushGuard", "RedJavelinGuard", "RedBushGuard",
"BombGuard", "GreenKnifeGuard", "Stal", "GreenMimic", "RedMimic", "StalfosKnight", "Geldman", "Blob"]]
- [0x00b5, 1, ["HardhatBeetle", "Wizzrobe", "MiniHelmasaur", "BlueGuard", "GreenGuard", "RedSpearGuard",
"BluesainBolt", "UsainBolt", "BlueArcher", "GreenBushGuard", "RedJavelinGuard", "RedBushGuard",
"BombGuard", "GreenKnifeGuard", "Stal", "GreenMimic", "RedMimic", "StalfosKnight", "Geldman", "Blob"]]
- [0x00b5, 2, ["HardhatBeetle", "Wizzrobe", "MiniHelmasaur", "BlueGuard", "GreenGuard", "RedSpearGuard",
"BluesainBolt", "UsainBolt", "BlueArcher", "GreenBushGuard", "RedJavelinGuard", "RedBushGuard",
"BombGuard", "GreenKnifeGuard", "Stal", "GreenMimic", "RedMimic", "StalfosKnight", "Geldman", "Blob"]]
- [0x00c6, 2, ["HardhatBeetle", "Wizzrobe", "MiniHelmasaur", "BlueGuard", "GreenGuard", "RedSpearGuard",
"BluesainBolt", "UsainBolt", "BlueArcher", "GreenBushGuard", "RedJavelinGuard", "RedBushGuard",
"BombGuard", "GreenKnifeGuard", "Stal", "GreenMimic", "RedMimic", "StalfosKnight", "Geldman", "Blob"]]
- [0x00c6, 3, ["HardhatBeetle", "Wizzrobe", "MiniHelmasaur", "BlueGuard", "GreenGuard", "RedSpearGuard",
"BluesainBolt", "UsainBolt", "BlueArcher", "GreenBushGuard", "RedJavelinGuard", "RedBushGuard",
"BombGuard", "GreenKnifeGuard", "Stal", "GreenMimic", "RedMimic", "StalfosKnight", "Geldman", "Blob"]]
- [0x00c6, 4, ["HardhatBeetle", "Wizzrobe", "MiniHelmasaur", "BlueGuard", "GreenGuard", "RedSpearGuard",
"BluesainBolt", "UsainBolt", "BlueArcher", "GreenBushGuard", "RedJavelinGuard", "RedBushGuard",
"BombGuard", "GreenKnifeGuard", "Stal", "GreenMimic", "RedMimic", "StalfosKnight", "Geldman", "Blob"]]
- [0x00c6, 5, ["HardhatBeetle", "Wizzrobe", "MiniHelmasaur", "BlueGuard", "GreenGuard", "RedSpearGuard",
"BluesainBolt", "UsainBolt", "BlueArcher", "GreenBushGuard", "RedJavelinGuard", "RedBushGuard",
"BombGuard", "GreenKnifeGuard", "Bumper", "Stal", "GreenMimic", "RedMimic", "StalfosKnight", "Geldman", "Blob"]]
- [0x00c6, 6, ["HardhatBeetle", "Wizzrobe", "MiniHelmasaur", "BlueGuard", "GreenGuard", "RedSpearGuard",
"BluesainBolt", "UsainBolt", "BlueArcher", "GreenBushGuard", "RedJavelinGuard", "RedBushGuard",
"BombGuard", "GreenKnifeGuard", "Stal", "GreenMimic", "RedMimic", "StalfosKnight", "Geldman", "Blob"]]
- [0x00e6, 0, ["HardhatBeetle", "Wizzrobe", "MiniHelmasaur", "BlueGuard", "GreenGuard", "RedSpearGuard",
"BluesainBolt", "UsainBolt", "BlueArcher", "GreenBushGuard", "RedJavelinGuard", "RedBushGuard",
"BombGuard", "GreenKnifeGuard", "Stal", "GreenMimic", "RedMimic", "StalfosKnight", "Geldman", "Blob"]]
# wizzrobe despawn issues - on pots/blocks - too close to some object
- [0x0013, 3, ["Wizzrobe"]]
- [0x0016, 0, ["Wizzrobe"]]
- [0x0016, 1, ["Wizzrobe"]]
- [0x0016, 2, ["Wizzrobe"]]
- [0x0016, 3, ["Wizzrobe"]]
- [0x0017, 5, ["Wizzrobe", "Stal"]]
- [0x0019, 2, ["Wizzrobe"]]
- [0x0019, 3, ["Wizzrobe"]]
- [0x001e, 1, ["Wizzrobe"]]
- [0x001e, 2, ["Wizzrobe"]]
- [0x0027, 5, ["Wizzrobe"]]
- [0x0027, 6, ["Wizzrobe"]]
- [0x002a, 3, ["Wizzrobe"]]
- [0x002a, 7, ["Wizzrobe"]]
- [0x002e, 4, ["Wizzrobe"]]
- [0x0035, 5, ["Wizzrobe"]]
- [0x0036, 8, ["Wizzrobe"]]
- [0x003b, 0, ["Wizzrobe"]]
- [0x003b, 2, ["Wizzrobe"]]
- [0x003b, 4, ["Wizzrobe"]]
- [0x003b, 6, ["Wizzrobe"]]
- [0x003c, 1, ["Wizzrobe"]]
- [0x003d, 11, ["Wizzrobe"]]
- [0x003d, 12, ["Wizzrobe"]]
- [0x003d, 13, ["Wizzrobe"]]
- [0x004b, 2, ["Wizzrobe"]]
- [0x004b, 6, ["Wizzrobe"]]
- [0x004b, 7, ["Wizzrobe"]]
- [0x004e, 3, ["Wizzrobe", "Stal"]]
- [0x0054, 3, ["Wizzrobe", "Stal"]]
- [0x0055, 2, ["Wizzrobe"]] # slightly on wall
- [0x005e, 4, ["Wizzrobe", "Stal"]]
- [0x0065, 3, ["Wizzrobe"]]
- [0x0067, 5, ["Wizzrobe"]]
- [0x0067, 6, ["Wizzrobe"]]
- [0x0067, 7, ["Wizzrobe", "Stal"]]
- [0x0067, 8, ["Wizzrobe", "Stal"]]
- [0x0074, 5, ["Wizzrobe"]]
- [0x007c, 1, ["Wizzrobe", "Stal"]]
- [0x007c, 3, ["Wizzrobe", "Stal"]]
- [0x007e, 1, ["Wizzrobe", "Stal"]]
- [0x007e, 6, ["Wizzrobe", "Stal"]]
- [0x0083, 9, ["Wizzrobe"]]
- [0x008b, 6, ["Wizzrobe", "Stal"]]
- [0x008b, 7, ["Wizzrobe", "Stal"]]
- [0x008d, 9, ["Wizzrobe", "Stal"]]
- [0x0096, 0, ["Wizzrobe", "Stal"]]
- [0x009b, 11, ["Wizzrobe"]]
- [0x009f, 5, ["Wizzrobe", "Stal"]]
- [0x00a1, 1, ["Wizzrobe"]]
- [0x00aa, 5, ["Wizzrobe"]]
- [0x00af, 0, ["Wizzrobe", "Stal"]]
- [0x00b0, 1, ["Wizzrobe"]]
- [0x00b0, 2, ["Wizzrobe"]]
- [0x00b2, 4, ["Wizzrobe"]]
- [0x00b8, 2, ["Wizzrobe"]]
- [0x00bf, 1, ["Wizzrobe"]]
- [0x00c1, 3, ["Wizzrobe", "Stal"]]
- [0x00c2, 0, ["Wizzrobe"]]
- [0x00c2, 3, ["Wizzrobe"]]
- [0x00c2, 7, ["Wizzrobe"]]
- [0x00ce, 4, ["Wizzrobe", "Leever", "BlueGuard", "GreenGuard", "RedSpearGuard", "BluesainBolt", "UsainBolt",
"BlueArcher", "RedJavelinGuard", "GreenKnifeGuard", "GreenMimic", "RedMimic"]]
- [0x00ce, 5, ["Wizzrobe", "Leever", "BlueGuard", "GreenGuard", "RedSpearGuard", "BluesainBolt", "UsainBolt",
"BlueArcher", "RedJavelinGuard", "GreenKnifeGuard", "GreenMimic", "RedMimic"]]
- [0x00ce, 6, ["Wizzrobe", "Leever", "BlueGuard", "GreenGuard", "RedSpearGuard", "BluesainBolt", "UsainBolt",
"BlueArcher", "RedJavelinGuard", "GreenKnifeGuard", "GreenMimic", "RedMimic"]]
- [0x00ce, 7, ["Wizzrobe", "Leever", "BlueGuard", "GreenGuard", "RedSpearGuard", "BluesainBolt", "UsainBolt",
"BlueArcher", "RedJavelinGuard", "GreenKnifeGuard", "GreenMimic", "RedMimic"]]
- [0x00d0, 0, ["Wizzrobe"]]
- [0x00d0, 2, ["Wizzrobe"]]
- [0x00d0, 4, ["Wizzrobe"]]
- [0x00d0, 5, ["Wizzrobe"]]
- [0x00d0, 9, ["Wizzrobe"]]
- [0x00d5, 4, ["Wizzrobe"]]
- [0x00df, 1, ["Wizzrobe"]] # slightly on wall
- [0x00e7, 4, ["Wizzrobe"]] # slightly on wall
- [0x00fd, 1, ["Wizzrobe"]] # slightly on rock
- [0x010c, 4, ["Wizzrobe"]]
- [0x010c, 5, ["Wizzrobe"]]
# other mimic cave spots are in the rail section
# enemies that have problems with conveyors
- [0x003b, 0, ["GreenMimic", "RedMimic"]]
- [0x003b, 1, ["GreenMimic", "RedMimic"]]
- [0x003b, 2, ["GreenMimic", "RedMimic"]]
- [0x003b, 3, ["GreenMimic", "RedMimic"]]
- [0x003b, 4, ["GreenMimic", "RedMimic"]]
- [0x003b, 5, ["GreenMimic", "RedMimic"]]
- [0x003b, 6, ["GreenMimic", "RedMimic"]]
- [0x003d, 6, ["GreenMimic", "RedMimic"]]
- [0x003d, 7, ["GreenMimic", "RedMimic"]]
- [0x003e, 8, ["GreenMimic", "RedMimic"]]
- [0x003e, 9, ["GreenMimic", "RedMimic"]]
- [0x003e, 10, ["GreenMimic", "RedMimic"]]
- [0x003e, 11, ["GreenMimic", "RedMimic"]]
- [0x0044, 0, ["GreenMimic", "RedMimic"]]
- [0x0044, 1, ["GreenMimic", "RedMimic"]]
- [0x0044, 2, ["GreenMimic", "RedMimic"]]
- [0x0044, 3, ["GreenMimic", "RedMimic"]]
- [0x0044, 5, ["GreenMimic", "RedMimic"]]
- [0x004c, 0, ["GreenMimic", "RedMimic"]]
- [0x004c, 1, ["GreenMimic", "RedMimic"]]
- [0x004c, 2, ["GreenMimic", "RedMimic"]]
- [0x004c, 3, ["GreenMimic", "RedMimic"]]
- [0x004c, 4, ["GreenMimic", "RedMimic"]]
- [0x004c, 5, ["GreenMimic", "RedMimic"]]
- [0x004c, 6, ["GreenMimic", "RedMimic"]]
- [0x004c, 7, ["GreenMimic", "RedMimic"]]
- [0x005d, 3, ["GreenMimic", "RedMimic"]]
- [0x005d, 4, ["GreenMimic", "RedMimic"]]
- [0x005d, 5, ["GreenMimic", "RedMimic"]]
- [0x005d, 6, ["GreenMimic", "RedMimic"]]
- [0x005d, 8, ["GreenMimic", "RedMimic"]]
- [0x005d, 9, ["GreenMimic", "RedMimic"]]
- [0x005d, 10, ["GreenMimic", "RedMimic"]]
- [0x005d, 11, ["GreenMimic", "RedMimic"]]
- [0x005d, 12, ["GreenMimic", "RedMimic"]]
# - [0x006d, ?, ["GreenMimic", "RedMimic"]] # conveyor doesn't hit edge
# - [0x008b, ?, ["GreenMimic", "RedMimic"]] # conveyor doesn't hit edge
- [0x0092, 2, ["GreenMimic", "RedMimic"]]
- [0x00a5, 0, ["GreenMimic", "RedMimic"]]
- [0x00a5, 1, ["GreenMimic", "RedMimic"]]
- [0x00a5, 4, ["GreenMimic", "RedMimic"]]
- [0x00a5, 5, ["GreenMimic", "RedMimic"]]
- [0x00a5, 6, ["GreenMimic", "RedMimic"]]
- [0x00bb, 1, ["GreenMimic", "RedMimic"]]
- [0x00bb, 4, ["GreenMimic", "RedMimic"]]
- [0x00bb, 5, ["GreenMimic", "RedMimic"]]
- [0x00bb, 6, ["GreenMimic", "RedMimic"]]
- [0x00bb, 7, ["GreenMimic", "RedMimic"]]
- [0x00bb, 8, ["GreenMimic", "RedMimic"]]
- [0x00bb, 9, ["GreenMimic", "RedMimic"]]
- [0x00bb, 10, ["GreenMimic", "RedMimic"]]
- [0x00bc, 0, ["GreenMimic", "RedMimic"]]
- [0x00bc, 1, ["GreenMimic", "RedMimic"]]
- [0x00bc, 2, ["GreenMimic", "RedMimic"]]
- [0x00bc, 3, ["GreenMimic", "RedMimic"]]
- [0x00bc, 4, ["GreenMimic", "RedMimic"]]
- [0x00bc, 5, ["GreenMimic", "RedMimic"]]
- [0x00c1, 5, ["GreenMimic", "RedMimic"]]
- [0x00c1, 8, ["GreenMimic", "RedMimic"]]
- [0x00c1, 9, ["GreenMimic", "RedMimic"]]
- [0x00c1, 10, ["GreenMimic", "RedMimic"]]
- [0x00c1, 11, ["GreenMimic", "RedMimic"]]
- [0x00d1, 5, ["GreenMimic", "RedMimic"]]
- [0x00d1, 6, ["GreenMimic", "RedMimic"]]
# the following are all slightly in the wall on spawn - not too applicable right now, these don't drop anyway
- [0x0064, 0, ["Leever"]]
- [0x00e5, 3, ["Wizzrobe"]]
- [0x00e5, 4, ["Leever", "Wizzrobe"]]
- [0x00e5, 5, ["Leever", "Wizzrobe"]]
# the pit one in 0xe6 room is in the pit section
- [0x00e6, 1, ["Leever", "Wizzrobe"]]
- [0x00e6, 2, ["Leever", "Wizzrobe"]]
- [0x00e6, 3, ["Leever", "Wizzrobe"]]
- [0x00e6, 4, ["Leever", "Wizzrobe"]]
- [0x00e7, 0, ["Wizzrobe"]]
- [0x00e7, 1, ["Wizzrobe"]]
- [0x00e7, 2, ["Wizzrobe"]]
- [0x00e7, 3, ["Leever"]]
- [0x00e7, 4, ["Leever", "Wizzrobe"]]
- [0x00e7, 5, ["Leever", "Wizzrobe"]]
- [0x00e7, 6, ["Wizzrobe"]]
- [0x00f0, 2, ["Leever"]] # clipped away
- [0x00f0, 3, ["Leever"]]
- [0x00f0, 4, ["Leever"]]
- [0x00f0, 5, ["Leever"]]
- [0x00f0, 6, ["Leever"]]
- [0x00f0, 8, ["Leever"]]
- [0x00f1, 0, ["Leever", "Wizzrobe"]]
- [0x00f1, 1, ["Leever", "Wizzrobe"]]
- [0x00f1, 2, ["Wizzrobe"]]
- [0x00f1, 3, ["Wizzrobe"]]
- [0x00f1, 4, ["Wizzrobe"]]
- [0x00f1, 5, ["Wizzrobe"]]
- [0x00f1, 6, ["Leever", "Wizzrobe"]]
- [0x00f1, 7, ["Leever", "Wizzrobe"]]
- [0x00f1, 8, ["Leever", "Wizzrobe"]]
- [0x00f1, 9, ["Leever", "Wizzrobe"]]

View File

@@ -107,6 +107,8 @@ def adjust_page(top, parent, settings):
"reduce_flashing": "reduce_flashing",
'msu_resume': 'msu_resume',
"shuffle_sfx": "shuffle_sfx",
"shuffle_sfxinstruments": "shuffle_sfxinstruments",
"shuffle_songinstruments": "shuffle_songinstruments",
}
guiargs = Namespace()
for option in options:
@@ -158,6 +160,8 @@ def adjust_page(top, parent, settings):
"nobgm": "disablemusic",
"reduce_flashing": "reduce_flashing",
"shuffle_sfx": "shuffle_sfx",
"shuffle_sfxinstruments": "shuffle_sfxinstruments",
"shuffle_songinstruments": "shuffle_songinstruments",
"msu_resume": "msu_resume"
}
guiargs = Namespace()

View File

@@ -6,7 +6,7 @@ import random
import re
from CLI import parse_cli
from Fill import FillError
from Main import main, EnemizerError
from Main import main, export_yaml, EnemizerError
from Utils import local_path, output_path, open_file, update_deprecated_args
import source.classes.constants as CONST
from source.gui.randomize.multiworld import multiworld_page
@@ -68,6 +68,15 @@ def bottom_frame(self, parent, args=None):
self.widgets[key].pack(side=LEFT)
def generateRom():
guiargs = create_guiargs(parent)
argsDump = vars(guiargs)
from Gui import save_settings
if parent.randomSprite.get():
argsDump['sprite'] = 'random'
elif argsDump['sprite']:
argsDump['sprite'] = argsDump['sprite'].name
save_settings(parent, argsDump, "last.json")
guiargs = create_guiargs(parent)
# get default values for missing parameters
for k,v in vars(parse_cli(['--multi', str(guiargs.multi)])).items():
@@ -141,9 +150,45 @@ def bottom_frame(self, parent, args=None):
# button
self.widgets[widget].type = "button"
self.widgets[widget].pieces["button"] = Button(self, text='Generate Patched Rom', command=generateRom)
self.widgets[widget].pieces["button"] = Button(self, command=generateRom)
# button: pack
self.widgets[widget].pieces["button"].pack(side=LEFT)
self.widgets[widget].pieces["button"].configure(bg="#CCCCCC")
def exportYaml():
guiargs = create_guiargs(parent)
# get default values for missing parameters
for k,v in vars(parse_cli(['--multi', str(guiargs.multi)])).items():
if k not in vars(guiargs):
setattr(guiargs, k, v)
elif type(v) is dict: # use same settings for every player
setattr(guiargs, k, {player: getattr(guiargs, k) for player in range(1, guiargs.multi + 1)})
filename = None
try:
from tkinter import filedialog
filename = filedialog.asksaveasfilename(initialdir=guiargs.outputpath, title="Save file", filetypes=(("Yaml Files", (".yaml", ".yml")), ("All Files", "*")))
if filename is not None and filename != '':
guiargs.outputpath = parent.settings["outputpath"] = os.path.dirname(filename)
guiargs.outputname = os.path.splitext(os.path.basename(filename))[0]
export_yaml(args=guiargs, fish=parent.fish)
except (FillError, EnemizerError, Exception, RuntimeError) as e:
logging.exception(e)
messagebox.showerror(title="Error while exporting yaml", message=str(e))
else:
if filename is not None and filename != '':
successMsg = "File Exported"
# FIXME: English
messagebox.showinfo(title="Success", message=successMsg)
## Export Yaml Button
widget = "exportyaml"
self.widgets[widget] = Empty()
self.widgets[widget].pieces = {}
# button
self.widgets[widget].type = "button"
self.widgets[widget].pieces["button"] = Button(self, command=exportYaml)
self.widgets[widget].pieces["button"].pack(side=LEFT)
def open_output():
if output_path.cached_path is None:
@@ -154,13 +199,15 @@ def bottom_frame(self, parent, args=None):
open_file(output_path('.'))
## Output Button
# widget ID
widget = "outputdir"
def select_output():
from tkinter import filedialog
folder_selected = filedialog.askdirectory()
if folder_selected is not None and folder_selected != '':
args.outputpath = parent.settings["outputpath"] = folder_selected
# Empty object
## Output Button
widget = "outputdir"
self.widgets[widget] = Empty()
# pieces
self.widgets[widget].pieces = {}
# storagevar
@@ -168,8 +215,16 @@ def bottom_frame(self, parent, args=None):
# button
self.widgets[widget].type = "button"
self.widgets[widget].pieces["button"] = Button(self, text='Open Output Directory', command=open_output)
# button: pack
self.widgets[widget].pieces["button"] = Button(self, command=select_output)
self.widgets[widget].pieces["button"].pack(side=RIGHT)
## Save Settings Button
widget = "savesettings"
self.widgets[widget] = Empty()
self.widgets[widget].pieces = {}
# button
self.widgets[widget].type = "button"
self.widgets[widget].pieces["button"] = Button(self)
self.widgets[widget].pieces["button"].pack(side=RIGHT)
## Documentation Button
@@ -253,7 +308,11 @@ def create_guiargs(parent):
"heartbeep": "heartbeep",
"menuspeed": "fastmenu",
"owpalettes": "ow_palettes",
"uwpalettes": "uw_palettes"
"uwpalettes": "uw_palettes",
"reduce_flashing": "reduce_flashing",
"shuffle_sfx": "shuffle_sfx",
"shuffle_sfxinstruments": "shuffle_sfxinstruments",
"shuffle_songinstruments": "shuffle_songinstruments"
}
for adjustarg in adjustargs:
internal = adjustargs[adjustarg]

View File

@@ -158,6 +158,22 @@ def loadcliargs(gui, args, settings=None):
label = fish.translate("gui","gui",mainpage + '.' + subpage + '.' + widget)
gui.pages[mainpage].pages[subpage].widgets[widget].pieces["button"].configure(text=label)
# Set Export Yaml button
mainpage = "bottom"
subpage = "content"
widget = "exportyaml"
# set textbox/frame label
label = fish.translate("gui","gui",mainpage + '.' + subpage + '.' + widget)
gui.pages[mainpage].pages[subpage].widgets[widget].pieces["button"].configure(text=label)
# Set Save Settings button
mainpage = "bottom"
subpage = "content"
widget = "savesettings"
# set textbox/frame label
label = fish.translate("gui","gui",mainpage + '.' + subpage + '.' + widget)
gui.pages[mainpage].pages[subpage].widgets[widget].pieces["button"].configure(text=label)
# Set Output Directory button
mainpage = "bottom"
subpage = "content"
@@ -206,7 +222,11 @@ def loadadjustargs(gui, settings):
"heartbeep": "adjust.heartbeep",
"menuspeed": "adjust.menuspeed",
"owpalettes": "adjust.owpalettes",
"uwpalettes": "adjust.uwpalettes"
"uwpalettes": "adjust.uwpalettes",
"reduce_flashing": "adjust.reduce_flashing",
"shuffle_sfx": "adjust.shuffle_sfx",
"shuffle_sfxinstruments": "adjust.shuffle_sfxinstruments",
"shuffle_songinstruments": "adjust.shuffle_songinstruments"
}
}
}

View File

@@ -129,11 +129,11 @@ def create_item_pool_config(world):
groups = LocationGroup('Major').locs(init_set)
if world.bigkeyshuffle[player]:
groups.locations.extend(mode_grouping['Big Keys'])
if world.dropshuffle[player] != 'none':
if world.dropshuffle[player]:
groups.locations.extend(mode_grouping['Big Key Drops'])
if world.keyshuffle[player] != 'none':
groups.locations.extend(mode_grouping['Small Keys'])
if world.dropshuffle[player] != 'none':
if world.dropshuffle[player]:
groups.locations.extend(mode_grouping['Key Drops'])
if world.pottery[player] not in ['none', 'cave']:
groups.locations.extend(mode_grouping['Pot Keys'])

View File

@@ -13,8 +13,11 @@ class EntrancePool(object):
self.inverted = False
self.coupled = True
self.swapped = False
self.assumed_loose_caves = False
self.keep_drops_together = True
self.default_map = {}
self.one_way_map = {}
self.combine_map = {}
self.skull_handled = False
self.links_on_mountain = False
self.decoupled_entrances = []
@@ -54,6 +57,7 @@ def link_entrances_new(world, player):
avail_pool.entrances = set(i_drop_map.keys()).union(i_entrance_map.keys()).union(i_single_ent_map.keys())
avail_pool.exits = set(i_entrance_map.values()).union(i_drop_map.values()).union(i_single_ent_map.values())
avail_pool.inverted = world.mode[player] == 'inverted'
avail_pool.assumed_loose_caves = world.shuffle[player] == 'district'
inverted_substitution(avail_pool, avail_pool.entrances, True, True)
inverted_substitution(avail_pool, avail_pool.exits, False, True)
avail_pool.original_entrances.update(avail_pool.entrances)
@@ -68,6 +72,7 @@ def link_entrances_new(world, player):
default_map['Agahnims Tower'] = 'Ganons Tower Exit'
avail_pool.default_map = default_map
avail_pool.one_way_map = one_way_map
avail_pool.combine_map = {**default_map, **one_way_map}
global LW_Entrances, DW_Entrances
LW_Entrances = []
@@ -93,6 +98,8 @@ def link_entrances_new(world, player):
raise RuntimeError(f'Shuffle mode {mode} is not yet supported')
mode_cfg = copy.deepcopy(modes[mode])
avail_pool.swapped = mode_cfg['undefined'] == 'swap'
avail_pool.keep_drops_together = mode_cfg['keep_drops_together'] == 'on' if 'keep_drops_together' in mode_cfg else True
avail_pool.coupled = mode_cfg['decoupled'] != 'on' if 'decoupled' in mode_cfg else True
if avail_pool.is_standard():
do_standard_connections(avail_pool)
pool_list = mode_cfg['pools'] if 'pools' in mode_cfg else {}
@@ -106,8 +113,7 @@ def link_entrances_new(world, player):
connect_random(holes, targets, avail_pool)
elif special_shuffle == 'normal_drops':
cross_world = mode_cfg['cross_world'] == 'on' if 'cross_world' in mode_cfg else False
keep_together = mode_cfg['keep_drops_together'] == 'on' if 'keep_drops_together' in mode_cfg else True
do_holes_and_linked_drops(set(avail_pool.entrances), set(avail_pool.exits), avail_pool, cross_world, keep_together)
do_holes_and_linked_drops(set(avail_pool.entrances), set(avail_pool.exits), avail_pool, cross_world)
elif special_shuffle == 'fixed_shuffle':
do_fixed_shuffle(avail_pool, pool['entrances'])
elif special_shuffle == 'same_world':
@@ -126,10 +132,18 @@ def link_entrances_new(world, player):
do_limited_shuffle_exclude_drops(pool, avail_pool, False)
elif special_shuffle == 'vanilla':
do_vanilla_connect(pool, avail_pool)
elif special_shuffle == 'district':
drops = []
world_limiter = LW_Entrances if pool['condition'] == 'lightworld' else DW_Entrances
entrances = [e for e in pool['entrances'] if e in world_limiter]
if 'drops' in pool:
drops = [e for e in pool['drops'] if combine_linked_drop_map[e] in world_limiter]
entrances, exits = find_entrances_and_exits(avail_pool, entrances+drops)
do_main_shuffle(entrances, exits, avail_pool, mode_cfg)
elif special_shuffle == 'skull':
entrances, exits = find_entrances_and_exits(avail_pool, pool['entrances'])
rem_ent = None
if avail_pool.world.shuffle[avail_pool.player] in ['dungeons-simple', 'simple', 'restricted'] \
if avail_pool.world.shuffle[avail_pool.player] in ['dungeonssimple', 'simple', 'restricted'] \
and not avail_pool.world.is_tile_swapped(0x00, avail_pool.player):
rem_ent = random.choice(['Skull Woods First Section Door', 'Skull Woods Second Section Door (East)'])
entrances.remove(rem_ent)
@@ -149,6 +163,8 @@ def link_entrances_new(world, player):
do_vanilla_connections(avail_pool)
elif undefined_behavior in ['shuffle', 'swap']:
do_main_shuffle(set(avail_pool.entrances), set(avail_pool.exits), avail_pool, mode_cfg)
elif undefined_behavior == 'error':
assert len(avail_pool.entrances)+len(avail_pool.exits) == 0, 'Not all entrances were placed in their districts'
# afterward
@@ -191,10 +207,8 @@ def do_vanilla_connections(avail_pool):
def do_main_shuffle(entrances, exits, avail, mode_def):
cross_world = mode_def['cross_world'] == 'on' if 'cross_world' in mode_def else False
avail.coupled = mode_def['decoupled'] != 'on' if 'decoupled' in mode_def else True
# drops and holes
keep_together = mode_def['keep_drops_together'] == 'on' if 'keep_drops_together' in mode_def else True
do_holes_and_linked_drops(entrances, exits, avail, cross_world, keep_together)
do_holes_and_linked_drops(entrances, exits, avail, cross_world)
if not avail.coupled:
avail.decoupled_entrances.extend(entrances)
@@ -209,10 +223,6 @@ def do_main_shuffle(entrances, exits, avail, mode_def):
if not avail.coupled:
avail.decoupled_entrances.remove('Agahnims Tower')
avail.decoupled_exits.remove('Ganons Tower Exit')
if avail.swapped:
connect_swap('Agahnims Tower', 'Ganons Tower Exit', avail)
entrances.remove('Ganons Tower')
exits.remove('Agahnims Tower Exit')
elif 'Ganons Tower' in entrances:
connect_two_way('Ganons Tower', 'Ganons Tower Exit', avail)
entrances.remove('Ganons Tower')
@@ -310,7 +320,7 @@ def do_main_shuffle(entrances, exits, avail, mode_def):
return not avail.is_standard() or x != 'Bonk Fairy (Light)'
# old man S&Q cave
if not cross_world:
if not cross_world and not avail.assumed_loose_caves:
#TODO: Add Swapped ER support for this
# OM Cave entrance in lw/dw if cross_world off
if 'Old Man Cave Exit (West)' in rem_exits:
@@ -382,7 +392,7 @@ def do_main_shuffle(entrances, exits, avail, mode_def):
def do_old_man_cave_exit(entrances, exits, avail, cross_world):
if 'Old Man Cave Exit (East)' in exits:
from EntranceShuffle import build_accessible_region_list
if not avail.world.is_tile_swapped(0x03, avail.player):
if not avail.world.is_tile_swapped(0x03, avail.player) or avail.world.shuffle[avail.player] == 'district':
region_name = 'West Death Mountain (Top)'
else:
region_name = 'West Dark Death Mountain (Top)'
@@ -420,11 +430,14 @@ def do_blacksmith(entrances, exits, avail):
if avail.world.logic[avail.player] in ['noglitches', 'minorglitches'] and (avail.world.is_tile_swapped(0x29, avail.player) == avail.inverted):
assumed_inventory.append('Titans Mitts')
blacksmith_options = list()
if not avail.world.is_bombshop_start(avail.player):
links_region = avail.world.get_entrance('Links House Exit', avail.player).connected_region.name
links_region = avail.world.get_entrance('Links House Exit', avail.player).connected_region
else:
links_region = avail.world.get_entrance('Big Bomb Shop Exit', avail.player).connected_region.name
blacksmith_options = list(get_accessible_entrances(links_region, avail, assumed_inventory, False, True, True))
links_region = avail.world.get_entrance('Big Bomb Shop Exit', avail.player).connected_region
if links_region is not None:
links_region = links_region.name
blacksmith_options = list(get_accessible_entrances(links_region, avail, assumed_inventory, False, True, True))
if avail.inverted:
dark_sanc = avail.world.get_entrance('Dark Sanctuary Hint Exit', avail.player).connected_region.name
@@ -440,6 +453,9 @@ def do_blacksmith(entrances, exits, avail):
blacksmith_options = [e for e in blacksmith_options if e not in Forbidden_Swap_Entrances]
blacksmith_options = [x for x in blacksmith_options if x in entrances]
if avail.world.shuffle[avail.player] == 'district' and not len(blacksmith_options):
blacksmith_options = [e for e in entrances if e not in Forbidden_Swap_Entrances or not avail.swapped]
assert len(blacksmith_options), 'No available entrances left to place Blacksmith'
blacksmith_choice = random.choice(blacksmith_options)
connect_entrance(blacksmith_choice, 'Blacksmiths Hut', avail)
@@ -454,11 +470,21 @@ def do_blacksmith(entrances, exits, avail):
def do_standard_connections(avail):
connect_two_way('Hyrule Castle Entrance (South)', 'Hyrule Castle Exit (South)', avail)
# cannot move uncle cave
connect_two_way('Hyrule Castle Secret Entrance Stairs', 'Hyrule Castle Secret Entrance Exit', avail)
connect_entrance('Hyrule Castle Secret Entrance Drop', 'Hyrule Castle Secret Entrance', avail)
std_exits = ['Hyrule Castle Exit (South)', 'Hyrule Castle Secret Entrance Exit']
if not avail.keep_drops_together:
random.shuffle(std_exits)
connect_two_way('Links House', 'Links House Exit', avail)
connect_entrance('Hyrule Castle Secret Entrance Drop', 'Hyrule Castle Secret Entrance', avail)
if avail.coupled:
connect_two_way('Hyrule Castle Entrance (South)', std_exits[0], avail)
# cannot move uncle cave
connect_two_way('Hyrule Castle Secret Entrance Stairs', std_exits[1], avail)
else:
connect_entrance('Hyrule Castle Entrance (South)', std_exits[0], avail)
connect_entrance('Hyrule Castle Secret Entrance Stairs', std_exits[1], avail)
random.shuffle(std_exits)
connect_exit(std_exits[0], 'Hyrule Castle Entrance (South)', avail)
connect_exit(std_exits[1], 'Hyrule Castle Secret Entrance Stairs', avail)
def remove_from_list(t_list, removals):
@@ -466,7 +492,7 @@ def remove_from_list(t_list, removals):
t_list.remove(r)
def do_holes_and_linked_drops(entrances, exits, avail, cross_world, keep_together):
def do_holes_and_linked_drops(entrances, exits, avail, cross_world):
holes_to_shuffle = [x for x in entrances if x in drop_map]
if not avail.world.shuffle_ganon:
@@ -483,7 +509,7 @@ def do_holes_and_linked_drops(entrances, exits, avail, cross_world, keep_togethe
remove_from_list(entrances, ['Pyramid Hole', 'Pyramid Entrance'])
remove_from_list(exits, ['Pyramid', 'Pyramid Exit'])
if not keep_together:
if not avail.keep_drops_together:
targets = [avail.one_way_map[x] for x in holes_to_shuffle]
connect_random(holes_to_shuffle, targets, avail)
remove_from_list(entrances, holes_to_shuffle)
@@ -567,6 +593,8 @@ def do_dark_sanc(entrances, exits, avail):
forbidden.extend(Forbidden_Swap_Entrances)
if not avail.world.is_bombshop_start(avail.player):
forbidden.append('Links House')
else:
forbidden.append('Big Bomb Shop')
if avail.world.owShuffle[avail.player] == 'vanilla':
choices = [e for e in avail.world.districts[avail.player]['Northwest Dark World'].entrances if e not in forbidden and e in entrances]
else:
@@ -602,7 +630,7 @@ def do_links_house(entrances, exits, avail, cross_world):
forbidden.append('Mimic Cave')
if avail.world.is_bombshop_start(avail.player) and (avail.inverted == avail.world.is_tile_swapped(0x03, avail.player)):
forbidden.extend(['Spectacle Rock Cave', 'Spectacle Rock Cave (Bottom)'])
if avail.inverted:
if avail.inverted and avail.world.shuffle[avail.player] != 'district':
dark_sanc_region = avail.world.get_entrance('Dark Sanctuary Hint Exit', avail.player).connected_region.name
forbidden.extend(get_nearby_entrances(avail, dark_sanc_region))
else:
@@ -644,7 +672,7 @@ def do_links_house(entrances, exits, avail, cross_world):
sanc_spawn_can_be_dark = (not avail.inverted and avail.world.doorShuffle[avail.player] in ['partitioned', 'crossed']
and avail.world.intensity[avail.player] >= 3)
if cross_world and not sanc_spawn_can_be_dark:
if (cross_world and not sanc_spawn_can_be_dark) or avail.world.shuffle[avail.player] == 'district':
possible = [e for e in entrance_pool if e not in forbidden]
else:
world_list = LW_Entrances if not avail.inverted else DW_Entrances
@@ -676,7 +704,7 @@ def do_links_house(entrances, exits, avail, cross_world):
return
if avail.world.shuffle[avail.player] in ['lite', 'lean']:
rem_exits = [e for e in avail.exits if e in Connector_Exit_Set and e not in Dungeon_Exit_Set]
multi_exit_caves = figure_out_connectors(rem_exits)
multi_exit_caves = figure_out_connectors(rem_exits, avail)
if cross_world:
possible_dm_exits = [e for e in avail.entrances if e not in entrances and e in LH_DM_Connector_List]
possible_exits = [e for e in avail.entrances if e not in entrances and e not in dm_spots]
@@ -685,7 +713,7 @@ def do_links_house(entrances, exits, avail, cross_world):
possible_dm_exits = [e for e in avail.entrances if e not in entrances and e in LH_DM_Connector_List and e in world_list]
possible_exits = [e for e in avail.entrances if e not in entrances and e not in dm_spots and e in world_list]
else:
multi_exit_caves = figure_out_connectors(exits)
multi_exit_caves = figure_out_connectors(exits, avail)
entrance_pool = entrances if avail.coupled else avail.decoupled_entrances
if cross_world:
possible_dm_exits = [e for e in entrances if e in LH_DM_Connector_List]
@@ -711,7 +739,10 @@ def do_links_house(entrances, exits, avail, cross_world):
connect_entrance(chosen_dm_escape, chosen_exit_start, avail)
connect_exit(chosen_exit_end, chosen_landing, avail)
entrances.remove(chosen_dm_escape)
avail.decoupled_exits.remove(chosen_exit_start)
avail.decoupled_entrances.remove(chosen_landing)
# chosen cave has already been removed from exits
exits.add(chosen_exit_start) # this needs to be added back in
if len(chosen_cave):
exits.update([x for x in chosen_cave])
exits.update([x for item in multi_exit_caves for x in item])
@@ -829,12 +860,22 @@ def get_accessible_entrances(start_region, avail, assumed_inventory=[], cross_wo
return found_entrances
def figure_out_connectors(exits):
def figure_out_connectors(exits, avail):
multi_exit_caves = []
for item in Connector_List:
cave_list = list(Connector_List)
if avail.assumed_loose_caves:
sw_list = ['Skull Woods Second Section Exit (East)', 'Skull Woods Second Section Exit (West)']
random.shuffle(sw_list)
cave_list.extend([sw_list])
cave_list.extend([[entrance_map[e]] for e in linked_drop_map.values() if 'Inverted ' not in e])
for item in cave_list:
if all(x in exits for x in item):
remove_from_list(exits, item)
multi_exit_caves.append(list(item))
elif avail.assumed_loose_caves and any(x in exits for x in item):
remaining = [i for i in item if i in exits]
remove_from_list(exits, remaining)
multi_exit_caves.append(list(remaining))
return multi_exit_caves
@@ -1012,7 +1053,7 @@ def figure_out_must_exits_same_world(entrances, exits, avail):
for x in entrances:
lw_entrances.append(x) if x in LW_Entrances else dw_entrances.append(x)
multi_exit_caves = figure_out_connectors(exits)
multi_exit_caves = figure_out_connectors(exits, avail)
must_exit_lw, must_exit_dw = must_exits_helper(avail)
must_exit_lw = must_exit_filter(avail, must_exit_lw, lw_entrances)
@@ -1022,7 +1063,7 @@ def figure_out_must_exits_same_world(entrances, exits, avail):
def figure_out_must_exits_cross_world(entrances, exits, avail):
multi_exit_caves = figure_out_connectors(exits)
multi_exit_caves = figure_out_connectors(exits, avail)
must_exit_lw, must_exit_dw = must_exits_helper(avail)
must_exit = must_exit_filter(avail, must_exit_lw + must_exit_dw, entrances)
@@ -1086,7 +1127,7 @@ def do_cross_world_connectors(entrances, caves, avail):
avail.decoupled_entrances.remove(choice)
else:
if avail.swapped and len(entrances) > 1:
chosen_entrance = next(e for e in entrances if combine_map[e] != ext)
chosen_entrance = next(e for e in entrances if avail.combine_map[e] != ext)
entrances.remove(chosen_entrance)
else:
chosen_entrance = entrances.pop()
@@ -1135,7 +1176,7 @@ def do_fixed_shuffle(avail, entrance_list):
choice = choices[i]
elif rules.must_exit_to_lw:
lw_exits = set()
for e, x in combine_map.items():
for e, x in avail.combine_map.items():
if x in avail.exits:
region = avail.world.get_entrance(e, avail.player).parent_region
if region.type == RegionType.LightWorld:
@@ -1145,9 +1186,12 @@ def do_fixed_shuffle(avail, entrance_list):
new_x = 'Agahnims Tower Exit'
elif x == 'Agahnims Tower Exit':
new_x = 'Ganons Tower Exit'
if avail.world.is_bombshop_start(avail.player):
if x == 'Links House Exit':
new_x = 'Big Bomb Shop'
elif x == 'Big Bomb Shop':
new_x = 'Links House Exit'
lw_exits.add(new_x)
if avail.world.shufflelinks[avail.player] or avail.world.shuffle[avail.player] not in ['vanilla', 'dungeonssimple', 'dungeonsfull']:
lw_exits.update({'Big Bomb Shop'} if avail.world.is_bombshop_start(avail.player) else {'Links House Exit'})
filtered_choices = {i: opt for i, opt in choices.items() if all(t in lw_exits for t in opt[2])}
_, choice = random.choice(list(filtered_choices.items()))
else:
@@ -1268,6 +1312,22 @@ def do_limited_shuffle_exclude_drops(pool_def, avail, lw=True):
must_exit = set(must_exit_lw if lw else must_exit_dw)
base_set = LW_Entrances if lw else DW_Entrances
entrance_pool = [x for x in base_set if x in avail.entrances and x not in reserved_drops]
if not avail.world.shuffle_ganon[avail.player]:
if avail.world.is_atgt_swapped(avail.player):
if 'Agahnims Tower' in entrance_pool:
connect_two_way('Agahnims Tower', 'Ganons Tower Exit', avail)
entrance_pool.remove('Agahnims Tower')
exits.remove('Ganons Tower Exit')
if not avail.coupled:
avail.decoupled_entrances.remove('Agahnims Tower')
avail.decoupled_exits.remove('Ganons Tower Exit')
elif 'Ganons Tower' in entrance_pool:
connect_two_way('Ganons Tower', 'Ganons Tower Exit', avail)
entrance_pool.remove('Ganons Tower')
exits.remove('Ganons Tower Exit')
if not avail.coupled:
avail.decoupled_entrances.remove('Ganons Tower')
avail.decoupled_exits.remove('Ganons Tower Exit')
random.shuffle(entrance_pool)
for next_exit in exits:
if next_exit not in Connector_Exit_Set:
@@ -1314,7 +1374,7 @@ def do_mandatory_connections(avail, entrances, cave_options, must_exit):
invalid_connections = Must_Exit_Invalid_Connections.copy()
invalid_cave_connections = defaultdict(set)
if avail.world.logic[avail.player] in ['owglitches', 'nologic']:
if avail.world.logic[avail.player] in ['owglitches', 'hybridglitches', 'nologic']:
import OverworldGlitchRules
for entrance in OverworldGlitchRules.get_non_mandatory_exits(avail.world, avail.player):
invalid_connections[entrance] = set()
@@ -1323,7 +1383,7 @@ def do_mandatory_connections(avail, entrances, cave_options, must_exit):
if entrance not in entrances:
entrances.append(entrance)
if avail.swapped:
swap_forbidden = [e for e in entrances if combine_map[e] in must_exit]
swap_forbidden = [e for e in entrances if avail.combine_map[e] in must_exit]
for e in swap_forbidden:
entrances.remove(e)
entrances.sort() # sort these for consistency
@@ -1358,11 +1418,21 @@ def do_mandatory_connections(avail, entrances, cave_options, must_exit):
# find multi exit cave
candidates = []
for candidate in cave_options:
if not isinstance(candidate, str) and len(candidate) > 1 and (candidate in used_caves
allow_single = avail.assumed_loose_caves or len(candidate) > 1
if not isinstance(candidate, str) and allow_single and (candidate in used_caves
or len(candidate) < len(entrances) - required_entrances):
if not avail.swapped or (combine_map[exit] not in candidate and not any(e for e in must_exit if combine_map[e] in candidate)): #maybe someday allow these, but we need to disallow mutual locks in Swapped
if not avail.swapped or (avail.combine_map[exit] not in candidate and not any(e for e in must_exit if avail.combine_map[e] in candidate)): #maybe someday allow these, but we need to disallow mutual locks in Swapped
candidates.append(candidate)
cave = random.choice(candidates)
if avail.swapped and len(candidates) > 1 and not avail.world.is_tile_swapped(0x03, avail.player):
DM_Connector_Prefixes = ['Spectacle Rock Cave', 'Old Man House', 'Death Mountain Return']
if any(p for p in DM_Connector_Prefixes if p in cave[0]): # if chosen cave is a DM connector
remain = [p for p in DM_Connector_Prefixes if len([e for e in entrances if p in e]) > 0] # gets remaining DM caves left in pool
if len(remain) == 1: # guarantee that old man rescue cave can still be placed
candidates.remove(cave)
cave = random.choice(candidates)
if cave is None:
raise RuntimeError('No more caves left. Should not happen!')
@@ -1380,10 +1450,10 @@ def do_mandatory_connections(avail, entrances, cave_options, must_exit):
if len(cave) == 2:
entrance = next(e for e in entrances[::-1] if e not in invalid_connections[exit]
and e not in invalid_cave_connections[tuple(cave)] and e not in must_exit
and (not avail.swapped or rnd_cave[0] != combine_map[e]))
and (not avail.swapped or rnd_cave[0] != avail.combine_map[e]))
entrances.remove(entrance)
connect_two_way(entrance, rnd_cave[0], avail)
if avail.swapped and combine_map[entrance] != rnd_cave[0]:
if avail.swapped and avail.combine_map[entrance] != rnd_cave[0]:
swap_ent, _ = connect_cave_swap(entrance, rnd_cave[0], cave)
entrances.remove(swap_ent)
if cave in used_caves:
@@ -1392,6 +1462,10 @@ def do_mandatory_connections(avail, entrances, cave_options, must_exit):
if entrance in invalid_connections:
for exit2 in invalid_connections[entrance]:
invalid_connections[exit2] = invalid_connections[exit2].union(invalid_connections[exit]).union(invalid_cave_connections[tuple(cave)])
elif len(cave) == 1 and avail.assumed_loose_caves:
#TODO: keep track of caves we use for must exits that are unaccounted here
# the other exits of the cave should NOT be used to satisfy must-exit later
pass
elif cave[-1] == 'Spectacle Rock Cave Exit': # Spectacle rock only has one exit
cave_entrances = []
for cave_exit in rnd_cave[:-1]:
@@ -1400,11 +1474,11 @@ def do_mandatory_connections(avail, entrances, cave_options, must_exit):
cave_entrances.append(entrance)
else:
entrance = next(e for e in entrances[::-1] if e not in invalid_connections[exit] and e not in must_exit
and (not avail.swapped or cave_exit != combine_map[e]))
and (not avail.swapped or cave_exit != avail.combine_map[e]))
cave_entrances.append(entrance)
entrances.remove(entrance)
connect_two_way(entrance, cave_exit, avail)
if avail.swapped and combine_map[entrance] != cave_exit:
if avail.swapped and avail.combine_map[entrance] != cave_exit:
swap_ent, _ = connect_cave_swap(entrance, cave_exit, cave)
entrances.remove(swap_ent)
if entrance not in invalid_connections:
@@ -1431,11 +1505,11 @@ def do_mandatory_connections(avail, entrances, cave_options, must_exit):
continue
else:
entrance = next(e for e in entrances[::-1] if e not in invalid_cave_connections[tuple(cave)]
and (not avail.swapped or cave_exit != combine_map[e]))
and (not avail.swapped or cave_exit != avail.combine_map[e]))
invalid_cave_connections[tuple(cave)] = set()
entrances.remove(entrance)
connect_two_way(entrance, cave_exit, avail)
if avail.swapped and combine_map[entrance] != cave_exit:
if avail.swapped and avail.combine_map[entrance] != cave_exit:
swap_ent, _ = connect_cave_swap(entrance, cave_exit, cave)
entrances.remove(swap_ent)
cave_options.remove(cave)
@@ -1516,14 +1590,12 @@ def find_entrances_and_exits(avail_pool, entrance_pool):
entrances, targets = [], []
inverted_substitution(avail_pool, entrance_pool, True)
for item in entrance_pool:
if item == 'Ganons Tower' and not avail_pool.world.shuffle_ganon[avail_pool.player]:
continue
if item in avail_pool.entrances:
entrances.append(item)
if item in entrance_map and entrance_map[item] in avail_pool.exits:
targets.append(entrance_map[item])
elif item in single_entrance_map and single_entrance_map[item] in avail_pool.exits:
targets.append(single_entrance_map[item])
if item in avail_pool.default_map and avail_pool.default_map[item] in avail_pool.exits:
targets.append(avail_pool.default_map[item])
elif item in avail_pool.one_way_map and avail_pool.one_way_map[item] in avail_pool.exits:
targets.append(avail_pool.one_way_map[item])
return entrances, targets
@@ -1555,11 +1627,11 @@ def connect_swapped(entrancelist, targetlist, avail, two_way=False):
random.shuffle(entrancelist)
sorted_targets = list()
for ent in entrancelist:
if ent in combine_map:
if combine_map[ent] not in targetlist:
logging.getLogger('').error(f'{combine_map[ent]} not in target list, cannot swap entrance')
raise Exception(f'{combine_map[ent]} not in target list, cannot swap entrance')
sorted_targets.append(combine_map[ent])
if ent in avail.combine_map:
if avail.combine_map[ent] not in targetlist:
logging.getLogger('').error(f'{avail.combine_map[ent]} not in target list, cannot swap entrance')
raise Exception(f'{avail.combine_map[ent]} not in target list, cannot swap entrance')
sorted_targets.append(avail.combine_map[ent])
if len(sorted_targets):
targetlist = list(sorted_targets)
else:
@@ -1580,9 +1652,9 @@ def connect_swapped(entrancelist, targetlist, avail, two_way=False):
def connect_swap(entrance, exit, avail):
swap_exit = combine_map[entrance]
swap_exit = avail.combine_map[entrance]
if swap_exit != exit:
swap_entrance = next(e for e, x in combine_map.items() if x == exit)
swap_entrance = next(e for e, x in avail.combine_map.items() if x == exit)
if swap_entrance in ['Pyramid Entrance', 'Pyramid Hole'] and avail.world.is_tile_swapped(0x1b, avail.player):
swap_entrance = 'Inverted ' + swap_entrance
if entrance in entrance_map:
@@ -1675,7 +1747,7 @@ def connect_entrance(entrancename, exit_name, avail):
def connect_exit(exit_name, entrancename, avail):
world, player = avail.world, avail. player
world, player = avail.world, avail.player
entrance = world.get_entrance(entrancename, player)
exit = world.get_entrance(exit_name, player)
@@ -1683,13 +1755,18 @@ def connect_exit(exit_name, entrancename, avail):
if exit.connected_region is not None:
exit.connected_region.entrances.remove(exit)
exit.connect(entrance.parent_region, door_addresses[entrance.name][1], exit_ids[exit.name][1])
dest_region = entrance.parent_region
if dest_region.name == 'Pyramid Crack':
# Needs to logically exit into greater Pyramid Area
dest_region = entrance.parent_region.entrances[0].parent_region
exit.connect(dest_region, door_addresses[entrance.name][1], exit_ids[exit.name][1])
if exit_name != 'Chris Houlihan Room Exit':
if avail.coupled:
avail.entrances.remove(entrancename)
avail.exits.remove(exit_name)
world.spoiler.set_entrance(entrance.name, exit.name, 'exit', player)
logging.getLogger('').debug(f'Connected (exit) {entrance.name} to {exit.name}')
logging.getLogger('').debug(f'Connected (exit) {exit.name} to {entrance.name}')
def connect_two_way(entrancename, exit_name, avail):
@@ -2056,6 +2133,157 @@ modes = {
},
}
},
'district': {
'undefined': 'error',
'keep_drops_together': 'off',
'cross_world': 'off',
'pools': {
'northwest_hyrule': {
'special': 'district',
'condition': 'lightworld',
'drops': ['Lost Woods Hideout Drop', 'Lumberjack Tree Tree', 'Sanctuary Grave', 'North Fairy Cave Drop',
'Skull Woods First Section Hole (West)', 'Skull Woods First Section Hole (East)',
'Skull Woods First Section Hole (North)', 'Skull Woods Second Section Hole'],
'entrances': ['Lost Woods Hideout Stump', 'Lumberjack Tree Cave', 'Sanctuary', 'North Fairy Cave',
'Lost Woods Gamble', 'Lumberjack House', 'Old Man Cave (West)', 'Death Mountain Return Cave (West)',
'Fortune Teller (Light)', 'Bonk Rock Cave', 'Graveyard Cave', 'Kings Grave',
'Skull Woods First Section Door', 'Skull Woods Second Section Door (East)',
'Skull Woods Second Section Door (West)', 'Skull Woods Final Section', 'Dark Lumberjack Shop',
'Bumper Cave (Bottom)', 'Bumper Cave (Top)', 'Fortune Teller (Dark)', 'Dark Sanctuary Hint',
'Red Shield Shop']
},
'northwest_dark_world': {
'special': 'district',
'condition': 'darkworld',
'drops': ['Skull Woods First Section Hole (West)', 'Skull Woods First Section Hole (East)',
'Skull Woods First Section Hole (North)', 'Skull Woods Second Section Hole',
'Lost Woods Hideout Drop', 'Lumberjack Tree Tree', 'Sanctuary Grave', 'North Fairy Cave Drop',
'Kakariko Well Drop', 'Bat Cave Drop'],
'entrances': ['Skull Woods First Section Door', 'Skull Woods Second Section Door (East)',
'Skull Woods Second Section Door (West)', 'Skull Woods Final Section', 'Dark Lumberjack Shop',
'Bumper Cave (Bottom)', 'Bumper Cave (Top)', 'Fortune Teller (Dark)', 'Dark Sanctuary Hint',
'Chest Game', 'Thieves Town', 'C-Shaped House', 'Dark World Shop', 'Brewery',
'Red Shield Shop', 'Hammer Peg Cave',
'Lost Woods Hideout Stump', 'Lumberjack Tree Cave', 'Sanctuary', 'North Fairy Cave',
'Kakariko Well Cave', 'Bat Cave Cave', 'Lost Woods Gamble', 'Lumberjack House', 'Fortune Teller (Light)',
'Old Man Cave (West)', 'Death Mountain Return Cave (West)', 'Bonk Rock Cave', 'Graveyard Cave',
'Kings Grave', 'Blinds Hideout', 'Elder House (West)', 'Elder House (East)', 'Snitch Lady (West)',
'Snitch Lady (East)', 'Chicken House', 'Sick Kids House', 'Bush Covered House', 'Light World Bomb Hut',
'Kakariko Shop', 'Tavern North', 'Tavern (Front)', 'Blacksmiths Hut']
},
'central_hyrule': {
'special': 'district',
'condition': 'lightworld',
'drops': ['Hyrule Castle Secret Entrance Drop', 'Inverted Pyramid Hole',
'Pyramid Hole'],
'entrances': ['Hyrule Castle Secret Entrance Stairs', 'Inverted Pyramid Entrance', 'Agahnims Tower',
'Hyrule Castle Entrance (West)', 'Hyrule Castle Entrance (East)', 'Hyrule Castle Entrance (South)',
'Bonk Fairy (Light)', 'Links House', 'Cave 45', 'Light Hype Fairy', 'Dam',
'Pyramid Entrance', 'Pyramid Fairy', 'Bonk Fairy (Dark)', 'Big Bomb Shop', 'Hype Cave', 'Swamp Palace']
},
'kakariko': {
'special': 'district',
'condition': 'lightworld',
'drops': ['Kakariko Well Drop', 'Bat Cave Drop'],
'entrances': ['Kakariko Well Cave', 'Bat Cave Cave', 'Blinds Hideout', 'Elder House (West)', 'Elder House (East)',
'Snitch Lady (West)', 'Snitch Lady (East)', 'Chicken House', 'Sick Kids House', 'Bush Covered House',
'Light World Bomb Hut', 'Kakariko Shop', 'Tavern North', 'Tavern (Front)', 'Blacksmiths Hut',
'Two Brothers House (West)', 'Two Brothers House (East)', 'Library', 'Kakariko Gamble Game',
'Chest Game', 'Thieves Town', 'C-Shaped House', 'Dark World Shop', 'Brewery',
'Hammer Peg Cave', 'Archery Game']
},
'eastern_hyrule': {
'special': 'district',
'condition': 'lightworld',
'entrances': ['Waterfall of Wishing', 'Potion Shop', 'Sahasrahlas Hut', 'Eastern Palace', 'Lake Hylia Fairy',
'Long Fairy Cave',
'Dark Potion Shop', 'Palace of Darkness Hint', 'Palace of Darkness', 'Dark Lake Hylia Fairy',
'East Dark World Hint']
},
'lake_hylia': {
'special': 'district',
'condition': 'lightworld',
'entrances': ['Lake Hylia Fortune Teller', 'Lake Hylia Shop', 'Capacity Upgrade', 'Mini Moldorm Cave',
'Ice Rod Cave', 'Good Bee Cave', '20 Rupee Cave',
'Dark Lake Hylia Shop', 'Ice Palace', 'Dark Lake Hylia Ledge Fairy', 'Dark Lake Hylia Ledge Hint',
'Dark Lake Hylia Ledge Spike Cave']
},
'desert': {
'special': 'district',
'condition': 'lightworld',
'entrances': ['Desert Palace Entrance (North)', 'Desert Palace Entrance (West)', 'Desert Palace Entrance (South)',
'Desert Palace Entrance (East)', 'Checkerboard Cave', 'Aginahs Cave', 'Desert Fairy', '50 Rupee Cave',
'Mire Shed', 'Misery Mire', 'Mire Fairy', 'Mire Hint']
},
'death_mountain': {
'special': 'district',
'condition': 'lightworld',
'entrances': ['Tower of Hera', 'Spectacle Rock Cave Peak', 'Spectacle Rock Cave (Bottom)', 'Spectacle Rock Cave',
'Death Mountain Return Cave (East)', 'Old Man Cave (East)', 'Old Man House (Bottom)', 'Old Man House (Top)',
'Spiral Cave', 'Spiral Cave (Bottom)', 'Fairy Ascension Cave (Top)', 'Fairy Ascension Cave (Bottom)',
'Mimic Cave', 'Hookshot Fairy', 'Paradox Cave (Top)', 'Paradox Cave (Middle)', 'Paradox Cave (Bottom)',
'Ganons Tower', 'Dark Death Mountain Fairy', 'Spike Cave', 'Superbunny Cave (Bottom)', 'Superbunny Cave (Top)',
'Dark Death Mountain Shop', 'Hookshot Cave', 'Hookshot Cave Back Entrance',
'Dark Death Mountain Ledge (West)', 'Dark Death Mountain Ledge (East)', 'Turtle Rock Isolated Ledge Entrance', 'Turtle Rock']
},
'dark_death_mountain': {
'special': 'district',
'condition': 'darkworld',
'entrances': ['Ganons Tower', 'Dark Death Mountain Fairy', 'Spike Cave', 'Superbunny Cave (Bottom)', 'Superbunny Cave (Top)',
'Dark Death Mountain Shop', 'Hookshot Cave', 'Hookshot Cave Back Entrance',
'Dark Death Mountain Ledge (West)', 'Dark Death Mountain Ledge (East)', 'Turtle Rock Isolated Ledge Entrance', 'Turtle Rock',
'Tower of Hera', 'Spectacle Rock Cave Peak', 'Spectacle Rock Cave (Bottom)', 'Spectacle Rock Cave',
'Death Mountain Return Cave (East)', 'Old Man Cave (East)', 'Old Man House (Bottom)', 'Old Man House (Top)',
'Spiral Cave', 'Spiral Cave (Bottom)', 'Fairy Ascension Cave (Top)', 'Fairy Ascension Cave (Bottom)',
'Mimic Cave', 'Hookshot Fairy', 'Paradox Cave (Top)', 'Paradox Cave (Middle)', 'Paradox Cave (Bottom)']
},
'south_dark_world': {
'special': 'district',
'condition': 'darkworld',
'entrances': ['Archery Game', 'Bonk Fairy (Dark)', 'Big Bomb Shop', 'Hype Cave', 'Dark Lake Hylia Shop', 'Ice Palace',
'Dark Lake Hylia Ledge Fairy', 'Dark Lake Hylia Ledge Hint', 'Dark Lake Hylia Ledge Spike Cave',
'Swamp Palace',
'Two Brothers House (West)', 'Two Brothers House (East)', 'Library', 'Kakariko Gamble Game',
'Bonk Fairy (Light)', 'Links House', 'Cave 45', 'Desert Fairy', '50 Rupee Cave', 'Dam',
'Light Hype Fairy', 'Lake Hylia Fortune Teller', 'Lake Hylia Shop', 'Capacity Upgrade',
'Mini Moldorm Cave', 'Ice Rod Cave', 'Good Bee Cave', '20 Rupee Cave']
},
'east_dark_world': {
'special': 'district',
'condition': 'darkworld',
'drops': ['Pyramid Hole',
'Hyrule Castle Secret Entrance Drop', 'Inverted Pyramid Hole'],
'entrances': ['Pyramid Entrance', 'Pyramid Fairy', 'Dark Potion Shop', 'Palace of Darkness Hint', 'Palace of Darkness',
'Dark Lake Hylia Fairy', 'East Dark World Hint',
'Hyrule Castle Secret Entrance Stairs', 'Inverted Pyramid Entrance', 'Waterfall of Wishing', 'Potion Shop',
'Agahnims Tower', 'Hyrule Castle Entrance (West)', 'Hyrule Castle Entrance (East)',
'Hyrule Castle Entrance (South)', 'Sahasrahlas Hut', 'Eastern Palace', 'Lake Hylia Fairy', 'Long Fairy Cave']
},
'mire': {
'special': 'district',
'condition': 'darkworld',
'entrances': ['Mire Shed', 'Misery Mire', 'Mire Fairy', 'Mire Hint',
'Desert Palace Entrance (North)', 'Desert Palace Entrance (West)', 'Desert Palace Entrance (South)',
'Desert Palace Entrance (East)', 'Checkerboard Cave', 'Aginahs Cave']
}
}
},
'swapped': {
'undefined': 'swap',
'keep_drops_together': 'on',
@@ -2117,7 +2345,7 @@ drop_map = {
}
linked_drop_map = {
'Hyrule Castle Secret Entrance Drop': 'Hyrule Castle Secret Entrance Stairs',
'Hyrule Castle Secret Entrance Drop': 'Hyrule Castle Secret Entrance Stairs',
'Kakariko Well Drop': 'Kakariko Well Cave',
'Bat Cave Drop': 'Bat Cave Cave',
'North Fairy Cave Drop': 'North Fairy Cave',
@@ -2128,6 +2356,13 @@ linked_drop_map = {
'Inverted Pyramid Hole': 'Inverted Pyramid Entrance'
}
sw_linked_drop_map = {
'Skull Woods Second Section Hole': 'Skull Woods Second Section Door (West)',
'Skull Woods First Section Hole (North)': 'Skull Woods First Section Door',
'Skull Woods First Section Hole (West)': 'Skull Woods First Section Door',
'Skull Woods First Section Hole (East)': 'Skull Woods First Section Door'
}
entrance_map = {
'Desert Palace Entrance (South)': 'Desert Palace Exit (South)',
'Desert Palace Entrance (West)': 'Desert Palace Exit (West)',
@@ -2161,7 +2396,7 @@ entrance_map = {
'Links House': 'Links House Exit',
'Hyrule Castle Secret Entrance Stairs': 'Hyrule Castle Secret Entrance Exit',
'Hyrule Castle Secret Entrance Stairs': 'Hyrule Castle Secret Entrance Exit',
'Kakariko Well Cave': 'Kakariko Well Exit',
'Bat Cave Cave': 'Bat Cave Exit',
'North Fairy Cave': 'North Fairy Cave Exit',
@@ -2235,7 +2470,7 @@ single_entrance_map = {
'Blinds Hideout': 'Blinds Hideout', 'Waterfall of Wishing': 'Waterfall of Wishing'
}
combine_map = {**entrance_map, **single_entrance_map, **drop_map}
combine_linked_drop_map = {**linked_drop_map, **sw_linked_drop_map}
LW_Entrances = []
DW_Entrances = []
@@ -2656,7 +2891,7 @@ door_addresses = {'Links House': (0x00, (0x0104, 0x2c
'Mire Hint': (0x61, (0x0114, 0x70, 0x0654, 0x0cc5, 0x02aa, 0x0d16, 0x0328, 0x0d32, 0x032f, 0x09, 0xf7, 0x0000, 0x0000), 0x00),
'Mire Fairy': (0x55, (0x0115, 0x70, 0x03a8, 0x0c6a, 0x013a, 0x0cb7, 0x01b8, 0x0cd7, 0x01bf, 0x06, 0xfa, 0x0000, 0x0000), 0x00),
'Spike Cave': (0x40, (0x0117, 0x43, 0x0ed4, 0x01e4, 0x08aa, 0x0236, 0x0928, 0x0253, 0x092f, 0x0a, 0xf6, 0x0000, 0x0000), 0x00),
'Dark Death Mountain Shop': (0x6D, (0x0112, 0x45, 0x0ee0, 0x01e3, 0x0d00, 0x0236, 0x0daa, 0x0252, 0x0d7d, 0x0b, 0xf5, 0x0000, 0x0000), 0x00),
'Dark Death Mountain Shop': (0x6D, (0x0112, 0x45, 0x0ee0, 0x01e3, 0x0d00, 0x0236, 0x0da8, 0x0252, 0x0d7d, 0x0b, 0xf5, 0x0000, 0x0000), 0x00),
'Dark Death Mountain Fairy': (0x6F, (0x0115, 0x43, 0x1400, 0x0294, 0x0600, 0x02e8, 0x0678, 0x0303, 0x0685, 0x0a, 0xf6, 0x0000, 0x0000), 0x00),
'Mimic Cave': (0x4E, (0x010c, 0x05, 0x07e0, 0x0103, 0x0d00, 0x0156, 0x0d78, 0x0172, 0x0d7d, 0x0b, 0xf5, 0x0000, 0x0000), 0x00),
'Big Bomb Shop': (0x52, (0x011c, 0x6c, 0x0506, 0x0a9a, 0x0832, 0x0ae7, 0x08b8, 0x0b07, 0x08bf, 0x06, 0xfa, 0x0816, 0x0000), 0x00),

View File

@@ -46,8 +46,9 @@ def roll_settings(weights):
ret.algorithm = get_choice('algorithm')
glitch_map = {'none': 'noglitches', 'no_logic': 'nologic', 'owglitches': 'owglitches',
'owg': 'owglitches', 'minorglitches': 'minorglitches'}
glitch_map = {'none': 'noglitches', 'minorglitches': 'minorglitches', 'no_logic': 'nologic',
'hmg': 'hybridglitches', 'hybridglitches': 'hybridglitches',
'owg': 'owglitches', 'owglitches': 'owglitches'}
glitches_required = get_choice('glitches_required')
if glitches_required is not None:
if glitches_required not in glitch_map.keys():
@@ -78,9 +79,9 @@ def roll_settings(weights):
overworld_shuffle = get_choice('overworld_shuffle')
ret.ow_shuffle = overworld_shuffle if overworld_shuffle != 'none' else 'vanilla'
ret.ow_terrain = get_choice('overworld_terrain') == 'on'
valid_options = {'none', 'polar', 'grouped', 'limited', 'chaos'}
valid_options = {'none': 'none', 'polar': 'polar', 'grouped': 'polar', 'chaos': 'unrestricted', 'unrestricted': 'unrestricted'}
ret.ow_crossed = get_choice('overworld_crossed')
ret.ow_crossed = ret.ow_crossed if ret.ow_crossed in valid_options else 'none'
ret.ow_crossed = valid_options[ret.ow_crossed] if ret.ow_crossed in valid_options else 'none'
ret.ow_keepsimilar = get_choice('overworld_keepsimilar') == 'on'
ret.ow_mixed = get_choice('overworld_swap') == 'on'
ret.ow_whirlpool = get_choice('whirlpool_shuffle') == 'on'
@@ -114,6 +115,7 @@ def roll_settings(weights):
ret.pottery = 'keys' if ret.pottery == 'none' and keydropshuffle else ret.pottery
ret.colorizepots = get_choice_default('colorizepots', default='on') == 'on'
ret.shufflepots = get_choice('pot_shuffle') == 'on'
ret.aga_randomness = get_choice('aga_randomness') == 'on'
ret.mixed_travel = get_choice('mixed_travel') if 'mixed_travel' in weights else 'prevent'
ret.standardize_palettes = (get_choice('standardize_palettes') if 'standardize_palettes' in weights
else 'standardize')
@@ -231,6 +233,8 @@ def roll_settings(weights):
ret.ow_palettes = get_choice('ow_palettes', romweights)
ret.uw_palettes = get_choice('uw_palettes', romweights)
ret.shuffle_sfx = get_choice('shuffle_sfx', romweights) == 'on'
ret.shuffle_sfxinstruments = get_choice('shuffle_sfxinstruments', romweights) == 'on'
ret.shuffle_songinstruments = get_choice('shuffle_songinstruments', romweights) == 'on'
ret.msu_resume = get_choice('msu_resume', romweights) == 'on'
return ret