Files
dockipelago/worlds/spyro3/Options.py
Jonathan Tinney 7971961166
Some checks failed
Analyze modified files / flake8 (push) Failing after 2m28s
Build / build-win (push) Has been cancelled
Build / build-ubuntu2204 (push) Has been cancelled
ctest / Test C++ ubuntu-latest (push) Has been cancelled
ctest / Test C++ windows-latest (push) Has been cancelled
Analyze modified files / mypy (push) Has been cancelled
Build and Publish Docker Images / Push Docker image to Docker Hub (push) Successful in 5m4s
Native Code Static Analysis / scan-build (push) Failing after 5m2s
type check / pyright (push) Successful in 1m7s
unittests / Test Python 3.11.2 ubuntu-latest (push) Failing after 16m23s
unittests / Test Python 3.12 ubuntu-latest (push) Failing after 28m19s
unittests / Test Python 3.13 ubuntu-latest (push) Failing after 14m49s
unittests / Test hosting with 3.13 on ubuntu-latest (push) Successful in 5m0s
unittests / Test Python 3.13 macos-latest (push) Has been cancelled
unittests / Test Python 3.11 windows-latest (push) Has been cancelled
unittests / Test Python 3.13 windows-latest (push) Has been cancelled
add schedule I, sonic 1/frontiers/heroes, spirit island
2026-04-02 23:46:36 -07:00

765 lines
29 KiB
Python

import typing
from dataclasses import dataclass
from Options import Toggle, DefaultOnToggle, Option, Range, Choice, ItemDict, DeathLink, PerGameCommonOptions, OptionGroup
class GoalOptions():
SORCERESS_ONE = 0
EGG_FOR_SALE = 1
SORCERESS_TWO = 2
ALL_SKILLPOINTS = 3
EPILOGUE = 4
SPIKE = 5
SCORCH = 6
EGG_HUNT = 7
class LifeBottleOptions():
OFF = 0
NORMAL = 1
HARD = 2
class MoneybagsOptions():
VANILLA = 0
COMPANIONSANITY = 1
# Reserve 2 for shuffling moneybags prices on companions
MONEYBAGSSANITY = 3
class PowerupLockOptions():
VANILLA = 0
TYPE = 1
INDIVIDUAL = 2
class SparxUpgradeOptions():
OFF = 0
BLUE = 1
GREEN = 2
SPARXLESS = 3
TRUE_SPARXLESS = 4
class SparxForGemsOptions():
OFF = 0
GREEN_SPARX = 1
SPARX_FINDER = 2
class GemsanityOptions():
OFF = 0
PARTIAL = 1
FULL_BUNDLES = 2
FULL = 3
FULL_GLOBAL = 4
class LevelLockOptions():
VANILLA = 0
KEYS = 1
KEYS_AND_EGGS = 2
RANDOM_REQS = 3
ADD_REQS = 4
ADD_GEM_REQS = 5
class GoalOption(Choice):
"""Lets the user choose the completion goal.
Sorceress 1 - Beat the sorceress *and* obtain the specified number of eggs.
Egg For Sale - Chase Moneybags after defeating the sorceress the first time.
Sorceress 2 - Beat the sorceress in Super Bonus Round *and*
obtain the specified number of eggs.
All Skillpoints - Collect all 20 skill points in the game.
Excluded locations are still required for this goal.
Epilogue - Unlock the full epilogue by collecting all 20 skill points
and defeating the sorceress. Excluded locations are still required for this goal.
Spike - Beat Spike *and* obtain the specified number of eggs.
Scorch - Beat Scorch *and* obtain the specified number of eggs.
Egg Hunt - Find the specified number of eggs to win. Portal requirements are reduced."""
display_name = "Completion Goal"
default = GoalOptions.SORCERESS_ONE
option_sorceress_1 = GoalOptions.SORCERESS_ONE
option_egg_for_sale = GoalOptions.EGG_FOR_SALE
option_sorceress_2 = GoalOptions.SORCERESS_TWO
option_all_skillpoints = GoalOptions.ALL_SKILLPOINTS
option_epilogue = GoalOptions.EPILOGUE
option_spike = GoalOptions.SPIKE
option_scorch = GoalOptions.SCORCH
option_egg_hunt = GoalOptions.EGG_HUNT
class EggCount(Range):
"""The number of eggs needed to win when goal is Sorceress 1,
Sorceress 2, Spike, Scorch, and Egg Hunt."""
display_name = "Eggs to Win"
range_start = 10
range_end = 150
default = 100
class PercentExtraEggs(Range):
"""The percentage of extra eggs in the pool for Egg Hunt.
For example, if 50 eggs are needed and there are 20% extra eggs,
60 eggs will be in the pool. The total number of available eggs
caps at 150 regardless of this option. Rounds up."""
display_name = "Percent Extra Egg Hunt Eggs"
range_start = 0
range_end = 50
default = 25
class GuaranteedItemsOption(ItemDict):
"""Guarantees that the specified items will be in the item pool"""
display_name = "Guaranteed Items"
class OpenWorldOption(Toggle):
"""Grants access to all 4 homeworlds from the start.
End of level and boss eggs are removed as checks.
This removes 18 locations from the location pool,
so you may need to enable additional locations to use this option.
If Moneybags is Vanilla, companion unlocks will be free.
Disables world keys."""
display_name = "Open World Mode"
class LevelLockOption(Choice):
"""Determines the rules for entering levels.
Sparx levels, companion levels, homeworlds, Super Bonus Round, and bosses
are not affected by these settings.
At least one Sunrise level will always start unlocked.
Some settings give a free egg to ensure correct behavior.
Some settings prevent non-companion levels from out of bounds.
Vanilla: Levels have their vanilla unlock requirements.
Keys: 20 Level Unlock items are added to the item pool.
Randomize Requirements: Randomizes egg requirements for levels
that normally require eggs to enter.
Add Requirements: Any level can have an egg requirement added.
Add Gem Requirements: Any level can have an egg OR gem requirement added.
Only works when both Moneybagssanity and Gemsanity are on.
"""
display_name = "Level Lock Options"
default = LevelLockOptions.VANILLA
option_vanilla = LevelLockOptions.VANILLA
option_keys = LevelLockOptions.KEYS
option_randomize_requirements = LevelLockOptions.RANDOM_REQS
option_add_requirements = LevelLockOptions.ADD_REQS
option_add_gem_requirements = LevelLockOptions.ADD_GEM_REQS
class StartingLevels(Range):
"""When Level Lock Options is not Vanilla or Randomize Requirements,
determines how many non-companion levels start unlocked.
The recommended value when Keys are in use is 2 or 3.
One Sunrise level will always be unlocked."""
display_name = "Number of Starting Levels"
range_start = 1
range_end = 20
default = 2
class SorceressDoorRequirement(Range):
"""Determines how many eggs are required to open Sorceress' Lair
in Midnight Mountain.
NOTE: This only works if Duckstation is set to interpreter mode."""
display_name = "Eggs to Open Sorceress Door"
range_start = 1
range_end = 100
default = 100
class SBRDoorEggRequirement(Range):
"""Determines how many eggs are required to open Super Bonus Round.
NOTE: This only works if Duckstation is set to interpreter mode."""
display_name = "Eggs to Open Super Bonus Round"
range_start = 1
range_end = 149
default = 149
class SBRDoorGemRequirement(Range):
"""Determines how many gems are required to open Super Bonus Round.
Gem requirements within Super Bonus Round are based on this number.
NOTE: This only works if Duckstation is set to interpreter mode.
In game displays may have visual glitches."""
display_name = "Gems to Open Super Bonus Round"
range_start = 1
range_end = 15000
default = 15000
class Enable25PctGemChecksOption(Toggle):
"""Adds checks for getting 25% of the gems in a level"""
display_name = "Enable 25% Gem Checks"
class Enable50PctGemChecksOption(Toggle):
"""Adds checks for getting 50% of the gems in a level"""
display_name = "Enable 50% Gem Checks"
class Enable75PctGemChecksOption(Toggle):
"""Adds checks for getting 75% of the gems in a level"""
display_name = "Enable 75% Gem Checks"
class EnableGemChecksOption(Toggle):
"""Adds checks for getting all gems in a level"""
display_name = "Enable 100% Gem Checks"
class EnableTotalGemChecksOption(Toggle):
"""Adds checks for every 500 gems you collect total.
Gems currently paid to Moneybags do not count towards your total.
Logic assumes you pay Moneybags everywhere."""
display_name = "Enable Total Gem Count Checks"
class MaxTotalGemCheckOption(Range):
"""The highest number of total gems that can be required for Total Gem Count checks.
Has no effect if Enable Total Gem Count Checks is disabled."""
display_name = "Max for Total Gem Count Checks"
range_start = 500
range_end = 20000
default = 6000
class EnableGemsanityOption(Choice):
"""Adds checks for individual gems.
If Moneybagssanity is off, Moneybags unlocks become free.
WARNING: Full gemsanity requires the host to edit allow_full_gemsanity
in their yaml file.
Off: Individual gems are not checks.
Partial: 200 random gems become checks. Adds items giving 50 or 100 gems
for specific levels to the item pool.
Full Bundles: Every gem is a check. Adds items giving 50 or 100 gems
for specific levels to the item pool. Adds many filler items."""
display_name = "Enable Gemsanity"
default = GemsanityOptions.OFF
option_off = GemsanityOptions.OFF
option_partial = GemsanityOptions.PARTIAL
option_full_bundles = GemsanityOptions.FULL_BUNDLES
class EnableSkillpointChecksOption(Toggle):
"""Adds checks for getting skill points"""
display_name = "Enable Skillpoint Checks"
class EnableLifeBottleChecksOption(Choice):
"""Adds checks for breaking life bottles.
Off: Life bottles are not checks.
Normal: The 26 intended life bottles become checks.
Hard: Adds the out-of-bounds life bottle in Fireworks Factory to the pool.
This does not include the 3 bottles on the impossible island in Midnight Mountain."""
display_name = "Enable Life Bottle Checks"
default = LifeBottleOptions.OFF
option_off = LifeBottleOptions.OFF
option_normal = LifeBottleOptions.NORMAL
option_hard = LifeBottleOptions.HARD
class SparxPowerSettings(Toggle):
"""Shuffles the Sparx abilities from completing Sparx levels into the item pool.
Sparx's ability to break baskets becomes 2 progressive items.
Having both allows atlas warp and breaking vases."""
display_name = "Sparx Power-sanity Settings"
class EnableDeathLink(DeathLink):
"""Spyro will die when a DeathLink is received.
Sends DeathLinks on his death.
Some edge cases may not be handled."""
display_name = "DeathLink"
class MoneybagsSettings(Choice):
"""Determines settings for Moneybags unlocks.
Moneybags dialog has small visual errors.
Defeating the Sorceress bypasses all requirements.
Vanilla - Pay Moneybags to progress as usual
Companionsanity - Unlock items replace payment for side characters.
Moneybagssanity - Unlock items replace payment for Moneybags."""
display_name = "Moneybags Settings"
default = MoneybagsOptions.VANILLA
option_vanilla = MoneybagsOptions.VANILLA
option_companionsanity = MoneybagsOptions.COMPANIONSANITY
option_moneybagssanity = MoneybagsOptions.MONEYBAGSSANITY
class PowerupLockSettings(Choice):
"""Powerup gates (such as superflame) require items to use.
Does not affect the invincibility filler item.
NOTE: The Sunrise Spring early level entry tricks assume
you do not need the superfly powerup to complete them!
Vanilla - Powerups are available at all times.
Type - Superfly, Fireball, and Invincibility Powerup items are added to the pool.
Fireworks Factory and Super Bonus Round's combo powerups
require both Superfly and Fireball to unlock.
Individual: Each level's powerups are unlocked by a specific item.
"""
display_name = "Powerup Lock Settings"
default = PowerupLockOptions.VANILLA
option_vanilla = PowerupLockOptions.VANILLA
option_type = PowerupLockOptions.TYPE
option_individual = PowerupLockOptions.INDIVIDUAL
class EnableWorldKeys(Toggle):
"""Prevents moving to the next homeworld without enough World Key items.
You must still complete the vanilla requirements to go to the next homeworld.
Disabled in Open World mode."""
display_name = "Enable World Keys"
class EnableFillerExtraLives(DefaultOnToggle):
"""Enables filler items that grant extra lives"""
display_name = "Enable Extra Lives Filler"
class EnableFillerInvincibility(Toggle):
"""Enables filler items that grant temporary invincibility"""
display_name = "Enable Temporary Invincibility Filler"
class EnableFillerColorChange(Toggle):
"""Enables filler items that change Spyro's color"""
display_name = "Enable Changing Spyro's Color Filler"
class EnableFillerBigHeadMode(Toggle):
"""Enables filler items that turn on Big Head Mode and Flat Spyro Mode"""
display_name = "Enable Big Head and Flat Spyro Filler"
class EnableFillerHealSparx(Toggle):
"""Enables filler items that heal Sparx. Can exceed max health."""
display_name = "Enable (over)healing Sparx Filler"
class TrapFillerPercent(Range):
"""The percent chance that a filler items is a trap."""
display_name = "Trap Percentage of Filler"
range_start = 0
range_end = 100
default = 0
class EnableTrapDamageSparx(Toggle):
"""Enables traps that damage Sparx. Cannot directly kill Spyro."""
display_name = "Enable Hurting Sparx Trap"
class EnableTrapSparxless(Toggle):
"""Enables traps that removes Sparx."""
display_name = "Enable Sparxless Trap"
class EnableProgressiveSparxHealth(Choice):
"""Start the game with less max health.
Add items to the pool to increase your max health.
Heal Sparx items have no effect until all items are found.
Off - The game behaves normally.
Blue - Your max health starts at blue Sparx.
Green - Your max health starts at green Sparx.
Sparxless - Your max health starts at no Sparx.
True Sparxless - Your max health is permanently Sparxless."""
display_name = "Enable Progressive Sparx Health Upgrades"
default = SparxUpgradeOptions.OFF
option_off = SparxUpgradeOptions.OFF
option_blue = SparxUpgradeOptions.BLUE
option_green = SparxUpgradeOptions.GREEN
option_sparxless = SparxUpgradeOptions.SPARXLESS
option_true_sparxless = SparxUpgradeOptions.TRUE_SPARXLESS
class ProgressiveSparxHealthLogic(Toggle):
"""Certain Sparx health amounts are expected before
you are required to enter different levels.
Super Bonus Round, Crawdad Farm, and levels in Midday and later
logically require green Sparx.
Fireworks Factory, Charmed Ridge, and levels in Midnight and later
logically require blue Sparx.
Dino Mines and the Sorceress logically require
gold Sparx.
The Extra Health item/bonus from Starfish Reef is not considered for this logic.
Note: This does nothing unless Enable Progressive Sparx
Health Upgrades is set to blue, green, or Sparxless,"""
display_name = "Enable Progressive Sparx Health Logic"
class RequireSparxForMaxGems(Choice):
"""Determines the logic for gemsanity and 100% gem checks.
75% gem checks (100% in levels with no enemies) are always on.
Off: Sparx max health and abilities do not affect gem logic.
Green Sparx: Sparx is required.
Sparx Finder: Sparx Gem Finder is required.
NOTE: This option is ignored in True Sparxless mode,
or in Sparxless mode if Progressive Sparx Health Logic is off."""
display_name = "Require Sparx for Max Gems"
default = SparxForGemsOptions.OFF
option_off = SparxForGemsOptions.OFF
option_green_sparx = SparxForGemsOptions.GREEN_SPARX
option_sparx_finder = SparxForGemsOptions.SPARX_FINDER
class ZoeGivesHints(Range):
"""Some or all of the 13 Tutorial Zoes give hints.
Which Zoes give hints are random.
Hints include:
- Difficult or slow locations
- Progression items in your world
- Joke hints"""
display_name = "Number of Zoe Hints"
range_start = 0
range_end = 13
default = 0
class EasySkateboardingLizards(Toggle):
"""The Sunny Villa lizard skateboarding challenges require only 1 lizard.
Results in minor graphical glitches."""
display_name = "Easy Skateboarding Lizards"
class EasySkateboardingPoints(Toggle):
"""Point-based skateboarding challenges in Sunny Villa
and Enchanted Towers become much easier.
Includes skill points."""
display_name = "Easy Skateboarding Points"
class EasySkateboardingLostFleet(Toggle):
"""Your turbo cannot run out in the Lost Fleet skateboarding challenges."""
display_name = "Easy Skateboarding Lost Fleet"
class EasySkateboardingSuperBonusRound(Toggle):
"""Your turbo cannot run out in the Super Bonus Round skateboarding challenge."""
display_name = "Easy Skateboarding Super Bonus Round"
class EasySubs(Toggle):
"""The Lost Fleet submarine challenges require ony 1 sub.
The HUD will incorrectly display 1/1."""
display_name = "Easy Subs"
class EasyBoxing(Toggle):
"""The enemy yeti in Frozen Altars boxing has only 1 health."""
display_name = "Easy Boxing"
class EasySheilaBombing(Toggle):
"""Rocks and mushrooms never respawn in Spooky Swamp's Sheila sub-area."""
display_name = "Easy Spooky Sheila Missions"
class EasyBluto(Toggle):
"""Bluto in Seashell Shores has only 1 health."""
display_name = "Easy Bluto"
class EasySleepyhead(Toggle):
"""Sleepyhead in Spooky Swamp has only 1 health."""
display_name = "Easy Sleepyhead"
class EasyWhackAMole(Toggle):
"""The Bentley Whack-A-Mole challenge in Crystal Islands require only 1 mole."""
display_name = "Easy Whack-a-Mole"
class EasySharkRiders(Toggle):
"""The Shark Riders challenge in Desert Ruins requires only 1 shark,
which starts to the left of the building."""
display_name = "Easy Shark Riders"
class EasyTanks(Toggle):
"""The Tanks challenges in Haunted Tomb will require only 1 tank each.
Results in minor graphical glitches."""
display_name = "Easy Tanks"
class EasyTunnels(Toggle):
"""Water tunnels in Seashell Shore and Dino Mines move slightly more slowly."""
display_name = "Easy Tunnels"
class NoGreenRockets(Toggle):
"""Collecting a green rocket in Scorch will automatically convert to 50 red rockets instead."""
display_name = "Convert Scorch Green Rockets to Red"
class LogicSunnySheilaEarly(Toggle):
"""Potentially require entering Sunny Villa's Sheila sub-area from out of bounds.
NOTE: Entering this area from behind may crash the game if done incorrectly.
This option only matters is Companionsanity or Moneybagssanity is turned on."""
display_name = "Enter Sunny Villa Sheila Area Early"
class LogicCloudBackwards(Toggle):
"""Potentially require completing Cloud Spires backwards
without paying Moneybags or beating the Sorceress.
This option only matters if Moneybagssanity is turned on."""
display_name = "Cloud Spires Backwards"
class LogicMoltenEarly(Toggle):
"""Potentially require entering Molten Crater from out of bounds."""
display_name = "Enter Molten Crater Early"
class LogicMoltenByrdEarly(Toggle):
"""Potentially require entering Molten Crater's Sgt. Byrd sub-area from out of bounds"""
display_name = "Enter Molten Crater Sgt. Byrd Area Early"
class LogicMoltenThievesNoMoneybags(Toggle):
"""Potentially require entering Molten Crater's Thieves sub-area from out of bounds
without paying Moneybags or beating the Sorceress.
This option only matters if Moneybagssanity is turned on."""
display_name = "Enter Molten Crater Thieves without Moneybags"
class LogicSeashellEarly(Toggle):
"""Potentially require entering Seashell Shores from out of bounds."""
display_name = "Enter Seashell Shores Early"
class LogicSeashellSheilaEarly(Toggle):
"""Potentially require entering Seashell Shores' Sheila sub-area from out of bounds."""
display_name = "Enter Seashell Shores Sheila Area Early"
class LogicMushroomEarly(Toggle):
"""Potentially require entering Mushroom Speedway from out of bounds."""
display_name = "Enter Mushroom Speedway Early"
class LogicSheilaEarly(Toggle):
"""Potentially require entering Sheila's Alp from out of bounds
without paying Moneybags or beating the Sorceress.
This option only matters if Companionsanity or Moneybagssanity is turned on."""
display_name = "Enter Sheila's Alp Early"
class LogicSpookyEarly(Toggle):
"""Potentially require entering Spooky Swamp from out of bounds."""
display_name = "Enter Spooky Swamp Early"
class LogicSpookyNoMoneybags(Toggle):
"""Potentially require getting to the end of Spooky Swamp
without paying Moneybags or beating the Sorceress.
This option only matters if Moneybagssanity is turned on."""
display_name = "Skip Moneybags in Spooky Swamp"
class LogicBambooEarly(Toggle):
"""Potentially require entering Bamboo Terrace from out of bounds."""
display_name = "Enter Bamboo Terrace Early"
class LogicBambooBentleyEarly(Toggle):
"""Potentially require entering the Bamboo Terrace Bentley sub-area from out of bounds."""
display_name = "Enter Bamboo Terrace Bentley Area Early"
class LogicCountryEarly(Toggle):
"""Potentially require entering Country Speedway from out of bounds."""
display_name = "Enter Country Speedway Early"
class LogicByrdEarly(Toggle):
"""Potentially require entering Sgt. Byrd's Base from out of bounds
without paying Moneybags or beating the Sorceress.
This option only matters if Companionsanity or Moneybagssanity is turned on."""
display_name = "Enter Sgt. Byrd's Base Early"
class LogicFrozenBentleyEarly(Toggle):
"""Potentially require entering the Frozen Altars Bentley sub-area from out of bounds.
This option only matters if Companionsanity or Moneybagssaniity is turned on."""
display_name = "Enter Frozen Altars Bentley Area Early"
class LogicFrozenCatHockeyNoMoneybags(Toggle):
"""Potentially require entering the Frozen Altars cat hockey minigame
without paying Moneybags or beating the Sorceress.
This option only matters if Moneybagssanity is turned on."""
display_name = "Enter Frozen Altars Cat Hockey Area without Moneybags"
class LogicFireworksEarly(Toggle):
"""Potentially require entering Fireworks Factory from out of bounds."""
display_name = "Enter Fireworks Factory Early"
class LogicFireworksAgent9Early(Toggle):
"""Potentially require entering Fireworks Factory's Agent 9 sub-area
out of bounds."""
display_name = "Enter Fireworks Factory Agent 9 Area Early"
class LogicCharmedEarly(Toggle):
"""Potentially require entering Charmed Ridge from out of bounds."""
display_name = "Enter Charmed Ridge Early"
class LogicCharmedNoMoneybags(Toggle):
"""Potentially require getting past the stairs in Charmed Ridge
without paying Moneybags or beating the Sorceress.
This option only matters if Moneybagssanity is turned on."""
display_name = "Pass Charmed Ridge Stairs without Moneybags"
class LogicHoneyEarly(Toggle):
"""Potentially require entering Honey Speedway from out of bounds."""
display_name = "Enter Honey Speedway Early"
class LogicBentleyEarly(Toggle):
"""Potentially require entering Bentley's Outpost
from out of bounds.
This option only matters if Companionsanity or Moneybagssanity is turned on."""
display_name = "Enter Bentley's Outpost Early"
class LogicCrystalNoMoneybags(Toggle):
"""Potentially require fully completing Crystal Islands
without paying Moneybags or beating the Sorceress.
This option only matters if Moneybagssanity is turned on."""
display_name = "Complete Crystal Islands without Moneybags"
class LogicDesertNoMoneybags(Toggle):
"""Potentially require fully completing Desert Ruins
without paying Moneybags or beating the Sorceress.
This option only matters if Moneybagssanity is turned on."""
display_name = "Complete Desert Ruins without Moneybags"
class LogicDinoAgent9Early(Toggle):
"""Potentially require entering the Agent 9 sub-area
of Dino Mines out of bounds."""
display_name = "Enter Dino Mines Agent 9 Area Early"
class LogicSorceressEarly(Toggle):
"""Potentially require entering Sorceress' Lair out of bounds.
Does not change the door or goal requirements."""
display_name = "Enter Sorceress' Lair Early"
@dataclass
class Spyro3Option(PerGameCommonOptions):
goal: GoalOption
egg_count: EggCount
percent_extra_eggs: PercentExtraEggs
guaranteed_items: GuaranteedItemsOption
open_world: OpenWorldOption
level_lock_option: LevelLockOption
starting_levels_count: StartingLevels
sorceress_door_requirement: SorceressDoorRequirement
sbr_door_egg_requirement: SBRDoorEggRequirement
sbr_door_gem_requirement: SBRDoorGemRequirement
enable_25_pct_gem_checks: Enable25PctGemChecksOption
enable_50_pct_gem_checks: Enable50PctGemChecksOption
enable_75_pct_gem_checks: Enable75PctGemChecksOption
enable_gem_checks: EnableGemChecksOption
enable_total_gem_checks: EnableTotalGemChecksOption
max_total_gem_checks: MaxTotalGemCheckOption
enable_gemsanity: EnableGemsanityOption
enable_skillpoint_checks: EnableSkillpointChecksOption
enable_life_bottle_checks: EnableLifeBottleChecksOption
sparx_power_settings: SparxPowerSettings
death_link: EnableDeathLink
moneybags_settings: MoneybagsSettings
powerup_lock_settings: PowerupLockSettings
enable_world_keys: EnableWorldKeys
enable_filler_extra_lives: EnableFillerExtraLives
enable_filler_invincibility: EnableFillerInvincibility
enable_filler_color_change: EnableFillerColorChange
enable_filler_big_head_mode: EnableFillerBigHeadMode
enable_filler_heal_sparx: EnableFillerHealSparx
trap_filler_percent: TrapFillerPercent
enable_trap_damage_sparx: EnableTrapDamageSparx
enable_trap_sparxless: EnableTrapSparxless
enable_progressive_sparx_health: EnableProgressiveSparxHealth
enable_progressive_sparx_logic: ProgressiveSparxHealthLogic
require_sparx_for_max_gems: RequireSparxForMaxGems
zoe_gives_hints: ZoeGivesHints
easy_skateboarding_lizards: EasySkateboardingLizards
easy_skateboarding_points: EasySkateboardingPoints
easy_skateboarding_lost_fleet: EasySkateboardingLostFleet
easy_skateboarding_super_bonus_round: EasySkateboardingSuperBonusRound
easy_boxing: EasyBoxing
easy_sheila_bombing: EasySheilaBombing
easy_tanks: EasyTanks
easy_subs: EasySubs
easy_bluto: EasyBluto
easy_sleepyhead: EasySleepyhead
easy_shark_riders: EasySharkRiders
easy_whackamole: EasyWhackAMole
easy_tunnels: EasyTunnels
no_green_rockets: NoGreenRockets
logic_sunny_sheila_early: LogicSunnySheilaEarly
logic_cloud_backwards: LogicCloudBackwards
logic_molten_early: LogicMoltenEarly
logic_molten_byrd_early: LogicMoltenByrdEarly
logic_molten_thieves_no_moneybags: LogicMoltenThievesNoMoneybags
logic_seashell_early: LogicSeashellEarly
logic_seashell_sheila_early: LogicSeashellSheilaEarly
logic_mushroom_early: LogicMushroomEarly
logic_sheila_early: LogicSheilaEarly
logic_spooky_early: LogicSpookyEarly
logic_spooky_no_moneybags: LogicSpookyNoMoneybags
logic_bamboo_early: LogicBambooEarly
logic_bamboo_bentley_early: LogicBambooBentleyEarly
logic_country_early: LogicCountryEarly
logic_byrd_early: LogicByrdEarly
logic_frozen_bentley_early: LogicFrozenBentleyEarly
logic_frozen_cat_hockey_no_moneybags: LogicFrozenCatHockeyNoMoneybags
logic_fireworks_early: LogicFireworksEarly
logic_fireworks_agent_9_early: LogicFireworksAgent9Early
logic_charmed_early: LogicCharmedEarly
logic_charmed_no_moneybags: LogicCharmedNoMoneybags
logic_honey_early: LogicHoneyEarly
logic_bentley_early: LogicBentleyEarly
logic_crystal_no_moneybags: LogicCrystalNoMoneybags
logic_desert_no_moneybags: LogicDesertNoMoneybags
logic_dino_agent_9_early: LogicDinoAgent9Early
logic_sorceress_early: LogicSorceressEarly
# Group logic/trick options together, especially for the local WebHost.
spyro_options_groups = [
OptionGroup(
"Enabled Locations",
[
Enable25PctGemChecksOption,
Enable50PctGemChecksOption,
Enable75PctGemChecksOption,
EnableGemChecksOption,
EnableTotalGemChecksOption,
MaxTotalGemCheckOption,
EnableGemsanityOption,
EnableSkillpointChecksOption,
EnableLifeBottleChecksOption
],
False
),
OptionGroup(
"Game Progression",
[
OpenWorldOption,
LevelLockOption,
StartingLevels,
SorceressDoorRequirement,
SBRDoorEggRequirement,
SBRDoorGemRequirement,
MoneybagsSettings,
PowerupLockSettings,
EnableWorldKeys
],
False
),
OptionGroup(
"Item Pool",
[
EnableFillerExtraLives,
EnableFillerInvincibility,
EnableFillerColorChange,
EnableFillerBigHeadMode,
EnableFillerHealSparx,
TrapFillerPercent,
EnableTrapDamageSparx,
EnableTrapSparxless
],
True
),
OptionGroup(
"Sparx Settings",
[
SparxPowerSettings,
EnableProgressiveSparxHealth,
ProgressiveSparxHealthLogic,
RequireSparxForMaxGems
],
True
),
OptionGroup(
"Game Difficulty",
[
ZoeGivesHints,
EasySkateboardingLizards,
EasySkateboardingPoints,
EasySkateboardingLostFleet,
EasySkateboardingSuperBonusRound,
EasyBoxing,
EasySheilaBombing,
EasyTanks,
EasySubs,
EasyBluto,
EasySleepyhead,
EasySharkRiders,
EasyWhackAMole,
EasyTunnels,
NoGreenRockets
],
True
),
OptionGroup(
"Tricks",
[
LogicSunnySheilaEarly,
LogicCloudBackwards,
LogicMoltenEarly,
LogicMoltenByrdEarly,
LogicMoltenThievesNoMoneybags,
LogicSeashellEarly,
LogicSeashellSheilaEarly,
LogicMushroomEarly,
LogicSheilaEarly,
LogicSpookyEarly,
LogicSpookyNoMoneybags,
LogicBambooEarly,
LogicBambooBentleyEarly,
LogicCountryEarly,
LogicByrdEarly,
LogicFrozenBentleyEarly,
LogicFrozenCatHockeyNoMoneybags,
LogicFireworksEarly,
LogicFireworksAgent9Early,
LogicCharmedEarly,
LogicCharmedNoMoneybags,
LogicHoneyEarly,
LogicBentleyEarly,
LogicCrystalNoMoneybags,
LogicDesertNoMoneybags,
LogicDinoAgent9Early,
LogicSorceressEarly
],
True
),
]