def create_shops(world, player: int): option = world.shop_shuffle[player] player_shop_table = shop_table.copy() if "w" in option: player_shop_table["Potion Shop"] = player_shop_table["Potion Shop"]._replace(locked=False) dynamic_shop_slots = total_dynamic_shop_slots + 3 else: dynamic_shop_slots = total_dynamic_shop_slots num_slots = min(dynamic_shop_slots, max(0, int(world.shop_shuffle_slots[player]))) # 0 to 30 single_purchase_slots: List[bool] = [True] * num_slots + [False] * (dynamic_shop_slots - num_slots) world.random.shuffle(single_purchase_slots) if 'g' in option or 'f' in option: default_shop_table = [i for l in [shop_generation_types[x] for x in ['arrows', 'bombs', 'potions', 'shields', 'bottle'] if not world.retro[player] or x != 'arrows'] for i in l] new_basic_shop = world.random.sample(default_shop_table, k=3) new_dark_shop = world.random.sample(default_shop_table, k=3) for name, shop in player_shop_table.items(): typ, shop_id, keeper, custom, locked, items, sram_offset = shop if not locked: new_items = world.random.sample(default_shop_table, k=3) if 'f' not in option: if items == _basic_shop_defaults: new_items = new_basic_shop elif items == _dark_world_shop_defaults: new_items = new_dark_shop keeper = world.random.choice([0xA0, 0xC1, 0xFF]) player_shop_table[name] = ShopData(typ, shop_id, keeper, custom, locked, new_items, sram_offset) if world.mode[player] == "inverted": player_shop_table["Dark Lake Hylia Shop"] = \ player_shop_table["Dark Lake Hylia Shop"]._replace(locked=True, items=_inverted_hylia_shop_defaults) 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) region.shop = shop world.shops.append(shop) for index, item in enumerate(inventory): shop.add_inventory(index, *item) if not locked and num_slots: slot_name = "{} Slot {}".format(region.name, index + 1) loc = Location(player, slot_name, address=shop_table_by_location[slot_name], parent=region, hint_text="for sale") loc.shop_slot = True loc.locked = True if single_purchase_slots.pop(): if world.goal[player] != 'icerodhunt': additional_item = 'Rupees (50)' # world.random.choice(['Rupees (50)', 'Rupees (100)', 'Rupees (300)']) else: additional_item = 'Nothing' loc.item = ItemFactory(additional_item, player) else: loc.item = ItemFactory('Nothing', player) loc.shop_slot_disabled = True shop.region.locations.append(loc) world.dynamic_locations.append(loc) world.clear_location_cache()
def swap_location_item(location_1: Location, location_2: Location, check_locked=True): """Swaps Items of locations. Does NOT swap flags like event, shop_slot or locked""" if check_locked: if location_1.locked: logging.warning( f"Swapping {location_1}, which is marked as locked.") if location_2.locked: logging.warning( f"Swapping {location_2}, which is marked as locked.") location_2.item, location_1.item = location_1.item, location_2.item location_1.item.location = location_1 location_2.item.location = location_2
def swap_location_item(location_1: Location, location_2: Location, check_locked: bool = True) -> None: """Swaps Items of locations. Does NOT swap flags like shop_slot or locked, but does swap event""" if check_locked: if location_1.locked: logging.warning( f"Swapping {location_1}, which is marked as locked.") if location_2.locked: logging.warning( f"Swapping {location_2}, which is marked as locked.") location_2.item, location_1.item = location_1.item, location_2.item location_1.item.location = location_1 location_2.item.location = location_2 location_1.event, location_2.event = location_2.event, location_1.event