mirror of
https://github.com/MarioSpore/Grinch-AP.git
synced 2025-10-21 20:21:32 -06:00
Pokemon Emerald: Implement New Game (#1813)
This commit is contained in:
606
worlds/pokemon_emerald/options.py
Normal file
606
worlds/pokemon_emerald/options.py
Normal file
@@ -0,0 +1,606 @@
|
||||
"""
|
||||
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
|
||||
Reference in New Issue
Block a user