Compare commits
30 Commits
4de84df7a8
...
fouton_van
| Author | SHA1 | Date | |
|---|---|---|---|
| 6fe0c233a8 | |||
| 5f1c08920f | |||
| 57db996f27 | |||
| 5af7073ed1 | |||
| 33cd2d076c | |||
| cd5bc9a206 | |||
| 78819bbd9d | |||
| b2d2aae61a | |||
| 320e518519 | |||
| c39a31b299 | |||
| 0ef55c5f6a | |||
| fb57e9fd34 | |||
| ab2e8f7818 | |||
| 151765d8d2 | |||
| 1ae9da59bb | |||
| 84270544bf | |||
| 8ae1aefcf3 | |||
| 821c0ee46e | |||
| a946c2b3b0 | |||
| ec89afaa5e | |||
| d530b68e86 | |||
| 924bd7a616 | |||
| cdfdc15219 | |||
| d2a5bb56d8 | |||
| e86312f145 | |||
| 97aceb3f43 | |||
| b6f73ffda4 | |||
| c4687a3be6 | |||
| 4d63168e9a | |||
| 6474975b07 |
@@ -164,6 +164,7 @@ class World(object):
|
||||
set_player_attr('bigkeyshuffle', 'none')
|
||||
set_player_attr('prizeshuffle', 'none')
|
||||
set_player_attr('showloot', 'never')
|
||||
set_player_attr('loothud', 'never')
|
||||
set_player_attr('showmap', 'map')
|
||||
set_player_attr('restrict_boss_items', 'none')
|
||||
set_player_attr('bombbag', False)
|
||||
@@ -1518,7 +1519,10 @@ class CollectionState(object):
|
||||
if not item:
|
||||
return
|
||||
changed = False
|
||||
if item.name.startswith('Progressive '):
|
||||
if item.name == "Sword and Shield":
|
||||
self.prog_items["Fighter Sword", item.player] += 1
|
||||
self.prog_items["Blue Shield", item.player] += 1
|
||||
elif item.name.startswith('Progressive '):
|
||||
if 'Sword' in item.name:
|
||||
if self.has('Golden Sword', item.player):
|
||||
pass
|
||||
@@ -2894,6 +2898,10 @@ class Item(object):
|
||||
def compass(self):
|
||||
return self.type == 'Compass'
|
||||
|
||||
@property
|
||||
def event(self):
|
||||
return self.type == 'Event'
|
||||
|
||||
@property
|
||||
def dungeon(self):
|
||||
if not self.smallkey and not self.bigkey and not self.map and not self.compass:
|
||||
@@ -3156,6 +3164,7 @@ class Spoiler(object):
|
||||
'bigkeyshuffle': self.world.bigkeyshuffle,
|
||||
'prizeshuffle': self.world.prizeshuffle,
|
||||
'showloot': self.world.showloot,
|
||||
'loothud': self.world.loothud,
|
||||
'showmap': self.world.showmap,
|
||||
'boss_shuffle': self.world.boss_shuffle,
|
||||
'enemy_shuffle': self.world.enemy_shuffle,
|
||||
@@ -3184,6 +3193,8 @@ class Spoiler(object):
|
||||
'code': {p: Settings.make_code(self.world, p) for p in range(1, self.world.players + 1)},
|
||||
'seed': self.world.seed
|
||||
}
|
||||
if self.hashes:
|
||||
self.metadata['hash'] = {p: self.hashes[p, 0] for p in range(1, self.world.players + 1)} # TODO: make this work for multiple teams
|
||||
|
||||
for p in range(1, self.world.players + 1):
|
||||
from ItemList import set_default_triforce
|
||||
@@ -3430,6 +3441,7 @@ class Spoiler(object):
|
||||
outfile.write('Big Key Shuffle:'.ljust(line_width) + '%s\n' % self.metadata['bigkeyshuffle'][player])
|
||||
outfile.write('Prize Shuffle:'.ljust(line_width) + '%s\n' % self.metadata['prizeshuffle'][player])
|
||||
outfile.write('Show Value of Checks:'.ljust(line_width) + '%s\n' % self.metadata['showloot'][player])
|
||||
outfile.write('Show Value of Checks on HUD:'.ljust(line_width) + '%s\n' % self.metadata['loothud'][player])
|
||||
outfile.write('Show Map:'.ljust(line_width) + '%s\n' % self.metadata['showmap'][player])
|
||||
outfile.write('Key Logic Algorithm:'.ljust(line_width) + '%s\n' % self.metadata['key_logic'][player])
|
||||
outfile.write('\n')
|
||||
|
||||
62
CLI.py
62
CLI.py
@@ -89,6 +89,7 @@ def parse_cli(argv, no_defaults=False):
|
||||
parser.add_argument('--count', default=defval(int(settings["count"]) if settings["count"] != "" and settings["count"] is not None else 1), help="\n".join(fish.translate("cli", "help", "count")), type=int)
|
||||
parser.add_argument('--tries', default=defval(int(settings["tries"]) if settings["tries"] != "" and settings["tries"] is not None else 1), help="\n".join(fish.translate("cli", "help", "tries")), type=int)
|
||||
parser.add_argument('--customitemarray', default={}, help=argparse.SUPPRESS)
|
||||
parser.add_argument('--skip_money_balance', action="store_true", help=argparse.SUPPRESS)
|
||||
|
||||
# included for backwards compatibility
|
||||
parser.add_argument('--multi', default=defval(settings["multi"]), type=lambda value: min(max(int(value), 1), 255))
|
||||
@@ -106,7 +107,14 @@ def parse_cli(argv, no_defaults=False):
|
||||
ret = parser.parse_args(argv)
|
||||
|
||||
if ret.keysanity:
|
||||
ret.mapshuffle, ret.compassshuffle, ret.keyshuffle, ret.bigkeyshuffle = ['wild'] * 4
|
||||
if ret.mapshuffle == "none":
|
||||
ret.mapshuffle = "wild"
|
||||
if ret.compassshuffle == "none":
|
||||
ret.compassshuffle = "wild"
|
||||
if ret.keyshuffle == "none":
|
||||
ret.keyshuffle = "wild"
|
||||
if ret.bigkeyshuffle == "none":
|
||||
ret.bigkeyshuffle = "wild"
|
||||
|
||||
if ret.keydropshuffle:
|
||||
ret.dropshuffle = 'keys' if ret.dropshuffle == 'none' else ret.dropshuffle
|
||||
@@ -153,31 +161,32 @@ def parse_cli(argv, no_defaults=False):
|
||||
'crystals_ganon', 'crystals_gt', 'bosses_ganon',
|
||||
'bosshunt_include_agas', 'ganon_item', 'openpyramid',
|
||||
'mapshuffle', 'compassshuffle', 'keyshuffle',
|
||||
'bigkeyshuffle', 'prizeshuffle', 'showloot', 'showmap',
|
||||
'startinventory', 'usestartinventory', 'bombbag',
|
||||
'shuffleganon', 'overworld_map', 'restrict_boss_items',
|
||||
'triforce_max_difference', 'triforce_pool_min',
|
||||
'triforce_pool_max', 'triforce_goal_min',
|
||||
'triforce_goal_max', 'triforce_min_difference',
|
||||
'triforce_goal', 'triforce_pool', 'shufflelinks',
|
||||
'shuffletavern', 'skullwoods', 'linked_drops',
|
||||
'pseudoboots', 'mirrorscroll', 'dark_rooms',
|
||||
'damage_challenge', 'shuffle_damage_table',
|
||||
'crystal_book', 'extra_keys', 'retro', 'accessibility',
|
||||
'hints', 'beemizer', 'experimental', 'dungeon_counters',
|
||||
'shufflebosses', 'shuffleenemies', 'enemy_health',
|
||||
'enemy_damage', 'shufflepots', 'ow_palettes',
|
||||
'uw_palettes', 'sprite', 'triforce_gfx', 'disablemusic',
|
||||
'quickswap', 'fastmenu', 'heartcolor', 'heartbeep',
|
||||
'remote_items', 'shopsanity', 'dropshuffle', 'pottery',
|
||||
'keydropshuffle', 'mixed_travel',
|
||||
'standardize_palettes', 'code', 'reduce_flashing',
|
||||
'shuffle_sfx', 'shuffle_sfxinstruments',
|
||||
'shuffle_songinstruments', 'msu_resume',
|
||||
'collection_rate', 'colorizepots', 'decoupledoors',
|
||||
'door_type_mode', 'bonk_drops', 'trap_door_mode',
|
||||
'key_logic_algorithm', 'door_self_loops',
|
||||
'any_enemy_logic', 'aga_randomness', 'money_balance']:
|
||||
'bigkeyshuffle', 'prizeshuffle', 'showloot', 'loothud',
|
||||
'showmap', 'startinventory', 'usestartinventory',
|
||||
'bombbag', 'shuffleganon', 'overworld_map',
|
||||
'restrict_boss_items', 'triforce_max_difference',
|
||||
'triforce_pool_min', 'triforce_pool_max',
|
||||
'triforce_goal_min', 'triforce_goal_max',
|
||||
'triforce_min_difference', 'triforce_goal',
|
||||
'triforce_pool', 'shufflelinks', 'shuffletavern',
|
||||
'skullwoods', 'linked_drops', 'pseudoboots',
|
||||
'mirrorscroll', 'dark_rooms', 'damage_challenge',
|
||||
'shuffle_damage_table', 'crystal_book', 'extra_keys',
|
||||
'retro', 'accessibility', 'hints', 'beemizer',
|
||||
'experimental', 'dungeon_counters', 'shufflebosses',
|
||||
'shuffleenemies', 'enemy_health', 'enemy_damage',
|
||||
'shufflepots', 'ow_palettes', 'uw_palettes', 'sprite',
|
||||
'triforce_gfx', 'disablemusic', 'quickswap', 'fastmenu',
|
||||
'heartcolor', 'heartbeep', 'remote_items', 'shopsanity',
|
||||
'dropshuffle', 'pottery', 'keydropshuffle',
|
||||
'mixed_travel', 'standardize_palettes', 'code',
|
||||
'reduce_flashing', 'shuffle_sfx',
|
||||
'shuffle_sfxinstruments', 'shuffle_songinstruments',
|
||||
'msu_resume', 'collection_rate', 'colorizepots',
|
||||
'decoupledoors', 'door_type_mode', 'bonk_drops',
|
||||
'trap_door_mode', 'key_logic_algorithm',
|
||||
'door_self_loops', 'any_enemy_logic', 'aga_randomness',
|
||||
'money_balance', 'patches']:
|
||||
value = getattr(defaults, name) if getattr(playerargs, name) is None else getattr(playerargs, name)
|
||||
if player == 1:
|
||||
setattr(ret, name, {1: value})
|
||||
@@ -274,6 +283,7 @@ def parse_settings():
|
||||
"bigkeyshuffle": "none",
|
||||
"prizeshuffle": "none",
|
||||
"showloot": "never",
|
||||
"loothud": "never",
|
||||
"showmap": "map",
|
||||
"keysanity": False,
|
||||
"door_shuffle": "vanilla",
|
||||
|
||||
5
Fill.py
5
Fill.py
@@ -252,6 +252,7 @@ def verify_spot_to_fill(location, item_to_place, max_exp_state, single_player_pl
|
||||
or (world.algorithm == 'vanilla_fill' and item_to_place.is_near_dungeon_item(world)))) \
|
||||
or valid_dungeon_placement(item_to_place, location, world):
|
||||
return location
|
||||
|
||||
if item_to_place.smallkey or item_to_place.bigkey or item_to_place.prize:
|
||||
location.item = None
|
||||
location.event = False
|
||||
@@ -311,7 +312,9 @@ def valid_dungeon_placement(item, location, world):
|
||||
dungeon = check_dungeon
|
||||
if dungeon:
|
||||
layout = world.dungeon_layouts[location.player][dungeon.name]
|
||||
if not is_dungeon_item(item, world) or item.player != location.player:
|
||||
if item.event:
|
||||
return True
|
||||
elif not is_dungeon_item(item, world) or item.player != location.player:
|
||||
if item.prize and item.is_near_dungeon_item(world):
|
||||
return item.dungeon_object == dungeon and layout.free_items > 0
|
||||
return layout.free_items > 0
|
||||
|
||||
24
ItemList.py
24
ItemList.py
@@ -372,6 +372,13 @@ def generate_itempool(world, player):
|
||||
world.push_precollected(ItemFactory(item, player))
|
||||
|
||||
if world.mode[player] == 'standard' and not world.state.has_blunt_weapon(player):
|
||||
if world.customizer:
|
||||
placements = world.customizer.get_placements()
|
||||
if placements:
|
||||
custom_uncle = placements.get(player, {}).get("Link's Uncle")
|
||||
if custom_uncle:
|
||||
placed_items["Link's Uncle"] = custom_uncle
|
||||
|
||||
if "Link's Uncle" not in placed_items:
|
||||
found_sword = False
|
||||
found_bow = False
|
||||
@@ -1669,12 +1676,15 @@ def fill_specific_items(world):
|
||||
item_to_place, event_flag = get_item_and_event_flag(item, world, player,
|
||||
dungeon_pool, prize_set, prize_pool)
|
||||
if item_to_place:
|
||||
world.push_item(loc, item_to_place, False)
|
||||
loc.locked = True
|
||||
track_outside_keys(item_to_place, loc, world)
|
||||
track_dungeon_items(item_to_place, loc, world)
|
||||
loc.event = (event_flag or item_to_place.advancement
|
||||
or item_to_place.bigkey or item_to_place.smallkey)
|
||||
if not loc.item:
|
||||
world.push_item(loc, item_to_place, False)
|
||||
loc.locked = True
|
||||
track_outside_keys(item_to_place, loc, world)
|
||||
track_dungeon_items(item_to_place, loc, world)
|
||||
loc.event = (event_flag or item_to_place.advancement
|
||||
or item_to_place.bigkey or item_to_place.smallkey)
|
||||
elif loc.item != item_to_place:
|
||||
logging.getLogger('').warning("Failed to place item %s at location %s because it already contained %s", item_to_place, loc.name, loc.item)
|
||||
else:
|
||||
raise Exception(f'Did not find "{item}" in item pool to place at "{location}"')
|
||||
advanced_placements = world.customizer.get_advanced_placements()
|
||||
@@ -1802,7 +1812,7 @@ def shuffle_event_items(world, player):
|
||||
continue
|
||||
break
|
||||
else:
|
||||
raise FillError(f'Unable to place followers: {", ".join(list(map(lambda d: d.hint_text, follower_locations)))}')
|
||||
raise FillError(f'Unable to place followers: {", ".join(list(map(lambda f: f.name, pickup_items)))}')
|
||||
|
||||
|
||||
def get_item_and_event_flag(item, world, player, dungeon_pool, prize_set, prize_pool):
|
||||
|
||||
2
Items.py
2
Items.py
@@ -55,7 +55,7 @@ item_table = {'Bow': (True, False, None, 0x0B, 200, 'Bow!\nJoin the archer class
|
||||
'Master Sword': (True, False, 'Sword', 0x50, 100, 'Master Sword!\nEvil\'s bane!', 'and the master sword', 'sword-wielding kid', 'glow sword for sale', 'fungus for blue slasher', 'sword boy fights again', 'the Master Sword'),
|
||||
'Tempered Sword': (True, False, 'Sword', 0x02, 150, 'Tempered Sword!\nMore slashy!', 'the tempered sword', 'sword-wielding kid', 'flame sword for sale', 'fungus for red slasher', 'sword boy fights again', 'the Tempered Sword'),
|
||||
'Fighter Sword': (True, False, 'Sword', 0x49, 50, 'Fighter Sword!\nStarter level slashy!', 'the tiny sword', 'sword-wielding kid', 'tiny sword for sale', 'fungus for tiny slasher', 'sword boy fights again', 'the Fighter Sword'),
|
||||
'Sword and Shield': (True, False, 'Sword', 0x00, 'Sword and Shield!\nUncle sword ahoy!', 'the sword and shield', 'sword and shield-wielding kid', 'training set for sale', 'fungus for training set', 'sword and shield boy fights again', 'the small sword and shield'),
|
||||
'Sword and Shield': (True, False, 'Sword', 0x00, 50, 'Sword and Shield!\nUncle sword ahoy!', 'the sword and shield', 'sword and shield-wielding kid', 'training set for sale', 'fungus for training set', 'sword and shield boy fights again', 'the small sword and shield'),
|
||||
'Golden Sword': (True, False, 'Sword', 0x03, 200, 'Golden Sword!\nBest slashy!', 'and the butter sword', 'sword-wielding kid', 'butter for sale', 'cap churned to butter', 'sword boy fights again', 'the Golden Sword'),
|
||||
'Progressive Sword': (True, False, 'Sword', 0x5E, 150, 'Sword!\nA better sword for your time!', 'the unknown sword', 'sword-wielding kid', 'sword for sale', 'fungus for some slasher', 'sword boy fights again', 'a Sword'),
|
||||
'Progressive Glove': (True, False, None, 0x61, 150, 'Glove!\nLift more than you can now!', 'and the lift upgrade', 'body-building kid', 'some glove for sale', 'fungus for gloves', 'body-building boy lifts again', 'a Glove'),
|
||||
|
||||
13
Main.py
13
Main.py
@@ -67,6 +67,7 @@ from Rom import (
|
||||
JsonRom,
|
||||
LocalRom,
|
||||
apply_rom_settings,
|
||||
apply_rom_patches,
|
||||
get_hash_string,
|
||||
patch_race_rom,
|
||||
patch_rom,
|
||||
@@ -335,7 +336,7 @@ def main(args, seed=None, fish=None):
|
||||
for player in range(1, world.players+1):
|
||||
if world.shopsanity[player]:
|
||||
customize_shops(world, player)
|
||||
if args.algorithm in ['balanced', 'equitable']:
|
||||
if not args.skip_money_balance and args.algorithm in ['balanced', 'equitable']:
|
||||
balance_money_progression(world)
|
||||
ensure_good_items(world, True)
|
||||
|
||||
@@ -364,6 +365,8 @@ def main(args, seed=None, fish=None):
|
||||
rom_names.append((player, team, list(rom.name)))
|
||||
world.spoiler.hashes[(player, team)] = get_hash_string(rom.hash)
|
||||
|
||||
if args.patches[player]:
|
||||
apply_rom_patches(rom, map(lambda arg: arg.strip(), args.patches[player].split(",")))
|
||||
apply_rom_settings(rom, args.heartbeep[player], args.heartcolor[player], args.quickswap[player],
|
||||
args.fastmenu[player], args.disablemusic[player], args.sprite[player], args.triforce_gfx[player],
|
||||
args.ow_palettes[player], args.uw_palettes[player], args.reduce_flashing[player],
|
||||
@@ -516,6 +519,7 @@ def init_world(args, fish):
|
||||
world.bigkeyshuffle = args.bigkeyshuffle.copy()
|
||||
world.prizeshuffle = args.prizeshuffle.copy()
|
||||
world.showloot = args.showloot.copy()
|
||||
world.loothud = args.loothud.copy()
|
||||
world.showmap = args.showmap.copy()
|
||||
world.bombbag = args.bombbag.copy()
|
||||
world.flute_mode = args.flute_mode.copy()
|
||||
@@ -571,7 +575,7 @@ def init_world(args, fish):
|
||||
world.collection_rate = args.collection_rate.copy()
|
||||
world.colorizepots = args.colorizepots.copy()
|
||||
world.aga_randomness = args.aga_randomness.copy()
|
||||
world.money_balance = args.money_balance.copy()
|
||||
world.money_balance = {player: int(args.money_balance[player]) for player in range(1, world.players + 1)}
|
||||
|
||||
# custom settings - these haven't been promoted to full settings yet
|
||||
in_progress_settings = ['force_enemy']
|
||||
@@ -837,6 +841,7 @@ def copy_world(world):
|
||||
ret.bigkeyshuffle = world.bigkeyshuffle.copy()
|
||||
ret.prizeshuffle = world.prizeshuffle.copy()
|
||||
ret.showloot = world.showloot.copy()
|
||||
ret.loothud = world.loothud.copy()
|
||||
ret.showmap = world.showmap.copy()
|
||||
ret.bombbag = world.bombbag.copy()
|
||||
ret.flute_mode = world.flute_mode.copy()
|
||||
@@ -1070,6 +1075,7 @@ def copy_world_premature(world, player, create_flute_exits=True):
|
||||
ret.bigkeyshuffle = world.bigkeyshuffle.copy()
|
||||
ret.prizeshuffle = world.prizeshuffle.copy()
|
||||
ret.showloot = world.showloot.copy()
|
||||
ret.loothud = world.loothud.copy()
|
||||
ret.showmap = world.showmap.copy()
|
||||
ret.bombbag = world.bombbag.copy()
|
||||
ret.flute_mode = world.flute_mode.copy()
|
||||
@@ -1285,6 +1291,9 @@ def create_playthrough(world):
|
||||
for location in sphere:
|
||||
if world.goal[location.player] == 'completionist':
|
||||
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
|
||||
logging.getLogger('').debug('Checking if %s (Player %d) is required to beat the game.', location.item.name, location.item.player)
|
||||
old_item = location.item
|
||||
|
||||
160
Rom.py
160
Rom.py
@@ -85,7 +85,7 @@ from Utils import int16_as_bytes, int32_as_bytes, local_path, snes_to_pc
|
||||
from Versions import DRVersion, GKVersion, ORVersion
|
||||
|
||||
JAP10HASH = '03a63945398191337e896e5771f77173'
|
||||
RANDOMIZERBASEHASH = 'c4ba2f29976344e33ca1b5901b3073bb'
|
||||
RANDOMIZERBASEHASH = '100c3e1da68680a0f3d8e1fc94568de6'
|
||||
|
||||
|
||||
class JsonRom(object):
|
||||
@@ -994,7 +994,7 @@ def patch_rom(world, rom, player, team, is_mystery=False, rom_header=None):
|
||||
set_inverted_mode(world, player, rom, inverted_buffer)
|
||||
|
||||
uncle_location = world.get_location('Link\'s Uncle', player)
|
||||
if uncle_location.item is None or uncle_location.item.name not in ['Master Sword', 'Tempered Sword', 'Fighter Sword', 'Golden Sword', 'Progressive Sword']:
|
||||
if uncle_location.item is None or uncle_location.item.name not in ['Master Sword', 'Tempered Sword', 'Fighter Sword', 'Golden Sword', 'Progressive Sword', 'Sword and Shield']:
|
||||
# disable sword sprite from uncle
|
||||
rom.write_bytes(0x6D263, [0x00, 0x00, 0xf6, 0xff, 0x00, 0x0E])
|
||||
rom.write_bytes(0x6D26B, [0x00, 0x00, 0xf6, 0xff, 0x00, 0x0E])
|
||||
@@ -1503,9 +1503,22 @@ def patch_rom(world, rom, player, team, is_mystery=False, rom_header=None):
|
||||
loot_source |= 0x04
|
||||
rom.write_byte(0x1CFF10, loot_source)
|
||||
|
||||
if world.loothud[player] == 'never':
|
||||
rom.write_byte(0x1CFF12, 0x00)
|
||||
elif world.loothud[player] == 'presence':
|
||||
rom.write_byte(0x1CFF12, 0x01)
|
||||
rom.write_bytes(0x1CFF0E, [0x01, 0x01])
|
||||
elif world.loothud[player] == 'value':
|
||||
rom.write_byte(0x1CFF12, 0x01)
|
||||
rom.write_bytes(0x1CFF0E, [0xFF, 0xFF])
|
||||
elif world.loothud[player] == 'dungeon_value':
|
||||
rom.write_byte(0x1CFF12, 0x01)
|
||||
rom.write_bytes(0x1CFF0E, [0xFF, 0x01])
|
||||
|
||||
if world.showloot[player] == 'never':
|
||||
rom.write_bytes(0x1CFF08, [0x00, 0x00, 0x00, 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':
|
||||
rom.write_bytes(0x1CFF08, [0x01, 0x00, 0x00, 0x00])
|
||||
rom.write_byte(0x1CFF11, 0x00)
|
||||
@@ -1766,53 +1779,40 @@ 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(0x18008B, 0x01 if glitches_enabled else 0x00)
|
||||
|
||||
# remove shield from uncle
|
||||
rom.write_bytes(0x6D253, [0x00, 0x00, 0xf6, 0xff, 0x00, 0x0E])
|
||||
rom.write_bytes(0x6D25B, [0x00, 0x00, 0xf6, 0xff, 0x00, 0x0E])
|
||||
rom.write_bytes(0x6D283, [0x00, 0x00, 0xf6, 0xff, 0x00, 0x0E])
|
||||
rom.write_bytes(0x6D28B, [0x00, 0x00, 0xf7, 0xff, 0x00, 0x0E])
|
||||
rom.write_bytes(0x6D2CB, [0x00, 0x00, 0xf6, 0xff, 0x02, 0x0E])
|
||||
rom.write_bytes(0x6D2FB, [0x00, 0x00, 0xf7, 0xff, 0x02, 0x0E])
|
||||
rom.write_bytes(0x6D313, [0x00, 0x00, 0xe4, 0xff, 0x08, 0x0E])
|
||||
if uncle_location.item is None or uncle_location.item.name not in ['Sword and Shield']:
|
||||
# remove shield from uncle
|
||||
rom.write_bytes(0x6D253, [0x00, 0x00, 0xf6, 0xff, 0x00, 0x0E])
|
||||
rom.write_bytes(0x6D25B, [0x00, 0x00, 0xf6, 0xff, 0x00, 0x0E])
|
||||
rom.write_bytes(0x6D283, [0x00, 0x00, 0xf6, 0xff, 0x00, 0x0E])
|
||||
rom.write_bytes(0x6D28B, [0x00, 0x00, 0xf7, 0xff, 0x00, 0x0E])
|
||||
rom.write_bytes(0x6D2CB, [0x00, 0x00, 0xf6, 0xff, 0x02, 0x0E])
|
||||
rom.write_bytes(0x6D2FB, [0x00, 0x00, 0xf7, 0xff, 0x02, 0x0E])
|
||||
rom.write_bytes(0x6D313, [0x00, 0x00, 0xe4, 0xff, 0x08, 0x0E])
|
||||
|
||||
write_int16(rom, 0x180183, 0) # Escape fill rupee bow
|
||||
# Uncle / Zelda / Mantle respawn refills (magic, bombs, arrows)
|
||||
rom.write_bytes(0x180185, [0] * 9)
|
||||
|
||||
rom.write_byte(0x18004E, 0) # Escape Fill (nothing)
|
||||
write_int16(rom, 0x180183, 300) # Escape fill rupee bow
|
||||
rom.write_bytes(0x180185, [0, 0, 0]) # Uncle respawn refills (magic, bombs, arrows)
|
||||
rom.write_bytes(0x180188, [0, 0, 0]) # Zelda respawn refills (magic, bombs, arrows)
|
||||
rom.write_bytes(0x18018B, [0, 0, 0]) # Mantle respawn refills (magic, bombs, arrows)
|
||||
bow_max, bomb_max, magic_max = 0, 0, 0
|
||||
bow_small, bomb_small, magic_small = 10, 3, 0x20
|
||||
if world.mode[player] == 'standard':
|
||||
if world.doorShuffle[player] not in ['vanilla']:
|
||||
# If door shuffle, give player small bit of all three ammos on respawn during escape
|
||||
# Uncle / Zelda / Mantle respawn refills (magic, bombs, arrows)
|
||||
rom.write_bytes(0x180185, [0x20, 3, 10] * 3)
|
||||
|
||||
# Always fully fill ammo of starting weapon on respawn during escape
|
||||
if uncle_location.item is not None and uncle_location.item.name in ['Bow', 'Progressive Bow']:
|
||||
rom.write_byte(0x18004E, 1) # Escape Fill (arrows)
|
||||
write_int16(rom, 0x180183, 300) # Escape fill rupee bow
|
||||
rom.write_bytes(0x180185, [0, 0, 70]) # Uncle respawn refills (magic, bombs, arrows)
|
||||
rom.write_bytes(0x180188, [0, 0, 70]) # Zelda respawn refills (magic, bombs, arrows)
|
||||
rom.write_bytes(0x18018B, [0, 0, 70]) # Mantle respawn refills (magic, bombs, arrows)
|
||||
bow_max = 70
|
||||
rom.write_byte(0x180187, 70) # Uncle respawn refill arrows
|
||||
rom.write_byte(0x18018A, 70) # Zelda respawn refill arrows
|
||||
rom.write_byte(0x18018D, 70) # Mantle respawn refill arrowss
|
||||
elif uncle_location.item is not None and uncle_location.item.name in ['Bomb Upgrade (+10)' if world.bombbag[player] else 'Bombs (10)']:
|
||||
rom.write_byte(0x18004E, 2) # Escape Fill (bombs)
|
||||
rom.write_bytes(0x180185, [0, 50, 0]) # Uncle respawn refills (magic, bombs, arrows)
|
||||
rom.write_bytes(0x180188, [0, 50, 0]) # Zelda respawn refills (magic, bombs, arrows)
|
||||
rom.write_bytes(0x18018B, [0, 50, 0]) # Mantle respawn refills (magic, bombs, arrows)
|
||||
bomb_max = 50
|
||||
rom.write_byte(0x180186, 50) # Uncle respawn refill bombs
|
||||
rom.write_byte(0x180189, 50) # Zelda respawn refill bombs
|
||||
rom.write_byte(0x18018C, 50) # Mantle respawn refill bombs
|
||||
elif uncle_location.item is not None and uncle_location.item.name in ['Cane of Somaria', 'Cane of Byrna', 'Fire Rod']:
|
||||
rom.write_byte(0x18004E, 4) # Escape Fill (magic)
|
||||
rom.write_bytes(0x180185, [0x80, 0, 0]) # Uncle respawn refills (magic, bombs, arrows)
|
||||
rom.write_bytes(0x180188, [0x80, 0, 0]) # Zelda respawn refills (magic, bombs, arrows)
|
||||
rom.write_bytes(0x18018B, [0x80, 0, 0]) # Mantle respawn refills (magic, bombs, arrows)
|
||||
magic_max = 0x80
|
||||
if world.doorShuffle[player] not in ['vanilla', 'basic']:
|
||||
# Uncle respawn refills (magic, bombs, arrows)
|
||||
rom.write_bytes(0x180185, [max(magic_small, magic_max), max(bomb_small, bomb_max), max(bow_small, bow_max)])
|
||||
# Zelda respawn refills (magic, bombs, arrows)
|
||||
rom.write_bytes(0x180188, [max(magic_small, magic_max), max(bomb_small, bomb_max), max(bow_small, bow_max)])
|
||||
# Mantle respawn refills (magic, bombs, arrows)
|
||||
rom.write_bytes(0x18018B, [max(magic_small, magic_max), max(bomb_small, bomb_max), max(bow_small, bow_max)])
|
||||
elif world.doorShuffle[player] == 'basic': # just in case a bomb is needed to get to a chest
|
||||
rom.write_bytes(0x180185, [max(magic_small, magic_max), max(bomb_small, bomb_max), max(bow_small, bow_max)])
|
||||
rom.write_bytes(0x180188, [magic_small, max(bomb_small, bomb_max), bow_small]) # Zelda respawn refills (magic, bombs, arrows)
|
||||
rom.write_bytes(0x18018B, [magic_small, max(bomb_small, bomb_max), bow_small]) # Mantle respawn refills (magic, bombs, arrows)
|
||||
rom.write_byte(0x180185, 0x80) # Uncle respawn refill magic
|
||||
rom.write_byte(0x180188, 0x80) # Zelda respawn refill magic
|
||||
rom.write_byte(0x18018B, 0x80) # Mantle respawn refill magic
|
||||
|
||||
# patch swamp: Need to enable permanent drain of water as dam or swamp were moved
|
||||
rom.write_byte(0x18003D, 0x01 if world.swamp_patch_required[player] else 0x00)
|
||||
@@ -1932,7 +1932,7 @@ def patch_rom(world, rom, player, team, is_mystery=False, rom_header=None):
|
||||
|
||||
write_enemizer_tweaks(rom, world, player)
|
||||
randomize_damage_table(rom, world, player)
|
||||
write_strings(rom, world, player, team)
|
||||
write_strings(rom, world, player, team, is_mystery)
|
||||
|
||||
# write initial sram
|
||||
rom.write_initial_sram()
|
||||
@@ -2075,6 +2075,49 @@ def hud_format_text(text):
|
||||
output += b'\x7f\x00'
|
||||
return output[:32]
|
||||
|
||||
def read_bytes(f, count):
|
||||
values = f.read(count)
|
||||
if len(values) < count:
|
||||
raise EOFError
|
||||
return values
|
||||
|
||||
def apply_rom_patches(rom, patches):
|
||||
for patch in patches:
|
||||
if not os.path.exists(f"patches/{patch}.ips"):
|
||||
logging.getLogger('').warning("Patch %s not found -- skipping", patch)
|
||||
continue
|
||||
|
||||
with open(f"patches/{patch}.ips", "rb") as f:
|
||||
byte_changes = []
|
||||
try:
|
||||
header = read_bytes(f, 5)
|
||||
if header != b"PATCH":
|
||||
logging.getLogger('').warning("Patch %s invalid -- skipping", patch)
|
||||
continue
|
||||
|
||||
while True:
|
||||
address = read_bytes(f, 3)
|
||||
if address == b"EOF":
|
||||
break
|
||||
|
||||
address = int.from_bytes(address, byteorder="big")
|
||||
length = int.from_bytes(read_bytes(f, 2), byteorder="big")
|
||||
|
||||
if length > 0:
|
||||
byte_changes.append((address, list(f.read(length))))
|
||||
else:
|
||||
length = int.from_bytes(read_bytes(f, 2), byteorder="big")
|
||||
value = read_bytes(f, 1)
|
||||
byte_changes.append((address, length * list(value)))
|
||||
|
||||
for address, values in byte_changes:
|
||||
rom.write_bytes(address, values)
|
||||
|
||||
logging.getLogger("").info("Patch %s applied successfully", patch)
|
||||
|
||||
except EOFError:
|
||||
logging.getLogger('').warning("Patch %s invalid -- skipping", patch)
|
||||
continue
|
||||
|
||||
def apply_rom_settings(rom, beep, color, quickswap, fastmenu, disable_music, sprite, triforce_gfx,
|
||||
ow_palettes, uw_palettes, reduce_flashing, shuffle_sfx,
|
||||
@@ -2391,7 +2434,7 @@ def write_string_to_rom(rom, target, string):
|
||||
rom.write_bytes(address, MultiByteTextMapper.convert(string, maxbytes))
|
||||
|
||||
|
||||
def write_strings(rom, world, player, team):
|
||||
def write_strings(rom, world, player, team, is_mystery=False):
|
||||
tt = TextTable()
|
||||
tt.removeUnwantedText()
|
||||
if world.shuffle[player] != 'vanilla':
|
||||
@@ -2906,7 +2949,22 @@ def write_strings(rom, world, player, team):
|
||||
sanc_text = "Dark Chapel"
|
||||
tt['menu_start_2'] = "{MENU}\n{SPEED0}\n≥@'s " + lh_text + "\n " + sanc_text + "\n{CHOICE3}"
|
||||
tt['menu_start_3'] = "{MENU}\n{SPEED0}\n≥@'s " + lh_text + "\n " + sanc_text + "\n Mountain Cave\n{CHOICE2}"
|
||||
if world.mode[player] == 'inverted':
|
||||
|
||||
if is_mystery:
|
||||
tt['intro_main'] = CompressedTextMapper.convert(
|
||||
"{INTRO}\n Episode III"
|
||||
+ "{PAUSE3}\n A Link to the Past"
|
||||
+ "{PAUSE3}\n Mystery Randomizer"
|
||||
+ "{PAUSE3}\n\n\n"
|
||||
+ "{PAUSE3}\nAfter mostly disregarding what happened in the first two games,"
|
||||
+ "{PAUSE3}\nLink awakens to a massive mystery."
|
||||
+ "{PAUSE3}\nHe doesn't know why he's here, or what he must do."
|
||||
+ "{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}\nThis is your chance to be a hero."
|
||||
+ "{PAUSE3} {CHANGEPIC}\nYou must determine and achieve your goal."
|
||||
+ "{PAUSE9} {CHANGEPIC}", False)
|
||||
elif world.mode[player] == 'inverted':
|
||||
tt['intro_main'] = CompressedTextMapper.convert(
|
||||
"{INTRO}\n Episode III"
|
||||
+ "{PAUSE3}\n A Link to the Past"
|
||||
@@ -2920,6 +2978,7 @@ def write_strings(rom, world, player, team):
|
||||
+ "{PAUSE7}\nThis is your chance to be a hero."
|
||||
+ "{PAUSE3} {CHANGEPIC}\nYou must get the 7 crystals to beat Ganon."
|
||||
+ "{PAUSE9} {CHANGEPIC}", False)
|
||||
|
||||
rom.write_bytes(0xE0000, tt.getBytes())
|
||||
|
||||
credits = Credits()
|
||||
@@ -3528,7 +3587,10 @@ Prizes = ['Green Pendant',
|
||||
]
|
||||
|
||||
hash_alphabet = [
|
||||
"Bow", "Boomerang", "Hookshot", "Bomb", "Mushroom", "Powder", "Rod", "Pendant", "Bombos", "Ether", "Quake",
|
||||
"Lamp", "Hammer", "Shovel", "Ocarina", "Bug Net", "Book", "Bottle", "Potion", "Cane", "Cape", "Mirror", "Boots",
|
||||
"Gloves", "Flippers", "Pearl", "Shield", "Tunic", "Heart", "Map", "Compass", "Key"
|
||||
"Bow", "Boomerang", "Hookshot", "Bomb", "Mushroom", "Powder",
|
||||
"Ice Rod", "Green Pendant", "Bombos", "Ether", "Quake", "Lamp",
|
||||
"Hammer", "Shovel", "Ocarina", "Bug Net", "Book", "Bottle",
|
||||
"Green Potion", "Somaria", "Cape", "Mirror", "Boots", "Gloves",
|
||||
"Flippers", "Pearl", "Shield", "Green Tunic", "Heart", "Map",
|
||||
"Compass", "Key",
|
||||
]
|
||||
|
||||
5
Rules.py
5
Rules.py
@@ -505,7 +505,7 @@ def global_rules(world, player):
|
||||
set_rule(world.get_entrance('Skull Woods Rock (West)', player), lambda state: state.can_lift_rocks(player))
|
||||
set_rule(world.get_entrance('Skull Woods Rock (East)', player), lambda state: state.can_lift_rocks(player))
|
||||
# this more like an ohko rule - dependent on bird being present too - so enemizer could turn this off?
|
||||
set_rule(world.get_entrance('Bumper Cave Ledge Drop', player), lambda state: world.can_take_damage or state.has('Cape', player) or state.has('Cane of Byrna', player) or state.has_sword(player))
|
||||
set_rule(world.get_entrance('Bumper Cave Ledge Drop', player), lambda state: state.has('Cape', player) or state.has('Cane of Byrna', player) or state.has_sword(player))
|
||||
set_rule(world.get_entrance('Bumper Cave Rock (Outer)', player), lambda state: state.can_lift_rocks(player))
|
||||
set_rule(world.get_entrance('Bumper Cave Rock (Inner)', player), lambda state: state.can_lift_rocks(player))
|
||||
set_rule(world.get_entrance('Skull Woods Pass Rock (North)', player), lambda state: state.can_lift_heavy_rocks(player))
|
||||
@@ -1404,8 +1404,7 @@ def ow_bunny_rules(world, player):
|
||||
add_bunny_rule(world.get_entrance('Skull Woods Forgotten Bush (East)', player), player)
|
||||
add_bunny_rule(world.get_entrance('Skull Woods Second Section Hole', player), player)
|
||||
add_bunny_rule(world.get_entrance('East Dark Death Mountain Bushes', player), player)
|
||||
if not world.can_take_damage:
|
||||
add_bunny_rule(world.get_entrance('Bumper Cave Ledge Drop', player), player)
|
||||
add_bunny_rule(world.get_entrance('Bumper Cave Ledge Drop', player), player)
|
||||
add_bunny_rule(world.get_entrance('Bumper Cave Rock (Outer)', player), player)
|
||||
add_bunny_rule(world.get_entrance('Bumper Cave Rock (Inner)', player), player)
|
||||
add_bunny_rule(world.get_entrance('Skull Woods Pass Bush Row (West)', player), player)
|
||||
|
||||
Binary file not shown.
BIN
patches/all_starting.ips
Normal file
BIN
patches/all_starting.ips
Normal file
Binary file not shown.
BIN
patches/no_dungeon_item_popups.ips
Normal file
BIN
patches/no_dungeon_item_popups.ips
Normal file
Binary file not shown.
BIN
patches/no_escape_assist.ips
Normal file
BIN
patches/no_escape_assist.ips
Normal file
Binary file not shown.
BIN
patches/pod_key_swap.ips
Normal file
BIN
patches/pod_key_swap.ips
Normal file
Binary file not shown.
@@ -486,6 +486,14 @@
|
||||
"always"
|
||||
]
|
||||
},
|
||||
"loothud": {
|
||||
"choices": [
|
||||
"never",
|
||||
"presence",
|
||||
"value",
|
||||
"dungeon_value"
|
||||
]
|
||||
},
|
||||
"showmap": {
|
||||
"choices": [
|
||||
"visited",
|
||||
@@ -746,6 +754,10 @@
|
||||
"type": "bool"
|
||||
},
|
||||
"money_balance": {},
|
||||
"patches": {
|
||||
"type": "str",
|
||||
"help": "suppress"
|
||||
},
|
||||
"settingsonload": {
|
||||
"choices": [
|
||||
"default",
|
||||
|
||||
@@ -84,7 +84,10 @@ UwGeneralDeny:
|
||||
- [ 0x0039, 4, [ "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight", "FirebarCW", "FirebarCCW" ] ] #"Skull Woods - Play Pen - Spike Trap 1"
|
||||
- [0x0039, 5, ["RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "Bumper", "AntiFairyCircle"]] #"Skull Woods - Play Pen - Hardhat Beetle"
|
||||
- [ 0x0039, 6, [ "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight", "FirebarCW", "FirebarCCW" ] ] #"Skull Woods - Play Pen - Spike Trap 2"
|
||||
- [0x003a, 1, ["RollerVerticalUp", "RollerVerticalDown"]]
|
||||
- [ 0x003a, 0, ["RollerVerticalUp", "RollerVerticalDown"]]
|
||||
- [ 0x003a, 1, ["RollerVerticalUp", "RollerVerticalDown"]]
|
||||
- [ 0x003a, 3, ["RollerHorizontalLeft", "RollerHorizontalRight"]]
|
||||
- [ 0x003a, 4, ["RollerHorizontalLeft", "RollerHorizontalRight"]]
|
||||
- [ 0x003b, 1, [ "Bumper", "AntiFairyCircle" ]]
|
||||
- [ 0x003b, 4, ["RollerVerticalUp", "RollerVerticalDown"]]
|
||||
- [ 0x003c, 0, ["BigSpike"]]
|
||||
@@ -306,7 +309,7 @@ UwGeneralDeny:
|
||||
- [0x00b0, 7, [ "StalfosKnight", "Blob", "Stal", "Wizzrobe"]] # blocked, but Geldmen are probably okay
|
||||
- [0x00b0, 8, [ "StalfosKnight", "Blob", "Stal", "Wizzrobe"]] # blocked, but Geldmen are probably okay
|
||||
- [ 0x00b1, 2, [ "RollerVerticalUp", "RollerVerticalDown" ] ] #"Misery Mire - Hourglass - Spike Trap 1"
|
||||
- [ 0x00b1, 3, [ "RollerVerticalUp", "RollerVerticalDown" ] ] #"Misery Mire - Hourglass - Spike Trap 2"
|
||||
- [ 0x00b1, 3, [ "RollerVerticalUp", "RollerVerticalDown", "Bumper" ] ] #"Misery Mire - Hourglass - Spike Trap 2"
|
||||
- [0x00b1, 4, ["Bumper", "BigSpike", "AntiFairyCircle", "Statue"]] # Wizzrobe near door
|
||||
- [ 0x00b2, 1, [ "Wizzrobe", "Statue" ] ] # Wizzrobes can't spawn on pots
|
||||
- [ 0x00b2, 3, [ "Wizzrobe", "Statue" ] ] # Wizzrobes can't spawn on pots
|
||||
@@ -339,11 +342,11 @@ UwGeneralDeny:
|
||||
- [ 0x00c2, 5, [ "Wizzrobe", "Statue" ] ] # Wizzrobes can't spawn on pots
|
||||
- [ 0x00c5, 6, [ "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight", "Beamos", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Turtle Rock - Catwalk - Mini Helmasaur"
|
||||
- [ 0x00c5, 7, [ "Statue" ] ] #"Turtle Rock - Catwalk - Laser Eye (Left) 4"
|
||||
- [0x00c6, 2, ["Bumper", "AntiFairyCircle"]]
|
||||
- [0x00c6, 3, ["Bumper", "AntiFairyCircle"]]
|
||||
- [0x00c6, 4, ["Bumper", "AntiFairyCircle"]]
|
||||
- [0x00c6, 5, ["Bumper", "AntiFairyCircle"]]
|
||||
- [0x00c6, 6, ["Bumper", "AntiFairyCircle"]]
|
||||
- [ 0x00c6, 2, ["Bumper", "AntiFairyCircle", "BigSpike" ]]
|
||||
- [ 0x00c6, 3, ["Bumper", "AntiFairyCircle", "BigSpike" ]]
|
||||
- [ 0x00c6, 4, ["Bumper", "AntiFairyCircle", "BigSpike" ]]
|
||||
- [ 0x00c6, 5, ["Bumper", "AntiFairyCircle", "BigSpike" ]]
|
||||
- [ 0x00c6, 6, ["Bumper", "AntiFairyCircle", "BigSpike" ]]
|
||||
- [ 0x00cb, 0, [ "Wizzrobe", "Statue" ] ] # Wizzrobes can't spawn on pots
|
||||
- [ 0x00cb, 3, [ "RollerVerticalUp", "RollerVerticalDown", "Beamos", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Thieves' Town - Grand Room NW - Zol 1"
|
||||
- [ 0x00cb, 5, [ "RollerVerticalUp", "RollerVerticalDown", "Beamos", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Thieves' Town - Grand Room NW - Zol 2"
|
||||
|
||||
@@ -58,17 +58,17 @@ class DataTables:
|
||||
self.bush_sprite_table = {}
|
||||
|
||||
# enemizer conditions
|
||||
self.uw_enemy_denials = {}
|
||||
self.ow_enemy_denials = {}
|
||||
self.uw_enemy_drop_denials = {}
|
||||
self.uw_enemy_denials = defaultdict(set)
|
||||
self.ow_enemy_denials = defaultdict(set)
|
||||
self.uw_enemy_drop_denials = defaultdict(set)
|
||||
self.sheet_choices = []
|
||||
denial_data = load_cached_yaml(['source', 'enemizer', 'enemy_deny.yaml'])
|
||||
for denial in denial_data['UwGeneralDeny']:
|
||||
self.uw_enemy_denials[denial[0], denial[1]] = {sprite_translation[x] for x in denial[2]}
|
||||
self.uw_enemy_denials[denial[0], denial[1]] |= {sprite_translation[x] for x in denial[2]}
|
||||
for denial in denial_data['OwGeneralDeny']:
|
||||
self.ow_enemy_denials[denial[0], denial[1]] = {sprite_translation[x] for x in denial[2]}
|
||||
self.ow_enemy_denials[denial[0], denial[1]] |= {sprite_translation[x] for x in denial[2]}
|
||||
for denial in denial_data['UwEnemyDrop']:
|
||||
self.uw_enemy_drop_denials[denial[0], denial[1]] = {sprite_translation[x] for x in denial[2]}
|
||||
self.uw_enemy_drop_denials[denial[0], denial[1]] |= {sprite_translation[x] for x in denial[2]}
|
||||
weights = load_cached_yaml(['source', 'enemizer', 'enemy_weight.yaml'])
|
||||
self.uw_weights = {sprite_translation[k]: v for k, v in weights['UW'].items()}
|
||||
self.ow_weights = {sprite_translation[k]: v for k, v in weights['OW'].items()}
|
||||
|
||||
264
vanilla_placements.yaml
Normal file
264
vanilla_placements.yaml
Normal 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
|
||||
265
vanilla_placements_universal.yaml
Normal file
265
vanilla_placements_universal.yaml
Normal 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
|
||||
|
||||
Reference in New Issue
Block a user