Merge branch 'SFXShuffle' into DoorDevUnstable
This commit is contained in:
@@ -36,6 +36,7 @@ def main():
|
||||
parser.add_argument('--ow_palettes', default='default', choices=['default', 'random', 'blackout'])
|
||||
parser.add_argument('--uw_palettes', default='default', choices=['default', 'random', 'blackout'])
|
||||
parser.add_argument('--reduce_flashing', help='Reduce some in-game flashing.', action='store_true')
|
||||
parser.add_argument('--shuffle_sfx', help='Shuffles sound sfx', action='store_true')
|
||||
parser.add_argument('--sprite', help='''\
|
||||
Path to a sprite sheet to use for Link. Needs to be in
|
||||
binary format and have a length of 0x7000 (28672) bytes,
|
||||
|
||||
@@ -25,7 +25,7 @@ def adjust(args):
|
||||
args.sprite = None
|
||||
|
||||
apply_rom_settings(rom, args.heartbeep, args.heartcolor, args.quickswap, args.fastmenu, args.disablemusic,
|
||||
args.sprite, args.ow_palettes, args.uw_palettes, args.reduce_flashing)
|
||||
args.sprite, args.ow_palettes, args.uw_palettes, args.reduce_flashing, args.shuffle_sfx)
|
||||
|
||||
output_path.cached_path = args.outputpath
|
||||
rom.write_to_file(output_path('%s.sfc' % outfilebase))
|
||||
|
||||
3
CLI.py
3
CLI.py
@@ -103,7 +103,7 @@ def parse_cli(argv, no_defaults=False):
|
||||
'shufflebosses', 'shuffleenemies', 'enemy_health', 'enemy_damage', 'shufflepots',
|
||||
'ow_palettes', 'uw_palettes', 'sprite', 'disablemusic', 'quickswap', 'fastmenu', 'heartcolor', 'heartbeep',
|
||||
'remote_items', 'shopsanity', 'keydropshuffle', 'mixed_travel', 'standardize_palettes', 'code',
|
||||
'reduce_flashing']:
|
||||
'reduce_flashing', 'shuffle_sfx']:
|
||||
value = getattr(defaults, name) if getattr(playerargs, name) is None else getattr(playerargs, name)
|
||||
if player == 1:
|
||||
setattr(ret, name, {1: value})
|
||||
@@ -192,6 +192,7 @@ def parse_settings():
|
||||
"ow_palettes": "default",
|
||||
"uw_palettes": "default",
|
||||
"reduce_flashing": False,
|
||||
"shuffle_sfx": False,
|
||||
|
||||
# Spoiler defaults to TRUE
|
||||
# Playthrough defaults to TRUE
|
||||
|
||||
3
Main.py
3
Main.py
@@ -293,7 +293,8 @@ def main(args, seed=None, fish=None):
|
||||
|
||||
apply_rom_settings(rom, args.heartbeep[player], args.heartcolor[player], args.quickswap[player],
|
||||
args.fastmenu[player], args.disablemusic[player], args.sprite[player],
|
||||
args.ow_palettes[player], args.uw_palettes[player], args.reduce_flashing[player])
|
||||
args.ow_palettes[player], args.uw_palettes[player], args.reduce_flashing[player],
|
||||
args.shuffle_sfx[player])
|
||||
|
||||
if args.jsonout:
|
||||
jsonout[f'patch_t{team}_p{player}'] = rom.patches
|
||||
|
||||
@@ -234,6 +234,7 @@ def roll_settings(weights):
|
||||
ret.heartbeep = get_choice('heartbeep', romweights)
|
||||
ret.ow_palettes = get_choice('ow_palettes', romweights)
|
||||
ret.uw_palettes = get_choice('uw_palettes', romweights)
|
||||
ret.uw_palettes = get_choice('shuffle_sfx', romweights) == 'on'
|
||||
|
||||
return ret
|
||||
|
||||
|
||||
7
Rom.py
7
Rom.py
@@ -28,6 +28,8 @@ from Utils import output_path, local_path, int16_as_bytes, int32_as_bytes, snes_
|
||||
from Items import ItemFactory
|
||||
from EntranceShuffle import door_addresses, exit_ids
|
||||
|
||||
from source.classes.SFX import randomize_sfx
|
||||
|
||||
|
||||
JAP10HASH = '03a63945398191337e896e5771f77173'
|
||||
RANDOMIZERBASEHASH = '988f1546b14d8f2e6ee30b9de44882da'
|
||||
@@ -1645,7 +1647,7 @@ def hud_format_text(text):
|
||||
|
||||
|
||||
def apply_rom_settings(rom, beep, color, quickswap, fastmenu, disable_music, sprite,
|
||||
ow_palettes, uw_palettes, reduce_flashing):
|
||||
ow_palettes, uw_palettes, reduce_flashing, shuffle_sfx):
|
||||
|
||||
if not os.path.exists("data/sprites/official/001.link.1.zspr") and rom.orig_buffer:
|
||||
dump_zspr(rom.orig_buffer[0x80000:0x87000], rom.orig_buffer[0xdd308:0xdd380],
|
||||
@@ -1748,6 +1750,9 @@ def apply_rom_settings(rom, beep, color, quickswap, fastmenu, disable_music, spr
|
||||
elif uw_palettes == 'blackout':
|
||||
blackout_uw_palettes(rom)
|
||||
|
||||
if shuffle_sfx:
|
||||
randomize_sfx(rom)
|
||||
|
||||
if isinstance(rom, LocalRom):
|
||||
rom.write_crc()
|
||||
|
||||
|
||||
@@ -132,3 +132,6 @@
|
||||
half: 0
|
||||
quarter: 1
|
||||
off: 0
|
||||
shuffle_sfx:
|
||||
on: 1
|
||||
off: 1
|
||||
|
||||
@@ -199,6 +199,10 @@
|
||||
"action": "store_true",
|
||||
"type": "bool"
|
||||
},
|
||||
"shuffle_sfx": {
|
||||
"action": "store_true",
|
||||
"type": "bool"
|
||||
},
|
||||
"mapshuffle": {
|
||||
"action": "store_true",
|
||||
"type": "bool"
|
||||
|
||||
@@ -297,6 +297,7 @@
|
||||
"sprite that will be extracted."
|
||||
],
|
||||
"reduce_flashing": [ "Reduce some in-game flashing (default: %(default)s)" ],
|
||||
"shuffle_sfx": [ "Shuffle sounds effects (default: %(default)s)" ],
|
||||
"create_rom": [ "Create an output rom file. (default: %(default)s)" ],
|
||||
"gui": [ "Launch the GUI. (default: %(default)s)" ],
|
||||
"jsonout": [
|
||||
|
||||
@@ -2,7 +2,8 @@
|
||||
"checkboxes": {
|
||||
"nobgm": { "type": "checkbox" },
|
||||
"quickswap": { "type": "checkbox" },
|
||||
"reduce_flashing": {"type": "checkbox"}
|
||||
"reduce_flashing": {"type": "checkbox"},
|
||||
"shuffle_sfx": {"type": "checkbox"}
|
||||
},
|
||||
"leftAdjustFrame": {
|
||||
"heartcolor": {
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
"adjust.nobgm": "Disable Music & MSU-1",
|
||||
"adjust.quickswap": "L/R Quickswapping",
|
||||
"adjust.reduce_flashing": "Reduce Flashing",
|
||||
"adjust.shuffle_sfx": "Shuffle Sound Effects",
|
||||
|
||||
"adjust.heartcolor": "Heart Color",
|
||||
"adjust.heartcolor.red": "Red",
|
||||
@@ -134,6 +135,7 @@
|
||||
"randomizer.gameoptions.nobgm": "Disable Music & MSU-1",
|
||||
"randomizer.gameoptions.quickswap": "L/R Quickswapping",
|
||||
"randomizer.gameoptions.reduce_flashing": "Reduce Flashing",
|
||||
"randomizer.gameoptions.shuffle_sfx": "Shuffle Sound Effects",
|
||||
|
||||
"randomizer.gameoptions.heartcolor": "Heart Color",
|
||||
"randomizer.gameoptions.heartcolor.red": "Red",
|
||||
|
||||
@@ -2,7 +2,8 @@
|
||||
"checkboxes": {
|
||||
"nobgm": { "type": "checkbox" },
|
||||
"quickswap": { "type": "checkbox" },
|
||||
"reduce_flashing": {"type": "checkbox"}
|
||||
"reduce_flashing": {"type": "checkbox"},
|
||||
"shuffle_sfx": {"type": "checkbox"}
|
||||
},
|
||||
"leftRomOptionsFrame": {
|
||||
"heartcolor": {
|
||||
|
||||
191
source/classes/SFX.py
Normal file
191
source/classes/SFX.py
Normal file
@@ -0,0 +1,191 @@
|
||||
import random
|
||||
from Utils import int16_as_bytes
|
||||
|
||||
|
||||
class SFX(object):
|
||||
|
||||
def __init__(self, name, sfx_set, orig_id, addr, chain, accomp=False):
|
||||
self.name = name
|
||||
self.sfx_set = sfx_set
|
||||
self.orig_id = orig_id
|
||||
self.addr = addr
|
||||
self.chain = chain
|
||||
self.accomp = accomp
|
||||
|
||||
self.target_set = None
|
||||
self.target_id = None
|
||||
self.target_chain = None
|
||||
|
||||
|
||||
def init_sfx_data():
|
||||
sfx_pool = [SFX('Slash1', 0x02, 0x01, 0x2614, []), SFX('Slash2', 0x02, 0x02, 0x2625, []),
|
||||
SFX('Slash3', 0x02, 0x03, 0x2634, []), SFX('Slash4', 0x02, 0x04, 0x2643, []),
|
||||
SFX('Wall clink', 0x02, 0x05, 0x25DD, []), SFX('Bombable door clink', 0x02, 0x06, 0x25D7, []),
|
||||
SFX('Fwoosh shooting', 0x02, 0x07, 0x25B7, []), SFX('Arrow hitting wall', 0x02, 0x08, 0x25E3, []),
|
||||
SFX('Boomerang whooshing', 0x02, 0x09, 0x25AD, []), SFX('Hookshot', 0x02, 0x0A, 0x25C7, []),
|
||||
SFX('Placing bomb', 0x02, 0x0B, 0x2478, []),
|
||||
SFX('Bomb exploding/Quake/Bombos/Exploding wall', 0x02, 0x0C, 0x269C, []),
|
||||
SFX('Powder', 0x02, 0x0D, 0x2414, [0x3f]), SFX('Fire rod shot', 0x02, 0x0E, 0x2404, []),
|
||||
SFX('Ice rod shot', 0x02, 0x0F, 0x24C3, []), SFX('Hammer use', 0x02, 0x10, 0x23FA, []),
|
||||
SFX('Hammering peg', 0x02, 0x11, 0x23F0, []), SFX('Digging', 0x02, 0x12, 0x23CD, []),
|
||||
SFX('Flute use', 0x02, 0x13, 0x23A0, [0x3e]), SFX('Cape on', 0x02, 0x14, 0x2380, []),
|
||||
SFX('Cape off/Wallmaster grab', 0x02, 0x15, 0x2390, []), SFX('Staircase', 0x02, 0x16, 0x232C, []),
|
||||
SFX('Staircase', 0x02, 0x17, 0x2344, []), SFX('Staircase', 0x02, 0x18, 0x2356, []),
|
||||
SFX('Staircase', 0x02, 0x19, 0x236E, []), SFX('Tall grass/Hammer hitting bush', 0x02, 0x1A, 0x2316, []),
|
||||
SFX('Mire shallow water', 0x02, 0x1B, 0x2307, []), SFX('Shallow water', 0x02, 0x1C, 0x2301, []),
|
||||
SFX('Lifting object', 0x02, 0x1D, 0x22BB, []), SFX('Cutting grass', 0x02, 0x1E, 0x2577, []),
|
||||
SFX('Item breaking', 0x02, 0x1F, 0x22E9, []), SFX('Item falling in pit', 0x02, 0x20, 0x22DA, []),
|
||||
SFX('Bomb hitting ground/General bang', 0x02, 0x21, 0x22CF, []),
|
||||
SFX('Pushing object/Armos bounce', 0x02, 0x22, 0x2107, []), SFX('Boots dust', 0x02, 0x23, 0x22B1, []),
|
||||
SFX('Splashing', 0x02, 0x24, 0x22A5, [0x3d]), SFX('Mire shallow water again?', 0x02, 0x25, 0x2296, []),
|
||||
SFX('Link taking damage', 0x02, 0x26, 0x2844, []), SFX('Fainting', 0x02, 0x27, 0x2252, []),
|
||||
SFX('Item splash', 0x02, 0x28, 0x2287, []), SFX('Rupee refill', 0x02, 0x29, 0x243F, [0x3b]),
|
||||
SFX('Fire rod shot hitting wall/Bombos spell', 0x02, 0x2A, 0x2033, []),
|
||||
SFX('Heart beep/Text box', 0x02, 0x2B, 0x1FF2, []), SFX('Sword up', 0x02, 0x2C, 0x1FD9, [0x3a]),
|
||||
SFX('Magic drain', 0x02, 0x2D, 0x20A6, []), SFX('GT opening', 0x02, 0x2E, 0x1FCA, [0x39]),
|
||||
SFX('GT opening/Water drain', 0x02, 0x2F, 0x1F47, [0x38]), SFX('Cucco', 0x02, 0x30, 0x1EF1, []),
|
||||
SFX('Fairy', 0x02, 0x31, 0x20CE, []), SFX('Bug net', 0x02, 0x32, 0x1D47, []),
|
||||
SFX('Teleport2', 0x02, 0x33, 0x1CDC, [], True), SFX('Teleport1', 0x02, 0x34, 0x1F6F, [0x33]),
|
||||
SFX('Quake/Vitreous/Zora king/Armos/Pyramid/Lanmo', 0x02, 0x35, 0x1C67, [0x36]),
|
||||
SFX('Mire entrance (extends above)', 0x02, 0x36, 0x1C64, [], True),
|
||||
SFX('Spin charged', 0x02, 0x37, 0x1A43, []), SFX('Water sound', 0x02, 0x38, 0x1F6F, [], True),
|
||||
SFX('GT opening thunder', 0x02, 0x39, 0x1F9C, [], True), SFX('Sword up', 0x02, 0x3A, 0x1FE7, [], True),
|
||||
SFX('Quiet rupees', 0x02, 0x3B, 0x2462, [], True), SFX('Error beep', 0x02, 0x3C, 0x1A37, []),
|
||||
SFX('Big splash', 0x02, 0x3D, 0x22AB, [], True), SFX('Flute again', 0x02, 0x3E, 0x23B5, [], True),
|
||||
SFX('Powder paired', 0x02, 0x3F, 0x2435, [], True),
|
||||
|
||||
SFX('Sword beam', 0x03, 0x01, 0x1A18, []),
|
||||
SFX('TR opening', 0x03, 0x02, 0x254E, []), SFX('Pyramid hole', 0x03, 0x03, 0x224A, []),
|
||||
SFX('Angry soldier', 0x03, 0x04, 0x220E, []), SFX('Lynel shot/Javelin toss', 0x03, 0x05, 0x25B7, []),
|
||||
SFX('BNC swing/Phantom ganon/Helma tail/Arrghus swoosh', 0x03, 0x06, 0x21F5, []),
|
||||
SFX('Cannon fire', 0x03, 0x07, 0x223D, []), SFX('Damage to enemy; $0BEX.4=1', 0x03, 0x08, 0x21E6, []),
|
||||
SFX('Enemy death', 0x03, 0x09, 0x21C1, []), SFX('Collecting rupee', 0x03, 0x0A, 0x21A9, []),
|
||||
SFX('Collecting heart', 0x03, 0x0B, 0x2198, []),
|
||||
SFX('Non-blank text character', 0x03, 0x0C, 0x218E, []),
|
||||
SFX('HUD heart (used explicitly by sanc heart?)', 0x03, 0x0D, 0x21B5, []),
|
||||
SFX('Opening chest', 0x03, 0x0E, 0x2182, []),
|
||||
SFX('♪Do do do doooooo♫', 0x03, 0x0F, 0x24B9, [0x3C, 0x3D, 0x3E, 0x3F]),
|
||||
SFX('Opening/Closing map (paired)', 0x03, 0x10, 0x216D, [0x3b]),
|
||||
SFX('Opening item menu/Bomb shop guy breathing', 0x03, 0x11, 0x214F, []),
|
||||
SFX('Closing item menu/Bomb shop guy breathing', 0x03, 0x12, 0x215E, []),
|
||||
SFX('Throwing object (sprites use it as well)/Stalfos jump', 0x03, 0x13, 0x213B, []),
|
||||
SFX('Key door/Trinecks/Dash key landing/Stalfos Knight collapse', 0x03, 0x14, 0x246C, []),
|
||||
SFX('Door closing/OW door opening/Chest opening (w/ $29 in $012E)', 0x03, 0x15, 0x212F, []),
|
||||
SFX('Armos Knight thud', 0x03, 0x16, 0x2123, []), SFX('Rat squeak', 0x03, 0x17, 0x25A6, []),
|
||||
SFX('Dragging/Mantle moving', 0x03, 0x18, 0x20DD, []),
|
||||
SFX('Fireball/Laser shot; Somehow used by Trinexx???', 0x03, 0x19, 0x250A, []),
|
||||
SFX('Chest reveal jingle ', 0x03, 0x1A, 0x1E8A, [0x38]),
|
||||
SFX('Puzzle jingle', 0x03, 0x1B, 0x20B6, [0x3a]), SFX('Damage to enemy', 0x03, 0x1C, 0x1A62, []),
|
||||
SFX('Potion refill/Magic drain', 0x03, 0x1D, 0x20A6, []),
|
||||
SFX('Flapping (Duck/Cucco swarm/Ganon bats/Keese/Raven/Vulture)', 0x03, 0x1E, 0x2091, []),
|
||||
SFX('Link falling', 0x03, 0x1F, 0x204B, []), SFX('Menu/Text cursor moved', 0x03, 0x20, 0x276C, []),
|
||||
SFX('Damage to boss', 0x03, 0x21, 0x27E2, []), SFX('Boss dying/Deleting file', 0x03, 0x22, 0x26CF, []),
|
||||
SFX('Spin attack/Medallion swoosh', 0x03, 0x23, 0x2001, [0x39]),
|
||||
SFX('OW map perspective change', 0x03, 0x24, 0x2043, []),
|
||||
SFX('Pressure switch', 0x03, 0x25, 0x1E9D, []),
|
||||
SFX('Lightning/Game over/Laser/Ganon bat/Trinexx lunge', 0x03, 0x26, 0x1E7B, []),
|
||||
SFX('Agahnim charge', 0x03, 0x27, 0x1E40, []), SFX('Agahnim/Ganon teleport', 0x03, 0x28, 0x26F7, []),
|
||||
SFX('Agahnim shot', 0x03, 0x29, 0x1E21, []),
|
||||
SFX('Somaria/Byrna/Ether spell/Helma fire ball', 0x03, 0x2A, 0x1E12, []),
|
||||
SFX('Electrocution', 0x03, 0x2B, 0x1DF3, []), SFX('Bees', 0x03, 0x2C, 0x1DC0, []),
|
||||
SFX('Milestone, also via text', 0x03, 0x2D, 0x1DA9, [0x37]),
|
||||
SFX('Collecting heart container', 0x03, 0x2E, 0x1D5D, [0x35, 0x34]),
|
||||
SFX('Collecting absorbable key', 0x03, 0x2F, 0x1D80, [0x33]),
|
||||
SFX('Byrna spark/Item plop/Magic bat zap/Blob emerge', 0x03, 0x30, 0x1B53, []),
|
||||
SFX('Sprite falling/Moldorm shuffle', 0x03, 0x31, 0x1ACA, []),
|
||||
SFX('Bumper boing/Somaria punt/Blob transmutation/Sprite boings', 0x03, 0x32, 0x1A78, []),
|
||||
SFX('Jingle (paired $2F→$33)', 0x03, 0x33, 0x1D93, [], True),
|
||||
SFX('Depressing jingle (paired $2E→$35→$34)', 0x03, 0x34, 0x1D66, [], True),
|
||||
SFX('Ugly jingle (paired $2E→$35→$34)', 0x03, 0x35, 0x1D73, [], True),
|
||||
SFX('Wizzrobe shot/Helma fireball split/Mothula beam/Blue balls', 0x03, 0x36, 0x1AA7, []),
|
||||
SFX('Dinky jingle (paired $2D→$37)', 0x03, 0x37, 0x1DB4, [], True),
|
||||
SFX('Apathetic jingle (paired $1A→$38)', 0x03, 0x38, 0x1E93, [], True),
|
||||
SFX('Quiet swish (paired $23→$39)', 0x03, 0x39, 0x2017, [], True),
|
||||
SFX('Defective jingle (paired $1B→$3A)', 0x03, 0x3A, 0x20C0, [], True),
|
||||
SFX('Petulant jingle (paired $10→$3B)', 0x03, 0x3B, 0x2176, [], True),
|
||||
SFX('Triumphant jingle (paired $0F→$3C→$3D→$3E→$3F)', 0x03, 0x3C, 0x248A, [], True),
|
||||
SFX('Less triumphant jingle ($0F→$3C→$3D→$3E→$3F)', 0x03, 0x3D, 0x2494, [], True),
|
||||
SFX('"You tried, I guess" jingle (paired $0F→$3C→$3D→$3E→$3F)', 0x03, 0x3E, 0x249E, [], True),
|
||||
SFX('"You didn\'t really try" jingle (paired $0F→$3C→$3D→$3E→$3F)', 0x03, 0x3F, 0x2480, [], True)]
|
||||
return sfx_pool
|
||||
|
||||
|
||||
def shuffle_sfx_data():
|
||||
sfx_pool = init_sfx_data()
|
||||
sfx_map = {2: {}, 3: {}}
|
||||
accompaniment_map = {2: set(), 3: set()}
|
||||
candidates = []
|
||||
for sfx in sfx_pool:
|
||||
sfx_map[sfx.sfx_set][sfx.orig_id] = sfx
|
||||
if not sfx.accomp:
|
||||
candidates.append((sfx.sfx_set, sfx.orig_id))
|
||||
else:
|
||||
accompaniment_map[sfx.sfx_set].add(sfx.orig_id)
|
||||
chained_sfx = [x for x in sfx_pool if len(x.chain) > 0]
|
||||
|
||||
random.shuffle(candidates)
|
||||
|
||||
# place chained sfx first
|
||||
random.shuffle(chained_sfx) # todo: sort largest to smallest
|
||||
chained_sfx = sorted(chained_sfx, key=lambda x: len(x.chain), reverse=True)
|
||||
for chained in chained_sfx:
|
||||
chosen_slot = next(x for x in candidates if len(accompaniment_map[x[0]]) - len(chained.chain) >= 0)
|
||||
if chosen_slot is None:
|
||||
raise Exception('Something went wrong with sfx chains')
|
||||
chosen_set, chosen_id = chosen_slot
|
||||
chained.target_set, chained.target_id = chosen_slot
|
||||
chained.target_chain = []
|
||||
for downstream in chained.chain:
|
||||
next_slot = accompaniment_map[chosen_set].pop()
|
||||
ds_acc = sfx_map[chained.sfx_set][downstream]
|
||||
ds_acc.target_set, ds_acc.target_id = chosen_set, next_slot
|
||||
chained.target_chain.append(next_slot)
|
||||
candidates.remove(chosen_slot)
|
||||
sfx_pool.remove(chained)
|
||||
|
||||
unchained_sfx = [x for x in sfx_pool if not x.accomp]
|
||||
# do the rest
|
||||
for sfx in unchained_sfx:
|
||||
chosen_slot = candidates.pop()
|
||||
sfx.target_set, sfx.target_id = chosen_slot
|
||||
|
||||
return sfx_map
|
||||
|
||||
|
||||
sfx_table = {
|
||||
2: 0x1a8c29,
|
||||
3: 0x1A8D25
|
||||
}
|
||||
|
||||
# 0x1a8c29
|
||||
# d8059
|
||||
|
||||
sfx_accompaniment_table = {
|
||||
2: 0x1A8CA7,
|
||||
3: 0x1A8DA3
|
||||
}
|
||||
|
||||
|
||||
def randomize_sfx(rom):
|
||||
sfx_map = shuffle_sfx_data()
|
||||
|
||||
for shuffled_sfx in sfx_map.values():
|
||||
for sfx in shuffled_sfx.values():
|
||||
base_address = sfx_table[sfx.target_set]
|
||||
rom.write_bytes(base_address + (sfx.target_id * 2) - 2, int16_as_bytes(sfx.addr))
|
||||
ac_base = sfx_accompaniment_table[sfx.target_set]
|
||||
last = sfx.target_id
|
||||
if sfx.target_chain:
|
||||
for chained in sfx.target_chain:
|
||||
rom.write_byte(ac_base + last - 1, chained)
|
||||
last = chained
|
||||
rom.write_byte(ac_base + last - 1, 0)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -108,7 +108,8 @@ SETTINGSTOPROCESS = {
|
||||
"menuspeed": "fastmenu",
|
||||
"owpalettes": "ow_palettes",
|
||||
"uwpalettes": "uw_palettes",
|
||||
"reduce_flashing": "reduce_flashing"
|
||||
"reduce_flashing": "reduce_flashing",
|
||||
"shuffle_sfx": "shuffle_sfx",
|
||||
},
|
||||
"generation": {
|
||||
"createspoiler": "create_spoiler",
|
||||
|
||||
@@ -103,6 +103,7 @@ def adjust_page(top, parent, settings):
|
||||
"quickswap": "quickswap",
|
||||
"nobgm": "disablemusic",
|
||||
"reduce_flashing": "reduce_flashing",
|
||||
"shuffle_sfx": "shuffle_sfx",
|
||||
}
|
||||
guiargs = Namespace()
|
||||
for option in options:
|
||||
|
||||
Reference in New Issue
Block a user