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 create_dynamic_shop_locations(world, player): for shop in world.shops: if shop.region.player == player: for i, item in enumerate(shop.inventory): if item is None: continue if item['create_location']: loc = Location(player, "{} Slot {}".format(shop.region.name, i + 1), parent=shop.region) shop.region.locations.append(loc) world.dynamic_locations.append(loc) world.clear_location_cache() world.push_item(loc, ItemFactory(item['item'], player), False) loc.shop_slot = True loc.event = True loc.locked = True