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
452 lines
14 KiB
Python
452 lines
14 KiB
Python
import typing
|
|
from dataclasses import dataclass
|
|
from Options import (
|
|
DefaultOnToggle,
|
|
Toggle,
|
|
Choice,
|
|
PerGameCommonOptions,
|
|
StartInventoryPool,
|
|
NamedRange,
|
|
Range,
|
|
DeathLink,
|
|
OptionSet,
|
|
)
|
|
|
|
|
|
class Goal(Choice):
|
|
"""Change the desired goal to complete the game
|
|
Dialga - Get X relic fragment shards to unlock hidden land. Find Temporal Tower location
|
|
then go through hidden land via Lapras on the beach to beat dialga
|
|
Darkrai - Beat Dialga (all the same requirements), then get X instruments to unlock Dark Crater"""
|
|
|
|
display_name = "Goal"
|
|
option_dialga = 0
|
|
option_darkrai = 1
|
|
default = 0
|
|
|
|
|
|
class FragmentShards(NamedRange):
|
|
"""How many Relic Fragment Shards should be required in the game (Macguffins)
|
|
that you must get to unlock Hidden Land"""
|
|
|
|
range_start = 4
|
|
range_end = 15
|
|
special_range_names = {"easy": 4, "normal": 6, "hard": 8, "extreme": 10}
|
|
default = 6
|
|
|
|
|
|
class ExtraShards(NamedRange):
|
|
"""How many total Fragment Shards should be in the game?
|
|
If the total shards is less than required shards, the total shard amount is equal to the required shard amount"""
|
|
|
|
range_start = 0
|
|
range_end = 20
|
|
special_range_names = {"easy": 16, "normal": 12, "hard": 8, "extreme": 0}
|
|
default = 12
|
|
|
|
|
|
class RequiredInstruments(NamedRange):
|
|
"""How many Instruments should be required in the game (Macguffins)
|
|
that you must get to unlock Dark Crater if victory condition is Darkrai
|
|
Instruments are not added to the item pool if the goal is Dialga"""
|
|
|
|
range_start = 4
|
|
range_end = 15
|
|
special_range_names = {"easy": 4, "normal": 6, "hard": 8, "extreme": 10}
|
|
default = 6
|
|
|
|
|
|
class ExtraInstruments(NamedRange):
|
|
"""How many total Instruments should be in the game?
|
|
If the total instruments is less than required instruments,
|
|
the total instrument amount is equal to the required instrument amount"""
|
|
|
|
range_start = 0
|
|
range_end = 20
|
|
special_range_names = {"easy": 16, "normal": 12, "hard": 8, "extreme": 0}
|
|
default = 12
|
|
|
|
|
|
class EarlyMissionChecks(NamedRange):
|
|
"""How many Missions per dungeon pre dialga should be checks?
|
|
0 equals missions are not checks"""
|
|
|
|
range_start = 0
|
|
range_end = 31
|
|
special_range_names = {"off": 0, "some": 4, "lots": 10, "insanity": 31}
|
|
default = 4
|
|
|
|
|
|
class LateMissionChecks(NamedRange):
|
|
"""How many Missions per dungeon post-dialga (including Hidden Land
|
|
and Temporal Tower) should be checks? 0 equals missions are not checks"""
|
|
|
|
range_start = 0
|
|
range_end = 31
|
|
special_range_names = {"off": 0, "some": 4, "lots": 10, "insanity": 31}
|
|
default = 4
|
|
|
|
|
|
class EarlyOutlawChecks(NamedRange):
|
|
"""How many outlaws per dungeon pre dialga should be checks?
|
|
0 equals outlaws are not checks"""
|
|
|
|
range_start = 0
|
|
range_end = 31
|
|
special_range_names = {"off": 0, "some": 2, "lots": 10, "insanity": 31}
|
|
default = 2
|
|
|
|
|
|
class LateOutlawChecks(NamedRange):
|
|
"""How many Missions per dungeon post-dialga (including Hidden Land
|
|
and Temporal Tower) should be checks? 0 equals outlaws are not checks"""
|
|
|
|
range_start = 0
|
|
range_end = 31
|
|
special_range_names = {"off": 0, "some": 2, "lots": 10, "insanity": 31}
|
|
default = 2
|
|
|
|
|
|
class SpindaDrinkEvents(NamedRange):
|
|
"""How many drink events should be checks?"""
|
|
|
|
default_name = "Spinda Drink Events"
|
|
range_start = 0
|
|
range_end = 20
|
|
special_range_names = {"few": 5, "some": 10, "lots": 15, "all": 20}
|
|
default = 5
|
|
|
|
|
|
class SpindaBasicDrinks(NamedRange):
|
|
"""How many Spinda Drinks should be checks?"""
|
|
|
|
display_name = "Spinda Drinks"
|
|
range_start = 0
|
|
range_end = 20
|
|
special_range_names = {"few": 5, "some": 10, "lots": 15, "all": 20}
|
|
default = 5
|
|
|
|
|
|
class StartWithBag(DefaultOnToggle):
|
|
"""Start with bag? If False all bag upgrades will be randomized in the game.
|
|
If true, you will get one bag upgrade (16 slots) and the rest will be randomized"""
|
|
|
|
display_name = "Start with Bag?"
|
|
|
|
|
|
class Recruitment(DefaultOnToggle):
|
|
"""Start with recruitment enabled?
|
|
If false, recruitment will be an item available in game"""
|
|
|
|
display_name = "Recruitment Enable"
|
|
|
|
|
|
class RecruitmentEvolution(DefaultOnToggle):
|
|
"""Start with Recruitment Evolution Enabled?
|
|
If false, evolution will be an item available in game"""
|
|
|
|
display_name = "Recruitment Evolution Enable"
|
|
|
|
|
|
class HeroEvolution(DefaultOnToggle):
|
|
"""Start with Hero/Partner Evolution Enabled?
|
|
If false, hero evolution will be an item available in game.
|
|
Note: hero evolution does nothing until recruitment
|
|
evolution has been unlocked"""
|
|
|
|
display_name = "Partner/Hero Evolution Enable"
|
|
|
|
|
|
class FullTeamFormationControl(DefaultOnToggle):
|
|
"""Start with full team formation control?
|
|
If false, full team formation control will be an item
|
|
available in game"""
|
|
|
|
display_name = "Formation Control Enable"
|
|
|
|
|
|
class LevelScaling(Choice):
|
|
"""Allow for dungeons to scale to the highest level of your party members?
|
|
This will not scale bosses at the end of dungeons, also will not scale Outlaws
|
|
Adjust enemies levels to match the highest party level so you won't have to grind as much.
|
|
Off: Enemy levels are vanilla.
|
|
Easy: Enemies will be bumped down to the highest party level if they're above it.
|
|
Difficult: Enemies will be bumped either down or up to match the party level regardless of their vanilla level
|
|
Regardless of your choice, bosses at the end of dungeons will NOT scale."""
|
|
|
|
display_name = "Level Scaling"
|
|
option_off = 0
|
|
option_easy = 1
|
|
option_difficult = 2
|
|
default = 1
|
|
|
|
|
|
class GuestScaling(DefaultOnToggle):
|
|
"""Makes the dungeon guests (Bidoof in Cragy Coast, Grovyle in Hidden Land, etc.) scale to your party level
|
|
Does nothing if Level scaling is off"""
|
|
|
|
display_name = "Guest Scaling"
|
|
|
|
|
|
class StarterOption(Choice):
|
|
"""How would you like your starter and partner to be chosen?
|
|
Vanilla: You do the quiz and are stuck with what the quiz gives you. Choose your partner as normal
|
|
Random: Both your MC and partner will be completely random. This means they can be the same type
|
|
WARNING: game is not balanced for same type team, use at your own risk (until we fix typesanity)
|
|
Override: Do the quiz, but you can override the hero it gives you. Choose your partner as normal
|
|
Choose: Skip the quiz and go straight to choosing your starter and partner
|
|
For both Choose and Override you will be able to pick partner exclusive pokemon for your starter as well as gender
|
|
exclusive pokemon regardless of gender"""
|
|
|
|
display_name = "Starter Choice Option"
|
|
option_vanilla = 0
|
|
option_random_starter = 1
|
|
option_override = 2
|
|
option_choose = 3
|
|
default = 2
|
|
|
|
|
|
class TypeSanity(Toggle):
|
|
"""Allow for your partner to share a type with your main character
|
|
WARNING: The game is not balanced around this, and we have not done anything to change that.
|
|
Use at your own risk
|
|
"""
|
|
|
|
display_name = "Type Sanity"
|
|
|
|
|
|
class SpecialEpisodeSanity(Toggle):
|
|
"""Start the game with one of the special episodes and NOT the main game.
|
|
Unlock the main game through an item
|
|
Overridden by Excluding Special Episodes"""
|
|
|
|
display_name = "Special Episode Sanity"
|
|
|
|
|
|
class ExcludeSpecialEpisodes(Toggle):
|
|
"""No special episode items will be added to the game
|
|
Overrides Special Episode Sanity"""
|
|
|
|
display_name = "Exclude Special Episodes"
|
|
|
|
|
|
class IqScaling(Range):
|
|
"""Do you want to scale IQ to gain IQ faster? What rate? (1x, 2x, 3x, etc.)
|
|
WARNING: 0x WILL NOT GIVE YOU ANY IQ. USE AT YOUR OWN RISK
|
|
"""
|
|
|
|
display_name = "IQ Scaling"
|
|
range_start = 0
|
|
range_end = 15
|
|
default = 2
|
|
|
|
|
|
class XpScaling(Range):
|
|
"""Do you want to scale XP to gain XP faster? What rate? (1x, 2x, 3x, etc.)
|
|
WARNING: 0x WILL NOT GIVE YOU ANY XP. USE AT YOUR OWN RISK
|
|
"""
|
|
|
|
display_name = "XP Scaling"
|
|
range_start = 0
|
|
range_end = 15
|
|
default = 2
|
|
|
|
|
|
class SkyPeakType(Choice):
|
|
"""How do you want sky peak to work?
|
|
1: Progressive (unlock dungeons sequentially when you pick up a sky peak item)
|
|
2. All Random (unlock sky peak dungeons completely at random based on which sky peak item you pick up)
|
|
3: All unlocked from one item (there will be one sky peak item that unlocks all sky peak checks)"""
|
|
|
|
display_name = "Sky Peak Type"
|
|
option_progressive = 1
|
|
option_all_random = 2
|
|
option_unlock_all = 3
|
|
default = 1
|
|
|
|
|
|
class DojoDungeons(NamedRange):
|
|
"""How many dojo dungeons should be accessible at start?"""
|
|
|
|
display_name = "Dojo Dungeons Randomized"
|
|
range_start = 0
|
|
range_end = 10
|
|
special_range_names = {
|
|
"all_open": 10,
|
|
"all_random": 0,
|
|
"start_with_three": 3,
|
|
"start_with_one": 1,
|
|
}
|
|
default = 3
|
|
|
|
|
|
class LegendariesInPool(Range):
|
|
"""How many Legendary Pokemon should be in the item pool for you to recruit?
|
|
The Legendary will only come post-dialga if you get it early
|
|
Legendaries are disabled if you are going for a dialga goal
|
|
"""
|
|
|
|
display_name = "Legendaries in Item Pool"
|
|
range_start = 0
|
|
range_end = 21
|
|
default = 3
|
|
|
|
|
|
class AllowedLegendaries(OptionSet):
|
|
"""Set which Legendaries will be available for the item pool as recruits.
|
|
NOTE: legendaries normally found in dungeons are not yet randomized. This only includes legendary recruits at the ends of dungeons
|
|
"""
|
|
|
|
display_name = "Allowed Legendary Recruits"
|
|
valid_keys = [
|
|
"Regirock",
|
|
"Regice",
|
|
"Registeel",
|
|
"Groudon",
|
|
"Uxie",
|
|
"Mesprit",
|
|
"Azelf",
|
|
"Dialga",
|
|
"Palkia",
|
|
"Regigigas",
|
|
"Giratina",
|
|
"Celebi",
|
|
"Articuno",
|
|
"Heatran",
|
|
"Primal Dialga",
|
|
"Mew",
|
|
"Phione",
|
|
"Cresselia",
|
|
"Rayquaza",
|
|
"Kyogre",
|
|
"Shaymin",
|
|
]
|
|
default = valid_keys.copy()
|
|
|
|
|
|
class DeathlinkType(Toggle):
|
|
"""What type of deathlink do you want?
|
|
Currently False is death even if you have revival seeds
|
|
True will die and recover from revival seeds"""
|
|
|
|
display_name = "Deathlink Type"
|
|
|
|
|
|
class AllowTraps(Choice):
|
|
"""Would you like to allow traps in the filler items of the game?
|
|
0: No traps allowed
|
|
1: regular traps allowed, nothing too crazy
|
|
2: mean traps allowed (possibility of getting two traps at the same time *unown sentry duty*)
|
|
MEAN TRAPS NOT CURRENTLY IMPLEMENTED CURRENTLY 1 AND 2 DO THE SAME THING WHICH IS JUST ENABLE TRAPS"""
|
|
|
|
display_name = "Allow Traps"
|
|
option_disabled = 0
|
|
option_regular = 1
|
|
option_mean = 2
|
|
|
|
|
|
class InvisibleTraps(Toggle):
|
|
"""Make all traps invisible so when they come in from the client you don't know what happens until you get the trap
|
|
activated
|
|
NOT YET IMPLEMENTED"""
|
|
|
|
display_name = "Invisible Traps"
|
|
|
|
|
|
class TrapPercentage(Range):
|
|
"""What percentage of filler items should be traps? Range from 0 to 100 (affected by allowed traps)"""
|
|
|
|
display_name = "Trap Percentage"
|
|
range_start = 0
|
|
range_end = 100
|
|
default = 20
|
|
|
|
|
|
class CursedAegisCave(Toggle):
|
|
"""Do you want Aegis cave to logically require you to beat a regi you don't have a seal for?"""
|
|
|
|
display_name = "Cursed Aegis Cave"
|
|
|
|
|
|
class LongLocationsInclusion(Toggle):
|
|
"""Include Rule dungeons, clearing all dojos, final dojo, ludicolo dance,
|
|
and duskull bank checks over 20k in logic"""
|
|
|
|
display_name = "Long Locations"
|
|
|
|
|
|
class EarlyMissionFloors(DefaultOnToggle):
|
|
"""Allow missions to start on floor 2 of dungeons instead on (floors/2)"""
|
|
|
|
display_name = "Mission on Early Floors"
|
|
|
|
|
|
class MoveShortcutMenu(DefaultOnToggle):
|
|
"""Enable the Move Shortcut Menu by holding (default L button)
|
|
Disabling this current is not implemented ROMSide"""
|
|
|
|
display_name = "Move Shortcut Menu"
|
|
|
|
|
|
class MaxRequiredRank(Choice):
|
|
"""What is the maximum required rank you want to be logically necessary
|
|
If your goal is dialga and your max rank is above master rank, your max will be set to master rank"""
|
|
|
|
display_name = "Max Required Rank"
|
|
option_disabled = 0
|
|
option_bronze = 1
|
|
option_silver = 2
|
|
option_gold = 3
|
|
option_diamond = 4
|
|
option_super = 5
|
|
option_ultra = 6
|
|
option_hyper = 7
|
|
option_master = 8
|
|
option_master_1star = 9
|
|
option_master_2star = 10
|
|
option_master_3star = 11
|
|
option_guildmaster = 12
|
|
|
|
|
|
@dataclass
|
|
class EOSOptions(PerGameCommonOptions):
|
|
start_inventory_from_pool: StartInventoryPool
|
|
goal: Goal
|
|
required_fragments: FragmentShards
|
|
total_shards: ExtraShards
|
|
req_instruments: RequiredInstruments
|
|
total_instruments: ExtraInstruments
|
|
recruit: Recruitment
|
|
recruit_evo: RecruitmentEvolution
|
|
team_form: FullTeamFormationControl
|
|
hero_evolution: HeroEvolution
|
|
bag_on_start: StartWithBag
|
|
dojo_dungeons: DojoDungeons
|
|
early_mission_checks: EarlyMissionChecks
|
|
late_mission_checks: LateMissionChecks
|
|
early_outlaw_checks: EarlyOutlawChecks
|
|
late_outlaw_checks: LateOutlawChecks
|
|
type_sanity: TypeSanity
|
|
starter_option: StarterOption
|
|
iq_scaling: IqScaling
|
|
xp_scaling: XpScaling
|
|
level_scale: LevelScaling
|
|
guest_scaling: GuestScaling
|
|
deathlink: DeathLink
|
|
deathlink_type: DeathlinkType
|
|
legendaries: LegendariesInPool
|
|
allowed_legendaries: AllowedLegendaries
|
|
special_episode_sanity: SpecialEpisodeSanity
|
|
exclude_special: ExcludeSpecialEpisodes
|
|
sky_peak_type: SkyPeakType
|
|
allow_traps: AllowTraps
|
|
invisible_traps: InvisibleTraps
|
|
trap_percent: TrapPercentage
|
|
long_location: LongLocationsInclusion
|
|
cursed_aegis_cave: CursedAegisCave
|
|
early_mission_floors: EarlyMissionFloors
|
|
move_shortcuts: MoveShortcutMenu
|
|
spinda_drinks: SpindaBasicDrinks
|
|
drink_events: SpindaDrinkEvents
|
|
max_rank: MaxRequiredRank
|