Shuffle Back of Tavern
This commit is contained in:
@@ -2460,6 +2460,7 @@ class Spoiler(object):
|
|||||||
'goal': self.world.goal,
|
'goal': self.world.goal,
|
||||||
'shuffle': self.world.shuffle,
|
'shuffle': self.world.shuffle,
|
||||||
'shufflelinks': self.world.shufflelinks,
|
'shufflelinks': self.world.shufflelinks,
|
||||||
|
'shuffletavern': self.world.shuffletavern,
|
||||||
'door_shuffle': self.world.doorShuffle,
|
'door_shuffle': self.world.doorShuffle,
|
||||||
'intensity': self.world.intensity,
|
'intensity': self.world.intensity,
|
||||||
'item_pool': self.world.difficulty,
|
'item_pool': self.world.difficulty,
|
||||||
@@ -2541,7 +2542,8 @@ class Spoiler(object):
|
|||||||
outfile.write('Difficulty: %s\n' % self.metadata['item_pool'][player])
|
outfile.write('Difficulty: %s\n' % self.metadata['item_pool'][player])
|
||||||
outfile.write('Item Functionality: %s\n' % self.metadata['item_functionality'][player])
|
outfile.write('Item Functionality: %s\n' % self.metadata['item_functionality'][player])
|
||||||
outfile.write('Entrance Shuffle: %s\n' % self.metadata['shuffle'][player])
|
outfile.write('Entrance Shuffle: %s\n' % self.metadata['shuffle'][player])
|
||||||
outfile.write(f"Link's House Shuffled: {yn(self.metadata['shufflelinks'])}\n")
|
outfile.write(f"Link's House Shuffled: {yn(self.metadata['shufflelinks'][player])}\n")
|
||||||
|
outfile.write(f"Back of Tavern Shuffled: {yn(self.metadata['shuffletavern'][player])}\n")
|
||||||
outfile.write('Door Shuffle: %s\n' % self.metadata['door_shuffle'][player])
|
outfile.write('Door Shuffle: %s\n' % self.metadata['door_shuffle'][player])
|
||||||
outfile.write('Intensity: %s\n' % self.metadata['intensity'][player])
|
outfile.write('Intensity: %s\n' % self.metadata['intensity'][player])
|
||||||
outfile.write(f"Drop Shuffle: {yn(self.metadata['dropshuffle'][player])}\n")
|
outfile.write(f"Drop Shuffle: {yn(self.metadata['dropshuffle'][player])}\n")
|
||||||
@@ -2827,7 +2829,7 @@ class Settings(object):
|
|||||||
|
|
||||||
(0x80 if w.bigkeyshuffle[p] else 0) | (0x40 if w.keyshuffle[p] else 0)
|
(0x80 if w.bigkeyshuffle[p] else 0) | (0x40 if w.keyshuffle[p] else 0)
|
||||||
| (0x20 if w.mapshuffle[p] else 0) | (0x10 if w.compassshuffle[p] else 0)
|
| (0x20 if w.mapshuffle[p] else 0) | (0x10 if w.compassshuffle[p] else 0)
|
||||||
| (enemy_mode[w.enemy_shuffle[p]]),
|
| (0x8 if w.shuffletavern[p] else 0) | (enemy_mode[w.enemy_shuffle[p]]),
|
||||||
|
|
||||||
(e_health[w.enemy_health[p]] << 5) | (e_dmg[w.enemy_damage[p]] << 3) | (0x4 if w.potshuffle[p] else 0)
|
(e_health[w.enemy_health[p]] << 5) | (e_dmg[w.enemy_damage[p]] << 3) | (0x4 if w.potshuffle[p] else 0)
|
||||||
| (0x2 if w.bombbag[p] else 0) | (1 if w.shufflelinks[p] else 0),
|
| (0x2 if w.bombbag[p] else 0) | (1 if w.shufflelinks[p] else 0),
|
||||||
@@ -2885,6 +2887,7 @@ class Settings(object):
|
|||||||
args.mapshuffle[p] = True if settings[7] & 0x20 else False
|
args.mapshuffle[p] = True if settings[7] & 0x20 else False
|
||||||
args.compassshuffle[p] = True if settings[7] & 0x10 else False
|
args.compassshuffle[p] = True if settings[7] & 0x10 else False
|
||||||
# args.shufflebosses[p] = r(boss_mode)[(settings[7] & 0xc) >> 2]
|
# args.shufflebosses[p] = r(boss_mode)[(settings[7] & 0xc) >> 2]
|
||||||
|
args.shuffletavern[p] = True if settings[7] & 0x8 else False
|
||||||
args.shuffleenemies[p] = r(enemy_mode)[settings[7] & 0x3]
|
args.shuffleenemies[p] = r(enemy_mode)[settings[7] & 0x3]
|
||||||
|
|
||||||
args.enemy_health[p] = r(e_health)[(settings[8] & 0xE0) >> 5]
|
args.enemy_health[p] = r(e_health)[(settings[8] & 0xE0) >> 5]
|
||||||
|
|||||||
5
CLI.py
5
CLI.py
@@ -119,8 +119,8 @@ def parse_cli(argv, no_defaults=False):
|
|||||||
'mapshuffle', 'compassshuffle', 'keyshuffle', 'bigkeyshuffle', 'startinventory',
|
'mapshuffle', 'compassshuffle', 'keyshuffle', 'bigkeyshuffle', 'startinventory',
|
||||||
'usestartinventory', 'bombbag', 'overworld_map', 'restrict_boss_items',
|
'usestartinventory', 'bombbag', 'overworld_map', 'restrict_boss_items',
|
||||||
'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', 'pseudoboots',
|
'triforce_min_difference', 'triforce_goal', 'triforce_pool', 'shufflelinks', 'shuffletavern',
|
||||||
'retro', 'accessibility', 'hints', 'beemizer', 'experimental', 'dungeon_counters',
|
'pseudoboots', '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',
|
'ow_palettes', 'uw_palettes', 'sprite', 'disablemusic', 'quickswap', 'fastmenu', 'heartcolor',
|
||||||
'heartbeep', 'remote_items', 'shopsanity', 'dropshuffle', 'pottery', 'keydropshuffle',
|
'heartbeep', 'remote_items', 'shopsanity', 'dropshuffle', 'pottery', 'keydropshuffle',
|
||||||
@@ -170,6 +170,7 @@ def parse_settings():
|
|||||||
"shuffleganon": True,
|
"shuffleganon": True,
|
||||||
"shuffle": "vanilla",
|
"shuffle": "vanilla",
|
||||||
"shufflelinks": False,
|
"shufflelinks": False,
|
||||||
|
"shuffletavern": False,
|
||||||
"overworld_map": "default",
|
"overworld_map": "default",
|
||||||
"pseudoboots": False,
|
"pseudoboots": False,
|
||||||
|
|
||||||
|
|||||||
@@ -91,6 +91,7 @@ While the exact verbage of location names and item names can be found in the sou
|
|||||||
|
|
||||||
Overworld Entrance naming:
|
Overworld Entrance naming:
|
||||||
|
|
||||||
|
Links House: The hero's old residence
|
||||||
Turtle Rock: Turtle Rock Main
|
Turtle Rock: Turtle Rock Main
|
||||||
Misery Mire: Misery Mire
|
Misery Mire: Misery Mire
|
||||||
Ice Palace: Ice Palace
|
Ice Palace: Ice Palace
|
||||||
@@ -141,6 +142,7 @@ Lake Hylia Fairy: A cave NE of Lake Hylia
|
|||||||
Light Hype Fairy: The cave south of your house
|
Light Hype Fairy: The cave south of your house
|
||||||
Desert Fairy: The cave near the desert
|
Desert Fairy: The cave near the desert
|
||||||
Chicken House: The chicken lady's house
|
Chicken House: The chicken lady's house
|
||||||
|
Tavern North: A backdoor
|
||||||
Aginahs Cave: The open desert cave
|
Aginahs Cave: The open desert cave
|
||||||
Sahasrahlas Hut: The house near armos
|
Sahasrahlas Hut: The house near armos
|
||||||
Cave Shop (Lake Hylia): The cave NW Lake Hylia
|
Cave Shop (Lake Hylia): The cave NW Lake Hylia
|
||||||
|
|||||||
@@ -3364,7 +3364,7 @@ door_addresses = {'Links House': (0x00, (0x0104, 0x2c, 0x0506, 0x0a9a, 0x0832, 0
|
|||||||
'Light Hype Fairy': (0x6B, (0x0115, 0x34, 0x00a0, 0x0c04, 0x0900, 0x0c58, 0x0988, 0x0c73, 0x0985, 0x0a, 0xf6, 0x0000, 0x0000)),
|
'Light Hype Fairy': (0x6B, (0x0115, 0x34, 0x00a0, 0x0c04, 0x0900, 0x0c58, 0x0988, 0x0c73, 0x0985, 0x0a, 0xf6, 0x0000, 0x0000)),
|
||||||
'Desert Fairy': (0x71, (0x0115, 0x3a, 0x0000, 0x0e00, 0x0400, 0x0e26, 0x0468, 0x0e6d, 0x0485, 0x00, 0x00, 0x0000, 0x0000)),
|
'Desert Fairy': (0x71, (0x0115, 0x3a, 0x0000, 0x0e00, 0x0400, 0x0e26, 0x0468, 0x0e6d, 0x0485, 0x00, 0x00, 0x0000, 0x0000)),
|
||||||
'Kings Grave': (0x5A, (0x0113, 0x14, 0x0320, 0x0456, 0x0900, 0x04a6, 0x0998, 0x04c3, 0x097d, 0x0a, 0xf6, 0x0000, 0x0000)),
|
'Kings Grave': (0x5A, (0x0113, 0x14, 0x0320, 0x0456, 0x0900, 0x04a6, 0x0998, 0x04c3, 0x097d, 0x0a, 0xf6, 0x0000, 0x0000)),
|
||||||
'Tavern North': (0x42, (0x0103, 0x18, 0x1440, 0x08a7, 0x0206, 0x08f9, 0x0288, 0x0914, 0x0293, 0xf7, 0x09, 0xFFFF, 0x0000)), # do not use, buggy
|
'Tavern North': (0x42, (0x0103, 0x18, 0x1440, 0x08a7, 0x0206, 0x091b, 0x0288, 0x0914, 0x0293, 0xf7, 0x09, 0xFFFF, 0x0000)),
|
||||||
'Chicken House': (0x4A, (0x0108, 0x18, 0x1120, 0x0837, 0x0106, 0x0888, 0x0188, 0x08a4, 0x0193, 0x07, 0xf9, 0x1530, 0x0000)),
|
'Chicken House': (0x4A, (0x0108, 0x18, 0x1120, 0x0837, 0x0106, 0x0888, 0x0188, 0x08a4, 0x0193, 0x07, 0xf9, 0x1530, 0x0000)),
|
||||||
'Aginahs Cave': (0x70, (0x010a, 0x30, 0x0656, 0x0cc6, 0x02aa, 0x0d18, 0x0328, 0x0d33, 0x032f, 0x08, 0xf8, 0x0000, 0x0000)),
|
'Aginahs Cave': (0x70, (0x010a, 0x30, 0x0656, 0x0cc6, 0x02aa, 0x0d18, 0x0328, 0x0d33, 0x032f, 0x08, 0xf8, 0x0000, 0x0000)),
|
||||||
'Sahasrahlas Hut': (0x44, (0x0105, 0x1e, 0x0610, 0x06d4, 0x0c76, 0x0727, 0x0cf0, 0x0743, 0x0cfb, 0x0a, 0xf6, 0x0000, 0x0000)),
|
'Sahasrahlas Hut': (0x44, (0x0105, 0x1e, 0x0610, 0x06d4, 0x0c76, 0x0727, 0x0cf0, 0x0743, 0x0cfb, 0x0a, 0xf6, 0x0000, 0x0000)),
|
||||||
@@ -3653,7 +3653,7 @@ ow_prize_table = {'Links House': (0x8b1, 0xb2d), 'Inverted Big Bomb Shop': (0x8b
|
|||||||
'Light Hype Fairy': (0x940, 0xc80),
|
'Light Hype Fairy': (0x940, 0xc80),
|
||||||
'Desert Fairy': (0x420, 0xe00),
|
'Desert Fairy': (0x420, 0xe00),
|
||||||
'Kings Grave': (0x920, 0x520),
|
'Kings Grave': (0x920, 0x520),
|
||||||
'Tavern North': None, # can't mark this one technically
|
'Tavern North': (0x270, 0x900),
|
||||||
'Chicken House': (0x120, 0x880),
|
'Chicken House': (0x120, 0x880),
|
||||||
'Aginahs Cave': (0x2e0, 0xd00),
|
'Aginahs Cave': (0x2e0, 0xd00),
|
||||||
'Sahasrahlas Hut': (0xcf0, 0x6c0),
|
'Sahasrahlas Hut': (0xcf0, 0x6c0),
|
||||||
|
|||||||
3
Main.py
3
Main.py
@@ -118,6 +118,7 @@ def main(args, seed=None, fish=None):
|
|||||||
world.treasure_hunt_count = {k: int(v) for k, v in args.triforce_goal.items()}
|
world.treasure_hunt_count = {k: int(v) for k, v in args.triforce_goal.items()}
|
||||||
world.treasure_hunt_total = {k: int(v) for k, v in args.triforce_pool.items()}
|
world.treasure_hunt_total = {k: int(v) for k, v in args.triforce_pool.items()}
|
||||||
world.shufflelinks = args.shufflelinks.copy()
|
world.shufflelinks = args.shufflelinks.copy()
|
||||||
|
world.shuffletavern = args.shuffletavern.copy()
|
||||||
world.pseudoboots = args.pseudoboots.copy()
|
world.pseudoboots = args.pseudoboots.copy()
|
||||||
world.overworld_map = args.overworld_map.copy()
|
world.overworld_map = args.overworld_map.copy()
|
||||||
world.restrict_boss_items = args.restrict_boss_items.copy()
|
world.restrict_boss_items = args.restrict_boss_items.copy()
|
||||||
@@ -192,7 +193,7 @@ def main(args, seed=None, fish=None):
|
|||||||
logger.info(world.fish.translate("cli","cli","shuffling.world"))
|
logger.info(world.fish.translate("cli","cli","shuffling.world"))
|
||||||
|
|
||||||
for player in range(1, world.players + 1):
|
for player in range(1, world.players + 1):
|
||||||
if world.experimental[player] or (world.customizer and world.customizer.get_entrances()):
|
if world.experimental[player] or world.shuffle[player] in ['lite', 'lean'] or world.shuffletavern[player] or (world.customizer and world.customizer.get_entrances()):
|
||||||
link_entrances_new(world, player)
|
link_entrances_new(world, player)
|
||||||
else:
|
else:
|
||||||
if world.mode[player] != 'inverted':
|
if world.mode[player] != 'inverted':
|
||||||
|
|||||||
@@ -333,6 +333,11 @@ Start with dash ability, but no way to use boots to accomplish checks
|
|||||||
|
|
||||||
Whether to shuffle links house in most ER modes.
|
Whether to shuffle links house in most ER modes.
|
||||||
|
|
||||||
|
```
|
||||||
|
--shuffletavern
|
||||||
|
```
|
||||||
|
|
||||||
|
Whether to shuffle the back of the tavern in most ER modes.
|
||||||
|
|
||||||
```
|
```
|
||||||
--bombbag
|
--bombbag
|
||||||
|
|||||||
6
Rom.py
6
Rom.py
@@ -37,7 +37,7 @@ from source.dungeon.RoomList import Room0127
|
|||||||
|
|
||||||
|
|
||||||
JAP10HASH = '03a63945398191337e896e5771f77173'
|
JAP10HASH = '03a63945398191337e896e5771f77173'
|
||||||
RANDOMIZERBASEHASH = '01166fb16b38b49ef79acc9993dc4f02'
|
RANDOMIZERBASEHASH = 'e5556450b16f74709c666e419f2a42ad'
|
||||||
|
|
||||||
|
|
||||||
class JsonRom(object):
|
class JsonRom(object):
|
||||||
@@ -730,6 +730,8 @@ def patch_rom(world, rom, player, team, enemized, is_mystery=False):
|
|||||||
else:
|
else:
|
||||||
# patch door table
|
# patch door table
|
||||||
rom.write_byte(0xDBB73 + exit.addresses, exit.target)
|
rom.write_byte(0xDBB73 + exit.addresses, exit.target)
|
||||||
|
if exit.name == 'Tavern North':
|
||||||
|
rom.write_byte(0x157D0, exit.target)
|
||||||
if world.mode[player] == 'inverted':
|
if world.mode[player] == 'inverted':
|
||||||
patch_shuffled_dark_sanc(world, rom, player)
|
patch_shuffled_dark_sanc(world, rom, player)
|
||||||
|
|
||||||
@@ -2048,6 +2050,8 @@ def write_strings(rom, world, player, team):
|
|||||||
entrances_to_hint.update({'Inverted Links House': 'The hero\'s old residence'})
|
entrances_to_hint.update({'Inverted Links House': 'The hero\'s old residence'})
|
||||||
else:
|
else:
|
||||||
entrances_to_hint.update({'Links House': 'The hero\'s old residence'})
|
entrances_to_hint.update({'Links House': 'The hero\'s old residence'})
|
||||||
|
if world.shuffletavern[player] and world.shuffle[player] not in ['vanilla', 'dungeonssimple', 'dungeonsfull']:
|
||||||
|
entrances_to_hint.update({'Tavern North': 'A backdoor'})
|
||||||
if world.mode[player] == 'inverted':
|
if world.mode[player] == 'inverted':
|
||||||
entrances_to_hint.update({'Inverted Dark Sanctuary': 'The dark sanctuary cave'})
|
entrances_to_hint.update({'Inverted Dark Sanctuary': 'The dark sanctuary cave'})
|
||||||
entrances_to_hint.update({'Inverted Big Bomb Shop': 'The old hero\'s dark home'})
|
entrances_to_hint.update({'Inverted Big Bomb Shop': 'The old hero\'s dark home'})
|
||||||
|
|||||||
Binary file not shown.
@@ -35,6 +35,9 @@ entrance_shuffle:
|
|||||||
shufflelinks:
|
shufflelinks:
|
||||||
on: 1
|
on: 1
|
||||||
off: 1
|
off: 1
|
||||||
|
shuffletavern:
|
||||||
|
on: 1
|
||||||
|
off: 1
|
||||||
world_state:
|
world_state:
|
||||||
standard: 1
|
standard: 1
|
||||||
open: 1
|
open: 1
|
||||||
|
|||||||
@@ -360,6 +360,10 @@
|
|||||||
"action": "store_true",
|
"action": "store_true",
|
||||||
"type": "bool"
|
"type": "bool"
|
||||||
},
|
},
|
||||||
|
"shuffletavern": {
|
||||||
|
"action": "store_true",
|
||||||
|
"type": "bool"
|
||||||
|
},
|
||||||
"overworld_map": {
|
"overworld_map": {
|
||||||
"choices": [
|
"choices": [
|
||||||
"default",
|
"default",
|
||||||
|
|||||||
@@ -314,6 +314,9 @@
|
|||||||
"shufflelinks": [
|
"shufflelinks": [
|
||||||
"Include Link's House in the entrance shuffle pool. (default: %(default)s)"
|
"Include Link's House in the entrance shuffle pool. (default: %(default)s)"
|
||||||
],
|
],
|
||||||
|
"shuffletavern": [
|
||||||
|
"Include the back of the tavern in the entrance shuffle pool. (default: %(default)s)"
|
||||||
|
],
|
||||||
"overworld_map": [
|
"overworld_map": [
|
||||||
"Control if and how the overworld map indicators show the locations of dungeons (default: %(default)s)"
|
"Control if and how the overworld map indicators show the locations of dungeons (default: %(default)s)"
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -129,6 +129,7 @@
|
|||||||
"randomizer.entrance.openpyramid": "Pre-open Pyramid Hole",
|
"randomizer.entrance.openpyramid": "Pre-open Pyramid Hole",
|
||||||
"randomizer.entrance.shuffleganon": "Include Ganon's Tower and Pyramid Hole in shuffle pool",
|
"randomizer.entrance.shuffleganon": "Include Ganon's Tower and Pyramid Hole in shuffle pool",
|
||||||
"randomizer.entrance.shufflelinks": "Include Link's House in the shuffle pool",
|
"randomizer.entrance.shufflelinks": "Include Link's House in the shuffle pool",
|
||||||
|
"randomizer.entrance.shuffletavern": "Include the back of the tavern in the entrance shuffle pool",
|
||||||
"randomizer.entrance.overworld_map": "Overworld Map",
|
"randomizer.entrance.overworld_map": "Overworld Map",
|
||||||
"randomizer.entrance.overworld_map.default": "Default (no location display)",
|
"randomizer.entrance.overworld_map.default": "Default (no location display)",
|
||||||
"randomizer.entrance.overworld_map.compass": "Compass indicates location",
|
"randomizer.entrance.overworld_map.compass": "Compass indicates location",
|
||||||
|
|||||||
@@ -18,6 +18,7 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"shufflelinks": { "type": "checkbox" },
|
"shufflelinks": { "type": "checkbox" },
|
||||||
|
"shuffletavern": { "type": "checkbox" },
|
||||||
"overworld_map": {
|
"overworld_map": {
|
||||||
"type": "selectbox",
|
"type": "selectbox",
|
||||||
"options": [
|
"options": [
|
||||||
|
|||||||
@@ -110,6 +110,7 @@ class CustomSettings(object):
|
|||||||
args.shufflepots[p] = get_setting(settings['shufflepots'], args.shufflepots[p])
|
args.shufflepots[p] = get_setting(settings['shufflepots'], args.shufflepots[p])
|
||||||
args.bombbag[p] = get_setting(settings['bombbag'], args.bombbag[p])
|
args.bombbag[p] = get_setting(settings['bombbag'], args.bombbag[p])
|
||||||
args.shufflelinks[p] = get_setting(settings['shufflelinks'], args.shufflelinks[p])
|
args.shufflelinks[p] = get_setting(settings['shufflelinks'], args.shufflelinks[p])
|
||||||
|
args.shuffletavern[p] = get_setting(settings['shuffletavern'], args.shuffletavern[p])
|
||||||
args.restrict_boss_items[p] = get_setting(settings['restrict_boss_items'], args.restrict_boss_items[p])
|
args.restrict_boss_items[p] = get_setting(settings['restrict_boss_items'], args.restrict_boss_items[p])
|
||||||
args.overworld_map[p] = get_setting(settings['overworld_map'], args.overworld_map[p])
|
args.overworld_map[p] = get_setting(settings['overworld_map'], args.overworld_map[p])
|
||||||
args.pseudoboots[p] = get_setting(settings['pseudoboots'], args.pseudoboots[p])
|
args.pseudoboots[p] = get_setting(settings['pseudoboots'], args.pseudoboots[p])
|
||||||
@@ -211,6 +212,7 @@ class CustomSettings(object):
|
|||||||
settings_dict[p]['shufflepots'] = world.potshuffle[p]
|
settings_dict[p]['shufflepots'] = world.potshuffle[p]
|
||||||
settings_dict[p]['bombbag'] = world.bombbag[p]
|
settings_dict[p]['bombbag'] = world.bombbag[p]
|
||||||
settings_dict[p]['shufflelinks'] = world.shufflelinks[p]
|
settings_dict[p]['shufflelinks'] = world.shufflelinks[p]
|
||||||
|
settings_dict[p]['shuffletavern'] = world.shuffletavern[p]
|
||||||
settings_dict[p]['overworld_map'] = world.overworld_map[p]
|
settings_dict[p]['overworld_map'] = world.overworld_map[p]
|
||||||
settings_dict[p]['pseudoboots'] = world.pseudoboots[p]
|
settings_dict[p]['pseudoboots'] = world.pseudoboots[p]
|
||||||
settings_dict[p]['triforce_goal'] = world.treasure_hunt_count[p]
|
settings_dict[p]['triforce_goal'] = world.treasure_hunt_count[p]
|
||||||
|
|||||||
@@ -79,6 +79,7 @@ SETTINGSTOPROCESS = {
|
|||||||
"openpyramid": "openpyramid",
|
"openpyramid": "openpyramid",
|
||||||
"shuffleganon": "shuffleganon",
|
"shuffleganon": "shuffleganon",
|
||||||
"shufflelinks": "shufflelinks",
|
"shufflelinks": "shufflelinks",
|
||||||
|
"shuffletavern": "shuffletavern",
|
||||||
"entranceshuffle": "shuffle",
|
"entranceshuffle": "shuffle",
|
||||||
"overworld_map": "overworld_map",
|
"overworld_map": "overworld_map",
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -77,9 +77,6 @@ def link_entrances_new(world, player):
|
|||||||
for exit_name, region_name in inverted_mandatory_connections:
|
for exit_name, region_name in inverted_mandatory_connections:
|
||||||
connect_simple(world, exit_name, region_name, player)
|
connect_simple(world, exit_name, region_name, player)
|
||||||
|
|
||||||
# not randomized at this time
|
|
||||||
connect_simple(world, 'Tavern North', 'Tavern', player)
|
|
||||||
|
|
||||||
connect_custom(avail_pool, world, player)
|
connect_custom(avail_pool, world, player)
|
||||||
|
|
||||||
if world.shuffle[player] == 'vanilla':
|
if world.shuffle[player] == 'vanilla':
|
||||||
@@ -191,6 +188,14 @@ def do_main_shuffle(entrances, exits, avail, mode_def):
|
|||||||
avail.decoupled_entrances.remove('Ganons Tower')
|
avail.decoupled_entrances.remove('Ganons Tower')
|
||||||
avail.decoupled_exits.remove('Ganons Tower Exit')
|
avail.decoupled_exits.remove('Ganons Tower Exit')
|
||||||
|
|
||||||
|
# back of tavern
|
||||||
|
if not avail.world.shuffletavern[avail.player] and 'Tavern North' in entrances:
|
||||||
|
connect_entrance('Tavern North', 'Tavern', avail)
|
||||||
|
entrances.remove('Tavern North')
|
||||||
|
exits.remove('Tavern')
|
||||||
|
if not avail.coupled:
|
||||||
|
avail.decoupled_entrances.remove('Tavern North')
|
||||||
|
|
||||||
# links house / houlihan
|
# links house / houlihan
|
||||||
do_links_house(entrances, exits, avail, cross_world)
|
do_links_house(entrances, exits, avail, cross_world)
|
||||||
|
|
||||||
@@ -1061,13 +1066,12 @@ def connect_entrance(entrancename, exit_name, avail):
|
|||||||
addresses = door_addresses[entrance.name][0]
|
addresses = door_addresses[entrance.name][0]
|
||||||
|
|
||||||
entrance.connect(region, addresses, target)
|
entrance.connect(region, addresses, target)
|
||||||
if entrancename != 'Tavern North':
|
avail.entrances.remove(entrancename)
|
||||||
avail.entrances.remove(entrancename)
|
if avail.coupled:
|
||||||
if avail.coupled:
|
if exit_name == 'Inverted Dark Sanctuary':
|
||||||
if exit_name == 'Inverted Dark Sanctuary':
|
avail.exits.remove('Inverted Dark Sanctuary Exit')
|
||||||
avail.exits.remove('Inverted Dark Sanctuary Exit')
|
else:
|
||||||
else:
|
avail.exits.remove(exit_name)
|
||||||
avail.exits.remove(exit_name)
|
|
||||||
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)
|
||||||
logging.getLogger('').debug(f'Connected (entr) {entrance.name} to {exit.name if exit is not None else region.name}')
|
logging.getLogger('').debug(f'Connected (entr) {entrance.name} to {exit.name if exit is not None else region.name}')
|
||||||
|
|
||||||
@@ -1211,7 +1215,7 @@ modes = {
|
|||||||
'Waterfall of Wishing', 'Inverted Bomb Shop', 'Cave Shop (Dark Death Mountain)',
|
'Waterfall of Wishing', 'Inverted Bomb Shop', 'Cave Shop (Dark Death Mountain)',
|
||||||
'Dark World Potion Shop', 'Dark World Lumberjack Shop', 'Dark World Shop',
|
'Dark World Potion Shop', 'Dark World Lumberjack Shop', 'Dark World Shop',
|
||||||
'Red Shield Shop', 'Kakariko Shop', 'Capacity Upgrade', 'Cave Shop (Lake Hylia)',
|
'Red Shield Shop', 'Kakariko Shop', 'Capacity Upgrade', 'Cave Shop (Lake Hylia)',
|
||||||
'Links House', 'Inverted Links House']
|
'Links House', 'Inverted Links House', 'Tavern North']
|
||||||
},
|
},
|
||||||
'old_man_cave': { # have to do old man cave first so lw dungeon don't use up everything
|
'old_man_cave': { # have to do old man cave first so lw dungeon don't use up everything
|
||||||
'special': 'old_man_cave_east',
|
'special': 'old_man_cave_east',
|
||||||
@@ -1277,7 +1281,7 @@ modes = {
|
|||||||
'Waterfall of Wishing', 'Inverted Bomb Shop', 'Cave Shop (Dark Death Mountain)',
|
'Waterfall of Wishing', 'Inverted Bomb Shop', 'Cave Shop (Dark Death Mountain)',
|
||||||
'Dark World Potion Shop', 'Dark World Lumberjack Shop', 'Dark World Shop',
|
'Dark World Potion Shop', 'Dark World Lumberjack Shop', 'Dark World Shop',
|
||||||
'Red Shield Shop', 'Kakariko Shop', 'Capacity Upgrade', 'Cave Shop (Lake Hylia)',
|
'Red Shield Shop', 'Kakariko Shop', 'Capacity Upgrade', 'Cave Shop (Lake Hylia)',
|
||||||
'Links House', 'Inverted Links House']
|
'Links House', 'Inverted Links House', 'Tavern North']
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1575,8 +1579,8 @@ single_entrance_map = {
|
|||||||
'Fortune Teller (Light)': 'Fortune Teller (Light)', 'Lost Woods Gamble': 'Lost Woods Gamble',
|
'Fortune Teller (Light)': 'Fortune Teller (Light)', 'Lost Woods Gamble': 'Lost Woods Gamble',
|
||||||
'Sick Kids House': 'Sick Kids House', 'Blacksmiths Hut': 'Blacksmiths Hut', 'Capacity Upgrade': 'Capacity Upgrade',
|
'Sick Kids House': 'Sick Kids House', 'Blacksmiths Hut': 'Blacksmiths Hut', 'Capacity Upgrade': 'Capacity Upgrade',
|
||||||
'Cave Shop (Lake Hylia)': 'Cave Shop (Lake Hylia)', 'Sahasrahlas Hut': 'Sahasrahlas Hut',
|
'Cave Shop (Lake Hylia)': 'Cave Shop (Lake Hylia)', 'Sahasrahlas Hut': 'Sahasrahlas Hut',
|
||||||
'Aginahs Cave': 'Aginahs Cave', 'Chicken House': 'Chicken House', 'Kings Grave': 'Kings Grave',
|
'Aginahs Cave': 'Aginahs Cave', 'Chicken House': 'Chicken House', 'Tavern North': 'Tavern',
|
||||||
'Desert Fairy': 'Desert Healer Fairy', 'Light Hype Fairy': 'Swamp Healer Fairy',
|
'Kings Grave': 'Kings Grave', 'Desert Fairy': 'Desert Healer Fairy', 'Light Hype Fairy': 'Swamp Healer Fairy',
|
||||||
'Lake Hylia Fortune Teller': 'Lake Hylia Fortune Teller', 'Lake Hylia Fairy': 'Lake Hylia Healer Fairy',
|
'Lake Hylia Fortune Teller': 'Lake Hylia Fortune Teller', 'Lake Hylia Fairy': 'Lake Hylia Healer Fairy',
|
||||||
'Bonk Fairy (Light)': 'Bonk Fairy (Light)', 'Lumberjack House': 'Lumberjack House', 'Dam': 'Dam',
|
'Bonk Fairy (Light)': 'Bonk Fairy (Light)', 'Lumberjack House': 'Lumberjack House', 'Dam': 'Dam',
|
||||||
'Blinds Hideout': 'Blinds Hideout', 'Waterfall of Wishing': 'Waterfall of Wishing',
|
'Blinds Hideout': 'Blinds Hideout', 'Waterfall of Wishing': 'Waterfall of Wishing',
|
||||||
@@ -1613,7 +1617,7 @@ default_lw = {
|
|||||||
'Paradox Cave Exit (Middle)', 'Paradox Cave Exit (Top)', 'Fairy Ascension Cave Exit (Bottom)',
|
'Paradox Cave Exit (Middle)', 'Paradox Cave Exit (Top)', 'Fairy Ascension Cave Exit (Bottom)',
|
||||||
'Fairy Ascension Cave Exit (Top)', 'Spiral Cave Exit', 'Spiral Cave Exit (Top)', 'Waterfall of Wishing', 'Dam',
|
'Fairy Ascension Cave Exit (Top)', 'Spiral Cave Exit', 'Spiral Cave Exit (Top)', 'Waterfall of Wishing', 'Dam',
|
||||||
'Blinds Hideout', 'Lumberjack House', 'Bonk Fairy (Light)', 'Bonk Fairy (Dark)', 'Lake Hylia Healer Fairy',
|
'Blinds Hideout', 'Lumberjack House', 'Bonk Fairy (Light)', 'Bonk Fairy (Dark)', 'Lake Hylia Healer Fairy',
|
||||||
'Swamp Healer Fairy', 'Desert Healer Fairy', 'Fortune Teller (Light)', 'Lake Hylia Fortune Teller', 'Kings Grave',
|
'Swamp Healer Fairy', 'Desert Healer Fairy', 'Fortune Teller (Light)', 'Lake Hylia Fortune Teller', 'Kings Grave', 'Tavern',
|
||||||
'Chicken House', 'Aginahs Cave', 'Sahasrahlas Hut', 'Cave Shop (Lake Hylia)', 'Capacity Upgrade', 'Blacksmiths Hut',
|
'Chicken House', 'Aginahs Cave', 'Sahasrahlas Hut', 'Cave Shop (Lake Hylia)', 'Capacity Upgrade', 'Blacksmiths Hut',
|
||||||
'Sick Kids House', 'Lost Woods Gamble', 'Snitch Lady (East)', 'Snitch Lady (West)', 'Bush Covered House',
|
'Sick Kids House', 'Lost Woods Gamble', 'Snitch Lady (East)', 'Snitch Lady (West)', 'Bush Covered House',
|
||||||
'Tavern (Front)', 'Light World Bomb Hut', 'Kakariko Shop', 'Cave 45', 'Graveyard Cave', 'Checkerboard Cave',
|
'Tavern (Front)', 'Light World Bomb Hut', 'Kakariko Shop', 'Cave 45', 'Graveyard Cave', 'Checkerboard Cave',
|
||||||
@@ -1631,7 +1635,7 @@ LW_Entrances = ['Elder House (East)', 'Elder House (West)', 'Two Brothers House
|
|||||||
'Desert Palace Entrance (South)', 'Desert Palace Entrance (West)', 'Desert Palace Entrance (North)',
|
'Desert Palace Entrance (South)', 'Desert Palace Entrance (West)', 'Desert Palace Entrance (North)',
|
||||||
'Desert Palace Entrance (East)', 'Eastern Palace', 'Tower of Hera', 'Hyrule Castle Entrance (West)',
|
'Desert Palace Entrance (East)', 'Eastern Palace', 'Tower of Hera', 'Hyrule Castle Entrance (West)',
|
||||||
'Hyrule Castle Entrance (East)', 'Hyrule Castle Entrance (South)', 'Agahnims Tower', 'Blinds Hideout',
|
'Hyrule Castle Entrance (East)', 'Hyrule Castle Entrance (South)', 'Agahnims Tower', 'Blinds Hideout',
|
||||||
'Lake Hylia Fairy', 'Light Hype Fairy', 'Desert Fairy', 'Chicken House', 'Aginahs Cave',
|
'Lake Hylia Fairy', 'Light Hype Fairy', 'Desert Fairy', 'Tavern North', 'Chicken House', 'Aginahs Cave',
|
||||||
'Sahasrahlas Hut', 'Cave Shop (Lake Hylia)', 'Blacksmiths Hut', 'Sick Kids House', 'Lost Woods Gamble',
|
'Sahasrahlas Hut', 'Cave Shop (Lake Hylia)', 'Blacksmiths Hut', 'Sick Kids House', 'Lost Woods Gamble',
|
||||||
'Fortune Teller (Light)', 'Snitch Lady (East)', 'Snitch Lady (West)', 'Bush Covered House',
|
'Fortune Teller (Light)', 'Snitch Lady (East)', 'Snitch Lady (West)', 'Bush Covered House',
|
||||||
'Tavern (Front)', 'Light World Bomb Hut', 'Kakariko Shop', 'Mini Moldorm Cave', 'Long Fairy Cave',
|
'Tavern (Front)', 'Light World Bomb Hut', 'Kakariko Shop', 'Mini Moldorm Cave', 'Long Fairy Cave',
|
||||||
@@ -1774,8 +1778,8 @@ Simple_DM_Non_Connectors = {'Old Man Cave Ledge', 'Spiral Cave (Top)', 'Superbun
|
|||||||
'Spectacle Rock Cave (Peak)', 'Spectacle Rock Cave (Top)'}
|
'Spectacle Rock Cave (Peak)', 'Spectacle Rock Cave (Top)'}
|
||||||
|
|
||||||
Blacksmith_Options = [
|
Blacksmith_Options = [
|
||||||
'Blinds Hideout', 'Lake Hylia Fairy', 'Light Hype Fairy', 'Desert Fairy', 'Chicken House', 'Aginahs Cave',
|
'Blinds Hideout', 'Lake Hylia Fairy', 'Light Hype Fairy', 'Desert Fairy', 'Tavern North', 'Chicken House',
|
||||||
'Sahasrahlas Hut', 'Cave Shop (Lake Hylia)', 'Blacksmiths Hut', 'Sick Kids House', 'Lost Woods Gamble',
|
'Aginahs Cave', 'Sahasrahlas Hut', 'Cave Shop (Lake Hylia)', 'Blacksmiths Hut', 'Sick Kids House', 'Lost Woods Gamble',
|
||||||
'Fortune Teller (Light)', 'Snitch Lady (East)', 'Snitch Lady (West)', 'Bush Covered House', 'Tavern (Front)',
|
'Fortune Teller (Light)', 'Snitch Lady (East)', 'Snitch Lady (West)', 'Bush Covered House', 'Tavern (Front)',
|
||||||
'Light World Bomb Hut', 'Kakariko Shop', 'Mini Moldorm Cave', 'Long Fairy Cave', 'Good Bee Cave', '20 Rupee Cave',
|
'Light World Bomb Hut', 'Kakariko Shop', 'Mini Moldorm Cave', 'Long Fairy Cave', 'Good Bee Cave', '20 Rupee Cave',
|
||||||
'50 Rupee Cave', 'Ice Rod Cave', 'Library', 'Potion Shop', 'Dam', 'Lumberjack House', 'Lake Hylia Fortune Teller',
|
'50 Rupee Cave', 'Ice Rod Cave', 'Library', 'Potion Shop', 'Dam', 'Lumberjack House', 'Lake Hylia Fortune Teller',
|
||||||
@@ -2651,7 +2655,7 @@ door_addresses = {'Links House': (0x00, (0x0104, 0x2c, 0x0506, 0x0a9a, 0x0832, 0
|
|||||||
'Light Hype Fairy': (0x6B, (0x0115, 0x34, 0x00a0, 0x0c04, 0x0900, 0x0c58, 0x0988, 0x0c73, 0x0985, 0x0a, 0xf6, 0x0000, 0x0000)),
|
'Light Hype Fairy': (0x6B, (0x0115, 0x34, 0x00a0, 0x0c04, 0x0900, 0x0c58, 0x0988, 0x0c73, 0x0985, 0x0a, 0xf6, 0x0000, 0x0000)),
|
||||||
'Desert Fairy': (0x71, (0x0115, 0x3a, 0x0000, 0x0e00, 0x0400, 0x0e26, 0x0468, 0x0e6d, 0x0485, 0x00, 0x00, 0x0000, 0x0000)),
|
'Desert Fairy': (0x71, (0x0115, 0x3a, 0x0000, 0x0e00, 0x0400, 0x0e26, 0x0468, 0x0e6d, 0x0485, 0x00, 0x00, 0x0000, 0x0000)),
|
||||||
'Kings Grave': (0x5A, (0x0113, 0x14, 0x0320, 0x0456, 0x0900, 0x04a6, 0x0998, 0x04c3, 0x097d, 0x0a, 0xf6, 0x0000, 0x0000)),
|
'Kings Grave': (0x5A, (0x0113, 0x14, 0x0320, 0x0456, 0x0900, 0x04a6, 0x0998, 0x04c3, 0x097d, 0x0a, 0xf6, 0x0000, 0x0000)),
|
||||||
'Tavern North': (0x42, (0x0103, 0x18, 0x1440, 0x08a7, 0x0206, 0x08f9, 0x0288, 0x0914, 0x0293, 0xf7, 0x09, 0xFFFF, 0x0000)), # do not use, buggy
|
'Tavern North': (0x42, (0x0103, 0x18, 0x1440, 0x08a7, 0x0206, 0x091b, 0x0288, 0x0914, 0x0293, 0xf7, 0x09, 0xFFFF, 0x0000)),
|
||||||
'Chicken House': (0x4A, (0x0108, 0x18, 0x1120, 0x0837, 0x0106, 0x0888, 0x0188, 0x08a4, 0x0193, 0x07, 0xf9, 0x1530, 0x0000)),
|
'Chicken House': (0x4A, (0x0108, 0x18, 0x1120, 0x0837, 0x0106, 0x0888, 0x0188, 0x08a4, 0x0193, 0x07, 0xf9, 0x1530, 0x0000)),
|
||||||
'Aginahs Cave': (0x70, (0x010a, 0x30, 0x0656, 0x0cc6, 0x02aa, 0x0d18, 0x0328, 0x0d33, 0x032f, 0x08, 0xf8, 0x0000, 0x0000)),
|
'Aginahs Cave': (0x70, (0x010a, 0x30, 0x0656, 0x0cc6, 0x02aa, 0x0d18, 0x0328, 0x0d33, 0x032f, 0x08, 0xf8, 0x0000, 0x0000)),
|
||||||
'Sahasrahlas Hut': (0x44, (0x0105, 0x1e, 0x0610, 0x06d4, 0x0c76, 0x0727, 0x0cf0, 0x0743, 0x0cfb, 0x0a, 0xf6, 0x0000, 0x0000)),
|
'Sahasrahlas Hut': (0x44, (0x0105, 0x1e, 0x0610, 0x06d4, 0x0c76, 0x0727, 0x0cf0, 0x0743, 0x0cfb, 0x0a, 0xf6, 0x0000, 0x0000)),
|
||||||
@@ -2940,7 +2944,7 @@ ow_prize_table = {'Links House': (0x8b1, 0xb2d), 'Inverted Big Bomb Shop': (0x8b
|
|||||||
'Light Hype Fairy': (0x940, 0xc80),
|
'Light Hype Fairy': (0x940, 0xc80),
|
||||||
'Desert Fairy': (0x420, 0xe00),
|
'Desert Fairy': (0x420, 0xe00),
|
||||||
'Kings Grave': (0x920, 0x520),
|
'Kings Grave': (0x920, 0x520),
|
||||||
'Tavern North': None, # can't mark this one technically
|
'Tavern North': (0x270, 0x900),
|
||||||
'Chicken House': (0x120, 0x880),
|
'Chicken House': (0x120, 0x880),
|
||||||
'Aginahs Cave': (0x2e0, 0xd00),
|
'Aginahs Cave': (0x2e0, 0xd00),
|
||||||
'Sahasrahlas Hut': (0xcf0, 0x6c0),
|
'Sahasrahlas Hut': (0xcf0, 0x6c0),
|
||||||
|
|||||||
@@ -85,6 +85,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.shuffletavern = get_choice('shuffletavern') == 'on'
|
||||||
ret.pseudoboots = get_choice('pseudoboots') == 'on'
|
ret.pseudoboots = get_choice('pseudoboots') == 'on'
|
||||||
ret.shopsanity = get_choice('shopsanity') == 'on'
|
ret.shopsanity = get_choice('shopsanity') == 'on'
|
||||||
keydropshuffle = get_choice('keydropshuffle') == 'on'
|
keydropshuffle = get_choice('keydropshuffle') == 'on'
|
||||||
|
|||||||
Reference in New Issue
Block a user