Merge branch 'OriginOverworldShuffle' into OverworldShuffle
This commit is contained in:
@@ -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 = {}
|
||||
|
||||
@@ -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)
|
||||
]
|
||||
@@ -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": {
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
|
||||
710
source/enemizer/enemy_deny.yaml
Normal file
710
source/enemizer/enemy_deny.yaml
Normal 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"]]
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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]
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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'])
|
||||
|
||||
@@ -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),
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user