mirror of
https://github.com/MarioSpore/Grinch-AP.git
synced 2025-10-21 12:11:33 -06:00
967 lines
28 KiB
Python
967 lines
28 KiB
Python
from dataclasses import dataclass
|
|
from typing import Any
|
|
|
|
from Options import (
|
|
Choice,
|
|
DeathLink,
|
|
DefaultOnToggle,
|
|
OptionGroup,
|
|
OptionSet,
|
|
PerGameCommonOptions,
|
|
Range,
|
|
StartInventoryPool,
|
|
Toggle,
|
|
)
|
|
|
|
from .Locations import DUNGEON_NAMES
|
|
|
|
|
|
class Dungeons(DefaultOnToggle):
|
|
"""
|
|
This controls whether dungeon locations are randomized.
|
|
|
|
This means the items found in dungeons will be randomized, not that the entrances to dungeons will be randomized.
|
|
"""
|
|
|
|
display_name = "Dungeons"
|
|
|
|
|
|
class TingleChests(Toggle):
|
|
"""
|
|
Tingle Chests are hidden in dungeons and must be bombed to make them appear. (2 in DRC, 1 each in FW, TotG, ET, and
|
|
WT). This controls whether they are randomized.
|
|
"""
|
|
|
|
display_name = "Tingle Chests"
|
|
|
|
|
|
class DungeonSecrets(Toggle):
|
|
"""
|
|
DRC, FW, TotG, ET, and WT each contain 2-3 secret items (11 in total). This controls whether these are randomized.
|
|
|
|
The items are relatively well-hidden (they aren't in chests), so don't select this option unless you're prepared to
|
|
search each dungeon high and low!
|
|
"""
|
|
|
|
display_name = "Dungeon Secrets"
|
|
|
|
|
|
class PuzzleSecretCaves(DefaultOnToggle):
|
|
"""
|
|
This controls whether the rewards from puzzle-focused secret caves are randomized locations.
|
|
"""
|
|
|
|
display_name = "Puzzle Secret Caves"
|
|
|
|
|
|
class CombatSecretCaves(Toggle):
|
|
"""
|
|
This controls whether the rewards from combat-focused secret caves (besides Savage Labyrinth) are randomized
|
|
locations.
|
|
"""
|
|
|
|
display_name = "Combat Secret Caves"
|
|
|
|
|
|
class SavageLabyrinth(Toggle):
|
|
"""
|
|
This controls whether the two locations in Savage Labyrinth are randomized.
|
|
"""
|
|
|
|
display_name = "Savage Labyrinth"
|
|
|
|
|
|
class GreatFairies(DefaultOnToggle):
|
|
"""
|
|
This controls whether the items given by Great Fairies are randomized.
|
|
"""
|
|
|
|
display_name = "Great Fairies"
|
|
|
|
|
|
class ShortSidequests(Toggle):
|
|
"""
|
|
This controls whether sidequests that can be completed quickly are randomized.
|
|
"""
|
|
|
|
display_name = "Short Sidequests"
|
|
|
|
|
|
class LongSidequests(Toggle):
|
|
"""
|
|
This controls whether long sidequests (e.g., Lenzo's assistant, withered trees, goron trading) are randomized.
|
|
"""
|
|
|
|
display_name = "Long Sidequests"
|
|
|
|
|
|
class SpoilsTrading(Toggle):
|
|
"""
|
|
This controls whether the items you get by trading in spoils to NPCs are randomized.
|
|
"""
|
|
|
|
display_name = "Spoils Trading"
|
|
|
|
|
|
class Minigames(Toggle):
|
|
"""
|
|
This controls whether most minigames are randomized (auctions, mail sorting, barrel shooting, bird-man contest).
|
|
"""
|
|
|
|
display_name = "Minigames"
|
|
|
|
|
|
class Battlesquid(Toggle):
|
|
"""
|
|
This controls whether the Windfall battleship minigame is randomized.
|
|
"""
|
|
|
|
display_name = "Battlesquid Minigame"
|
|
|
|
|
|
class FreeGifts(DefaultOnToggle):
|
|
"""
|
|
This controls whether gifts freely given by NPCs are randomized (Tott, Salvage Corp, imprisoned Tingle).
|
|
"""
|
|
|
|
display_name = "Free Gifts"
|
|
|
|
|
|
class Mail(Toggle):
|
|
"""
|
|
This controls whether items received from the mail are randomized.
|
|
"""
|
|
|
|
display_name = "Mail"
|
|
|
|
|
|
class PlatformsRafts(Toggle):
|
|
"""
|
|
This controls whether lookout platforms and rafts are randomized.
|
|
"""
|
|
|
|
display_name = "Lookout Platforms and Rafts"
|
|
|
|
|
|
class Submarines(Toggle):
|
|
"""
|
|
This controls whether submarines are randomized.
|
|
"""
|
|
|
|
display_name = "Submarines"
|
|
|
|
|
|
class EyeReefChests(Toggle):
|
|
"""
|
|
This controls whether the chests that appear after clearing out the eye reefs are randomized.
|
|
"""
|
|
|
|
display_name = "Eye Reef Chests"
|
|
|
|
|
|
class BigOctosGunboats(Toggle):
|
|
"""
|
|
This controls whether the items dropped by Big Octos and Gunboats are randomized.
|
|
"""
|
|
|
|
display_name = "Big Octos and Gunboats"
|
|
|
|
|
|
class TriforceCharts(Toggle):
|
|
"""
|
|
This controls whether the sunken treasure chests marked on Triforce Charts are randomized.
|
|
"""
|
|
|
|
display_name = "Sunken Treasure (From Triforce Charts)"
|
|
|
|
|
|
class TreasureCharts(Toggle):
|
|
"""
|
|
This controls whether the sunken treasure chests marked on Treasure Charts are randomized.
|
|
"""
|
|
|
|
display_name = "Sunken Treasure (From Treasure Charts)"
|
|
|
|
|
|
class ExpensivePurchases(DefaultOnToggle):
|
|
"""
|
|
This controls whether items that cost many Rupees are randomized (Rock Spire shop, auctions, Tingle's letter,
|
|
trading quest).
|
|
"""
|
|
|
|
display_name = "Expensive Purchases"
|
|
|
|
|
|
class IslandPuzzles(Toggle):
|
|
"""
|
|
This controls whether various island puzzles are randomized (e.g., chests hidden in unusual places).
|
|
"""
|
|
|
|
display_name = "Island Puzzles"
|
|
|
|
|
|
class Misc(Toggle):
|
|
"""
|
|
Miscellaneous locations that don't fit into any of the above categories (outdoors chests, wind shrine, Cyclos, etc).
|
|
This controls whether these are randomized.
|
|
"""
|
|
|
|
display_name = "Miscellaneous"
|
|
|
|
|
|
class DungeonItem(Choice):
|
|
"""
|
|
This is the base class for the shuffle options for dungeon items.
|
|
"""
|
|
|
|
value: int
|
|
option_startwith = 0
|
|
option_vanilla = 1
|
|
option_dungeon = 2
|
|
option_any_dungeon = 3
|
|
option_local = 4
|
|
option_keylunacy = 5
|
|
default = 2
|
|
|
|
@property
|
|
def in_dungeon(self) -> bool:
|
|
"""
|
|
Return whether the item should be shuffled into a dungeon.
|
|
|
|
:return: Whether the item is shuffled into a dungeon.
|
|
"""
|
|
return self.value in (2, 3)
|
|
|
|
|
|
class RandomizeMapCompass(DungeonItem):
|
|
"""
|
|
Controls how dungeon maps and compasses are randomized.
|
|
|
|
- **Start With Maps & Compasses:** You will start the game with the dungeon maps and compasses for all dungeons.
|
|
- **Vanilla Maps & Compasses:** Dungeon maps and compasses will be kept in their vanilla location (non-randomized).
|
|
- **Own Dungeon Maps & Compasses:** Dungeon maps and compasses will be randomized locally within their own dungeon.
|
|
- **Any Dungeon Maps & Compasses:** Dungeon maps and compasses will be randomized locally within any dungeon.
|
|
- **Local Maps & Compasses:** Dungeon maps and compasses will be randomized locally anywhere.
|
|
- **Key-Lunacy:** Dungeon maps and compasses can be found anywhere, without restriction.
|
|
"""
|
|
|
|
item_name_group = "Dungeon Items"
|
|
display_name = "Randomize Maps & Compasses"
|
|
default = 2
|
|
|
|
|
|
class RandomizeSmallKeys(DungeonItem):
|
|
"""
|
|
Controls how small keys are randomized.
|
|
|
|
- **Start With Small Keys:** You will start the game with the small keys for all dungeons.
|
|
- **Vanilla Small Keys:** Small keys will be kept in their vanilla location (non-randomized).
|
|
- **Own Dungeon Small Keys:** Small keys will be randomized locally within their own dungeon.
|
|
- **Any Dungeon Small Keys:** Small keys will be randomized locally within any dungeon.
|
|
- **Local Small Keys:** Small keys will be randomized locally anywhere.
|
|
- **Key-Lunacy:** Small keys can be found in any progression location, if dungeons are randomized.
|
|
"""
|
|
|
|
item_name_group = "Small Keys"
|
|
display_name = "Randomize Small Keys"
|
|
default = 2
|
|
|
|
|
|
class RandomizeBigKeys(DungeonItem):
|
|
"""
|
|
Controls how big keys are randomized.
|
|
|
|
- **Start With Big Keys:** You will start the game with the big keys for all dungeons.
|
|
- **Vanilla Big Keys:** Big keys will be kept in their vanilla location (non-randomized).
|
|
- **Own Dungeon Big Keys:** Big keys will be randomized locally within their own dungeon.
|
|
- **Any Dungeon Big Keys:** Big keys will be randomized locally within any dungeon.
|
|
- **Local Big Keys:** Big keys will be randomized locally anywhere.
|
|
- **Key-Lunacy:** Big keys can be found in any progression location, if dungeons are randomized.
|
|
"""
|
|
|
|
item_name_group = "Big Keys"
|
|
display_name = "Randomize Big Keys"
|
|
default = 2
|
|
|
|
|
|
class SwordMode(Choice):
|
|
"""
|
|
Controls whether you start with the Hero's Sword, the Hero's Sword is randomized, or if there are no swords in the
|
|
entire game.
|
|
|
|
- **Start with Hero's Sword:** You will start the game with the basic Hero's Sword already in your inventory.
|
|
- **No Starting Sword:** You will start the game with no sword, and have to find it somewhere in the world like
|
|
other randomized items.
|
|
- **Swords Optional:** You will start the game with no sword, but they'll still be randomized. However, they are not
|
|
necessary to beat the game. The Hyrule Barrier will be gone, Phantom Ganon in FF is vulnerable to Skull Hammer,
|
|
and the logic does not expect you to have a sword.
|
|
- **Swordless:** You will start the game with no sword, and won't be able to find it anywhere. You have to beat the
|
|
entire game using other items as weapons instead of the sword. (Note that Phantom Ganon in FF becomes vulnerable
|
|
to Skull Hammer in this mode.)
|
|
"""
|
|
|
|
display_name = "Sword Mode"
|
|
option_start_with_sword = 0
|
|
option_no_starting_sword = 1
|
|
option_swords_optional = 2
|
|
option_swordless = 3
|
|
default = 0
|
|
|
|
|
|
class RequiredBosses(Toggle):
|
|
"""
|
|
In this mode, you will not be allowed to beat the game until certain randomly-chosen bosses are defeated. Nothing in
|
|
dungeons for other bosses will ever be required.
|
|
|
|
You can see which islands have the required bosses on them by opening the sea chart and checking which islands have
|
|
blue quest markers.
|
|
"""
|
|
|
|
display_name = "Required Bosses Mode"
|
|
|
|
|
|
class NumRequiredBosses(Range):
|
|
"""
|
|
Select the number of randomly-chosen bosses that are required in Required Bosses Mode.
|
|
|
|
The door to Puppet Ganon will not unlock until you've defeated all of these bosses. Nothing in dungeons for other
|
|
bosses will ever be required.
|
|
"""
|
|
|
|
display_name = "Number of Required Bosses"
|
|
range_start = 1
|
|
range_end = 6
|
|
default = 4
|
|
|
|
|
|
class IncludedDungeons(OptionSet):
|
|
"""
|
|
A list of dungeons that should always be included when required bosses mode is on.
|
|
"""
|
|
|
|
display_name = "Included Dungeons"
|
|
valid_keys = frozenset(DUNGEON_NAMES)
|
|
|
|
|
|
class ExcludedDungeons(OptionSet):
|
|
"""
|
|
A list of dungeons that should always be excluded when required bosses mode is on.
|
|
"""
|
|
|
|
display_name = "Excluded Dungeons"
|
|
valid_keys = frozenset(DUNGEON_NAMES)
|
|
|
|
|
|
class ChestTypeMatchesContents(Toggle):
|
|
"""
|
|
Changes the chest type to reflect its contents. A metal chest has a progress item, a wooden chest has a non-progress
|
|
item or a consumable, and a green chest has a potentially required dungeon key.
|
|
"""
|
|
|
|
display_name = "Chest Type Matches Contents"
|
|
|
|
|
|
class TrapChests(Toggle):
|
|
"""
|
|
**DEV NOTE:** This option is currently unimplemented and will be ignored.
|
|
|
|
Allows the randomizer to place several trapped chests across the game that do not give you items. Perfect for
|
|
spicing up any run!
|
|
"""
|
|
|
|
display_name = "Enable Trap Chests"
|
|
|
|
|
|
class HeroMode(Toggle):
|
|
"""
|
|
In Hero Mode, you take four times more damage than normal and heart refills will not drop.
|
|
"""
|
|
|
|
display_name = "Hero Mode"
|
|
|
|
|
|
class LogicObscurity(Choice):
|
|
"""
|
|
Obscure tricks are ways of obtaining items that are not obvious and may involve thinking outside the box.
|
|
|
|
This option controls the maximum difficulty of obscure tricks the randomizer will require you to do to beat the
|
|
game.
|
|
"""
|
|
|
|
display_name = "Obscure Tricks Required"
|
|
option_none = 0
|
|
option_normal = 1
|
|
option_hard = 2
|
|
option_very_hard = 3
|
|
default = 0
|
|
|
|
|
|
class LogicPrecision(Choice):
|
|
"""
|
|
Precise tricks are ways of obtaining items that involve difficult inputs such as accurate aiming or perfect timing.
|
|
|
|
This option controls the maximum difficulty of precise tricks the randomizer will require you to do to beat the
|
|
game.
|
|
"""
|
|
|
|
display_name = "Precise Tricks Required"
|
|
option_none = 0
|
|
option_normal = 1
|
|
option_hard = 2
|
|
option_very_hard = 3
|
|
default = 0
|
|
|
|
|
|
class EnableTunerLogic(Toggle):
|
|
"""
|
|
If enabled, the randomizer can logically expect the Tingle Tuner for Tingle Chests.
|
|
|
|
The randomizer behavior of logically expecting Bombs/bomb flowers to spawn in Tingle Chests remains unchanged.
|
|
"""
|
|
|
|
display_name = "Enable Tuner Logic"
|
|
|
|
|
|
class RandomizeDungeonEntrances(Toggle):
|
|
"""
|
|
Shuffles around which dungeon entrances take you into which dungeons.
|
|
|
|
(No effect on Forsaken Fortress or Ganon's Tower.)
|
|
"""
|
|
|
|
display_name = "Randomize Dungeons"
|
|
|
|
|
|
class RandomizeSecretCavesEntrances(Toggle):
|
|
"""
|
|
Shuffles around which secret cave entrances take you into which secret caves.
|
|
"""
|
|
|
|
display_name = "Randomize Secret Caves"
|
|
|
|
|
|
class RandomizeMinibossEntrances(Toggle):
|
|
"""
|
|
Allows dungeon miniboss doors to act as entrances to be randomized.
|
|
|
|
If on with random dungeon entrances, dungeons may nest within each other, forming chains of connected dungeons.
|
|
"""
|
|
|
|
display_name = "Randomize Nested Minibosses"
|
|
|
|
|
|
class RandomizeBossEntrances(Toggle):
|
|
"""
|
|
Allows dungeon boss doors to act as entrances to be randomized.
|
|
|
|
If on with random dungeon entrances, dungeons may nest within each other, forming chains of connected dungeons.
|
|
"""
|
|
|
|
display_name = "Randomize Nested Bosses"
|
|
|
|
|
|
class RandomizeSecretCaveInnerEntrances(Toggle):
|
|
"""
|
|
Allows the pit in Ice Ring Isle's secret cave and the rear exit out of Cliff Plateau Isles' secret cave to act as
|
|
entrances to be randomized."""
|
|
|
|
display_name = "Randomize Inner Secret Caves"
|
|
|
|
|
|
class RandomizeFairyFountainEntrances(Toggle):
|
|
"""
|
|
Allows the pits that lead down into Fairy Fountains to act as entrances to be randomized.
|
|
"""
|
|
|
|
display_name = "Randomize Fairy Fountains"
|
|
|
|
|
|
class MixEntrances(Choice):
|
|
"""
|
|
Controls how the different types (pools) of randomized entrances should be shuffled.
|
|
|
|
- **Separate Pools:** Each pool of randomized entrances will shuffle into itself (e.g., dungeons into dungeons).
|
|
- **Mix Pools:** All pools of randomized entrances will be combined into one pool to be shuffled.
|
|
"""
|
|
|
|
display_name = "Mix Entrances"
|
|
option_separate_pools = 0
|
|
option_mix_pools = 1
|
|
default = 0
|
|
|
|
|
|
class RandomizeEnemies(Toggle):
|
|
"""
|
|
Randomizes the placement of non-boss enemies.
|
|
|
|
This option is an *incomplete* option from the base randomizer and **may result in unbeatable seeds! Use at your own
|
|
risk!**
|
|
"""
|
|
|
|
display_name = "Randomize Enemies"
|
|
|
|
|
|
# class RandomizeMusic(Toggle):
|
|
# """
|
|
# Shuffles around all the music in the game. This affects background music, combat music, fanfares, etc.
|
|
# """
|
|
|
|
# display_name = "Randomize Music"
|
|
|
|
|
|
class RandomizeStartingIsland(Toggle):
|
|
"""
|
|
Randomizes which island you start the game on.
|
|
"""
|
|
|
|
display_name = "Randomize Starting Island"
|
|
|
|
|
|
class RandomizeCharts(Toggle):
|
|
"""
|
|
Randomizes which sector is drawn on each Triforce/Treasure Chart.
|
|
"""
|
|
|
|
display_name = "Randomize Charts"
|
|
|
|
|
|
class HoHoHints(DefaultOnToggle):
|
|
"""
|
|
**DEV NOTE:** This option is currently unimplemented and will be ignored.
|
|
|
|
Places hints on Old Man Ho Ho. Old Man Ho Ho appears at 10 different islands in the game. Talk to Old Man Ho Ho to
|
|
get hints.
|
|
"""
|
|
|
|
display_name = "Place Hints on Old Man Ho Ho"
|
|
|
|
|
|
class FishmenHints(DefaultOnToggle):
|
|
"""
|
|
**DEV NOTE:** This option is currently unimplemented and will be ignored.
|
|
|
|
Places hints on the fishmen. There is one fishman at each of the 49 islands of the Great Sea. Each fishman must be
|
|
fed an All-Purpose Bait before he will give a hint.
|
|
"""
|
|
|
|
display_name = "Place Hints on Fishmen"
|
|
|
|
|
|
class KoRLHints(Toggle):
|
|
"""
|
|
**DEV NOTE:** This option is currently unimplemented and will be ignored.
|
|
|
|
Places hints on the King of Red Lions. Talk to the King of Red Lions to get hints.
|
|
"""
|
|
|
|
display_name = "Place Hints on King of Red Lions"
|
|
|
|
|
|
class NumItemHints(Range):
|
|
"""
|
|
**DEV NOTE:** This option is currently unimplemented and will be ignored.
|
|
|
|
The number of item hints that will be placed. Item hints tell you which area contains a particular progress item in
|
|
this seed.
|
|
|
|
If multiple hint placement options are selected, the hint count will be split evenly among the placement options.
|
|
"""
|
|
|
|
display_name = "Item Hints"
|
|
range_start = 0
|
|
range_end = 15
|
|
default = 15
|
|
|
|
|
|
class NumLocationHints(Range):
|
|
"""
|
|
**DEV NOTE:** This option is currently unimplemented and will be ignored.
|
|
|
|
The number of location hints that will be placed. Location hints tell you what item is at a specific location in
|
|
this seed.
|
|
|
|
If multiple hint placement options are selected, the hint count will be split evenly among the placement options.
|
|
"""
|
|
|
|
display_name = "Location Hints"
|
|
range_start = 0
|
|
range_end = 15
|
|
default = 5
|
|
|
|
|
|
class NumBarrenHints(Range):
|
|
"""
|
|
**DEV NOTE:** This option is currently unimplemented and will be ignored.
|
|
|
|
The number of barren hints that will be placed. Barren hints tell you that an area does not contain any required
|
|
items in this seed.
|
|
|
|
If multiple hint placement options are selected, the hint count will be split evenly among the placement options.
|
|
"""
|
|
|
|
display_name = "Barren Hints"
|
|
range_start = 0
|
|
range_end = 15
|
|
default = 0
|
|
|
|
|
|
class NumPathHints(Range):
|
|
"""
|
|
**DEV NOTE:** This option is currently unimplemented and will be ignored.
|
|
|
|
The number of path hints that will be placed. Path hints tell you that an area contains an item that is required to
|
|
reach a particular goal in this seed.
|
|
|
|
If multiple hint placement options are selected, the hint count will be split evenly among the placement options.
|
|
"""
|
|
|
|
display_name = "Path Hints"
|
|
range_start = 0
|
|
range_end = 15
|
|
default = 0
|
|
|
|
|
|
class PrioritizeRemoteHints(Toggle):
|
|
"""
|
|
**DEV NOTE:** This option is currently unimplemented and will be ignored.
|
|
|
|
When this option is selected, certain locations that are out of the way and time-consuming to complete will take
|
|
precedence over normal location hints."""
|
|
|
|
display_name = "Prioritize Remote Location Hints"
|
|
|
|
|
|
class SwiftSail(DefaultOnToggle):
|
|
"""
|
|
Sailing speed is doubled and the direction of the wind is always at your back as long as the sail is out.
|
|
"""
|
|
|
|
display_name = "Swift Sail"
|
|
|
|
|
|
class InstantTextBoxes(DefaultOnToggle):
|
|
"""
|
|
Text appears instantly. Also, the B button is changed to instantly skip through text as long as you hold it down.
|
|
"""
|
|
|
|
display_name = "Instant Text Boxes"
|
|
|
|
|
|
class RevealFullSeaChart(DefaultOnToggle):
|
|
"""
|
|
Start the game with the sea chart fully drawn out.
|
|
"""
|
|
|
|
display_name = "Reveal Full Sea Chart"
|
|
|
|
|
|
class AddShortcutWarpsBetweenDungeons(Toggle):
|
|
"""
|
|
Adds new warp pots that act as shortcuts connecting dungeons to each other directly. (DRC, FW, TotG, and separately
|
|
FF, ET, WT.)
|
|
|
|
Each pot must be unlocked before it can be used, so you cannot use them to access dungeons
|
|
you wouldn't already have access to.
|
|
"""
|
|
|
|
display_name = "Add Shortcut Warps Between Dungeons"
|
|
|
|
|
|
class SkipRematchBosses(DefaultOnToggle):
|
|
"""
|
|
Removes the door in Ganon's Tower that only unlocks when you defeat the rematch versions of Gohma, Kalle Demos,
|
|
Jalhalla, and Molgera.
|
|
"""
|
|
|
|
display_name = "Skip Boss Rematches"
|
|
|
|
|
|
class RemoveMusic(Toggle):
|
|
"""
|
|
Mutes all ingame music.
|
|
"""
|
|
|
|
display_name = "Remove Music"
|
|
|
|
|
|
@dataclass
|
|
class TWWOptions(PerGameCommonOptions):
|
|
"""
|
|
A data class that encapsulates all configuration options for The Wind Waker.
|
|
"""
|
|
|
|
start_inventory_from_pool: StartInventoryPool
|
|
progression_dungeons: Dungeons
|
|
progression_tingle_chests: TingleChests
|
|
progression_dungeon_secrets: DungeonSecrets
|
|
progression_puzzle_secret_caves: PuzzleSecretCaves
|
|
progression_combat_secret_caves: CombatSecretCaves
|
|
progression_savage_labyrinth: SavageLabyrinth
|
|
progression_great_fairies: GreatFairies
|
|
progression_short_sidequests: ShortSidequests
|
|
progression_long_sidequests: LongSidequests
|
|
progression_spoils_trading: SpoilsTrading
|
|
progression_minigames: Minigames
|
|
progression_battlesquid: Battlesquid
|
|
progression_free_gifts: FreeGifts
|
|
progression_mail: Mail
|
|
progression_platforms_rafts: PlatformsRafts
|
|
progression_submarines: Submarines
|
|
progression_eye_reef_chests: EyeReefChests
|
|
progression_big_octos_gunboats: BigOctosGunboats
|
|
progression_triforce_charts: TriforceCharts
|
|
progression_treasure_charts: TreasureCharts
|
|
progression_expensive_purchases: ExpensivePurchases
|
|
progression_island_puzzles: IslandPuzzles
|
|
progression_misc: Misc
|
|
randomize_mapcompass: RandomizeMapCompass
|
|
randomize_smallkeys: RandomizeSmallKeys
|
|
randomize_bigkeys: RandomizeBigKeys
|
|
sword_mode: SwordMode
|
|
required_bosses: RequiredBosses
|
|
num_required_bosses: NumRequiredBosses
|
|
included_dungeons: IncludedDungeons
|
|
excluded_dungeons: ExcludedDungeons
|
|
chest_type_matches_contents: ChestTypeMatchesContents
|
|
# trap_chests: TrapChests
|
|
hero_mode: HeroMode
|
|
logic_obscurity: LogicObscurity
|
|
logic_precision: LogicPrecision
|
|
enable_tuner_logic: EnableTunerLogic
|
|
randomize_dungeon_entrances: RandomizeDungeonEntrances
|
|
randomize_secret_cave_entrances: RandomizeSecretCavesEntrances
|
|
randomize_miniboss_entrances: RandomizeMinibossEntrances
|
|
randomize_boss_entrances: RandomizeBossEntrances
|
|
randomize_secret_cave_inner_entrances: RandomizeSecretCaveInnerEntrances
|
|
randomize_fairy_fountain_entrances: RandomizeFairyFountainEntrances
|
|
mix_entrances: MixEntrances
|
|
randomize_enemies: RandomizeEnemies
|
|
# randomize_music: RandomizeMusic
|
|
randomize_starting_island: RandomizeStartingIsland
|
|
randomize_charts: RandomizeCharts
|
|
# hoho_hints: HoHoHints
|
|
# fishmen_hints: FishmenHints
|
|
# korl_hints: KoRLHints
|
|
# num_item_hints: NumItemHints
|
|
# num_location_hints: NumLocationHints
|
|
# num_barren_hints: NumBarrenHints
|
|
# num_path_hints: NumPathHints
|
|
# prioritize_remote_hints: PrioritizeRemoteHints
|
|
swift_sail: SwiftSail
|
|
instant_text_boxes: InstantTextBoxes
|
|
reveal_full_sea_chart: RevealFullSeaChart
|
|
add_shortcut_warps_between_dungeons: AddShortcutWarpsBetweenDungeons
|
|
skip_rematch_bosses: SkipRematchBosses
|
|
remove_music: RemoveMusic
|
|
death_link: DeathLink
|
|
|
|
def get_slot_data_dict(self) -> dict[str, Any]:
|
|
"""
|
|
Returns a dictionary of option name to value to be placed in
|
|
the slot data network package.
|
|
|
|
:return: Dictionary of option name to value for the slot data.
|
|
"""
|
|
return self.as_dict(
|
|
"progression_dungeons",
|
|
"progression_tingle_chests",
|
|
"progression_dungeon_secrets",
|
|
"progression_puzzle_secret_caves",
|
|
"progression_combat_secret_caves",
|
|
"progression_savage_labyrinth",
|
|
"progression_great_fairies",
|
|
"progression_short_sidequests",
|
|
"progression_long_sidequests",
|
|
"progression_spoils_trading",
|
|
"progression_minigames",
|
|
"progression_battlesquid",
|
|
"progression_free_gifts",
|
|
"progression_mail",
|
|
"progression_platforms_rafts",
|
|
"progression_submarines",
|
|
"progression_eye_reef_chests",
|
|
"progression_big_octos_gunboats",
|
|
"progression_triforce_charts",
|
|
"progression_treasure_charts",
|
|
"progression_expensive_purchases",
|
|
"progression_island_puzzles",
|
|
"progression_misc",
|
|
"sword_mode",
|
|
"required_bosses",
|
|
"logic_obscurity",
|
|
"logic_precision",
|
|
"enable_tuner_logic",
|
|
"randomize_dungeon_entrances",
|
|
"randomize_secret_cave_entrances",
|
|
"randomize_miniboss_entrances",
|
|
"randomize_boss_entrances",
|
|
"randomize_secret_cave_inner_entrances",
|
|
"randomize_fairy_fountain_entrances",
|
|
"swift_sail",
|
|
"skip_rematch_bosses",
|
|
"remove_music",
|
|
)
|
|
|
|
def get_output_dict(self) -> dict[str, Any]:
|
|
"""
|
|
Returns a dictionary of option name to value to be placed in
|
|
the output APTWW file.
|
|
|
|
:return: Dictionary of option name to value for the output file.
|
|
"""
|
|
|
|
# Note: these options' values must be able to be passed through
|
|
# `yaml.safe_dump`.
|
|
return self.as_dict(
|
|
"progression_dungeons",
|
|
"progression_tingle_chests",
|
|
"progression_dungeon_secrets",
|
|
"progression_puzzle_secret_caves",
|
|
"progression_combat_secret_caves",
|
|
"progression_savage_labyrinth",
|
|
"progression_great_fairies",
|
|
"progression_short_sidequests",
|
|
"progression_long_sidequests",
|
|
"progression_spoils_trading",
|
|
"progression_minigames",
|
|
"progression_battlesquid",
|
|
"progression_free_gifts",
|
|
"progression_mail",
|
|
"progression_platforms_rafts",
|
|
"progression_submarines",
|
|
"progression_eye_reef_chests",
|
|
"progression_big_octos_gunboats",
|
|
"progression_triforce_charts",
|
|
"progression_treasure_charts",
|
|
"progression_expensive_purchases",
|
|
"progression_island_puzzles",
|
|
"progression_misc",
|
|
"randomize_mapcompass",
|
|
"randomize_smallkeys",
|
|
"randomize_bigkeys",
|
|
"sword_mode",
|
|
"required_bosses",
|
|
"num_required_bosses",
|
|
"chest_type_matches_contents",
|
|
"hero_mode",
|
|
"logic_obscurity",
|
|
"logic_precision",
|
|
"randomize_dungeon_entrances",
|
|
"randomize_secret_cave_entrances",
|
|
"randomize_miniboss_entrances",
|
|
"randomize_boss_entrances",
|
|
"randomize_secret_cave_inner_entrances",
|
|
"randomize_fairy_fountain_entrances",
|
|
"mix_entrances",
|
|
"randomize_enemies",
|
|
"randomize_starting_island",
|
|
"randomize_charts",
|
|
"swift_sail",
|
|
"instant_text_boxes",
|
|
"reveal_full_sea_chart",
|
|
"add_shortcut_warps_between_dungeons",
|
|
"skip_rematch_bosses",
|
|
"remove_music",
|
|
)
|
|
|
|
|
|
tww_option_groups: list[OptionGroup] = [
|
|
OptionGroup(
|
|
"Progression Locations",
|
|
[
|
|
Dungeons,
|
|
DungeonSecrets,
|
|
TingleChests,
|
|
PuzzleSecretCaves,
|
|
CombatSecretCaves,
|
|
SavageLabyrinth,
|
|
IslandPuzzles,
|
|
GreatFairies,
|
|
Submarines,
|
|
PlatformsRafts,
|
|
ShortSidequests,
|
|
LongSidequests,
|
|
SpoilsTrading,
|
|
EyeReefChests,
|
|
BigOctosGunboats,
|
|
Misc,
|
|
Minigames,
|
|
Battlesquid,
|
|
FreeGifts,
|
|
Mail,
|
|
ExpensivePurchases,
|
|
TriforceCharts,
|
|
TreasureCharts,
|
|
],
|
|
),
|
|
OptionGroup(
|
|
"Item Randomizer Modes",
|
|
[
|
|
SwordMode,
|
|
RandomizeMapCompass,
|
|
RandomizeSmallKeys,
|
|
RandomizeBigKeys,
|
|
ChestTypeMatchesContents,
|
|
# TrapChests,
|
|
],
|
|
),
|
|
OptionGroup(
|
|
"Entrance Randomizer Options",
|
|
[
|
|
RandomizeDungeonEntrances,
|
|
RandomizeBossEntrances,
|
|
RandomizeMinibossEntrances,
|
|
RandomizeSecretCavesEntrances,
|
|
RandomizeSecretCaveInnerEntrances,
|
|
RandomizeFairyFountainEntrances,
|
|
MixEntrances,
|
|
],
|
|
),
|
|
OptionGroup(
|
|
"Other Randomizers",
|
|
[
|
|
RandomizeStartingIsland,
|
|
RandomizeCharts,
|
|
# RandomizeMusic,
|
|
],
|
|
),
|
|
OptionGroup(
|
|
"Convenience Tweaks",
|
|
[
|
|
SwiftSail,
|
|
InstantTextBoxes,
|
|
RevealFullSeaChart,
|
|
SkipRematchBosses,
|
|
AddShortcutWarpsBetweenDungeons,
|
|
RemoveMusic,
|
|
],
|
|
),
|
|
OptionGroup(
|
|
"Required Bosses",
|
|
[
|
|
RequiredBosses,
|
|
NumRequiredBosses,
|
|
IncludedDungeons,
|
|
ExcludedDungeons,
|
|
],
|
|
start_collapsed=True,
|
|
),
|
|
OptionGroup(
|
|
"Difficulty Options",
|
|
[
|
|
HeroMode,
|
|
LogicObscurity,
|
|
LogicPrecision,
|
|
EnableTunerLogic,
|
|
],
|
|
start_collapsed=True,
|
|
),
|
|
OptionGroup(
|
|
"Work-in-Progress Options",
|
|
[
|
|
RandomizeEnemies,
|
|
],
|
|
start_collapsed=True,
|
|
),
|
|
]
|