class PokeBattle_Pokemon attr_reader(:totalhp) attr_reader(:attack) attr_reader(:defense) attr_reader(:speed) attr_reader(:spatk) attr_reader(:spdef) attr_reader(:iv) attr_reader(:species) attr_reader(:personalID) attr_accessor(:trainerID) attr_accessor(:hp) attr_accessor(:level) attr_accessor(:pokerus) # Three states: Not infected, infected, cured attr_accessor(:item) attr_accessor(:ot) attr_accessor(:name) attr_accessor(:exp) attr_accessor(:happiness) attr_accessor(:status) attr_accessor(:statusCount) attr_accessor(:ev) attr_accessor(:eggsteps) attr_accessor(:moves) def nature return @personalID%25 end #TODO: Unown shapes def ability abil=@personalID&1 dexdata=File.open("PBS/dexdata.dat","rb") dexdata.pos=76*(@species-1)+29 ret1=dexdata.fgetb ret2=dexdata.fgetb ret=ret1 if abil==1 ret=ret2 if ret2!=0 end dexdata.close return ret end def gender case @genderbyte when 255 return 2 # genderless when 254 return 1 # always female else lowbyte=@personalID&0xFF return (lowbyte<@genderbyte) ? 1 : 0 end end def isShiny? a=personalID^trainerID b=a&0xFFFF c=(a>>16)&0xFFFF d=b^c return (d<8) end def calcHP(base,level,iv,ev) return 1 if base==1 return ((base*2+iv+(ev>>2)).floor*level/100).floor+level+10 end def calcStat(base,level,iv,ev,pv) return ((((base*2+iv+(ev>>2))*level/100).floor+5)*pv/100).floor end def growthrate dexdata=File.open("PBS/dexdata.dat","rb") dexdata.pos=76*(@species-1)+20 ret=dexdata.fgetb dexdata.close return ret end def type1 dexdata=File.open("PBS/dexdata.dat","rb") dexdata.pos=76*(@species-1)+8 ret=dexdata.fgetb dexdata.close return ret end def type2 dexdata=File.open("PBS/dexdata.dat","rb") dexdata.pos=76*(@species-1)+9 ret=dexdata.fgetb dexdata.close return ret end def heal @hp=@totalhp @status=0 @statusCount=0 for i in i..3 @moves[i].pp=@moves[i].totalpp end end def calcStats nature=@personalID%25 stats=[] pvalues=[100,100,100,100,100] nd5=(nature/5).floor nm5=(nature%5).floor if nd5!=nm5 pvalues[nd5]=110 pvalues[nm5]=90 end dexdata=File.open("PBS/dexdata.dat","rb") dexdata.pos=76*(@species-1)+10 for i in 0..5 base=dexdata.fgetb if i==0 stats[i]=calcHP(base,@level,@iv[i],@ev[i]) else stats[i]=calcStat(base,@level,@iv[i],@ev[i],pvalues[i-1]) end end dexdata.close diff=@totalhp-@hp @totalhp=stats[0] @hp=@totalhp-diff @attack=stats[1] @defense=stats[2] @speed=stats[3] @spatk=stats[4] @spdef=stats[5] end def totalpp(move,ppup) movedata=File.open("PBS/rsattacks.dat","rb") movedata.pos=move*9+4 ret=movedata.fgetb movedata.close ret+=(ret*ppup/5).floor return ret end def initialize(species,level,player=nil) @ev=[0,0,0,0,0,0] if species<1||species>386 raise ArgumentError.new("The species number is invalid.") return nil end if level<1||level>100 raise ArgumentError.new("The level number is invalid.") return nil end @species=species @level=level # Individual Values @hp=0 @totalhp=0 @iv=[] dexdata=File.open("PBS/dexdata.dat","rb") dexdata.pos=76*(species-1)+19 @happiness=dexdata.fgetb dexdata.pos=76*(species-1)+18 @genderbyte=dexdata.fgetb dexdata.pos=76*(species-1)+29 ability1=dexdata.fgetb ability2=dexdata.fgetb dexdata.close @iv[0]=rand(32) @iv[1]=rand(32) @iv[2]=rand(32) @iv[3]=rand(32) @iv[4]=rand(32) @iv[5]=rand(32) @personalID=rand(256) @personalID|=rand(256)<<8 @personalID|=rand(256)<<16 @personalID|=rand(256)<<24 if ability2==0 personalID&=~1 # Clear LSB if second ability is blank end namefile=File.open("PBS/strNameEN.dat","rb") @name=namefile.readName(@species) namefile.close calcStats @hp=@totalhp @eggsteps=0 @status=0 @statusCount=0 @item=0 @exp=PBExperience.pbGetStartExperience(level,self.growthrate) atkdata=File.open("PBS/attacksRS.dat","rb") offset=atkdata.getOffset(species-1) length=atkdata.getLength(species-1)>>1 atkdata.pos=offset # Generating move list movelist=[] for i in 0..length-1 alevel=atkdata.fgetw move=atkdata.fgetw if alevel<=@level movelist[movelist.length]=move end end atkdata.close # Use the last 4 items in the move list listend=movelist.length-4 listend=0 if listend<0 j=0 @pokerus=0 @moves=[] #TODO: Avoid duplicates for i in listend..listend+3 moveid=(i>=movelist.length) ? 0 : movelist[i] @moves[j]=PBMove.new(moveid) j+=1 end if player @trainerID=player.id @ot=player.name end end end