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.
This commit is contained in:
parent
cc70a6fa26
commit
3c74f561d5
|
@ -9,6 +9,7 @@ from collections import OrderedDict, Counter, deque
|
||||||
from typing import List, Dict, Optional, Set, Iterable, Union, Any, Tuple
|
from typing import List, Dict, Optional, Set, Iterable, Union, Any, Tuple
|
||||||
import secrets
|
import secrets
|
||||||
import random
|
import random
|
||||||
|
from worlds.alttp.Options import smallkey_shuffle
|
||||||
|
|
||||||
|
|
||||||
class MultiWorld():
|
class MultiWorld():
|
||||||
|
@ -569,7 +570,7 @@ class CollectionState(object):
|
||||||
def has_key(self, item, player, count: int = 1):
|
def has_key(self, item, player, count: int = 1):
|
||||||
if self.world.logic[player] == 'nologic':
|
if self.world.logic[player] == 'nologic':
|
||||||
return True
|
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.can_buy_unlimited('Small Key (Universal)', player)
|
||||||
return self.prog_items[item, player] >= count
|
return self.prog_items[item, player] >= count
|
||||||
|
|
||||||
|
|
|
@ -3,12 +3,13 @@ from worlds.alttp.Bosses import BossFactory
|
||||||
from Fill import fill_restrictive
|
from Fill import fill_restrictive
|
||||||
from worlds.alttp.Items import ItemFactory
|
from worlds.alttp.Items import ItemFactory
|
||||||
from worlds.alttp.Regions import lookup_boss_drops
|
from worlds.alttp.Regions import lookup_boss_drops
|
||||||
|
from worlds.alttp.Options import smallkey_shuffle
|
||||||
|
|
||||||
|
|
||||||
def create_dungeons(world, player):
|
def create_dungeons(world, player):
|
||||||
def make_dungeon(name, default_boss, dungeon_regions, big_key, small_keys, dungeon_items):
|
def make_dungeon(name, default_boss, dungeon_regions, big_key, small_keys, dungeon_items):
|
||||||
dungeon = Dungeon(name, dungeon_regions, big_key,
|
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)
|
dungeon_items, player)
|
||||||
for item in dungeon.all_items:
|
for item in dungeon.all_items:
|
||||||
item.dungeon = dungeon
|
item.dungeon = dungeon
|
||||||
|
|
|
@ -9,6 +9,7 @@ from worlds.alttp.Dungeons import get_dungeon_item_pool_player
|
||||||
from worlds.alttp.EntranceShuffle import connect_entrance
|
from worlds.alttp.EntranceShuffle import connect_entrance
|
||||||
from Fill import FillError
|
from Fill import FillError
|
||||||
from worlds.alttp.Items import ItemFactory, GetBeemizerItem
|
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.
|
# 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.
|
# 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(['Rupees (300)'] * 34)
|
||||||
itempool.extend(['Bombs (10)'] * 5)
|
itempool.extend(['Bombs (10)'] * 5)
|
||||||
itempool.extend(['Arrows (10)'] * 7)
|
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.extend(itemdiff.universal_keys)
|
||||||
itempool.append('Small Key (Universal)')
|
itempool.append('Small Key (Universal)')
|
||||||
|
|
||||||
|
@ -633,7 +634,7 @@ def get_pool_core(world, player: int):
|
||||||
if retro:
|
if retro:
|
||||||
replace = {'Single Arrow', 'Arrows (10)', 'Arrow Upgrade (+5)', 'Arrow Upgrade (+10)'}
|
replace = {'Single Arrow', 'Arrows (10)', 'Arrow Upgrade (+5)', 'Arrow Upgrade (+10)'}
|
||||||
pool = ['Rupees (5)' if item in replace else item for item in pool]
|
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)
|
pool.extend(diff.universal_keys)
|
||||||
item_to_place = 'Small Key (Universal)' if goal != 'icerodhunt' else 'Nothing'
|
item_to_place = 'Small Key (Universal)' if goal != 'icerodhunt' else 'Nothing'
|
||||||
if mode == 'standard':
|
if mode == 'standard':
|
||||||
|
@ -770,7 +771,7 @@ def make_custom_item_pool(world, player):
|
||||||
itemtotal = itemtotal + 1
|
itemtotal = itemtotal + 1
|
||||||
|
|
||||||
if mode == 'standard':
|
if mode == 'standard':
|
||||||
if world.smallkey_shuffle[player] == "universal":
|
if world.smallkey_shuffle[player] == smallkey_shuffle.option_universal:
|
||||||
key_location = world.random.choice(
|
key_location = world.random.choice(
|
||||||
['Secret Passage', 'Hyrule Castle - Boomerang Chest', 'Hyrule Castle - Map Chest',
|
['Secret Passage', 'Hyrule Castle - Boomerang Chest', 'Hyrule Castle - Map Chest',
|
||||||
'Hyrule Castle - Zelda\'s Chest', 'Sewers - Dark Cross'])
|
'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(['Magic Mirror'] * customitemarray[22])
|
||||||
pool.extend(['Moon Pearl'] * customitemarray[28])
|
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
|
itemtotal = itemtotal - 28 # Corrects for small keys not being in item pool in Retro Mode
|
||||||
if itemtotal < total_items_to_place:
|
if itemtotal < total_items_to_place:
|
||||||
pool.extend(['Nothing'] * (total_items_to_place - itemtotal))
|
pool.extend(['Nothing'] * (total_items_to_place - itemtotal))
|
||||||
|
|
|
@ -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 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.Items import ItemFactory, item_table
|
||||||
from worlds.alttp.EntranceShuffle import door_addresses
|
from worlds.alttp.EntranceShuffle import door_addresses
|
||||||
|
from worlds.alttp.Options import smallkey_shuffle
|
||||||
import Patch
|
import Patch
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
@ -1515,7 +1516,8 @@ def patch_rom(world, rom, player, enemized):
|
||||||
# b - Big Key
|
# b - Big Key
|
||||||
# a - Small 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)
|
| (0x02 if world.bigkey_shuffle[player] else 0x00)
|
||||||
| (0x04 if world.map_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
|
| (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[
|
rom.write_int16(0x18017C, get_reveal_bytes('Crystal 5') | get_reveal_bytes('Crystal 6') if world.map_shuffle[
|
||||||
player] else 0x0000) # Bomb Shop Reveal
|
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(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(0x180175, 0x01 if world.retro[player] else 0x00) # rupee bow
|
||||||
rom.write_byte(0x180176, 0x0A if world.retro[player] else 0x00) # wood arrow cost
|
rom.write_byte(0x180176, 0x0A if world.retro[player] else 0x00) # wood arrow cost
|
||||||
|
|
|
@ -8,6 +8,7 @@ from worlds.alttp.UnderworldGlitchRules import underworld_glitches_rules
|
||||||
from worlds.alttp.Bosses import GanonDefeatRule
|
from worlds.alttp.Bosses import GanonDefeatRule
|
||||||
from worlds.generic.Rules import set_rule, add_rule, forbid_item, add_item_rule, item_in_locations, \
|
from worlds.generic.Rules import set_rule, add_rule, forbid_item, add_item_rule, item_in_locations, \
|
||||||
item_name
|
item_name
|
||||||
|
from worlds.alttp.Options import smallkey_shuffle
|
||||||
|
|
||||||
|
|
||||||
def set_rules(world):
|
def set_rules(world):
|
||||||
|
@ -212,7 +213,7 @@ def global_rules(world, player):
|
||||||
|
|
||||||
set_rule(world.get_entrance('Sewers Door', player),
|
set_rule(world.get_entrance('Sewers Door', player),
|
||||||
lambda state: state.has_key('Small Key (Hyrule Castle)', player) or (
|
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
|
player] == 'standard')) # standard universal small keys cannot access the shop
|
||||||
set_rule(world.get_entrance('Sewers Back Door', player),
|
set_rule(world.get_entrance('Sewers Back Door', player),
|
||||||
lambda state: state.has_key('Small Key (Hyrule Castle)', player))
|
lambda state: state.has_key('Small Key (Hyrule Castle)', player))
|
||||||
|
|
|
@ -6,6 +6,7 @@ import logging
|
||||||
from worlds.alttp.SubClasses import ALttPLocation
|
from worlds.alttp.SubClasses import ALttPLocation
|
||||||
from worlds.alttp.EntranceShuffle import door_addresses
|
from worlds.alttp.EntranceShuffle import door_addresses
|
||||||
from worlds.alttp.Items import item_name_groups, item_table, ItemFactory, trap_replaceable, GetBeemizerItem
|
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
|
from Utils import int16_as_bytes
|
||||||
|
|
||||||
logger = logging.getLogger("Shops")
|
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.
|
# 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"] = \
|
||||||
player_shop_table["Dark Lake Hylia Shop"]._replace(items=_inverted_hylia_shop_defaults, locked=None)
|
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():
|
for region_name, (room_id, type, shopkeeper, custom, locked, inventory, sram_offset) in player_shop_table.items():
|
||||||
region = world.get_region(region_name, player)
|
region = world.get_region(region_name, player)
|
||||||
shop: Shop = shop_class_mapping[type](region, room_id, shopkeeper, custom, locked, sram_offset)
|
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
|
rss = world.get_region('Red Shield Shop', player).shop
|
||||||
replacement_items = [['Red Potion', 150], ['Green Potion', 75], ['Blue Potion', 200], ['Bombs (10)', 50],
|
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.
|
['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_items.append(['Small Key (Universal)', 100])
|
||||||
replacement_item = world.random.choice(replacement_items)
|
replacement_item = world.random.choice(replacement_items)
|
||||||
rss.add_inventory(2, 'Single Arrow', 80, 1, replacement_item[0], replacement_item[1])
|
rss.add_inventory(2, 'Single Arrow', 80, 1, replacement_item[0], replacement_item[1])
|
||||||
rss.locked = True
|
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
|
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],
|
s.custom and not s.locked and s.type == ShopType.Shop and s.region.player == player],
|
||||||
5):
|
5):
|
||||||
|
@ -385,7 +386,7 @@ def set_up_shops(world, player: int):
|
||||||
slots = [0, 1, 2]
|
slots = [0, 1, 2]
|
||||||
world.random.shuffle(slots)
|
world.random.shuffle(slots)
|
||||||
slots = iter(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)
|
shop.add_inventory(next(slots), 'Small Key (Universal)', 100)
|
||||||
if world.retro[player]:
|
if world.retro[player]:
|
||||||
shop.push_inventory(next(slots), 'Single Arrow', 80)
|
shop.push_inventory(next(slots), 'Single Arrow', 80)
|
||||||
|
|
|
@ -7,7 +7,7 @@ import typing
|
||||||
from BaseClasses import Item, CollectionState
|
from BaseClasses import Item, CollectionState
|
||||||
from .SubClasses import ALttPItem
|
from .SubClasses import ALttPItem
|
||||||
from ..AutoWorld import World
|
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 .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 .Regions import lookup_name_to_id, create_regions, mark_light_world_regions
|
||||||
from .Rules import set_rules
|
from .Rules import set_rules
|
||||||
|
@ -325,7 +325,7 @@ class ALTTPWorld(World):
|
||||||
standard_keyshuffle_players = set()
|
standard_keyshuffle_players = set()
|
||||||
for player in world.get_game_players("A Link to the Past"):
|
for player in world.get_game_players("A Link to the Past"):
|
||||||
if world.mode[player] == 'standard' and world.smallkey_shuffle[player] \
|
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)
|
standard_keyshuffle_players.add(player)
|
||||||
if not world.ganonstower_vanilla[player] or \
|
if not world.ganonstower_vanilla[player] or \
|
||||||
world.logic[player] in {'owglitches', 'hybridglitches', "nologic"}:
|
world.logic[player] in {'owglitches', 'hybridglitches', "nologic"}:
|
||||||
|
|
Loading…
Reference in New Issue