From edd656b90341f1d3496de096f7c8c239389b42c1 Mon Sep 17 00:00:00 2001 From: compiling <8335770+compiling@users.noreply.github.com> Date: Fri, 3 Jan 2020 08:27:22 +1100 Subject: [PATCH 1/2] Swap implementation of Take Any fix to match Multiworld. --- BaseClasses.py | 11 +++++------ InvertedRegions.py | 28 ++++++++++++++-------------- ItemList.py | 4 ++-- Main.py | 2 +- Regions.py | 28 ++++++++++++++-------------- 5 files changed, 36 insertions(+), 37 deletions(-) diff --git a/BaseClasses.py b/BaseClasses.py index 62547746..4f04236f 100644 --- a/BaseClasses.py +++ b/BaseClasses.py @@ -3,6 +3,8 @@ from enum import Enum, unique import logging import json from collections import OrderedDict + +from EntranceShuffle import door_addresses from _vendor.collections_extended import bag from Utils import int16_as_bytes @@ -871,10 +873,9 @@ class ShopType(Enum): UpgradeShop = 2 class Shop(object): - def __init__(self, region, room_id, default_door_id, type, shopkeeper_config, replaceable): + def __init__(self, region, room_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 @@ -892,10 +893,8 @@ class Shop(object): # [id][roomID-low][roomID-high][doorID][zero][shop_config][shopkeeper_config][sram_index] entrances = self.region.entrances 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 + if len(entrances) == 1 and entrances[0].name in door_addresses: + door_id = door_addresses[entrances[0].name][0]+1 else: door_id = 0 config |= 0x40 # ignore door id diff --git a/InvertedRegions.py b/InvertedRegions.py index 19602871..7623b398 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, default_door_id, shopkeeper, replaceable) in shop_table.items(): + for region_name, (room_id, shopkeeper, replaceable) in shop_table.items(): region = world.get_region(region_name, player) - shop = Shop(region, room_id, default_door_id, ShopType.Shop, shopkeeper, replaceable) + shop = Shop(region, room_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, 0x5D, ShopType.UpgradeShop, 0x04, True) + shop = Shop(region, 0x0115, 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, default_door_id, shopkeeper, replaceable) +# (room_id, shopkeeper, replaceable) shop_table = { - '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), + '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), # 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 1da7d8b3..6da66e68 100644 --- a/ItemList.py +++ b/ItemList.py @@ -246,7 +246,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, None, ShopType.TakeAny, 0xE2, True) + old_man_take_any.shop = Shop(old_man_take_any, 0x0112, ShopType.TakeAny, 0xE2, True) world.shops.append(old_man_take_any.shop) old_man_take_any.shop.active = True @@ -269,7 +269,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, None, ShopType.TakeAny, 0xE3, True) + take_any.shop = Shop(take_any, room_id, 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) diff --git a/Main.py b/Main.py index 2a621f18..1e3860b6 100644 --- a/Main.py +++ b/Main.py @@ -270,7 +270,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.default_door_id, region.shop.type, region.shop.shopkeeper_config, region.shop.replaceable) + new_reg.shop = Shop(new_reg, region.shop.room_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 3e14b395..70ae3b0b 100644 --- a/Regions.py +++ b/Regions.py @@ -293,16 +293,16 @@ def create_regions(world, player): create_dw_region(player, 'Pyramid Ledge', None, ['Pyramid Entrance', 'Pyramid Drop']) ] - for region_name, (room_id, default_door_id, shopkeeper, replaceable) in shop_table.items(): + for region_name, (room_id, shopkeeper, replaceable) in shop_table.items(): region = world.get_region(region_name, player) - shop = Shop(region, room_id, default_door_id, ShopType.Shop, shopkeeper, replaceable) + shop = Shop(region, room_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, 0x5D, ShopType.UpgradeShop, 0x04, True) + shop = Shop(region, 0x0115, ShopType.UpgradeShop, 0x04, True) region.shop = shop world.shops.append(shop) shop.add_inventory(0, 'Bomb Upgrade (+5)', 100, 7) @@ -364,18 +364,18 @@ def mark_light_world_regions(world): seen.add(exit.connected_region) queue.append(exit.connected_region) -# (room_id, default_door_id, shopkeeper, replaceable) +# (room_id, shopkeeper, replaceable) shop_table = { - '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), + '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), # Bomb Shop not currently modeled as a shop, due to special nature of items } # region, [item] From 733f6b1a6182ec22159a88b8b71b5a0de9b02a24 Mon Sep 17 00:00:00 2001 From: AmazingAmpharos Date: Wed, 23 Oct 2019 20:46:09 -0500 Subject: [PATCH 2/2] Update GUI The GUI was dysfunctional after the latest round of updates as it failed to address several new v31 features. The GUI should work again with this update and should allow proper interaction with all relevant options. Some aesthetic rework was necessary to account for the new large number of dropdowns. --- Gui.py | 114 ++++++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 85 insertions(+), 29 deletions(-) diff --git a/Gui.py b/Gui.py index e02457d1..da8550df 100755 --- a/Gui.py +++ b/Gui.py @@ -90,6 +90,34 @@ def guiMain(args=None): fileDialogFrame = Frame(rightHalfFrame) + heartbeepFrame = Frame(fileDialogFrame) + heartbeepVar = StringVar() + heartbeepVar.set('normal') + heartbeepOptionMenu = OptionMenu(heartbeepFrame, heartbeepVar, 'double', 'normal', 'half', 'quarter', 'off') + heartbeepOptionMenu.pack(side=RIGHT) + heartbeepLabel = Label(heartbeepFrame, text='Heartbeep sound rate') + heartbeepLabel.pack(side=LEFT, padx=(0,52)) + + heartcolorFrame = Frame(fileDialogFrame) + heartcolorVar = StringVar() + heartcolorVar.set('red') + heartcolorOptionMenu = OptionMenu(heartcolorFrame, heartcolorVar, 'red', 'blue', 'green', 'yellow', 'random') + heartcolorOptionMenu.pack(side=RIGHT) + heartcolorLabel = Label(heartcolorFrame, text='Heart color') + heartcolorLabel.pack(side=LEFT, padx=(0,127)) + + fastMenuFrame = Frame(fileDialogFrame) + fastMenuVar = StringVar() + fastMenuVar.set('normal') + fastMenuOptionMenu = OptionMenu(fastMenuFrame, fastMenuVar, 'normal', 'instant', 'double', 'triple', 'quadruple', 'half') + fastMenuOptionMenu.pack(side=RIGHT) + fastMenuLabel = Label(fastMenuFrame, text='Menu speed') + fastMenuLabel.pack(side=LEFT, padx=(0,100)) + + heartbeepFrame.pack(expand=True, anchor=E) + heartcolorFrame.pack(expand=True, anchor=E) + fastMenuFrame.pack(expand=True, anchor=E) + romDialogFrame = Frame(fileDialogFrame) baseRomLabel = Label(romDialogFrame, text='Base Rom') romVar = StringVar() @@ -144,7 +172,7 @@ def guiMain(args=None): modeVar.set('open') modeOptionMenu = OptionMenu(modeFrame, modeVar, 'standard', 'open', 'inverted') modeOptionMenu.pack(side=RIGHT) - modeLabel = Label(modeFrame, text='Game Mode') + modeLabel = Label(modeFrame, text='Game mode') modeLabel.pack(side=LEFT) logicFrame = Frame(drowDownFrame) @@ -163,14 +191,46 @@ def guiMain(args=None): goalLabel = Label(goalFrame, text='Game goal') goalLabel.pack(side=LEFT) + crystalsGTFrame = Frame(drowDownFrame) + crystalsGTVar = StringVar() + crystalsGTVar.set('7') + crystalsGTOptionMenu = OptionMenu(crystalsGTFrame, crystalsGTVar, '0', '1', '2', '3', '4', '5', '6', '7', 'random') + crystalsGTOptionMenu.pack(side=RIGHT) + crystalsGTLabel = Label(crystalsGTFrame, text='Crystals to open Ganon\'s Tower') + crystalsGTLabel.pack(side=LEFT) + + crystalsGanonFrame = Frame(drowDownFrame) + crystalsGanonVar = StringVar() + crystalsGanonVar.set('7') + crystalsGanonOptionMenu = OptionMenu(crystalsGanonFrame, crystalsGanonVar, '0', '1', '2', '3', '4', '5', '6', '7', 'random') + crystalsGanonOptionMenu.pack(side=RIGHT) + crystalsGanonLabel = Label(crystalsGanonFrame, text='Crystals to fight Ganon') + crystalsGanonLabel.pack(side=LEFT) + + swordFrame = Frame(drowDownFrame) + swordVar = StringVar() + swordVar.set('random') + swordOptionMenu = OptionMenu(swordFrame, swordVar, 'random', 'assured', 'swordless', 'vanilla') + swordOptionMenu.pack(side=RIGHT) + swordLabel = Label(swordFrame, text='Sword availability') + swordLabel.pack(side=LEFT) + difficultyFrame = Frame(drowDownFrame) difficultyVar = StringVar() difficultyVar.set('normal') difficultyOptionMenu = OptionMenu(difficultyFrame, difficultyVar, 'normal', 'hard', 'expert') difficultyOptionMenu.pack(side=RIGHT) - difficultyLabel = Label(difficultyFrame, text='Game difficulty') + difficultyLabel = Label(difficultyFrame, text='Difficulty: item pool') difficultyLabel.pack(side=LEFT) + itemfunctionFrame = Frame(drowDownFrame) + itemfunctionVar = StringVar() + itemfunctionVar.set('normal') + itemfunctionOptionMenu = OptionMenu(itemfunctionFrame, itemfunctionVar, 'normal', 'hard', 'expert') + itemfunctionOptionMenu.pack(side=RIGHT) + itemfunctionLabel = Label(itemfunctionFrame, text='Difficulty: item functionality') + itemfunctionLabel.pack(side=LEFT) + timerFrame = Frame(drowDownFrame) timerVar = StringVar() timerVar.set('none') @@ -187,6 +247,14 @@ def guiMain(args=None): progressiveLabel = Label(progressiveFrame, text='Progressive equipment') progressiveLabel.pack(side=LEFT) + accessibilityFrame = Frame(drowDownFrame) + accessibilityVar = StringVar() + accessibilityVar.set('items') + accessibilityOptionMenu = OptionMenu(accessibilityFrame, accessibilityVar, 'items', 'locations', 'none') + accessibilityOptionMenu.pack(side=RIGHT) + accessibilityLabel = Label(accessibilityFrame, text='Item accessibility') + accessibilityLabel.pack(side=LEFT) + algorithmFrame = Frame(drowDownFrame) algorithmVar = StringVar() algorithmVar.set('balanced') @@ -203,41 +271,19 @@ def guiMain(args=None): shuffleLabel = Label(shuffleFrame, text='Entrance shuffle algorithm') shuffleLabel.pack(side=LEFT) - heartbeepFrame = Frame(drowDownFrame) - heartbeepVar = StringVar() - heartbeepVar.set('normal') - heartbeepOptionMenu = OptionMenu(heartbeepFrame, heartbeepVar, 'double', 'normal', 'half', 'quarter', 'off') - heartbeepOptionMenu.pack(side=RIGHT) - heartbeepLabel = Label(heartbeepFrame, text='Heartbeep sound rate') - heartbeepLabel.pack(side=LEFT) - - heartcolorFrame = Frame(drowDownFrame) - heartcolorVar = StringVar() - heartcolorVar.set('red') - heartcolorOptionMenu = OptionMenu(heartcolorFrame, heartcolorVar, 'red', 'blue', 'green', 'yellow', 'random') - heartcolorOptionMenu.pack(side=RIGHT) - heartcolorLabel = Label(heartcolorFrame, text='Heart color') - heartcolorLabel.pack(side=LEFT) - - fastMenuFrame = Frame(drowDownFrame) - fastMenuVar = StringVar() - fastMenuVar.set('normal') - fastMenuOptionMenu = OptionMenu(fastMenuFrame, fastMenuVar, 'normal', 'instant', 'double', 'triple', 'quadruple', 'half') - fastMenuOptionMenu.pack(side=RIGHT) - fastMenuLabel = Label(fastMenuFrame, text='Menu speed') - fastMenuLabel.pack(side=LEFT) - modeFrame.pack(expand=True, anchor=E) logicFrame.pack(expand=True, anchor=E) goalFrame.pack(expand=True, anchor=E) + crystalsGTFrame.pack(expand=True, anchor=E) + crystalsGanonFrame.pack(expand=True, anchor=E) + swordFrame.pack(expand=True, anchor=E) difficultyFrame.pack(expand=True, anchor=E) + itemfunctionFrame.pack(expand=True, anchor=E) timerFrame.pack(expand=True, anchor=E) progressiveFrame.pack(expand=True, anchor=E) + accessibilityFrame.pack(expand=True, anchor=E) algorithmFrame.pack(expand=True, anchor=E) shuffleFrame.pack(expand=True, anchor=E) - heartbeepFrame.pack(expand=True, anchor=E) - heartcolorFrame.pack(expand=True, anchor=E) - fastMenuFrame.pack(expand=True, anchor=E) enemizerFrame = LabelFrame(randomizerWindow, text="Enemizer", padx=5, pady=5) enemizerFrame.columnconfigure(0, weight=1) @@ -315,9 +361,14 @@ def guiMain(args=None): guiargs.mode = modeVar.get() guiargs.logic = logicVar.get() guiargs.goal = goalVar.get() + guiargs.crystals_gt = crystalsGTVar.get() + guiargs.crystals_ganon = crystalsGanonVar.get() + guiargs.swords = swordVar.get() guiargs.difficulty = difficultyVar.get() + guiargs.item_functionality = itemfunctionVar.get() guiargs.timer = timerVar.get() guiargs.progressive = progressiveVar.get() + guiargs.accessibility = accessibilityVar.get() guiargs.algorithm = algorithmVar.get() guiargs.shuffle = shuffleVar.get() guiargs.heartbeep = heartbeepVar.get() @@ -1074,10 +1125,15 @@ def guiMain(args=None): if args.seed: seedVar.set(str(args.seed)) modeVar.set(args.mode) + swordVar.set(args.swords) difficultyVar.set(args.difficulty) + itemfunctionVar.set(args.item_functionality) timerVar.set(args.timer) progressiveVar.set(args.progressive) + accessibilityVar.set(args.accessibility) goalVar.set(args.goal) + crystalsGTVar.set(args.crystals_gt) + crystalsGanonVar.set(args.crystals_ganon) algorithmVar.set(args.algorithm) shuffleVar.set(args.shuffle) heartbeepVar.set(args.heartbeep)