from Options import Choice, FreeText, ItemsAccessibility, Toggle, Range, PerGameCommonOptions from dataclasses import dataclass class Logic(Choice): """Placement logic sets the rules that will be applied when placing items. Friendly: Required Items to clear a dungeon will never be placed in that dungeon to avoid the need to revisit it. Also, the Magic Mirror and the Mask will always be available before Ice Pyramid and Volcano, respectively. Note: If Dungeons are shuffled, Friendly logic will only ensure the availability of the Mirror and the Mask. Standard: Items are randomly placed and logic merely verifies that they're all accessible. As for Region access, only the Coins are considered. Expert: Same as Standard, but Items Placement logic also includes other routes than Coins: the Crests Teleporters, the Fireburg-Aquaria Lava bridge and the Sealed Temple Exit trick.""" option_friendly = 0 option_standard = 1 option_expert = 2 default = 1 display_name = "Logic" class BrownBoxes(Choice): """Include the 201 brown box locations from the original game. Brown Boxes are all the boxes that contained a consumable in the original game. If shuffle is chosen, the consumables contained will be shuffled but the brown boxes will not be Archipelago location checks.""" option_exclude = 0 option_include = 1 option_shuffle = 2 default = 1 display_name = "Brown Boxes" class SkyCoinMode(Choice): """Configure how the Sky Coin is acquired. With standard, the Sky Coin will be placed randomly. With Start With, the Sky Coin will be in your inventory at the start of the game. With Save The Crystals, the Sky Coin will be acquired once you save all 4 crystals. With Shattered Sky Coin, the Sky Coin is split in 40 fragments; you can enter Doom Castle once the required amount is found. Shattered Sky Coin will force brown box locations to be included.""" option_standard = 0 option_start_with = 1 option_save_the_crystals = 2 option_shattered_sky_coin = 3 default = 0 display_name = "Sky Coin Mode" class ShatteredSkyCoinQuantity(Choice): """Configure the number of the 40 Sky Coin Fragments required to enter the Doom Castle. Only has an effect if Sky Coin Mode is set to shattered. Low: 16. Mid: 24. High: 32. Random Narrow: random between 16 and 32. Random Wide: random between 10 and 38.""" option_low_16 = 0 option_mid_24 = 1 option_high_32 = 2 option_random_narrow = 3 option_random_wide = 4 default = 1 display_name = "Shattered Sky Coin" class StartingWeapon(Choice): """Choose your starting weapon.""" display_name = "Starting Weapon" option_steel_sword = 0 option_axe = 1 option_cat_claw = 2 option_bomb = 3 default = "random" class ProgressiveGear(Toggle): """Pieces of gear are always acquired from weakest to strongest in a set.""" display_name = "Progressive Gear" class EnemiesDensity(Choice): """Set how many of the original enemies are on each map.""" display_name = "Enemies Density" option_all = 0 option_three_quarter = 1 option_half = 2 option_quarter = 3 option_none = 4 class EnemyScaling(Choice): """Superclass for enemy scaling options.""" option_quarter = 0 option_half = 1 option_three_quarter = 2 option_normal = 3 option_one_and_quarter = 4 option_one_and_half = 5 option_double = 6 option_double_and_half = 7 option_triple = 8 class EnemiesScalingLower(EnemyScaling): """Randomly adjust enemies stats by the selected range percentage. Include mini-bosses' weaker clones.""" display_name = "Enemies Scaling Lower" default = 0 class EnemiesScalingUpper(EnemyScaling): """Randomly adjust enemies stats by the selected range percentage. Include mini-bosses' weaker clones.""" display_name = "Enemies Scaling Upper" default = 4 class BossesScalingLower(EnemyScaling): """Randomly adjust bosses stats by the selected range percentage. Include Mini-Bosses, Bosses, Bosses' refights and the Dark King.""" display_name = "Bosses Scaling Lower" default = 0 class BossesScalingUpper(EnemyScaling): """Randomly adjust bosses stats by the selected range percentage. Include Mini-Bosses, Bosses, Bosses' refights and the Dark King.""" display_name = "Bosses Scaling Upper" default = 4 class EnemizerAttacks(Choice): """Shuffles enemy attacks. Standard: No shuffle. Safe: Randomize every attack but leave out self-destruct and Dark King attacks. Chaos: Randomize and include self-destruct and Dark King attacks. Self Destruct: Every enemy self-destructs. Simple Shuffle: Instead of randomizing, shuffle one monster's attacks to another. Dark King is left vanilla.""" display_name = "Enemizer Attacks" option_normal = 0 option_safe = 1 option_chaos = 2 option_self_destruct = 3 option_simple_shuffle = 4 default = 0 class EnemizerGroups(Choice): """Set which enemy groups will be affected by Enemizer.""" display_name = "Enemizer Groups" option_mobs_only = 0 option_mobs_and_bosses = 1 option_mobs_bosses_and_dark_king = 2 default = 1 class ShuffleResWeakType(Toggle): """Resistance and Weakness types are shuffled for all enemies.""" display_name = "Shuffle Resistance/Weakness Types" default = 0 class ShuffleEnemiesPositions(Toggle): """Instead of their original position in a given map, enemies are randomly placed.""" display_name = "Shuffle Enemies' Positions" default = 1 class ProgressiveFormations(Choice): """Enemies' formations are selected by regions, with the weakest formations always selected in Foresta and the strongest in Windia. Disabled: Standard formations are used. Regions Strict: Formations will come exclusively from the current region, whatever the map is. Regions Keep Type: Formations will keep the original formation type and match with the nearest power level.""" display_name = "Progressive Formations" option_disabled = 0 option_regions_strict = 1 option_regions_keep_type = 2 class DoomCastle(Choice): """Configure how you reach the Dark King. With Standard, you need to defeat all four bosses and their floors to reach the Dark King. With Boss Rush, only the bosses are blocking your way in the corridor to the Dark King's room. With Dark King Only, the way to the Dark King is free of any obstacle.""" display_name = "Doom Castle" option_standard = 0 option_boss_rush = 1 option_dark_king_only = 2 class DoomCastleShortcut(Toggle): """Create a shortcut granting access from the start to Doom Castle at Focus Tower's entrance. Also modify the Desert floor, so it can be navigated without the Mega Grenades and the Dragon Claw.""" display_name = "Doom Castle Shortcut" class TweakFrustratingDungeons(Toggle): """Make some small changes to a few of the most annoying dungeons. Ice Pyramid: Add 3 shortcuts on the 1st floor. Giant Tree: Add shortcuts on the 1st and 4th floors and curtail mushrooms population. Pazuzu's Tower: Staircases are devoid of enemies (regardless of Enemies Density settings).""" display_name = "Tweak Frustrating Dungeons" class MapShuffle(Choice): """None: No shuffle. Overworld: Only shuffle the Overworld locations. Dungeons: Only shuffle the dungeons' floors amongst themselves. Temples and Towns aren't included. Overworld And Dungeons: Shuffle the Overworld and dungeons at the same time. Everything: Shuffle the Overworld, dungeons, temples and towns all amongst each others. When dungeons are shuffled, defeating Pazuzu won't teleport you to the 7th floor, you have to get there normally to save the Crystal and get Pazuzu's Chest.""" display_name = "Map Shuffle" option_none = 0 option_overworld = 1 option_dungeons = 2 option_overworld_and_dungeons = 3 option_everything = 4 default = 0 class CrestShuffle(Toggle): """Shuffle the Crest tiles amongst themselves.""" display_name = "Crest Shuffle" class MapShuffleSeed(FreeText): """If this is a number, it will be used as a set seed number for Map, Crest, Battlefield Reward, and Companion shuffles. If this is "random" the seed will be chosen randomly. If it is any other text, it will be used as a seed group name. All players using the same seed group name will get the same shuffle results, as long as their Map Shuffle, Crest Shuffle, Shuffle Battlefield Rewards, Companion Shuffle, and Kaeli's Mom settings are the same.""" display_name = "Map Shuffle Seed" default = "random" class LevelingCurve(Choice): """Adjust the level gain rate.""" display_name = "Leveling Curve" option_half = 0 option_normal = 1 option_one_and_half = 2 option_double = 3 option_double_and_half = 4 option_triple = 5 option_quadruple = 6 default = 4 class ShuffleBattlefieldRewards(Toggle): """Shuffle the type of reward (Item, XP, GP) given by battlefields and color code them by reward type. Blue: Give an item. Grey: Give XP. Green: Give GP.""" display_name = "Shuffle Battlefield Rewards" class BattlefieldsBattlesQuantities(Choice): """Adjust the number of battles that need to be fought to get a battlefield's reward.""" display_name = "Battlefields Battles Quantity" option_ten = 0 option_seven = 1 option_five = 2 option_three = 3 option_one = 4 option_random_one_through_five = 5 option_random_one_through_ten = 6 class CompanionLevelingType(Choice): """Set how companions gain levels. Quests: Complete each companion's individual quest for them to promote to their second version. Quests Extended: Each companion has four exclusive quests, leveling each time a quest is completed. Save the Crystals (All): Each time a Crystal is saved, all companions gain levels. Save the Crystals (Individual): Each companion will level to their second version when a specific Crystal is saved. Benjamin Level: Companions' level tracks Benjamin's.""" option_quests = 0 option_quests_extended = 1 option_save_crystals_individual = 2 option_save_crystals_all = 3 option_benjamin_level = 4 option_benjamin_level_plus_5 = 5 option_benjamin_level_plus_10 = 6 default = 0 display_name = "Companion Leveling Type" class CompanionSpellbookType(Choice): """Update companions' spellbook. Standard: Original game spellbooks. Extended: Add some extra spells. Tristam gains Exit and Quake and Reuben gets Blizzard. Random Balanced: Randomize the spellbooks with an appropriate mix of spells. Random Chaos: Randomize the spellbooks in total free-for-all.""" option_standard = 0 option_extended = 1 option_random_balanced = 2 option_random_chaos = 3 default = 0 display_name = "Companion Spellbook Type" class StartingCompanion(Choice): """Set a companion to start with. Random Companion: Randomly select one companion. Random Plus None: Randomly select a companion, with the possibility of none selected.""" display_name = "Starting Companion" default = 0 option_none = 0 option_kaeli = 1 option_tristam = 2 option_phoebe = 3 option_reuben = 4 option_random_companion = 5 option_random_plus_none = 6 class AvailableCompanions(Range): """Select randomly which companions will join your party. Unavailable companions can still be reached to get their items and complete their quests if needed. Note: If a Starting Companion is selected, it will always be available, regardless of this setting.""" display_name = "Available Companions" default = 4 range_start = 0 range_end = 4 class CompanionsLocations(Choice): """Set the primary location of companions. Their secondary location is always the same. Standard: Companions will be at the same locations as in the original game. Shuffled: Companions' locations are shuffled amongst themselves. Shuffled Extended: Add all the Temples, as well as Phoebe's House and the Rope Bridge as possible locations.""" display_name = "Companions' Locations" default = 0 option_standard = 0 option_shuffled = 1 option_shuffled_extended = 2 class KaelisMomFightsMinotaur(Toggle): """Transfer Kaeli's requirements (Tree Wither, Elixir) and the two items she's giving to her mom. Kaeli will be available to join the party right away without the Tree Wither.""" display_name = "Kaeli's Mom Fights Minotaur" default = 0 @dataclass class FFMQOptions(PerGameCommonOptions): accessibility: ItemsAccessibility logic: Logic brown_boxes: BrownBoxes sky_coin_mode: SkyCoinMode shattered_sky_coin_quantity: ShatteredSkyCoinQuantity starting_weapon: StartingWeapon progressive_gear: ProgressiveGear leveling_curve: LevelingCurve starting_companion: StartingCompanion available_companions: AvailableCompanions companions_locations: CompanionsLocations kaelis_mom_fight_minotaur: KaelisMomFightsMinotaur companion_leveling_type: CompanionLevelingType companion_spellbook_type: CompanionSpellbookType enemies_density: EnemiesDensity enemies_scaling_lower: EnemiesScalingLower enemies_scaling_upper: EnemiesScalingUpper bosses_scaling_lower: BossesScalingLower bosses_scaling_upper: BossesScalingUpper enemizer_attacks: EnemizerAttacks enemizer_groups: EnemizerGroups shuffle_res_weak_types: ShuffleResWeakType shuffle_enemies_position: ShuffleEnemiesPositions progressive_formations: ProgressiveFormations doom_castle_mode: DoomCastle doom_castle_shortcut: DoomCastleShortcut tweak_frustrating_dungeons: TweakFrustratingDungeons map_shuffle: MapShuffle crest_shuffle: CrestShuffle shuffle_battlefield_rewards: ShuffleBattlefieldRewards map_shuffle_seed: MapShuffleSeed battlefields_battles_quantities: BattlefieldsBattlesQuantities