Merge branch 'OverworldShuffleDev' into OverworldShuffle
This commit is contained in:
@@ -36,8 +36,9 @@ def main():
|
||||
parser.add_argument('--ow_palettes', default='default', choices=['default', 'random', 'blackout'])
|
||||
parser.add_argument('--uw_palettes', default='default', choices=['default', 'random', 'blackout'])
|
||||
parser.add_argument('--reduce_flashing', help='Reduce some in-game flashing.', action='store_true')
|
||||
parser.add_argument('--shuffle_sfx', help='Shuffles sfx instruments', action='store_true')
|
||||
parser.add_argument('--shuffle_songinstruments', help='Shuffles sound sfx', action='store_true')
|
||||
parser.add_argument('--shuffle_sfx', help='Shuffles sound sfx', action='store_true')
|
||||
parser.add_argument('--shuffle_sfxinstruments', help='Shuffles sound instruments', action='store_true')
|
||||
parser.add_argument('--shuffle_songinstruments', help='Shuffles song instruments', action='store_true')
|
||||
parser.add_argument('--msu_resume', help='Enable MSU resume', action='store_true')
|
||||
parser.add_argument('--sprite', help='''\
|
||||
Path to a sprite sheet to use for Link. Needs to be in
|
||||
|
||||
@@ -33,7 +33,7 @@ def adjust(args):
|
||||
|
||||
apply_rom_settings(rom, args.heartbeep, args.heartcolor, args.quickswap, args.fastmenu, args.disablemusic,
|
||||
args.sprite, args.ow_palettes, args.uw_palettes, args.reduce_flashing, args.shuffle_sfx,
|
||||
args.shuffle_songinstruments, args.msu_resume)
|
||||
args.shuffle_sfxinstruments, args.shuffle_songinstruments, args.msu_resume)
|
||||
|
||||
output_path.cached_path = args.outputpath
|
||||
rom.write_to_file(output_path('%s.sfc' % outfilebase))
|
||||
@@ -68,7 +68,7 @@ def patch(args):
|
||||
|
||||
apply_rom_settings(rom, args.heartbeep, args.heartcolor, args.quickswap, args.fastmenu, args.disablemusic,
|
||||
args.sprite, args.ow_palettes, args.uw_palettes, args.reduce_flashing, args.shuffle_sfx,
|
||||
args.shuffle_songinstruments, args.msu_resume)
|
||||
args.shuffle_sfxinstruments, args.shuffle_songinstruments, args.msu_resume)
|
||||
|
||||
output_path.cached_path = args.outputpath
|
||||
rom.write_to_file(output_path('%s.sfc' % outfile_base))
|
||||
|
||||
@@ -1,5 +1,11 @@
|
||||
# Changelog
|
||||
|
||||
## 0.3.4.2
|
||||
- Added Shuffle SFX Instruments as post-gen option
|
||||
- Fixed some issues with Swapped ER failing to place Old Man Cave
|
||||
- Changed Inverted 2.0 spawn prompt to display Bomb Shop
|
||||
- Fixed some minor issues with ER and Vanilla GT
|
||||
|
||||
## 0.3.4.1
|
||||
- Implemented new District ER mode option
|
||||
- Added alternate boss logic when in GT Ice Basement
|
||||
|
||||
5
CLI.py
5
CLI.py
@@ -143,8 +143,8 @@ def parse_cli(argv, no_defaults=False):
|
||||
'shufflebosses', 'shuffleenemies', 'enemy_health', 'enemy_damage', 'shufflepots',
|
||||
'ow_palettes', 'uw_palettes', 'sprite', 'disablemusic', 'quickswap', 'fastmenu', 'heartcolor',
|
||||
'heartbeep', 'remote_items', 'shopsanity', 'dropshuffle', 'pottery', 'keydropshuffle',
|
||||
'mixed_travel', 'standardize_palettes', 'code', 'reduce_flashing', 'shuffle_sfx', 'shuffle_songinstruments',
|
||||
'msu_resume', 'collection_rate', 'colorizepots', 'decoupledoors', 'door_type_mode',
|
||||
'mixed_travel', 'standardize_palettes', 'code', 'reduce_flashing', 'shuffle_sfx', 'shuffle_sfxinstruments',
|
||||
'shuffle_songinstruments', 'msu_resume', 'collection_rate', 'colorizepots', 'decoupledoors', 'door_type_mode',
|
||||
'bonk_drops', 'trap_door_mode', 'key_logic_algorithm', 'door_self_loops', 'aga_randomness']:
|
||||
value = getattr(defaults, name) if getattr(playerargs, name) is None else getattr(playerargs, name)
|
||||
if player == 1:
|
||||
@@ -262,6 +262,7 @@ def parse_settings():
|
||||
"uw_palettes": "default",
|
||||
"reduce_flashing": False,
|
||||
"shuffle_sfx": False,
|
||||
"shuffle_sfxinstruments": False,
|
||||
"shuffle_songinstruments": False,
|
||||
"msu_resume": False,
|
||||
"collection_rate": False,
|
||||
|
||||
3
Main.py
3
Main.py
@@ -338,7 +338,8 @@ def main(args, seed=None, fish=None):
|
||||
apply_rom_settings(rom, args.heartbeep[player], args.heartcolor[player], args.quickswap[player],
|
||||
args.fastmenu[player], args.disablemusic[player], args.sprite[player],
|
||||
args.ow_palettes[player], args.uw_palettes[player], args.reduce_flashing[player],
|
||||
args.shuffle_sfx[player], args.shuffle_songinstruments[player], args.msu_resume[player])
|
||||
args.shuffle_sfx[player], args.shuffle_sfxinstruments[player], args.shuffle_songinstruments[player],
|
||||
args.msu_resume[player])
|
||||
|
||||
if args.jsonout:
|
||||
jsonout[f'patch_t{team}_p{player}'] = rom.patches
|
||||
|
||||
@@ -8,7 +8,7 @@ from OWEdges import OWTileRegions, OWEdgeGroups, OWEdgeGroupsTerrain, OWExitType
|
||||
from OverworldGlitchRules import create_owg_connections
|
||||
from Utils import bidict
|
||||
|
||||
version_number = '0.3.4.1'
|
||||
version_number = '0.3.4.2'
|
||||
# branch indicator is intentionally different across branches
|
||||
version_branch = ''
|
||||
|
||||
|
||||
29
Rom.py
29
Rom.py
@@ -32,7 +32,7 @@ from EntranceShuffle import door_addresses, exit_ids, ow_prize_table
|
||||
from OverworldShuffle import default_flute_connections, flute_data
|
||||
from InitialSram import InitialSram
|
||||
|
||||
from source.classes.SFX import randomize_sfx, randomize_songinstruments
|
||||
from source.classes.SFX import randomize_sfx, randomize_sfxinstruments, randomize_songinstruments
|
||||
from source.item.FillUtil import valid_pot_items
|
||||
from source.dungeon.RoomList import Room0127
|
||||
|
||||
@@ -1830,7 +1830,8 @@ def hud_format_text(text):
|
||||
|
||||
|
||||
def apply_rom_settings(rom, beep, color, quickswap, fastmenu, disable_music, sprite,
|
||||
ow_palettes, uw_palettes, reduce_flashing, shuffle_sfx, shuffle_songinstruments, msu_resume):
|
||||
ow_palettes, uw_palettes, reduce_flashing, shuffle_sfx,
|
||||
shuffle_sfxinstruments, shuffle_songinstruments, msu_resume):
|
||||
|
||||
if not os.path.exists("data/sprites/official/001.link.1.zspr") and rom.orig_buffer:
|
||||
dump_zspr(rom.orig_buffer[0x80000:0x87000], rom.orig_buffer[0xdd308:0xdd380],
|
||||
@@ -1936,6 +1937,8 @@ def apply_rom_settings(rom, beep, color, quickswap, fastmenu, disable_music, spr
|
||||
|
||||
if shuffle_sfx:
|
||||
randomize_sfx(rom)
|
||||
if shuffle_sfxinstruments:
|
||||
randomize_sfxinstruments(rom)
|
||||
if shuffle_songinstruments:
|
||||
randomize_songinstruments(rom)
|
||||
|
||||
@@ -2193,9 +2196,9 @@ def write_strings(rom, world, player, team):
|
||||
# Now we write inconvenient locations for most shuffles and finish taking care of the less chaotic ones.
|
||||
if world.shuffle[player] not in ['lite', 'lean']:
|
||||
entrances_to_hint.update(InconvenientOtherEntrances)
|
||||
if world.shuffle[player] in ['vanilla', 'dungeonssimple', 'dungeonsfull', 'lite', 'lean', 'district']:
|
||||
if world.shuffle[player] in ['vanilla', 'dungeonssimple', 'dungeonsfull', 'district', 'swapped']:
|
||||
hint_count = 0
|
||||
elif world.shuffle[player] in ['simple', 'restricted']:
|
||||
elif world.shuffle[player] in ['simple', 'restricted', 'lite', 'lean']:
|
||||
hint_count = 2
|
||||
else:
|
||||
hint_count = 4
|
||||
@@ -2247,14 +2250,14 @@ def write_strings(rom, world, player, team):
|
||||
hint_count = 4 if world.shuffle[player] not in ['vanilla', 'dungeonssimple', 'dungeonsfull', 'district', 'swapped'] else 0
|
||||
hint_count -= 2 if world.shuffle[player] not in ['simple', 'restricted'] else 0
|
||||
for entrance in all_entrances:
|
||||
if entrance.name in entrances_to_hint:
|
||||
if hint_count > 0:
|
||||
if hint_count > 0:
|
||||
if entrance.name in entrances_to_hint:
|
||||
this_hint = entrances_to_hint[entrance.name] + ' leads to ' + hint_text(entrance.connected_region) + '.'
|
||||
tt[hint_locations.pop(0)] = this_hint
|
||||
entrances_to_hint.pop(entrance.name)
|
||||
hint_count -= 1
|
||||
else:
|
||||
break
|
||||
else:
|
||||
break
|
||||
|
||||
# Next we write a few hints for specific inconvenient locations. We don't make many because in entrance this is highly unpredictable.
|
||||
locations_to_hint = InconvenientLocations.copy()
|
||||
@@ -2542,9 +2545,15 @@ def write_strings(rom, world, player, team):
|
||||
rom.write_byte(0x04a52e, 0x06) # follower set to blind maiden
|
||||
|
||||
# inverted spawn menu changes
|
||||
lh_text = "House"
|
||||
if world.is_tile_swapped(0x2c, player):
|
||||
lh_text = "Bomb Shop"
|
||||
sanc_text = "Sanctuary"
|
||||
if world.mode[player] == 'inverted':
|
||||
sanc_text = "Dark Chapel"
|
||||
tt['menu_start_2'] = "{MENU}\n{SPEED0}\n≥@'s " + lh_text + "\n " + sanc_text + "\n{CHOICE3}"
|
||||
tt['menu_start_3'] = "{MENU}\n{SPEED0}\n≥@'s " + lh_text + "\n " + sanc_text + "\n Mountain Cave\n{CHOICE2}"
|
||||
if world.mode[player] == 'inverted':
|
||||
tt['menu_start_2'] = "{MENU}\n{SPEED0}\n≥@'s House\n Dark Chapel\n{CHOICE3}"
|
||||
tt['menu_start_3'] = "{MENU}\n{SPEED0}\n≥@'s House\n Dark Chapel\n Mountain Cave\n{CHOICE2}"
|
||||
tt['intro_main'] = CompressedTextMapper.convert(
|
||||
"{INTRO}\n Episode III\n{PAUSE3}\n A Link to\n the Past\n"
|
||||
+ "{PAUSE3}\nInverted\n Randomizer\n{PAUSE3}\nAfter mostly disregarding what happened in the first two games.\n"
|
||||
|
||||
@@ -269,6 +269,9 @@
|
||||
shuffle_sfx:
|
||||
on: 1
|
||||
off: 1
|
||||
shuffle_sfxinstruments:
|
||||
on: 1
|
||||
off: 1
|
||||
shuffle_songinstruments:
|
||||
on: 1
|
||||
off: 1
|
||||
|
||||
@@ -199,6 +199,9 @@ rom:
|
||||
shuffle_sfx:
|
||||
on: 1
|
||||
off: 1
|
||||
shuffle_sfxinstruments:
|
||||
on: 1
|
||||
off: 1
|
||||
shuffle_songinstruments:
|
||||
on: 1
|
||||
off: 1
|
||||
|
||||
@@ -349,6 +349,10 @@
|
||||
"action": "store_true",
|
||||
"type": "bool"
|
||||
},
|
||||
"shuffle_sfxinstruments": {
|
||||
"action": "store_true",
|
||||
"type": "bool"
|
||||
},
|
||||
"shuffle_songinstruments": {
|
||||
"action": "store_true",
|
||||
"type": "bool"
|
||||
|
||||
@@ -429,6 +429,7 @@
|
||||
],
|
||||
"reduce_flashing": [ "Reduce some in-game flashing (default: %(default)s)" ],
|
||||
"shuffle_sfx": [ "Shuffle sounds effects (default: %(default)s)" ],
|
||||
"shuffle_sfxinstruments": [ "Shuffle sound instruments (default: %(default)s)" ],
|
||||
"shuffle_songinstruments": [ "Shuffle song instruments (default: %(default)s)" ],
|
||||
"msu_resume": [ "Enable MSU Resume (default: %(default)s)" ],
|
||||
"create_rom": [ "Create an output rom file. (default: %(default)s)" ],
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
"quickswap": { "type": "checkbox" },
|
||||
"reduce_flashing": {"type": "checkbox" },
|
||||
"shuffle_sfx": {"type": "checkbox" },
|
||||
"shuffle_sfxinstruments": {"type": "checkbox" },
|
||||
"shuffle_songinstruments": {"type": "checkbox" }
|
||||
},
|
||||
"leftAdjustFrame": {
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
"adjust.quickswap": "L/R Quickswapping",
|
||||
"adjust.reduce_flashing": "Reduce Flashing",
|
||||
"adjust.shuffle_sfx": "Shuffle Sound Effects",
|
||||
"adjust.shuffle_sfxinstruments": "Shuffle Sound Instruments",
|
||||
"adjust.shuffle_songinstruments": "Shuffle Song Instruments",
|
||||
"adjust.msu_resume": "MSU Resume",
|
||||
|
||||
@@ -192,6 +193,7 @@
|
||||
"randomizer.gameoptions.quickswap": "L/R Quickswapping",
|
||||
"randomizer.gameoptions.reduce_flashing": "Reduce Flashing",
|
||||
"randomizer.gameoptions.shuffle_sfx": "Shuffle Sound Effects",
|
||||
"randomizer.gameoptions.shuffle_sfxinstruments": "Shuffle Sound Instruments",
|
||||
"randomizer.gameoptions.shuffle_songinstruments": "Shuffle Song Instruments",
|
||||
"randomizer.gameoptions.msu_resume": "MSU Resume",
|
||||
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
"quickswap": { "type": "checkbox" },
|
||||
"reduce_flashing": { "type": "checkbox" },
|
||||
"shuffle_sfx": { "type": "checkbox" },
|
||||
"shuffle_sfxinstruments": { "type": "checkbox" },
|
||||
"shuffle_songinstruments": { "type": "checkbox" }
|
||||
},
|
||||
"leftRomOptionsFrame": {
|
||||
|
||||
@@ -186,6 +186,7 @@ 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])
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -139,6 +139,7 @@ SETTINGSTOPROCESS = {
|
||||
"uwpalettes": "uw_palettes",
|
||||
"reduce_flashing": "reduce_flashing",
|
||||
"shuffle_sfx": "shuffle_sfx",
|
||||
"shuffle_sfxinstruments": "shuffle_sfxinstruments",
|
||||
"shuffle_songinstruments": "shuffle_songinstruments",
|
||||
'msu_resume': 'msu_resume',
|
||||
},
|
||||
|
||||
@@ -107,6 +107,7 @@ 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()
|
||||
@@ -159,6 +160,7 @@ 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"
|
||||
}
|
||||
|
||||
@@ -202,7 +202,7 @@ def bottom_frame(self, parent, args=None):
|
||||
def select_output():
|
||||
from tkinter import filedialog
|
||||
folder_selected = filedialog.askdirectory()
|
||||
if folder_selected is not None:
|
||||
if folder_selected is not None and folder_selected != '':
|
||||
args.outputpath = parent.settings["outputpath"] = folder_selected
|
||||
|
||||
## Output Button
|
||||
@@ -311,6 +311,7 @@ def create_guiargs(parent):
|
||||
"uwpalettes": "uw_palettes",
|
||||
"reduce_flashing": "reduce_flashing",
|
||||
"shuffle_sfx": "shuffle_sfx",
|
||||
"shuffle_sfxinstruments": "shuffle_sfxinstruments",
|
||||
"shuffle_songinstruments": "shuffle_songinstruments"
|
||||
}
|
||||
for adjustarg in adjustargs:
|
||||
|
||||
@@ -225,6 +225,7 @@ def loadadjustargs(gui, settings):
|
||||
"uwpalettes": "adjust.uwpalettes",
|
||||
"reduce_flashing": "adjust.reduce_flashing",
|
||||
"shuffle_sfx": "adjust.shuffle_sfx",
|
||||
"shuffle_sfxinstruments": "adjust.shuffle_sfxinstruments",
|
||||
"shuffle_songinstruments": "adjust.shuffle_songinstruments"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,6 +17,7 @@ class EntrancePool(object):
|
||||
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 = []
|
||||
@@ -71,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 = []
|
||||
@@ -221,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')
|
||||
@@ -1129,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()
|
||||
@@ -1178,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:
|
||||
@@ -1314,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:
|
||||
@@ -1369,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
|
||||
@@ -1407,9 +1421,18 @@ def do_mandatory_connections(avail, entrances, cave_options, must_exit):
|
||||
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!')
|
||||
|
||||
@@ -1427,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:
|
||||
@@ -1451,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:
|
||||
@@ -1482,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)
|
||||
@@ -1604,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:
|
||||
@@ -1629,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:
|
||||
@@ -2447,7 +2470,6 @@ 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 = []
|
||||
|
||||
@@ -221,6 +221,7 @@ 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'
|
||||
|
||||
|
||||
Reference in New Issue
Block a user