Archipelago/worlds/pokemon_emerald/options.py

607 lines
17 KiB
Python
Raw Normal View History

"""
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