diff --git a/data/basepatch.apbp b/data/basepatch.apbp index 05b4ecfb..a77bf1fb 100644 Binary files a/data/basepatch.apbp and b/data/basepatch.apbp differ diff --git a/worlds/alttp/Rom.py b/worlds/alttp/Rom.py index a1cd2b9b..cb2ba14c 100644 --- a/worlds/alttp/Rom.py +++ b/worlds/alttp/Rom.py @@ -4,7 +4,7 @@ import Utils from Patch import read_rom JAP10HASH = '03a63945398191337e896e5771f77173' -RANDOMIZERBASEHASH = '13a75c5dd28055fbcf8f69bd8161871d' +RANDOMIZERBASEHASH = 'e397fef0e947d1bd760c68c4fe99a600' import io import json diff --git a/worlds/alttp/Shops.py b/worlds/alttp/Shops.py index 5d4813da..29c1d639 100644 --- a/worlds/alttp/Shops.py +++ b/worlds/alttp/Shops.py @@ -18,6 +18,19 @@ class ShopType(Enum): TakeAny = 1 UpgradeShop = 2 +@unique +class ShopPriceType(Enum): + Rupees = 0 + Hearts = 1 + Magic = 2 + Bombs = 3 + Arrows = 4 + HeartContainer = 5 + BombUpgrade = 6 + ArrowUpgrade = 7 + Keys = 8 + Potion = 9 + Item = 10 class Shop(): slots: int = 3 # slot count is not dynamic in asm, however inventory can have None as empty slots @@ -87,10 +100,11 @@ class Shop(): def add_inventory(self, slot: int, item: str, price: int, max: int = 0, replacement: Optional[str] = None, replacement_price: int = 0, create_location: bool = False, - player: int = 0): + player: int = 0, price_type: int = ShopPriceType.Rupees): self.inventory[slot] = { 'item': item, 'price': price, + 'price_type': price_type, 'max': max, 'replacement': replacement, 'replacement_price': replacement_price, @@ -98,7 +112,7 @@ class Shop(): 'player': player } - def push_inventory(self, slot: int, item: str, price: int, max: int = 1, player: int = 0): + def push_inventory(self, slot: int, item: str, price: int, max: int = 1, player: int = 0, price_type: int = ShopPriceType.Rupees): if not self.inventory[slot]: raise ValueError("Inventory can't be pushed back if it doesn't exist") @@ -108,6 +122,7 @@ class Shop(): self.inventory[slot] = { 'item': item, 'price': price, + 'price_type': price_type, 'max': max, 'replacement': self.inventory[slot]["item"], 'replacement_price': self.inventory[slot]["price"], @@ -392,6 +407,7 @@ def set_up_shops(world, player: int): shop.push_inventory(next(slots), 'Single Arrow', 80) + def shuffle_shops(world, items, player: int): option = world.shop_shuffle[player] if 'u' in option: @@ -461,6 +477,14 @@ def shuffle_shops(world, items, player: int): for item in shop.inventory: adjust_item(item) + if 'P' in option: + print('Making funny prices.') + for item in total_inventory: + price_to_funny_price(item, world, player) + for shop in upgrade_shops: + for item in shop.inventory: + price_to_funny_price(item, world, player) + if 'i' in option: world.random.shuffle(total_inventory) @@ -469,3 +493,45 @@ def shuffle_shops(world, items, player: int): slots = shop.slots shop.inventory = total_inventory[i:i + slots] i += slots + +price_blacklist = { + ShopPriceType.Rupees: {'Rupees'}, + ShopPriceType.Hearts: {'Small Heart', 'Apple'}, + ShopPriceType.Magic: {'Magic Jar'}, + ShopPriceType.Bombs: {'Bombs', 'Single Bomb'}, + ShopPriceType.Arrows: {'Arrows', 'Single Arrow'}, + ShopPriceType.HeartContainer: {}, + ShopPriceType.BombUpgrade: {}, + ShopPriceType.ArrowUpgrade: {}, + ShopPriceType.Keys: {}, + ShopPriceType.Potion: {}, + # ShopPriceType.Item: {} +} + +price_chart = { + ShopPriceType.Rupees: lambda p: p, + ShopPriceType.Hearts: lambda p: min(1, p//5)*4, + ShopPriceType.Magic: lambda p: min(8, p//5)*4, + ShopPriceType.Bombs: lambda p: min(10, p//5), + ShopPriceType.Arrows: lambda p: min(30, p//5), + ShopPriceType.HeartContainer: lambda p: 0x8, + ShopPriceType.BombUpgrade: lambda p: 0x1, + ShopPriceType.ArrowUpgrade: lambda p: 0x1, + ShopPriceType.Keys: lambda p: min(3, (p//100)+1), + ShopPriceType.Potion: lambda p: (p//5)%5, + # ShopPriceType.Item: lambda p: 0, +} + +def price_to_funny_price(item, world, player): + if item is None: + return + my_price_types = [x for x in price_blacklist] + my_choices = world.random.sample(my_price_types, len(my_price_types)) + for p in my_choices: + if p in [ShopPriceType.Rupees, ShopPriceType.BombUpgrade, ShopPriceType.ArrowUpgrade] or (p in [ShopPriceType.Keys] and world.smallkey_shuffle[player] == smallkey_shuffle.option_universal): + return + if any(x in item['item'] for x in price_blacklist[p]): + continue + else: + item['price'] = 0x8000 | 0x100*(p.value-1) | price_chart[p](item['price']) + break \ No newline at end of file