1 Commits

Author SHA1 Message Date
6fe0c233a8 Re-add vanilla_placements yamls 2026-05-25 00:21:55 -05:00
17 changed files with 689 additions and 232 deletions

View File

@@ -85,7 +85,6 @@ class World(object):
self.bosses_ganon = {} self.bosses_ganon = {}
self.bosshunt_include_agas = {} self.bosshunt_include_agas = {}
self.ganon_item = {} self.ganon_item = {}
self.require_ganon_item = {}
self.ganon_item_orig = {} self.ganon_item_orig = {}
self.custom = custom self.custom = custom
self.customitemarray = customitemarray self.customitemarray = customitemarray
@@ -187,7 +186,6 @@ class World(object):
set_player_attr('bosses_ganon', 8) set_player_attr('bosses_ganon', 8)
set_player_attr('bosshunt_include_agas', False) set_player_attr('bosshunt_include_agas', False)
set_player_attr('ganon_item', 'silver') set_player_attr('ganon_item', 'silver')
set_player_attr('require_ganon_item', False)
set_player_attr('crystals_ganon_orig', {}) set_player_attr('crystals_ganon_orig', {})
set_player_attr('crystals_gt_orig', {}) set_player_attr('crystals_gt_orig', {})
set_player_attr('ganon_item_orig', 'silver') set_player_attr('ganon_item_orig', 'silver')
@@ -1409,7 +1407,7 @@ class CollectionState(object):
def can_hit_stunned_ganon(self, player): def can_hit_stunned_ganon(self, player):
ganon_item = self.world.ganon_item[player] ganon_item = self.world.ganon_item[player]
if ganon_item == "silver": if ganon_item == "silver":
return self.has("Silver Arrows", player) and self.can_shoot_arrows(player) return self.has("Silver Arroys", player) and self.can_shoot_arrows(player)
elif ganon_item == "boomerang": elif ganon_item == "boomerang":
return self.has("Blue Boomerang", player) or self.has("Red Boomerang", player) return self.has("Blue Boomerang", player) or self.has("Red Boomerang", player)
elif ganon_item == "hookshot": elif ganon_item == "hookshot":
@@ -3156,7 +3154,6 @@ class Spoiler(object):
'ganon_bosses': self.world.bosses_ganon, 'ganon_bosses': self.world.bosses_ganon,
'bosshunt_include_agas': self.world.bosshunt_include_agas, 'bosshunt_include_agas': self.world.bosshunt_include_agas,
'ganon_item': self.world.ganon_item, 'ganon_item': self.world.ganon_item,
'require_ganon_item': self.world.require_ganon_item,
'open_pyramid': self.world.open_pyramid, 'open_pyramid': self.world.open_pyramid,
'accessibility': self.world.accessibility, 'accessibility': self.world.accessibility,
'restricted_boss_items': self.world.restrict_boss_items, 'restricted_boss_items': self.world.restrict_boss_items,
@@ -3394,8 +3391,7 @@ class Spoiler(object):
if custom['murahgoal'] and 'requirements' in custom['murahgoal']: if custom['murahgoal'] and 'requirements' in custom['murahgoal']:
outfile.write('Murahdahla Requirement:'.ljust(line_width) + 'custom\n') outfile.write('Murahdahla Requirement:'.ljust(line_width) + 'custom\n')
outfile.write(' %s\n' % custom['murahgoal']['goaltext']) outfile.write(' %s\n' % custom['murahgoal']['goaltext'])
outfile.write('Item to Hurt Stunned Ganon:'.ljust(line_width) + '%s\n' % str(self.world.ganon_item_orig[player])) outfile.write('Item Required for Ganon:'.ljust(line_width) + '%s\n' % str(self.world.ganon_item_orig[player]))
outfile.write('Item Required for Ganon:'.ljust(line_width) + '%s\n' % yn(self.world.require_ganon_item[player]))
outfile.write('Swords:'.ljust(line_width) + '%s\n' % self.metadata['weapons'][player]) outfile.write('Swords:'.ljust(line_width) + '%s\n' % self.metadata['weapons'][player])
outfile.write('\n') outfile.write('\n')
outfile.write('Accessibility:'.ljust(line_width) + '%s\n' % self.metadata['accessibility'][player]) outfile.write('Accessibility:'.ljust(line_width) + '%s\n' % self.metadata['accessibility'][player])

4
CLI.py
View File

@@ -159,8 +159,7 @@ def parse_cli(argv, no_defaults=False):
'take_any', 'boots_hint', 'shuffle_followers', 'take_any', 'boots_hint', 'shuffle_followers',
'shuffle', 'door_shuffle', 'intensity', 'shuffle', 'door_shuffle', 'intensity',
'crystals_ganon', 'crystals_gt', 'bosses_ganon', 'crystals_ganon', 'crystals_gt', 'bosses_ganon',
'bosshunt_include_agas', 'ganon_item', 'bosshunt_include_agas', 'ganon_item', 'openpyramid',
'require_ganon_item', 'openpyramid',
'mapshuffle', 'compassshuffle', 'keyshuffle', 'mapshuffle', 'compassshuffle', 'keyshuffle',
'bigkeyshuffle', 'prizeshuffle', 'showloot', 'loothud', 'bigkeyshuffle', 'prizeshuffle', 'showloot', 'loothud',
'showmap', 'startinventory', 'usestartinventory', 'showmap', 'startinventory', 'usestartinventory',
@@ -221,7 +220,6 @@ def parse_settings():
"bosses_ganon": "8", "bosses_ganon": "8",
"bosshunt_include_agas": False, "bosshunt_include_agas": False,
"ganon_item": "silver", "ganon_item": "silver",
"require_ganon_item": False,
"swords": "random", "swords": "random",
"flute_mode": "normal", "flute_mode": "normal",
"bow_mode": "progressive", "bow_mode": "progressive",

View File

@@ -872,7 +872,7 @@ def set_up_shops(world, player):
rss.locked = True rss.locked = True
cap_shop = world.get_region('Capacity Upgrade', player).shop cap_shop = world.get_region('Capacity Upgrade', player).shop
cap_shop.inventory[1] = None # remove arrow capacity upgrades in retro cap_shop.inventory[1] = None # remove arrow capacity upgrades in retro
for shop in random.sample([s for s in world.shops[player] if not s.locked and s.region.name != "Red Shield Shop" and s.region.player == player], 5): for shop in random.sample([s for s in world.shops[player] if not s.locked and s.region.player == player], 5):
shop.custom = True shop.custom = True
shop.locked = True shop.locked = True
if retro_bow: if retro_bow:
@@ -944,7 +944,6 @@ def customize_shops(world, player):
rep_price = final_price(loc.name, item.price, world, player) rep_price = final_price(loc.name, item.price, world, player)
shop.add_inventory(idx, upgrade.name, up_price, 6, shop.add_inventory(idx, upgrade.name, up_price, 6,
item.name, rep_price, player=item.player) item.name, rep_price, player=item.player)
upgrade.world = loc.item.world
loc.item = upgrade loc.item = upgrade
upgrade.location = loc upgrade.location = loc
if not found_arrow_upgrade and len(possible_replacements) > 0: if not found_arrow_upgrade and len(possible_replacements) > 0:
@@ -960,7 +959,6 @@ def customize_shops(world, player):
shop.add_inventory(idx, upgrade.name, up_price, 6, shop.add_inventory(idx, upgrade.name, up_price, 6,
item.name, rep_price, player=item.player) item.name, rep_price, player=item.player)
loc.item = upgrade loc.item = upgrade
upgrade.world = loc.item.world
upgrade.location = loc upgrade.location = loc
change_shop_items_to_rupees(world, player, shops_to_customize) change_shop_items_to_rupees(world, player, shops_to_customize)
balance_prices(world, player) balance_prices(world, player)
@@ -997,11 +995,9 @@ def change_shop_items_to_rupees(world, player, shops):
for location in locations: for location in locations:
if location.item.name in shop_transfer.keys() and (location.parent_region.name not in shops or location.name == 'Potion Shop'): if location.item.name in shop_transfer.keys() and (location.parent_region.name not in shops or location.name == 'Potion Shop'):
new_item = ItemFactory(shop_transfer[location.item.name], location.item.player) new_item = ItemFactory(shop_transfer[location.item.name], location.item.player)
new_item.world = location.item.world
location.item = new_item location.item = new_item
if location.parent_region.name == 'Capacity Upgrade' and location.item.name in cap_blacklist: if location.parent_region.name == 'Capacity Upgrade' and location.item.name in cap_blacklist:
new_item = ItemFactory('Rupees (300)', location.item.player) new_item = ItemFactory('Rupees (300)', location.item.player)
new_item.world = location.item.world
location.item = new_item location.item = new_item
shop = world.get_region('Capacity Upgrade', player).shop shop = world.get_region('Capacity Upgrade', player).shop
slot = shop_to_location_table['Capacity Upgrade'].index(location.name) slot = shop_to_location_table['Capacity Upgrade'].index(location.name)

View File

@@ -97,8 +97,8 @@ item_table = {'Bow': (True, False, None, 0x0B, 200, 'Bow!\nJoin the archer class
'Progressive Shield': (True, False, None, 0x5F, 50, 'Shield!\nA better shield for your time!', 'and the new shield', 'shield-wielding kid', 'shield for sale', 'fungus for shield', 'shield boy defends again', 'a shield'), 'Progressive Shield': (True, False, None, 0x5F, 50, 'Shield!\nA better shield for your time!', 'and the new shield', 'shield-wielding kid', 'shield for sale', 'fungus for shield', 'shield boy defends again', 'a shield'),
'Bug Catching Net': (True, False, None, 0x21, 50, 'Bug Net!\nCatch all manner\nof things!', 'and the bee catcher', 'the bug-catching kid', 'stick web for sale', 'fungus for butterflies', 'wrong boy catches bees again', 'the Bug Net'), 'Bug Catching Net': (True, False, None, 0x21, 50, 'Bug Net!\nCatch all manner\nof things!', 'and the bee catcher', 'the bug-catching kid', 'stick web for sale', 'fungus for butterflies', 'wrong boy catches bees again', 'the Bug Net'),
'Cane of Byrna': (True, False, None, 0x18, 50, 'Cane of Byrna!\nSwirly protection!', 'and the bad cane', 'the spark-making kid', 'spark stick for sale', 'spark-stick for trade', 'cane boy encircles again', 'the Blue Cane'), 'Cane of Byrna': (True, False, None, 0x18, 50, 'Cane of Byrna!\nSwirly protection!', 'and the bad cane', 'the spark-making kid', 'spark stick for sale', 'spark-stick for trade', 'cane boy encircles again', 'the Blue Cane'),
'Boss Heart Container': (False, True, None, 0x3E, 40, 'Heart Container!\nHealth Increased!', 'and the full heart', 'the life-giving kid', 'love for sale', 'fungus for life', 'life boy feels love again', 'a heart container'), 'Boss Heart Container': (False, True, None, 0x3E, 40, 'Heart Container!\nHealth Increased!', 'and the full heart', 'the life-giving kid', 'love for sale', 'fungus for life', 'life boy feels love again', 'a heart'),
'Sanctuary Heart Container': (False, True, None, 0x3F, 50, 'Heart Container!\nHealth Increased!', 'and the full heart', 'the life-giving kid', 'love for sale', 'fungus for life', 'life boy feels love again', 'a heart container'), 'Sanctuary Heart Container': (False, True, None, 0x3F, 50, 'Heart Container!\nHealth Increased!', 'and the full heart', 'the life-giving kid', 'love for sale', 'fungus for life', 'life boy feels love again', 'a heart'),
'Piece of Heart': (False, False, None, 0x17, 10, 'Heart Piece!\nOne step closer\nto more health!', 'and the broken heart', 'the life-giving kid', 'little love for sale', 'fungus for life', 'life boy feels some love again', 'a heart piece'), 'Piece of Heart': (False, False, None, 0x17, 10, 'Heart Piece!\nOne step closer\nto more health!', 'and the broken heart', 'the life-giving kid', 'little love for sale', 'fungus for life', 'life boy feels some love again', 'a heart piece'),
'Rupee (1)': (False, False, None, 0x34, 0, 'Rupees!\nJust pocket\nchange.', 'the pocket change', 'poverty-struck kid', 'life lesson for sale', 'buying cheap drugs', 'destitute boy has snack again', 'a green rupee'), 'Rupee (1)': (False, False, None, 0x34, 0, 'Rupees!\nJust pocket\nchange.', 'the pocket change', 'poverty-struck kid', 'life lesson for sale', 'buying cheap drugs', 'destitute boy has snack again', 'a green rupee'),
'Rupees (5)': (False, False, None, 0x35, 2, 'Rupees!\nJust pocket\nchange.', 'the pocket change', 'poverty-struck kid', 'life lesson for sale', 'buying cheap drugs', 'destitute boy has snack again', 'a blue rupee'), 'Rupees (5)': (False, False, None, 0x35, 2, 'Rupees!\nJust pocket\nchange.', 'the pocket change', 'poverty-struck kid', 'life lesson for sale', 'buying cheap drugs', 'destitute boy has snack again', 'a blue rupee'),
@@ -134,9 +134,9 @@ item_table = {'Bow': (True, False, None, 0x0B, 200, 'Bow!\nJoin the archer class
'Big Key (Agahnims Tower)': (False, False, 'BigKey', 0x9B, 60, 'A big key for\nAgahnim\'s Tower', 'and the big key', 'the big-unlock kid', 'big key for sale', 'face key fungus', 'key boy opens chest again', 'a big key to Castle Tower'), 'Big Key (Agahnims Tower)': (False, False, 'BigKey', 0x9B, 60, 'A big key for\nAgahnim\'s Tower', 'and the big key', 'the big-unlock kid', 'big key for sale', 'face key fungus', 'key boy opens chest again', 'a big key to Castle Tower'),
'Compass (Agahnims Tower)': (False, True, 'Compass', 0x8B, 10, 'A compass for\nAgahnim\'s Tower', 'and the compass', 'the magnetic kid', 'compass for sale', 'magnetic fungus', 'compass boy finds null again', 'a compass to Castle Tower'), 'Compass (Agahnims Tower)': (False, True, 'Compass', 0x8B, 10, 'A compass for\nAgahnim\'s Tower', 'and the compass', 'the magnetic kid', 'compass for sale', 'magnetic fungus', 'compass boy finds null again', 'a compass to Castle Tower'),
'Map (Agahnims Tower)': (False, True, 'Map', 0x7B, 10, 'A tightly folded map rests here', 'and the map', 'cartography kid', 'map for sale', 'a map to shrooms', 'map boy navigates again', 'a map to Castle Tower'), 'Map (Agahnims Tower)': (False, True, 'Map', 0x7B, 10, 'A tightly folded map rests here', 'and the map', 'cartography kid', 'map for sale', 'a map to shrooms', 'map boy navigates again', 'a map to Castle Tower'),
'Small Key (Palace of Darkness)': (False, False, 'SmallKey', 0xA6, 40, 'A small key for\nPalace of Darkness', 'and the key', 'the unlocking kid', 'keys for sale', 'unlock the fungus', 'key boy opens door again', 'a small key to Palace of Darkness'), 'Small Key (Palace of Darkness)': (False, False, 'SmallKey', 0xA6, 40, 'A small key for\nDark Palace', 'and the key', 'the unlocking kid', 'keys for sale', 'unlock the fungus', 'key boy opens door again', 'a small key to Palace of Darkness'),
'Big Key (Palace of Darkness)': (False, False, 'BigKey', 0x99, 60, 'A big key for\nPalace of Darkness', 'and the big key', 'the big-unlock kid', 'big key for sale', 'face key fungus', 'key boy opens chest again', 'a big key to Palace of Darkness'), 'Big Key (Palace of Darkness)': (False, False, 'BigKey', 0x99, 60, 'A big key for\nDark Palace', 'and the big key', 'the big-unlock kid', 'big key for sale', 'face key fungus', 'key boy opens chest again', 'a big key to Palace of Darkness'),
'Compass (Palace of Darkness)': (False, True, 'Compass', 0x89, 10, 'A compass for\nPalace of Darkness', 'and the compass', 'the magnetic kid', 'compass for sale', 'magnetic fungus', 'compass boy finds boss again', 'a compass to Palace of Darkness'), 'Compass (Palace of Darkness)': (False, True, 'Compass', 0x89, 10, 'A compass for\nDark Palace', 'and the compass', 'the magnetic kid', 'compass for sale', 'magnetic fungus', 'compass boy finds boss again', 'a compass to Palace of Darkness'),
'Map (Palace of Darkness)': (False, True, 'Map', 0x79, 20, 'A tightly folded map rests here', 'and the map', 'cartography kid', 'map for sale', 'a map to shrooms', 'map boy navigates again', 'a map to Palace of Darkness'), 'Map (Palace of Darkness)': (False, True, 'Map', 0x79, 20, 'A tightly folded map rests here', 'and the map', 'cartography kid', 'map for sale', 'a map to shrooms', 'map boy navigates again', 'a map to Palace of Darkness'),
'Small Key (Thieves Town)': (False, False, 'SmallKey', 0xAB, 40, 'A small key for\nThieves Town', 'and the key', 'the unlocking kid', 'keys for sale', 'unlock the fungus', 'key boy opens door again', 'a small key to Thieves\' Town'), 'Small Key (Thieves Town)': (False, False, 'SmallKey', 0xAB, 40, 'A small key for\nThieves Town', 'and the key', 'the unlocking kid', 'keys for sale', 'unlock the fungus', 'key boy opens door again', 'a small key to Thieves\' Town'),
'Big Key (Thieves Town)': (False, False, 'BigKey', 0x94, 60, 'A big key for\nThieves Town', 'and the big key', 'the big-unlock kid', 'big key for sale', 'face key fungus', 'key boy opens chest again', 'a big key to Thieves\' Town'), 'Big Key (Thieves Town)': (False, False, 'BigKey', 0x94, 60, 'A big key for\nThieves Town', 'and the big key', 'the big-unlock kid', 'big key for sale', 'face key fungus', 'key boy opens chest again', 'a big key to Thieves\' Town'),
@@ -172,10 +172,9 @@ item_table = {'Bow': (True, False, None, 0x0B, 200, 'Bow!\nJoin the archer class
'Red Potion': (False, False, None, 0x2E, 150, 'Hearty red goop!', 'and the red goo', 'the liquid kid', 'potion for sale', 'free samples', 'bottle boy has red goo again', 'a red potion'), 'Red Potion': (False, False, None, 0x2E, 150, 'Hearty red goop!', 'and the red goo', 'the liquid kid', 'potion for sale', 'free samples', 'bottle boy has red goo again', 'a red potion'),
'Green Potion': (False, False, None, 0x2F, 60, 'Refreshing green goop!', 'and the green goo', 'the liquid kid', 'potion for sale', 'free samples', 'bottle boy has green goo again', 'a green potion'), 'Green Potion': (False, False, None, 0x2F, 60, 'Refreshing green goop!', 'and the green goo', 'the liquid kid', 'potion for sale', 'free samples', 'bottle boy has green goo again', 'a green potion'),
'Blue Potion': (False, False, None, 0x30, 160, 'Delicious blue goop!', 'and the blue goo', 'the liquid kid', 'potion for sale', 'free samples', 'bottle boy has blue goo again', 'a blue potion'), 'Blue Potion': (False, False, None, 0x30, 160, 'Delicious blue goop!', 'and the blue goo', 'the liquid kid', 'potion for sale', 'free samples', 'bottle boy has blue goo again', 'a blue potion'),
'Orange Potion': (False, False, None, 0x66, 1000, 'Energizing orange goop!', 'and the orange goo', 'the liquid kid', 'potion for sale', 'free samples', 'bottle boy has orange goo again', 'an orange potion'),
'Bee': (False, False, None, 0x0E, 10, 'I will sting your foes a few times', 'and the sting buddy', 'the beekeeper kid', 'insect for sale', 'shroom pollenation', 'bottle boy has mad bee again', 'a bee'), 'Bee': (False, False, None, 0x0E, 10, 'I will sting your foes a few times', 'and the sting buddy', 'the beekeeper kid', 'insect for sale', 'shroom pollenation', 'bottle boy has mad bee again', 'a bee'),
'Good Bee': (False, False, None, 0xD6, 10, 'I will sting your foes a lot', 'and the cold buddy', 'the beekeeper kid', 'cold insect for sale', 'shroom pollenation', 'bottle boy has cold bee again', 'a good bee'), 'Good Bee': (False, False, None, 0xD6, 10, 'I will sting your foes a lot', 'and the cold buddy', 'the beekeeper kid', 'cold insect for sale', 'shroom pollenation', 'bottle boy has cold bee again', 'a good bee'),
'Small Heart': (False, False, None, 0x42, 10, 'Just a little\npiece of love!', 'and the heart', 'the life-giving kid', 'little love for sale', 'fungus for life', 'life boy feels some love again', 'a refill heart'), 'Small Heart': (False, False, None, 0x42, 10, 'Just a little\npiece of love!', 'and the heart', 'the life-giving kid', 'little love for sale', 'fungus for life', 'life boy feels some love again', 'a heart'),
'Apples': (False, False, None, 0xD1, 30, 'Just a few pieces of fruit!', 'and the juicy fruit', 'the fruity kid', 'the fruit stand', 'expired fruit', 'bottle boy has fruit again', 'an apple hoard'), 'Apples': (False, False, None, 0xD1, 30, 'Just a few pieces of fruit!', 'and the juicy fruit', 'the fruity kid', 'the fruit stand', 'expired fruit', 'bottle boy has fruit again', 'an apple hoard'),
'Fairy': (False, False, None, 0xD2, 50, 'Just a pixie!', 'and the pixie', 'the pixie kid', 'pixie for sale', 'pixie fungus', 'bottle boy has pixie again', 'a pixie'), 'Fairy': (False, False, None, 0xD2, 50, 'Just a pixie!', 'and the pixie', 'the pixie kid', 'pixie for sale', 'pixie fungus', 'bottle boy has pixie again', 'a pixie'),
'Beat Boss': (True, False, 'Event', 999, None, None, None, None, None, None, None, None), 'Beat Boss': (True, False, 'Event', 999, None, None, None, None, None, None, None, None),

25
Main.py
View File

@@ -336,29 +336,10 @@ def main(args, seed=None, fish=None):
for player in range(1, world.players+1): for player in range(1, world.players+1):
if world.shopsanity[player]: if world.shopsanity[player]:
customize_shops(world, player) customize_shops(world, player)
if not args.skip_money_balance and args.algorithm in ['balanced', 'equitable']: if not args.skip_money_balance and args.algorithm in ['balanced', 'equitable']:
balance_money_progression(world) balance_money_progression(world)
ensure_good_items(world, True) ensure_good_items(world, True)
for player in range(1, world.players+1):
if args.orange_potion and world.difficulty[player] == "normal":
cap_shop = world.get_region('Capacity Upgrade', player).shop
potion = {
'item': "Orange Potion",
'price': 1000,
'max': 0,
'replacement': None,
'replacement_price': 0,
'create_location': False,
'player': 0,
}
if cap_shop.inventory[0] is None:
cap_shop.inventory[0] = potion
else:
cap_shop.inventory.insert(1, potion)
if args.print_custom_yaml: if args.print_custom_yaml:
world.settings.record_info(world) world.settings.record_info(world)
world.settings.record_overworld(world) world.settings.record_overworld(world)
@@ -546,7 +527,6 @@ def init_world(args, fish):
world.crystals_ganon_orig = args.crystals_ganon.copy() world.crystals_ganon_orig = args.crystals_ganon.copy()
world.crystals_gt_orig = args.crystals_gt.copy() world.crystals_gt_orig = args.crystals_gt.copy()
world.ganon_item_orig = args.ganon_item.copy() world.ganon_item_orig = args.ganon_item.copy()
world.require_ganon_item = args.require_ganon_item.copy()
world.bosses_ganon = {player: int(args.bosses_ganon[player]) for player in range(1, world.players + 1)} world.bosses_ganon = {player: int(args.bosses_ganon[player]) for player in range(1, world.players + 1)}
world.bosshunt_include_agas = args.bosshunt_include_agas.copy() world.bosshunt_include_agas = args.bosshunt_include_agas.copy()
world.owTerrain = args.ow_terrain.copy() world.owTerrain = args.ow_terrain.copy()
@@ -872,7 +852,6 @@ def copy_world(world):
ret.bosses_ganon = world.bosses_ganon.copy() ret.bosses_ganon = world.bosses_ganon.copy()
ret.bosshunt_include_agas = world.bosshunt_include_agas.copy() ret.bosshunt_include_agas = world.bosshunt_include_agas.copy()
ret.ganon_item = world.ganon_item.copy() ret.ganon_item = world.ganon_item.copy()
ret.require_ganon_item = world.require_ganon_item.copy()
ret.crystals_ganon_orig = world.crystals_ganon_orig.copy() ret.crystals_ganon_orig = world.crystals_ganon_orig.copy()
ret.crystals_gt_orig = world.crystals_gt_orig.copy() ret.crystals_gt_orig = world.crystals_gt_orig.copy()
ret.ganon_item_orig = world.ganon_item_orig.copy() ret.ganon_item_orig = world.ganon_item_orig.copy()
@@ -1107,7 +1086,6 @@ def copy_world_premature(world, player, create_flute_exits=True):
ret.bosses_ganon = world.bosses_ganon.copy() ret.bosses_ganon = world.bosses_ganon.copy()
ret.bosshunt_include_agas = world.bosshunt_include_agas.copy() ret.bosshunt_include_agas = world.bosshunt_include_agas.copy()
ret.ganon_item = world.ganon_item.copy() ret.ganon_item = world.ganon_item.copy()
ret.require_ganon_item = world.require_ganon_item.copy()
ret.crystals_ganon_orig = world.crystals_ganon_orig.copy() ret.crystals_ganon_orig = world.crystals_ganon_orig.copy()
ret.crystals_gt_orig = world.crystals_gt_orig.copy() ret.crystals_gt_orig = world.crystals_gt_orig.copy()
ret.ganon_item_orig = world.ganon_item_orig.copy() ret.ganon_item_orig = world.ganon_item_orig.copy()
@@ -1313,6 +1291,9 @@ def create_playthrough(world):
for location in sphere: for location in sphere:
if world.goal[location.player] == 'completionist': if world.goal[location.player] == 'completionist':
continue # every location for that player is required continue # every location for that player is required
if location.item.type == "SmallKey":
continue
# we remove the item at location and check if game is still beatable # we remove the item at location and check if game is still beatable
logging.getLogger('').debug('Checking if %s (Player %d) is required to beat the game.', location.item.name, location.item.player) logging.getLogger('').debug('Checking if %s (Player %d) is required to beat the game.', location.item.name, location.item.player)
old_item = location.item old_item = location.item

View File

@@ -509,7 +509,7 @@ boots_clips = [
mirror_clips_local = [ mirror_clips_local = [
('Desert East Mirror Clip', 'Mire Area', 'Desert Mouth'), ('Desert East Mirror Clip', 'Mire Area', 'Desert Mouth'),
('EDDM Bridge Mirror Clip', 'East Dark Death Mountain (Bottom Left)', 'East Dark Death Mountain (Bottom)'), ('EDDM Mirror Clip', 'East Dark Death Mountain (Bottom Left)', 'East Dark Death Mountain (Bottom)'),
('EDDM Mirror Clip', 'East Dark Death Mountain (Top)', 'Dark Death Mountain Ledge') ('EDDM Mirror Clip', 'East Dark Death Mountain (Top)', 'Dark Death Mountain Ledge')
] ]

83
Rom.py
View File

@@ -85,7 +85,7 @@ from Utils import int16_as_bytes, int32_as_bytes, local_path, snes_to_pc
from Versions import DRVersion, GKVersion, ORVersion from Versions import DRVersion, GKVersion, ORVersion
JAP10HASH = '03a63945398191337e896e5771f77173' JAP10HASH = '03a63945398191337e896e5771f77173'
RANDOMIZERBASEHASH = 'd80446af9eeb1726d2b6c1303bec1226' RANDOMIZERBASEHASH = '100c3e1da68680a0f3d8e1fc94568de6'
class JsonRom(object): class JsonRom(object):
@@ -948,7 +948,7 @@ def patch_rom(world, rom, player, team, is_mystery=False, rom_header=None):
rom.write_byte(cr_pc+0x1e, 0xEE) # slash rom.write_byte(cr_pc+0x1e, 0xEE) # slash
rom.write_byte(cr_pc+0x1f, thousands_bot) rom.write_byte(cr_pc+0x1f, thousands_bot)
# modify stat config # modify stat config
stat_address = 0xA39895 stat_address = 0x23983E
stat_pc = snes_to_pc(stat_address) stat_pc = snes_to_pc(stat_address)
rom.write_byte(stat_pc, 0xa9) # change to pos 21 (from b1) rom.write_byte(stat_pc, 0xa9) # change to pos 21 (from b1)
rom.write_byte(stat_pc+2, 0xc0) # change to 12 bits (from a0) rom.write_byte(stat_pc+2, 0xc0) # change to 12 bits (from a0)
@@ -1007,10 +1007,6 @@ def patch_rom(world, rom, player, team, is_mystery=False, rom_header=None):
rom.write_bytes(0x6D31B, [0x00, 0x00, 0xe4, 0xff, 0x08, 0x0E]) rom.write_bytes(0x6D31B, [0x00, 0x00, 0xe4, 0xff, 0x08, 0x0E])
rom.write_bytes(0x6D323, [0x00, 0x00, 0xe4, 0xff, 0x08, 0x0E]) rom.write_bytes(0x6D323, [0x00, 0x00, 0xe4, 0xff, 0x08, 0x0E])
bridge_item = world.get_location("Hobo", player).item
if bridge_item is None or not bridge_item.name.startswith("Bottle"):
rom.write_bytes(0x1E9C0, [0xFB, 0xFF, 0x03, 0x00, 0xAB, 0x00, 0x00, 0x00])
# set light cones # set light cones
if world.dark_rooms[player] == 'no_dark_rooms': if world.dark_rooms[player] == 'no_dark_rooms':
light_cone = 0x20 light_cone = 0x20
@@ -1450,14 +1446,9 @@ def patch_rom(world, rom, player, team, is_mystery=False, rom_header=None):
"bee": 0x10, "bee": 0x10,
"somaria": 0x11, "somaria": 0x11,
"byrna": 0x12, "byrna": 0x12,
"none": 0x7F, "none": 0xFF,
} }
ganon_item_value = ganon_item_byte[world.ganon_item[player]] rom.write_byte(0x18002E, ganon_item_byte[world.ganon_item[player]])
if world.require_ganon_item[player] and world.ganon_item[player] != "none":
if world.swords[player] != "swordless" or world.ganon_item[player] not in ["bombos", "ether", "quake"]:
ganon_item_value |= 0x80
rom.write_byte(0x18002E, ganon_item_value)
# block HC upstairs doors in rain state in standard mode # block HC upstairs doors in rain state in standard mode
prevent_rain = world.mode[player] == 'standard' and world.shuffle[player] != 'vanilla' and world.logic[player] != 'nologic' prevent_rain = world.mode[player] == 'standard' and world.shuffle[player] != 'vanilla' and world.logic[player] != 'nologic'
@@ -1506,40 +1497,37 @@ def patch_rom(world, rom, player, team, is_mystery=False, rom_header=None):
loot_source = 0x09 loot_source = 0x09
if world.prizeshuffle[player] != 'none': if world.prizeshuffle[player] != 'none':
loot_source |= 0x10 loot_source |= 0x10
if world.pottery[player] != 'none': if world.pottery[player] not in ['none', 'cave']:
loot_source |= 0x02 loot_source |= 0x02
if world.dropshuffle[player] != 'none': if world.dropshuffle[player] != 'none':
loot_source |= 0x04 loot_source |= 0x04
rom.write_byte(0x1CFF20, loot_source) rom.write_byte(0x1CFF10, loot_source)
if world.loothud[player] == 'never': if world.loothud[player] == 'never':
rom.write_bytes(0x1CFF10, [0x00, 0x00, 0x00, 0x00]) rom.write_byte(0x1CFF12, 0x00)
rom.write_byte(0x1CFF17, 0x00)
elif world.loothud[player] == 'presence': elif world.loothud[player] == 'presence':
rom.write_bytes(0x1CFF10, [0x01, 0x01, 0x00, 0x00]) rom.write_byte(0x1CFF12, 0x01)
rom.write_byte(0x1CFF17, 0x01) rom.write_bytes(0x1CFF0E, [0x01, 0x01])
elif world.loothud[player] == 'value': elif world.loothud[player] == 'value':
rom.write_bytes(0x1CFF10, [0x03, 0x03, 0x00, 0x00]) rom.write_byte(0x1CFF12, 0x01)
rom.write_byte(0x1CFF17, 0x01) rom.write_bytes(0x1CFF0E, [0xFF, 0xFF])
elif world.loothud[player] == 'dungeon_value': elif world.loothud[player] == 'dungeon_value':
rom.write_bytes(0x1CFF10, [0x01, 0x03, 0x00, 0x00]) rom.write_byte(0x1CFF12, 0x01)
rom.write_byte(0x1CFF17, 0x01) rom.write_bytes(0x1CFF0E, [0xFF, 0x01])
elif world.loothud[player] == 'cave_value':
rom.write_bytes(0x1CFF10, [0x03, 0x01, 0x00, 0x00])
rom.write_byte(0x1CFF17, 0x01)
if world.showloot[player] == 'never': if world.showloot[player] == 'never':
rom.write_bytes(0x1CFF08, [0x00, 0x00, 0x00, 0x00]) rom.write_bytes(0x1CFF08, [0x00, 0x00, 0x00, 0x00])
rom.write_byte(0x1CFF0F, 0x00) rom.write_byte(0x1CFF11, 0x00)
rom.write_byte(0x1CFF12, 0x00) # turn off hud icon too just to be safe
elif world.showloot[player] == 'presence': elif world.showloot[player] == 'presence':
rom.write_bytes(0x1CFF08, [0x01, 0x00, 0x00, 0x00]) rom.write_bytes(0x1CFF08, [0x01, 0x00, 0x00, 0x00])
rom.write_byte(0x1CFF0F, 0x01) rom.write_byte(0x1CFF11, 0x00)
elif world.showloot[player] == 'compass': elif world.showloot[player] == 'compass':
rom.write_bytes(0x1CFF08, [0x02, 0x00, 0x03, 0x00]) rom.write_bytes(0x1CFF08, [0x01, 0x00, 0x02, 0x00])
rom.write_byte(0x1CFF0F, 0x01) rom.write_byte(0x1CFF11, 0x01)
elif world.showloot[player] == 'always': elif world.showloot[player] == 'always':
rom.write_bytes(0x1CFF08, [0x03, 0x00, 0x00, 0x00]) rom.write_bytes(0x1CFF08, [0x02, 0x00, 0x00, 0x00])
rom.write_byte(0x1CFF0F, 0x01) rom.write_byte(0x1CFF11, 0x00)
if world.showmap[player] == 'visited': if world.showmap[player] == 'visited':
rom.write_bytes(0x1CFF00, [0x01, 0x00, 0x00, 0x05]) rom.write_bytes(0x1CFF00, [0x01, 0x00, 0x00, 0x05])
@@ -1553,7 +1541,7 @@ def patch_rom(world, rom, player, team, is_mystery=False, rom_header=None):
rom.write_byte(loot_icons + 0x52, 0x0B) # bomb bag is major rom.write_byte(loot_icons + 0x52, 0x0B) # bomb bag is major
triforce_piece_ids = [0x6B, 0x6C] triforce_piece_ids = [0x6B, 0x6C]
if world.treasure_hunt_count[player] > 100: if world.treasure_hunt_count[player] > 20:
for triforce_piece_id in triforce_piece_ids: for triforce_piece_id in triforce_piece_ids:
rom.write_byte(loot_icons + triforce_piece_id, 0x04) rom.write_byte(loot_icons + triforce_piece_id, 0x04)
@@ -1791,7 +1779,7 @@ def patch_rom(world, rom, player, team, is_mystery=False, rom_header=None):
rom.write_byte(0x180358, 0x01 if glitches_enabled else 0x00) rom.write_byte(0x180358, 0x01 if glitches_enabled else 0x00)
rom.write_byte(0x18008B, 0x01 if glitches_enabled else 0x00) rom.write_byte(0x18008B, 0x01 if glitches_enabled else 0x00)
if uncle_location.item is None or uncle_location.item.name not in ['Blue Shield', 'Red Shield', 'Mirror Shield', 'Progressive Shield', 'Sword and Shield']: if uncle_location.item is None or uncle_location.item.name not in ['Sword and Shield']:
# remove shield from uncle # remove shield from uncle
rom.write_bytes(0x6D253, [0x00, 0x00, 0xf6, 0xff, 0x00, 0x0E]) rom.write_bytes(0x6D253, [0x00, 0x00, 0xf6, 0xff, 0x00, 0x0E])
rom.write_bytes(0x6D25B, [0x00, 0x00, 0xf6, 0xff, 0x00, 0x0E]) rom.write_bytes(0x6D25B, [0x00, 0x00, 0xf6, 0xff, 0x00, 0x0E])
@@ -2026,14 +2014,6 @@ def write_custom_shops(rom, world, player):
if world.shopsanity[player] or shop.type == ShopType.TakeAny: if world.shopsanity[player] or shop.type == ShopType.TakeAny:
rom.write_byte(0x186E40 + shop.sram_address + index, 1) rom.write_byte(0x186E40 + shop.sram_address + index, 1)
if world.shopsanity[player] and shop.region.name in shop_to_location_table: if world.shopsanity[player] and shop.region.name in shop_to_location_table:
if shop.region.name == "Capacity Upgrade" and shop.item_count == 3:
if index == 1:
loc_item = ItemFactory(item['item'], player)
else:
if index == 2:
index = 1
loc_item = world.get_location(shop_to_location_table[shop.region.name][index], player).item
else:
loc_item = world.get_location(shop_to_location_table[shop.region.name][index], player).item loc_item = world.get_location(shop_to_location_table[shop.region.name][index], player).item
elif world.shopsanity[player] and shop.region.name in retro_shops: elif world.shopsanity[player] and shop.region.name in retro_shops:
loc_item = world.get_location(retro_shops[shop.region.name][index], player).item loc_item = world.get_location(retro_shops[shop.region.name][index], player).item
@@ -2505,15 +2485,6 @@ def write_strings(rom, world, player, team, is_mystery=False):
# For hints, first we write hints about entrances, some from the inconvenient list others from all reasonable entrances. # For hints, first we write hints about entrances, some from the inconvenient list others from all reasonable entrances.
if world.hints[player]: if world.hints[player]:
zoraitem = world.get_location('King Zora', player).item.hint_text
if len(zoraitem) <= 15:
tt['zora_meeting'] = f"Whaddaya want?\n{zoraitem.title()}\n Nothin'{{CHOICE}}"
else:
tt['zora_meeting'] = f"Do you want {zoraitem}?\n ≥ I'll pay\n No thanks{{CHOICE}}"
bottleitem = world.get_location('Bottle Merchant', player).item.hint_text
tt['bottle_vendor_choice'] = f"Do you want {bottleitem}?\n ≥ I'll take it\n No thanks!\n{{CHOICE}}"
tt['sign_north_of_links_house'] = '> Randomizer The telepathic tiles can have hints!' tt['sign_north_of_links_house'] = '> Randomizer The telepathic tiles can have hints!'
hint_locations = HintLocations.copy() hint_locations = HintLocations.copy()
random.shuffle(hint_locations) random.shuffle(hint_locations)
@@ -2944,13 +2915,7 @@ def write_strings(rom, world, player, team, is_mystery=False):
if world.custom_goals[player]['murahgoal'] and 'goaltext' in world.custom_goals[player]['murahgoal']: if world.custom_goals[player]['murahgoal'] and 'goaltext' in world.custom_goals[player]['murahgoal']:
tt['murahdahla'] = get_custom_goal_text('murahgoal') tt['murahdahla'] = get_custom_goal_text('murahgoal')
tavern_texts = random.sample(TavernMan_texts, 5) tt['kakariko_tavern_fisherman'] = TavernMan_texts[random.randint(0, len(TavernMan_texts) - 1)]
tt['tavern_old_man_awake'] = tavern_texts.pop()
tt['tavern_old_man_unactivated_flute'] = tavern_texts.pop()
tt['tavern_old_man_know_tree_unactivated_flute'] = tavern_texts.pop()
tt['tavern_old_man_have_flute'] = tavern_texts.pop()
tt['kakariko_tavern_fisherman'] = tavern_texts.pop()
pedestalitem = world.get_location('Master Sword Pedestal', player).item pedestalitem = world.get_location('Master Sword Pedestal', player).item
pedestal_text = 'Some Hot Air' if pedestalitem is None else hint_text(pedestalitem, True) if pedestalitem.pedestal_hint_text is not None else 'Unknown Item' pedestal_text = 'Some Hot Air' if pedestalitem is None else hint_text(pedestalitem, True) if pedestalitem.pedestal_hint_text is not None else 'Unknown Item'
@@ -2997,7 +2962,7 @@ def write_strings(rom, world, player, team, is_mystery=False):
+ "{PAUSE3} {CHANGEPIC}\nGanon has moved around all the items in Hyrule." + "{PAUSE3} {CHANGEPIC}\nGanon has moved around all the items in Hyrule."
+ "{PAUSE7}\nYou will have to find all the items necessary to achieve your goal." + "{PAUSE7}\nYou will have to find all the items necessary to achieve your goal."
+ "{PAUSE7}\nThis is your chance to be a hero." + "{PAUSE7}\nThis is your chance to be a hero."
+ "{PAUSE3} {CHANGEPIC}\nGood luck out there, and try not to die." + "{PAUSE3} {CHANGEPIC}\nYou must determine and achieve your goal."
+ "{PAUSE9} {CHANGEPIC}", False) + "{PAUSE9} {CHANGEPIC}", False)
elif world.mode[player] == 'inverted': elif world.mode[player] == 'inverted':
tt['intro_main'] = CompressedTextMapper.convert( tt['intro_main'] = CompressedTextMapper.convert(

View File

@@ -1026,11 +1026,10 @@ def global_rules(world, player):
world.get_location('Ganon', player), world.get_location('Ganon', player),
lambda state: state.has_beam_sword(player) lambda state: state.has_beam_sword(player)
and state.has_fire_source(player) and state.has_fire_source(player)
and (state.can_hit_stunned_ganon(player) or ( and (state.has('Tempered Sword', player) or state.has('Golden Sword', player)
not world.require_ganon_item[player] and ( or state.can_hit_stunned_ganon(player)
state.has('Tempered Sword', player) or state.has('Golden Sword', player)
or state.has('Lamp', player) or state.has('Lamp', player)
or state.can_extend_magic(player, 12))))) # need to light torch a sufficient amount of times or state.can_extend_magic(player, 12))) # need to light torch a sufficient amount of times
set_rule(world.get_entrance('Ganon Drop', player), lambda state: state.has_beam_sword(player)) # need to damage ganon to get tiles to drop set_rule(world.get_entrance('Ganon Drop', player), lambda state: state.has_beam_sword(player)) # need to damage ganon to get tiles to drop

219
Text.py
View File

@@ -50,18 +50,18 @@ Uncle_texts = [
"Don't worry.\nI got this\ncovered.", "Don't worry.\nI got this\ncovered.",
"Race you to\nthe castle!", "Race you to\nthe castle!",
"\n Hi", "\n Hi",
"I'm just going\nout for a\npack of smokes.", "I'M JUST GOING\nOUT FOR A\nPACK OF SMOKES",
"It's dangerous\nto go alone.\nSee ya!", "It's dangerous\nto go alone.\nSee ya!",
"Are you a bad\nenough dude to\nrescue Zelda?", "ARE YOU A BAD\nENOUGH DUDE TO\nRESCUE ZELDA?",
"\n\n I AM ERROR", "\n\n I AM ERROR",
"This seed is\nsub 2 hours,\nguaranteed.", "This seed is\nsub 2 hours,\nguaranteed.",
"The chest is\na secret to\neverybody.", "The chest is\na secret to\neverybody.",
"I'm off to\nfind the\nwind fish.", "I'm off to\nfind the\nwind fish.",
"The shortcut\nto Ganon\nis this way!", "The shortcut\nto Ganon\nis this way!",
"The moon is\ncrashing! Run\nfor your life!", "THE MOON IS\nCRASHING! RUN\nFOR YOUR LIFE!",
"Time to fight\nhe who must\nnot be named.", "Time to fight\nhe who must\nnot be named.",
"Red mail\nis for\ncowards.", "RED MAIL\nIS FOR\nCOWARDS.",
"Hey!\n\nListen!", "HEY!\n\nLISTEN!",
"Well\nexcuuuuuse me,\nprincess!", "Well\nexcuuuuuse me,\nprincess!",
"5,000 Rupee\nreward for >\nYou're boned.", "5,000 Rupee\nreward for >\nYou're boned.",
"Welcome to\nStoops Lonk's\nHoose", "Welcome to\nStoops Lonk's\nHoose",
@@ -230,92 +230,97 @@ Ganon1_texts = [
] ]
Ganon_Phase_3_No_Silvers_texts = [ Ganon_Phase_3_No_Silvers_texts = [
"Did you find\nthe arrows\non Planet Zebes?", "Did you find\nthe arrows on\nPlanet Zebes?",
"Did you find\nthe arrows?\nI think not.", "Did you find\nthe arrows?\nI think not.",
"Silver arrows?\nI have never\nheard of them.", "Silver arrows?\nI have never\nheard of them",
"Did you find\nthe arrows on\nThe Moon?", "Did you find\nthe arrows on\nThe Moon?",
"Did you find\nthe arrows\nin /dev/null?", "Did you find\nthe arrows\nIn dev null?",
"I have sold\nthe arrows for\na green big 20.", "I have sold\nthe arrows for\na green big 20",
"Did you find\nthe arrows in\nCount Dracula?", "Did you find\nthe arrows in\nCount Dracula?",
" Error 404\nSilver Arrows\n Not Found", "Error 404\nSilver arrows\nnot found.",
"No arrows\nfor you today.\nSorry.", "No arrows for\nyou today.\nSorry.",
"No arrows?\nCheck your\njunk mail." "No arrows?\nCheck your\njunk mail."
"Did you find\nthe arrows\nin Jabu's belly?", "Did you find\nthe arrows in\nJabu's belly?",
"Silver is not\nan appropriate\narrow material.", "Silver is not\nan appropriate\narrow material",
"Did you find\nthe arrows\nin nNarnia?", "Did you find\nthe arrows in\nNarnia?",
"Did you find\nthe arrows\nin nKefka's Tower.", "DID YOU FIND\nTHE ARROWS IN\nKEFKA'S TOWER",
"Did you find\nthe arrows\nin nyour Recycle Bin?", "Did you find\nthe arrows in\nyour Recycle Bin?",
"Silver Arrows?\n\nLUL", "Silver Arrows?\n\nLUL",
"\nImagine finding\nthe arrows.", "Imagine\nfinding the\narrows",
"Did you find\nthe arrows\nin scenic Ohio?", "Did you find\nsilvers in\nscenic Ohio?",
"Did you find\nthe arrows\nin •mumblemumble", "Did you find\nthe arrows in\n*mumblemumble*",
"Did you find\nthe arrows\nin the hourglass?", "Did you find\nthe arrows in\nthe hourglass?",
"\nSilver Arrows\nare so main branch.", "Silver Arrows\nare so v30",
"Did you find\nthe arrows\nin World 4-2?", "OH, NO, THEY\nACTUALLY SAID\nSILVER MARROW",
"Did you find\nthe arrows\nin Ghanti's ears?", "SURELY THE\nLEFTMOST TILES\nWILL STAY UP",
"Did you find\nthe arrows in\nWorld 4-2?",
"SILLY HERO,\nSILVER IS FOR\nWEREWOLVES!",
"Did you find\nthe silvers in\nGanti's ears",
] ]
Ganon_Phase_3_No_Weakness_texts = [ Ganon_Phase_3_No_Weakness_texts = [
"\n Error 404\nWeakness Not Found", "Error 404\nWeakness\nnot found.",
"No weakness\nfor you today.\nSorry.", "No weakness\nfor you today.\nSorry",
"Careful, all\nthat spinning\nmakes me dizzy.", "Careful, all\nthat spinning\nmakes me dizzy",
"Are you ready\nto spin\nto win?", "Are you ready\nTo spin\nTo win?",
"\nSpin To Win!\n", "\nSpin To Win!\n",
"Surely the\nleftmost tiles\nwill stay up!", "SURELY THE\nLEFTMOST TILES\nWILL STAY UP",
"You spin me\nright round\nlike a record.", "You Spin Me\nRight Round\nLike A Record",
"Oh, no, they\nactually said\nsilver •marrow•.", "SILLY HERO,\nSILVER IS FOR\nWEREWOLVES!",
"Silly hero,\nsilver is for\nwerewolves!",
] ]
TavernMan_texts = [ TavernMan_texts = [
"What do you call a blind dinosaur?\n\nA doyouthink-\nhesaurus.", "What do you\ncall a blind\ndinosaur?\na doyouthink-\nhesaurus.",
"What do ducks like to eat?\n\nQuackers!", "A blind man\nwalks into\na bar.\nAnd a table.\nAnd a chair.",
"How do you set up a party in space?\n\nYou planet!", "What do ducks\nlike to eat?\n\nQuackers!",
"I'm glad I know sign language.\nIt's pretty handy.", "How do you\nset up a party\nin space?\n\nYou planet!",
"What did Zelda say to Link at a secure door?\n\nTriforce!", "I'm glad I\nknow sign\nlanguage.\nIt's pretty\nhandy.",
"I am on a seafood diet.\n\nEvery time I see food, I eat it.", "What did Zelda\nsay to Link at\na secure door?\n\nTRIFORCE!",
"I've decided to sell my vacuum.\n\nIt was just gathering dust.", "I am on a\nseafood diet.\n\nEvery time\nI see food,\nI eat it.",
"What's the best time to go to the dentist?\n\nTooth-hurtie!", "I've decided\nto sell my\nvacuum.\nIt was just\ngathering\ndust.",
"Why can't a bike stand on its own?\n\nIt's two-tired!", "What's the best\ntime to go to\nthe dentist?\n\nTooth-hurtie!",
"If you haven't found Quake yet…\n\nit's not your fault.", "Why can't a\nbike stand on\nits own?\n\nIt's two-tired!",
"Why is Peter Pan always flying?\n\nBecause he Neverlands!", "If you haven't\nfound Quake\nyet…\nit's not your\nfault.",
"I once told a joke to Armos.\n\nBut he remained stone-faced!", "Why is Peter\nPan always\nflying?\nBecause he\nNeverlands!",
"Lanmola was late to our dinner party.\n\nHe just came for the desert", "I once told a\njoke to Armos.\n\nBut he\nremained\nstone-faced!",
"Moldorm is such a prankster.\n\nAnd I fall for it every time!", "Lanmola was\nlate to our\ndinner party.\nHe just came\nfor the desert",
"Helmasaur is throwing a party.\n\nI hope it's a masquerade!", "Moldorm is\nsuch a\nprankster.\nAnd I fall for\nit every time!",
"I'd like to know Arrghus better.\n\nBut he won't come out of his shell!", "Helmasaur is\nthrowing a\nparty.\nI hope it's\na masquerade!",
"Mothula didn't have much fun at the party.\n\nHe's immune to spiked punch!", "I'd like to\nknow Arrghus\nbetter.\nBut he won't\ncome out of\nhis shell!",
"Kholdstare is afraid to go to the circus.\n\nHungry kids thought he was cotton candy!", "Mothula didn't\nhave much fun\nat the party.\nHe's immune to\nspiked punch!",
"I asked who Vitreous' best friends are.\n\nHe said, \"Me, Myself, and Eye!\"", "Don't set me\nup with that\nchick from\nSteve's Town.\n\n\nI'm not\ninterested in\na Blind date!",
"Trinexx can be a hothead or he can be an ice guy. In the end, he's a solid individual!", "Kholdstare is\nafraid to go\nto the circus.\nHungry kids\nthought he was\ncotton candy!",
"Bari thought I had moved out of town.\n\nHe was shocked to see me!", "I asked who\nVitreous' best\nfriends are.\nHe said,\n'Me, Myself,\nand Eye!'",
"Don't argue with a frozen Deadrock.\n\nHe'll never change his position!", "Trinexx can be\na hothead or\nhe can be an\nice guy. In\nthe end, he's\na solid\nindividual!",
"I offered a drink to a self-loathing Ghini.\n\nHe said he didn't like spirits!", "Bari thought I\nhad moved out\nof town.\nHe was shocked\nto see me!",
"I was supposed to meet Gibdo for lunch.\n\nBut he got wrapped up in something!", "I can only get\nWeetabix\naround here.\nI have to go\nto Steve's\nTown for Count\nChocula!",
"Goriya sure has changed in this game.\n\nI hope he comes back around!", "Don't argue\nwith a frozen\nDeadrock.\nHe'll never\nchange his\nposition!",
"Hinox actually wants to be a lawyer.\n\nToo bad he bombed the bar exam!", "I offered a\ndrink to a\nself-loathing\nGhini.\nHe said he\ndidn't like\nspirits!",
"I'm surprised Moblin's tusks are so gross.\n\nHe always has his Trident with him!", "I was supposed\nto meet Gibdo\nfor lunch.\nBut he got\nwrapped up in\nsomething!",
"Don't tell Stalfos I'm here.\n\nHe has a bone to pick with me!", "Goriya sure\nhas changed\nin this game.\nI hope he\ncomes back\naround!",
"I got Wallmaster to help me move furniture.\n\nHe was really handy!", "Hinox actually\nwants to be a\nlawyer.\nToo bad he\nbombed the\nBar exam!",
"Wizzrobe was just here.\n\nHe always vanishes right before we get the check!", "I'm surprised\nMoblin's tusks\nare so gross.\nHe always has\nhis Trident\nwith him!",
"I shouldn't have picked up Zora's tab.\n\nThat guy drinks like a fish!", "Don't tell\nStalfos I'm\nhere.\nHe has a bone\nto pick with\nme!",
"I was sharing a drink with Poe.\n\nFor no reason, he left in a heartbeat!", "I got\nWallmaster to\nhelp me move\nfurniture.\nHe was really\nhandy!",
"Don't trust horsemen on Death Mountain.\n\nThey're Lynel the time!", "Wizzrobe was\njust here.\nHe always\nvanishes right\nbefore we get\nthe check!",
"Today's special is battered bat.\n\nGot slapped for offering a lady a Keese!", "I shouldn't\nhave picked up\nZora's tab.\nThat guy\ndrinks like\na fish!",
"Don't walk under propellered pineapples.\n\nYou may end up wearing a pee hat!", "I was sharing\na drink with\nPoe.\nFor no reason,\nhe left in a\nheartbeat!",
"My girlfriend burrowed under the sand.\n\nSo I decided to Leever!", "Don't trust\nhorsemen on\nDeath Mountain.\nThey're Lynel\nthe time!",
"Geldman wants to be a Broadway star.\n\nHe's always practicing Jazz Hands!", "Today's\nspecial is\nbattered bat.\nGot slapped\nfor offering a\nlady a Keese!",
"Octoballoon must be mad at me.\n\nHe blows up at the sight of me!", "Don't walk\nunder\npropellered\npineapples.\nYou may end up\nwearing\na pee hat!",
"Toppo is a total pothead.\n\nHe hates it when you take away his grass", "My girlfriend\nburrowed under\nthe sand.\nSo I decided\nto Leever!",
"I lost my shield by that house.\n\nWhy did they put up a Pikit fence?!", "Geldman wants\nto be a\nBroadway star.\nHe's always\npracticing\nJazz Hands!",
"Know that fox in Steve's Town?\n\nHe'll Pikku pockets if you aren't careful", "Octoballoon\nmust be mad\nat me.\nHe blows up\nat the sight\nof me!",
"Dash through Dark World bushes.\n\nYou'll see Ganon is tryin to Stal you!", "Toppo is a\ntotal pothead.\n\nHe hates it\nwhen you take\naway his grass",
"Eyegore!\n\nYou gore!\n\nWe all gore those jerks with arrows!", "I lost my\nshield by\nthat house.\nWhy did they\nput up a\nPikit fence?!",
"I like my whiskey neat.\n\nSome prefer it Octoroks!", "Know that fox\nin Steve's\nTown?\nHe'll Pikku\npockets if you\naren't careful",
"I consoled Freezor over a cup of coffee.\n\nHis problems just seemed to melt away!", "Dash through\nDark World\nbushes.\nYou'll see\nGanon is tryin\nto Stal you!",
"Magic droplets of water don't shut up.\n\nThey just Kyameron!", "Eyegore!\n\nYou gore!\nWe all gore\nthose jerks\nwith arrows!",
"I bought hot wings for Sluggula.\n\nThey gave him explosive diarrhea!", "I like my\nwhiskey neat.\n\nSome prefer it\nOctoroks!",
"Hardhat Beatle won't Let It Be?\n\nTell it to Get Back or give it a Ticket to Ride down a hole!", "I consoled\nFreezor over a\ncup of coffee.\nHis problems\njust seemed to\nmelt away!",
"Magic droplets\nof water don't\nshut up.\nThey just\nKyameron!",
"I bought hot\nwings for\nSluggula.\nThey gave him\nexplosive\ndiarrhea!",
"Hardhat Beetle\nwon't\nLet It Be?\nTell it to Get\nBack or give\nit a Ticket to\nRide down\na hole!",
] ]
junk_texts = [ junk_texts = [
@@ -344,15 +349,16 @@ junk_texts = [
] ]
KingsReturn_texts = [ KingsReturn_texts = [
"Who is this even", 'Who is this even',
'When did he get here', 'When did he get here',
'The Harem'
] * 2 + [ ] * 2 + [
"The Return of the King", "the return of the king",
"Fellowship of the Ring", "fellowship of the ring",
"The Two Towers", "the two towers",
] ]
Sanctuary_texts = [ Sanctuary_texts = [
"a priest's love" 'A Priest\'s love'
] * 2 + [ ] * 2 + [
"the loyal priest", "the loyal priest",
"read a book", "read a book",
@@ -370,30 +376,31 @@ Sahasrahla_names = [
Kakariko_texts = ["{}'s homecoming"] Kakariko_texts = ["{}'s homecoming"]
Blacksmiths_texts = [ Blacksmiths_texts = [
"Frogs for bread", 'frogs for bread',
"That's not a sword", 'That\'s not a sword',
"The rupeesmiths", 'The Rupeesmiths'
"The dwarven breadsmiths", ] * 1 + [
"the dwarven breadsmiths"
] ]
DeathMountain_texts = [ DeathMountain_texts = [
"The lost old man", "the lost old man",
"Gary the old man", "gary the old man",
"Your ad here", "Your ad here"
] ]
LostWoods_texts = [ LostWoods_texts = [
"Thieves' stump", 'thieves\' stump',
"Thieves' stump", ] * 2 + [
"The forest thief", "the forest thief",
"Dancing pickles", "dancing pickles",
"Flying crows", "flying crows",
] ]
WishingWell_texts = [ WishingWell_texts = [
"Venus, Queen of Faeries", "venus. queen of faeries",
"Venus was her name", "Venus was her name",
"I'm your Venus", "I'm your Venus",
"Yeah, baby, she's got it", "Yeah, baby, shes got it",
"Venus, I'm your fire", "Venus, I'm your fire",
"Venus, at your desire", "Venus, At your desire",
"Venus Love Chain", "Venus Love Chain",
"Venus Crescent Beam", "Venus Crescent Beam",
] ]
@@ -482,7 +489,7 @@ class Credits(object):
], ],
'pedestal': [ 'pedestal': [
SceneSmallCreditLine(19, 'and the master sword'), SceneSmallCreditLine(19, 'and the master sword'),
SceneSmallAltCreditLine(21, 'sleeps again'), SceneSmallAltCreditLine(21, 'sleeps again···'),
SceneLargeCreditLine(23, 'Forever!'), SceneLargeCreditLine(23, 'Forever!'),
], ],
} }
@@ -826,8 +833,6 @@ class CharTextMapper(object):
class RawMBTextMapper(CharTextMapper): class RawMBTextMapper(CharTextMapper):
char_map = {' ': 0xFF, char_map = {' ': 0xFF,
'/': 0x97,
'': 0x98,
'': 0x99, # Cursor '': 0x99, # Cursor
'': 0xC4, '': 0xC4,
'': 0xC5, '': 0xC5,
@@ -1311,8 +1316,7 @@ class GoldCreditMapper(CharTextMapper):
class GreenCreditMapper(CharTextMapper): class GreenCreditMapper(CharTextMapper):
char_map = {' ': 0x9F, char_map = {' ': 0x9F,
'': 0xFD, '.': 0x52,
'.': 0xFE,
'·': 0x52} '·': 0x52}
alpha_offset = -0x29 alpha_offset = -0x29
alpha_lower_offset = -0x29 alpha_lower_offset = -0x29
@@ -1762,7 +1766,7 @@ class TextTable(object):
text['sign_catfish'] = CompressedTextMapper.convert("Toss rocks\nToss items\nToss cookies") text['sign_catfish'] = CompressedTextMapper.convert("Toss rocks\nToss items\nToss cookies")
text['sign_north_village_of_outcasts'] = CompressedTextMapper.convert("↑ Skull Woods\n\n↓ Steve's Town") text['sign_north_village_of_outcasts'] = CompressedTextMapper.convert("↑ Skull Woods\n\n↓ Steve's Town")
text['sign_south_of_bumper_cave'] = CompressedTextMapper.convert("\n→ Karkats cave") text['sign_south_of_bumper_cave'] = CompressedTextMapper.convert("\n→ Karkats cave")
text['sign_east_of_pyramid'] = CompressedTextMapper.convert("\n→ Palace of Darkness") text['sign_east_of_pyramid'] = CompressedTextMapper.convert("\n Dark Palace")
text['sign_east_of_bomb_shop'] = CompressedTextMapper.convert("\n← Bomb Shoppe") text['sign_east_of_bomb_shop'] = CompressedTextMapper.convert("\n← Bomb Shoppe")
text['sign_east_of_mire'] = CompressedTextMapper.convert("\n← Misery Mire\n no way in.\n no way out.") text['sign_east_of_mire'] = CompressedTextMapper.convert("\n← Misery Mire\n no way in.\n no way out.")
text['sign_village_of_outcasts'] = CompressedTextMapper.convert("Have a Trulie Awesome Day!") text['sign_village_of_outcasts'] = CompressedTextMapper.convert("Have a Trulie Awesome Day!")
@@ -1866,7 +1870,7 @@ class TextTable(object):
# 100 # 100
text['dark_sanctuary_no'] = CompressedTextMapper.convert("Then go away!") text['dark_sanctuary_no'] = CompressedTextMapper.convert("Then go away!")
text['dark_sanctuary_hint_1'] = CompressedTextMapper.convert("There is a thief in the desert, he can open creepy chests that follow you. But now that we have that out of the way, Do you like my hair? I've spent eons getting it this way.") text['dark_sanctuary_hint_1'] = CompressedTextMapper.convert("There is a thief in the desert, he can open creepy chests that follow you. But now that we have that out of the way, Do you like my hair? I've spent eons getting it this way.")
text['dark_sanctuary_yes'] = CompressedTextMapper.convert("With crystals 5 and 6, you can find a great fairy in the pyramid.\n\nFlomp Flomp, Whizzle Whomp") text['dark_sanctuary_yes'] = CompressedTextMapper.convert("With Crystals 5&6, you can find a great fairy in the pyramid.\n\nFlomp Flomp, Whizzle Whomp")
text['dark_sanctuary_hint_2'] = CompressedTextMapper.convert( text['dark_sanctuary_hint_2'] = CompressedTextMapper.convert(
"All I can say is that my life is pretty plain,\n" "All I can say is that my life is pretty plain,\n"
+ "I like watchin' the puddles gather rain,\n" + "I like watchin' the puddles gather rain,\n"
@@ -2054,6 +2058,5 @@ class TextTable(object):
text['ganon_phase_3_silvers'] = CompressedTextMapper.convert("Oh no! Silver! My one true weakness!") text['ganon_phase_3_silvers'] = CompressedTextMapper.convert("Oh no! Silver! My one true weakness!")
text['murahdahla'] = CompressedTextMapper.convert("Hello @. I\nam Murahdahla, brother of\nSahasrahla and Aginah. Behold the power of\ninvisibility.\n{PAUSE3}\n… … …\nWait! You can see me? I knew I should have\nhidden in a hollow tree.") text['murahdahla'] = CompressedTextMapper.convert("Hello @. I\nam Murahdahla, brother of\nSahasrahla and Aginah. Behold the power of\ninvisibility.\n{PAUSE3}\n… … …\nWait! You can see me? I knew I should have\nhidden in a hollow tree.")
text['mastersword_pedestal_goal'] = CompressedTextMapper.convert("To claim thy reward, you must present all 3 Pendants of Virtue.") text['mastersword_pedestal_goal'] = CompressedTextMapper.convert("To claim thy reward, you must present all 3 Pendants of Virtue.")
text['orange_potion_refill'] = CompressedTextMapper.convert("This rare orange potion will give you infinite magic, but only until you die or quit the game.") text['end_pad_data'] = bytearray([0xfb])
text['end_pad_data'] = bytearray([0xFB])
text['terminator'] = bytearray([0xFF, 0xFF]) text['terminator'] = bytearray([0xFF, 0xFF])

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -378,10 +378,6 @@
"none" "none"
] ]
}, },
"require_ganon_item": {
"action": "store_true",
"type": "bool"
},
"beemizer": { "beemizer": {
"choices": [ "choices": [
"4", "3", "2", "1", "0" "4", "3", "2", "1", "0"
@@ -495,8 +491,7 @@
"never", "never",
"presence", "presence",
"value", "value",
"dungeon_value", "dungeon_value"
"cave_value"
] ]
}, },
"showmap": { "showmap": {
@@ -763,10 +758,6 @@
"type": "str", "type": "str",
"help": "suppress" "help": "suppress"
}, },
"orange_potion": {
"action": "store_true",
"help": "suppress"
},
"settingsonload": { "settingsonload": {
"choices": [ "choices": [
"default", "default",

264
vanilla_placements.yaml Normal file
View File

@@ -0,0 +1,264 @@
item_pool_adjust:
1:
"Bottle (Random)": -4
"Bottle": 4
"Fighter Sword": -1
"Blue Shield": -1
"Sword and Shield": 1
"Bombs (10)": -1
"Bombs (3)": 1
"Arrows (10)": -1
"Rupees (20)": 2
placements:
1:
"Master Sword Pedestal": Master Sword
"Mushroom": Mushroom
"Ether Tablet": Ether
"Spectacle Rock": Piece of Heart
"Old Man": Magic Mirror
"Floating Island": Piece of Heart
"King Zora": Flippers
"Zora's Ledge": Piece of Heart
"Bottle Merchant": Bottle
"Maze Race": Piece of Heart
"Flute Spot": Ocarina
"Hobo": Bottle
"Desert Ledge": Piece of Heart
"Bombos Tablet": Bombos
"Lake Hylia Island": Piece of Heart
"Purple Chest": Bottle
"Sunken Treasure": Piece of Heart
"Bumper Cave Ledge": Piece of Heart
"Catfish": Quake
"Pyramid": Piece of Heart
"Digging Game": Piece of Heart
"Stumpy": Shovel
"Lost Woods Hideout": Piece of Heart
"Lumberjack Tree": Piece of Heart
"Spectacle Rock Cave": Piece of Heart
"Spiral Cave": Rupees (50)
"Mimic Cave": Piece of Heart
"Paradox Cave Lower - Far Left": Rupees (20)
"Paradox Cave Lower - Left": Rupees (20)
"Paradox Cave Lower - Right": Rupees (20)
"Paradox Cave Lower - Far Right": Rupees (20)
"Paradox Cave Lower - Middle": Rupees (20)
"Paradox Cave Upper - Left": Bombs (3)
"Paradox Cave Upper - Right": Arrows (10)
"Waterfall Fairy - Left": Red Boomerang
"Waterfall Fairy - Right": Red Shield
"Bonk Rock Cave": Piece of Heart
"Graveyard Cave": Piece of Heart
"King's Tomb": Cape
"Potion Shop": Magic Powder
"Kakariko Well - Left": Rupees (20)
"Kakariko Well - Middle": Rupees (20)
"Kakariko Well - Right": Rupees (20)
"Kakariko Well - Bottom": Bombs (3)
"Kakariko Well - Top": Piece of Heart
"Blind's Hideout - Left": Rupees (20)
"Blind's Hideout - Right": Rupees (20)
"Blind's Hideout - Far Left": Rupees (20)
"Blind's Hideout - Far Right": Rupees (20)
"Blind's Hideout - Top": Piece of Heart
"Chicken House": Arrows (10) # Blue Boomerang that turns into 10 arrows
"Sick Kid": Bug Catching Net
"Kakariko Tavern": Bottle
"Link's Uncle": Sword and Shield
"Secret Passage": Rupees (5) # Lamp that turns into blue rupee
"Sahasrahla's Hut - Left": Rupees (50)
"Sahasrahla's Hut - Middle": Bombs (3)
"Sahasrahla's Hut - Right": Rupees (50)
"Sahasrahla": Pegasus Boots
"Blacksmith": Tempered Sword
"Magic Bat": Magic Upgrade (1/2)
"Library": Book of Mudora
"Link's House": Rupees (5) # Lamp that turns into blue rupee
"Checkerboard Cave": Piece of Heart
"Aginah's Cave": Piece of Heart
"Cave 45": Piece of Heart
"Mini Moldorm Cave - Far Left": Bombs (3)
"Mini Moldorm Cave - Left": Rupees (20)
"Mini Moldorm Cave - Right": Rupees (20)
"Mini Moldorm Cave - Far Right": Arrows (10)
"Mini Moldorm Cave - Generous Guy": Rupees (300)
"Ice Rod Cave": Ice Rod
"Floodgate Chest": Bombs (3)
"Spike Cave": Cane of Byrna
"Hookshot Cave - Bottom Right": Rupees (50)
"Hookshot Cave - Top Right": Rupees (50)
"Hookshot Cave - Top Left": Rupees (50)
"Hookshot Cave - Bottom Left": Rupees (50)
"Superbunny Cave - Top": Bombs (3)
"Superbunny Cave - Bottom": Rupees (20)
"Chest Game": Piece of Heart
"C-Shaped House": Rupees (300)
"Brewery": Rupees (300) # Red Boomerang that turns into 300 rupees
"Pyramid Fairy - Left": Golden Sword
"Pyramid Fairy - Right": Silver Arrows
"Peg Cave": Piece of Heart
"Mire Shed - Left": Piece of Heart
"Mire Shed - Right": Rupees (20)
"Hype Cave - Top": Rupees (20)
"Hype Cave - Middle Right": Rupees (20)
"Hype Cave - Middle Left": Rupees (20)
"Hype Cave - Bottom": Rupees (20)
"Hype Cave - Generous Guy": Rupees (300)
"Hyrule Castle - Map Chest": Map (Escape)
"Hyrule Castle - Boomerang Chest": Blue Boomerang
"Hyrule Castle - Zelda's Chest": Lamp
"Sewers - Dark Cross": Small Key (Escape)
"Sewers - Secret Room - Left": Bombs (3)
"Sewers - Secret Room - Middle": Rupees (300)
"Sewers - Secret Room - Right": Arrows (10)
"Sanctuary": Sanctuary Heart Container
"Eastern Palace - Cannonball Chest": Rupees (100)
"Eastern Palace - Map Chest": Map (Eastern Palace)
"Eastern Palace - Compass Chest": Compass (Eastern Palace)
"Eastern Palace - Big Chest": Bow
"Eastern Palace - Big Key Chest": Big Key (Eastern Palace)
"Eastern Palace - Boss": Boss Heart Container
"Eastern Palace - Prize": Green Pendant
"Desert Palace - Compass Chest": Compass (Desert Palace)
"Desert Palace - Big Key Chest": Big Key (Desert Palace)
"Desert Palace - Map Chest": Map (Desert Palace)
"Desert Palace - Torch": Small Key (Desert Palace)
"Desert Palace - Big Chest": Power Glove
"Desert Palace - Boss": Boss Heart Container
"Desert Palace - Prize": Blue Pendant
"Tower of Hera - Map Chest": Map (Tower of Hera)
"Tower of Hera - Basement Cage": Small Key (Tower of Hera)
"Tower of Hera - Big Key Chest": Big Key (Tower of Hera)
"Tower of Hera - Compass Chest": Compass (Tower of Hera)
"Tower of Hera - Big Chest": Moon Pearl
"Tower of Hera - Boss": Boss Heart Container
"Tower of Hera - Prize": Red Pendant
"Castle Tower - Room 03": Small Key (Agahnims Tower)
"Castle Tower - Dark Maze": Small Key (Agahnims Tower)
"Palace of Darkness - Shooter Room": Small Key (Palace of Darkness)
"Palace of Darkness - The Arena - Bridge": Small Key (Palace of Darkness)
"Palace of Darkness - The Arena - Ledge": Small Key (Palace of Darkness)
"Palace of Darkness - Map Chest": Map (Palace of Darkness)
"Palace of Darkness - Stalfos Basement": Small Key (Palace of Darkness)
"Palace of Darkness - Big Key Chest": Big Key (Palace of Darkness)
"Palace of Darkness - Dark Maze - Top": Bombs (3)
"Palace of Darkness - Dark Maze - Bottom": Rupees (5)
# "Palace of Darkness - Dark Maze - Bottom": Small Key (Palace of Darkness)
"Palace of Darkness - Big Chest": Hammer
"Palace of Darkness - Compass Chest": Compass (Palace of Darkness)
"Palace of Darkness - Dark Basement - Left": Single Arrow
"Palace of Darkness - Dark Basement - Right": Small Key (Palace of Darkness)
"Palace of Darkness - Harmless Hellway": Small Key (Palace of Darkness)
# "Palace of Darkness - Harmless Hellway": Rupees (5)
"Palace of Darkness - Boss": Boss Heart Container
"Palace of Darkness - Prize": Crystal 1
"Swamp Palace - Entrance": Small Key (Swamp Palace)
"Swamp Palace - Map Chest": Map (Swamp Palace)
"Swamp Palace - Big Chest": Hookshot
"Swamp Palace - Compass Chest": Compass (Swamp Palace)
"Swamp Palace - Big Key Chest": Big Key (Swamp Palace)
"Swamp Palace - West Chest": Rupees (20)
"Swamp Palace - Flooded Room - Left": Rupees (20)
"Swamp Palace - Flooded Room - Right": Rupees (20)
"Swamp Palace - Waterfall Room": Rupees (20)
"Swamp Palace - Boss": Boss Heart Container
"Swamp Palace - Prize": Crystal 2
"Skull Woods - Map Chest": Map (Skull Woods)
"Skull Woods - Big Chest": Fire Rod
"Skull Woods - Pinball Room": Small Key (Skull Woods)
"Skull Woods - Pot Prison": Small Key (Skull Woods)
"Skull Woods - Compass Chest": Compass (Skull Woods)
"Skull Woods - Big Key Chest": Big Key (Skull Woods)
"Skull Woods - Bridge Room": Small Key (Skull Woods)
"Skull Woods - Boss": Boss Heart Container
"Skull Woods - Prize": Crystal 3
"Thieves' Town - Map Chest": Map (Thieves Town)
"Thieves' Town - Ambush Chest": Rupees (20)
"Thieves' Town - Compass Chest": Compass (Thieves Town)
"Thieves' Town - Big Key Chest": Big Key (Thieves Town)
"Thieves' Town - Attic": Bombs (3)
"Thieves' Town - Blind's Cell": Small Key (Thieves Town)
"Thieves' Town - Big Chest": Titans Mitts
"Thieves' Town - Boss": Boss Heart Container
"Thieves' Town - Prize": Crystal 4
"Ice Palace - Compass Chest": Compass (Ice Palace)
"Ice Palace - Big Key Chest": Big Key (Ice Palace)
"Ice Palace - Spike Room": Small Key (Ice Palace)
"Ice Palace - Map Chest": Map (Ice Palace)
"Ice Palace - Freezor Chest": Bombs (3)
"Ice Palace - Iced T Room": Small Key (Ice Palace)
"Ice Palace - Big Chest": Blue Mail
"Ice Palace - Boss": Boss Heart Container
"Ice Palace - Prize": Crystal 5
"Misery Mire - Main Lobby": Small Key (Misery Mire)
"Misery Mire - Big Chest": Cane of Somaria
"Misery Mire - Map Chest": Map (Misery Mire)
"Misery Mire - Spike Chest": Small Key (Misery Mire)
"Misery Mire - Bridge Chest": Small Key (Misery Mire)
"Misery Mire - Compass Chest": Compass (Misery Mire)
"Misery Mire - Big Key Chest": Big Key (Misery Mire)
"Misery Mire - Boss": Boss Heart Container
"Misery Mire - Prize": Crystal 6
"Turtle Rock - Compass Chest": Compass (Turtle Rock)
"Turtle Rock - Roller Room - Left": Map (Turtle Rock)
"Turtle Rock - Roller Room - Right": Small Key (Turtle Rock)
"Turtle Rock - Chain Chomps": Small Key (Turtle Rock)
"Turtle Rock - Big Key Chest": Big Key (Turtle Rock)
"Turtle Rock - Big Chest": Mirror Shield
"Turtle Rock - Crystaroller Room": Small Key (Turtle Rock)
"Turtle Rock - Eye Bridge - Bottom Left": Small Key (Turtle Rock)
"Turtle Rock - Eye Bridge - Bottom Right": Rupees (20)
"Turtle Rock - Eye Bridge - Top Left": Rupees (5)
"Turtle Rock - Eye Bridge - Top Right": Rupee (1)
"Turtle Rock - Boss": Boss Heart Container
"Turtle Rock - Prize": Crystal 7
"Ganons Tower - Bob's Torch": Small Key (Ganons Tower)
"Ganons Tower - Hope Room - Left": Arrows (10)
"Ganons Tower - Hope Room - Right": Bombs (3)
"Ganons Tower - Big Chest": Red Mail
"Ganons Tower - Bob's Chest": Arrows (10)
"Ganons Tower - Tile Room": Small Key (Ganons Tower)
"Ganons Tower - Compass Room - Top Left": Compass (Ganons Tower)
"Ganons Tower - Compass Room - Top Right": Rupee (1)
"Ganons Tower - Compass Room - Bottom Left": Rupees (20)
"Ganons Tower - Compass Room - Bottom Right": Arrows (10)
"Ganons Tower - Map Chest": Map (Ganons Tower)
"Ganons Tower - Firesnake Room": Small Key (Ganons Tower)
"Ganons Tower - DMs Room - Top Left": Bombs (3)
"Ganons Tower - DMs Room - Top Right": Arrows (10)
"Ganons Tower - DMs Room - Bottom Left": Rupees (20)
"Ganons Tower - DMs Room - Bottom Right": Rupees (20)
"Ganons Tower - Randomizer Room - Top Left": Arrows (10)
"Ganons Tower - Randomizer Room - Top Right": Arrows (10)
"Ganons Tower - Randomizer Room - Bottom Left": Bombs (3)
"Ganons Tower - Randomizer Room - Bottom Right": Bombs (3)
"Ganons Tower - Big Key Room - Left": Arrows (10)
"Ganons Tower - Big Key Room - Right": Bombs (3)
"Ganons Tower - Big Key Chest": Big Key (Ganons Tower)
"Ganons Tower - Mini Helmasaur Room - Left": Bombs (3)
"Ganons Tower - Mini Helmasaur Room - Right": Bombs (3)
"Ganons Tower - Pre-Moldorm Chest": Small Key (Ganons Tower)
"Ganons Tower - Validation Chest": Rupees (20)
drops:
1:
Pack 1: ["Small Heart", "Small Heart", "Small Heart", "Small Heart", "Rupee (1)", "Small Heart", "Small Heart", "Rupee (1)"]
Pack 2: ["Rupees (5)", "Rupee (1)", "Rupees (5)", "Rupees (20)", "Rupees (5)", "Rupee (1)", "Rupees (5)", "Rupees (5)"]
Pack 3: ["Big Magic", "Small Magic", "Small Magic", "Rupees (5)", "Big Magic", "Small Magic", "Small Heart", "Small Magic"]
Pack 4: ["Single Bomb", "Single Bomb", "Single Bomb", "Bombs (4)", "Single Bomb", "Single Bomb", "Bombs (8)", "Single Bomb"]
Pack 5: ["Arrows (5)", "Small Heart", "Arrows (5)", "Arrows (10)", "Arrows (5)", "Small Heart", "Arrows (5)", "Arrows (10)"]
Pack 6: ["Small Magic", "Rupee (1)", "Small Heart", "Arrows (5)", "Small Magic", "Single Bomb", "Rupee (1)", "Small Heart"]
Pack 7: ["Small Heart", "Fairy", "Big Magic", "Rupees (20)", "Bombs (8)", "Small Heart", "Rupees (20)", "Arrows (10)"]
Tree Pull Tier 1: "Rupee (1)"
Tree Pull Tier 2: "Rupees (5)"
Tree Pull Tier 3: "Rupees (20)"
Crab Normal: "Rupee (1)"
Crab Special: "Rupees (20)"
Stun Prize: "Rupee (1)"
Fish: "Rupees (20)"
medallions:
1:
"Misery Mire": Ether
"Turtle Rock": Quake

View File

@@ -0,0 +1,265 @@
item_pool_adjust:
1:
"Bottle (Random)": -4
"Bottle": 4
"Fighter Sword": -1
"Blue Shield": -1
"Sword and Shield": 1
"Bombs (10)": -1
"Bombs (3)": 1
"Arrows (10)": -1
"Rupees (20)": -8
"Small Key (Universal)": 5
placements:
1:
"Master Sword Pedestal": Master Sword
"Mushroom": Mushroom
"Ether Tablet": Ether
"Spectacle Rock": Piece of Heart
"Old Man": Magic Mirror
"Floating Island": Piece of Heart
"King Zora": Flippers
"Zora's Ledge": Piece of Heart
"Bottle Merchant": Bottle
"Maze Race": Piece of Heart
"Flute Spot": Ocarina
"Hobo": Bottle
"Desert Ledge": Piece of Heart
"Bombos Tablet": Bombos
"Lake Hylia Island": Piece of Heart
"Purple Chest": Bottle
"Sunken Treasure": Piece of Heart
"Bumper Cave Ledge": Piece of Heart
"Catfish": Quake
"Pyramid": Piece of Heart
"Digging Game": Piece of Heart
"Stumpy": Shovel
"Lost Woods Hideout": Piece of Heart
"Lumberjack Tree": Piece of Heart
"Spectacle Rock Cave": Piece of Heart
"Spiral Cave": Rupees (50)
"Mimic Cave": Piece of Heart
"Paradox Cave Lower - Far Left": Rupees (20)
"Paradox Cave Lower - Left": Rupees (20)
"Paradox Cave Lower - Right": Rupees (20)
"Paradox Cave Lower - Far Right": Rupees (20)
"Paradox Cave Lower - Middle": Rupees (20)
"Paradox Cave Upper - Left": Bombs (3)
"Paradox Cave Upper - Right": Arrows (10)
"Waterfall Fairy - Left": Red Boomerang
"Waterfall Fairy - Right": Red Shield
"Bonk Rock Cave": Piece of Heart
"Graveyard Cave": Piece of Heart
"King's Tomb": Cape
"Potion Shop": Magic Powder
"Kakariko Well - Left": Rupees (20)
"Kakariko Well - Middle": Rupees (20)
"Kakariko Well - Right": Rupees (20)
"Kakariko Well - Bottom": Bombs (3)
"Kakariko Well - Top": Piece of Heart
"Blind's Hideout - Left": Rupees (20)
"Blind's Hideout - Right": Rupees (20)
"Blind's Hideout - Far Left": Rupees (20)
"Blind's Hideout - Far Right": Rupees (20)
"Blind's Hideout - Top": Piece of Heart
"Chicken House": Arrows (10) # Blue Boomerang that turns into 10 arrows
"Sick Kid": Bug Catching Net
"Kakariko Tavern": Bottle
"Link's Uncle": Sword and Shield
"Secret Passage": Rupees (5) # Lamp that turns into blue rupee
"Sahasrahla's Hut - Left": Rupees (50)
"Sahasrahla's Hut - Middle": Bombs (3)
"Sahasrahla's Hut - Right": Rupees (50)
"Sahasrahla": Pegasus Boots
"Blacksmith": Tempered Sword
"Magic Bat": Magic Upgrade (1/2)
"Library": Book of Mudora
"Link's House": Rupees (5) # Lamp that turns into blue rupee
"Checkerboard Cave": Piece of Heart
"Aginah's Cave": Piece of Heart
"Cave 45": Piece of Heart
"Mini Moldorm Cave - Far Left": Bombs (3)
"Mini Moldorm Cave - Left": Rupees (20)
"Mini Moldorm Cave - Right": Rupees (20)
"Mini Moldorm Cave - Far Right": Arrows (10)
"Mini Moldorm Cave - Generous Guy": Rupees (300)
"Ice Rod Cave": Ice Rod
"Floodgate Chest": Bombs (3)
"Spike Cave": Cane of Byrna
"Hookshot Cave - Bottom Right": Rupees (50)
"Hookshot Cave - Top Right": Rupees (50)
"Hookshot Cave - Top Left": Rupees (50)
"Hookshot Cave - Bottom Left": Rupees (50)
"Superbunny Cave - Top": Bombs (3)
"Superbunny Cave - Bottom": Rupees (20)
"Chest Game": Piece of Heart
"C-Shaped House": Rupees (300)
"Brewery": Rupees (300) # Red Boomerang that turns into 300 rupees
"Pyramid Fairy - Left": Golden Sword
"Pyramid Fairy - Right": Silver Arrows
"Peg Cave": Piece of Heart
"Mire Shed - Left": Piece of Heart
"Mire Shed - Right": Rupees (20)
"Hype Cave - Top": Rupees (20)
"Hype Cave - Middle Right": Rupees (20)
"Hype Cave - Middle Left": Rupees (20)
"Hype Cave - Bottom": Rupees (20)
"Hype Cave - Generous Guy": Rupees (300)
"Hyrule Castle - Map Chest": Map (Escape)
"Hyrule Castle - Boomerang Chest": Blue Boomerang
"Hyrule Castle - Zelda's Chest": Lamp
"Sewers - Dark Cross": Small Key (Universal)
"Sewers - Secret Room - Left": Bombs (3)
"Sewers - Secret Room - Middle": Rupees (300)
"Sewers - Secret Room - Right": Arrows (10)
"Sanctuary": Sanctuary Heart Container
"Eastern Palace - Cannonball Chest": Rupees (100)
"Eastern Palace - Map Chest": Map (Eastern Palace)
"Eastern Palace - Compass Chest": Compass (Eastern Palace)
"Eastern Palace - Big Chest": Bow
"Eastern Palace - Big Key Chest": Big Key (Eastern Palace)
"Eastern Palace - Boss": Boss Heart Container
"Eastern Palace - Prize": Green Pendant
"Desert Palace - Compass Chest": Compass (Desert Palace)
"Desert Palace - Big Key Chest": Big Key (Desert Palace)
"Desert Palace - Map Chest": Map (Desert Palace)
"Desert Palace - Torch": Small Key (Universal)
"Desert Palace - Big Chest": Power Glove
"Desert Palace - Boss": Boss Heart Container
"Desert Palace - Prize": Blue Pendant
"Tower of Hera - Map Chest": Map (Tower of Hera)
"Tower of Hera - Basement Cage": Small Key (Universal)
"Tower of Hera - Big Key Chest": Big Key (Tower of Hera)
"Tower of Hera - Compass Chest": Compass (Tower of Hera)
"Tower of Hera - Big Chest": Moon Pearl
"Tower of Hera - Boss": Boss Heart Container
"Tower of Hera - Prize": Red Pendant
"Castle Tower - Room 03": Small Key (Universal)
"Castle Tower - Dark Maze": Small Key (Universal)
"Palace of Darkness - Shooter Room": Small Key (Universal)
"Palace of Darkness - The Arena - Bridge": Small Key (Universal)
"Palace of Darkness - The Arena - Ledge": Small Key (Universal)
"Palace of Darkness - Map Chest": Map (Palace of Darkness)
"Palace of Darkness - Stalfos Basement": Small Key (Universal)
"Palace of Darkness - Big Key Chest": Big Key (Palace of Darkness)
"Palace of Darkness - Dark Maze - Top": Bombs (3)
"Palace of Darkness - Dark Maze - Bottom": Small Key (Universal)
"Palace of Darkness - Big Chest": Hammer
"Palace of Darkness - Compass Chest": Compass (Palace of Darkness)
"Palace of Darkness - Dark Basement - Left": Single Arrow
"Palace of Darkness - Dark Basement - Right": Small Key (Universal)
"Palace of Darkness - Harmless Hellway": Rupees (5)
"Palace of Darkness - Boss": Boss Heart Container
"Palace of Darkness - Prize": Crystal 1
"Swamp Palace - Entrance": Small Key (Universal)
"Swamp Palace - Map Chest": Map (Swamp Palace)
"Swamp Palace - Big Chest": Hookshot
"Swamp Palace - Compass Chest": Compass (Swamp Palace)
"Swamp Palace - Big Key Chest": Big Key (Swamp Palace)
"Swamp Palace - West Chest": Rupees (20)
"Swamp Palace - Flooded Room - Left": Rupees (20)
"Swamp Palace - Flooded Room - Right": Rupees (20)
"Swamp Palace - Waterfall Room": Rupees (20)
"Swamp Palace - Boss": Boss Heart Container
"Swamp Palace - Prize": Crystal 2
"Skull Woods - Map Chest": Map (Skull Woods)
"Skull Woods - Big Chest": Fire Rod
"Skull Woods - Pinball Room": Small Key (Universal)
"Skull Woods - Pot Prison": Small Key (Universal)
"Skull Woods - Compass Chest": Compass (Skull Woods)
"Skull Woods - Big Key Chest": Big Key (Skull Woods)
"Skull Woods - Bridge Room": Small Key (Universal)
"Skull Woods - Boss": Boss Heart Container
"Skull Woods - Prize": Crystal 3
"Thieves' Town - Map Chest": Map (Thieves Town)
"Thieves' Town - Ambush Chest": Rupees (20)
"Thieves' Town - Compass Chest": Compass (Thieves Town)
"Thieves' Town - Big Key Chest": Big Key (Thieves Town)
"Thieves' Town - Attic": Bombs (3)
"Thieves' Town - Blind's Cell": Small Key (Universal)
"Thieves' Town - Big Chest": Titans Mitts
"Thieves' Town - Boss": Boss Heart Container
"Thieves' Town - Prize": Crystal 4
"Ice Palace - Compass Chest": Compass (Ice Palace)
"Ice Palace - Big Key Chest": Big Key (Ice Palace)
"Ice Palace - Spike Room": Small Key (Universal)
"Ice Palace - Map Chest": Map (Ice Palace)
"Ice Palace - Freezor Chest": Bombs (3)
"Ice Palace - Iced T Room": Small Key (Universal)
"Ice Palace - Big Chest": Blue Mail
"Ice Palace - Boss": Boss Heart Container
"Ice Palace - Prize": Crystal 5
"Misery Mire - Main Lobby": Small Key (Universal)
"Misery Mire - Big Chest": Cane of Somaria
"Misery Mire - Map Chest": Map (Misery Mire)
"Misery Mire - Spike Chest": Small Key (Universal)
"Misery Mire - Bridge Chest": Small Key (Universal)
"Misery Mire - Compass Chest": Compass (Misery Mire)
"Misery Mire - Big Key Chest": Big Key (Misery Mire)
"Misery Mire - Boss": Boss Heart Container
"Misery Mire - Prize": Crystal 6
"Turtle Rock - Compass Chest": Compass (Turtle Rock)
"Turtle Rock - Roller Room - Left": Map (Turtle Rock)
"Turtle Rock - Roller Room - Right": Small Key (Universal)
"Turtle Rock - Chain Chomps": Small Key (Universal)
"Turtle Rock - Big Key Chest": Big Key (Turtle Rock)
"Turtle Rock - Big Chest": Mirror Shield
"Turtle Rock - Crystaroller Room": Small Key (Universal)
"Turtle Rock - Eye Bridge - Bottom Left": Small Key (Universal)
"Turtle Rock - Eye Bridge - Bottom Right": Rupees (20)
"Turtle Rock - Eye Bridge - Top Left": Rupees (5)
"Turtle Rock - Eye Bridge - Top Right": Rupee (1)
"Turtle Rock - Boss": Boss Heart Container
"Turtle Rock - Prize": Crystal 7
"Ganons Tower - Bob's Torch": Small Key (Universal)
"Ganons Tower - Hope Room - Left": Arrows (10)
"Ganons Tower - Hope Room - Right": Bombs (3)
"Ganons Tower - Big Chest": Red Mail
"Ganons Tower - Bob's Chest": Arrows (10)
"Ganons Tower - Tile Room": Small Key (Universal)
"Ganons Tower - Compass Room - Top Left": Compass (Ganons Tower)
"Ganons Tower - Compass Room - Top Right": Rupee (1)
"Ganons Tower - Compass Room - Bottom Left": Rupees (20)
"Ganons Tower - Compass Room - Bottom Right": Arrows (10)
"Ganons Tower - Map Chest": Map (Ganons Tower)
"Ganons Tower - Firesnake Room": Small Key (Universal)
"Ganons Tower - DMs Room - Top Left": Bombs (3)
"Ganons Tower - DMs Room - Top Right": Arrows (10)
"Ganons Tower - DMs Room - Bottom Left": Rupees (20)
"Ganons Tower - DMs Room - Bottom Right": Rupees (20)
"Ganons Tower - Randomizer Room - Top Left": Arrows (10)
"Ganons Tower - Randomizer Room - Top Right": Arrows (10)
"Ganons Tower - Randomizer Room - Bottom Left": Bombs (3)
"Ganons Tower - Randomizer Room - Bottom Right": Bombs (3)
"Ganons Tower - Big Key Room - Left": Arrows (10)
"Ganons Tower - Big Key Room - Right": Bombs (3)
"Ganons Tower - Big Key Chest": Big Key (Ganons Tower)
"Ganons Tower - Mini Helmasaur Room - Left": Bombs (3)
"Ganons Tower - Mini Helmasaur Room - Right": Bombs (3)
"Ganons Tower - Pre-Moldorm Chest": Small Key (Universal)
"Ganons Tower - Validation Chest": Rupees (20)
drops:
1:
Pack 1: ["Small Heart", "Small Heart", "Small Heart", "Small Heart", "Rupee (1)", "Small Heart", "Small Heart", "Rupee (1)"]
Pack 2: ["Rupees (5)", "Rupee (1)", "Rupees (5)", "Rupees (20)", "Rupees (5)", "Rupee (1)", "Rupees (5)", "Rupees (5)"]
Pack 3: ["Big Magic", "Small Magic", "Small Magic", "Rupees (5)", "Big Magic", "Small Magic", "Small Heart", "Small Magic"]
Pack 4: ["Single Bomb", "Single Bomb", "Single Bomb", "Bombs (4)", "Single Bomb", "Single Bomb", "Bombs (8)", "Single Bomb"]
Pack 5: ["Arrows (5)", "Small Heart", "Arrows (5)", "Arrows (10)", "Arrows (5)", "Small Heart", "Arrows (5)", "Arrows (10)"]
Pack 6: ["Small Magic", "Rupee (1)", "Small Heart", "Arrows (5)", "Small Magic", "Single Bomb", "Rupee (1)", "Small Heart"]
Pack 7: ["Small Heart", "Fairy", "Big Magic", "Rupees (20)", "Bombs (8)", "Small Heart", "Rupees (20)", "Arrows (10)"]
Tree Pull Tier 1: "Rupee (1)"
Tree Pull Tier 2: "Rupees (5)"
Tree Pull Tier 3: "Rupees (20)"
Crab Normal: "Rupee (1)"
Crab Special: "Rupees (20)"
Stun Prize: "Rupee (1)"
Fish: "Rupees (20)"
medallions:
1:
"Misery Mire": Ether
"Turtle Rock": Quake