diff --git a/BaseClasses.py b/BaseClasses.py index a0609460..403936fd 100644 --- a/BaseClasses.py +++ b/BaseClasses.py @@ -139,7 +139,7 @@ class World(object): set_player_attr('treasure_hunt_total', 0) set_player_attr('potshuffle', False) set_player_attr('pot_contents', None) - set_player_attr('fakeboots', False) + set_player_attr('pseudoboots', False) set_player_attr('shopsanity', False) set_player_attr('keydropshuffle', False) diff --git a/CLI.py b/CLI.py index 1b6fae40..1730879e 100644 --- a/CLI.py +++ b/CLI.py @@ -98,7 +98,7 @@ def parse_cli(argv, no_defaults=False): 'shuffle', 'door_shuffle', 'intensity', 'crystals_ganon', 'crystals_gt', 'openpyramid', 'mapshuffle', 'compassshuffle', 'keyshuffle', 'bigkeyshuffle', 'startinventory', 'triforce_pool_min', 'triforce_pool_max', 'triforce_goal_min', 'triforce_goal_max', - 'triforce_min_difference', 'triforce_goal', 'triforce_pool', 'shufflelinks', 'fakeboots', + 'triforce_min_difference', 'triforce_goal', 'triforce_pool', 'shufflelinks', 'pseudoboots', 'retro', 'accessibility', 'hints', 'beemizer', 'experimental', 'dungeon_counters', 'shufflebosses', 'shuffleenemies', 'enemy_health', 'enemy_damage', 'shufflepots', 'ow_palettes', 'uw_palettes', 'sprite', 'disablemusic', 'quickswap', 'fastmenu', 'heartcolor', 'heartbeep', @@ -149,7 +149,7 @@ def parse_settings(): "ow_fluteshuffle": "vanilla", "shuffle": "vanilla", "shufflelinks": False, - "fakeboots": False, + "pseudoboots": False, "shufflepots": False, "shuffleenemies": "none", diff --git a/DoorShuffle.py b/DoorShuffle.py index 7a6f21d9..a2d7a9e6 100644 --- a/DoorShuffle.py +++ b/DoorShuffle.py @@ -100,8 +100,8 @@ def link_doors_main(world, player): analyze_portals(world, player) for portal in world.dungeon_portals[player]: connect_portal(portal, world, player) - - fix_big_key_doors_with_ugly_smalls(world, player) + if not world.doorShuffle[player] == 'vanilla': + fix_big_key_doors_with_ugly_smalls(world, player) if world.doorShuffle[player] == 'vanilla': for entrance, ext in open_edges: connect_two_way(world, entrance, ext, player) @@ -1678,7 +1678,7 @@ def change_door_to_small_key(d, world, player): def smooth_door_pairs(world, player): all_doors = [x for x in world.doors if x.player == player] skip = set() - bd_candidates, dashable_counts, bombable_counts = defaultdict(list), defaultdict(int), defaultdict(int) + bd_candidates = defaultdict(list) for door in all_doors: if door.type in [DoorType.Normal, DoorType.Interior] and door not in skip and not door.entranceFlag: partner = door.dest @@ -1704,30 +1704,19 @@ def smooth_door_pairs(world, player): remove_pair(door, world, player) if type_b == DoorKind.SmallKey: remove_pair(door, world, player) - elif type_a in [DoorKind.Bombable, DoorKind.Dashable] or type_b in [DoorKind.Bombable, DoorKind.Dashable]: + else: if valid_pair: - new_type = type_a - if type_a != type_b: - new_type = DoorKind.Dashable if type_a == DoorKind.Dashable or type_b == DoorKind.Dashable else DoorKind.Bombable - if type_a != new_type: - room_a.change(door.doorListPos, new_type) - if type_b != new_type: - room_b.change(partner.doorListPos, new_type) - add_pair(door, partner, world, player) - spoiler_type = 'Bomb Door' if new_type == DoorKind.Bombable else 'Dash Door' - world.spoiler.set_door_type(door.name + ' <-> ' + partner.name, spoiler_type, player) - counter = bombable_counts if new_type == DoorKind.Bombable else dashable_counts - counter[door.entrance.parent_region.dungeon] += 1 - else: + bd_candidates[door.entrance.parent_region.dungeon].append(door) + elif type_a in [DoorKind.Bombable, DoorKind.Dashable] or type_b in [DoorKind.Bombable, DoorKind.Dashable]: if type_a in [DoorKind.Bombable, DoorKind.Dashable]: room_a.change(door.doorListPos, DoorKind.Normal) remove_pair(door, world, player) - elif type_b in [DoorKind.Bombable, DoorKind.Dashable]: + else: room_b.change(partner.doorListPos, DoorKind.Normal) remove_pair(partner, world, player) elif valid_pair and type_a != DoorKind.SmallKey and type_b != DoorKind.SmallKey: bd_candidates[door.entrance.parent_region.dungeon].append(door) - shuffle_bombable_dashable(bd_candidates, bombable_counts, dashable_counts, world, player) + shuffle_bombable_dashable(bd_candidates, world, player) world.paired_doors[player] = [x for x in world.paired_doors[player] if x.pair or x.original] @@ -1764,15 +1753,15 @@ def stateful_door(door, kind): return False -def shuffle_bombable_dashable(bd_candidates, bombable_counts, dashable_counts, world, player): +def shuffle_bombable_dashable(bd_candidates, world, player): if world.doorShuffle[player] == 'basic': for dungeon, candidates in bd_candidates.items(): - diff = bomb_dash_counts[dungeon.name][1] - dashable_counts[dungeon] + diff = bomb_dash_counts[dungeon.name][1] if diff > 0: for chosen in random.sample(candidates, min(diff, len(candidates))): change_pair_type(chosen, DoorKind.Dashable, world, player) candidates.remove(chosen) - diff = bomb_dash_counts[dungeon.name][0] - bombable_counts[dungeon] + diff = bomb_dash_counts[dungeon.name][0] if diff > 0: for chosen in random.sample(candidates, min(diff, len(candidates))): change_pair_type(chosen, DoorKind.Bombable, world, player) @@ -1781,16 +1770,12 @@ def shuffle_bombable_dashable(bd_candidates, bombable_counts, dashable_counts, w remove_pair_type_if_present(excluded, world, player) elif world.doorShuffle[player] == 'crossed': all_candidates = sum(bd_candidates.values(), []) - all_bomb_counts = sum(bombable_counts.values()) - all_dash_counts = sum(dashable_counts.values()) - if all_dash_counts < 8: - for chosen in random.sample(all_candidates, min(8 - all_dash_counts, len(all_candidates))): - change_pair_type(chosen, DoorKind.Dashable, world, player) - all_candidates.remove(chosen) - if all_bomb_counts < 12: - for chosen in random.sample(all_candidates, min(12 - all_bomb_counts, len(all_candidates))): - change_pair_type(chosen, DoorKind.Bombable, world, player) - all_candidates.remove(chosen) + for chosen in random.sample(all_candidates, min(8, len(all_candidates))): + change_pair_type(chosen, DoorKind.Dashable, world, player) + all_candidates.remove(chosen) + for chosen in random.sample(all_candidates, min(12, len(all_candidates))): + change_pair_type(chosen, DoorKind.Bombable, world, player) + all_candidates.remove(chosen) for excluded in all_candidates: remove_pair_type_if_present(excluded, world, player) diff --git a/Main.py b/Main.py index f1d90bb4..e92bf010 100644 --- a/Main.py +++ b/Main.py @@ -28,7 +28,7 @@ from Fill import sell_potions, sell_keys, balance_multiworld_progression, balanc from ItemList import generate_itempool, difficulties, fill_prizes, customize_shops from Utils import output_path, parse_player_names -__version__ = '0.4.0.9-u' +__version__ = '0.4.0.11u' class EnemizerError(RuntimeError): @@ -93,7 +93,7 @@ def main(args, seed=None, fish=None): world.treasure_hunt_count = args.triforce_goal.copy() world.treasure_hunt_total = args.triforce_pool.copy() world.shufflelinks = args.shufflelinks.copy() - world.fakeboots = args.fakeboots.copy() + world.pseudoboots = args.pseudoboots.copy() world.rom_seeds = {player: random.randint(0, 999999999) for player in range(1, world.players + 1)} diff --git a/Mystery.py b/Mystery.py index a614702b..575ab90d 100644 --- a/Mystery.py +++ b/Mystery.py @@ -150,7 +150,7 @@ def roll_settings(weights): ret.dungeon_counters = 'pickup' if ret.door_shuffle != 'vanilla' or ret.compassshuffle == 'on' else 'off' ret.shufflelinks = get_choice('shufflelinks') == 'on' - ret.fakeboots = get_choice('fakeboots') == 'on' + ret.pseudoboots = get_choice('pseudoboots') == 'on' ret.shopsanity = get_choice('shopsanity') == 'on' ret.keydropshuffle = get_choice('keydropshuffle') == 'on' ret.mixed_travel = get_choice('mixed_travel') if 'mixed_travel' in weights else 'prevent' diff --git a/RELEASENOTES.md b/RELEASENOTES.md index a4c5eace..cafdb92f 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -12,8 +12,22 @@ Links house can now be shuffled in different ER settings. It will be limited to Thanks to qadan, cheuer, & compiling +## Pseudo Boots + +Thanks to Bonta. You can now start with pseudo boots that let you move fast, but have no other logical uses (bonking open things, hovering, etc) + +## Pendant/Crystal Indicator + +For accessibility, you now get a C or P indicator to the left of the magic bar on the HUD when instead a Crystal or Pendant. Requires ownership of the map of that dungeon for display. Thanks to kan. + # Bug Fixes and Notes. +* 0.4.0.11 + * Some minor base rom fixes + * Improved distribution of bombable/dashable doors +* 0.4.0.10 + * Renamed to pseudoboots + * Some release note updates * 0.4.0.9 * Fixes for stats and P/C indicator (thanks Kara) * Swamp lobby fixes (thanks Catobat) @@ -38,7 +52,7 @@ Thanks to qadan, cheuer, & compiling * Chest turn tracking (not yet in credits) * Damaged and magic stats in credits (gt bk removed) * Fix for infinite bombs - * Fake boots option + * Pseudo boots option * Always allowed medallions for swordless (no option yet) * 0.4.0.7 * Reduce flashing option added diff --git a/Rom.py b/Rom.py index 54d0916d..8dcf902e 100644 --- a/Rom.py +++ b/Rom.py @@ -31,7 +31,7 @@ from OverworldShuffle import default_flute_connections, flute_data JAP10HASH = '03a63945398191337e896e5771f77173' -RANDOMIZERBASEHASH = '1dc1961e57d4e588a262fa706de6c753' +RANDOMIZERBASEHASH = '487a04cf965bb89636f9b1621dd606d1' class JsonRom(object): @@ -1248,7 +1248,7 @@ def patch_rom(world, rom, player, team, enemized, is_mystery=False): rom.write_byte(0x18017E, 0x01) # Fairy fountains only trade in bottles # Starting equipment - if world.fakeboots[player]: + if world.pseudoboots[player]: rom.write_byte(0x18008E, 0x01) equip = [0] * (0x340 + 0x4F) diff --git a/asm/doortables.asm b/asm/doortables.asm index db1b6711..8ee0dd60 100644 --- a/asm/doortables.asm +++ b/asm/doortables.asm @@ -580,8 +580,8 @@ dw $00bc, $00a2, $00a3, $00c2, $001a, $0049, $0014, $008c ; Ice Many Pots, Swamp Waterfall, GT Gauntlet 3, Eastern Push Block, Eastern Courtyard, Eastern Map Valley ; Eastern Cannonball, HC East Hall dw $009f, $0066, $005d, $00a8, $00a9, $00aa, $00b9, $0052 -; HC West Hall, TR Dash Bridge, TR Hub, Pod Arena, GT Petting Zoo -dw $0050, $00c5, $00c6, $0009, $0003, $002a, $007d +; HC West Hall, TR Dash Bridge, TR Hub, Pod Arena, GT Petting Zoo, Ice Spike Cross +dw $0050, $00c5, $00c6, $0009, $0003, $002a, $007d, $005e dw $ffff ; dungeon tables diff --git a/data/base2current.bps b/data/base2current.bps index 3b428223..044a244c 100644 Binary files a/data/base2current.bps and b/data/base2current.bps differ diff --git a/resources/app/cli/args.json b/resources/app/cli/args.json index 43dabb31..b317774a 100644 --- a/resources/app/cli/args.json +++ b/resources/app/cli/args.json @@ -354,7 +354,7 @@ "action": "store_true", "type": "bool" }, - "fakeboots": { + "pseudoboots": { "action": "store_true", "type": "bool" }, diff --git a/resources/app/cli/lang/en.json b/resources/app/cli/lang/en.json index 10c823a3..b69287ea 100644 --- a/resources/app/cli/lang/en.json +++ b/resources/app/cli/lang/en.json @@ -290,7 +290,7 @@ "Keys are universal, shooting arrows costs rupees,", "and a few other little things make this more like Zelda-1. (default: %(default)s)" ], - "fakeboots": [ " Players starts with fake boots that allow dashing but no item checks (default: %(default)s"], + "pseudoboots": [ " Players starts with pseudo boots that allow dashing but no item checks (default: %(default)s"], "startinventory": [ "Specifies a list of items that will be in your starting inventory (separated by commas). (default: %(default)s)" ], "usestartinventory": [ "Toggle usage of Starting Inventory." ], "custom": [ "Not supported." ], diff --git a/resources/app/gui/lang/en.json b/resources/app/gui/lang/en.json index 7bb13444..1b934e84 100644 --- a/resources/app/gui/lang/en.json +++ b/resources/app/gui/lang/en.json @@ -206,7 +206,7 @@ "randomizer.item.hints": "Include Helpful Hints", "randomizer.item.retro": "Retro mode (universal keys)", - "randomizer.item.fakeboots": "Start with Fake Boots", + "randomizer.item.pseudoboots": "Start with Pseudo Boots", "randomizer.item.worldstate": "World State", "randomizer.item.worldstate.standard": "Standard", diff --git a/resources/app/gui/randomize/item/widgets.json b/resources/app/gui/randomize/item/widgets.json index 1f5eb19a..a6f10a14 100644 --- a/resources/app/gui/randomize/item/widgets.json +++ b/resources/app/gui/randomize/item/widgets.json @@ -5,7 +5,7 @@ "hints": { "type": "checkbox" }, - "fakeboots": { "type": "checkbox" } + "pseudoboots": { "type": "checkbox" } }, "leftItemFrame": { "worldstate": { diff --git a/source/classes/constants.py b/source/classes/constants.py index c9740675..0d2e6154 100644 --- a/source/classes/constants.py +++ b/source/classes/constants.py @@ -58,7 +58,7 @@ SETTINGSTOPROCESS = { "hints": "hints", "retro": "retro", "shopsanity": "shopsanity", - "fakeboots": "fakeboots", + "pseudoboots": "pseudoboots", "worldstate": "mode", "logiclevel": "logic", "goal": "goal",