# This class stores data on each Pokémon. Refer to $Trainer.party for an array # of each Pokémon in the Trainer's current party. class PokeBattle_Pokemon attr_accessor :name # Nickname attr_reader :species # Species (National Pokedex number) attr_reader :exp # Current experience points attr_reader :hp # Current HP attr_reader :totalhp # Current Total HP attr_reader :attack # Current Attack stat attr_reader :defense # Current Defense stat attr_reader :speed # Current Speed stat attr_reader :spatk # Current Special Attack stat attr_reader :spdef # Current Special Defense stat attr_accessor :status # Status problem (PBStatuses) attr_accessor :statusCount # Sleep count/Toxic flag attr_accessor :abilityflag # Forces the first/second/hidden (0/1/2) ability attr_accessor :genderflag # Forces male (0) or female (1) attr_accessor :natureflag # Forces a particular nature attr_accessor :natureOverride # Overrides nature's stat-changing effects attr_accessor :shinyflag # Forces the shininess (true/false) attr_accessor :moves # Moves (PBMove) attr_accessor :firstmoves # The moves known when this Pokémon was obtained attr_accessor :item # Held item attr_writer :mail # Mail attr_accessor :fused # The Pokémon fused into this one attr_accessor :iv # Array of 6 Individual Values for HP, Atk, Def, # Speed, Sp Atk, and Sp Def attr_writer :ivMaxed # Array of booleans that max each IV value attr_accessor :ev # Effort Values attr_accessor :happiness # Current happiness attr_accessor :ballused # Ball used attr_accessor :eggsteps # Steps to hatch egg, 0 if Pokémon is not an egg attr_writer :markings # Markings attr_accessor :ribbons # Array of ribbons attr_accessor :pokerus # Pokérus strain and infection time attr_accessor :personalID # Personal ID attr_accessor :trainerID # 32-bit Trainer ID (the secret ID is in the upper # 16 bits) attr_accessor :obtainMode # Manner obtained: # 0 - met, 1 - as egg, 2 - traded, # 4 - fateful encounter attr_accessor :obtainMap # Map where obtained attr_accessor :obtainText # Replaces the obtain map's name if not nil attr_writer :obtainLevel # Level obtained attr_accessor :hatchedMap # Map where an egg was hatched attr_writer :language # Language attr_accessor :ot # Original Trainer's name attr_writer :otgender # Original Trainer's gender: # 0 - male, 1 - female, 2 - mixed, 3 - unknown # For information only, not used to verify # ownership of the Pokémon attr_writer :cool,:beauty,:cute,:smart,:tough,:sheen # Contest stats IV_STAT_LIMIT = 31 # Max total IVs EV_LIMIT = 510 # Max total EVs EV_STAT_LIMIT = 252 # Max EVs that a single stat can have MAX_POKEMON_NAME_SIZE = 10 # Maximum length a Pokémon's nickname can be #============================================================================= # Ownership, obtained information #============================================================================= # Returns the public portion of the original trainer's ID. def publicID return @trainerID&0xFFFF end # Returns whether the specified Trainer is NOT this Pokémon's original trainer. def foreign?(trainer) return @trainerID!=trainer.id || @ot!=trainer.name end alias isForeign? foreign? # Returns the gender of this Pokémon's original trainer (2=unknown). def otgender return @otgender || 2 end # Returns this Pokémon's level when this Pokémon was obtained. def obtainLevel return @obtainLevel || 0 end # Returns the time when this Pokémon was obtained. def timeReceived return @timeReceived ? Time.at(@timeReceived) : Time.gm(2000) end # Sets the time when this Pokémon was obtained (in seconds since Unix epoch). def timeReceived=(value) @timeReceived = value.to_i end # Returns the time when this Pokémon hatched. def timeEggHatched if obtainMode==1 return @timeEggHatched ? Time.at(@timeEggHatched) : Time.gm(2000) else return Time.gm(2000) end end # Sets the time when this Pokémon hatched (in seconds since Unix epoch). def timeEggHatched=(value) @timeEggHatched = value.to_i end #============================================================================= # Level #============================================================================= # Returns this Pokémon's level. def level @level = PBExperience.pbGetLevelFromExperience(@exp,self.growthrate) if !@level return @level end # Sets this Pokémon's level. def level=(value) if value<1 || value>PBExperience.maxLevel raise ArgumentError.new(_INTL("The level number ({1}) is invalid.",value)) end @level = value self.exp = PBExperience.pbGetStartExperience(value,self.growthrate) end # Sets this Pokémon's Exp. Points. def exp=(value) @exp = value @level = nil end # Returns whether this Pokémon is an egg. def egg? return @eggsteps>0 end alias isEgg? egg? # Returns this Pokémon's growth rate. def growthrate return pbGetSpeciesData(@species,formSimple,SpeciesGrowthRate) end # Returns this Pokémon's base Experience value. def baseExp return pbGetSpeciesData(@species,formSimple,SpeciesBaseExp) end # Returns a number between 0 and 1 indicating how much of the current level's # Exp this Pokémon has. def expFraction l = self.level return 0.0 if l>=PBExperience.maxLevel gr = self.growthrate startexp = PBExperience.pbGetStartExperience(l,gr) endexp = PBExperience.pbGetStartExperience(l+1,gr) return 1.0*(@exp-startexp)/(endexp-startexp) end #============================================================================= # Gender #============================================================================= # Returns this Pokémon's gender. 0=male, 1=female, 2=genderless def gender # Return sole gender option for all male/all female/genderless species genderRate = pbGetSpeciesData(@species,formSimple,SpeciesGenderRate) case genderRate when PBGenderRates::AlwaysMale; return 0 when PBGenderRates::AlwaysFemale; return 1 when PBGenderRates::Genderless; return 2 end # Return gender for species that can be male or female return @genderflag if @genderflag && (@genderflag==0 || @genderflag==1) return ((@personalID&0xFF)