From 01e1e719dba405c45e0b608248c6c1a4cc9b7f42 Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Sun, 23 Feb 2020 17:53:51 -0800 Subject: [PATCH] Implement Starting Inventory --- CLI.py | 2 + Gui.py | 7 +++ classes/constants.py | 22 +++++++ gui/bottom.py | 10 ++++ gui/startinventory/__init__.py | 1 + gui/startinventory/overview.py | 60 +++++++++++++++++++ .../gui/randomize/generation/checkboxes.json | 6 ++ 7 files changed, 108 insertions(+) create mode 100644 gui/startinventory/__init__.py create mode 100644 gui/startinventory/overview.py diff --git a/CLI.py b/CLI.py index 0cdfb102..d98e95a1 100644 --- a/CLI.py +++ b/CLI.py @@ -374,6 +374,7 @@ def get_settings(): "remote_items": False, "race": False, "custom": False, + "usestartinventory": False, "customitemarray": { "bow": 0, "progressivebow": 2, @@ -452,6 +453,7 @@ def get_settings(): "randomSprite": False, "outputpath": os.path.join(".") } + settings["startinventoryarray"] = {} if sys.platform.lower().find("windows"): settings["enemizercli"] += ".exe" diff --git a/Gui.py b/Gui.py index fa51c557..b824606f 100755 --- a/Gui.py +++ b/Gui.py @@ -8,6 +8,7 @@ from argparse import Namespace from CLI import get_settings from DungeonRandomizer import parse_arguments from gui.adjust.overview import adjust_page +from gui.startinventory.overview import startinventory_page from gui.custom.overview import custom_page from gui.loadcliargs import loadcliargs, loadadjustargs from gui.randomize.item import item_page @@ -67,9 +68,11 @@ def guiMain(args=None): self.notebook = ttk.Notebook(self) self.pages["randomizer"] = ttk.Frame(self.notebook) self.pages["adjust"] = ttk.Frame(self.notebook) + self.pages["startinventory"] = ttk.Frame(self.notebook) self.pages["custom"] = ttk.Frame(self.notebook) self.notebook.add(self.pages["randomizer"], text='Randomize') self.notebook.add(self.pages["adjust"], text='Adjust') + self.notebook.add(self.pages["startinventory"], text='Starting Inventory') self.notebook.add(self.pages["custom"], text='Custom') self.notebook.pack() @@ -132,6 +135,10 @@ def guiMain(args=None): self.pages["adjust"].content,self.settings = adjust_page(self, self.pages["adjust"], self.settings) self.pages["adjust"].content.pack(side=TOP, fill=BOTH, expand=True) + # Starting Inventory Controls + self.pages["startinventory"].content = startinventory_page(self, self.pages["startinventory"]) + self.pages["startinventory"].content.pack(side=TOP, fill=BOTH, expand=True) + # Custom Controls self.pages["custom"].content = custom_page(self,self.pages["custom"]) self.pages["custom"].content.pack(side=TOP, pady=(17,0)) diff --git a/classes/constants.py b/classes/constants.py index a97d6b2b..0069c1e5 100644 --- a/classes/constants.py +++ b/classes/constants.py @@ -19,3 +19,25 @@ CUSTOMITEMS = [ "generickeys", "triforcepieces", "triforcepiecesgoal", "triforce", "rupoor", "rupoorcost" ] + +CUSTOMITEMLABELS = [ + "Bow", "Progressive Bow", "Blue Boomerang", "Red Boomerang", "Hookshot", + "Mushroom", "Magic Powder", "Fire Rod", "Ice Rod", "Bombos", + "Ether", "Quake", "Lamp", "Hammer", "Shovel", + + "Ocarina", "Bug Catching Net", "Book of Mudora", "Bottle", "Cane of Somaria", + "Cane of Byrna", "Magic Cape", "Magic Mirror", "Pegasus Boots", "Power Glove", + "Titans Mitts", "Progressive Glove", "Flippers", "Moon Pearl", "Piece of Heart", + + "Boss Heart Container", "Sanctuary Heart Container", "Fighter Sword", "Master Sword", "Tempered Sword", + "Golden Sword", "Progressive Sword", "Blue Shield", "Red Shield", "Mirror Shield", + "Progressive Shield", "Blue Mail", "Red Mail", "Progressive Armor", "Magic Upgrade (1/2)", + + "Magic Upgrade (1/4)", "Bomb Upgrade (+5)", "Bomb Upgrade (+10)", "Arrow Upgrade (+5)", "Arrow Upgrade (+10)", + "Single Arrow", "Arrows (10)", "Single Bomb", "Bombs (3)", "Bombs (10)", + "Rupee (1)", "Rupees (5)", "Rupees (20)", "Rupees (50)", "Rupees (100)", + + "Rupees (300)", "Blue Clock", "Green Clock", "Red Clock", "Silver Arrows", + "Small Key (Universal)", "Triforce Piece", "Triforce Piece Goal", "Triforce", "Rupoor", + "Rupoor Cost" +] diff --git a/gui/bottom.py b/gui/bottom.py index ee4b271c..cea47a56 100644 --- a/gui/bottom.py +++ b/gui/bottom.py @@ -180,10 +180,20 @@ def create_guiargs(parent): setattr(guiargs,"adjust." + internal, parent.pages["adjust"].content.widgets[adjustarg].storageVar.get()) customitems = CONST.CUSTOMITEMS + guiargs.startinventory = [] guiargs.customitemarray = {} + guiargs.startinventoryarray = {} for customitem in customitems: + if customitem not in ["triforcepiecesgoal", "rupoorcost"]: + amount = int(parent.pages["startinventory"].content.startingWidgets[customitem].storageVar.get()) + guiargs.startinventoryarray[customitem] = amount + for i in range(0, amount): + label = CONST.CUSTOMITEMLABELS[customitems.index(customitem)] + guiargs.startinventory.append(label) guiargs.customitemarray[customitem] = int(parent.pages["custom"].content.customWidgets[customitem].storageVar.get()) + guiargs.startinventory = ','.join(guiargs.startinventory) + guiargs.sprite = parent.pages["randomizer"].pages["gameoptions"].widgets["sprite"]["spriteObject"] guiargs.randomSprite = parent.randomSprite.get() guiargs.outputpath = parent.outputPath.get() diff --git a/gui/startinventory/__init__.py b/gui/startinventory/__init__.py new file mode 100644 index 00000000..fa319bae --- /dev/null +++ b/gui/startinventory/__init__.py @@ -0,0 +1 @@ +# do nothing, just exist to make "gui.startinventory" package diff --git a/gui/startinventory/overview.py b/gui/startinventory/overview.py new file mode 100644 index 00000000..4d177865 --- /dev/null +++ b/gui/startinventory/overview.py @@ -0,0 +1,60 @@ +from tkinter import ttk, StringVar, Entry, Frame, Label, N, E, W, LEFT, RIGHT, X, VERTICAL, Y +import gui.widgets as widgets +import json +import os + +import classes.constants as CONST + +def startinventory_page(top,parent): + # Starting Inventory + self = ttk.Frame(parent) + + def create_list_frame(parent, framename): + parent.frames[framename] = Frame(parent) + parent.frames[framename].pack(side=LEFT, padx=(0,0), anchor=N) + parent.frames[framename].thisRow = 0 + parent.frames[framename].thisCol = 0 + + def create_vertical_rule(num=1): + for i in range(0,num): + ttk.Separator(self, orient=VERTICAL).pack(side=LEFT, anchor=N, fill=Y) + + def validation(P): + if str.isdigit(P) or P == "": + return True + else: + return False + vcmd=(self.register(validation), '%P') + + # Starting Inventory options + self.startingWidgets = {} + + # Starting Inventory option sections + self.frames = {} + create_list_frame(self,"itemList1") + create_vertical_rule(2) + create_list_frame(self,"itemList2") + create_vertical_rule(2) + create_list_frame(self,"itemList3") + create_vertical_rule(2) + create_list_frame(self,"itemList4") + create_vertical_rule(2) + create_list_frame(self,"itemList5") + + with open(os.path.join("resources","app","gui","custom","overview","widgets.json")) as widgetDefns: + myDict = json.load(widgetDefns) + del myDict["itemList5"]["triforcepiecesgoal"] + del myDict["itemList5"]["rupoorcost"] + for framename,theseWidgets in myDict.items(): + dictWidgets = widgets.make_widgets_from_dict(self, theseWidgets, self.frames[framename]) + for key in dictWidgets: + self.startingWidgets[key] = dictWidgets[key] + + for key in CONST.CUSTOMITEMS: + if key not in ["triforcepiecesgoal", "rupoorcost"]: + val = 0 + if key in top.settings["startinventoryarray"]: + val = top.settings["startinventoryarray"][key] + self.startingWidgets[key].storageVar.set(val) + + return self diff --git a/resources/app/gui/randomize/generation/checkboxes.json b/resources/app/gui/randomize/generation/checkboxes.json index ed208ec3..7d0fedbf 100644 --- a/resources/app/gui/randomize/generation/checkboxes.json +++ b/resources/app/gui/randomize/generation/checkboxes.json @@ -11,6 +11,12 @@ "text": "Do not create patched ROM" } }, + "usestartinventory": { + "type": "checkbox", + "label": { + "text": "Use starting inventory" + } + }, "usecustompool": { "type": "checkbox", "label": {