Merge branch 'OverworldShuffleDev' into OverworldShuffle

This commit is contained in:
codemann8
2021-07-16 13:01:58 -05:00
20 changed files with 679 additions and 560 deletions

View File

@@ -139,7 +139,7 @@ class World(object):
set_player_attr('treasure_hunt_total', 0) set_player_attr('treasure_hunt_total', 0)
set_player_attr('potshuffle', False) set_player_attr('potshuffle', False)
set_player_attr('pot_contents', None) set_player_attr('pot_contents', None)
set_player_attr('fakeboots', False) set_player_attr('pseudoboots', False)
set_player_attr('shopsanity', False) set_player_attr('shopsanity', False)
set_player_attr('keydropshuffle', False) set_player_attr('keydropshuffle', False)
@@ -2244,7 +2244,7 @@ class Spoiler(object):
outfile.write('Overworld Tile Swap:'.ljust(line_width) + '%s\n' % self.metadata['ow_swap'][player]) outfile.write('Overworld Tile Swap:'.ljust(line_width) + '%s\n' % self.metadata['ow_swap'][player])
if self.metadata['ow_shuffle'][player] != 'vanilla': if self.metadata['ow_shuffle'][player] != 'vanilla':
outfile.write('Keep Similar OW Edges Together:'.ljust(line_width) + '%s\n' % ('Yes' if self.metadata['ow_keepsimilar'][player] else 'No')) outfile.write('Keep Similar OW Edges Together:'.ljust(line_width) + '%s\n' % ('Yes' if self.metadata['ow_keepsimilar'][player] else 'No'))
outfile.write('Flute Shuffle:'.ljust(line_width) + '%s\n' % ('Yes' if self.metadata['ow_fluteshuffle'][player] != 'vanilla' else 'No')) outfile.write('Flute Shuffle:'.ljust(line_width) + '%s\n' % self.metadata['ow_fluteshuffle'][player])
outfile.write('Entrance Shuffle:'.ljust(line_width) + '%s\n' % self.metadata['shuffle'][player]) outfile.write('Entrance Shuffle:'.ljust(line_width) + '%s\n' % self.metadata['shuffle'][player])
outfile.write('Door Shuffle:'.ljust(line_width) + '%s\n' % self.metadata['door_shuffle'][player]) outfile.write('Door Shuffle:'.ljust(line_width) + '%s\n' % self.metadata['door_shuffle'][player])
outfile.write('Intensity:'.ljust(line_width) + '%s\n' % self.metadata['intensity'][player]) outfile.write('Intensity:'.ljust(line_width) + '%s\n' % self.metadata['intensity'][player])

View File

@@ -1,11 +1,18 @@
# Changelog # Changelog
### 0.1.6.7
- Fixed issue with Pyramid Exit exiting to wrong location in ER
- Mountain Entry and West Death Mountain are now Swapped independently (Old Man rescue is always in your starting world)
- Fixed issue with AT/GT access logic
- Improved spoiler log playthru accuracy
- ~~Merged DR v0.4.0.11 - Various DR changes~~
### 0.1.6.6 ### 0.1.6.6
- ~~Merged DR v0.4.0.9 - P/C Indicator / Credits fix / CLI Hints Fix~~ - ~~Merged DR v0.4.0.9 - P/C Indicator / Credits fix / CLI Hints Fix~~
### 0.1.6.5 ### 0.1.6.5
- Reduced chance of diagonal flute spot in Balanced - Reduced chance of diagonal flute spot in Balanced
- ~~Merged DR v0.4.0.8 - Boss Indicator / Fake Boots / Quickswap Update / Credits Updates~~ - ~~Merged DR v0.4.0.8 - Boss Indicator / Psuedo Boots / Quickswap Update / Credits Updates~~
### 0.1.6.4 ### 0.1.6.4
- Fixed Frogsmith and Stumpy and restored progression in these locations - Fixed Frogsmith and Stumpy and restored progression in these locations

4
CLI.py
View File

@@ -98,7 +98,7 @@ def parse_cli(argv, no_defaults=False):
'shuffle', 'door_shuffle', 'intensity', 'crystals_ganon', 'crystals_gt', 'openpyramid', 'shuffle', 'door_shuffle', 'intensity', 'crystals_ganon', 'crystals_gt', 'openpyramid',
'mapshuffle', 'compassshuffle', 'keyshuffle', 'bigkeyshuffle', 'startinventory', 'mapshuffle', 'compassshuffle', 'keyshuffle', 'bigkeyshuffle', 'startinventory',
'triforce_pool_min', 'triforce_pool_max', 'triforce_goal_min', 'triforce_goal_max', 'triforce_pool_min', 'triforce_pool_max', 'triforce_goal_min', 'triforce_goal_max',
'triforce_min_difference', 'triforce_goal', 'triforce_pool', 'shufflelinks', 'fakeboots', 'triforce_min_difference', 'triforce_goal', 'triforce_pool', 'shufflelinks', 'pseudoboots',
'retro', 'accessibility', 'hints', 'beemizer', 'experimental', 'dungeon_counters', 'retro', 'accessibility', 'hints', 'beemizer', 'experimental', 'dungeon_counters',
'shufflebosses', 'shuffleenemies', 'enemy_health', 'enemy_damage', 'shufflepots', 'shufflebosses', 'shuffleenemies', 'enemy_health', 'enemy_damage', 'shufflepots',
'ow_palettes', 'uw_palettes', 'sprite', 'disablemusic', 'quickswap', 'fastmenu', 'heartcolor', 'heartbeep', 'ow_palettes', 'uw_palettes', 'sprite', 'disablemusic', 'quickswap', 'fastmenu', 'heartcolor', 'heartbeep',
@@ -149,7 +149,7 @@ def parse_settings():
"ow_fluteshuffle": "vanilla", "ow_fluteshuffle": "vanilla",
"shuffle": "vanilla", "shuffle": "vanilla",
"shufflelinks": False, "shufflelinks": False,
"fakeboots": False, "pseudoboots": False,
"shufflepots": False, "shufflepots": False,
"shuffleenemies": "none", "shuffleenemies": "none",

View File

@@ -100,7 +100,7 @@ def link_doors_main(world, player):
analyze_portals(world, player) analyze_portals(world, player)
for portal in world.dungeon_portals[player]: for portal in world.dungeon_portals[player]:
connect_portal(portal, world, player) connect_portal(portal, world, player)
if not world.doorShuffle[player] == 'vanilla':
fix_big_key_doors_with_ugly_smalls(world, player) fix_big_key_doors_with_ugly_smalls(world, player)
if world.doorShuffle[player] == 'vanilla': if world.doorShuffle[player] == 'vanilla':
for entrance, ext in open_edges: for entrance, ext in open_edges:
@@ -1678,7 +1678,7 @@ def change_door_to_small_key(d, world, player):
def smooth_door_pairs(world, player): def smooth_door_pairs(world, player):
all_doors = [x for x in world.doors if x.player == player] all_doors = [x for x in world.doors if x.player == player]
skip = set() skip = set()
bd_candidates, dashable_counts, bombable_counts = defaultdict(list), defaultdict(int), defaultdict(int) bd_candidates = defaultdict(list)
for door in all_doors: for door in all_doors:
if door.type in [DoorType.Normal, DoorType.Interior] and door not in skip and not door.entranceFlag: if door.type in [DoorType.Normal, DoorType.Interior] and door not in skip and not door.entranceFlag:
partner = door.dest partner = door.dest
@@ -1704,30 +1704,19 @@ def smooth_door_pairs(world, player):
remove_pair(door, world, player) remove_pair(door, world, player)
if type_b == DoorKind.SmallKey: if type_b == DoorKind.SmallKey:
remove_pair(door, world, player) remove_pair(door, world, player)
elif type_a in [DoorKind.Bombable, DoorKind.Dashable] or type_b in [DoorKind.Bombable, DoorKind.Dashable]:
if valid_pair:
new_type = type_a
if type_a != type_b:
new_type = DoorKind.Dashable if type_a == DoorKind.Dashable or type_b == DoorKind.Dashable else DoorKind.Bombable
if type_a != new_type:
room_a.change(door.doorListPos, new_type)
if type_b != new_type:
room_b.change(partner.doorListPos, new_type)
add_pair(door, partner, world, player)
spoiler_type = 'Bomb Door' if new_type == DoorKind.Bombable else 'Dash Door'
world.spoiler.set_door_type(door.name + ' <-> ' + partner.name, spoiler_type, player)
counter = bombable_counts if new_type == DoorKind.Bombable else dashable_counts
counter[door.entrance.parent_region.dungeon] += 1
else: else:
if valid_pair:
bd_candidates[door.entrance.parent_region.dungeon].append(door)
elif type_a in [DoorKind.Bombable, DoorKind.Dashable] or type_b in [DoorKind.Bombable, DoorKind.Dashable]:
if type_a in [DoorKind.Bombable, DoorKind.Dashable]: if type_a in [DoorKind.Bombable, DoorKind.Dashable]:
room_a.change(door.doorListPos, DoorKind.Normal) room_a.change(door.doorListPos, DoorKind.Normal)
remove_pair(door, world, player) remove_pair(door, world, player)
elif type_b in [DoorKind.Bombable, DoorKind.Dashable]: else:
room_b.change(partner.doorListPos, DoorKind.Normal) room_b.change(partner.doorListPos, DoorKind.Normal)
remove_pair(partner, world, player) remove_pair(partner, world, player)
elif valid_pair and type_a != DoorKind.SmallKey and type_b != DoorKind.SmallKey: elif valid_pair and type_a != DoorKind.SmallKey and type_b != DoorKind.SmallKey:
bd_candidates[door.entrance.parent_region.dungeon].append(door) bd_candidates[door.entrance.parent_region.dungeon].append(door)
shuffle_bombable_dashable(bd_candidates, bombable_counts, dashable_counts, world, player) shuffle_bombable_dashable(bd_candidates, world, player)
world.paired_doors[player] = [x for x in world.paired_doors[player] if x.pair or x.original] world.paired_doors[player] = [x for x in world.paired_doors[player] if x.pair or x.original]
@@ -1764,15 +1753,15 @@ def stateful_door(door, kind):
return False return False
def shuffle_bombable_dashable(bd_candidates, bombable_counts, dashable_counts, world, player): def shuffle_bombable_dashable(bd_candidates, world, player):
if world.doorShuffle[player] == 'basic': if world.doorShuffle[player] == 'basic':
for dungeon, candidates in bd_candidates.items(): for dungeon, candidates in bd_candidates.items():
diff = bomb_dash_counts[dungeon.name][1] - dashable_counts[dungeon] diff = bomb_dash_counts[dungeon.name][1]
if diff > 0: if diff > 0:
for chosen in random.sample(candidates, min(diff, len(candidates))): for chosen in random.sample(candidates, min(diff, len(candidates))):
change_pair_type(chosen, DoorKind.Dashable, world, player) change_pair_type(chosen, DoorKind.Dashable, world, player)
candidates.remove(chosen) candidates.remove(chosen)
diff = bomb_dash_counts[dungeon.name][0] - bombable_counts[dungeon] diff = bomb_dash_counts[dungeon.name][0]
if diff > 0: if diff > 0:
for chosen in random.sample(candidates, min(diff, len(candidates))): for chosen in random.sample(candidates, min(diff, len(candidates))):
change_pair_type(chosen, DoorKind.Bombable, world, player) change_pair_type(chosen, DoorKind.Bombable, world, player)
@@ -1781,14 +1770,10 @@ def shuffle_bombable_dashable(bd_candidates, bombable_counts, dashable_counts, w
remove_pair_type_if_present(excluded, world, player) remove_pair_type_if_present(excluded, world, player)
elif world.doorShuffle[player] == 'crossed': elif world.doorShuffle[player] == 'crossed':
all_candidates = sum(bd_candidates.values(), []) all_candidates = sum(bd_candidates.values(), [])
all_bomb_counts = sum(bombable_counts.values()) for chosen in random.sample(all_candidates, min(8, len(all_candidates))):
all_dash_counts = sum(dashable_counts.values())
if all_dash_counts < 8:
for chosen in random.sample(all_candidates, min(8 - all_dash_counts, len(all_candidates))):
change_pair_type(chosen, DoorKind.Dashable, world, player) change_pair_type(chosen, DoorKind.Dashable, world, player)
all_candidates.remove(chosen) all_candidates.remove(chosen)
if all_bomb_counts < 12: for chosen in random.sample(all_candidates, min(12, len(all_candidates))):
for chosen in random.sample(all_candidates, min(12 - all_bomb_counts, len(all_candidates))):
change_pair_type(chosen, DoorKind.Bombable, world, player) change_pair_type(chosen, DoorKind.Bombable, world, player)
all_candidates.remove(chosen) all_candidates.remove(chosen)
for excluded in all_candidates: for excluded in all_candidates:

View File

@@ -28,45 +28,46 @@ def link_entrances(world, player):
connect_custom(world, player) connect_custom(world, player)
# if we do not shuffle, set default connections # if we do not shuffle, set default connections
if world.shuffle[player] == 'vanilla': if world.shuffle[player] in ['vanilla', 'dungeonssimple', 'dungeonsfull']:
for exitname, regionname in default_connections: for exitname, regionname in default_connections:
connect_simple(world, exitname, regionname, player) connect_simple(world, exitname, regionname, player)
if world.shuffle[player] == 'vanilla':
for exitname, regionname in default_dungeon_connections: for exitname, regionname in default_dungeon_connections:
connect_simple(world, exitname, regionname, player) connect_simple(world, exitname, regionname, player)
if not invFlag: if not invFlag:
for exitname, regionname in open_default_connections: for exitname, regionname in open_default_connections:
connect_simple(world, exitname, regionname, player) connect_simple(world, exitname, regionname, player)
if world.shuffle[player] == 'vanilla':
for exitname, regionname in open_default_dungeon_connections: for exitname, regionname in open_default_dungeon_connections:
connect_simple(world, exitname, regionname, player) connect_simple(world, exitname, regionname, player)
else: else:
for exitname, regionname in inverted_default_connections: for exitname, regionname in inverted_default_connections:
connect_simple(world, exitname, regionname, player) connect_simple(world, exitname, regionname, player)
if world.shuffle[player] == 'vanilla':
for exitname, regionname in inverted_default_dungeon_connections: for exitname, regionname in inverted_default_dungeon_connections:
connect_simple(world, exitname, regionname, player) connect_simple(world, exitname, regionname, player)
elif world.shuffle[player] == 'dungeonssimple':
for exitname, regionname in default_connections:
connect_simple(world, exitname, regionname, player)
if not invFlag: # inverted entrance mods
for exitname, regionname in open_default_connections: for owid in swapped_connections.keys():
connect_simple(world, exitname, regionname, player) if (world.mode[player] == 'inverted') != (owid in world.owswaps[player][0] and world.owSwap[player] == 'mixed'):
else: for (entrancename, exitname) in swapped_connections[owid]:
for exitname, regionname in inverted_default_connections: try:
connect_simple(world, exitname, regionname, player) connect_two_way(world, entrancename, exitname, player)
except RuntimeError:
connect_entrance(world, entrancename, exitname, player)
if (world.mode[player] == 'inverted') != (0x03 in world.owswaps[player][0] and world.owSwap[player] == 'mixed') and \
(world.mode[player] == 'inverted') == (0x0a in world.owswaps[player][0] and world.owSwap[player] == 'mixed'):
connect_entrance(world, 'Death Mountain Return Cave (West)', 'Dark Death Mountain Healer Fairy', player)
elif (world.mode[player] == 'inverted') != (0x0a in world.owswaps[player][0] and world.owSwap[player] == 'mixed') and \
(world.mode[player] == 'inverted') == (0x03 in world.owswaps[player][0] and world.owSwap[player] == 'mixed'):
connect_two_way(world, 'Bumper Cave (Top)', 'Death Mountain Return Cave Exit (West)', player)
# dungeon entrance shuffle
if world.shuffle[player] == 'dungeonssimple':
simple_shuffle_dungeons(world, player) simple_shuffle_dungeons(world, player)
elif world.shuffle[player] == 'dungeonsfull': elif world.shuffle[player] == 'dungeonsfull':
for exitname, regionname in default_connections:
connect_simple(world, exitname, regionname, player)
if not invFlag:
for exitname, regionname in open_default_connections:
connect_simple(world, exitname, regionname, player)
else:
for exitname, regionname in inverted_default_connections:
connect_simple(world, exitname, regionname, player)
skull_woods_shuffle(world, player) skull_woods_shuffle(world, player)
dungeon_exits = list(Dungeon_Exits) dungeon_exits = list(Dungeon_Exits)
@@ -1549,6 +1550,8 @@ def connect_entrance(world, entrancename, exitname, player):
addresses = door_addresses[entrance.name][0] addresses = door_addresses[entrance.name][0]
entrance.connect(region, addresses, target) entrance.connect(region, addresses, target)
if world.shuffle[player] not in ['vanilla', 'dungeonssimple', 'dungeonsfull']:
world.spoiler.set_entrance(entrance.name, exit.name if exit is not None else region.name, 'entrance', player) world.spoiler.set_entrance(entrance.name, exit.name if exit is not None else region.name, 'entrance', player)
def connect_exit(world, exitname, entrancename, player): def connect_exit(world, exitname, entrancename, player):
@@ -1560,6 +1563,8 @@ def connect_exit(world, exitname, entrancename, player):
exit.connected_region.entrances.remove(exit) exit.connected_region.entrances.remove(exit)
exit.connect(entrance.parent_region, door_addresses[entrance.name][1], exit_ids[exit.name][1]) exit.connect(entrance.parent_region, door_addresses[entrance.name][1], exit_ids[exit.name][1])
if world.shuffle[player] not in ['vanilla', 'dungeonssimple', 'dungeonsfull']:
world.spoiler.set_entrance(entrance.name, exit.name, 'exit', player) world.spoiler.set_entrance(entrance.name, exit.name, 'exit', player)
@@ -1575,6 +1580,8 @@ def connect_two_way(world, entrancename, exitname, player):
entrance.connect(exit.parent_region, door_addresses[entrance.name][0], exit_ids[exit.name][0]) entrance.connect(exit.parent_region, door_addresses[entrance.name][0], exit_ids[exit.name][0])
exit.connect(entrance.parent_region, door_addresses[entrance.name][1], exit_ids[exit.name][1]) exit.connect(entrance.parent_region, door_addresses[entrance.name][1], exit_ids[exit.name][1])
if world.shuffle[player] not in ['vanilla', 'dungeonssimple', 'dungeonsfull']:
world.spoiler.set_entrance(entrance.name, exit.name, 'both', player) world.spoiler.set_entrance(entrance.name, exit.name, 'both', player)
@@ -2866,50 +2873,40 @@ default_connections = [('Waterfall of Wishing', 'Waterfall of Wishing'),
('Hookshot Cave Back Entrance', 'Hookshot Cave'), ('Hookshot Cave Back Entrance', 'Hookshot Cave'),
('Mimic Cave', 'Mimic Cave'), ('Mimic Cave', 'Mimic Cave'),
('Pyramid Exit', 'Pyramid Exit Ledge')
]
swapped_connections = {
0x03: [
('Old Man Cave (East)', 'Death Mountain Return Cave Exit (West)'),
#('Death Mountain Return Cave (East)', 'Death Mountain Return Cave Exit (East)'),
('Dark Death Mountain Fairy', 'Old Man Cave Exit (East)')
],
0x0a: [
('Old Man Cave (West)', 'Bumper Cave Exit (Bottom)'),
('Death Mountain Return Cave (West)', 'Bumper Cave Exit (Top)'),
('Bumper Cave (Bottom)', 'Old Man Cave Exit (West)'),
('Bumper Cave (Top)', 'Dark Death Mountain Healer Fairy')
],
0x1b: [
('Inverted Pyramid Entrance', 'Pyramid Exit')
]
}
open_default_connections = [('Links House', 'Links House'),
('Links House Exit', 'Links House Area'),
('Big Bomb Shop', 'Big Bomb Shop'),
('Pyramid Hole', 'Pyramid'), ('Pyramid Hole', 'Pyramid'),
('Pyramid Entrance', 'Bottom of Pyramid'), ('Pyramid Entrance', 'Bottom of Pyramid')
]
inverted_default_connections = [('Links House', 'Big Bomb Shop'),
('Links House Exit', 'Big Bomb Shop Area'),
('Big Bomb Shop', 'Links House'),
('Inverted Pyramid Hole', 'Pyramid'), ('Inverted Pyramid Hole', 'Pyramid'),
('Inverted Pyramid Entrance', 'Bottom of Pyramid') ('Inverted Pyramid Entrance', 'Bottom of Pyramid')
] ]
open_default_connections = [('Old Man Cave (West)', 'Old Man Cave Ledge'),
('Old Man Cave (East)', 'Old Man Cave'),
('Old Man Cave Exit (West)', 'Mountain Entry Entrance'),
('Old Man Cave Exit (East)', 'West Death Mountain (Bottom)'),
('Death Mountain Return Cave (East)', 'Death Mountain Return Cave'),
('Death Mountain Return Cave (West)', 'Death Mountain Return Cave'),
('Death Mountain Return Cave Exit (West)', 'Mountain Entry Ledge'),
('Death Mountain Return Cave Exit (East)', 'West Death Mountain (Bottom)'),
('Bumper Cave (Bottom)', 'Bumper Cave'),
('Bumper Cave (Top)', 'Bumper Cave'),
('Bumper Cave Exit (Top)', 'Bumper Cave Ledge'),
('Bumper Cave Exit (Bottom)', 'Bumper Cave Entrance'),
('Dark Death Mountain Fairy', 'Dark Death Mountain Healer Fairy'),
('Links House', 'Links House'),
('Links House Exit', 'Links House Area'),
('Big Bomb Shop', 'Big Bomb Shop'),
('Pyramid Exit', 'Pyramid Exit Ledge')]
inverted_default_connections = [('Old Man Cave (West)', 'Bumper Cave'),
('Old Man Cave (East)', 'Death Mountain Return Cave'),
('Old Man Cave Exit (West)', 'Bumper Cave Entrance'),
('Old Man Cave Exit (East)', 'West Dark Death Mountain (Bottom)'),
('Death Mountain Return Cave (West)', 'Bumper Cave'),
('Death Mountain Return Cave (East)', 'Death Mountain Return Cave'),
('Death Mountain Return Cave Exit (West)', 'West Death Mountain (Bottom)'),
('Death Mountain Return Cave Exit (East)', 'West Death Mountain (Bottom)'),
('Bumper Cave (Bottom)', 'Old Man Cave Ledge'),
('Bumper Cave (Top)', 'Dark Death Mountain Healer Fairy'),
('Bumper Cave Exit (Top)', 'Mountain Entry Ledge'),
('Bumper Cave Exit (Bottom)', 'Mountain Entry Entrance'),
('Dark Death Mountain Fairy', 'Old Man Cave'),
('Links House', 'Big Bomb Shop'),
('Links House Exit', 'Big Bomb Shop Area'),
('Big Bomb Shop', 'Links House'),
('Pyramid Exit', 'Hyrule Castle Ledge')]
# non shuffled dungeons # non shuffled dungeons
default_dungeon_connections = [('Desert Palace Entrance (South)', 'Desert South Portal'), default_dungeon_connections = [('Desert Palace Entrance (South)', 'Desert South Portal'),
('Desert Palace Entrance (West)', 'Desert West Portal'), ('Desert Palace Entrance (West)', 'Desert West Portal'),

View File

@@ -28,7 +28,7 @@ from Fill import sell_potions, sell_keys, balance_multiworld_progression, balanc
from ItemList import generate_itempool, difficulties, fill_prizes, customize_shops from ItemList import generate_itempool, difficulties, fill_prizes, customize_shops
from Utils import output_path, parse_player_names from Utils import output_path, parse_player_names
__version__ = '0.4.0.9-u' __version__ = '0.4.0.11u'
class EnemizerError(RuntimeError): class EnemizerError(RuntimeError):
@@ -93,7 +93,7 @@ def main(args, seed=None, fish=None):
world.treasure_hunt_count = args.triforce_goal.copy() world.treasure_hunt_count = args.triforce_goal.copy()
world.treasure_hunt_total = args.triforce_pool.copy() world.treasure_hunt_total = args.triforce_pool.copy()
world.shufflelinks = args.shufflelinks.copy() world.shufflelinks = args.shufflelinks.copy()
world.fakeboots = args.fakeboots.copy() world.pseudoboots = args.pseudoboots.copy()
world.rom_seeds = {player: random.randint(0, 999999999) for player in range(1, world.players + 1)} world.rom_seeds = {player: random.randint(0, 999999999) for player in range(1, world.players + 1)}
@@ -399,6 +399,8 @@ def copy_world(world):
ret.keydropshuffle = world.keydropshuffle.copy() ret.keydropshuffle = world.keydropshuffle.copy()
ret.mixed_travel = world.mixed_travel.copy() ret.mixed_travel = world.mixed_travel.copy()
ret.standardize_palettes = world.standardize_palettes.copy() ret.standardize_palettes = world.standardize_palettes.copy()
ret.owswaps = world.owswaps.copy()
ret.owflutespots = world.owflutespots.copy()
for player in range(1, world.players + 1): for player in range(1, world.players + 1):
create_regions(ret, player) create_regions(ret, player)

View File

@@ -150,7 +150,7 @@ def roll_settings(weights):
ret.dungeon_counters = 'pickup' if ret.door_shuffle != 'vanilla' or ret.compassshuffle == 'on' else 'off' ret.dungeon_counters = 'pickup' if ret.door_shuffle != 'vanilla' or ret.compassshuffle == 'on' else 'off'
ret.shufflelinks = get_choice('shufflelinks') == 'on' ret.shufflelinks = get_choice('shufflelinks') == 'on'
ret.fakeboots = get_choice('fakeboots') == 'on' ret.pseudoboots = get_choice('pseudoboots') == 'on'
ret.shopsanity = get_choice('shopsanity') == 'on' ret.shopsanity = get_choice('shopsanity') == 'on'
ret.keydropshuffle = get_choice('keydropshuffle') == 'on' ret.keydropshuffle = get_choice('keydropshuffle') == 'on'
ret.mixed_travel = get_choice('mixed_travel') if 'mixed_travel' in weights else 'prevent' ret.mixed_travel = get_choice('mixed_travel') if 'mixed_travel' in weights else 'prevent'

View File

@@ -437,6 +437,16 @@ OWEdgeGroups = {
['Octoballoon NE'] ['Octoballoon NE']
] ]
), ),
# (Op, LW, Vt, Ld, NP, 1): (
# [
# ['Master Sword Meadow SC'],
# ['Zoras Domain SW']
# ],
# [
# ['Lost Woods NW'],
# ['Zora Waterfall NE']
# ]
# ),
(Op, LW, Hz, Ld, PL, 2): ( (Op, LW, Hz, Ld, PL, 2): (
[ [
['Kakariko Fortune EN', 'Kakariko Fortune ES'], ['Kakariko Fortune EN', 'Kakariko Fortune ES'],
@@ -493,6 +503,14 @@ OWEdgeGroups = {
['Statues WC'] ['Statues WC']
] ]
), ),
# (Op, LW, Hz, Wr, NP, 1): (
# [
# ['Hobo EC']
# ],
# [
# ['Stone Bridge WC']
# ]
# ),
(Op, LW, Vt, Wr, PL, 1): ( (Op, LW, Vt, Wr, PL, 1): (
[ [
['Tree Line SC'], ['Tree Line SC'],
@@ -669,61 +687,20 @@ OWEdgeGroups = {
) )
} }
OWTileGroups = { OWTileRegions = {
("Woods", "Regular"): ( 0x00: [
[
0x00, 0x2d, 0x40, 0x6d, 0x80
],
[
'Master Sword Meadow',
'Lost Woods West Area', 'Lost Woods West Area',
'Lost Woods East Area', 'Lost Woods East Area'
'Stone Bridge Area',
'Stone Bridge Water',
'Hobo Bridge'
], ],
[ 0x02: [
'Skull Woods Forest',
'Skull Woods Portal Entry',
'Skull Woods Forest (West)',
'Skull Woods Forgotten Path (Southwest)',
'Skull Woods Forgotten Path (Northeast)',
'Hammer Bridge North Area',
'Hammer Bridge South Area',
'Hammer Bridge Water'
]
),
("Lumberjack", "Regular"): (
[
0x02, 0x42
],
[
'Lumberjack Area' 'Lumberjack Area'
], ],
[ 0x03: [
'Dark Lumberjack Area'
]
),
("West Mountain", "Regular"): (
[
0x03, 0x43
],
[
'West Death Mountain (Top)', 'West Death Mountain (Top)',
'Spectacle Rock Ledge', 'Spectacle Rock Ledge',
'West Death Mountain (Bottom)' 'West Death Mountain (Bottom)'
], ],
[ 0x05: [
'West Dark Death Mountain (Top)',
'GT Approach',
'West Dark Death Mountain (Bottom)'
]
),
("East Mountain", "Regular"): (
[
0x05, 0x45
],
[
'Death Mountain Floating Island', 'Death Mountain Floating Island',
'East Death Mountain (Top West)', 'East Death Mountain (Top West)',
'East Death Mountain (Top East)', 'East Death Mountain (Top East)',
@@ -734,144 +711,64 @@ OWTileGroups = {
'East Death Mountain (Bottom Left)', 'East Death Mountain (Bottom Left)',
'East Death Mountain (Bottom)' 'East Death Mountain (Bottom)'
], ],
[ 0x07: [
'East Dark Death Mountain (Top)',
'East Dark Death Mountain (Bottom Left)',
'East Dark Death Mountain (Bottom)'
]
),
("East Mountain", "Entrance"): (
[
0x07, 0x47
],
[
'Death Mountain TR Pegs', 'Death Mountain TR Pegs',
'Death Mountain TR Pegs Ledge' 'Death Mountain TR Pegs Ledge'
], ],
[ 0x0a: [
'Turtle Rock Area',
'Turtle Rock Ledge'
]
),
("Lake", "Regular"): (
[
0x0f, 0x35, 0x4f, 0x75, 0x81
],
[
'Zora Waterfall Area',
'Zora Waterfall Water',
'Waterfall of Wishing Cave',
'Zoras Domain',
'Lake Hylia Area',
'Lake Hylia South Shore',
'Lake Hylia Northeast Bank',
'Lake Hylia Central Island',
'Lake Hylia Island',
'Lake Hylia Water'
],
[
'Catfish Area',
'Ice Lake Area',
'Ice Lake Northeast Bank',
'Ice Lake Ledge (West)',
'Ice Lake Ledge (East)',
'Ice Lake Water',
'Ice Lake Moat',
'Ice Palace Area'
]
),
("West Mountain", "Entrance"): (
[
0x0a, 0x4a
],
[
'Mountain Entry Area', 'Mountain Entry Area',
'Mountain Entry Entrance', 'Mountain Entry Entrance',
'Mountain Entry Ledge' 'Mountain Entry Ledge'
], ],
[ 0x0f: [
'Bumper Cave Area', 'Zora Waterfall Area',
'Bumper Cave Entrance', 'Zora Waterfall Water',
'Bumper Cave Ledge' 'Waterfall of Wishing Cave'
]
),
("Woods Pass", "Regular"): (
[
0x10, 0x50
], ],
[ 0x10: [
'Lost Woods Pass West Area', 'Lost Woods Pass West Area',
'Lost Woods Pass East Top Area', 'Lost Woods Pass East Top Area',
'Lost Woods Pass East Bottom Area' 'Lost Woods Pass East Bottom Area'
], ],
[ 0x11: [
'Skull Woods Pass West Area',
'Skull Woods Pass East Top Area',
'Skull Woods Pass East Bottom Area'
]
),
("Fortune", "Regular"): (
[
0x11, 0x51
],
[
'Kakariko Fortune Area' 'Kakariko Fortune Area'
], ],
[ 0x12: [
'Dark Fortune Area' 'Kakariko Pond Area'
]
),
("Whirlpools", "Regular"): (
[
0x12, 0x15, 0x33, 0x3f, 0x52, 0x55, 0x73, 0x7f
], ],
[ 0x13: [
'Kakariko Pond Area',
'River Bend Area',
'River Bend East Bank',
'River Bend Water',
'C Whirlpool Area',
'C Whirlpool Water',
'C Whirlpool Outer Area',
'Octoballoon Area',
'Octoballoon Water',
'Octoballoon Water Ledge'
],
[
'Outcast Pond Area',
'Qirn Jump Area',
'Qirn Jump East Bank',
'Qirn Jump Water',
'Dark C Whirlpool Area',
'Dark C Whirlpool Water',
'Dark C Whirlpool Outer Area',
'Bomber Corner Area',
'Bomber Corner Water',
'Bomber Corner Water Ledge'
]
),
("Castle", "Entrance"): (
[
0x13, 0x14, 0x53, 0x54
],
[
'Sanctuary Area', 'Sanctuary Area',
'Bonk Rock Ledge', 'Bonk Rock Ledge'
],
0x14: [
'Graveyard Area', 'Graveyard Area',
'Graveyard Ledge', 'Graveyard Ledge',
'Kings Grave Area' 'Kings Grave Area'
], ],
[ 0x15: [
'Dark Chapel Area', 'River Bend Area',
'Dark Graveyard Area' 'River Bend East Bank',
] 'River Bend Water'
),
("Castle", "Regular"): (
[
0x1a, 0x1b, 0x5a, 0x5b
], ],
[ 0x16: [
'Forgotten Forest Area', 'Potion Shop Area',
'Potion Shop Northeast',
'Potion Shop Water'
],
0x17: [
'Zora Approach Area',
'Zora Approach Ledge',
'Zora Approach Water'
],
0x18: [
'Kakariko Area',
'Kakariko Southwest',
'Kakariko Grass Yard'
],
0x1a: [
'Forgotten Forest Area'
],
0x1b: [
'Hyrule Castle Area', 'Hyrule Castle Area',
'Hyrule Castle Southwest', 'Hyrule Castle Southwest',
'Hyrule Castle Courtyard', 'Hyrule Castle Courtyard',
@@ -879,191 +776,51 @@ OWTileGroups = {
'Hyrule Castle Ledge', 'Hyrule Castle Ledge',
'Hyrule Castle East Entry' 'Hyrule Castle East Entry'
], ],
[ 0x1d: [
'Shield Shop Area',
'Shield Shop Fence',
'Pyramid Area',
'Pyramid Exit Ledge',
'Pyramid Pass'
]
),
("Witch", "Regular"): (
[
0x16, 0x56
],
[
'Potion Shop Area',
'Potion Shop Northeast',
'Potion Shop Water'
],
[
'Dark Witch Area',
'Dark Witch Northeast',
'Dark Witch Water'
]
),
("Water Approach", "Regular"): (
[
0x17, 0x57
],
[
'Zora Approach Area',
'Zora Approach Ledge',
'Zora Approach Water'
],
[
'Catfish Approach Area',
'Catfish Approach Ledge',
'Catfish Approach Water'
]
),
("Village", "Regular"): (
[
0x18, 0x58
],
[
'Kakariko Area',
'Kakariko Southwest',
'Kakariko Grass Yard'
],
[
'Village of Outcasts Area',
'Dark Grassy Lawn'
]
),
("Wooden Bridge", "Regular"): (
[
0x1d, 0x5d
],
[
'Wooden Bridge Area', 'Wooden Bridge Area',
'Wooden Bridge Northeast', 'Wooden Bridge Northeast',
'Wooden Bridge Water' 'Wooden Bridge Water'
], ],
[ 0x1e: [
'Broken Bridge Area',
'Broken Bridge Northeast',
'Broken Bridge West',
'Broken Bridge Water'
]
),
("Eastern", "Regular"): (
[
0x1e, 0x5e
],
[
'Eastern Palace Area' 'Eastern Palace Area'
], ],
[ 0x22: [
'Palace of Darkness Area'
]
),
("Blacksmith", "Regular"): (
[
0x22, 0x62
],
[
'Blacksmith Area', 'Blacksmith Area',
'Bat Cave Ledge' 'Bat Cave Ledge'
], ],
[ 0x25: [
'Hammer Pegs Area',
'Hammer Pegs Entry'
]
),
("Dunes", "Regular"): (
[
0x25, 0x65
],
[
'Sand Dunes Area' 'Sand Dunes Area'
], ],
[ 0x28: [
'Dark Dunes Area'
]
),
("Game", "Regular"): (
[
0x28, 0x29, 0x68, 0x69
],
[
'Maze Race Area', 'Maze Race Area',
'Maze Race Ledge', 'Maze Race Ledge',
'Maze Race Prize', 'Maze Race Prize'
],
0x29: [
'Kakariko Suburb Area' 'Kakariko Suburb Area'
], ],
[ 0x2a: [
'Dig Game Area',
'Dig Game Ledge',
'Frog Area',
'Frog Prison',
'Archery Game Area'
]
),
("Grove", "Regular"): (
[
0x2a, 0x6a
],
[
'Flute Boy Area', 'Flute Boy Area',
'Flute Boy Pass' 'Flute Boy Pass'
], ],
[ 0x2b: [
'Stumpy Area',
'Stumpy Pass'
]
),
("Central Bonk Rocks", "Regular"): (
[
0x2b, 0x6b
],
[
'Central Bonk Rocks Area' 'Central Bonk Rocks Area'
], ],
[ 0x2c: [
'Dark Bonk Rocks Area' 'Links House Area'
]
),
# ("Links", "Regular"): (
# [
# 0x2c, 0x6c
# ],
# [
# 'Links House Area'
# ],
# [
# 'Big Bomb Shop Area'
# ]
# ),
("Tree Line", "Regular"): (
[
0x2e, 0x6e
], ],
[ 0x2d: [
'Stone Bridge Area',
'Stone Bridge Water'
],
0x2e: [
'Tree Line Area', 'Tree Line Area',
'Tree Line Water' 'Tree Line Water'
], ],
[ 0x2f: [
'Dark Tree Line Area',
'Dark Tree Line Water'
]
),
("Nook", "Regular"): (
[
0x2f, 0x6f
],
[
'Eastern Nook Area' 'Eastern Nook Area'
], ],
[ 0x30: [
'Palace of Darkness Nook Area'
]
),
("Desert", "Regular"): (
[
0x30, 0x3a, 0x70, 0x7a
],
[
'Desert Area', 'Desert Area',
'Desert Ledge', 'Desert Ledge',
'Desert Palace Entrance (North) Spot', 'Desert Palace Entrance (North) Spot',
@@ -1071,75 +828,472 @@ OWTileGroups = {
'Desert Palace Stairs', 'Desert Palace Stairs',
'Desert Palace Mouth', 'Desert Palace Mouth',
'Desert Palace Teleporter Ledge', 'Desert Palace Teleporter Ledge',
'Bombos Tablet Ledge', 'Bombos Tablet Ledge'
'Desert Pass Area',
'Desert Pass Southeast',
'Desert Pass Ledge'
], ],
[ 0x32: [
'Misery Mire Area',
'Misery Mire Teleporter Ledge',
'Swamp Nook Area'
]
),
("Grove Approach", "Regular"): (
[
0x32, 0x72
],
[
'Flute Boy Approach Area', 'Flute Boy Approach Area',
'Flute Boy Bush Entry', 'Flute Boy Bush Entry',
'Cave 45 Ledge' 'Cave 45 Ledge'
], ],
[ 0x33: [
'C Whirlpool Area',
'C Whirlpool Water',
'C Whirlpool Outer Area'
],
0x34: [
'Statues Area',
'Statues Water'
],
0x35: [
'Lake Hylia Area',
'Lake Hylia South Shore',
'Lake Hylia Northeast Bank',
'Lake Hylia Central Island',
'Lake Hylia Island',
'Lake Hylia Water'
],
0x37: [
'Ice Cave Area'
],
0x3a: [
'Desert Pass Area',
'Desert Pass Southeast',
'Desert Pass Ledge'
],
0x3b: [
'Dam Area'
],
0x3c: [
'South Pass Area'
],
0x3f: [
'Octoballoon Area',
'Octoballoon Water',
'Octoballoon Water Ledge'
],
0x40: [
'Skull Woods Forest',
'Skull Woods Portal Entry',
'Skull Woods Forest (West)',
'Skull Woods Forgotten Path (Southwest)',
'Skull Woods Forgotten Path (Northeast)'
],
0x42: [
'Dark Lumberjack Area'
],
0x43: [
'West Dark Death Mountain (Top)',
'GT Approach',
'West Dark Death Mountain (Bottom)'
],
0x45: [
'East Dark Death Mountain (Top)',
'East Dark Death Mountain (Bottom Left)',
'East Dark Death Mountain (Bottom)'
],
0x47: [
'Turtle Rock Area',
'Turtle Rock Ledge'
],
0x4a: [
'Bumper Cave Area',
'Bumper Cave Entrance',
'Bumper Cave Ledge'
],
0x4f: [
'Catfish Area'
],
0x50: [
'Skull Woods Pass West Area',
'Skull Woods Pass East Top Area',
'Skull Woods Pass East Bottom Area'
],
0x51: [
'Dark Fortune Area'
],
0x52: [
'Outcast Pond Area'
],
0x53: [
'Dark Chapel Area'
],
0x54: [
'Dark Graveyard Area'
],
0x55: [
'Qirn Jump Area',
'Qirn Jump East Bank',
'Qirn Jump Water'
],
0x56: [
'Dark Witch Area',
'Dark Witch Northeast',
'Dark Witch Water'
],
0x57: [
'Catfish Approach Area',
'Catfish Approach Ledge',
'Catfish Approach Water'
],
0x58: [
'Village of Outcasts Area',
'Dark Grassy Lawn'
],
0x5a: [
'Shield Shop Area',
'Shield Shop Fence'
],
0x5b: [
'Pyramid Area',
'Pyramid Exit Ledge',
'Pyramid Pass'
],
0x5d: [
'Broken Bridge Area',
'Broken Bridge Northeast',
'Broken Bridge West',
'Broken Bridge Water'
],
0x5e: [
'Palace of Darkness Area'
],
0x62: [
'Hammer Pegs Area',
'Hammer Pegs Entry'
],
0x65: [
'Dark Dunes Area'
],
0x68: [
'Dig Game Area',
'Dig Game Ledge'
],
0x69: [
'Frog Area',
'Frog Prison',
'Archery Game Area'
],
0x6a: [
'Stumpy Area',
'Stumpy Pass'
],
0x6b: [
'Dark Bonk Rocks Area'
],
0x6c: [
'Big Bomb Shop Area'
],
0x6d: [
'Hammer Bridge North Area',
'Hammer Bridge South Area',
'Hammer Bridge Water'
],
0x6e: [
'Dark Tree Line Area',
'Dark Tree Line Water'
],
0x6f: [
'Palace of Darkness Nook Area'
],
0x70: [
'Misery Mire Area',
'Misery Mire Teleporter Ledge'
],
0x72: [
'Stumpy Approach Area', 'Stumpy Approach Area',
'Stumpy Approach Bush Entry' 'Stumpy Approach Bush Entry'
],
0x73: [
'Dark C Whirlpool Area',
'Dark C Whirlpool Water',
'Dark C Whirlpool Outer Area'
],
0x74: [
'Hype Cave Area',
'Hype Cave Water'
],
0x75: [
'Ice Lake Area',
'Ice Lake Northeast Bank',
'Ice Lake Ledge (West)',
'Ice Lake Ledge (East)',
'Ice Lake Water',
'Ice Lake Moat',
'Ice Palace Area'
],
0x77: [
'Shopping Mall Area'
],
0x7a: [
'Swamp Nook Area'
],
0x7b: [
'Swamp Area'
],
0x7c: [
'Dark South Pass Area'
],
0x7f: [
'Bomber Corner Area',
'Bomber Corner Water',
'Bomber Corner Water Ledge'
],
0x80: [
'Master Sword Meadow',
'Hobo Bridge'
],
0x81: [
'Zoras Domain'
]
}
OWTileGroups = {
("Woods", "Regular"): (
[
0x00, 0x2d, 0x80
],
[
0x40, 0x6d
]
),
("Lumberjack", "Regular"): (
[
0x02
],
[
0x42
]
),
("West Mountain", "Regular"): (
[
0x03
],
[
0x43
]
),
("East Mountain", "Regular"): (
[
0x05
],
[
0x45
]
),
("East Mountain", "Entrance"): (
[
0x07,
],
[
0x47
]
),
("Lake", "Regular"): (
[
0x0f, 0x35, 0x81
],
[
0x4f, 0x75
]
),
("Mountain Entry", "Regular"): (
[
0x0a
],
[
0x4a
]
),
("Woods Pass", "Regular"): (
[
0x10
],
[
0x50
]
),
("Fortune", "Regular"): (
[
0x11
],
[
0x51
]
),
("Whirlpools", "Regular"): (
[
0x12, 0x15, 0x33, 0x3f
],
[
0x52, 0x55, 0x73, 0x7f
]
),
("Castle", "Entrance"): (
[
0x13, 0x14
],
[
0x53, 0x54
]
),
("Castle", "Regular"): (
[
0x1a, 0x1b
],
[
0x5a, 0x5b
]
),
("Witch", "Regular"): (
[
0x16
],
[
0x56
]
),
("Water Approach", "Regular"): (
[
0x17
],
[
0x57
]
),
("Village", "Regular"): (
[
0x18
],
[
0x58
]
),
("Wooden Bridge", "Regular"): (
[
0x1d
],
[
0x5d
]
),
("Eastern", "Regular"): (
[
0x1e
],
[
0x5e
]
),
("Blacksmith", "Regular"): (
[
0x22
],
[
0x62
]
),
("Dunes", "Regular"): (
[
0x25
],
[
0x65
]
),
("Game", "Regular"): (
[
0x28, 0x29
],
[
0x68, 0x69
]
),
("Grove", "Regular"): (
[
0x2a
],
[
0x6a
]
),
("Central Bonk Rocks", "Regular"): (
[
0x2b
],
[
0x6b
]
),
# ("Links", "Regular"): (
# [
# 0x2c
# ],
# [
# 0x6c
# ]
# ),
("Tree Line", "Regular"): (
[
0x2e
],
[
0x6e
]
),
("Nook", "Regular"): (
[
0x2f
],
[
0x6f
]
),
("Desert", "Regular"): (
[
0x30, 0x3a
],
[
0x70, 0x7a
]
),
("Grove Approach", "Regular"): (
[
0x32
],
[
0x72
] ]
), ),
("Hype", "Regular"): ( ("Hype", "Regular"): (
[ [
0x34, 0x74 0x34
], ],
[ [
'Statues Area', 0x74
'Statues Water'
],
[
'Hype Cave Area',
'Hype Cave Water'
] ]
), ),
("Shopping Mall", "Regular"): ( ("Shopping Mall", "Regular"): (
[ [
0x37, 0x77 0x37
], ],
[ [
'Ice Cave Area' 0x77
],
[
'Shopping Mall Area'
] ]
), ),
("Swamp", "Regular"): ( ("Swamp", "Regular"): (
[ [
0x3b, 0x7b 0x3b
], ],
[ [
'Dam Area' 0x7b
],
[
'Swamp Area'
] ]
), ),
("South Pass", "Regular"): ( ("South Pass", "Regular"): (
[ [
0x3c, 0x7c 0x3c
], ],
[ [
'South Pass Area' 0x7c
],
[
'Dark South Pass Area'
] ]
) )
} }

View File

@@ -1,12 +1,12 @@
import random, logging, copy import random, logging, copy
from BaseClasses import OWEdge, WorldType, RegionType, Direction, Terrain, PolSlot from BaseClasses import OWEdge, WorldType, RegionType, Direction, Terrain, PolSlot
from OWEdges import OWTileGroups, OWEdgeGroups, OpenStd, parallel_links, IsParallel from OWEdges import OWTileRegions, OWTileGroups, OWEdgeGroups, OpenStd, parallel_links, IsParallel
try: try:
from sortedcontainers import SortedList from sortedcontainers import SortedList
except ImportError: except ImportError:
raise Exception('Could not load sortedcontainers module') raise Exception('Could not load sortedcontainers module')
__version__ = '0.1.6.6-u' __version__ = '0.1.6.7-u'
def link_overworld(world, player): def link_overworld(world, player):
# setup mandatory connections # setup mandatory connections
@@ -28,18 +28,24 @@ def link_overworld(world, player):
for (name, groupType) in OWTileGroups.keys(): for (name, groupType) in OWTileGroups.keys():
if world.mode[player] != 'standard' or name not in ['Castle', 'Links', 'Central Bonk Rocks']: if world.mode[player] != 'standard' or name not in ['Castle', 'Links', 'Central Bonk Rocks']:
(owids, lw_regions, dw_regions) = OWTileGroups[(name, groupType,)] (lw_owids, dw_owids) = OWTileGroups[(name, groupType,)]
if world.shuffle[player] in ['vanilla', 'simple', 'dungeonssimple']: if world.shuffle[player] in ['vanilla', 'simple', 'dungeonssimple']:
(exist_owids, exist_lw_regions, exist_dw_regions) = tile_groups[(name,)] (exist_owids, exist_lw_regions, exist_dw_regions) = tile_groups[(name,)]
exist_owids.extend(owids) exist_owids.extend(lw_owids)
exist_lw_regions.extend(lw_regions) exist_owids.extend(dw_owids)
exist_dw_regions.extend(dw_regions) for owid in lw_owids:
exist_lw_regions.extend(OWTileRegions[owid])
for owid in dw_owids:
exist_dw_regions.extend(OWTileRegions[owid])
tile_groups[(name,)] = (exist_owids, exist_lw_regions, exist_dw_regions) tile_groups[(name,)] = (exist_owids, exist_lw_regions, exist_dw_regions)
else: else:
(exist_owids, exist_lw_regions, exist_dw_regions) = tile_groups[(name, groupType)] (exist_owids, exist_lw_regions, exist_dw_regions) = tile_groups[(name, groupType)]
exist_owids.extend(owids) exist_owids.extend(lw_owids)
exist_lw_regions.extend(lw_regions) exist_owids.extend(dw_owids)
exist_dw_regions.extend(dw_regions) for owid in lw_owids:
exist_lw_regions.extend(OWTileRegions[owid])
for owid in dw_owids:
exist_dw_regions.extend(OWTileRegions[owid])
tile_groups[(name, groupType)] = (exist_owids, exist_lw_regions, exist_dw_regions) tile_groups[(name, groupType)] = (exist_owids, exist_lw_regions, exist_dw_regions)
#tile shuffle happens here, the groups that remain in the list are the tiles that get swapped #tile shuffle happens here, the groups that remain in the list are the tiles that get swapped
@@ -1086,12 +1092,14 @@ parallelsimilar_connections = [('Maze Race ES', 'Kakariko Suburb WS'),
] ]
# non shuffled overworld # non shuffled overworld
default_connections = [('Lost Woods SW', 'Lost Woods Pass NW'), default_connections = [#('Lost Woods NW', 'Master Sword Meadow SC'),
('Lost Woods SW', 'Lost Woods Pass NW'),
('Lost Woods SC', 'Lost Woods Pass NE'), ('Lost Woods SC', 'Lost Woods Pass NE'),
('Lost Woods SE', 'Kakariko Fortune NE'), ('Lost Woods SE', 'Kakariko Fortune NE'),
('Lost Woods EN', 'Lumberjack WN'), ('Lost Woods EN', 'Lumberjack WN'),
('Lumberjack SW', 'Mountain Entry NW'), ('Lumberjack SW', 'Mountain Entry NW'),
('Mountain Entry SE', 'Kakariko Pond NE'), ('Mountain Entry SE', 'Kakariko Pond NE'),
#('Zora Waterfall NE', 'Zoras Domain SW'),
('Lost Woods Pass SW', 'Kakariko NW'), ('Lost Woods Pass SW', 'Kakariko NW'),
('Lost Woods Pass SE', 'Kakariko NC'), ('Lost Woods Pass SE', 'Kakariko NC'),
('Kakariko Fortune SC', 'Kakariko NE'), ('Kakariko Fortune SC', 'Kakariko NE'),
@@ -1140,6 +1148,7 @@ default_connections = [('Lost Woods SW', 'Lost Woods Pass NW'),
('Stone Bridge SC', 'Lake Hylia NW'), ('Stone Bridge SC', 'Lake Hylia NW'),
('Stone Bridge EN', 'Tree Line WN'), ('Stone Bridge EN', 'Tree Line WN'),
('Stone Bridge EC', 'Tree Line WC'), ('Stone Bridge EC', 'Tree Line WC'),
#('Stone Bridge WC', 'Hobo EC'),
('Tree Line SC', 'Lake Hylia NC'), ('Tree Line SC', 'Lake Hylia NC'),
('Tree Line SE', 'Lake Hylia NE'), ('Tree Line SE', 'Lake Hylia NE'),
('Desert EC', 'Desert Pass WC'), ('Desert EC', 'Desert Pass WC'),

View File

@@ -12,8 +12,22 @@ Links house can now be shuffled in different ER settings. It will be limited to
Thanks to qadan, cheuer, & compiling Thanks to qadan, cheuer, & compiling
## Pseudo Boots
Thanks to Bonta. You can now start with pseudo boots that let you move fast, but have no other logical uses (bonking open things, hovering, etc)
## Pendant/Crystal Indicator
For accessibility, you now get a C or P indicator to the left of the magic bar on the HUD when instead a Crystal or Pendant. Requires ownership of the map of that dungeon for display. Thanks to kan.
# Bug Fixes and Notes. # Bug Fixes and Notes.
* 0.4.0.11
* Some minor base rom fixes
* Improved distribution of bombable/dashable doors
* 0.4.0.10
* Renamed to pseudoboots
* Some release note updates
* 0.4.0.9 * 0.4.0.9
* Fixes for stats and P/C indicator (thanks Kara) * Fixes for stats and P/C indicator (thanks Kara)
* Swamp lobby fixes (thanks Catobat) * Swamp lobby fixes (thanks Catobat)
@@ -38,7 +52,7 @@ Thanks to qadan, cheuer, & compiling
* Chest turn tracking (not yet in credits) * Chest turn tracking (not yet in credits)
* Damaged and magic stats in credits (gt bk removed) * Damaged and magic stats in credits (gt bk removed)
* Fix for infinite bombs * Fix for infinite bombs
* Fake boots option * Pseudo boots option
* Always allowed medallions for swordless (no option yet) * Always allowed medallions for swordless (no option yet)
* 0.4.0.7 * 0.4.0.7
* Reduce flashing option added * Reduce flashing option added

63
Rom.py
View File

@@ -31,7 +31,7 @@ from OverworldShuffle import default_flute_connections, flute_data
JAP10HASH = '03a63945398191337e896e5771f77173' JAP10HASH = '03a63945398191337e896e5771f77173'
RANDOMIZERBASEHASH = '1dc1961e57d4e588a262fa706de6c753' RANDOMIZERBASEHASH = '487a04cf965bb89636f9b1621dd606d1'
class JsonRom(object): class JsonRom(object):
@@ -1248,7 +1248,7 @@ def patch_rom(world, rom, player, team, enemized, is_mystery=False):
rom.write_byte(0x18017E, 0x01) # Fairy fountains only trade in bottles rom.write_byte(0x18017E, 0x01) # Fairy fountains only trade in bottles
# Starting equipment # Starting equipment
if world.fakeboots[player]: if world.pseudoboots[player]:
rom.write_byte(0x18008E, 0x01) rom.write_byte(0x18008E, 0x01)
equip = [0] * (0x340 + 0x4F) equip = [0] * (0x340 + 0x4F)
@@ -2417,7 +2417,7 @@ def set_inverted_mode(world, player, rom, inverted_buffer):
rom.write_byte(snes_to_pc(0x02B34D), 0xF0) rom.write_byte(snes_to_pc(0x02B34D), 0xF0)
rom.write_byte(snes_to_pc(0x06DB78), 0x8B) # dark-style portal rom.write_byte(snes_to_pc(0x06DB78), 0x8B) # dark-style portal
rom.write_byte(snes_to_pc(0x0DB3C5), 0xC6) #vortex rom.write_byte(snes_to_pc(0x0DB3C5), 0xC6) # vortex
rom.write_byte(snes_to_pc(0x07A3F4), 0xF0) # duck rom.write_byte(snes_to_pc(0x07A3F4), 0xF0) # duck
rom.write_byte(snes_to_pc(0x08D40C), 0xD0) # morph poof rom.write_byte(snes_to_pc(0x08D40C), 0xD0) # morph poof
@@ -2448,7 +2448,6 @@ def set_inverted_mode(world, player, rom, inverted_buffer):
if world.doorShuffle[player] == 'vanilla' or world.intensity[player] < 3: if world.doorShuffle[player] == 'vanilla' or world.intensity[player] < 3:
write_int16(rom, 0x15AEE + 2*0x38, 0x00E0) write_int16(rom, 0x15AEE + 2*0x38, 0x00E0)
write_int16(rom, 0x15AEE + 2*0x25, 0x000C) write_int16(rom, 0x15AEE + 2*0x25, 0x000C)
if (world.mode[player] == 'inverted') != (0x03 in world.owswaps[player][0] and world.owSwap[player] == 'mixed'): if (world.mode[player] == 'inverted') != (0x03 in world.owswaps[player][0] and world.owSwap[player] == 'mixed'):
if world.shuffle[player] in ['vanilla', 'dungeonsfull', 'dungeonssimple']: if world.shuffle[player] in ['vanilla', 'dungeonsfull', 'dungeonssimple']:
rom.write_bytes(snes_to_pc(0x308350), [0x00, 0x00, 0x01]) # mountain cave starts on OW rom.write_bytes(snes_to_pc(0x308350), [0x00, 0x00, 0x01]) # mountain cave starts on OW
@@ -2472,28 +2471,6 @@ def set_inverted_mode(world, player, rom, inverted_buffer):
rom.write_byte(snes_to_pc(0x02D9B8), 0x12) rom.write_byte(snes_to_pc(0x02D9B8), 0x12)
rom.write_bytes(0x180247, [0x00, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00]) #indicates the overworld door being used for the single entrance spawn point rom.write_bytes(0x180247, [0x00, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00]) #indicates the overworld door being used for the single entrance spawn point
rom.write_byte(0xDBB73 + 0x6F, 0x07) # DDM fairy entrance to old man fetch east UW
write_int16(rom, 0x15AEE + 2*0x18, 0x00F1) # old man fetch UW to DDM fairy entrance
rom.write_byte(0x15B8C + 0x18, 0x43)
write_int16(rom, 0x15BDB + 2 * 0x18, 0x1400)
write_int16(rom, 0x15C79 + 2 * 0x18, 0x0294)
write_int16(rom, 0x15D17 + 2 * 0x18, 0x0600)
write_int16(rom, 0x15DB5 + 2 * 0x18, 0x02E8)
write_int16(rom, 0x15E53 + 2 * 0x18, 0x0678)
write_int16(rom, 0x15EF1 + 2 * 0x18, 0x0303)
write_int16(rom, 0x15F8F + 2 * 0x18, 0x0685)
rom.write_byte(0x1602D + 0x18, 0x0A)
rom.write_byte(0x1607C + 0x18, 0xF6)
write_int16(rom, 0x160CB + 2 * 0x18, 0x0000)
write_int16(rom, 0x16169 + 2 * 0x18, 0x0000)
rom.write_byte(0xDBB73 + 0x06, 0x2E) # old man fetch east entrance to DMD west UW
write_int16(rom, 0x15AEE + 2*0x08, 0x00E6) # DMD west UW to old man fetch east entrance
if (world.mode[player] == 'inverted') != (0x0A in world.owswaps[player][0] and world.owSwap[player] == 'mixed'):
rom.write_byte(0xDBB73 + 0x16, 0x5E) # bumper cave top entrance to DDM Fairy UW
else:
rom.write_byte(0xDBB73 + 0x2D, 0x5E) # DMD west entrance to DDM Fairy
if (world.mode[player] == 'inverted') != (0x05 in world.owswaps[player][0] and world.owSwap[player] == 'mixed'): if (world.mode[player] == 'inverted') != (0x05 in world.owswaps[player][0] and world.owSwap[player] == 'mixed'):
rom.write_bytes(snes_to_pc(0x1BC655), [0x4A, 0x1D, 0x82]) # add warp under rock rom.write_bytes(snes_to_pc(0x1BC655), [0x4A, 0x1D, 0x82]) # add warp under rock
if (world.mode[player] == 'inverted') != (0x07 in world.owswaps[player][0] and world.owSwap[player] == 'mixed'): if (world.mode[player] == 'inverted') != (0x07 in world.owswaps[player][0] and world.owSwap[player] == 'mixed'):
@@ -2503,17 +2480,6 @@ def set_inverted_mode(world, player, rom, inverted_buffer):
rom.write_bytes(0x0086E, [0x5C, 0x00, 0xA0, 0xA1]) # TR tail rom.write_bytes(0x0086E, [0x5C, 0x00, 0xA0, 0xA1]) # TR tail
if world.shuffle[player] in ['vanilla']: if world.shuffle[player] in ['vanilla']:
world.fix_trock_doors[player] = True world.fix_trock_doors[player] = True
if (world.mode[player] == 'inverted') != (0x0A in world.owswaps[player][0] and world.owSwap[player] == 'mixed'):
if world.shuffle[player] in ['vanilla', 'dungeonssimple', 'dungeonsfull']:
rom.write_byte(0xDBB73 + 0x15, 0x06) # bumper cave bottom entrance to old man fetch west UW
write_int16(rom, 0x15AEE + 2*0x17, 0x00F0) # old man fetch west UW to bumper cave bottom entrance
rom.write_byte(0xDBB73 + 0x05, 0x16) # old man fetch west entrance to bumper cave bottom UW
write_int16(rom, 0x15AEE + 2*0x07, 0x00FB) # bumper cave bottom UW to old man fetch west entrance
rom.write_byte(0xDBB73 + 0x2D, 0x17) # DMD west entrance to bumper cave top UW
write_int16(rom, 0x15AEE + 2*0x2F, 0x00EB) # bumper cave top UW to DMD west entrance
if (world.mode[player] == 'inverted') == (0x03 in world.owswaps[player][0] and world.owSwap[player] == 'mixed'):
rom.write_byte(0xDBB73 + 0x16, 0x2E) # bumper cave top entrance to DMD west UW
write_int16(rom, 0x15AEE + 2*0x18, 0x00E6) # DMD west UW to bumper cave top entrance
if (world.mode[player] == 'inverted') != (0x10 in world.owswaps[player][0] and world.owSwap[player] == 'mixed'): if (world.mode[player] == 'inverted') != (0x10 in world.owswaps[player][0] and world.owSwap[player] == 'mixed'):
rom.write_bytes(snes_to_pc(0x1BC67A), [0x2E, 0x0B, 0x82]) # add warp under rock rom.write_bytes(snes_to_pc(0x1BC67A), [0x2E, 0x0B, 0x82]) # add warp under rock
if (world.mode[player] == 'inverted') != (0x1B in world.owswaps[player][0] and world.owSwap[player] == 'mixed'): if (world.mode[player] == 'inverted') != (0x1B in world.owswaps[player][0] and world.owSwap[player] == 'mixed'):
@@ -2569,7 +2535,7 @@ def set_inverted_mode(world, player, rom, inverted_buffer):
write_int16s(rom, snes_to_pc(0x1BB810), [0x00BE, 0x00C0, 0x013E]) # update pyramid hole entrance write_int16s(rom, snes_to_pc(0x1BB810), [0x00BE, 0x00C0, 0x013E]) # update pyramid hole entrance
write_int16s(rom, snes_to_pc(0x1BB836), [0x001B, 0x001B, 0x001B]) write_int16s(rom, snes_to_pc(0x1BB836), [0x001B, 0x001B, 0x001B])
write_int16(rom, snes_to_pc(0x308300), 0x0140) #add extra pyramid hole write_int16(rom, snes_to_pc(0x308300), 0x0140) # add extra pyramid hole
write_int16(rom, snes_to_pc(0x308320), 0x001B) write_int16(rom, snes_to_pc(0x308320), 0x001B)
if world.shuffle[player] in ['vanilla', 'dungeonssimple', 'dungeonsfull']: if world.shuffle[player] in ['vanilla', 'dungeonssimple', 'dungeonsfull']:
rom.write_byte(snes_to_pc(0x308340), 0x7B) rom.write_byte(snes_to_pc(0x308340), 0x7B)
@@ -2604,28 +2570,11 @@ def set_inverted_mode(world, player, rom, inverted_buffer):
write_int16(rom, 0xDB96F + 2 * 0x35, 0x001B) # move pyramid exit door write_int16(rom, 0xDB96F + 2 * 0x35, 0x001B) # move pyramid exit door
write_int16(rom, 0xDBA71 + 2 * 0x35, 0x011C) write_int16(rom, 0xDBA71 + 2 * 0x35, 0x011C)
if world.shuffle[player] in ['vanilla', 'dungeonssimple', 'dungeonsfull']:
rom.write_byte(0xDBB73 + 0x35, 0x36)
if world.shuffle[player] in ['vanilla', 'dungeonssimple', 'dungeonsfull']:
write_int16(rom, 0x15AEE + 2 * 0x37, 0x0010) # pyramid exit to new hc area
rom.write_byte(0x15B8C + 0x37, 0x1B)
write_int16(rom, 0x15BDB + 2 * 0x37, 0x000E)
write_int16(rom, 0x15C79 + 2 * 0x37, 0x0600)
write_int16(rom, 0x15D17 + 2 * 0x37, 0x0676)
write_int16(rom, 0x15DB5 + 2 * 0x37, 0x0604)
write_int16(rom, 0x15E53 + 2 * 0x37, 0x06E8)
write_int16(rom, 0x15EF1 + 2 * 0x37, 0x066D)
write_int16(rom, 0x15F8F + 2 * 0x37, 0x06F3)
rom.write_byte(0x1602D + 0x37, 0x00)
rom.write_byte(0x1607C + 0x37, 0x0A)
write_int16(rom, 0x160CB + 2 * 0x37, 0x0000)
write_int16(rom, 0x16169 + 2 * 0x37, 0x811c)
if (world.mode[player] == 'inverted') != (0x29 in world.owswaps[player][0] and world.owSwap[player] == 'mixed'): if (world.mode[player] == 'inverted') != (0x29 in world.owswaps[player][0] and world.owSwap[player] == 'mixed'):
rom.write_bytes(snes_to_pc(0x06B2AB), [0xF0, 0xE1, 0x05]) #frog pickup on contact rom.write_bytes(snes_to_pc(0x06B2AB), [0xF0, 0xE1, 0x05]) # frog pickup on contact
if (world.mode[player] == 'inverted') != (0x2C in world.owswaps[player][0] and world.owSwap[player] == 'mixed'): if (world.mode[player] == 'inverted') != (0x2C in world.owswaps[player][0] and world.owSwap[player] == 'mixed'):
if world.shuffle[player] in ['vanilla', 'dungeonssimple', 'dungeonsfull']: if world.shuffle[player] in ['vanilla', 'dungeonssimple', 'dungeonsfull']:
rom.write_byte(0x15B8C, 0x6C) #exit links at bomb shop area rom.write_byte(0x15B8C, 0x6C) # exit links at bomb shop area
rom.write_byte(0xDBB73 + 0x00, 0x53) # switch bomb shop and links house rom.write_byte(0xDBB73 + 0x00, 0x53) # switch bomb shop and links house
rom.write_byte(0xDBB73 + 0x52, 0x01) rom.write_byte(0xDBB73 + 0x52, 0x01)
if (world.mode[player] == 'inverted') != (0x2F in world.owswaps[player][0] and world.owSwap[player] == 'mixed'): if (world.mode[player] == 'inverted') != (0x2F in world.owswaps[player][0] and world.owSwap[player] == 'mixed'):

View File

@@ -837,6 +837,13 @@ def default_rules(world, player):
def ow_rules(world, player): def ow_rules(world, player):
if world.mode[player] != 'inverted':
set_rule(world.get_entrance('Agahnims Tower', player), lambda state: state.has('Cape', player) or state.has_beam_sword(player) or state.has('Beat Agahnim 1', player)) # barrier gets removed after killing agahnim, relevant for entrance shuffle
set_rule(world.get_entrance('GT Entry Approach', player), lambda state: state.has_crystals(world.crystals_needed_for_gt[player], player))
set_rule(world.get_entrance('GT Entry Leave', player), lambda state: state.has_crystals(world.crystals_needed_for_gt[player], player) or state.world.shuffle[player] in ('restricted', 'full', 'crossed', 'insanity'))
else:
set_rule(world.get_entrance('Agahnims Tower', player), lambda state: state.has_crystals(world.crystals_needed_for_gt[player], player))
if (world.mode[player] == 'inverted') == (0x00 in world.owswaps[player][0] and world.owSwap[player] == 'mixed'): if (world.mode[player] == 'inverted') == (0x00 in world.owswaps[player][0] and world.owSwap[player] == 'mixed'):
set_rule(world.get_entrance('Lost Woods East Mirror Spot', player), lambda state: state.has_Mirror(player)) set_rule(world.get_entrance('Lost Woods East Mirror Spot', player), lambda state: state.has_Mirror(player))
set_rule(world.get_entrance('Lost Woods Entry Mirror Spot', player), lambda state: state.has_Mirror(player)) set_rule(world.get_entrance('Lost Woods Entry Mirror Spot', player), lambda state: state.has_Mirror(player))
@@ -858,9 +865,6 @@ def ow_rules(world, player):
set_rule(world.get_entrance('Dark Lumberjack Mirror Spot', player), lambda state: state.has_Mirror(player)) set_rule(world.get_entrance('Dark Lumberjack Mirror Spot', player), lambda state: state.has_Mirror(player))
if (world.mode[player] == 'inverted') == (0x03 in world.owswaps[player][0] and world.owSwap[player] == 'mixed'): if (world.mode[player] == 'inverted') == (0x03 in world.owswaps[player][0] and world.owSwap[player] == 'mixed'):
set_rule(world.get_entrance('GT Entry Approach', player), lambda state: state.has_crystals(world.crystals_needed_for_gt[player], player))
set_rule(world.get_entrance('GT Entry Leave', player), lambda state: state.has_crystals(world.crystals_needed_for_gt[player], player) or state.world.shuffle[player] in ('restricted', 'full', 'crossed', 'insanity'))
set_rule(world.get_entrance('West Death Mountain (Top) Mirror Spot', player), lambda state: state.has_Mirror(player)) set_rule(world.get_entrance('West Death Mountain (Top) Mirror Spot', player), lambda state: state.has_Mirror(player))
set_rule(world.get_entrance('Spectacle Rock Mirror Spot', player), lambda state: state.has_Mirror(player)) set_rule(world.get_entrance('Spectacle Rock Mirror Spot', player), lambda state: state.has_Mirror(player))
else: else:
@@ -991,7 +995,6 @@ def ow_rules(world, player):
set_rule(world.get_entrance('Inverted Pyramid Hole', player), lambda state: False) set_rule(world.get_entrance('Inverted Pyramid Hole', player), lambda state: False)
set_rule(world.get_entrance('Inverted Pyramid Entrance', player), lambda state: False) set_rule(world.get_entrance('Inverted Pyramid Entrance', player), lambda state: False)
set_rule(world.get_entrance('Pyramid Hole', player), lambda state: state.has('Beat Agahnim 2', player) or world.open_pyramid[player]) set_rule(world.get_entrance('Pyramid Hole', player), lambda state: state.has('Beat Agahnim 2', player) or world.open_pyramid[player])
set_rule(world.get_entrance('Agahnims Tower', player), lambda state: state.has('Cape', player) or state.has_beam_sword(player) or state.has('Beat Agahnim 1', player)) # barrier gets removed after killing agahnim, relevant for entrance shuffle
set_rule(world.get_entrance('HC Area Mirror Spot', player), lambda state: state.has_Mirror(player)) set_rule(world.get_entrance('HC Area Mirror Spot', player), lambda state: state.has_Mirror(player))
set_rule(world.get_entrance('HC Ledge Mirror Spot', player), lambda state: state.has_Mirror(player)) set_rule(world.get_entrance('HC Ledge Mirror Spot', player), lambda state: state.has_Mirror(player))
@@ -1004,7 +1007,6 @@ def ow_rules(world, player):
set_rule(world.get_entrance('Inverted Pyramid Hole', player), lambda state: state.has('Beat Agahnim 2', player) or world.open_pyramid[player]) set_rule(world.get_entrance('Inverted Pyramid Hole', player), lambda state: state.has('Beat Agahnim 2', player) or world.open_pyramid[player])
add_rule(world.get_entrance('Pyramid Hole', player), lambda state: False) add_rule(world.get_entrance('Pyramid Hole', player), lambda state: False)
set_rule(world.get_entrance('Pyramid Entrance', player), lambda state: False) set_rule(world.get_entrance('Pyramid Entrance', player), lambda state: False)
set_rule(world.get_entrance('Agahnims Tower', player), lambda state: state.has_crystals(world.crystals_needed_for_gt[player], player))
set_rule(world.get_entrance('Pyramid Exit Ledge Drop', player), lambda state: state.has('Hammer', player)) set_rule(world.get_entrance('Pyramid Exit Ledge Drop', player), lambda state: state.has('Hammer', player))
set_rule(world.get_entrance('Pyramid Mirror Spot', player), lambda state: state.has_Mirror(player)) set_rule(world.get_entrance('Pyramid Mirror Spot', player), lambda state: state.has_Mirror(player))

View File

@@ -580,8 +580,8 @@ dw $00bc, $00a2, $00a3, $00c2, $001a, $0049, $0014, $008c
; Ice Many Pots, Swamp Waterfall, GT Gauntlet 3, Eastern Push Block, Eastern Courtyard, Eastern Map Valley ; Ice Many Pots, Swamp Waterfall, GT Gauntlet 3, Eastern Push Block, Eastern Courtyard, Eastern Map Valley
; Eastern Cannonball, HC East Hall ; Eastern Cannonball, HC East Hall
dw $009f, $0066, $005d, $00a8, $00a9, $00aa, $00b9, $0052 dw $009f, $0066, $005d, $00a8, $00a9, $00aa, $00b9, $0052
; HC West Hall, TR Dash Bridge, TR Hub, Pod Arena, GT Petting Zoo ; HC West Hall, TR Dash Bridge, TR Hub, Pod Arena, GT Petting Zoo, Ice Spike Cross
dw $0050, $00c5, $00c6, $0009, $0003, $002a, $007d dw $0050, $00c5, $00c6, $0009, $0003, $002a, $007d, $005e
dw $ffff dw $ffff
; dungeon tables ; dungeon tables

View File

@@ -353,7 +353,7 @@ OWNewDestination:
; turn into bunny ; turn into bunny
lda $5d : cmp #$17 : beq .return lda $5d : cmp #$17 : beq .return
lda #$17 : sta $5d lda #$17 : sta $5d
lda #$01 : sta $2e0 lda #$01 : sta $02e0
bra .return bra .return
.nobunny .nobunny
lda $5d : cmp #$17 : bne .return lda $5d : cmp #$17 : bne .return

Binary file not shown.

View File

@@ -354,7 +354,7 @@
"action": "store_true", "action": "store_true",
"type": "bool" "type": "bool"
}, },
"fakeboots": { "pseudoboots": {
"action": "store_true", "action": "store_true",
"type": "bool" "type": "bool"
}, },

View File

@@ -290,7 +290,7 @@
"Keys are universal, shooting arrows costs rupees,", "Keys are universal, shooting arrows costs rupees,",
"and a few other little things make this more like Zelda-1. (default: %(default)s)" "and a few other little things make this more like Zelda-1. (default: %(default)s)"
], ],
"fakeboots": [ " Players starts with fake boots that allow dashing but no item checks (default: %(default)s"], "pseudoboots": [ " Players starts with pseudo boots that allow dashing but no item checks (default: %(default)s"],
"startinventory": [ "Specifies a list of items that will be in your starting inventory (separated by commas). (default: %(default)s)" ], "startinventory": [ "Specifies a list of items that will be in your starting inventory (separated by commas). (default: %(default)s)" ],
"usestartinventory": [ "Toggle usage of Starting Inventory." ], "usestartinventory": [ "Toggle usage of Starting Inventory." ],
"custom": [ "Not supported." ], "custom": [ "Not supported." ],

View File

@@ -206,7 +206,7 @@
"randomizer.item.hints": "Include Helpful Hints", "randomizer.item.hints": "Include Helpful Hints",
"randomizer.item.retro": "Retro mode (universal keys)", "randomizer.item.retro": "Retro mode (universal keys)",
"randomizer.item.fakeboots": "Start with Fake Boots", "randomizer.item.pseudoboots": "Start with Pseudo Boots",
"randomizer.item.worldstate": "World State", "randomizer.item.worldstate": "World State",
"randomizer.item.worldstate.standard": "Standard", "randomizer.item.worldstate.standard": "Standard",

View File

@@ -5,7 +5,7 @@
"hints": { "hints": {
"type": "checkbox" "type": "checkbox"
}, },
"fakeboots": { "type": "checkbox" } "pseudoboots": { "type": "checkbox" }
}, },
"leftItemFrame": { "leftItemFrame": {
"worldstate": { "worldstate": {

View File

@@ -58,7 +58,7 @@ SETTINGSTOPROCESS = {
"hints": "hints", "hints": "hints",
"retro": "retro", "retro": "retro",
"shopsanity": "shopsanity", "shopsanity": "shopsanity",
"fakeboots": "fakeboots", "pseudoboots": "pseudoboots",
"worldstate": "mode", "worldstate": "mode",
"logiclevel": "logic", "logiclevel": "logic",
"goal": "goal", "goal": "goal",