LTTP: remove multiworld = None (#2290)

This commit is contained in:
Aaron Wagener 2024-03-10 01:18:25 -06:00 committed by GitHub
parent 4ce58c0240
commit 939a5ec959
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
17 changed files with 122 additions and 122 deletions

View File

@ -10,7 +10,7 @@ from worlds import AutoWorld
from worlds.AutoWorld import World, call_all from worlds.AutoWorld import World, call_all
from BaseClasses import Location, MultiWorld, CollectionState, ItemClassification, Item from BaseClasses import Location, MultiWorld, CollectionState, ItemClassification, Item
from worlds.alttp.Items import ItemFactory from worlds.alttp.Items import item_factory
class TestBase(unittest.TestCase): class TestBase(unittest.TestCase):
@ -91,15 +91,15 @@ class TestBase(unittest.TestCase):
items = self.multiworld.itempool[:] items = self.multiworld.itempool[:]
items = [item for item in items if items = [item for item in items if
item.name not in all_except and not ("Bottle" in item.name and "AnyBottle" in all_except)] item.name not in all_except and not ("Bottle" in item.name and "AnyBottle" in all_except)]
items.extend(ItemFactory(item_pool[0], 1)) items.extend(item_factory(item_pool[0], self.multiworld.worlds[1]))
else: else:
items = ItemFactory(item_pool[0], 1) items = item_factory(item_pool[0], self.multiworld.worlds[1])
return self.get_state(items) return self.get_state(items)
def _get_items_partial(self, item_pool, missing_item): def _get_items_partial(self, item_pool, missing_item):
new_items = item_pool[0].copy() new_items = item_pool[0].copy()
new_items.remove(missing_item) new_items.remove(missing_item)
items = ItemFactory(new_items, 1) items = item_factory(new_items, self.multiworld.worlds[1])
return self.get_state(items) return self.get_state(items)

View File

@ -8,7 +8,7 @@ class TestBase(unittest.TestCase):
def test_create_item(self): def test_create_item(self):
"""Test that a world can successfully create all items in its datapackage""" """Test that a world can successfully create all items in its datapackage"""
for game_name, world_type in AutoWorldRegister.world_types.items(): for game_name, world_type in AutoWorldRegister.world_types.items():
proxy_world = world_type(None, 0) # this is identical to MultiServer.py creating worlds proxy_world = setup_solo_multiworld(world_type, ()).worlds[1]
for item_name in world_type.item_name_to_id: for item_name in world_type.item_name_to_id:
with self.subTest("Create Item", item_name=item_name, game_name=game_name): with self.subTest("Create Item", item_name=item_name, game_name=game_name):
item = proxy_world.create_item(item_name) item = proxy_world.create_item(item_name)

View File

@ -296,6 +296,7 @@ class World(metaclass=AutoWorldRegister):
"""path it was loaded from""" """path it was loaded from"""
def __init__(self, multiworld: "MultiWorld", player: int): def __init__(self, multiworld: "MultiWorld", player: int):
assert multiworld is not None
self.multiworld = multiworld self.multiworld = multiworld
self.player = player self.player = player

View File

@ -7,7 +7,7 @@ from BaseClasses import CollectionState, Region, MultiWorld
from Fill import fill_restrictive from Fill import fill_restrictive
from .Bosses import BossFactory, Boss from .Bosses import BossFactory, Boss
from .Items import ItemFactory from .Items import item_factory
from .Regions import lookup_boss_drops, key_drop_data from .Regions import lookup_boss_drops, key_drop_data
from .Options import small_key_shuffle from .Options import small_key_shuffle
@ -81,90 +81,90 @@ def create_dungeons(world: "ALTTPWorld"):
return dungeon return dungeon
ES = make_dungeon('Hyrule Castle', None, ['Hyrule Castle', 'Sewers', 'Sewer Drop', 'Sewers (Dark)', 'Sanctuary'], ES = make_dungeon('Hyrule Castle', None, ['Hyrule Castle', 'Sewers', 'Sewer Drop', 'Sewers (Dark)', 'Sanctuary'],
ItemFactory('Big Key (Hyrule Castle)', player), item_factory('Big Key (Hyrule Castle)', world),
ItemFactory(['Small Key (Hyrule Castle)'] * 4, player), item_factory(['Small Key (Hyrule Castle)'] * 4, world),
[ItemFactory('Map (Hyrule Castle)', player)]) [item_factory('Map (Hyrule Castle)', world)])
EP = make_dungeon('Eastern Palace', 'Armos Knights', ['Eastern Palace'], EP = make_dungeon('Eastern Palace', 'Armos Knights', ['Eastern Palace'],
ItemFactory('Big Key (Eastern Palace)', player), item_factory('Big Key (Eastern Palace)', world),
ItemFactory(['Small Key (Eastern Palace)'] * 2, player), item_factory(['Small Key (Eastern Palace)'] * 2, world),
ItemFactory(['Map (Eastern Palace)', 'Compass (Eastern Palace)'], player)) item_factory(['Map (Eastern Palace)', 'Compass (Eastern Palace)'], world))
DP = make_dungeon('Desert Palace', 'Lanmolas', DP = make_dungeon('Desert Palace', 'Lanmolas',
['Desert Palace North', 'Desert Palace Main (Inner)', 'Desert Palace Main (Outer)', ['Desert Palace North', 'Desert Palace Main (Inner)', 'Desert Palace Main (Outer)',
'Desert Palace East'], ItemFactory('Big Key (Desert Palace)', player), 'Desert Palace East'], item_factory('Big Key (Desert Palace)', world),
ItemFactory(['Small Key (Desert Palace)'] * 4, player), item_factory(['Small Key (Desert Palace)'] * 4, world),
ItemFactory(['Map (Desert Palace)', 'Compass (Desert Palace)'], player)) item_factory(['Map (Desert Palace)', 'Compass (Desert Palace)'], world))
ToH = make_dungeon('Tower of Hera', 'Moldorm', ToH = make_dungeon('Tower of Hera', 'Moldorm',
['Tower of Hera (Bottom)', 'Tower of Hera (Basement)', 'Tower of Hera (Top)'], ['Tower of Hera (Bottom)', 'Tower of Hera (Basement)', 'Tower of Hera (Top)'],
ItemFactory('Big Key (Tower of Hera)', player), item_factory('Big Key (Tower of Hera)', world),
[ItemFactory('Small Key (Tower of Hera)', player)], [item_factory('Small Key (Tower of Hera)', world)],
ItemFactory(['Map (Tower of Hera)', 'Compass (Tower of Hera)'], player)) item_factory(['Map (Tower of Hera)', 'Compass (Tower of Hera)'], world))
PoD = make_dungeon('Palace of Darkness', 'Helmasaur King', PoD = make_dungeon('Palace of Darkness', 'Helmasaur King',
['Palace of Darkness (Entrance)', 'Palace of Darkness (Center)', ['Palace of Darkness (Entrance)', 'Palace of Darkness (Center)',
'Palace of Darkness (Big Key Chest)', 'Palace of Darkness (Bonk Section)', 'Palace of Darkness (Big Key Chest)', 'Palace of Darkness (Bonk Section)',
'Palace of Darkness (North)', 'Palace of Darkness (Maze)', 'Palace of Darkness (North)', 'Palace of Darkness (Maze)',
'Palace of Darkness (Harmless Hellway)', 'Palace of Darkness (Final Section)'], 'Palace of Darkness (Harmless Hellway)', 'Palace of Darkness (Final Section)'],
ItemFactory('Big Key (Palace of Darkness)', player), item_factory('Big Key (Palace of Darkness)', world),
ItemFactory(['Small Key (Palace of Darkness)'] * 6, player), item_factory(['Small Key (Palace of Darkness)'] * 6, world),
ItemFactory(['Map (Palace of Darkness)', 'Compass (Palace of Darkness)'], player)) item_factory(['Map (Palace of Darkness)', 'Compass (Palace of Darkness)'], world))
TT = make_dungeon('Thieves Town', 'Blind', ['Thieves Town (Entrance)', 'Thieves Town (Deep)', 'Blind Fight'], TT = make_dungeon('Thieves Town', 'Blind', ['Thieves Town (Entrance)', 'Thieves Town (Deep)', 'Blind Fight'],
ItemFactory('Big Key (Thieves Town)', player), item_factory('Big Key (Thieves Town)', world),
ItemFactory(['Small Key (Thieves Town)'] * 3, player), item_factory(['Small Key (Thieves Town)'] * 3, world),
ItemFactory(['Map (Thieves Town)', 'Compass (Thieves Town)'], player)) item_factory(['Map (Thieves Town)', 'Compass (Thieves Town)'], world))
SW = make_dungeon('Skull Woods', 'Mothula', ['Skull Woods Final Section (Entrance)', 'Skull Woods First Section', SW = make_dungeon('Skull Woods', 'Mothula', ['Skull Woods Final Section (Entrance)', 'Skull Woods First Section',
'Skull Woods Second Section', 'Skull Woods Second Section (Drop)', 'Skull Woods Second Section', 'Skull Woods Second Section (Drop)',
'Skull Woods Final Section (Mothula)', 'Skull Woods Final Section (Mothula)',
'Skull Woods First Section (Right)', 'Skull Woods First Section (Right)',
'Skull Woods First Section (Left)', 'Skull Woods First Section (Top)'], 'Skull Woods First Section (Left)', 'Skull Woods First Section (Top)'],
ItemFactory('Big Key (Skull Woods)', player), item_factory('Big Key (Skull Woods)', world),
ItemFactory(['Small Key (Skull Woods)'] * 5, player), item_factory(['Small Key (Skull Woods)'] * 5, world),
ItemFactory(['Map (Skull Woods)', 'Compass (Skull Woods)'], player)) item_factory(['Map (Skull Woods)', 'Compass (Skull Woods)'], world))
SP = make_dungeon('Swamp Palace', 'Arrghus', SP = make_dungeon('Swamp Palace', 'Arrghus',
['Swamp Palace (Entrance)', 'Swamp Palace (First Room)', 'Swamp Palace (Starting Area)', ['Swamp Palace (Entrance)', 'Swamp Palace (First Room)', 'Swamp Palace (Starting Area)',
'Swamp Palace (West)', 'Swamp Palace (Center)', 'Swamp Palace (North)'], 'Swamp Palace (West)', 'Swamp Palace (Center)', 'Swamp Palace (North)'],
ItemFactory('Big Key (Swamp Palace)', player), item_factory('Big Key (Swamp Palace)', world),
ItemFactory(['Small Key (Swamp Palace)'] * 6, player), item_factory(['Small Key (Swamp Palace)'] * 6, world),
ItemFactory(['Map (Swamp Palace)', 'Compass (Swamp Palace)'], player)) item_factory(['Map (Swamp Palace)', 'Compass (Swamp Palace)'], world))
IP = make_dungeon('Ice Palace', 'Kholdstare', IP = make_dungeon('Ice Palace', 'Kholdstare',
['Ice Palace (Entrance)', 'Ice Palace (Second Section)', 'Ice Palace (Main)', 'Ice Palace (East)', ['Ice Palace (Entrance)', 'Ice Palace (Second Section)', 'Ice Palace (Main)', 'Ice Palace (East)',
'Ice Palace (East Top)', 'Ice Palace (Kholdstare)'], ItemFactory('Big Key (Ice Palace)', player), 'Ice Palace (East Top)', 'Ice Palace (Kholdstare)'], item_factory('Big Key (Ice Palace)', world),
ItemFactory(['Small Key (Ice Palace)'] * 6, player), item_factory(['Small Key (Ice Palace)'] * 6, world),
ItemFactory(['Map (Ice Palace)', 'Compass (Ice Palace)'], player)) item_factory(['Map (Ice Palace)', 'Compass (Ice Palace)'], world))
MM = make_dungeon('Misery Mire', 'Vitreous', MM = make_dungeon('Misery Mire', 'Vitreous',
['Misery Mire (Entrance)', 'Misery Mire (Main)', 'Misery Mire (West)', 'Misery Mire (Final Area)', ['Misery Mire (Entrance)', 'Misery Mire (Main)', 'Misery Mire (West)', 'Misery Mire (Final Area)',
'Misery Mire (Vitreous)'], ItemFactory('Big Key (Misery Mire)', player), 'Misery Mire (Vitreous)'], item_factory('Big Key (Misery Mire)', world),
ItemFactory(['Small Key (Misery Mire)'] * 6, player), item_factory(['Small Key (Misery Mire)'] * 6, world),
ItemFactory(['Map (Misery Mire)', 'Compass (Misery Mire)'], player)) item_factory(['Map (Misery Mire)', 'Compass (Misery Mire)'], world))
TR = make_dungeon('Turtle Rock', 'Trinexx', TR = make_dungeon('Turtle Rock', 'Trinexx',
['Turtle Rock (Entrance)', 'Turtle Rock (First Section)', 'Turtle Rock (Chain Chomp Room)', ['Turtle Rock (Entrance)', 'Turtle Rock (First Section)', 'Turtle Rock (Chain Chomp Room)',
'Turtle Rock (Pokey Room)', 'Turtle Rock (Pokey Room)',
'Turtle Rock (Second Section)', 'Turtle Rock (Big Chest)', 'Turtle Rock (Crystaroller Room)', 'Turtle Rock (Second Section)', 'Turtle Rock (Big Chest)', 'Turtle Rock (Crystaroller Room)',
'Turtle Rock (Dark Room)', 'Turtle Rock (Eye Bridge)', 'Turtle Rock (Trinexx)'], 'Turtle Rock (Dark Room)', 'Turtle Rock (Eye Bridge)', 'Turtle Rock (Trinexx)'],
ItemFactory('Big Key (Turtle Rock)', player), item_factory('Big Key (Turtle Rock)', world),
ItemFactory(['Small Key (Turtle Rock)'] * 6, player), item_factory(['Small Key (Turtle Rock)'] * 6, world),
ItemFactory(['Map (Turtle Rock)', 'Compass (Turtle Rock)'], player)) item_factory(['Map (Turtle Rock)', 'Compass (Turtle Rock)'], world))
if multiworld.mode[player] != 'inverted': if multiworld.mode[player] != 'inverted':
AT = make_dungeon('Agahnims Tower', 'Agahnim', ['Agahnims Tower', 'Agahnim 1'], None, AT = make_dungeon('Agahnims Tower', 'Agahnim', ['Agahnims Tower', 'Agahnim 1'], None,
ItemFactory(['Small Key (Agahnims Tower)'] * 4, player), []) item_factory(['Small Key (Agahnims Tower)'] * 4, world), [])
GT = make_dungeon('Ganons Tower', 'Agahnim2', GT = make_dungeon('Ganons Tower', 'Agahnim2',
['Ganons Tower (Entrance)', 'Ganons Tower (Tile Room)', 'Ganons Tower (Compass Room)', ['Ganons Tower (Entrance)', 'Ganons Tower (Tile Room)', 'Ganons Tower (Compass Room)',
'Ganons Tower (Hookshot Room)', 'Ganons Tower (Map Room)', 'Ganons Tower (Firesnake Room)', 'Ganons Tower (Hookshot Room)', 'Ganons Tower (Map Room)', 'Ganons Tower (Firesnake Room)',
'Ganons Tower (Teleport Room)', 'Ganons Tower (Bottom)', 'Ganons Tower (Top)', 'Ganons Tower (Teleport Room)', 'Ganons Tower (Bottom)', 'Ganons Tower (Top)',
'Ganons Tower (Before Moldorm)', 'Ganons Tower (Moldorm)', 'Agahnim 2'], 'Ganons Tower (Before Moldorm)', 'Ganons Tower (Moldorm)', 'Agahnim 2'],
ItemFactory('Big Key (Ganons Tower)', player), item_factory('Big Key (Ganons Tower)', world),
ItemFactory(['Small Key (Ganons Tower)'] * 8, player), item_factory(['Small Key (Ganons Tower)'] * 8, world),
ItemFactory(['Map (Ganons Tower)', 'Compass (Ganons Tower)'], player)) item_factory(['Map (Ganons Tower)', 'Compass (Ganons Tower)'], world))
else: else:
AT = make_dungeon('Inverted Agahnims Tower', 'Agahnim', ['Inverted Agahnims Tower', 'Agahnim 1'], None, AT = make_dungeon('Inverted Agahnims Tower', 'Agahnim', ['Inverted Agahnims Tower', 'Agahnim 1'], None,
ItemFactory(['Small Key (Agahnims Tower)'] * 4, player), []) item_factory(['Small Key (Agahnims Tower)'] * 4, world), [])
GT = make_dungeon('Inverted Ganons Tower', 'Agahnim2', GT = make_dungeon('Inverted Ganons Tower', 'Agahnim2',
['Inverted Ganons Tower (Entrance)', 'Ganons Tower (Tile Room)', ['Inverted Ganons Tower (Entrance)', 'Ganons Tower (Tile Room)',
'Ganons Tower (Compass Room)', 'Ganons Tower (Hookshot Room)', 'Ganons Tower (Map Room)', 'Ganons Tower (Compass Room)', 'Ganons Tower (Hookshot Room)', 'Ganons Tower (Map Room)',
'Ganons Tower (Firesnake Room)', 'Ganons Tower (Teleport Room)', 'Ganons Tower (Bottom)', 'Ganons Tower (Firesnake Room)', 'Ganons Tower (Teleport Room)', 'Ganons Tower (Bottom)',
'Ganons Tower (Top)', 'Ganons Tower (Before Moldorm)', 'Ganons Tower (Moldorm)', 'Ganons Tower (Top)', 'Ganons Tower (Before Moldorm)', 'Ganons Tower (Moldorm)',
'Agahnim 2'], ItemFactory('Big Key (Ganons Tower)', player), 'Agahnim 2'], item_factory('Big Key (Ganons Tower)', world),
ItemFactory(['Small Key (Ganons Tower)'] * 8, player), item_factory(['Small Key (Ganons Tower)'] * 8, world),
ItemFactory(['Map (Ganons Tower)', 'Compass (Ganons Tower)'], player)) item_factory(['Map (Ganons Tower)', 'Compass (Ganons Tower)'], world))
GT.bosses['bottom'] = BossFactory('Armos Knights', player) GT.bosses['bottom'] = BossFactory('Armos Knights', player)
GT.bosses['middle'] = BossFactory('Lanmolas', player) GT.bosses['middle'] = BossFactory('Lanmolas', player)
@ -259,7 +259,7 @@ def fill_dungeons_restrictive(multiworld: MultiWorld):
if not key_drop_shuffle and player not in multiworld.groups: if not key_drop_shuffle and player not in multiworld.groups:
for key_loc in key_drop_data: for key_loc in key_drop_data:
key_data = key_drop_data[key_loc] key_data = key_drop_data[key_loc]
all_state_base.remove(ItemFactory(key_data[3], player)) all_state_base.remove(item_factory(key_data[3], multiworld.worlds[player]))
loc = multiworld.get_location(key_loc, player) loc = multiworld.get_location(key_loc, player)
if loc in all_state_base.events: if loc in all_state_base.events:

View File

@ -9,8 +9,8 @@ from .Shops import TakeAny, total_shop_slots, set_up_shops, shop_table_by_locati
from .Bosses import place_bosses from .Bosses import place_bosses
from .Dungeons import get_dungeon_item_pool_player from .Dungeons import get_dungeon_item_pool_player
from .EntranceShuffle import connect_entrance from .EntranceShuffle import connect_entrance
from .Items import ItemFactory, GetBeemizerItem, trap_replaceable, item_name_groups from .Items import item_factory, GetBeemizerItem, trap_replaceable, item_name_groups
from .Options import small_key_shuffle, compass_shuffle, big_key_shuffle, map_shuffle, TriforcePiecesMode from .Options import small_key_shuffle, compass_shuffle, big_key_shuffle, map_shuffle, TriforcePiecesMode, LTTPBosses
from .StateHelpers import has_triforce_pieces, has_melee_weapon from .StateHelpers import has_triforce_pieces, has_melee_weapon
from .Regions import key_drop_data from .Regions import key_drop_data
@ -240,9 +240,9 @@ def generate_itempool(world):
if multiworld.timer[player] in ['ohko', 'timed_ohko']: if multiworld.timer[player] in ['ohko', 'timed_ohko']:
multiworld.can_take_damage[player] = False multiworld.can_take_damage[player] = False
if multiworld.goal[player] in ['pedestal', 'triforce_hunt', 'local_triforce_hunt']: if multiworld.goal[player] in ['pedestal', 'triforce_hunt', 'local_triforce_hunt']:
multiworld.push_item(multiworld.get_location('Ganon', player), ItemFactory('Nothing', player), False) multiworld.push_item(multiworld.get_location('Ganon', player), item_factory('Nothing', world), False)
else: else:
multiworld.push_item(multiworld.get_location('Ganon', player), ItemFactory('Triforce', player), False) multiworld.push_item(multiworld.get_location('Ganon', player), item_factory('Triforce', world), False)
if multiworld.goal[player] in ['triforce_hunt', 'local_triforce_hunt']: if multiworld.goal[player] in ['triforce_hunt', 'local_triforce_hunt']:
region = multiworld.get_region('Light World', player) region = multiworld.get_region('Light World', player)
@ -252,7 +252,7 @@ def generate_itempool(world):
region.locations.append(loc) region.locations.append(loc)
multiworld.push_item(loc, ItemFactory('Triforce', player), False) multiworld.push_item(loc, item_factory('Triforce', world), False)
loc.event = True loc.event = True
loc.locked = True loc.locked = True
@ -271,7 +271,7 @@ def generate_itempool(world):
] ]
for location_name, event_name in event_pairs: for location_name, event_name in event_pairs:
location = multiworld.get_location(location_name, player) location = multiworld.get_location(location_name, player)
event = ItemFactory(event_name, player) event = item_factory(event_name, world)
multiworld.push_item(location, event, False) multiworld.push_item(location, event, False)
location.event = location.locked = True location.event = location.locked = True
@ -287,7 +287,7 @@ def generate_itempool(world):
treasure_hunt_icon, additional_triforce_pieces = get_pool_core(multiworld, player) treasure_hunt_icon, additional_triforce_pieces = get_pool_core(multiworld, player)
for item in precollected_items: for item in precollected_items:
multiworld.push_precollected(ItemFactory(item, player)) multiworld.push_precollected(item_factory(item, world))
if multiworld.mode[player] == 'standard' and not has_melee_weapon(multiworld.state, player): if multiworld.mode[player] == 'standard' and not has_melee_weapon(multiworld.state, player):
if "Link's Uncle" not in placed_items: if "Link's Uncle" not in placed_items:
@ -326,9 +326,9 @@ def generate_itempool(world):
multiworld.escape_assist[player].append('bombs') multiworld.escape_assist[player].append('bombs')
for (location, item) in placed_items.items(): for (location, item) in placed_items.items():
multiworld.get_location(location, player).place_locked_item(ItemFactory(item, player)) multiworld.get_location(location, player).place_locked_item(item_factory(item, world))
items = ItemFactory(pool, player) items = item_factory(pool, world)
# convert one Progressive Bow into Progressive Bow (Alt), in ID only, for ganon silvers hint text # convert one Progressive Bow into Progressive Bow (Alt), in ID only, for ganon silvers hint text
if multiworld.worlds[player].has_progressive_bows: if multiworld.worlds[player].has_progressive_bows:
for item in items: for item in items:
@ -349,7 +349,7 @@ def generate_itempool(world):
for key_loc in key_drop_data: for key_loc in key_drop_data:
key_data = key_drop_data[key_loc] key_data = key_drop_data[key_loc]
drop_item = ItemFactory(key_data[3], player) drop_item = item_factory(key_data[3], world)
if not multiworld.key_drop_shuffle[player]: if not multiworld.key_drop_shuffle[player]:
if drop_item in dungeon_items: if drop_item in dungeon_items:
dungeon_items.remove(drop_item) dungeon_items.remove(drop_item)
@ -370,7 +370,7 @@ def generate_itempool(world):
loc.address = None loc.address = None
elif "Small" in key_data[3] and multiworld.small_key_shuffle[player] == small_key_shuffle.option_universal: elif "Small" in key_data[3] and multiworld.small_key_shuffle[player] == small_key_shuffle.option_universal:
# key drop shuffle and universal keys are on. Add universal keys in place of key drop keys. # key drop shuffle and universal keys are on. Add universal keys in place of key drop keys.
multiworld.itempool.append(ItemFactory(GetBeemizerItem(multiworld, player, 'Small Key (Universal)'), player)) multiworld.itempool.append(item_factory(GetBeemizerItem(multiworld, player, 'Small Key (Universal)'), world))
dungeon_item_replacements = sum(difficulties[multiworld.difficulty[player]].extras, []) * 2 dungeon_item_replacements = sum(difficulties[multiworld.difficulty[player]].extras, []) * 2
multiworld.random.shuffle(dungeon_item_replacements) multiworld.random.shuffle(dungeon_item_replacements)
@ -382,7 +382,7 @@ def generate_itempool(world):
or (multiworld.map_shuffle[player] == map_shuffle.option_start_with and item.type == 'Map')): or (multiworld.map_shuffle[player] == map_shuffle.option_start_with and item.type == 'Map')):
dungeon_items.pop(x) dungeon_items.pop(x)
multiworld.push_precollected(item) multiworld.push_precollected(item)
multiworld.itempool.append(ItemFactory(dungeon_item_replacements.pop(), player)) multiworld.itempool.append(item_factory(dungeon_item_replacements.pop(), world))
multiworld.itempool.extend([item for item in dungeon_items]) multiworld.itempool.extend([item for item in dungeon_items])
set_up_shops(multiworld, player) set_up_shops(multiworld, player)
@ -394,7 +394,7 @@ def generate_itempool(world):
location.shop_slot is not None] location.shop_slot is not None]
for location in shop_locations: for location in shop_locations:
if location.shop.inventory[location.shop_slot]["item"] == "Single Arrow": if location.shop.inventory[location.shop_slot]["item"] == "Single Arrow":
location.place_locked_item(ItemFactory("Single Arrow", player)) location.place_locked_item(item_factory("Single Arrow", world))
else: else:
shop_items += 1 shop_items += 1
else: else:
@ -406,9 +406,9 @@ def generate_itempool(world):
multiworld.small_key_shuffle[player] == small_key_shuffle.option_universal) * 0.5 multiworld.small_key_shuffle[player] == small_key_shuffle.option_universal) * 0.5
for _ in range(shop_items): for _ in range(shop_items):
if multiworld.random.random() < chance_100: if multiworld.random.random() < chance_100:
items.append(ItemFactory(GetBeemizerItem(multiworld, player, "Rupees (100)"), player)) items.append(item_factory(GetBeemizerItem(multiworld, player, "Rupees (100)"), world))
else: else:
items.append(ItemFactory(GetBeemizerItem(multiworld, player, "Rupees (50)"), player)) items.append(item_factory(GetBeemizerItem(multiworld, player, "Rupees (50)"), world))
multiworld.random.shuffle(items) multiworld.random.shuffle(items)
pool_count = len(items) pool_count = len(items)
@ -431,7 +431,7 @@ def generate_itempool(world):
new_items += ["Arrow Upgrade (+5)"] * 6 new_items += ["Arrow Upgrade (+5)"] * 6
new_items.append("Arrow Upgrade (+5)" if progressive else "Arrow Upgrade (+10)") new_items.append("Arrow Upgrade (+5)" if progressive else "Arrow Upgrade (+10)")
items += [ItemFactory(item, player) for item in new_items] items += [item_factory(item, world) for item in new_items]
removed_filler = [] removed_filler = []
multiworld.random.shuffle(items) # Decide what gets tossed randomly. multiworld.random.shuffle(items) # Decide what gets tossed randomly.
@ -444,22 +444,22 @@ def generate_itempool(world):
else: else:
# no more junk to remove, condense progressive items # no more junk to remove, condense progressive items
def condense_items(items, small_item, big_item, rem, add): def condense_items(items, small_item, big_item, rem, add):
small_item = ItemFactory(small_item, player) small_item = item_factory(small_item, world)
# while (len(items) >= pool_count + rem - 1 # minus 1 to account for the replacement item # while (len(items) >= pool_count + rem - 1 # minus 1 to account for the replacement item
# and items.count(small_item) >= rem): # and items.count(small_item) >= rem):
if items.count(small_item) >= rem: if items.count(small_item) >= rem:
for _ in range(rem): for _ in range(rem):
items.remove(small_item) items.remove(small_item)
removed_filler.append(ItemFactory(small_item.name, player)) removed_filler.append(item_factory(small_item.name, world))
items += [ItemFactory(big_item, player) for _ in range(add)] items += [item_factory(big_item, world) for _ in range(add)]
return True return True
return False return False
def cut_item(items, item_to_cut, minimum_items): def cut_item(items, item_to_cut, minimum_items):
item_to_cut = ItemFactory(item_to_cut, player) item_to_cut = item_factory(item_to_cut, world)
if items.count(item_to_cut) > minimum_items: if items.count(item_to_cut) > minimum_items:
items.remove(item_to_cut) items.remove(item_to_cut)
removed_filler.append(ItemFactory(item_to_cut.name, player)) removed_filler.append(item_factory(item_to_cut.name, world))
return True return True
return False return False
@ -551,7 +551,7 @@ def set_up_take_anys(world, player):
if swords: if swords:
sword = world.random.choice(swords) sword = world.random.choice(swords)
world.itempool.remove(sword) world.itempool.remove(sword)
world.itempool.append(ItemFactory('Rupees (20)', player)) world.itempool.append(item_factory('Rupees (20)', world))
old_man_take_any.shop.add_inventory(0, sword.name, 0, 0) old_man_take_any.shop.add_inventory(0, sword.name, 0, 0)
loc_name = "Old Man Sword Cave" loc_name = "Old Man Sword Cave"
location = ALttPLocation(player, loc_name, shop_table_by_location[loc_name], parent=old_man_take_any) location = ALttPLocation(player, loc_name, shop_table_by_location[loc_name], parent=old_man_take_any)
@ -577,7 +577,7 @@ def set_up_take_anys(world, player):
location = ALttPLocation(player, take_any.name, shop_table_by_location[take_any.name], parent=take_any) location = ALttPLocation(player, take_any.name, shop_table_by_location[take_any.name], parent=take_any)
location.shop_slot = 1 location.shop_slot = 1
take_any.locations.append(location) take_any.locations.append(location)
location.place_locked_item(ItemFactory("Boss Heart Container", player)) location.place_locked_item(item_factory("Boss Heart Container", world))
def get_pool_core(world, player: int): def get_pool_core(world, player: int):

View File

@ -1,6 +1,7 @@
import typing import typing
from BaseClasses import ItemClassification as IC from BaseClasses import ItemClassification as IC
from worlds.AutoWorld import World
def GetBeemizerItem(world, player: int, item): def GetBeemizerItem(world, player: int, item):
@ -20,10 +21,7 @@ def GetBeemizerItem(world, player: int, item):
return "Bee Trap" if isinstance(item, str) else world.create_item("Bee Trap", player) return "Bee Trap" if isinstance(item, str) else world.create_item("Bee Trap", player)
# should be replaced with direct world.create_item(item) call in the future def item_factory(items: typing.Union[str, typing.Iterable[str]], world: World):
def ItemFactory(items: typing.Union[str, typing.Iterable[str]], player: int):
from worlds.alttp import ALTTPWorld
world = ALTTPWorld(None, player)
ret = [] ret = []
singleton = False singleton = False
if isinstance(items, str): if isinstance(items, str):

View File

@ -34,7 +34,7 @@ from .Text import KingsReturn_texts, Sanctuary_texts, Kakariko_texts, Blacksmith
DeathMountain_texts, \ DeathMountain_texts, \
LostWoods_texts, WishingWell_texts, DesertPalace_texts, MountainTower_texts, LinksHouse_texts, Lumberjacks_texts, \ LostWoods_texts, WishingWell_texts, DesertPalace_texts, MountainTower_texts, LinksHouse_texts, Lumberjacks_texts, \
SickKid_texts, FluteBoy_texts, Zora_texts, MagicShop_texts, Sahasrahla_names SickKid_texts, FluteBoy_texts, Zora_texts, MagicShop_texts, Sahasrahla_names
from .Items import ItemFactory, item_table, item_name_groups, progression_items from .Items import item_table, item_name_groups, progression_items
from .EntranceShuffle import door_addresses from .EntranceShuffle import door_addresses
from .Options import small_key_shuffle from .Options import small_key_shuffle
@ -996,7 +996,7 @@ def patch_rom(world: MultiWorld, rom: LocalRom, player: int, enemized: bool):
rom.write_byte(0x18003A, 0x01 if world.dark_world_light_cone else 0x00) rom.write_byte(0x18003A, 0x01 if world.dark_world_light_cone else 0x00)
GREEN_TWENTY_RUPEES = 0x47 GREEN_TWENTY_RUPEES = 0x47
GREEN_CLOCK = ItemFactory('Green Clock', player).code GREEN_CLOCK = item_table["Green Clock"].item_code
rom.write_byte(0x18004F, 0x01) # Byrna Invulnerability: on rom.write_byte(0x18004F, 0x01) # Byrna Invulnerability: on
@ -1777,13 +1777,13 @@ def write_custom_shops(rom, world, player):
if item['player'] and world.game[item['player']] != "A Link to the Past": # item not native to ALTTP if item['player'] and world.game[item['player']] != "A Link to the Past": # item not native to ALTTP
item_code = get_nonnative_item_sprite(world.worlds[item['player']].item_name_to_id[item['item']]) item_code = get_nonnative_item_sprite(world.worlds[item['player']].item_name_to_id[item['item']])
else: else:
item_code = ItemFactory(item['item'], player).code item_code = item_table[item["item"]].item_code
if item['item'] == 'Single Arrow' and item['player'] == 0 and world.retro_bow[player]: if item['item'] == 'Single Arrow' and item['player'] == 0 and world.retro_bow[player]:
rom.write_byte(0x186500 + shop.sram_offset + slot, arrow_mask) rom.write_byte(0x186500 + shop.sram_offset + slot, arrow_mask)
item_data = [shop_id, item_code] + price_data + \ item_data = [shop_id, item_code] + price_data + \
[item['max'], ItemFactory(item['replacement'], player).code if item['replacement'] else 0xFF] + \ [item["max"], item_table[item["replacement"]].item_code if item["replacement"] else 0xFF] + \
replacement_price_data + [0 if item['player'] == player else min(ROM_PLAYER_LIMIT, item['player'])] replacement_price_data + [0 if item["player"] == player else min(ROM_PLAYER_LIMIT, item["player"])]
items_data.extend(item_data) items_data.extend(item_data)
rom.write_bytes(0x184800, shop_data) rom.write_bytes(0x184800, shop_data)

View File

@ -8,7 +8,7 @@ from worlds.generic.Rules import (add_item_rule, add_rule, forbid_item,
from . import OverworldGlitchRules from . import OverworldGlitchRules
from .Bosses import GanonDefeatRule from .Bosses import GanonDefeatRule
from .Items import ItemFactory, item_name_groups, item_table, progression_items from .Items import item_factory, item_name_groups, item_table, progression_items
from .Options import small_key_shuffle from .Options import small_key_shuffle
from .OverworldGlitchRules import no_logic_rules, overworld_glitches_rules from .OverworldGlitchRules import no_logic_rules, overworld_glitches_rules
from .Regions import LTTPRegionType, location_table from .Regions import LTTPRegionType, location_table
@ -1181,7 +1181,7 @@ def set_trock_key_rules(world, player):
forbid_item(world.get_location(location, player), 'Big Key (Turtle Rock)', player) forbid_item(world.get_location(location, player), 'Big Key (Turtle Rock)', player)
else: else:
# A key is required in the Big Key Chest to prevent a possible softlock. Place an extra key to ensure 100% locations still works # A key is required in the Big Key Chest to prevent a possible softlock. Place an extra key to ensure 100% locations still works
item = ItemFactory('Small Key (Turtle Rock)', player) item = item_factory('Small Key (Turtle Rock)', world.worlds[player])
location = world.get_location('Turtle Rock - Big Key Chest', player) location = world.get_location('Turtle Rock - Big Key Chest', player)
location.place_locked_item(item) location.place_locked_item(item)
location.event = True location.event = True

View File

@ -14,3 +14,4 @@ class LTTPTestBase(unittest.TestCase):
for name, option in AutoWorldRegister.world_types["A Link to the Past"].options_dataclass.type_hints.items(): for name, option in AutoWorldRegister.world_types["A Link to the Past"].options_dataclass.type_hints.items():
setattr(args, name, {1: option.from_any(getattr(option, "default"))}) setattr(args, name, {1: option.from_any(getattr(option, "default"))})
self.multiworld.set_options(args) self.multiworld.set_options(args)
self.world = self.multiworld.worlds[1]

View File

@ -2,7 +2,7 @@ from BaseClasses import CollectionState, ItemClassification
from worlds.alttp.Dungeons import get_dungeon_item_pool from worlds.alttp.Dungeons import get_dungeon_item_pool
from worlds.alttp.EntranceShuffle import mandatory_connections, connect_simple from worlds.alttp.EntranceShuffle import mandatory_connections, connect_simple
from worlds.alttp.ItemPool import difficulties from worlds.alttp.ItemPool import difficulties
from worlds.alttp.Items import ItemFactory from worlds.alttp.Items import item_factory
from worlds.alttp.Regions import create_regions from worlds.alttp.Regions import create_regions
from worlds.alttp.Shops import create_shops from worlds.alttp.Shops import create_shops
from worlds.alttp.test import LTTPTestBase from worlds.alttp.test import LTTPTestBase
@ -24,10 +24,10 @@ class TestDungeon(LTTPTestBase):
connect_simple(self.multiworld, 'Big Bomb Shop', 'Big Bomb Shop', 1) connect_simple(self.multiworld, 'Big Bomb Shop', 'Big Bomb Shop', 1)
self.multiworld.get_region('Menu', 1).exits = [] self.multiworld.get_region('Menu', 1).exits = []
self.multiworld.swamp_patch_required[1] = True self.multiworld.swamp_patch_required[1] = True
self.multiworld.worlds[1].set_rules() self.world.set_rules()
self.multiworld.worlds[1].create_items() self.world.create_items()
self.multiworld.itempool.extend(get_dungeon_item_pool(self.multiworld)) self.multiworld.itempool.extend(get_dungeon_item_pool(self.multiworld))
self.multiworld.itempool.extend(ItemFactory(['Green Pendant', 'Red Pendant', 'Blue Pendant', 'Beat Agahnim 1', 'Beat Agahnim 2', 'Crystal 1', 'Crystal 2', 'Crystal 3', 'Crystal 4', 'Crystal 5', 'Crystal 6', 'Crystal 7'], 1)) self.multiworld.itempool.extend(item_factory(['Green Pendant', 'Red Pendant', 'Blue Pendant', 'Beat Agahnim 1', 'Beat Agahnim 2', 'Crystal 1', 'Crystal 2', 'Crystal 3', 'Crystal 4', 'Crystal 5', 'Crystal 6', 'Crystal 7'], self.world))
def run_tests(self, access_pool): def run_tests(self, access_pool):
for exit in self.remove_exits: for exit in self.remove_exits:
@ -40,9 +40,9 @@ class TestDungeon(LTTPTestBase):
if all_except and len(all_except) > 0: if all_except and len(all_except) > 0:
items = self.multiworld.itempool[:] items = self.multiworld.itempool[:]
items = [item for item in items if item.name not in all_except and not ("Bottle" in item.name and "AnyBottle" in all_except)] items = [item for item in items if item.name not in all_except and not ("Bottle" in item.name and "AnyBottle" in all_except)]
items.extend(ItemFactory(item_pool[0], 1)) items.extend(item_factory(item_pool[0], self.world))
else: else:
items = ItemFactory(items, 1) items = item_factory(items, self.world)
state = CollectionState(self.multiworld) state = CollectionState(self.multiworld)
state.reachable_regions[1].add(self.multiworld.get_region('Menu', 1)) state.reachable_regions[1].add(self.multiworld.get_region('Menu', 1))
for region_name in self.starting_regions: for region_name in self.starting_regions:

View File

@ -2,7 +2,7 @@ from worlds.alttp.Dungeons import create_dungeons, get_dungeon_item_pool
from worlds.alttp.EntranceShuffle import link_inverted_entrances from worlds.alttp.EntranceShuffle import link_inverted_entrances
from worlds.alttp.InvertedRegions import create_inverted_regions from worlds.alttp.InvertedRegions import create_inverted_regions
from worlds.alttp.ItemPool import difficulties from worlds.alttp.ItemPool import difficulties
from worlds.alttp.Items import ItemFactory from worlds.alttp.Items import item_factory
from worlds.alttp.Regions import mark_light_world_regions from worlds.alttp.Regions import mark_light_world_regions
from worlds.alttp.Shops import create_shops from worlds.alttp.Shops import create_shops
from test.TestBase import TestBase from test.TestBase import TestBase
@ -18,14 +18,14 @@ class TestInverted(TestBase, LTTPTestBase):
self.multiworld.bombless_start[1].value = True self.multiworld.bombless_start[1].value = True
self.multiworld.shuffle_capacity_upgrades[1].value = True self.multiworld.shuffle_capacity_upgrades[1].value = True
create_inverted_regions(self.multiworld, 1) create_inverted_regions(self.multiworld, 1)
self.multiworld.worlds[1].create_dungeons() self.world.create_dungeons()
create_shops(self.multiworld, 1) create_shops(self.multiworld, 1)
link_inverted_entrances(self.multiworld, 1) link_inverted_entrances(self.multiworld, 1)
self.multiworld.worlds[1].create_items() self.world.create_items()
self.multiworld.required_medallions[1] = ['Ether', 'Quake'] self.multiworld.required_medallions[1] = ['Ether', 'Quake']
self.multiworld.itempool.extend(get_dungeon_item_pool(self.multiworld)) self.multiworld.itempool.extend(get_dungeon_item_pool(self.multiworld))
self.multiworld.itempool.extend(ItemFactory(['Green Pendant', 'Red Pendant', 'Blue Pendant', 'Beat Agahnim 1', 'Beat Agahnim 2', 'Crystal 1', 'Crystal 2', 'Crystal 3', 'Crystal 4', 'Crystal 5', 'Crystal 6', 'Crystal 7'], 1)) self.multiworld.itempool.extend(item_factory(['Green Pendant', 'Red Pendant', 'Blue Pendant', 'Beat Agahnim 1', 'Beat Agahnim 2', 'Crystal 1', 'Crystal 2', 'Crystal 3', 'Crystal 4', 'Crystal 5', 'Crystal 6', 'Crystal 7'], self.world))
self.multiworld.get_location('Agahnim 1', 1).item = None self.multiworld.get_location('Agahnim 1', 1).item = None
self.multiworld.get_location('Agahnim 2', 1).item = None self.multiworld.get_location('Agahnim 2', 1).item = None
mark_light_world_regions(self.multiworld, 1) mark_light_world_regions(self.multiworld, 1)
self.multiworld.worlds[1].set_rules() self.world.set_rules()

View File

@ -2,7 +2,7 @@ from worlds.alttp.Dungeons import create_dungeons, get_dungeon_item_pool
from worlds.alttp.EntranceShuffle import link_inverted_entrances from worlds.alttp.EntranceShuffle import link_inverted_entrances
from worlds.alttp.InvertedRegions import create_inverted_regions from worlds.alttp.InvertedRegions import create_inverted_regions
from worlds.alttp.ItemPool import difficulties from worlds.alttp.ItemPool import difficulties
from worlds.alttp.Items import ItemFactory from worlds.alttp.Items import item_factory
from worlds.alttp.Regions import mark_light_world_regions from worlds.alttp.Regions import mark_light_world_regions
from worlds.alttp.Shops import create_shops from worlds.alttp.Shops import create_shops
from test.TestBase import TestBase from test.TestBase import TestBase
@ -19,14 +19,14 @@ class TestInvertedMinor(TestBase, LTTPTestBase):
self.multiworld.shuffle_capacity_upgrades[1].value = True self.multiworld.shuffle_capacity_upgrades[1].value = True
self.multiworld.difficulty_requirements[1] = difficulties['normal'] self.multiworld.difficulty_requirements[1] = difficulties['normal']
create_inverted_regions(self.multiworld, 1) create_inverted_regions(self.multiworld, 1)
self.multiworld.worlds[1].create_dungeons() self.world.create_dungeons()
create_shops(self.multiworld, 1) create_shops(self.multiworld, 1)
link_inverted_entrances(self.multiworld, 1) link_inverted_entrances(self.multiworld, 1)
self.multiworld.worlds[1].create_items() self.world.create_items()
self.multiworld.required_medallions[1] = ['Ether', 'Quake'] self.multiworld.required_medallions[1] = ['Ether', 'Quake']
self.multiworld.itempool.extend(get_dungeon_item_pool(self.multiworld)) self.multiworld.itempool.extend(get_dungeon_item_pool(self.multiworld))
self.multiworld.itempool.extend(ItemFactory(['Green Pendant', 'Red Pendant', 'Blue Pendant', 'Beat Agahnim 1', 'Beat Agahnim 2', 'Crystal 1', 'Crystal 2', 'Crystal 3', 'Crystal 4', 'Crystal 5', 'Crystal 6', 'Crystal 7'], 1)) self.multiworld.itempool.extend(item_factory(['Green Pendant', 'Red Pendant', 'Blue Pendant', 'Beat Agahnim 1', 'Beat Agahnim 2', 'Crystal 1', 'Crystal 2', 'Crystal 3', 'Crystal 4', 'Crystal 5', 'Crystal 6', 'Crystal 7'], self.world))
self.multiworld.get_location('Agahnim 1', 1).item = None self.multiworld.get_location('Agahnim 1', 1).item = None
self.multiworld.get_location('Agahnim 2', 1).item = None self.multiworld.get_location('Agahnim 2', 1).item = None
mark_light_world_regions(self.multiworld, 1) mark_light_world_regions(self.multiworld, 1)
self.multiworld.worlds[1].set_rules() self.world.set_rules()

View File

@ -2,7 +2,7 @@ from worlds.alttp.Dungeons import create_dungeons, get_dungeon_item_pool
from worlds.alttp.EntranceShuffle import link_inverted_entrances from worlds.alttp.EntranceShuffle import link_inverted_entrances
from worlds.alttp.InvertedRegions import create_inverted_regions from worlds.alttp.InvertedRegions import create_inverted_regions
from worlds.alttp.ItemPool import difficulties from worlds.alttp.ItemPool import difficulties
from worlds.alttp.Items import ItemFactory from worlds.alttp.Items import item_factory
from worlds.alttp.Regions import mark_light_world_regions from worlds.alttp.Regions import mark_light_world_regions
from worlds.alttp.Shops import create_shops from worlds.alttp.Shops import create_shops
from test.TestBase import TestBase from test.TestBase import TestBase
@ -19,16 +19,16 @@ class TestInvertedOWG(TestBase, LTTPTestBase):
self.multiworld.shuffle_capacity_upgrades[1].value = True self.multiworld.shuffle_capacity_upgrades[1].value = True
self.multiworld.difficulty_requirements[1] = difficulties['normal'] self.multiworld.difficulty_requirements[1] = difficulties['normal']
create_inverted_regions(self.multiworld, 1) create_inverted_regions(self.multiworld, 1)
self.multiworld.worlds[1].create_dungeons() self.world.create_dungeons()
create_shops(self.multiworld, 1) create_shops(self.multiworld, 1)
link_inverted_entrances(self.multiworld, 1) link_inverted_entrances(self.multiworld, 1)
self.multiworld.worlds[1].create_items() self.world.create_items()
self.multiworld.required_medallions[1] = ['Ether', 'Quake'] self.multiworld.required_medallions[1] = ['Ether', 'Quake']
self.multiworld.itempool.extend(get_dungeon_item_pool(self.multiworld)) self.multiworld.itempool.extend(get_dungeon_item_pool(self.multiworld))
self.multiworld.itempool.extend(ItemFactory(['Green Pendant', 'Red Pendant', 'Blue Pendant', 'Beat Agahnim 1', 'Beat Agahnim 2', 'Crystal 1', 'Crystal 2', 'Crystal 3', 'Crystal 4', 'Crystal 5', 'Crystal 6', 'Crystal 7'], 1)) self.multiworld.itempool.extend(item_factory(['Green Pendant', 'Red Pendant', 'Blue Pendant', 'Beat Agahnim 1', 'Beat Agahnim 2', 'Crystal 1', 'Crystal 2', 'Crystal 3', 'Crystal 4', 'Crystal 5', 'Crystal 6', 'Crystal 7'], self.world))
self.multiworld.get_location('Agahnim 1', 1).item = None self.multiworld.get_location('Agahnim 1', 1).item = None
self.multiworld.get_location('Agahnim 2', 1).item = None self.multiworld.get_location('Agahnim 2', 1).item = None
self.multiworld.precollected_items[1].clear() self.multiworld.precollected_items[1].clear()
self.multiworld.itempool.append(ItemFactory('Pegasus Boots', 1)) self.multiworld.itempool.append(item_factory('Pegasus Boots', self.world))
mark_light_world_regions(self.multiworld, 1) mark_light_world_regions(self.multiworld, 1)
self.multiworld.worlds[1].set_rules() self.world.set_rules()

View File

@ -1,7 +1,7 @@
from worlds.alttp.Dungeons import get_dungeon_item_pool from worlds.alttp.Dungeons import get_dungeon_item_pool
from worlds.alttp.InvertedRegions import mark_dark_world_regions from worlds.alttp.InvertedRegions import mark_dark_world_regions
from worlds.alttp.ItemPool import difficulties from worlds.alttp.ItemPool import difficulties
from worlds.alttp.Items import ItemFactory from worlds.alttp.Items import item_factory
from test.TestBase import TestBase from test.TestBase import TestBase
from worlds.alttp.test import LTTPTestBase from worlds.alttp.test import LTTPTestBase
@ -14,15 +14,15 @@ class TestMinor(TestBase, LTTPTestBase):
self.multiworld.bombless_start[1].value = True self.multiworld.bombless_start[1].value = True
self.multiworld.shuffle_capacity_upgrades[1].value = True self.multiworld.shuffle_capacity_upgrades[1].value = True
self.multiworld.difficulty_requirements[1] = difficulties['normal'] self.multiworld.difficulty_requirements[1] = difficulties['normal']
self.multiworld.worlds[1].er_seed = 0 self.world.er_seed = 0
self.multiworld.worlds[1].create_regions() self.world.create_regions()
self.multiworld.worlds[1].create_items() self.world.create_items()
self.multiworld.required_medallions[1] = ['Ether', 'Quake'] self.multiworld.required_medallions[1] = ['Ether', 'Quake']
self.multiworld.itempool.extend(get_dungeon_item_pool(self.multiworld)) self.multiworld.itempool.extend(get_dungeon_item_pool(self.multiworld))
self.multiworld.itempool.extend(ItemFactory( self.multiworld.itempool.extend(item_factory(
['Green Pendant', 'Red Pendant', 'Blue Pendant', 'Beat Agahnim 1', 'Beat Agahnim 2', 'Crystal 1', ['Green Pendant', 'Red Pendant', 'Blue Pendant', 'Beat Agahnim 1', 'Beat Agahnim 2', 'Crystal 1',
'Crystal 2', 'Crystal 3', 'Crystal 4', 'Crystal 5', 'Crystal 6', 'Crystal 7'], 1)) 'Crystal 2', 'Crystal 3', 'Crystal 4', 'Crystal 5', 'Crystal 6', 'Crystal 7'], self.world))
self.multiworld.get_location('Agahnim 1', 1).item = None self.multiworld.get_location('Agahnim 1', 1).item = None
self.multiworld.get_location('Agahnim 2', 1).item = None self.multiworld.get_location('Agahnim 2', 1).item = None
mark_dark_world_regions(self.multiworld, 1) mark_dark_world_regions(self.multiworld, 1)
self.multiworld.worlds[1].set_rules() self.world.set_rules()

View File

@ -1,5 +1,5 @@
from test.TestBase import WorldTestBase from test.bases import WorldTestBase
from ...Items import ItemFactory from ...Items import item_factory
class PyramidTestBase(WorldTestBase): class PyramidTestBase(WorldTestBase):
@ -32,6 +32,6 @@ class GoalPyramidTest(PyramidTestBase):
self.assertFalse(self.can_reach_entrance("Pyramid Hole")) self.assertFalse(self.can_reach_entrance("Pyramid Hole"))
self.collect_by_name(["Hammer", "Progressive Glove", "Moon Pearl"]) self.collect_by_name(["Hammer", "Progressive Glove", "Moon Pearl"])
self.assertFalse(self.can_reach_entrance("Pyramid Hole")) self.assertFalse(self.can_reach_entrance("Pyramid Hole"))
self.multiworld.state.collect(ItemFactory("Beat Agahnim 2", 1)) self.collect(item_factory("Beat Agahnim 2", self.multiworld.worlds[1]))
self.assertTrue(self.can_reach_entrance("Pyramid Hole")) self.assertTrue(self.can_reach_entrance("Pyramid Hole"))

View File

@ -1,7 +1,7 @@
from worlds.alttp.Dungeons import get_dungeon_item_pool from worlds.alttp.Dungeons import get_dungeon_item_pool
from worlds.alttp.InvertedRegions import mark_dark_world_regions from worlds.alttp.InvertedRegions import mark_dark_world_regions
from worlds.alttp.ItemPool import difficulties from worlds.alttp.ItemPool import difficulties
from worlds.alttp.Items import ItemFactory from worlds.alttp.Items import item_factory
from test.TestBase import TestBase from test.TestBase import TestBase
from worlds.alttp.test import LTTPTestBase from worlds.alttp.test import LTTPTestBase
@ -19,10 +19,10 @@ class TestVanillaOWG(TestBase, LTTPTestBase):
self.multiworld.worlds[1].create_items() self.multiworld.worlds[1].create_items()
self.multiworld.required_medallions[1] = ['Ether', 'Quake'] self.multiworld.required_medallions[1] = ['Ether', 'Quake']
self.multiworld.itempool.extend(get_dungeon_item_pool(self.multiworld)) self.multiworld.itempool.extend(get_dungeon_item_pool(self.multiworld))
self.multiworld.itempool.extend(ItemFactory(['Green Pendant', 'Red Pendant', 'Blue Pendant', 'Beat Agahnim 1', 'Beat Agahnim 2', 'Crystal 1', 'Crystal 2', 'Crystal 3', 'Crystal 4', 'Crystal 5', 'Crystal 6', 'Crystal 7'], 1)) self.multiworld.itempool.extend(item_factory(['Green Pendant', 'Red Pendant', 'Blue Pendant', 'Beat Agahnim 1', 'Beat Agahnim 2', 'Crystal 1', 'Crystal 2', 'Crystal 3', 'Crystal 4', 'Crystal 5', 'Crystal 6', 'Crystal 7'], self.world))
self.multiworld.get_location('Agahnim 1', 1).item = None self.multiworld.get_location('Agahnim 1', 1).item = None
self.multiworld.get_location('Agahnim 2', 1).item = None self.multiworld.get_location('Agahnim 2', 1).item = None
self.multiworld.precollected_items[1].clear() self.multiworld.precollected_items[1].clear()
self.multiworld.itempool.append(ItemFactory('Pegasus Boots', 1)) self.multiworld.itempool.append(item_factory('Pegasus Boots', self.world))
mark_dark_world_regions(self.multiworld, 1) mark_dark_world_regions(self.multiworld, 1)
self.multiworld.worlds[1].set_rules() self.world.set_rules()

View File

@ -1,7 +1,7 @@
from worlds.alttp.Dungeons import get_dungeon_item_pool from worlds.alttp.Dungeons import get_dungeon_item_pool
from worlds.alttp.InvertedRegions import mark_dark_world_regions from worlds.alttp.InvertedRegions import mark_dark_world_regions
from worlds.alttp.ItemPool import difficulties from worlds.alttp.ItemPool import difficulties
from worlds.alttp.Items import ItemFactory from worlds.alttp.Items import item_factory
from test.TestBase import TestBase from test.TestBase import TestBase
from worlds.alttp.test import LTTPTestBase from worlds.alttp.test import LTTPTestBase
@ -18,8 +18,8 @@ class TestVanilla(TestBase, LTTPTestBase):
self.multiworld.worlds[1].create_items() self.multiworld.worlds[1].create_items()
self.multiworld.required_medallions[1] = ['Ether', 'Quake'] self.multiworld.required_medallions[1] = ['Ether', 'Quake']
self.multiworld.itempool.extend(get_dungeon_item_pool(self.multiworld)) self.multiworld.itempool.extend(get_dungeon_item_pool(self.multiworld))
self.multiworld.itempool.extend(ItemFactory(['Green Pendant', 'Red Pendant', 'Blue Pendant', 'Beat Agahnim 1', 'Beat Agahnim 2', 'Crystal 1', 'Crystal 2', 'Crystal 3', 'Crystal 4', 'Crystal 5', 'Crystal 6', 'Crystal 7'], 1)) self.multiworld.itempool.extend(item_factory(['Green Pendant', 'Red Pendant', 'Blue Pendant', 'Beat Agahnim 1', 'Beat Agahnim 2', 'Crystal 1', 'Crystal 2', 'Crystal 3', 'Crystal 4', 'Crystal 5', 'Crystal 6', 'Crystal 7'], self.world))
self.multiworld.get_location('Agahnim 1', 1).item = None self.multiworld.get_location('Agahnim 1', 1).item = None
self.multiworld.get_location('Agahnim 2', 1).item = None self.multiworld.get_location('Agahnim 2', 1).item = None
mark_dark_world_regions(self.multiworld, 1) mark_dark_world_regions(self.multiworld, 1)
self.multiworld.worlds[1].set_rules() self.world.set_rules()