Separated Collection Rate counter from experimental

Added MSU Resume option
Ensured pots in TR Dark Ride need lamp
Fix for Links House being at Maze Race (did not generate)
This commit is contained in:
aerinon
2022-03-09 15:42:00 -07:00
parent 6f7a2e234d
commit 4e43f38332
21 changed files with 66 additions and 16 deletions

View File

@@ -37,6 +37,7 @@ def main():
parser.add_argument('--uw_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('--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('--shuffle_sfx', help='Shuffles sound sfx', action='store_true')
parser.add_argument('--msu_resume', help='Enable MSU resume', action='store_true')
parser.add_argument('--sprite', help='''\ parser.add_argument('--sprite', help='''\
Path to a sprite sheet to use for Link. Needs to be in Path to a sprite sheet to use for Link. Needs to be in
binary format and have a length of 0x7000 (28672) bytes, binary format and have a length of 0x7000 (28672) bytes,

View File

@@ -32,7 +32,8 @@ def adjust(args):
args.sprite = None args.sprite = None
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, args.ow_palettes, args.uw_palettes, args.reduce_flashing, args.shuffle_sfx) args.sprite, args.ow_palettes, args.uw_palettes, args.reduce_flashing, args.shuffle_sfx,
args.msu_resume)
output_path.cached_path = args.outputpath output_path.cached_path = args.outputpath
rom.write_to_file(output_path('%s.sfc' % outfilebase)) rom.write_to_file(output_path('%s.sfc' % outfilebase))
@@ -66,7 +67,8 @@ def patch(args):
args.sprite = None args.sprite = None
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, args.ow_palettes, args.uw_palettes, args.reduce_flashing, args.shuffle_sfx) args.sprite, args.ow_palettes, args.uw_palettes, args.reduce_flashing, args.shuffle_sfx,
args.msu_resume)
output_path.cached_path = args.outputpath output_path.cached_path = args.outputpath
rom.write_to_file(output_path('%s.sfc' % outfile_base)) rom.write_to_file(output_path('%s.sfc' % outfile_base))

View File

@@ -138,6 +138,7 @@ class World(object):
set_player_attr('potshuffle', False) set_player_attr('potshuffle', False)
set_player_attr('pot_contents', None) set_player_attr('pot_contents', None)
set_player_attr('pseudoboots', False) set_player_attr('pseudoboots', False)
set_player_attr('collection_rate', False)
set_player_attr('shopsanity', False) set_player_attr('shopsanity', False)
set_player_attr('mixed_travel', 'prevent') set_player_attr('mixed_travel', 'prevent')

5
CLI.py
View File

@@ -107,7 +107,8 @@ def parse_cli(argv, no_defaults=False):
'shufflebosses', 'shuffleenemies', 'enemy_health', 'enemy_damage', 'shufflepots', 'shufflebosses', 'shuffleenemies', 'enemy_health', 'enemy_damage', 'shufflepots',
'ow_palettes', 'uw_palettes', 'sprite', 'disablemusic', 'quickswap', 'fastmenu', 'heartcolor', 'ow_palettes', 'uw_palettes', 'sprite', 'disablemusic', 'quickswap', 'fastmenu', 'heartcolor',
'heartbeep', 'remote_items', 'shopsanity', 'dropshuffle', 'pottery', 'keydropshuffle', 'heartbeep', 'remote_items', 'shopsanity', 'dropshuffle', 'pottery', 'keydropshuffle',
'mixed_travel', 'standardize_palettes', 'code', 'reduce_flashing', 'shuffle_sfx']: 'mixed_travel', 'standardize_palettes', 'code', 'reduce_flashing', 'shuffle_sfx',
'msu_resume', 'collection_rate']:
value = getattr(defaults, name) if getattr(playerargs, name) is None else getattr(playerargs, name) value = getattr(defaults, name) if getattr(playerargs, name) is None else getattr(playerargs, name)
if player == 1: if player == 1:
setattr(ret, name, {1: value}) setattr(ret, name, {1: value})
@@ -201,6 +202,8 @@ def parse_settings():
"uw_palettes": "default", "uw_palettes": "default",
"reduce_flashing": False, "reduce_flashing": False,
"shuffle_sfx": False, "shuffle_sfx": False,
'msu_resume': False,
'collection_rate': False,
# Spoiler defaults to TRUE # Spoiler defaults to TRUE
# Playthrough defaults to TRUE # Playthrough defaults to TRUE

View File

@@ -3185,7 +3185,8 @@ mandatory_connections = [('Links House S&Q', 'Links House'),
('Bombos Tablet Mirror Spot', 'Bombos Tablet Ledge'), ('Bombos Tablet Mirror Spot', 'Bombos Tablet Ledge'),
('Graveyard Ledge Mirror Spot', 'Graveyard Ledge'), ('Graveyard Ledge Mirror Spot', 'Graveyard Ledge'),
('Ganon Drop', 'Bottom of Pyramid'), ('Ganon Drop', 'Bottom of Pyramid'),
('Pyramid Drop', 'East Dark World') ('Pyramid Drop', 'East Dark World'),
('Maze Race Ledge Drop', 'Light World')
] ]
inverted_mandatory_connections = [('Links House S&Q', 'Inverted Links House'), inverted_mandatory_connections = [('Links House S&Q', 'Inverted Links House'),
@@ -3358,7 +3359,8 @@ inverted_mandatory_connections = [('Links House S&Q', 'Inverted Links House'),
('Bush Covered Lawn Mirror Spot', 'Dark Grassy Lawn'), ('Bush Covered Lawn Mirror Spot', 'Dark Grassy Lawn'),
('Bomb Hut Inner Bushes', 'Light World'), ('Bomb Hut Inner Bushes', 'Light World'),
('Bomb Hut Outer Bushes', 'Bomb Hut Area'), ('Bomb Hut Outer Bushes', 'Bomb Hut Area'),
('Bomb Hut Mirror Spot', 'West Dark World')] ('Bomb Hut Mirror Spot', 'West Dark World'),
('Maze Race Ledge Drop', 'Light World')]
# non-shuffled entrance links # non-shuffled entrance links
default_connections = [('Links House', 'Links House'), default_connections = [('Links House', 'Links House'),
('Links House Exit', 'Light World'), ('Links House Exit', 'Light World'),

View File

@@ -100,7 +100,7 @@ def create_inverted_regions(world, player):
create_lw_region(player, 'Lake Hylia Island', ['Lake Hylia Island']), create_lw_region(player, 'Lake Hylia Island', ['Lake Hylia Island']),
create_cave_region(player, 'Capacity Upgrade', 'the queen of fairies', ['Capacity Upgrade - Left', 'Capacity Upgrade - Right']), create_cave_region(player, 'Capacity Upgrade', 'the queen of fairies', ['Capacity Upgrade - Left', 'Capacity Upgrade - Right']),
create_cave_region(player, 'Two Brothers House', 'a connector', None, ['Two Brothers House Exit (East)', 'Two Brothers House Exit (West)']), create_cave_region(player, 'Two Brothers House', 'a connector', None, ['Two Brothers House Exit (East)', 'Two Brothers House Exit (West)']),
create_lw_region(player, 'Maze Race Ledge', ['Maze Race'], ['Two Brothers House (West)', 'Maze Race Mirror Spot']), create_lw_region(player, 'Maze Race Ledge', ['Maze Race', 'Maze Race Ledge Drop'], ['Two Brothers House (West)', 'Maze Race Mirror Spot']),
create_cave_region(player, '50 Rupee Cave', 'a cave with some cash'), create_cave_region(player, '50 Rupee Cave', 'a cave with some cash'),
create_lw_region(player, 'Desert Ledge', ['Desert Ledge'], ['Desert Palace Entrance (North) Rocks', 'Desert Palace Entrance (West)', 'Desert Ledge Drop']), create_lw_region(player, 'Desert Ledge', ['Desert Ledge'], ['Desert Palace Entrance (North) Rocks', 'Desert Palace Entrance (West)', 'Desert Ledge Drop']),
create_lw_region(player, 'Desert Palace Stairs', None, ['Desert Palace Entrance (South)', 'Desert Palace Stairs Mirror Spot']), create_lw_region(player, 'Desert Palace Stairs', None, ['Desert Palace Entrance (South)', 'Desert Palace Stairs Mirror Spot']),

View File

@@ -31,7 +31,7 @@ from Utils import output_path, parse_player_names
from source.item.FillUtil import create_item_pool_config, massage_item_pool, district_item_pool_config from source.item.FillUtil import create_item_pool_config, massage_item_pool, district_item_pool_config
from source.tools.BPS import create_bps_from_data from source.tools.BPS import create_bps_from_data
__version__ = '1.0.1.10v' __version__ = '1.0.1.11v'
from source.classes.BabelFish import BabelFish from source.classes.BabelFish import BabelFish
@@ -298,7 +298,7 @@ def main(args, seed=None, fish=None):
apply_rom_settings(rom, args.heartbeep[player], args.heartcolor[player], args.quickswap[player], apply_rom_settings(rom, args.heartbeep[player], args.heartcolor[player], args.quickswap[player],
args.fastmenu[player], args.disablemusic[player], args.sprite[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]) args.shuffle_sfx[player], args.msu_resume[player])
if args.jsonout: if args.jsonout:
jsonout[f'patch_t{team}_p{player}'] = rom.patches jsonout[f'patch_t{team}_p{player}'] = rom.patches

View File

@@ -169,6 +169,7 @@ def roll_settings(weights):
ret.door_shuffle = door_shuffle if door_shuffle != 'none' else 'vanilla' ret.door_shuffle = door_shuffle if door_shuffle != 'none' else 'vanilla'
ret.intensity = get_choice('intensity') ret.intensity = get_choice('intensity')
ret.experimental = get_choice('experimental') == 'on' ret.experimental = get_choice('experimental') == 'on'
ret.collection_rate = get_choice('collection_rate') == 'on'
ret.dungeon_counters = get_choice('dungeon_counters') if 'dungeon_counters' in weights else 'default' ret.dungeon_counters = get_choice('dungeon_counters') if 'dungeon_counters' in weights else 'default'
if ret.dungeon_counters == 'default': if ret.dungeon_counters == 'default':
@@ -266,6 +267,7 @@ def roll_settings(weights):
ret.disablemusic = get_choice('disablemusic', romweights) == 'on' ret.disablemusic = get_choice('disablemusic', romweights) == 'on'
ret.quickswap = get_choice('quickswap', romweights) == 'on' ret.quickswap = get_choice('quickswap', romweights) == 'on'
ret.reduce_flashing = get_choice('reduce_flashing', romweights) == 'on' ret.reduce_flashing = get_choice('reduce_flashing', romweights) == 'on'
ret.msu_resume = get_choice('msu_resume', romweights) == 'on'
ret.fastmenu = get_choice('menuspeed', romweights) ret.fastmenu = get_choice('menuspeed', romweights)
ret.heartcolor = get_choice('heartcolor', romweights) ret.heartcolor = get_choice('heartcolor', romweights)
ret.heartbeep = get_choice('heartbeep', romweights) ret.heartbeep = get_choice('heartbeep', romweights)

View File

@@ -269,7 +269,7 @@ Shuffles a large portion of the sounds effects. Can be used with the adjuster.
## Experimental Features ## Experimental Features
The treasure check counter is turned on. Also, you will start as a bunny if your spawn point is in the dark world. You will start as a bunny if your spawn point is in the dark world.
## Triforce Hunt Settings ## Triforce Hunt Settings
@@ -369,5 +369,17 @@ Reduces amount of flashing in some animations
Shuffles a bunch of the sounds effects Shuffles a bunch of the sounds effects
```
--msu_resume
```
Enable MSU resume feature
```
--collection_rate
```
Total collection rate is displayed unless Triforce Hunt is on. If the game was designed as a mystery, then the total count is not displayed.

View File

@@ -147,6 +147,11 @@ Same as above but both small keys and bigs keys of the dungeon are not allowed o
#### Volatile #### Volatile
* 1.0.1.11
* Separated Collection Rate counter from experimental
* Added MSU Resume option
* Ensured pots in TR Dark Ride need lamp
* Fix for Links House being at Maze Race (did not generate)
* 1.0.1.10 * 1.0.1.10
* More location count fixes * More location count fixes
* Add major_only algorithm to code * Add major_only algorithm to code

View File

@@ -94,7 +94,7 @@ def create_regions(world, player):
create_lw_region(player, 'Lake Hylia Island', ['Lake Hylia Island']), create_lw_region(player, 'Lake Hylia Island', ['Lake Hylia Island']),
create_cave_region(player, 'Capacity Upgrade', 'the queen of fairies', ['Capacity Upgrade - Left', 'Capacity Upgrade - Right']), create_cave_region(player, 'Capacity Upgrade', 'the queen of fairies', ['Capacity Upgrade - Left', 'Capacity Upgrade - Right']),
create_cave_region(player, 'Two Brothers House', 'a connector', None, ['Two Brothers House Exit (East)', 'Two Brothers House Exit (West)']), create_cave_region(player, 'Two Brothers House', 'a connector', None, ['Two Brothers House Exit (East)', 'Two Brothers House Exit (West)']),
create_lw_region(player, 'Maze Race Ledge', ['Maze Race'], ['Two Brothers House (West)'], 'a race against time'), create_lw_region(player, 'Maze Race Ledge', ['Maze Race'], ['Two Brothers House (West)', 'Maze Race Ledge Drop'], 'a race against time'),
create_cave_region(player, '50 Rupee Cave', 'a cave with some cash'), create_cave_region(player, '50 Rupee Cave', 'a cave with some cash'),
create_lw_region(player, 'Desert Ledge', ['Desert Ledge'], ['Desert Palace Entrance (North) Rocks', 'Desert Palace Entrance (West)'], 'the desert ledge'), create_lw_region(player, 'Desert Ledge', ['Desert Ledge'], ['Desert Palace Entrance (North) Rocks', 'Desert Palace Entrance (West)'], 'the desert ledge'),
create_lw_region(player, 'Desert Ledge (Northeast)', None, ['Checkerboard Cave']), create_lw_region(player, 'Desert Ledge (Northeast)', None, ['Checkerboard Cave']),

10
Rom.py
View File

@@ -719,7 +719,7 @@ def patch_rom(world, rom, player, team, enemized, is_mystery=False):
dr_flags = DROptions.Eternal_Mini_Bosses if world.doorShuffle[player] == 'vanilla' else DROptions.Town_Portal dr_flags = DROptions.Eternal_Mini_Bosses if world.doorShuffle[player] == 'vanilla' else DROptions.Town_Portal
if world.doorShuffle[player] == 'crossed': if world.doorShuffle[player] == 'crossed':
dr_flags |= DROptions.Map_Info dr_flags |= DROptions.Map_Info
if world.experimental[player] and world.goal[player] != 'triforcehunt': if world.collection_rate[player] and world.goal[player] != 'triforcehunt':
dr_flags |= DROptions.Debug dr_flags |= DROptions.Debug
if world.doorShuffle[player] == 'crossed' and world.logic[player] != 'nologic'\ if world.doorShuffle[player] == 'crossed' and world.logic[player] != 'nologic'\
and world.mixed_travel[player] == 'prevent': and world.mixed_travel[player] == 'prevent':
@@ -1782,14 +1782,16 @@ def hud_format_text(text):
def apply_rom_settings(rom, beep, color, quickswap, fastmenu, disable_music, sprite, def apply_rom_settings(rom, beep, color, quickswap, fastmenu, disable_music, sprite,
ow_palettes, uw_palettes, reduce_flashing, shuffle_sfx): ow_palettes, uw_palettes, reduce_flashing, shuffle_sfx, msu_resume):
if not os.path.exists("data/sprites/official/001.link.1.zspr") and rom.orig_buffer: 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], dump_zspr(rom.orig_buffer[0x80000:0x87000], rom.orig_buffer[0xdd308:0xdd380],
rom.orig_buffer[0xdedf5:0xdedf9], "data/sprites/official/001.link.1.zspr", "Nintendo", "Link") rom.orig_buffer[0xdedf5:0xdedf9], "data/sprites/official/001.link.1.zspr", "Nintendo", "Link")
# todo: implement a flag for msu resume delay if msu_resume:
rom.write_bytes(0x18021D, [0, 0]) # default to off for now rom.write_bytes(0x18021D, [0x8, 0x7])
else:
rom.write_bytes(0x18021D, [0, 0]) # default to off for now
if sprite and not isinstance(sprite, Sprite): if sprite and not isinstance(sprite, Sprite):
sprite = Sprite(sprite) if os.path.isfile(sprite) else get_sprite_from_name(sprite) sprite = Sprite(sprite) if os.path.isfile(sprite) else get_sprite_from_name(sprite)

View File

@@ -1105,7 +1105,8 @@ def add_conditional_lamps(world, player):
add_lamp_requirement(spot, player) add_lamp_requirement(spot, player)
dark_rooms = { dark_rooms = {
'TR Dark Ride': {'sewer': False, 'entrances': ['TR Dark Ride Up Stairs', 'TR Dark Ride SW'], 'locations': []}, 'TR Dark Ride': {'sewer': False, 'entrances': ['TR Dark Ride Up Stairs', 'TR Dark Ride SW', 'TR Dark Ride Path'], 'locations': []},
'TR Dark Ride Ledges': {'sewer': False, 'entrances': ['TR Dark Ride Ledges Path'], 'locations': []},
'Mire Dark Shooters': {'sewer': False, 'entrances': ['Mire Dark Shooters Up Stairs', 'Mire Dark Shooters SW', 'Mire Dark Shooters SE'], 'locations': []}, 'Mire Dark Shooters': {'sewer': False, 'entrances': ['Mire Dark Shooters Up Stairs', 'Mire Dark Shooters SW', 'Mire Dark Shooters SE'], 'locations': []},
'Mire Key Rupees': {'sewer': False, 'entrances': ['Mire Key Rupees NE'], 'locations': []}, 'Mire Key Rupees': {'sewer': False, 'entrances': ['Mire Key Rupees NE'], 'locations': []},
'Mire Block X': {'sewer': False, 'entrances': ['Mire Block X NW', 'Mire Block X WS'], 'locations': []}, 'Mire Block X': {'sewer': False, 'entrances': ['Mire Block X NW', 'Mire Block X WS'], 'locations': []},

View File

@@ -218,6 +218,14 @@
"action": "store_true", "action": "store_true",
"type": "bool" "type": "bool"
}, },
"msu_resume": {
"action": "store_true",
"type": "bool"
},
"collection_rate": {
"action": "store_true",
"type": "bool"
},
"mapshuffle": { "mapshuffle": {
"action": "store_true", "action": "store_true",
"type": "bool" "type": "bool"

View File

@@ -322,6 +322,8 @@
], ],
"reduce_flashing": [ "Reduce some in-game flashing (default: %(default)s)" ], "reduce_flashing": [ "Reduce some in-game flashing (default: %(default)s)" ],
"shuffle_sfx": [ "Shuffle sounds effects (default: %(default)s)" ], "shuffle_sfx": [ "Shuffle sounds effects (default: %(default)s)" ],
"msu_resume": [ "Enable MSU Resume (default: %(default)s)" ],
"collection_rate": [ "Display collection rate (default: %(default)s)" ],
"create_rom": [ "Create an output rom file. (default: %(default)s)" ], "create_rom": [ "Create an output rom file. (default: %(default)s)" ],
"gui": [ "Launch the GUI. (default: %(default)s)" ], "gui": [ "Launch the GUI. (default: %(default)s)" ],
"jsonout": [ "jsonout": [

View File

@@ -1,6 +1,7 @@
{ {
"checkboxes": { "checkboxes": {
"nobgm": { "type": "checkbox" }, "nobgm": { "type": "checkbox" },
"msu_resume": { "type": "checkbox" },
"quickswap": { "type": "checkbox" }, "quickswap": { "type": "checkbox" },
"reduce_flashing": {"type": "checkbox"}, "reduce_flashing": {"type": "checkbox"},
"shuffle_sfx": {"type": "checkbox"} "shuffle_sfx": {"type": "checkbox"}

View File

@@ -4,6 +4,7 @@
"adjust.quickswap": "L/R Quickswapping", "adjust.quickswap": "L/R Quickswapping",
"adjust.reduce_flashing": "Reduce Flashing", "adjust.reduce_flashing": "Reduce Flashing",
"adjust.shuffle_sfx": "Shuffle Sound Effects", "adjust.shuffle_sfx": "Shuffle Sound Effects",
"adjust.msu_resume": "MSU Resume",
"adjust.heartcolor": "Heart Color", "adjust.heartcolor": "Heart Color",
"adjust.heartcolor.red": "Red", "adjust.heartcolor.red": "Red",
@@ -148,6 +149,8 @@
"randomizer.gameoptions.quickswap": "L/R Quickswapping", "randomizer.gameoptions.quickswap": "L/R Quickswapping",
"randomizer.gameoptions.reduce_flashing": "Reduce Flashing", "randomizer.gameoptions.reduce_flashing": "Reduce Flashing",
"randomizer.gameoptions.shuffle_sfx": "Shuffle Sound Effects", "randomizer.gameoptions.shuffle_sfx": "Shuffle Sound Effects",
"randomizer.gameoptions.msu_resume": "MSU Resume",
"randomizer.gameoptions.collection_rate": "Display Collection Rate",
"randomizer.gameoptions.heartcolor": "Heart Color", "randomizer.gameoptions.heartcolor": "Heart Color",
"randomizer.gameoptions.heartcolor.red": "Red", "randomizer.gameoptions.heartcolor.red": "Red",

View File

@@ -1,6 +1,8 @@
{ {
"checkboxes": { "checkboxes": {
"nobgm": { "type": "checkbox" }, "nobgm": { "type": "checkbox" },
"msu_resume": { "type": "checkbox" },
"collection_rate": {"type": "checkbox"},
"quickswap": { "type": "checkbox" }, "quickswap": { "type": "checkbox" },
"reduce_flashing": {"type": "checkbox"}, "reduce_flashing": {"type": "checkbox"},
"shuffle_sfx": {"type": "checkbox"} "shuffle_sfx": {"type": "checkbox"}

View File

@@ -114,6 +114,8 @@ SETTINGSTOPROCESS = {
"uwpalettes": "uw_palettes", "uwpalettes": "uw_palettes",
"reduce_flashing": "reduce_flashing", "reduce_flashing": "reduce_flashing",
"shuffle_sfx": "shuffle_sfx", "shuffle_sfx": "shuffle_sfx",
'msu_resume': 'msu_resume',
'collection_rate': 'collection_rate',
}, },
"generation": { "generation": {
"bps": "bps", "bps": "bps",

View File

@@ -105,6 +105,7 @@ def adjust_page(top, parent, settings):
"quickswap": "quickswap", "quickswap": "quickswap",
"nobgm": "disablemusic", "nobgm": "disablemusic",
"reduce_flashing": "reduce_flashing", "reduce_flashing": "reduce_flashing",
'msu_resume': 'msu_resume',
"shuffle_sfx": "shuffle_sfx", "shuffle_sfx": "shuffle_sfx",
} }
guiargs = Namespace() guiargs = Namespace()

View File

@@ -52,7 +52,7 @@ def loadcliargs(gui, args, settings=None):
gui.pages[mainpage].pages[subpage].widgets[widget].label.configure(text=label) gui.pages[mainpage].pages[subpage].widgets[widget].label.configure(text=label)
gui.pages[mainpage].pages[subpage].widgets[widget].storageVar.set(args[arg]) gui.pages[mainpage].pages[subpage].widgets[widget].storageVar.set(args[arg])
# If we're on the Game Options page and it's not about Hints # If we're on the Game Options page and it's not about Hints
if subpage == "gameoptions" and not widget == "hints": if subpage == "gameoptions" and widget not in ["hints", "collection_rate"]:
# Check if we've got settings # Check if we've got settings
# Check if we've got the widget in Adjust settings # Check if we've got the widget in Adjust settings
hasSettings = settings is not None hasSettings = settings is not None