Add sprite pool options to gui/adjuster
This commit is contained in:
parent
25f234dff0
commit
df0b98975d
18
Adjuster.py
18
Adjuster.py
|
@ -10,6 +10,12 @@ from Rom import Sprite, LocalRom, apply_rom_settings
|
||||||
from Utils import output_path
|
from Utils import output_path
|
||||||
|
|
||||||
|
|
||||||
|
class AdjusterWorld(object):
|
||||||
|
def __init__(self, sprite_pool):
|
||||||
|
import random
|
||||||
|
self.sprite_pool = {1: sprite_pool}
|
||||||
|
self.rom_seeds = {1: random}
|
||||||
|
|
||||||
class ArgumentDefaultsHelpFormatter(argparse.RawTextHelpFormatter):
|
class ArgumentDefaultsHelpFormatter(argparse.RawTextHelpFormatter):
|
||||||
|
|
||||||
def _get_help_string(self, action):
|
def _get_help_string(self, action):
|
||||||
|
@ -101,10 +107,14 @@ def adjust(args):
|
||||||
palettes_options['sword']=args.sword_palettes
|
palettes_options['sword']=args.sword_palettes
|
||||||
palettes_options['shield']=args.shield_palettes
|
palettes_options['shield']=args.shield_palettes
|
||||||
# palettes_options['link']=args.link_palettesvera
|
# palettes_options['link']=args.link_palettesvera
|
||||||
|
|
||||||
racerom = rom.read_byte(0x180213) > 0
|
racerom = rom.read_byte(0x180213) > 0
|
||||||
|
world = None
|
||||||
|
if hasattr(args, "world"):
|
||||||
|
world = getattr(args, "world")
|
||||||
|
|
||||||
apply_rom_settings(rom, args.heartbeep, args.heartcolor, args.quickswap, args.fastmenu, args.disablemusic,
|
apply_rom_settings(rom, args.heartbeep, args.heartcolor, args.quickswap, args.fastmenu, args.disablemusic,
|
||||||
args.sprite, palettes_options, reduceflashing=args.reduceflashing or racerom)
|
args.sprite, palettes_options, reduceflashing=args.reduceflashing or racerom, world=world)
|
||||||
path = output_path(f'{os.path.basename(args.rom)[:-4]}_adjusted.sfc')
|
path = output_path(f'{os.path.basename(args.rom)[:-4]}_adjusted.sfc')
|
||||||
rom.write_to_file(path)
|
rom.write_to_file(path)
|
||||||
|
|
||||||
|
@ -160,8 +170,14 @@ def adjustGUI():
|
||||||
guiargs.rom = romVar2.get()
|
guiargs.rom = romVar2.get()
|
||||||
guiargs.baserom = romVar.get()
|
guiargs.baserom = romVar.get()
|
||||||
guiargs.sprite = rom_vars.sprite
|
guiargs.sprite = rom_vars.sprite
|
||||||
|
if rom_vars.sprite_pool:
|
||||||
|
guiargs.world = AdjusterWorld(rom_vars.sprite_pool)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
guiargs, path = adjust(args=guiargs)
|
guiargs, path = adjust(args=guiargs)
|
||||||
|
if rom_vars.sprite_pool:
|
||||||
|
guiargs.sprite_pool = rom_vars.sprite_pool
|
||||||
|
delattr(guiargs, "world")
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logging.exception(e)
|
logging.exception(e)
|
||||||
messagebox.showerror(title="Error while adjusting Rom", message=str(e))
|
messagebox.showerror(title="Error while adjusting Rom", message=str(e))
|
||||||
|
|
65
Gui.py
65
Gui.py
|
@ -501,6 +501,9 @@ def guiMain(args=None):
|
||||||
guiargs.rom = romVar.get()
|
guiargs.rom = romVar.get()
|
||||||
guiargs.create_diff = patchesVar.get()
|
guiargs.create_diff = patchesVar.get()
|
||||||
guiargs.sprite = rom_vars.sprite
|
guiargs.sprite = rom_vars.sprite
|
||||||
|
if rom_vars.sprite_pool:
|
||||||
|
guiargs.sprite_pool = rom_vars.sprite_pool
|
||||||
|
messagebox.showinfo(title="Sprite Pool", message=", ".join(guiargs.sprite_pool))
|
||||||
# get default values for missing parameters
|
# get default values for missing parameters
|
||||||
for k,v in vars(parse_arguments(['--multi', str(guiargs.multi)])).items():
|
for k,v in vars(parse_arguments(['--multi', str(guiargs.multi)])).items():
|
||||||
if k not in vars(guiargs):
|
if k not in vars(guiargs):
|
||||||
|
@ -1308,7 +1311,8 @@ def get_rom_options_frame(parent=None):
|
||||||
spriteEntry = Label(spriteDialogFrame, textvariable=vars.spriteNameVar)
|
spriteEntry = Label(spriteDialogFrame, textvariable=vars.spriteNameVar)
|
||||||
|
|
||||||
def SpriteSelect():
|
def SpriteSelect():
|
||||||
SpriteSelector(parent, set_sprite)
|
nonlocal vars
|
||||||
|
SpriteSelector(parent, set_sprite, spritePool=vars.sprite_pool)
|
||||||
|
|
||||||
spriteSelectButton = Button(spriteDialogFrame, text='...', command=SpriteSelect)
|
spriteSelectButton = Button(spriteDialogFrame, text='...', command=SpriteSelect)
|
||||||
|
|
||||||
|
@ -1392,21 +1396,57 @@ def get_rom_options_frame(parent=None):
|
||||||
shieldPalettesOptionMenu = OptionMenu(shieldPalettesFrame, vars.shieldPalettesVar, 'default', 'random', 'blackout', 'grayscale', 'negative', 'classic', 'dizzy', 'sick', 'puke')
|
shieldPalettesOptionMenu = OptionMenu(shieldPalettesFrame, vars.shieldPalettesVar, 'default', 'random', 'blackout', 'grayscale', 'negative', 'classic', 'dizzy', 'sick', 'puke')
|
||||||
shieldPalettesOptionMenu.pack(side=LEFT)
|
shieldPalettesOptionMenu.pack(side=LEFT)
|
||||||
|
|
||||||
|
spritePoolFrame = Frame(romOptionsFrame)
|
||||||
|
spritePoolFrame.grid(row=5, column=1)
|
||||||
|
baseSpritePoolLabel = Label(spritePoolFrame, text='Sprite Pool:')
|
||||||
|
|
||||||
|
vars.spritePoolCountVar = StringVar()
|
||||||
|
vars.sprite_pool = []
|
||||||
|
def set_sprite_pool(sprite_param):
|
||||||
|
nonlocal vars
|
||||||
|
if isinstance(sprite_param, str):
|
||||||
|
vars.sprite_pool.append(sprite_param)
|
||||||
|
elif sprite_param and sprite_param.valid:
|
||||||
|
vars.sprite_pool.append(sprite_param.name)
|
||||||
|
vars.spritePoolCountVar.set(str(len(vars.sprite_pool)))
|
||||||
|
|
||||||
|
set_sprite_pool(None)
|
||||||
|
vars.spritePoolCountVar.set('0')
|
||||||
|
spritePoolEntry = Label(spritePoolFrame, textvariable=vars.spritePoolCountVar)
|
||||||
|
|
||||||
|
def SpritePoolSelect():
|
||||||
|
SpriteSelector(parent, set_sprite_pool, randomOnEvent=False)
|
||||||
|
|
||||||
|
def SpritePoolClear():
|
||||||
|
nonlocal vars
|
||||||
|
vars.sprite_pool.clear()
|
||||||
|
vars.spritePoolCountVar.set('0')
|
||||||
|
|
||||||
|
spritePoolSelectButton = Button(spritePoolFrame, text='...', command=SpritePoolSelect)
|
||||||
|
spritePoolClearButton = Button(spritePoolFrame, text='Clear', command=SpritePoolClear)
|
||||||
|
|
||||||
|
baseSpritePoolLabel.pack(side=LEFT)
|
||||||
|
spritePoolEntry.pack(side=LEFT)
|
||||||
|
spritePoolSelectButton.pack(side=LEFT)
|
||||||
|
spritePoolClearButton.pack(side=LEFT)
|
||||||
|
|
||||||
return romOptionsFrame, vars, set_sprite
|
return romOptionsFrame, vars, set_sprite
|
||||||
|
|
||||||
|
|
||||||
class SpriteSelector():
|
class SpriteSelector():
|
||||||
def __init__(self, parent, callback, adjuster=False):
|
def __init__(self, parent, callback, adjuster=False, randomOnEvent=True, spritePool=None):
|
||||||
self.deploy_icons()
|
self.deploy_icons()
|
||||||
self.parent = parent
|
self.parent = parent
|
||||||
self.window = Toplevel(parent)
|
self.window = Toplevel(parent)
|
||||||
self.callback = callback
|
self.callback = callback
|
||||||
self.adjuster = adjuster
|
self.adjuster = adjuster
|
||||||
|
self.randomOnEvent = randomOnEvent
|
||||||
|
|
||||||
self.window.wm_title("TAKE ANY ONE YOU WANT")
|
self.window.wm_title("TAKE ANY ONE YOU WANT")
|
||||||
self.window['padx'] = 5
|
self.window['padx'] = 5
|
||||||
self.window['pady'] = 5
|
self.window['pady'] = 5
|
||||||
self.all_sprites = []
|
self.all_sprites = []
|
||||||
|
self.sprite_pool = spritePool
|
||||||
|
|
||||||
def open_custom_sprite_dir(_evt):
|
def open_custom_sprite_dir(_evt):
|
||||||
open_file(self.custom_sprite_dir)
|
open_file(self.custom_sprite_dir)
|
||||||
|
@ -1447,7 +1487,9 @@ class SpriteSelector():
|
||||||
self.randomOnSlashVar = IntVar()
|
self.randomOnSlashVar = IntVar()
|
||||||
self.randomOnItemVar = IntVar()
|
self.randomOnItemVar = IntVar()
|
||||||
self.randomOnBonkVar = IntVar()
|
self.randomOnBonkVar = IntVar()
|
||||||
|
self.randomOnRandomVar = IntVar()
|
||||||
|
|
||||||
|
if self.randomOnEvent:
|
||||||
button = Checkbutton(frame, text="Hit", command=self.update_random_button, variable=self.randomOnHitVar)
|
button = Checkbutton(frame, text="Hit", command=self.update_random_button, variable=self.randomOnHitVar)
|
||||||
button.pack(side=LEFT, padx=(0, 5))
|
button.pack(side=LEFT, padx=(0, 5))
|
||||||
|
|
||||||
|
@ -1466,6 +1508,9 @@ class SpriteSelector():
|
||||||
button = Checkbutton(frame, text="Bonk", command=self.update_random_button, variable=self.randomOnBonkVar)
|
button = Checkbutton(frame, text="Bonk", command=self.update_random_button, variable=self.randomOnBonkVar)
|
||||||
button.pack(side=LEFT, padx=(0, 5))
|
button.pack(side=LEFT, padx=(0, 5))
|
||||||
|
|
||||||
|
button = Checkbutton(frame, text="Random", command=self.update_random_button, variable=self.randomOnRandomVar)
|
||||||
|
button.pack(side=LEFT, padx=(0, 5))
|
||||||
|
|
||||||
if adjuster:
|
if adjuster:
|
||||||
button = Button(frame, text="Current sprite from rom", command=self.use_default_sprite)
|
button = Button(frame, text="Current sprite from rom", command=self.use_default_sprite)
|
||||||
button.pack(side=LEFT, padx=(0, 5))
|
button.pack(side=LEFT, padx=(0, 5))
|
||||||
|
@ -1553,18 +1598,30 @@ class SpriteSelector():
|
||||||
self.window.destroy()
|
self.window.destroy()
|
||||||
|
|
||||||
def update_random_button(self):
|
def update_random_button(self):
|
||||||
|
if self.randomOnRandomVar.get():
|
||||||
|
randomon = "random"
|
||||||
|
else:
|
||||||
randomon = "-hit" if self.randomOnHitVar.get() else ""
|
randomon = "-hit" if self.randomOnHitVar.get() else ""
|
||||||
randomon += "-enter" if self.randomOnEnterVar.get() else ""
|
randomon += "-enter" if self.randomOnEnterVar.get() else ""
|
||||||
randomon += "-exit" if self.randomOnExitVar.get() else ""
|
randomon += "-exit" if self.randomOnExitVar.get() else ""
|
||||||
randomon += "-slash" if self.randomOnSlashVar.get() else ""
|
randomon += "-slash" if self.randomOnSlashVar.get() else ""
|
||||||
randomon += "-item" if self.randomOnItemVar.get() else ""
|
randomon += "-item" if self.randomOnItemVar.get() else ""
|
||||||
randomon += "-bonk" if self.randomOnBonkVar.get() else ""
|
randomon += "-bonk" if self.randomOnBonkVar.get() else ""
|
||||||
|
|
||||||
self.randomOnEventText.set(f"randomon{randomon}" if randomon else None)
|
self.randomOnEventText.set(f"randomon{randomon}" if randomon else None)
|
||||||
self.randomButtonText.set("Random On Event" if randomon else "Random")
|
self.randomButtonText.set("Random On Event" if randomon else "Random")
|
||||||
|
|
||||||
def use_random_sprite(self):
|
def use_random_sprite(self):
|
||||||
randomon = self.randomOnEventText.get()
|
if not self.randomOnEvent:
|
||||||
self.callback(randomon if randomon else (random.choice(self.all_sprites) if self.all_sprites else None))
|
self.callback("random")
|
||||||
|
elif self.randomOnEventText.get():
|
||||||
|
self.callback(self.randomOnEventText.get())
|
||||||
|
elif self.sprite_pool:
|
||||||
|
self.callback(random.choice(self.sprite_pool))
|
||||||
|
elif self.all_sprites:
|
||||||
|
self.callback(random.choice(self.all_sprites))
|
||||||
|
else:
|
||||||
|
self.callback(None)
|
||||||
self.window.destroy()
|
self.window.destroy()
|
||||||
|
|
||||||
def select_sprite(self, spritename):
|
def select_sprite(self, spritename):
|
||||||
|
|
5
Rom.py
5
Rom.py
|
@ -226,6 +226,9 @@ def apply_random_sprite_on_event(rom: LocalRom, sprite, local_random, allow_rand
|
||||||
elif sprite == 'randomonnone':
|
elif sprite == 'randomonnone':
|
||||||
# Allows for opting into random on events on race rom seeds, without actually enabling any of the events initially.
|
# Allows for opting into random on events on race rom seeds, without actually enabling any of the events initially.
|
||||||
onevent = 0x0000
|
onevent = 0x0000
|
||||||
|
elif sprite == 'randomonrandom':
|
||||||
|
# Allows random to take the wheel on which events apply. (at least one event will be applied.)
|
||||||
|
onevent = local_random.randint(0x0001, 0x003F)
|
||||||
elif userandomsprites:
|
elif userandomsprites:
|
||||||
onevent = 0x01 if 'hit' in sprite else 0x00
|
onevent = 0x01 if 'hit' in sprite else 0x00
|
||||||
onevent += 0x02 if 'enter' in sprite else 0x00
|
onevent += 0x02 if 'enter' in sprite else 0x00
|
||||||
|
@ -536,6 +539,8 @@ class Sprite(object):
|
||||||
self.valid = False
|
self.valid = False
|
||||||
return
|
return
|
||||||
(sprite, palette, self.name, self.author_name) = result
|
(sprite, palette, self.name, self.author_name) = result
|
||||||
|
if self.name == "":
|
||||||
|
self.name = os.path.split(filename)[1].split(".")[0]
|
||||||
if len(sprite) != 0x7000:
|
if len(sprite) != 0x7000:
|
||||||
self.valid = False
|
self.valid = False
|
||||||
return
|
return
|
||||||
|
|
8
Utils.py
8
Utils.py
|
@ -334,6 +334,7 @@ def get_adjuster_settings(romfile: str) -> typing.Tuple[str, bool]:
|
||||||
import Patch
|
import Patch
|
||||||
adjuster_settings.rom = romfile
|
adjuster_settings.rom = romfile
|
||||||
adjuster_settings.baserom = Patch.get_base_rom_path()
|
adjuster_settings.baserom = Patch.get_base_rom_path()
|
||||||
|
adjuster_settings.world = None
|
||||||
whitelist = {"disablemusic", "fastmenu", "heartbeep", "heartcolor", "ow_palettes", "quickswap",
|
whitelist = {"disablemusic", "fastmenu", "heartbeep", "heartcolor", "ow_palettes", "quickswap",
|
||||||
"uw_palettes", "sprite"}
|
"uw_palettes", "sprite"}
|
||||||
printed_options = {name: value for name, value in vars(adjuster_settings).items() if name in whitelist}
|
printed_options = {name: value for name, value in vars(adjuster_settings).items() if name in whitelist}
|
||||||
|
@ -347,9 +348,16 @@ def get_adjuster_settings(romfile: str) -> typing.Tuple[str, bool]:
|
||||||
f"{pprint.pformat(printed_options)}\n"
|
f"{pprint.pformat(printed_options)}\n"
|
||||||
f"Enter yes, no or never: ")
|
f"Enter yes, no or never: ")
|
||||||
if adjust_wanted and adjust_wanted.startswith("y"):
|
if adjust_wanted and adjust_wanted.startswith("y"):
|
||||||
|
if hasattr(adjuster_settings, "sprite_pool"):
|
||||||
|
from Adjuster import AdjusterWorld
|
||||||
|
adjuster_settings.world = AdjusterWorld(getattr(adjuster_settings, "sprite_pool"))
|
||||||
|
|
||||||
adjusted = True
|
adjusted = True
|
||||||
import Adjuster
|
import Adjuster
|
||||||
_, romfile = Adjuster.adjust(adjuster_settings)
|
_, romfile = Adjuster.adjust(adjuster_settings)
|
||||||
|
|
||||||
|
if hasattr(adjuster_settings, "world"):
|
||||||
|
delattr(adjuster_settings, "world")
|
||||||
elif adjust_wanted and "never" in adjust_wanted:
|
elif adjust_wanted and "never" in adjust_wanted:
|
||||||
persistent_store("adjuster", "never_adjust", True)
|
persistent_store("adjuster", "never_adjust", True)
|
||||||
return romfile, False
|
return romfile, False
|
||||||
|
|
Loading…
Reference in New Issue