diff --git a/BaseClasses.py b/BaseClasses.py index 8a455065..7c87f119 100644 --- a/BaseClasses.py +++ b/BaseClasses.py @@ -1244,9 +1244,10 @@ class ShopType(Enum): UpgradeShop = 2 class Shop(object): - def __init__(self, region, room_id, type, shopkeeper_config, replaceable): + def __init__(self, region, room_id, default_door_id, type, shopkeeper_config, replaceable): self.region = region self.room_id = room_id + self.default_door_id = default_door_id self.type = type self.inventory = [None, None, None] self.shopkeeper_config = shopkeeper_config @@ -1266,6 +1267,8 @@ class Shop(object): config = self.item_count if len(entrances) == 1 and entrances[0].addresses: door_id = entrances[0].addresses+1 + elif self.default_door_id is not None: + door_id = self.default_door_id else: door_id = 0 config |= 0x40 # ignore door id diff --git a/InvertedRegions.py b/InvertedRegions.py index 7623b398..19602871 100644 --- a/InvertedRegions.py +++ b/InvertedRegions.py @@ -302,16 +302,16 @@ def create_inverted_regions(world, player): create_cave_region(player, 'The Sky', 'A Dark Sky', None, ['DDM Landing','NEDW Landing', 'WDW Landing', 'SDW Landing', 'EDW Landing', 'DD Landing', 'DLHL Landing']) ] - for region_name, (room_id, shopkeeper, replaceable) in shop_table.items(): + for region_name, (room_id, default_door_id, shopkeeper, replaceable) in shop_table.items(): region = world.get_region(region_name, player) - shop = Shop(region, room_id, ShopType.Shop, shopkeeper, replaceable) + shop = Shop(region, room_id, default_door_id, ShopType.Shop, shopkeeper, replaceable) region.shop = shop world.shops.append(shop) for index, (item, price) in enumerate(default_shop_contents[region_name]): shop.add_inventory(index, item, price) region = world.get_region('Capacity Upgrade', player) - shop = Shop(region, 0x0115, ShopType.UpgradeShop, 0x04, True) + shop = Shop(region, 0x0115, 0x5D, ShopType.UpgradeShop, 0x04, True) region.shop = shop world.shops.append(shop) shop.add_inventory(0, 'Bomb Upgrade (+5)', 100, 7) @@ -373,18 +373,18 @@ def mark_dark_world_regions(world): seen.add(exit.connected_region) queue.append(exit.connected_region) -# (room_id, shopkeeper, replaceable) +# (room_id, default_door_id, shopkeeper, replaceable) shop_table = { - 'Cave Shop (Dark Death Mountain)': (0x0112, 0xC1, True), - 'Red Shield Shop': (0x0110, 0xC1, True), - 'Dark Lake Hylia Shop': (0x010F, 0xC1, True), - 'Dark World Lumberjack Shop': (0x010F, 0xC1, True), - 'Village of Outcasts Shop': (0x010F, 0xC1, True), - 'Dark World Potion Shop': (0x010F, 0xC1, True), - 'Light World Death Mountain Shop': (0x00FF, 0xA0, True), - 'Kakariko Shop': (0x011F, 0xA0, True), - 'Cave Shop (Lake Hylia)': (0x0112, 0xA0, True), - 'Potion Shop': (0x0109, 0xFF, False), + 'Cave Shop (Dark Death Mountain)': (0x0112, 0x6E, 0xC1, True), + 'Red Shield Shop': (0x0110, 0x75, 0xC1, True), + 'Dark Lake Hylia Shop': (0x010F, 0x74, 0xC1, True), + 'Dark World Lumberjack Shop': (0x010F, 0x57, 0xC1, True), + 'Village of Outcasts Shop': (0x010F, 0x60, 0xC1, True), + 'Dark World Potion Shop': (0x010F, 0x6F, 0xC1, True), + 'Light World Death Mountain Shop': (0x00FF, None, 0xA0, True), + 'Kakariko Shop': (0x011F, 0x46, 0xA0, True), + 'Cave Shop (Lake Hylia)': (0x0112, 0x58, 0xA0, True), + 'Potion Shop': (0x0109, 0x4C, 0xFF, False), # Bomb Shop not currently modeled as a shop, due to special nature of items } # region, [item] diff --git a/ItemList.py b/ItemList.py index f5163791..eca0acdc 100644 --- a/ItemList.py +++ b/ItemList.py @@ -249,7 +249,7 @@ take_any_locations = [ 'Bonk Fairy (Dark)', 'Lake Hylia Healer Fairy', 'Swamp Healer Fairy', 'Desert Healer Fairy', 'Dark Lake Hylia Healer Fairy', 'Dark Lake Hylia Ledge Healer Fairy', 'Dark Desert Healer Fairy', 'Dark Death Mountain Healer Fairy', 'Long Fairy Cave', 'Good Bee Cave', '20 Rupee Cave', - 'Kakariko Gamble Game', 'Capacity Upgrade', '50 Rupee Cave', 'Lost Woods Gamble', 'Hookshot Fairy', + 'Kakariko Gamble Game', '50 Rupee Cave', 'Lost Woods Gamble', 'Hookshot Fairy', 'Palace of Darkness Hint', 'East Dark World Hint', 'Archery Game', 'Dark Lake Hylia Ledge Hint', 'Dark Lake Hylia Ledge Spike Cave', 'Fortune Teller (Dark)', 'Dark Sanctuary Hint', 'Dark Desert Hint'] @@ -267,7 +267,7 @@ def set_up_take_anys(world, player): entrance = world.get_region(reg, player).entrances[0] connect_entrance(world, entrance, old_man_take_any, player) entrance.target = 0x58 - old_man_take_any.shop = Shop(old_man_take_any, 0x0112, ShopType.TakeAny, 0xE2, True) + old_man_take_any.shop = Shop(old_man_take_any, 0x0112, None, ShopType.TakeAny, 0xE2, True) world.shops.append(old_man_take_any.shop) old_man_take_any.shop.active = True @@ -290,7 +290,7 @@ def set_up_take_anys(world, player): entrance = world.get_region(reg, player).entrances[0] connect_entrance(world, entrance, take_any, player) entrance.target = target - take_any.shop = Shop(take_any, room_id, ShopType.TakeAny, 0xE3, True) + take_any.shop = Shop(take_any, room_id, None, ShopType.TakeAny, 0xE3, True) world.shops.append(take_any.shop) take_any.shop.active = True take_any.shop.add_inventory(0, 'Blue Potion', 0, 0) @@ -358,7 +358,7 @@ def set_up_shops(world, player): # Randomized changes to Shops if world.retro: - for shop in random.sample([s for s in world.shops if s.replaceable and s.region.player == player], 5): + for shop in random.sample([s for s in world.shops if s.replaceable and s.type == ShopType.Shop and s.region.player == player], 5): shop.active = True shop.add_inventory(0, 'Single Arrow', 80) shop.add_inventory(1, 'Small Key (Universal)', 100) diff --git a/Main.py b/Main.py index b6aed083..9ed5efc6 100644 --- a/Main.py +++ b/Main.py @@ -290,7 +290,7 @@ def copy_dynamic_regions_and_locations(world, ret): # Note: ideally exits should be copied here, but the current use case (Take anys) do not require this if region.shop: - new_reg.shop = Shop(new_reg, region.shop.room_id, region.shop.type, region.shop.shopkeeper_config, region.shop.replaceable) + new_reg.shop = Shop(new_reg, region.shop.room_id, region.shop.default_door_id, region.shop.type, region.shop.shopkeeper_config, region.shop.replaceable) ret.shops.append(new_reg.shop) for location in world.dynamic_locations: diff --git a/Regions.py b/Regions.py index 5d27d312..93aacc57 100644 --- a/Regions.py +++ b/Regions.py @@ -705,16 +705,16 @@ def create_regions(world, player): create_dungeon_region(player, 'GT Agahnim 2', 'Ganon\'s Tower', ['Agahnim 2'], ['GT Agahnim 2 SW']) ] - for region_name, (room_id, shopkeeper, replaceable) in shop_table.items(): + for region_name, (room_id, default_door_id, shopkeeper, replaceable) in shop_table.items(): region = world.get_region(region_name, player) - shop = Shop(region, room_id, ShopType.Shop, shopkeeper, replaceable) + shop = Shop(region, room_id, default_door_id, ShopType.Shop, shopkeeper, replaceable) region.shop = shop world.shops.append(shop) for index, (item, price) in enumerate(default_shop_contents[region_name]): shop.add_inventory(index, item, price) region = world.get_region('Capacity Upgrade', player) - shop = Shop(region, 0x0115, ShopType.UpgradeShop, 0x04, True) + shop = Shop(region, 0x0115, 0x5D, ShopType.UpgradeShop, 0x04, True) region.shop = shop world.shops.append(shop) shop.add_inventory(0, 'Bomb Upgrade (+5)', 100, 7) @@ -780,18 +780,18 @@ def mark_light_world_regions(world): seen.add(exit.connected_region) queue.append(exit.connected_region) -# (room_id, shopkeeper, replaceable) +# (room_id, default_door_id, shopkeeper, replaceable) shop_table = { - 'Cave Shop (Dark Death Mountain)': (0x0112, 0xC1, True), - 'Red Shield Shop': (0x0110, 0xC1, True), - 'Dark Lake Hylia Shop': (0x010F, 0xC1, True), - 'Dark World Lumberjack Shop': (0x010F, 0xC1, True), - 'Village of Outcasts Shop': (0x010F, 0xC1, True), - 'Dark World Potion Shop': (0x010F, 0xC1, True), - 'Light World Death Mountain Shop': (0x00FF, 0xA0, True), - 'Kakariko Shop': (0x011F, 0xA0, True), - 'Cave Shop (Lake Hylia)': (0x0112, 0xA0, True), - 'Potion Shop': (0x0109, 0xFF, False), + 'Cave Shop (Dark Death Mountain)': (0x0112, 0x6E, 0xC1, True), + 'Red Shield Shop': (0x0110, 0x75, 0xC1, True), + 'Dark Lake Hylia Shop': (0x010F, 0x74, 0xC1, True), + 'Dark World Lumberjack Shop': (0x010F, 0x57, 0xC1, True), + 'Village of Outcasts Shop': (0x010F, 0x60, 0xC1, True), + 'Dark World Potion Shop': (0x010F, 0x6F, 0xC1, True), + 'Light World Death Mountain Shop': (0x00FF, None, 0xA0, True), + 'Kakariko Shop': (0x011F, 0x46, 0xA0, True), + 'Cave Shop (Lake Hylia)': (0x0112, 0x58, 0xA0, True), + 'Potion Shop': (0x0109, 0x4C, 0xFF, False), # Bomb Shop not currently modeled as a shop, due to special nature of items } # region, [item] diff --git a/Rom.py b/Rom.py index b7672adc..ff7d6bc1 100644 --- a/Rom.py +++ b/Rom.py @@ -688,8 +688,10 @@ def patch_rom(world, player, rom): [difficulty.progressive_sword_limit, overflow_replacement, difficulty.progressive_shield_limit, overflow_replacement, difficulty.progressive_armor_limit, overflow_replacement, - difficulty.progressive_bottle_limit, overflow_replacement, - difficulty.progressive_bow_limit, overflow_replacement]) + difficulty.progressive_bottle_limit, overflow_replacement]) + + #Work around for json patch ordering issues - write bow limit separately so that it is replaced in the patch + rom.write_bytes(0x180098, [difficulty.progressive_bow_limit, overflow_replacement]) if difficulty.progressive_bow_limit < 2 and world.swords == 'swordless': rom.write_bytes(0x180098, [2, overflow_replacement])