forked from mirror/Archipelago
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
917 lines
31 KiB
Python
917 lines
31 KiB
Python
from dataclasses import dataclass
|
||
from datetime import datetime
|
||
|
||
from Options import Choice, DeathLink, DefaultOnToggle, PerGameCommonOptions, Range, Toggle, StartInventoryPool, \
|
||
ItemDict, ItemsAccessibility, ItemSet, Visibility, OptionGroup, NamedRange
|
||
from .data.Items import ITEMS_DATA
|
||
|
||
|
||
class OracleOfSeasonsGoal(Choice):
|
||
"""
|
||
The goal to accomplish in order to complete the seed.
|
||
- Beat Onox: beat the usual final boss (same as vanilla)
|
||
- Beat Ganon: teleport to the Room of Rites after beating Onox, then beat Ganon (same as linked game)
|
||
"""
|
||
display_name = "Goal"
|
||
|
||
option_beat_onox = 0
|
||
option_beat_ganon = 1
|
||
|
||
default = 0
|
||
include_in_patch = True
|
||
include_in_slot_data = True
|
||
|
||
|
||
class OracleOfSeasonsLogicDifficulty(Choice):
|
||
"""
|
||
The difficulty of the logic used to generate the seed.
|
||
- Casual: expects you to know what you would know when playing the game for the first time
|
||
- Medium: expects you to know well the alternatives on how to do basic things, but won't expect any trick
|
||
- Hard: expects you to know difficult tricks such as bomb jumps
|
||
- Hell: expects you to use tricks and glitches that span over more than a few inputs
|
||
"""
|
||
display_name = "Logic Difficulty"
|
||
|
||
option_casual = 0
|
||
option_medium = 1
|
||
option_hard = 2
|
||
option_hell = 3
|
||
|
||
default = 0
|
||
include_in_slot_data = True
|
||
|
||
|
||
class OracleOfSeasonsRequiredEssences(Range):
|
||
"""
|
||
The amount of essences that need to be obtained in order to get the Maku Seed from the Maku Tree and be able
|
||
to fight Onox in his castle
|
||
"""
|
||
display_name = "Required Essences"
|
||
|
||
range_start = 0
|
||
range_end = 8
|
||
|
||
default = 8
|
||
include_in_patch = True
|
||
include_in_slot_data = True
|
||
|
||
|
||
class OracleOfSeasonsPlacedEssences(NamedRange):
|
||
"""
|
||
The amount of essences that will be placed in the world. Removed essences are replaced by filler items instead, and
|
||
if essences are not shuffled, those filler items will be placed on the pedestal where the essence would have been.
|
||
If the value for "Placed Essences" is lower than "Required Essences" (which can happen when using random values
|
||
for both), a new random value is automatically picked in the valid range.
|
||
"""
|
||
display_name = "Placed Essences"
|
||
|
||
range_start = 0
|
||
range_end = 8
|
||
|
||
default = 8
|
||
special_range_names = {
|
||
"included essences": -1
|
||
}
|
||
|
||
|
||
class OracleOfSeasonsDefaultSeasons(Choice):
|
||
"""
|
||
The world of Holodrum is split in regions, each one having its own default season being forced when entering it.
|
||
This options gives several ways of manipulating those default seasons.
|
||
- Vanilla: default seasons for each region are the ones from the original game
|
||
- Randomized: each region has its own random default season picked at generation time
|
||
- Random Singularity: a single season is randomly picked and put as default season in every region in the game
|
||
- Specific Singularity: the given season is put as default season in every region in the game
|
||
"""
|
||
display_name = "Default Seasons"
|
||
|
||
option_vanilla = 0
|
||
option_randomized = 1
|
||
option_random_singularity = 2
|
||
option_spring_singularity = 3
|
||
option_summer_singularity = 4
|
||
option_autumn_singularity = 5
|
||
option_winter_singularity = 6
|
||
|
||
default = 1
|
||
include_in_slot_data = True
|
||
|
||
|
||
class OracleOfSeasonsHoronSeason(DefaultOnToggle):
|
||
"""
|
||
In the vanilla game, Horon Village default season is chaotic: every time you enter it, it sets a random season.
|
||
This nullifies every condition where a season is required inside Horon Village, since you can leave and re-enter
|
||
again and again until you get the season that suits you.
|
||
Enabling this option disables that behavior and makes Horon Village behave like any other region in the game.
|
||
This means it will have a default season picked at generation time that follows the global behavior defined
|
||
in the "Default Seasons" option.
|
||
"""
|
||
display_name = "Normalize Horon Village Season"
|
||
|
||
|
||
class OracleOfSeasonsAnimalCompanion(Choice):
|
||
"""
|
||
Determines which animal companion you can summon using the Flute, as well as the layout of the Natzu region.
|
||
- Ricky: the kangaroo with boxing skills
|
||
- Dimitri: the swimming dinosaur who can eat anything
|
||
- Moosh: the flying blue bear with a passion for Spring Bananas
|
||
"""
|
||
display_name = "Animal Companion"
|
||
|
||
option_ricky = 0
|
||
option_dimitri = 1
|
||
option_moosh = 2
|
||
|
||
default = "random"
|
||
include_in_patch = True
|
||
include_in_slot_data = True
|
||
|
||
|
||
class OracleOfSeasonsDefaultSeedType(Choice):
|
||
"""
|
||
Determines which of the 5 seed types will be the "default seed type", which is given:
|
||
- when obtaining Seed Satchel
|
||
- when obtaining Slingshot
|
||
- by Horon Seed Tree
|
||
"""
|
||
display_name = "Default Seed Type"
|
||
|
||
option_ember = 0
|
||
option_scent = 1
|
||
option_pegasus = 2
|
||
option_gale = 3
|
||
option_mystery = 4
|
||
|
||
default = 0
|
||
include_in_patch = True
|
||
include_in_slot_data = True
|
||
|
||
|
||
class OracleOfSeasonsDuplicateSeedTree(Choice):
|
||
"""
|
||
The game contains 6 seed trees but only 5 seed types, which means two trees
|
||
must contain the same seed type. This option enables choosing which tree will
|
||
always contain a duplicate of one of the other 5 trees.
|
||
It is strongly advised to set this to "Tarm Ruins Tree" since it's by far the hardest tree to reach
|
||
(and being locked out of a useful seed type can lead to very frustrating situations).
|
||
"""
|
||
display_name = "Duplicate Seed Tree"
|
||
|
||
option_horon_village = 0
|
||
option_woods_of_winter = 1
|
||
option_north_horon = 2
|
||
option_spool_swamp = 3
|
||
option_sunken_city = 4
|
||
option_tarm_ruins = 5
|
||
|
||
default = 5
|
||
|
||
|
||
class OracleOfSeasonsDungeonShuffle(Toggle):
|
||
"""
|
||
If enabled, each dungeon entrance will lead to a random dungeon picked at generation time.
|
||
Otherwise, all dungeon entrances lead to their dungeon as intended.
|
||
"""
|
||
display_name = "Shuffle Dungeons"
|
||
|
||
include_in_slot_data = True
|
||
|
||
|
||
class OracleOfSeasonsPortalShuffle(Choice):
|
||
"""
|
||
- Vanilla: pairs of portals are the same as in the original game
|
||
- Shuffle Outwards: each portal is connected to a random portal in the opposite dimension picked at generation time
|
||
- Shuffle: each portal is connected to a random portal, which might be in the same dimension (with the guarantee of
|
||
having at least one portal going across dimensions)
|
||
"""
|
||
display_name = "Shuffle Subrosia Portals"
|
||
|
||
option_vanilla = 0
|
||
option_shuffle_outwards = 1
|
||
option_shuffle = 2
|
||
|
||
default = 0
|
||
include_in_slot_data = True
|
||
|
||
|
||
class OracleOfSeasonsOldMenShuffle(Choice):
|
||
"""
|
||
Determine how the Old Men which give or take rupees are handled by the randomizer.
|
||
- Vanilla: Each Old Man gives/takes the amount of rupees it usually does in the base game
|
||
- Shuffled Values: The amount of given/taken rupees are shuffled between Old Men
|
||
- Random Values: Each Old Man will give or take a random amount of rupees
|
||
- Random Positive Values: Each Old Man will give a random amount of rupees, but never make you pay
|
||
- Turn Into Locations: Each Old Man becomes a randomized check, and the total amount of rupees they usually give
|
||
in vanilla is shuffled into the item pool
|
||
"""
|
||
|
||
display_name = "Rupee Old Men"
|
||
|
||
option_vanilla = 0
|
||
option_shuffled_values = 1
|
||
option_random_values = 2
|
||
option_random_positive_values = 3
|
||
option_turn_into_locations = 4
|
||
|
||
default = 3
|
||
include_in_patch = True
|
||
include_in_slot_data = True
|
||
|
||
|
||
class OracleOfSeasonsBusinessScrubsShuffle(Toggle):
|
||
"""
|
||
This option adds the 4 accessible business scrubs (Spool Swamp, Samasa Desert, D2, D4) to the pool of randomized
|
||
locations. Just like any other shop, they ask for rupees in exchange of the randomized item,
|
||
which can only be purchased once.
|
||
Please note that scrubs inside dungeons can hold dungeon items, such as keys.
|
||
"""
|
||
display_name = "Shuffle Business Scrubs"
|
||
|
||
include_in_patch = True
|
||
include_in_slot_data = True
|
||
|
||
|
||
class OracleOfSeasonsGoldenOreSpotsShuffle(Toggle):
|
||
"""
|
||
This option adds the 7 hidden digging spots in Subrosia (containing 50 Ore Chunks each) to the pool
|
||
of randomized locations.
|
||
"""
|
||
display_name = "Shuffle Golden Ore Spots"
|
||
|
||
include_in_patch = True
|
||
include_in_slot_data = True
|
||
|
||
|
||
class OracleOfSeasonsEssenceSanity(Toggle):
|
||
"""
|
||
If enabled, essences will be shuffled anywhere in the multiworld instead of being guaranteed to be found
|
||
at the end their respective dungeons.
|
||
"""
|
||
display_name = "Shuffle Essences"
|
||
|
||
include_in_patch = True
|
||
include_in_slot_data = True
|
||
|
||
|
||
class OracleOfSeasonsExcludeDungeonsWithoutEssence(DefaultOnToggle):
|
||
"""
|
||
If enabled, all dungeons whose essence has been removed because of the "Placed Essences" option will be excluded,
|
||
which means you can safely ignore them since they cannot contain an item that is required to complete the seed.
|
||
If "Shuffle Essences" is enabled, this option has no effect.
|
||
Hero's Cave is not considered to be a dungeon for this option, and therefore is never excluded.
|
||
"""
|
||
display_name = "Exclude Dungeons Without Essence"
|
||
|
||
|
||
class OracleOfSeasonsShowDungeonsWithMap(DefaultOnToggle):
|
||
"""
|
||
If enabled, dungeons will indicate where they are once their corresponding map is obtained
|
||
"""
|
||
display_name = "Show Dungeons With Map"
|
||
|
||
include_in_patch = True
|
||
include_in_slot_data = True
|
||
|
||
|
||
class OracleOfSeasonsShowDungeonsWithEssence(Choice):
|
||
"""
|
||
Determines the condition required to highlight dungeons having an essence on their end pedestal
|
||
(with a sparkle on the in-game map).
|
||
This is especially useful when using "Exclude Dungeons Without Essence" to know which dungeons you can ignore.
|
||
If "Shuffle Essences" is enabled, this option has no effect.
|
||
- Disabled: Dungeons with an essence are never shown on the map
|
||
- With Compass: Dungeons with an essence can only be highlighted after obtaining their Compass
|
||
- Always: Dungeons with an essence are always shown on the map
|
||
"""
|
||
# TODO: - With Treasure Map: Dungeons with an essence all become highlighted when you obtain the unique Treasure Map item
|
||
display_name = "Show Dungeons With Essence"
|
||
|
||
option_disabled = 0
|
||
option_with_compass = 1
|
||
option_always = 2
|
||
|
||
default = 1
|
||
include_in_patch = True
|
||
include_in_slot_data = True
|
||
|
||
|
||
class OracleOfSeasonsMasterKeys(Choice):
|
||
"""
|
||
- Disabled: All dungeon keys must be obtained individually, just like in vanilla
|
||
- All Small Keys: Small Keys are replaced by a single Master Key for each dungeon which is capable of opening
|
||
every small keydoor for that dungeon
|
||
- All Dungeon Keys: the Master Key for each dungeon is also capable of opening the boss keydoor,
|
||
removing Boss Keys from the item pool
|
||
Master Keys placement is determined following the "Keysanity (Small Keys)" option.
|
||
"""
|
||
display_name = "Master Keys"
|
||
|
||
option_disabled = 0
|
||
option_all_small_keys = 1
|
||
option_all_dungeon_keys = 2
|
||
|
||
default = 0
|
||
include_in_patch = True
|
||
include_in_slot_data = True
|
||
|
||
|
||
class OracleOfSeasonsSmallKeyShuffle(Toggle):
|
||
"""
|
||
If enabled, dungeon Small Keys can be found anywhere instead of being confined in their dungeon of origin.
|
||
"""
|
||
display_name = "Keysanity (Small Keys)"
|
||
|
||
include_in_patch = True
|
||
include_in_slot_data = True
|
||
|
||
|
||
class OracleOfSeasonsBossKeyShuffle(Toggle):
|
||
"""
|
||
If enabled, dungeon Boss Keys can be found anywhere instead of being confined in their dungeon of origin.
|
||
"""
|
||
display_name = "Keysanity (Boss Keys)"
|
||
|
||
include_in_patch = True
|
||
include_in_slot_data = True
|
||
|
||
|
||
class OracleOfSeasonsMapCompassShuffle(Toggle):
|
||
"""
|
||
If enabled, Dungeon Maps and Compasses can be found anywhere instead of being confined in their dungeon of origin.
|
||
"""
|
||
display_name = "Maps & Compasses Outside Dungeon"
|
||
|
||
include_in_patch = True
|
||
include_in_slot_data = True
|
||
|
||
|
||
class OracleOfSeasonsRemoveD0AltEntrance(Toggle):
|
||
"""
|
||
If enabled, remove the hole acting as an alternate entrance to Hero’s Cave. Stairs will be added inside the dungeon to make the chest reachable.
|
||
This is especially useful when shuffling dungeons, since only main dungeon entrances are shuffled.
|
||
If this option is not set in such a case, you could potentially have two distant entrances leading to the same dungeon.
|
||
"""
|
||
display_name = "Remove Hero's Cave Alt. Entrance"
|
||
|
||
include_in_patch = True
|
||
include_in_slot_data = True
|
||
|
||
|
||
class OracleOfSeasonsRemoveD2AltEntrance(Toggle):
|
||
"""
|
||
If enabled, remove both stairs acting as alternate entrances to Snake’s Remains and connect them together inside the dungeon.
|
||
This is especially useful when shuffling dungeons, since only main dungeon entrances are shuffled.
|
||
If this option is not set in such a case, you could potentially have two distant entrances leading to the same dungeon.
|
||
"""
|
||
display_name = "Remove D2 Alt. Entrance"
|
||
|
||
include_in_patch = True
|
||
include_in_slot_data = True
|
||
|
||
|
||
class OraclesOfSeasonsTreehouseOldManRequirement(Range):
|
||
"""
|
||
The amount of essences that you need to bring to the treehouse old man for him to give his item.
|
||
"""
|
||
display_name = "Treehouse Old Man Requirement"
|
||
|
||
range_start = 0
|
||
range_end = 8
|
||
|
||
default = 5
|
||
include_in_patch = True
|
||
include_in_slot_data = True
|
||
|
||
|
||
class OraclesOfSeasonsTarmGateRequirement(Range):
|
||
"""
|
||
The number of jewels that you need to bring to Tarm Ruins gate to be able to open it.
|
||
"""
|
||
display_name = "Tarm Ruins Gate Required Jewels"
|
||
|
||
range_start = 0
|
||
range_end = 4
|
||
|
||
default = 4
|
||
include_in_patch = True
|
||
include_in_slot_data = True
|
||
|
||
|
||
class OraclesOfSeasonsGoldenBeastsRequirement(Range):
|
||
"""
|
||
The amount of golden beasts that need to be beaten for the golden old man to give his item.
|
||
Golden beasts are 4 unique enemies that appear at specific spots on specific seasons, and beating all four of them
|
||
requires all seasons and having access to most of the overworld.
|
||
"""
|
||
display_name = "Golden Beasts Requirement"
|
||
|
||
range_start = 0
|
||
range_end = 4
|
||
|
||
default = 1
|
||
include_in_patch = True
|
||
include_in_slot_data = True
|
||
|
||
|
||
class OracleOfSeasonsSignGuyRequirement(NamedRange):
|
||
"""
|
||
In Subrosia, a NPC will "punish" you if you break more than 100 signs in the vanilla game by giving you an item.
|
||
This option lets you configure how many signs are required to obtain that item, since breaking 100 signs is not
|
||
everyone's cup of tea.
|
||
"""
|
||
display_name = "Sign Guy Requirement"
|
||
|
||
range_start = 0
|
||
range_end = 250
|
||
|
||
default = 10
|
||
special_range_names = {
|
||
"vanilla": 100
|
||
}
|
||
include_in_patch = True
|
||
|
||
|
||
class OracleOfSeasonsGashaNutKillRequirement(NamedRange):
|
||
"""
|
||
This option lets you configure how many kills are required to make a gasha tree grow.
|
||
Using a gasha ring halves this number.
|
||
"""
|
||
display_name = "Gasha Nut Requirement"
|
||
|
||
range_start = 0
|
||
range_end = 250
|
||
|
||
default = 20
|
||
special_range_names = {
|
||
"vanilla": 40
|
||
}
|
||
include_in_patch = True
|
||
|
||
class OracleOfSeasonsRandomizePuzzles(Toggle):
|
||
"""
|
||
If enabled, randomize some puzzles and mini-games.
|
||
Puzzles relying on owls will not have their logic affected, and puzzles will not require additional items.
|
||
"""
|
||
display_name = "Randomize Puzzles"
|
||
|
||
include_in_patch = True
|
||
default = 1 if (datetime.now().month == 4) else 0 # Default on during april
|
||
|
||
|
||
class OracleOfSeasonsLostWoodsItemSequence(DefaultOnToggle):
|
||
"""
|
||
If enabled, the secret sequence leading to the Noble Sword pedestal will be randomized (both directions to
|
||
take and seasons to use).
|
||
To know the randomized combination, you will need to bring the Phonograph to the Deku Scrub near the stump, just
|
||
like in the vanilla game.
|
||
"""
|
||
display_name = "Randomize Lost Woods Item Sequence"
|
||
|
||
include_in_slot_data = True
|
||
|
||
|
||
class OracleOfSeasonsLostWoodsMainSequence(Toggle):
|
||
"""
|
||
If enabled, the secret sequence leading to D6 sector will be randomized (both directions to take and
|
||
seasons to use).
|
||
To know the randomized combination, you will need to stun the Deku Scrub near the jewel gate using a shield, just
|
||
like in the vanilla game.
|
||
"""
|
||
display_name = "Randomize Lost Woods Main Sequence"
|
||
|
||
include_in_slot_data = True
|
||
|
||
|
||
class OracleOfSeasonsSamasaGateCode(Toggle):
|
||
"""
|
||
This option defines if the secret combination which opens the gate to Samasa Desert should be randomized.
|
||
You can then configure the length of the sequence with the next option.
|
||
"""
|
||
display_name = "Randomize Samasa Desert Gate Code"
|
||
|
||
|
||
class OracleOfSeasonsSamasaGateCodeLength(Range):
|
||
"""
|
||
The length of the randomized combination for Samasa Desert gate.
|
||
This option has no effect if "Randomize Samasa Desert Gate Code" is disabled.
|
||
"""
|
||
display_name = "Samasa Desert Gate Code Length"
|
||
|
||
range_start = 1
|
||
range_end = 40
|
||
|
||
default = 8
|
||
|
||
|
||
class OracleOfSeasonsGashaLocations(Range):
|
||
"""
|
||
When set to a non-zero value, planting a Gasha tree on a unique soil gives a deterministic item which is taken
|
||
into account by logic. Once an item has been obtained this way, the soil disappears forever to avoid any chance
|
||
of softlocking by wasting several Gasha Seeds on the same soil.
|
||
The value of this option is the number of items that can be obtained that way, the maximum value expecting you
|
||
to plant a tree on each one of the 16 Gasha spots in the game.
|
||
"""
|
||
display_name = "Deterministic Gasha Locations"
|
||
|
||
range_start = 0
|
||
range_end = 16
|
||
|
||
default = 0
|
||
include_in_patch = True
|
||
include_in_slot_data = True
|
||
|
||
|
||
class OracleOfSeasonsRequiredRings(ItemSet):
|
||
"""
|
||
Forces a specified set of rings to appear somewhere in the seed.
|
||
Adding too many rings to this list can cause generation failures.
|
||
List of ring names can be found here: https://zeldawiki.wiki/wiki/Magic_Ring
|
||
"""
|
||
display_name = "Required Rings"
|
||
valid_keys = {name for name, idata in ITEMS_DATA.items() if "ring" in idata}
|
||
|
||
|
||
class OracleOfSeasonsExcludedRings(ItemSet):
|
||
"""
|
||
Forces a specified set of rings to not appear in the seed.
|
||
List of ring names can be found here: https://zeldawiki.wiki/wiki/Magic_Ring
|
||
"""
|
||
display_name = "Excluded Rings"
|
||
default = {name for name, idata in ITEMS_DATA.items() if "ring" in idata and idata["ring"] == "useless"}
|
||
valid_keys = {name for name, idata in ITEMS_DATA.items() if "ring" in idata}
|
||
|
||
|
||
class OracleOfSeasonsShopPrices(Choice):
|
||
"""
|
||
Determine the cost of items found in shops of all sorts (including Subrosian Market and Business Scrubs):
|
||
- Vanilla: shop items have the same cost as in the base game
|
||
- Free: all shop items can be obtained for free
|
||
- Cheap: shop prices are randomized with an average cost of 50 Rupees
|
||
- Reasonable: shop prices are randomized with an average cost of 100 Rupees
|
||
- Expensive: shop prices are randomized with an average cost of 200 Rupees
|
||
- Outrageous: shop prices are randomized with an average cost of 350 Rupees
|
||
"""
|
||
display_name = "Shop Prices"
|
||
|
||
option_vanilla = 0
|
||
option_free = 1
|
||
option_cheap = 2
|
||
option_reasonable = 3
|
||
option_expensive = 4
|
||
option_outrageous = 5
|
||
|
||
default = 0
|
||
|
||
|
||
class OracleOfSeasonsAdvanceShop(Toggle):
|
||
"""
|
||
In the vanilla game, there is a house northwest of Horon Village hosting the secret "Advance Shop" that can only
|
||
be accessed if the game is being played on a Game Boy Advance console.
|
||
If enabled, this option makes this shop always open, adding 3 shop locations to the game (and some rupees to the
|
||
item pool to compensate for the extra purchases that might be required)
|
||
"""
|
||
display_name = "Open Advance Shop"
|
||
|
||
include_in_patch = True
|
||
include_in_slot_data = True
|
||
|
||
|
||
class OracleOfSeasonsFoolsOre(Choice):
|
||
"""
|
||
In the vanilla game, the Fool's Ore is the item "given" by the strange brothers in "exchange" for your feather.
|
||
The way the vanilla game is done means you never get to use it, but it's by far the strongest weapon in the game
|
||
(dealing 4 times more damage than an L-2 sword!)
|
||
- Vanilla: Fool's Ore appears in the item pool with its stats unchanged
|
||
- Balanced: Fool's Ore appears in the item pool but its stats are lowered to become comparable to an L-2 sword
|
||
- Excluded: Fool's Ore doesn't appear in the item pool at all. Problem solved!
|
||
"""
|
||
display_name = "Fool's Ore"
|
||
|
||
option_vanilla = 0
|
||
option_balanced = 1
|
||
option_excluded = 2
|
||
|
||
default = 1
|
||
include_in_patch = True
|
||
|
||
|
||
class OracleOfSeasonsEnforcePotionInShop(Toggle):
|
||
"""
|
||
When enabled, you are guaranteed to have a renewable Potion for 300 rupees inside Horon shop
|
||
"""
|
||
display_name = "Enforce Potion in Shop"
|
||
|
||
include_in_patch = True
|
||
include_in_slot_data = True
|
||
|
||
|
||
class OracleOfSeasonsCombatDifficulty(Choice):
|
||
"""
|
||
Modifies the damage taken during combat to make this aspect of the game easier or harder depending on the
|
||
type of experience you want to have
|
||
"""
|
||
display_name = "Combat Difficulty"
|
||
|
||
option_peaceful = 4
|
||
option_easier = 2
|
||
option_vanilla = 0
|
||
option_harder = -2
|
||
option_insane = -4
|
||
|
||
default = 0
|
||
include_in_patch = True
|
||
|
||
|
||
class OracleOfSeasonsQuickFlute(DefaultOnToggle):
|
||
"""
|
||
When enabled, playing the flute will immobilize you during a very small amount of time compared to vanilla game.
|
||
"""
|
||
display_name = "Quick Flute"
|
||
|
||
include_in_patch = True
|
||
|
||
|
||
class OracleOfSeasonsRosaQuickUnlock(Toggle):
|
||
"""
|
||
When enabled, Rosa will instantly unlock all subrosia locks when given the Ribbon
|
||
"""
|
||
display_name = "Rosa Quick Unlock"
|
||
|
||
include_in_patch = True
|
||
|
||
|
||
class OracleOfSeasonsStartingMapsCompasses(Toggle):
|
||
"""
|
||
When enabled, you will start the game with maps and compasses for every dungeon in the game.
|
||
This makes navigation easier and removes those items for the pool, which are replaced with random filler items.
|
||
"""
|
||
display_name = "Start with Dungeon Maps & Compasses"
|
||
|
||
include_in_patch = True
|
||
include_in_slot_data = True
|
||
|
||
|
||
class OracleOfSeasonsRandomizeAi(Toggle):
|
||
"""
|
||
When enabled, enemy AI will be randomized.
|
||
This option is only visible on yamls generated in April.
|
||
|
||
⚠ This option may cause logic issues or unbeatable seeds due to some untested combos caused
|
||
by the high number of possibilities. Some graphical oddities are also to be expected.
|
||
⚠ Required golden beasts is 0 because you are not guaranteed to get an enemy
|
||
with a golden beast AI that would be counted for the old man
|
||
"""
|
||
display_name = "Randomize AI"
|
||
|
||
include_in_patch = True
|
||
visibility = Visibility.all if (datetime.now().month == 4) else Visibility.none # Only visible in april
|
||
|
||
|
||
class OracleOfSeasonsRemoveItemsFromPool(ItemDict):
|
||
"""
|
||
Removes specified amount of given items from the item pool, replacing them with random filler items.
|
||
This option has significant chances to break generation if used carelessly, so test your preset several times
|
||
before using it on long generations. Use at your own risk!
|
||
"""
|
||
display_name = "Remove Items from Pool"
|
||
verify_item_name = False
|
||
|
||
|
||
class OracleOfSeasonsIncludeCrossItems(Toggle):
|
||
"""
|
||
When enabled, adds the Cane of Somaria, the Switch Hook and the Seed Shooter to the item pool
|
||
⚠ Requires the Oracles of Ages US ROM on patch, you won't be able to play without
|
||
"""
|
||
display_name = "Cross Items"
|
||
include_in_patch = True
|
||
|
||
|
||
class OracleOfSeasonsIncludeSecretLocations(Toggle):
|
||
"""
|
||
When enabled, add the linked game secrets to the list of locations
|
||
"""
|
||
display_name = "Secret Locations"
|
||
|
||
include_in_patch = True
|
||
include_in_slot_data = True
|
||
|
||
|
||
class OracleOfSeasonsLinkedHerosCave(Choice):
|
||
"""
|
||
Sets whether and how the link version of the hero's cave is placed in the world.
|
||
- Samasa: an entrance is placed in the Samasa desert, below the oasis
|
||
- Hero's cave: a warp is placed at the entrance of d0
|
||
"""
|
||
display_name = "Linked Hero's Cave"
|
||
samasa = 0b001
|
||
no_alt_entrance = 0b010
|
||
heros_cave = 0b100
|
||
|
||
option_disabled = 0b000
|
||
option_samasa = 0b001
|
||
option_samasa_without_alt_entrance = 0b011
|
||
option_heros_cave = 0b110
|
||
|
||
include_in_patch = True
|
||
include_in_slot_data = True
|
||
|
||
|
||
class OracleOfSeasonsDeathLink(DeathLink):
|
||
"""
|
||
When you die, everyone who enabled death link dies. Of course, the reverse is true too.
|
||
"""
|
||
include_in_slot_data = True # This is for the bizhawk client
|
||
|
||
|
||
class OracleOfSeasonsMoveLink(Toggle):
|
||
"""
|
||
When enabled, movement will be linked between games that enabled this option.
|
||
This option is only visible on yamls generated in April.
|
||
|
||
⚠ This option may easily cause softlocks and may cause some issues. Some graphical oddities are also to be expected.
|
||
"""
|
||
display_name = "Randomize AI"
|
||
visibility = Visibility.all if (datetime.now().month == 4) else Visibility.none # Only visible in april
|
||
|
||
include_in_slot_data = True # This is for the bizhawk client
|
||
|
||
|
||
class OracleOfSeasonsBirdHint(Choice):
|
||
"""
|
||
Disabled: The Owls and Know-it-all birds say their vanilla text when talked to
|
||
Know-it-all: Enable region hints from the birds in the house next to the advance shop
|
||
Owl: Enable owls to give hints about items from your world
|
||
"""
|
||
display_name = "Bird Hint"
|
||
|
||
option_disabled = 0b00
|
||
option_know_it_all = 0b01
|
||
option_owl = 0b10
|
||
option_both = 0b11
|
||
|
||
default = option_both
|
||
|
||
def know_it_all(self) -> bool:
|
||
return bool(self.value & OracleOfSeasonsBirdHint.option_know_it_all)
|
||
|
||
def owl(self) -> bool:
|
||
return bool(self.value & OracleOfSeasonsBirdHint.option_owl)
|
||
|
||
|
||
@dataclass
|
||
class OracleOfSeasonsOptions(PerGameCommonOptions):
|
||
accessibility: ItemsAccessibility
|
||
goal: OracleOfSeasonsGoal
|
||
logic_difficulty: OracleOfSeasonsLogicDifficulty
|
||
death_link: OracleOfSeasonsDeathLink
|
||
|
||
# Optional locations
|
||
advance_shop: OracleOfSeasonsAdvanceShop
|
||
shuffle_old_men: OracleOfSeasonsOldMenShuffle
|
||
shuffle_business_scrubs: OracleOfSeasonsBusinessScrubsShuffle
|
||
shuffle_golden_ore_spots: OracleOfSeasonsGoldenOreSpotsShuffle
|
||
deterministic_gasha_locations: OracleOfSeasonsGashaLocations
|
||
secret_locations: OracleOfSeasonsIncludeSecretLocations
|
||
linked_heros_cave: OracleOfSeasonsLinkedHerosCave
|
||
|
||
# Essences
|
||
required_essences: OracleOfSeasonsRequiredEssences
|
||
shuffle_essences: OracleOfSeasonsEssenceSanity
|
||
placed_essences: OracleOfSeasonsPlacedEssences
|
||
exclude_dungeons_without_essence: OracleOfSeasonsExcludeDungeonsWithoutEssence
|
||
show_dungeons_with_map: OracleOfSeasonsShowDungeonsWithMap
|
||
show_dungeons_with_essence: OracleOfSeasonsShowDungeonsWithEssence
|
||
|
||
# Seasons
|
||
default_seasons: OracleOfSeasonsDefaultSeasons
|
||
normalize_horon_village_season: OracleOfSeasonsHoronSeason
|
||
|
||
# Overworld layout options
|
||
animal_companion: OracleOfSeasonsAnimalCompanion
|
||
shuffle_portals: OracleOfSeasonsPortalShuffle
|
||
shuffle_dungeons: OracleOfSeasonsDungeonShuffle
|
||
remove_d0_alt_entrance: OracleOfSeasonsRemoveD0AltEntrance
|
||
remove_d2_alt_entrance: OracleOfSeasonsRemoveD2AltEntrance
|
||
default_seed: OracleOfSeasonsDefaultSeedType
|
||
duplicate_seed_tree: OracleOfSeasonsDuplicateSeedTree
|
||
|
||
# Dungeon items
|
||
master_keys: OracleOfSeasonsMasterKeys
|
||
keysanity_small_keys: OracleOfSeasonsSmallKeyShuffle
|
||
keysanity_boss_keys: OracleOfSeasonsBossKeyShuffle
|
||
keysanity_maps_compasses: OracleOfSeasonsMapCompassShuffle
|
||
starting_maps_compasses: OracleOfSeasonsStartingMapsCompasses
|
||
|
||
# Numeric requirements for some checks / access to regions
|
||
treehouse_old_man_requirement: OraclesOfSeasonsTreehouseOldManRequirement
|
||
tarm_gate_required_jewels: OraclesOfSeasonsTarmGateRequirement
|
||
golden_beasts_requirement: OraclesOfSeasonsGoldenBeastsRequirement
|
||
sign_guy_requirement: OracleOfSeasonsSignGuyRequirement
|
||
gasha_nut_kill_requirement: OracleOfSeasonsGashaNutKillRequirement
|
||
|
||
# Other randomizable stuff
|
||
randomize_puzzles: OracleOfSeasonsRandomizePuzzles
|
||
randomize_lost_woods_item_sequence: OracleOfSeasonsLostWoodsItemSequence
|
||
randomize_lost_woods_main_sequence: OracleOfSeasonsLostWoodsMainSequence
|
||
randomize_samasa_gate_code: OracleOfSeasonsSamasaGateCode
|
||
samasa_gate_code_length: OracleOfSeasonsSamasaGateCodeLength
|
||
|
||
# QOL
|
||
quick_flute: OracleOfSeasonsQuickFlute
|
||
rosa_quick_unlock: OracleOfSeasonsRosaQuickUnlock
|
||
|
||
# Miscellaneous options
|
||
shop_prices: OracleOfSeasonsShopPrices
|
||
enforce_potion_in_shop: OracleOfSeasonsEnforcePotionInShop
|
||
required_rings: OracleOfSeasonsRequiredRings
|
||
excluded_rings: OracleOfSeasonsExcludedRings
|
||
fools_ore: OracleOfSeasonsFoolsOre
|
||
cross_items: OracleOfSeasonsIncludeCrossItems
|
||
combat_difficulty: OracleOfSeasonsCombatDifficulty
|
||
bird_hint: OracleOfSeasonsBirdHint
|
||
randomize_ai: OracleOfSeasonsRandomizeAi
|
||
move_link: OracleOfSeasonsMoveLink
|
||
|
||
start_inventory_from_pool: StartInventoryPool
|
||
remove_items_from_pool: OracleOfSeasonsRemoveItemsFromPool
|
||
|
||
|
||
oos_option_groups = [
|
||
OptionGroup("General", [
|
||
ItemsAccessibility,
|
||
OracleOfSeasonsGoal,
|
||
OracleOfSeasonsLogicDifficulty,
|
||
OracleOfSeasonsDeathLink,
|
||
]),
|
||
OptionGroup("Items", [
|
||
OracleOfSeasonsIncludeCrossItems,
|
||
]),
|
||
OptionGroup("Optional Locations", [
|
||
OracleOfSeasonsAdvanceShop,
|
||
OracleOfSeasonsOldMenShuffle,
|
||
OracleOfSeasonsBusinessScrubsShuffle,
|
||
OracleOfSeasonsGoldenOreSpotsShuffle,
|
||
OracleOfSeasonsGashaLocations,
|
||
OracleOfSeasonsIncludeSecretLocations,
|
||
OracleOfSeasonsLinkedHerosCave
|
||
]),
|
||
OptionGroup("Essences", [
|
||
OracleOfSeasonsRequiredEssences,
|
||
OracleOfSeasonsEssenceSanity,
|
||
OracleOfSeasonsPlacedEssences,
|
||
OracleOfSeasonsExcludeDungeonsWithoutEssence,
|
||
OracleOfSeasonsShowDungeonsWithMap,
|
||
OracleOfSeasonsShowDungeonsWithEssence,
|
||
]),
|
||
OptionGroup("Seasons", [
|
||
OracleOfSeasonsDefaultSeasons,
|
||
OracleOfSeasonsHoronSeason,
|
||
]),
|
||
OptionGroup("Overworld Layout Options", [
|
||
OracleOfSeasonsAnimalCompanion,
|
||
OracleOfSeasonsPortalShuffle,
|
||
OracleOfSeasonsDungeonShuffle,
|
||
OracleOfSeasonsRemoveD0AltEntrance,
|
||
OracleOfSeasonsRemoveD2AltEntrance,
|
||
OracleOfSeasonsDefaultSeedType,
|
||
OracleOfSeasonsDuplicateSeedTree,
|
||
]),
|
||
OptionGroup("Dungeon Items", [
|
||
OracleOfSeasonsMasterKeys,
|
||
OracleOfSeasonsSmallKeyShuffle,
|
||
OracleOfSeasonsBossKeyShuffle,
|
||
OracleOfSeasonsMapCompassShuffle,
|
||
OracleOfSeasonsStartingMapsCompasses
|
||
]),
|
||
OptionGroup("Numeric Requirements", [
|
||
OraclesOfSeasonsTreehouseOldManRequirement,
|
||
OraclesOfSeasonsTarmGateRequirement,
|
||
OraclesOfSeasonsGoldenBeastsRequirement,
|
||
OracleOfSeasonsSignGuyRequirement,
|
||
OracleOfSeasonsGashaNutKillRequirement,
|
||
]),
|
||
OptionGroup("Randomizable Sequences", [
|
||
OracleOfSeasonsRandomizePuzzles,
|
||
OracleOfSeasonsLostWoodsItemSequence,
|
||
OracleOfSeasonsLostWoodsMainSequence,
|
||
OracleOfSeasonsSamasaGateCode,
|
||
OracleOfSeasonsSamasaGateCodeLength,
|
||
]),
|
||
OptionGroup("QOL", [
|
||
OracleOfSeasonsQuickFlute,
|
||
OracleOfSeasonsRosaQuickUnlock,
|
||
]),
|
||
OptionGroup("Others", [
|
||
OracleOfSeasonsShopPrices,
|
||
OracleOfSeasonsEnforcePotionInShop,
|
||
OracleOfSeasonsRequiredRings,
|
||
OracleOfSeasonsExcludedRings,
|
||
OracleOfSeasonsFoolsOre,
|
||
OracleOfSeasonsCombatDifficulty,
|
||
OracleOfSeasonsBirdHint,
|
||
OracleOfSeasonsRandomizeAi,
|
||
OracleOfSeasonsMoveLink,
|
||
OracleOfSeasonsRemoveItemsFromPool
|
||
]),
|
||
]
|