Files
dockipelago/worlds/cv_dos/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

345 lines
11 KiB
Python

from dataclasses import dataclass
from Options import (Toggle, PerGameCommonOptions, StartInventoryPool,
OptionGroup, DefaultOnToggle, Choice, TextChoice, OptionSet, DeathLink, NamedRange)
from .Items import soul_filler_table
class Goal(Choice):
"""The goal for your game.
Throne Room: Get to the Throne Room and defeat Menace there.
Abyss: Open the path to the Mine of Judgment, then defeat Menace in the Abyss."""
display_name = "Goal"
option_throne_room = 0
option_abyss = 1
default = 0
class ReplaceMenaceWithSoma(Toggle):
"""Replaces Menace with Soma-Dracula"""
display_name = "Soma Replaces Menace"
class RemoveMoneyGates(DefaultOnToggle):
"""Removes the gates that require you to own a specific amount of money."""
display_name = "Remove Money Gates"
class DisableBossSeals(Toggle):
"""Removes the requirement to draw Magic Seals to defeat bosses."""
display_name = "No Drawing Seals"
class EarlySeal1(Toggle):
"""Places Magic Seal 1 early in your own game to prevent getting stuck early."""
display_name = "Early Seal 1"
class RevealMap(DefaultOnToggle):
"""Start with the entire map visible."""
display_name = "Reveal Map"
class StartingWeapon(TextChoice):
"""The weapon you start the game with.
Random Base: Start with a random base-level weapon
Random Any: Start with any random weapon
You can also choose to start with any specific weapon."""
option_random_base = 0
option_random_any = 1
default = "Knife"
display_name = "Starting Weapon"
class FixLuck(DefaultOnToggle):
"""Fixes how the Luck stat is applied.
With the fix applied, each point of luck gives +0.1% to any drop.
Without the fix, each point of luck is +0.04% for souls, 0.25% for items."""
display_name = "Fix Luck"
class RevealBreakableWalls(Toggle):
"""Automatically destroys/reveals all breakable walls"""
display_name = "Reveal Hidden Walls"
class BoostSpeed(Toggle):
"""Increases Soma's base walking speed by 33%"""
display_name = "Boost Speed"
class OneScreenMode(Toggle):
"""Allows the entire game to be played with only the bottom screen. Press Select to view the map."""
display_name = "One-Screen Mode"
class SoulRandomizer(Choice):
"""Randomizes Enemy souls.
Disabled: Enemy souls are unchanged.
Shuffled: Enemy souls will be shuffled amongst each other. Souls that unlock things are unchanged.
Soulsanity: Enemy soul drops can be anything, even important items or non-souls. You can change the expected soul rarity with Soulsanity level."""
option_disabled = 0
option_shuffled = 1
option_soulsanity = 2
default = 0
display_name = "Soul Randomizer"
class SoulsanityLevel(Choice):
"""The maximum tier of soul rarity that have Locations on them.
Rare souls always expect you to have the Soul Eater Ring."""
option_simple = 0
option_medium = 1
option_rare = 2
default = 0
display_name = "Soulsanity Level"
class GuaranteedSouls(OptionSet):
"""The specified Souls will be guaranteed to have at least one copy in the item pool. Unspecified souls can still be randomly selected from the soul pool.
You can also use Common, Uncommon, or Rare to add all souls of that rarity."""
display_name = "Guranteed Souls"
default = {"Procel Soul", "Mud Demon Soul", "Black Panther Soul"}
valid_keys = {soul.casefold() for soul in set(soul_filler_table) | {"common", "uncommon", "rare"}}
valid_keys_casefold = True
class RandomizeStartingWarp(Toggle):
"""Randomizes which Warp Room is unlocked by default."""
display_name = "Random Starting Warp Room"
class OpenDrawbridge(Toggle):
"""If enabled, the drawbridge in Lost Village will start open instead of closed."""
display_name = "Open Drawbridge"
class ShopRandomizer(Toggle):
"""Randomizes Hammer's shop items."""
display_name = "Shop Randomizer"
class ShuffleDrops(Toggle):
"""Randomizes items dropped by enemies"""
display_name = "Drop Shuffle"
class ExperiencePercent(NamedRange):
"""What percentage of EXP enemies give you. This is a percent of their original EXP amount."""
display_name = "Experience Percentage"
range_start = 50
range_end = 500
default = 100
special_range_names = {
"half": 50,
"normal": 100,
"double": 200,
"quadruple": 400
}
class SoulDropPercent(NamedRange):
"""Percentage applied to an enemy's base chance of dropping their soul."""
display_name = "Soul Drop Percentage"
range_start = 50
range_end = 500
default = 100
special_range_names = {
"half": 50,
"normal": 100,
"double": 200,
"triple": 300
}
class AreaMusicShuffle(Toggle):
"""Randomizes area music."""
display_name = "Area Music Randomizer"
class BossMusicShuffle(Toggle):
"""Randomizes boss music."""
display_name = "Boss Music Randomizer"
class SoulWallRandomizer(Toggle):
"""Randomizes which souls are needed to break the red Soul Barriers."""
display_name = "Soul Wall Randomizer"
class RandomizeSynthSouls(Toggle):
"""Randomizes which souls are required for Synthesis crafting."""
display_name = "Shuffle Synthesis Souls"
class FreeBat(Toggle):
"""Removes Bat Company's MP cost"""
display_name = "Free Bat"
class PassiveSoulEaterRing(Toggle):
"""If enabled, you will gain the bonus from the Soul Eater Ring without needing to equip it
as long as you have at least one in your inventory."""
display_name = "Passive Soul Eater Ring"
class GateItems(Choice):
"""Defines how the 4 metal switch gates act.
Normal: Normal behavior. Gates can only be opened by pressing the respective button.
Add Keys: The same as normal behavior, but also adds keys to the item pool that can open the gate from the other side.
Buttonsanity: Adds keys to each gate, and the corresponding button will grant a check."""
option_normal = 0
option_add_keys = 1
option_buttonsanity = 2
default = 0
display_name = "Gate Items"
class HardMode(Toggle):
"""Puts the game in Hard Mode. Enemies are tougher, sometimes have additional properties, but drop rates are increased.
There are no checks exclusive to Hard Mode."""
display_name = "Hard Mode"
class BossShuffle(Toggle):
"""Randomizes boss fights."""
display_name = "Boss Shuffle"
class SealShuffle(Toggle):
"""Randomizes which seal is required for each boss/door.
Early Seal 1 will guarantee Flying Armor to always use Seal 1."""
display_name = "Seal Shuffle"
class RandomizeSealPatterns(Toggle):
"""Randomizes the drawn pattern for Magic Seals, as well as their rotation."""
display_name = "Randomize Seal Patterns"
class MenaceCondition(Choice):
"""This Condition is required to be met before you can fight Menace.
None: None
Throne Room: Defeat Aguni in the Throne Room (If Goal is set to throne room, this will be set to None.)
Garden: Avoid the bad ending in the Garden of Madness
Bosses: Defeat all available bosses"""
display_name = "Menace Condition"
option_none = 0
option_throne_room = 1
option_garden = 2
option_bosses = 3
default = 0
class MineCondition(Choice):
"""This Condition is required to be met before you can enter the Mine of Judgment.
None: None
Throne Room: Defeat Aguni in the Throne Room (If Goal is set to throne room, the mine and the Abyss will be inaccessible.)
Garden: Avoid the bad ending in the Garden of Madness
Bosses: Defeat all available bosses"""
display_name = "Mine Condition"
option_none = 0
option_throne_room = 1
option_garden = 2
option_bosses = 3
default = 2
class GardenCondition(Choice):
"""This Condition is required to be met before Celia appears in the Garden of Madness.
None: None
Throne Room: Defeat Aguni in the Throne Room (This condition is considered unreachable if Goal is set to throne room)
Bosses: Defeat all available bosses"""
display_name = "Garden Condition"
option_none = 0
option_throne_room = 1
option_bosses = 2
default = 0
display_name = "Garden Condition"
#class RevealBreakableWalls(Choice):
# """Controls how breakable walls act.
# Normal: Breakable walls are breakable, you are assumed to already know where they are.
# Revealed: All breakable walls are already broken
# Eye Spy: Breakable walls are breakable, you require Peeping Eye's soul to break them at all."""
#display_name = "Breakable Walls"
#option_normal = 0
#option_revealed = 1
#option_eye_spy = 2
#default = 0
@dataclass
class DoSOptions(PerGameCommonOptions):
goal: Goal
replace_menace_with_soma: ReplaceMenaceWithSoma
remove_money_gates: RemoveMoneyGates
disable_boss_seals: DisableBossSeals
early_seal_1: EarlySeal1
reveal_map: RevealMap
starting_weapon: StartingWeapon
reveal_hidden_walls: RevealBreakableWalls
fix_luck: FixLuck
boost_speed: BoostSpeed
one_screen_mode: OneScreenMode
soul_randomizer: SoulRandomizer
soulsanity_level: SoulsanityLevel
guaranteed_souls: GuaranteedSouls
shuffle_starting_warp_room: RandomizeStartingWarp
open_drawbridge: OpenDrawbridge
shop_randomizer: ShopRandomizer
death_link: DeathLink
start_inventory_from_pool: StartInventoryPool
shuffle_enemy_drops: ShuffleDrops
experience_percentage: ExperiencePercent
soul_drop_percentage: SoulDropPercent
area_music_randomizer: AreaMusicShuffle
boss_music_randomizer: BossMusicShuffle
randomize_red_soul_walls: SoulWallRandomizer
randomize_synthesis_souls: RandomizeSynthSouls
no_mp_bat: FreeBat
passive_soul_eater_ring: PassiveSoulEaterRing
gate_items: GateItems
hard_mode: HardMode
boss_shuffle: BossShuffle
seal_shuffle: SealShuffle
randomize_seal_patterns: RandomizeSealPatterns
menace_condition: MenaceCondition
mine_condition: MineCondition
garden_condition: GardenCondition
dos_option_groups = [
OptionGroup("Goal Options", [
Goal,
MenaceCondition,
MineCondition,
GardenCondition,
ReplaceMenaceWithSoma
]),
OptionGroup("Soul Settings", [
SoulRandomizer,
SoulsanityLevel,
GuaranteedSouls,
SoulDropPercent
]),
OptionGroup("Item Options", [
StartingWeapon,
ShopRandomizer,
GateItems
]),
OptionGroup("Seal Settings", [
DisableBossSeals,
EarlySeal1,
SealShuffle,
RandomizeSealPatterns
]),
OptionGroup("Weapon Synth Settings", [
RandomizeSynthSouls,
]),
OptionGroup("World Settings", [
RandomizeStartingWarp,
OpenDrawbridge,
SoulWallRandomizer
]),
OptionGroup("Enemy Settings", [
ShuffleDrops,
ExperiencePercent,
HardMode,
BossShuffle
]),
OptionGroup("Quality of Life", [
RemoveMoneyGates,
RevealMap,
RevealBreakableWalls,
FixLuck,
BoostSpeed,
OneScreenMode,
FreeBat,
PassiveSoulEaterRing
]),
OptionGroup("Music Randomizer", [
AreaMusicShuffle,
BossMusicShuffle
]),
]