From 3c74f561d56cffc62e9e5891c419d8512ca7f9e6 Mon Sep 17 00:00:00 2001 From: CaitSith2 Date: Mon, 30 Aug 2021 09:59:20 -0700 Subject: [PATCH] LttP: Fix smallkey_shuffle in menu display use smallkey_shuffle.option_universal from worlds.alttp.Options rather than "universal" for compare operations on universal checking. --- BaseClasses.py | 3 ++- worlds/alttp/Dungeons.py | 3 ++- worlds/alttp/ItemPool.py | 9 +++++---- worlds/alttp/Rom.py | 6 ++++-- worlds/alttp/Rules.py | 3 ++- worlds/alttp/Shops.py | 9 +++++---- worlds/alttp/__init__.py | 4 ++-- 7 files changed, 22 insertions(+), 15 deletions(-) diff --git a/BaseClasses.py b/BaseClasses.py index 65b5d97f..69461677 100644 --- a/BaseClasses.py +++ b/BaseClasses.py @@ -9,6 +9,7 @@ from collections import OrderedDict, Counter, deque from typing import List, Dict, Optional, Set, Iterable, Union, Any, Tuple import secrets import random +from worlds.alttp.Options import smallkey_shuffle class MultiWorld(): @@ -569,7 +570,7 @@ class CollectionState(object): def has_key(self, item, player, count: int = 1): if self.world.logic[player] == 'nologic': return True - if self.world.smallkey_shuffle[player] == "universal": + if self.world.smallkey_shuffle[player] == smallkey_shuffle.option_universal: return self.can_buy_unlimited('Small Key (Universal)', player) return self.prog_items[item, player] >= count diff --git a/worlds/alttp/Dungeons.py b/worlds/alttp/Dungeons.py index fee1cadb..a2c3b8c3 100644 --- a/worlds/alttp/Dungeons.py +++ b/worlds/alttp/Dungeons.py @@ -3,12 +3,13 @@ from worlds.alttp.Bosses import BossFactory from Fill import fill_restrictive from worlds.alttp.Items import ItemFactory from worlds.alttp.Regions import lookup_boss_drops +from worlds.alttp.Options import smallkey_shuffle def create_dungeons(world, player): def make_dungeon(name, default_boss, dungeon_regions, big_key, small_keys, dungeon_items): dungeon = Dungeon(name, dungeon_regions, big_key, - [] if world.smallkey_shuffle[player] == "universal" else small_keys, + [] if world.smallkey_shuffle[player] == smallkey_shuffle.option_universal else small_keys, dungeon_items, player) for item in dungeon.all_items: item.dungeon = dungeon diff --git a/worlds/alttp/ItemPool.py b/worlds/alttp/ItemPool.py index c0ea01cc..2b207988 100644 --- a/worlds/alttp/ItemPool.py +++ b/worlds/alttp/ItemPool.py @@ -9,6 +9,7 @@ from worlds.alttp.Dungeons import get_dungeon_item_pool_player from worlds.alttp.EntranceShuffle import connect_entrance from Fill import FillError from worlds.alttp.Items import ItemFactory, GetBeemizerItem +from worlds.alttp.Options import smallkey_shuffle # This file sets the item pools for various modes. Timed modes and triforce hunt are enforced first, and then extra items are specified per mode to fill in the remaining space. # Some basic items that various modes require are placed here, including pendants and crystals. Medallion requirements for the two relevant entrances are also decided. @@ -274,7 +275,7 @@ def generate_itempool(world): itempool.extend(['Rupees (300)'] * 34) itempool.extend(['Bombs (10)'] * 5) itempool.extend(['Arrows (10)'] * 7) - if world.smallkey_shuffle[player] == 'universal': + if world.smallkey_shuffle[player] == smallkey_shuffle.option_universal: itempool.extend(itemdiff.universal_keys) itempool.append('Small Key (Universal)') @@ -633,7 +634,7 @@ def get_pool_core(world, player: int): if retro: replace = {'Single Arrow', 'Arrows (10)', 'Arrow Upgrade (+5)', 'Arrow Upgrade (+10)'} pool = ['Rupees (5)' if item in replace else item for item in pool] - if world.smallkey_shuffle[player] == "universal": + if world.smallkey_shuffle[player] == smallkey_shuffle.option_universal: pool.extend(diff.universal_keys) item_to_place = 'Small Key (Universal)' if goal != 'icerodhunt' else 'Nothing' if mode == 'standard': @@ -770,7 +771,7 @@ def make_custom_item_pool(world, player): itemtotal = itemtotal + 1 if mode == 'standard': - if world.smallkey_shuffle[player] == "universal": + if world.smallkey_shuffle[player] == smallkey_shuffle.option_universal: key_location = world.random.choice( ['Secret Passage', 'Hyrule Castle - Boomerang Chest', 'Hyrule Castle - Map Chest', 'Hyrule Castle - Zelda\'s Chest', 'Sewers - Dark Cross']) @@ -793,7 +794,7 @@ def make_custom_item_pool(world, player): pool.extend(['Magic Mirror'] * customitemarray[22]) pool.extend(['Moon Pearl'] * customitemarray[28]) - if world.smallkey_shuffle == "universal": + if world.smallkey_shuffle[player] == smallkey_shuffle.option_universal: itemtotal = itemtotal - 28 # Corrects for small keys not being in item pool in Retro Mode if itemtotal < total_items_to_place: pool.extend(['Nothing'] * (total_items_to_place - itemtotal)) diff --git a/worlds/alttp/Rom.py b/worlds/alttp/Rom.py index 949d243c..a1cd2b9b 100644 --- a/worlds/alttp/Rom.py +++ b/worlds/alttp/Rom.py @@ -37,6 +37,7 @@ from worlds.alttp.Text import KingsReturn_texts, Sanctuary_texts, Kakariko_texts from Utils import local_path, int16_as_bytes, int32_as_bytes, snes_to_pc, is_frozen from worlds.alttp.Items import ItemFactory, item_table from worlds.alttp.EntranceShuffle import door_addresses +from worlds.alttp.Options import smallkey_shuffle import Patch try: @@ -1515,7 +1516,8 @@ def patch_rom(world, rom, player, enemized): # b - Big Key # a - Small Key # - rom.write_byte(0x180045, ((0x01 if world.smallkey_shuffle[player] is True else 0x00) + rom.write_byte(0x180045, ((0x00 if (world.smallkey_shuffle[player] == smallkey_shuffle.option_original_dungeon or + world.smallkey_shuffle[player] == smallkey_shuffle.option_universal) else 0x01) | (0x02 if world.bigkey_shuffle[player] else 0x00) | (0x04 if world.map_shuffle[player] else 0x00) | (0x08 if world.compass_shuffle[player] else 0x00))) # free roaming items in menu @@ -1548,7 +1550,7 @@ def patch_rom(world, rom, player, enemized): rom.write_int16(0x18017C, get_reveal_bytes('Crystal 5') | get_reveal_bytes('Crystal 6') if world.map_shuffle[ player] else 0x0000) # Bomb Shop Reveal - rom.write_byte(0x180172, 0x01 if world.smallkey_shuffle[player] == "universal" else 0x00) # universal keys + rom.write_byte(0x180172, 0x01 if world.smallkey_shuffle[player] == smallkey_shuffle.option_universal else 0x00) # universal keys rom.write_byte(0x18637E, 0x01 if world.retro[player] else 0x00) # Skip quiver in item shops once bought rom.write_byte(0x180175, 0x01 if world.retro[player] else 0x00) # rupee bow rom.write_byte(0x180176, 0x0A if world.retro[player] else 0x00) # wood arrow cost diff --git a/worlds/alttp/Rules.py b/worlds/alttp/Rules.py index 7defb55a..8ace2772 100644 --- a/worlds/alttp/Rules.py +++ b/worlds/alttp/Rules.py @@ -8,6 +8,7 @@ from worlds.alttp.UnderworldGlitchRules import underworld_glitches_rules from worlds.alttp.Bosses import GanonDefeatRule from worlds.generic.Rules import set_rule, add_rule, forbid_item, add_item_rule, item_in_locations, \ item_name +from worlds.alttp.Options import smallkey_shuffle def set_rules(world): @@ -212,7 +213,7 @@ def global_rules(world, player): set_rule(world.get_entrance('Sewers Door', player), lambda state: state.has_key('Small Key (Hyrule Castle)', player) or ( - world.smallkey_shuffle[player] == "universal" and world.mode[ + world.smallkey_shuffle[player] == smallkey_shuffle.option_universal and world.mode[ player] == 'standard')) # standard universal small keys cannot access the shop set_rule(world.get_entrance('Sewers Back Door', player), lambda state: state.has_key('Small Key (Hyrule Castle)', player)) diff --git a/worlds/alttp/Shops.py b/worlds/alttp/Shops.py index c7e42626..5d4813da 100644 --- a/worlds/alttp/Shops.py +++ b/worlds/alttp/Shops.py @@ -6,6 +6,7 @@ import logging from worlds.alttp.SubClasses import ALttPLocation from worlds.alttp.EntranceShuffle import door_addresses from worlds.alttp.Items import item_name_groups, item_table, ItemFactory, trap_replaceable, GetBeemizerItem +from worlds.alttp.Options import smallkey_shuffle from Utils import int16_as_bytes logger = logging.getLogger("Shops") @@ -271,7 +272,7 @@ def create_shops(world, player: int): # make sure that blue potion is available in inverted, special case locked = None; lock when done. player_shop_table["Dark Lake Hylia Shop"] = \ player_shop_table["Dark Lake Hylia Shop"]._replace(items=_inverted_hylia_shop_defaults, locked=None) - chance_100 = int(world.retro[player])*0.25+int(world.smallkey_shuffle[player] == "universal") * 0.5 + chance_100 = int(world.retro[player])*0.25+int(world.smallkey_shuffle[player] == smallkey_shuffle.option_universal) * 0.5 for region_name, (room_id, type, shopkeeper, custom, locked, inventory, sram_offset) in player_shop_table.items(): region = world.get_region(region_name, player) shop: Shop = shop_class_mapping[type](region, room_id, shopkeeper, custom, locked, sram_offset) @@ -371,13 +372,13 @@ def set_up_shops(world, player: int): rss = world.get_region('Red Shield Shop', player).shop replacement_items = [['Red Potion', 150], ['Green Potion', 75], ['Blue Potion', 200], ['Bombs (10)', 50], ['Blue Shield', 50], ['Small Heart', 10]] # Can't just replace the single arrow with 10 arrows as retro doesn't need them. - if world.smallkey_shuffle[player] == "universal": + if world.smallkey_shuffle[player] == smallkey_shuffle.option_universal: replacement_items.append(['Small Key (Universal)', 100]) replacement_item = world.random.choice(replacement_items) rss.add_inventory(2, 'Single Arrow', 80, 1, replacement_item[0], replacement_item[1]) rss.locked = True - if world.smallkey_shuffle[player] == "universal" or world.retro[player]: + if world.smallkey_shuffle[player] == smallkey_shuffle.option_universal or world.retro[player]: for shop in world.random.sample([s for s in world.shops if s.custom and not s.locked and s.type == ShopType.Shop and s.region.player == player], 5): @@ -385,7 +386,7 @@ def set_up_shops(world, player: int): slots = [0, 1, 2] world.random.shuffle(slots) slots = iter(slots) - if world.smallkey_shuffle[player] == "universal": + if world.smallkey_shuffle[player] == smallkey_shuffle.option_universal: shop.add_inventory(next(slots), 'Small Key (Universal)', 100) if world.retro[player]: shop.push_inventory(next(slots), 'Single Arrow', 80) diff --git a/worlds/alttp/__init__.py b/worlds/alttp/__init__.py index 4320fd01..d0e57227 100644 --- a/worlds/alttp/__init__.py +++ b/worlds/alttp/__init__.py @@ -7,7 +7,7 @@ import typing from BaseClasses import Item, CollectionState from .SubClasses import ALttPItem from ..AutoWorld import World -from .Options import alttp_options +from .Options import alttp_options, smallkey_shuffle from .Items import as_dict_item_table, item_name_groups, item_table from .Regions import lookup_name_to_id, create_regions, mark_light_world_regions from .Rules import set_rules @@ -325,7 +325,7 @@ class ALTTPWorld(World): standard_keyshuffle_players = set() for player in world.get_game_players("A Link to the Past"): if world.mode[player] == 'standard' and world.smallkey_shuffle[player] \ - and world.smallkey_shuffle[player] != "universal": + and world.smallkey_shuffle[player] != smallkey_shuffle.option_universal: standard_keyshuffle_players.add(player) if not world.ganonstower_vanilla[player] or \ world.logic[player] in {'owglitches', 'hybridglitches', "nologic"}: