""" Option definitions for Pokemon Emerald """ from dataclasses import dataclass from typing import Dict, Type from Options import Choice, DefaultOnToggle, Option, OptionSet, Range, Toggle, FreeText, PerGameCommonOptions from .data import data class Goal(Choice): """ Determines what your goal is to consider the game beaten Champion: Become the champion and enter the hall of fame Steven: Defeat Steven in Meteor Falls Norman: Defeat Norman in Petalburg Gym """ display_name = "Goal" default = 0 option_champion = 0 option_steven = 1 option_norman = 2 class RandomizeBadges(Choice): """ Adds Badges to the pool Vanilla: Gym leaders give their own badge Shuffle: Gym leaders give a random badge Completely Random: Badges can be found anywhere """ display_name = "Randomize Badges" default = 2 option_vanilla = 0 option_shuffle = 1 option_completely_random = 2 class RandomizeHms(Choice): """ Adds HMs to the pool Vanilla: HMs are at their vanilla locations Shuffle: HMs are shuffled among vanilla HM locations Completely Random: HMs can be found anywhere """ display_name = "Randomize HMs" default = 2 option_vanilla = 0 option_shuffle = 1 option_completely_random = 2 class RandomizeKeyItems(DefaultOnToggle): """ Adds most key items to the pool. These are usually required to unlock a location or region (e.g. Devon Scope, Letter, Basement Key) """ display_name = "Randomize Key Items" class RandomizeBikes(Toggle): """ Adds the mach bike and acro bike to the pool """ display_name = "Randomize Bikes" class RandomizeRods(Toggle): """ Adds fishing rods to the pool """ display_name = "Randomize Fishing Rods" class RandomizeOverworldItems(DefaultOnToggle): """ Adds items on the ground with a Pokeball sprite to the pool """ display_name = "Randomize Overworld Items" class RandomizeHiddenItems(Toggle): """ Adds hidden items to the pool """ display_name = "Randomize Hidden Items" class RandomizeNpcGifts(Toggle): """ Adds most gifts received from NPCs to the pool (not including key items or HMs) """ display_name = "Randomize NPC Gifts" class ItemPoolType(Choice): """ Determines which non-progression items get put into the item pool Shuffled: Item pool consists of shuffled vanilla items Diverse Balanced: Item pool consists of random items approximately proportioned according to what they're replacing (i.e. more pokeballs, fewer X items, etc...) Diverse: Item pool consists of uniformly random (non-unique) items """ display_name = "Item Pool Type" default = 0 option_shuffled = 0 option_diverse_balanced = 1 option_diverse = 2 class HiddenItemsRequireItemfinder(DefaultOnToggle): """ The Itemfinder is logically required to pick up hidden items """ display_name = "Require Itemfinder" class DarkCavesRequireFlash(DefaultOnToggle): """ The lower floors of Granite Cave and Victory Road logically require use of HM05 Flash """ display_name = "Require Flash" class EnableFerry(Toggle): """ The ferry between Slateport, Lilycove, and the Battle Frontier can be used if you have the S.S. Ticket """ display_name = "Enable Ferry" class EliteFourRequirement(Choice): """ Sets the requirements to challenge the elite four Badges: Obtain some number of badges Gyms: Defeat some number of gyms """ display_name = "Elite Four Requirement" default = 0 option_badges = 0 option_gyms = 1 class EliteFourCount(Range): """ Sets the number of badges/gyms required to challenge the elite four """ display_name = "Elite Four Count" range_start = 0 range_end = 8 default = 8 class NormanRequirement(Choice): """ Sets the requirements to challenge the Petalburg Gym Badges: Obtain some number of badges Gyms: Defeat some number of gyms """ display_name = "Norman Requirement" default = 0 option_badges = 0 option_gyms = 1 class NormanCount(Range): """ Sets the number of badges/gyms required to challenge the Petalburg Gym """ display_name = "Norman Count" range_start = 0 range_end = 7 default = 4 class RandomizeWildPokemon(Choice): """ Randomizes wild pokemon encounters (grass, caves, water, fishing) Vanilla: Wild encounters are unchanged Match Base Stats: Wild pokemon are replaced with species with approximately the same bst Match Type: Wild pokemon are replaced with species that share a type with the original Match Base Stats and Type: Apply both Match Base Stats and Match Type Completely Random: There are no restrictions """ display_name = "Randomize Wild Pokemon" default = 0 option_vanilla = 0 option_match_base_stats = 1 option_match_type = 2 option_match_base_stats_and_type = 3 option_completely_random = 4 class AllowWildLegendaries(DefaultOnToggle): """ Wild encounters can be replaced by legendaries. Only applied if Randomize Wild Pokemon is not Vanilla. """ display_name = "Allow Wild Legendaries" class RandomizeStarters(Choice): """ Randomizes the starter pokemon in Professor Birch's bag Vanilla: Starters are unchanged Match Base Stats: Starters are replaced with species with approximately the same bst Match Type: Starters are replaced with species that share a type with the original Match Base Stats and Type: Apply both Match Base Stats and Match Type Completely Random: There are no restrictions """ display_name = "Randomize Starters" default = 0 option_vanilla = 0 option_match_base_stats = 1 option_match_type = 2 option_match_base_stats_and_type = 3 option_completely_random = 4 class AllowStarterLegendaries(DefaultOnToggle): """ Starters can be replaced by legendaries. Only applied if Randomize Starters is not Vanilla. """ display_name = "Allow Starter Legendaries" class RandomizeTrainerParties(Choice): """ Randomizes the parties of all trainers. Vanilla: Parties are unchanged Match Base Stats: Trainer pokemon are replaced with species with approximately the same bst Match Type: Trainer pokemon are replaced with species that share a type with the original Match Base Stats and Type: Apply both Match Base Stats and Match Type Completely Random: There are no restrictions """ display_name = "Randomize Trainer Parties" default = 0 option_vanilla = 0 option_match_base_stats = 1 option_match_type = 2 option_match_base_stats_and_type = 3 option_completely_random = 4 class AllowTrainerLegendaries(DefaultOnToggle): """ Enemy trainer pokemon can be replaced by legendaries. Only applied if Randomize Trainer Parties is not Vanilla. """ display_name = "Allow Trainer Legendaries" class RandomizeStaticEncounters(Choice): """ Randomizes static encounters (Rayquaza, hidden Kekleons, fake Voltorb pokeballs, etc...) Vanilla: Static encounters are unchanged Shuffle: Static encounters are shuffled between each other Match Base Stats: Static encounters are replaced with species with approximately the same bst Match Type: Static encounters are replaced with species that share a type with the original Match Base Stats and Type: Apply both Match Base Stats and Match Type Completely Random: There are no restrictions """ display_name = "Randomize Static Encounters" default = 0 option_vanilla = 0 option_shuffle = 1 option_match_base_stats = 2 option_match_type = 3 option_match_base_stats_and_type = 4 option_completely_random = 5 class RandomizeTypes(Choice): """ Randomizes the type(s) of every pokemon. Each species will have the same number of types. Vanilla: Types are unchanged Shuffle: Types are shuffled globally for all species (e.g. every Water-type pokemon becomes Fire-type) Completely Random: Each species has its type(s) randomized Follow Evolutions: Types are randomized per evolution line instead of per species """ display_name = "Randomize Types" default = 0 option_vanilla = 0 option_shuffle = 1 option_completely_random = 2 option_follow_evolutions = 3 class RandomizeAbilities(Choice): """ Randomizes abilities of every species. Each species will have the same number of abilities. Vanilla: Abilities are unchanged Completely Random: Each species has its abilities randomized Follow Evolutions: Abilities are randomized, but if a pokemon would normally retain its ability when evolving, the random ability will also be retained """ display_name = "Randomize Abilities" default = 0 option_vanilla = 0 option_completely_random = 1 option_follow_evolutions = 2 class AbilityBlacklist(OptionSet): """ A list of abilities which no pokemon should have if abilities are randomized. For example, you could exclude Wonder Guard and Arena Trap like this: ["Wonder Guard", "Arena Trap"] """ display_name = "Ability Blacklist" valid_keys = frozenset([ability.label for ability in data.abilities]) class LevelUpMoves(Choice): """ Randomizes the moves a pokemon learns when they reach a level where they would learn a move. Your starter is guaranteed to have a usable damaging move. Vanilla: Learnset is unchanged Randomized: Moves are randomized Start with Four Moves: Moves are randomized and all Pokemon know 4 moves at level 1 """ display_name = "Level Up Moves" default = 0 option_vanilla = 0 option_randomized = 1 option_start_with_four_moves = 2 class MoveMatchTypeBias(Range): """ Sets the probability that a learned move will be forced match one of the types of a pokemon. If a move is not forced to match type, it will roll for Normal type bias. """ display_name = "Move Match Type Bias" range_start = 0 range_end = 100 default = 0 class MoveNormalTypeBias(Range): """ After it has been decided that a move will not be forced to match types, sets the probability that a learned move will be forced to be the Normal type. If a move is not forced to be Normal, it will be completely random. """ display_name = "Move Normal Type Bias" range_start = 0 range_end = 100 default = 0 class HmCompatibility(Choice): """ Modifies the compatibility of HMs Vanilla: Compatibility is unchanged Fully Compatible: Every species can learn any HM Completely Random: Compatibility is 50/50 for every HM (does not remain consistent across evolution) """ display_name = "HM Compatibility" default = 1 option_vanilla = 0 option_fully_compatible = 1 option_completely_random = 2 class TmCompatibility(Choice): """ Modifies the compatibility of TMs Vanilla: Compatibility is unchanged Fully Compatible: Every species can learn any TM Completely Random: Compatibility is 50/50 for every TM (does not remain consistent across evolution) """ display_name = "TM Compatibility" default = 0 option_vanilla = 0 option_fully_compatible = 1 option_completely_random = 2 class TmMoves(Toggle): """ Randomizes the moves taught by TMs """ display_name = "TM Moves" class ReusableTms(Toggle): """ Sets TMs to not break after use (they remain sellable) """ display_name = "Reusable TMs" class MinCatchRate(Range): """ Sets the minimum catch rate a pokemon can have. Any pokemon with a catch rate below this floor will have it raised to this value. Legendaries are often in the single digits Fully evolved pokemon are often double digits Pidgey is 255 """ display_name = "Minimum Catch Rate" range_start = 3 range_end = 255 default = 3 class GuaranteedCatch(Toggle): """ Every throw is guaranteed to catch a wild pokemon """ display_name = "Guaranteed Catch" class ExpModifier(Range): """ Multiplies gained experience by a percentage 100 is default 50 is half 200 is double etc... """ display_name = "Exp Modifier" range_start = 0 range_end = 1000 default = 100 class BlindTrainers(Toggle): """ Causes trainers to not start a battle with you unless you talk to them """ display_name = "Blind Trainers" class DoubleBattleChance(Range): """ The percent chance that a trainer with more than 1 pokemon will be converted into a double battle. If these trainers would normally approach you, they will only do so if you have 2 unfainted pokemon. They can be battled by talking to them no matter what. """ display_name = "Double Battle Chance" range_start = 0 range_end = 100 default = 0 class BetterShops(Toggle): """ Pokemarts sell every item that can be obtained in a pokemart (except mail, which is still unique to the relevant city) """ display_name = "Better Shops" class RemoveRoadblocks(OptionSet): """ Removes specific NPCs that normally stand in your way until certain events are completed. This can open up the world a bit and make your playthrough less linear, but careful how many you remove; it may make too much of your world accessible upon receiving Surf. Possible values are: "Route 110 Aqua Grunts" "Route 112 Magma Grunts" "Route 119 Aqua Grunts" "Safari Zone Construction Workers" "Lilycove City Wailmer" "Aqua Hideout Grunts" "Seafloor Cavern Aqua Grunt" """ display_name = "Remove Roadblocks" valid_keys = frozenset([ "Route 110 Aqua Grunts", "Route 112 Magma Grunts", "Route 119 Aqua Grunts", "Safari Zone Construction Workers", "Lilycove City Wailmer", "Aqua Hideout Grunts", "Seafloor Cavern Aqua Grunt" ]) class ExtraBoulders(Toggle): """ Places strength boulders on Route 115 which block access to Meteor Falls from the beach. This aims to take some power away from Surf as a tool for access. """ display_name = "Extra Boulders" class FreeFlyLocation(Toggle): """ Enables flying to one random location when Mom gives you the running shoes (excluding cities reachable with no items) """ display_name = "Free Fly Location" class FlyWithoutBadge(DefaultOnToggle): """ Fly does not require the Feather Badge to use in the field """ display_name = "Fly Without Badge" class TurboA(Toggle): """ Holding A will advance most text automatically """ display_name = "Turbo A" class ReceiveItemMessages(Choice): """ Determines whether you receive an in-game notification when receiving an item. Items can still only be received in the overworld. All: Every item shows a message Progression: Only progression items show a message None: All items are added to your bag silently (badges will still show) """ display_name = "Receive Item Messages" default = 0 option_all = 0 option_progression = 1 option_none = 2 class EasterEgg(FreeText): """ ??? """ default = "Example Passphrase" @dataclass class PokemonEmeraldOptions(PerGameCommonOptions): goal: Goal badges: RandomizeBadges hms: RandomizeHms key_items: RandomizeKeyItems bikes: RandomizeBikes rods: RandomizeRods overworld_items: RandomizeOverworldItems hidden_items: RandomizeHiddenItems npc_gifts: RandomizeNpcGifts item_pool_type: ItemPoolType require_itemfinder: HiddenItemsRequireItemfinder require_flash: DarkCavesRequireFlash elite_four_requirement: EliteFourRequirement elite_four_count: EliteFourCount norman_requirement: NormanRequirement norman_count: NormanCount wild_pokemon: RandomizeWildPokemon allow_wild_legendaries: AllowWildLegendaries starters: RandomizeStarters allow_starter_legendaries: AllowStarterLegendaries trainer_parties: RandomizeTrainerParties allow_trainer_legendaries: AllowTrainerLegendaries static_encounters: RandomizeStaticEncounters types: RandomizeTypes abilities: RandomizeAbilities ability_blacklist: AbilityBlacklist level_up_moves: LevelUpMoves move_match_type_bias: MoveMatchTypeBias move_normal_type_bias: MoveNormalTypeBias tm_compatibility: TmCompatibility hm_compatibility: HmCompatibility tm_moves: TmMoves reusable_tms: ReusableTms min_catch_rate: MinCatchRate guaranteed_catch: GuaranteedCatch exp_modifier: ExpModifier blind_trainers: BlindTrainers double_battle_chance: DoubleBattleChance better_shops: BetterShops enable_ferry: EnableFerry remove_roadblocks: RemoveRoadblocks extra_boulders: ExtraBoulders free_fly_location: FreeFlyLocation fly_without_badge: FlyWithoutBadge turbo_a: TurboA receive_item_messages: ReceiveItemMessages easter_egg: EasterEgg