Defaults from settings file, then CLI, then canned defaults Fix Adjust settings Fix Custom Item Array settings Create error message for Enemizer Not Found
199 lines
7.5 KiB
Python
199 lines
7.5 KiB
Python
from tkinter import ttk, messagebox, StringVar, Button, Entry, Frame, Label, Spinbox, E, W, LEFT, RIGHT, X
|
|
from argparse import Namespace
|
|
import logging
|
|
import os
|
|
import random
|
|
from CLI import parse_arguments, get_settings
|
|
from Main import main
|
|
from Utils import local_path, output_path, open_file
|
|
import gui.widgets as widgets
|
|
|
|
|
|
def bottom_frame(self, parent, args=None):
|
|
# Bottom Frame
|
|
self = ttk.Frame(parent)
|
|
|
|
# Bottom Frame options
|
|
self.widgets = {}
|
|
|
|
seedCountFrame = Frame(self)
|
|
seedCountFrame.pack()
|
|
## Seed #
|
|
seedLabel = Label(self, text='Seed #')
|
|
savedSeed = parent.settings["seed"]
|
|
self.seedVar = StringVar(value=savedSeed)
|
|
def saveSeed(caller,_,mode):
|
|
savedSeed = self.seedVar.get()
|
|
parent.settings["seed"] = int(savedSeed) if savedSeed.isdigit() else None
|
|
self.seedVar.trace_add("write",saveSeed)
|
|
seedEntry = Entry(self, width=15, textvariable=self.seedVar)
|
|
seedLabel.pack(side=LEFT)
|
|
seedEntry.pack(side=LEFT)
|
|
|
|
## Number of Generation attempts
|
|
key = "generationcount"
|
|
self.widgets[key] = widgets.make_widget(
|
|
self,
|
|
"spinbox",
|
|
self,
|
|
"Count",
|
|
None,
|
|
{"label": {"side": LEFT}, "spinbox": {"side": RIGHT}}
|
|
)
|
|
self.widgets[key].pack(side=LEFT)
|
|
|
|
def generateRom():
|
|
guiargs = create_guiargs(parent)
|
|
# get default values for missing parameters
|
|
for k,v in vars(parse_arguments(['--multi', str(guiargs.multi)])).items():
|
|
if k not in vars(guiargs):
|
|
setattr(guiargs, k, v)
|
|
elif type(v) is dict: # use same settings for every player
|
|
setattr(guiargs, k, {player: getattr(guiargs, k) for player in range(1, guiargs.multi + 1)})
|
|
try:
|
|
if guiargs.count is not None:
|
|
seed = guiargs.seed
|
|
for _ in range(guiargs.count):
|
|
main(seed=seed, args=guiargs)
|
|
seed = random.randint(0, 999999999)
|
|
else:
|
|
main(seed=guiargs.seed, args=guiargs)
|
|
except Exception as e:
|
|
logging.exception(e)
|
|
messagebox.showerror(title="Error while creating seed", message=str(e))
|
|
else:
|
|
messagebox.showinfo(title="Success", message="Rom patched successfully")
|
|
|
|
## Generate Button
|
|
generateButton = Button(self, text='Generate Patched Rom', command=generateRom)
|
|
generateButton.pack(side=LEFT)
|
|
|
|
def open_output():
|
|
if args and args.outputpath:
|
|
open_file(output_path(args.outputpath))
|
|
else:
|
|
open_file(output_path(parent.settings["outputpath"]))
|
|
|
|
openOutputButton = Button(self, text='Open Output Directory', command=open_output)
|
|
openOutputButton.pack(side=RIGHT)
|
|
|
|
if os.path.exists(local_path('README.html')):
|
|
def open_readme():
|
|
open_file(local_path('README.html'))
|
|
openReadmeButton = Button(self, text='Open Documentation', command=open_readme)
|
|
openReadmeButton.pack()
|
|
|
|
return self
|
|
|
|
|
|
def create_guiargs(parent):
|
|
guiargs = Namespace()
|
|
|
|
# set up settings to gather
|
|
# Page::Subpage::GUI-id::param-id
|
|
options = {
|
|
"randomizer": {
|
|
"item": {
|
|
"retro": "retro",
|
|
"worldstate": "mode",
|
|
"logiclevel": "logic",
|
|
"goal": "goal",
|
|
"crystals_gt": "crystals_gt",
|
|
"crystals_ganon": "crystals_ganon",
|
|
"weapons": "swords",
|
|
"itempool": "difficulty",
|
|
"itemfunction": "item_functionality",
|
|
"timer": "timer",
|
|
"progressives": "progressive",
|
|
"accessibility": "accessibility",
|
|
"sortingalgo": "algorithm"
|
|
},
|
|
"entrance": {
|
|
"openpyramid": "openpyramid",
|
|
"shuffleganon": "shuffleganon",
|
|
"entranceshuffle": "shuffle"
|
|
},
|
|
"enemizer": {
|
|
"potshuffle": "shufflepots",
|
|
"enemyshuffle": "shuffleenemies",
|
|
"bossshuffle": "shufflebosses",
|
|
"enemydamage": "enemy_damage",
|
|
"enemyhealth": "enemy_health"
|
|
},
|
|
"dungeon": {
|
|
"mapshuffle": "mapshuffle",
|
|
"compassshuffle": "compassshuffle",
|
|
"smallkeyshuffle": "keyshuffle",
|
|
"bigkeyshuffle": "bigkeyshuffle",
|
|
"dungeondoorshuffle": "door_shuffle",
|
|
"experimental": "experimental",
|
|
"dungeon_counters": "dungeon_counters"
|
|
},
|
|
"multiworld": {
|
|
"names": "names"
|
|
},
|
|
"gameoptions": {
|
|
"hints": "hints",
|
|
"nobgm": "disablemusic",
|
|
"quickswap": "quickswap",
|
|
"heartcolor": "heartcolor",
|
|
"heartbeep": "heartbeep",
|
|
"menuspeed": "fastmenu",
|
|
"owpalettes": "ow_palettes",
|
|
"uwpalettes": "uw_palettes"
|
|
},
|
|
"generation": {
|
|
"spoiler": "create_spoiler",
|
|
"suppressrom": "suppress_rom"
|
|
}
|
|
}
|
|
}
|
|
for mainpage in options:
|
|
for subpage in options[mainpage]:
|
|
for widget in options[mainpage][subpage]:
|
|
arg = options[mainpage][subpage][widget]
|
|
setattr(guiargs, arg, parent.pages[mainpage].pages[subpage].widgets[widget].storageVar.get())
|
|
|
|
guiargs.enemizercli = parent.pages["randomizer"].pages["enemizer"].enemizerCLIpathVar.get()
|
|
|
|
guiargs.multi = int(parent.pages["randomizer"].pages["multiworld"].widgets["worlds"].storageVar.get())
|
|
|
|
guiargs.rom = parent.pages["randomizer"].pages["generation"].romVar.get()
|
|
guiargs.custom = bool(parent.pages["randomizer"].pages["generation"].widgets["usecustompool"].storageVar.get())
|
|
|
|
guiargs.seed = int(parent.frames["bottom"].seedVar.get()) if parent.frames["bottom"].seedVar.get() else None
|
|
guiargs.count = int(parent.frames["bottom"].widgets["generationcount"].storageVar.get()) if parent.frames["bottom"].widgets["generationcount"].storageVar.get() != '1' else None
|
|
|
|
adjustargs = {
|
|
"nobgm": "disablemusic",
|
|
"quickswap": "quickswap",
|
|
"heartcolor": "heartcolor",
|
|
"heartbeep": "heartbeep",
|
|
"menuspeed": "fastmenu",
|
|
"owpalettes": "ow_palettes",
|
|
"uwpalettes": "uw_palettes"
|
|
}
|
|
for adjustarg in adjustargs:
|
|
internal = adjustargs[adjustarg]
|
|
setattr(guiargs,"adjust." + internal, parent.pages["adjust"].content.widgets[adjustarg].storageVar.get())
|
|
|
|
customitems = [
|
|
"bow", "silversupgrade", "boomerang", "redmerang", "hookshot", "mushroom", "powder", "firerod",
|
|
"icerod", "bombos", "ether", "quake", "lamp", "hammer", "shovel", "flute", "bugnet",
|
|
"book", "bottle", "somaria", "byrna", "cape", "mirror", "boots", "powerglove", "titansmitt",
|
|
"progressiveglove", "flippers", "pearl", "heartpiece", "heartcontainer", "sancheart", "sword1", "sword2",
|
|
"sword3", "sword4", "progressivesword", "shield1", "shield2", "shield3", "progressiveshield", "mail2",
|
|
"mail3", "progressivemail", "halfmagic", "quartermagic", "bombsplus5", "bombsplus10", "arrowsplus5", "arrowsplus10",
|
|
"arrow1", "arrow10", "bomb1", "bomb3", "rupee1", "rupee5", "rupee20", "rupee50", "rupee100",
|
|
"rupee300", "rupoor", "blueclock", "greenclock", "redclock", "progressivebow", "bomb10", "triforcepieces", "triforcepiecesgoal",
|
|
"triforce", "rupoorcost", "generickeys"
|
|
]
|
|
guiargs.customitemarray = []
|
|
for customitem in customitems:
|
|
guiargs.customitemarray.append(int(parent.pages["custom"].content.customWidgets[customitem].storageVar.get()))
|
|
|
|
guiargs.sprite = parent.pages["randomizer"].pages["gameoptions"].widgets["sprite"]["spriteObject"]
|
|
guiargs.randomSprite = parent.randomSprite.get()
|
|
guiargs.outputpath = parent.outputPath.get()
|
|
return guiargs
|