class PokeBattle_Battle ################################################################################ # Decide whether the opponent should switch Pokémon, and what to switch to. NEW ################################################################################ #if this function isn't here things break and i hate it. def pbDefaultChooseNewEnemy(index,party) return pbSwitchTo(@battlers[index],party,pbGetOwner(index).skill) end def pbShouldSwitch?(index) return false if !@opponent switchscore = 0 noswitchscore = 0 monarray = [] currentmon = @battlers[index] opponent1 = currentmon.pbOppositeOpposing opponent2 = opponent1.pbPartner party = pbParty(index) partyroles=[] skill=pbGetOwner(index).skill || 0 count = 0 for i in party next if i.nil? next if i.hp == 0 count+=1 end return false if count==1 if $game_switches[1000] && count==2 return false end count = 0 for i in 0..(party.length-1) next if !pbCanSwitchLax?(index,i,false) count+=1 end return false if count==0 count = -1 for i in party count+=1 next if i.nil? next if count == currentmon.pokemonIndex dummyarr1 = pbGetMonRole(i,opponent1,skill,count,party) (partyroles << dummyarr1).flatten! dummyarr2 = pbGetMonRole(i,opponent2,skill,count,party) (partyroles << dummyarr2).flatten! end partyroles.uniq! currentroles = pbGetMonRole(currentmon,opponent1,skill) aimem = getAIMemory(skill,opponent1.pokemonIndex) aimem2 = getAIMemory(skill,opponent2.pokemonIndex) # Statuses PBDebug.log(sprintf("Initial switchscore building: Statuses (%d)",switchscore)) if $INTERNAL if currentmon.effects[PBEffects::Curse] switchscore+=80 end if currentmon.effects[PBEffects::LeechSeed]>=0 switchscore+=60 end if currentmon.effects[PBEffects::Attract]>=0 switchscore+=60 end if currentmon.effects[PBEffects::Confusion]>0 switchscore+=80 end if currentmon.effects[PBEffects::PerishSong]==2 switchscore+=40 elsif currentmon.effects[PBEffects::PerishSong]==1 switchscore+=200 end if currentmon.effects[PBEffects::Toxic]>0 switchscore+= (currentmon.effects[PBEffects::Toxic]*15) end if (!currentmon.abilitynulled && currentmon.ability == PBAbilities::NATURALCURE) && currentmon.status!=0 switchscore+=50 end if partyroles.include?(PBMonRoles::CLERIC) && currentmon.status!=0 switchscore+=60 end if currentmon.status==PBStatuses::SLEEP switchscore+=170 if checkAImoves([PBMoves::DREAMEATER,PBMoves::NIGHTMARE],aimem) end if currentmon.effects[PBEffects::Yawn]>0 && currentmon.status!=PBStatuses::SLEEP switchscore+=95 end # Stat Stages PBDebug.log(sprintf("Initial switchscore building: Stat Stages (%d)",switchscore)) if $INTERNAL specialmove = false physmove = false for i in currentmon.moves specialmove = true if i.pbIsSpecial?(i.type) physmove = true if i.pbIsPhysical?(i.type) end if currentroles.include?(PBMonRoles::SWEEPER) switchscore+= (-30)*currentmon.stages[PBStats::ATTACK] if currentmon.stages[PBStats::ATTACK]<0 && physmove switchscore+= (-30)*currentmon.stages[PBStats::SPATK] if currentmon.stages[PBStats::SPATK]<0 && specialmove switchscore+= (-30)*currentmon.stages[PBStats::SPEED] if currentmon.stages[PBStats::SPEED]<0 switchscore+= (-30)*currentmon.stages[PBStats::ACCURACY] if currentmon.stages[PBStats::ACCURACY]<0 else switchscore+= (-15)*currentmon.stages[PBStats::ATTACK] if currentmon.stages[PBStats::ATTACK]<0 && physmove switchscore+= (-15)*currentmon.stages[PBStats::SPATK] if currentmon.stages[PBStats::SPATK]<0 && specialmove switchscore+= (-15)*currentmon.stages[PBStats::SPEED] if currentmon.stages[PBStats::SPEED]<0 switchscore+= (-15)*currentmon.stages[PBStats::ACCURACY] if currentmon.stages[PBStats::ACCURACY]<0 end if currentroles.include?(PBMonRoles::PHYSICALWALL) switchscore+= (-30)*currentmon.stages[PBStats::DEFENSE] if currentmon.stages[PBStats::DEFENSE]<0 else switchscore+= (-15)*currentmon.stages[PBStats::DEFENSE] if currentmon.stages[PBStats::DEFENSE]<0 end if currentroles.include?(PBMonRoles::SPECIALWALL) switchscore+= (-30)*currentmon.stages[PBStats::SPDEF] if currentmon.stages[PBStats::SPDEF]<0 else switchscore+= (-15)*currentmon.stages[PBStats::SPDEF] if currentmon.stages[PBStats::SPDEF]<0 end # Healing PBDebug.log(sprintf("Initial switchscore building: Healing")) if $INTERNAL if (currentmon.hp.to_f)/currentmon.totalhp<(2/3) && (!currentmon.abilitynulled && currentmon.ability == PBAbilities::REGENERATOR) switchscore+=30 end if currentmon.effects[PBEffects::Wish]>0 lowhp = false for i in party next if i.nil? if 0.3<((i.hp.to_f)/i.totalhp) && ((i.hp.to_f)/i.totalhp)<0.6 lowhp = true end end switchscore+=40 if lowhp end # fsteak PBDebug.log(sprintf("Initial switchscore building: fsteak (%d)",switchscore)) if $INTERNAL finalmod = 0 tricktreat = false forestcurse = false notnorm = false for i in currentmon.moves if i.id==(PBMoves::TRICKORTREAT) tricktreat = true elsif i.id==(PBMoves::FORESTSCURSE) forestcurse = true elsif i.type != (PBTypes::NORMAL) notnorm = true end mod1 = pbTypeModNoMessages(i.type,currentmon,opponent1,i,skill) mod2 = pbTypeModNoMessages(i.type,currentmon,opponent2,i,skill) mod1 = 4 if opponent1.hp==0 mod2 = 4 if opponent2.hp==0 if (!opponent1.abilitynulled && opponent1.ability == PBAbilities::WONDERGUARD) && mod1<=4 mod1=0 end if (!opponent2.abilitynulled && opponent2.ability == PBAbilities::WONDERGUARD) && mod2<=4 mod2=0 end finalmod += mod1*mod2 end if finalmod==0 if (tricktreat && notnorm) || forestcurse finalmod=1 end end switchscore+=140 if finalmod==0 totalpp=0 for i in currentmon.moves totalpp+= i.pp end switchscore+=200 if totalpp==0 if currentmon.effects[PBEffects::Torment]== true switchscore+=30 end if currentmon.effects[PBEffects::Encore]>0 encoreIndex=currentmon.effects[PBEffects::EncoreIndex] if opponent1.hp>0 dmgValue = pbRoughDamage(currentmon.moves[encoreIndex],currentmon,opponent1,skill,currentmon.moves[encoreIndex].basedamage) if currentmon.moves[encoreIndex].basedamage!=0 dmgPercent = (dmgValue*100)/(opponent1.hp) dmgPercent = 110 if dmgPercent > 110 else dmgPercent = pbStatusDamage(currentmon.moves[encoreIndex]) end encoreScore=pbGetMoveScore(currentmon.moves[encoreIndex],currentmon,opponent1,skill,dmgPercent) else dmgValue = pbRoughDamage(currentmon.moves[encoreIndex],currentmon,opponent2,skill,currentmon.moves[encoreIndex].basedamage) if currentmon.moves[encoreIndex].basedamage!=0 dmgPercent = (dmgValue*100)/(opponent2.hp) dmgPercent = 110 if dmgPercent > 110 else dmgPercent = pbStatusDamage(currentmon.moves[encoreIndex]) end encoreScore=pbGetMoveScore(currentmon.moves[encoreIndex],currentmon,opponent2,skill,dmgPercent) end if encoreScore <= 30 switchscore+=200 end if currentmon.effects[PBEffects::Torment]== true switchscore+=110 end end if currentmon.effects[PBEffects::ChoiceBand]>=0 && currentmon.itemWorks? && (currentmon.item == PBItems::CHOICEBAND || currentmon.item == PBItems::CHOICESPECS || currentmon.item == PBItems::CHOICESCARF) choiced = false for i in 0...4 if currentmon.moves[i].id==currentmon.effects[PBEffects::ChoiceBand] choiced=true choiceID = i break end end if choiced if opponent1.hp>0 dmgValue = pbRoughDamage(currentmon.moves[choiceID],currentmon,opponent1,skill,currentmon.moves[choiceID].basedamage) if currentmon.moves[choiceID].basedamage!=0 dmgPercent = (dmgValue*100)/(opponent1.hp) dmgPercent = 110 if dmgPercent > 110 else dmgPercent = pbStatusDamage(currentmon.moves[choiceID]) end choiceScore=pbGetMoveScore(currentmon.moves[choiceID],currentmon,opponent1,skill,dmgPercent) else dmgValue = pbRoughDamage(currentmon.moves[choiceID],currentmon,opponent2,skill,currentmon.moves[choiceID].basedamage) if currentmon.moves[choiceID].basedamage!=0 dmgPercent = (dmgValue*100)/(opponent2.hp) dmgPercent = 110 if dmgPercent > 110 else dmgPercent = pbStatusDamage(currentmon.moves[choiceID]) end choiceScore=pbGetMoveScore(currentmon.moves[choiceID],currentmon,opponent2,skill,dmgPercent) end if choiceScore <= 50 switchscore+=50 if choiceScore <= 30 switchscore+=130 if choiceScore <= 5 switchscore+=150 end end end if currentmon.effects[PBEffects::Torment]== true switchscore+=150 end end end if skill 4 tempswitchscore+=20 elsif effcheck < 4 tempswitchscore-=20 end effcheck2 = PBTypes.getCombinedEffectiveness(opponent1.type2,currentmon.type1,currentmon.type2) if effcheck2 > 4 tempswitchscore+=20 elsif effcheck2 < 4 tempswitchscore-=20 end if opponent2.totalhp !=0 tempswitchscore *= 0.5 effcheck = PBTypes.getCombinedEffectiveness(opponent2.type1,currentmon.type1,currentmon.type2) if effcheck > 4 tempswitchscore+=10 elsif effcheck < 4 tempswitchscore-=10 end effcheck2 = PBTypes.getCombinedEffectiveness(opponent2.type2,currentmon.type1,currentmon.type2) if effcheck2 > 4 tempswitchscore+=10 elsif effcheck2 < 4 tempswitchscore-=10 end end switchscore += tempswitchscore # Specific Switches PBDebug.log(sprintf("Initial switchscore building: Specific Switches (%d)",switchscore)) if $INTERNAL if opponent1.effects[PBEffects::TwoTurnAttack]>0 twoturntype = $pkmn_move[opponent1.effects[PBEffects::TwoTurnAttack]][2] breakvar = false savedmod = -1 indexsave = -1 count = -1 for i in party count+=1 next if i.nil? next if count == currentmon.pokemonIndex totalmod=currentmon.moves[0].pbTypeModifierNonBattler(twoturntype,opponent1,i) if totalmod<4 switchscore+=80 unless breakvar breakvar = true if savedmod<0 indexsave = count savedmod = totalmod else if savedmod>totalmod indexsave = count savedmod = totalmod end end end end monarray.push(indexsave) if indexsave > -1 end if pbRoughStat(currentmon,PBStats::SPEED,skill) < pbRoughStat(opponent1,PBStats::SPEED,skill) if aimem.length!=0 movedamages = [] for i in aimem movedamages.push(pbRoughDamage(i,opponent1,currentmon,skill,i.basedamage)) end if movedamages.length > 0 bestmoveindex = movedamages.index(movedamages.max) bestmove = aimem[bestmoveindex] if (currentmon.hp) < movedamages[bestmoveindex] count = -1 breakvar = false immunevar = false savedmod = -1 indexsave = -1 for i in party count+=1 next if i.nil? next if count == currentmon.pokemonIndex totalmod = bestmove.pbTypeModifierNonBattler(bestmove.type,opponent1,i) if totalmod<4 switchscore+=80 unless breakvar breakvar = true if totalmod == 0 switchscore+=20 unless immunevar immunevar = true end if savedmod<0 indexsave = count savedmod = totalmod else if savedmod>totalmod indexsave = count savedmod = totalmod end end end end if immunevar monarray.push(indexsave) if indexsave > -1 else if indexsave > -1 if party[indexsave].speed > pbRoughStat(opponent1,PBStats::SPEED,skill) monarray.push(indexsave) end end end end end end end if pbRoughStat(currentmon,PBStats::SPEED,skill) < pbRoughStat(opponent2,PBStats::SPEED,skill) if aimem2.length!=0 movedamages = [] for i in aimem2 movedamages.push(pbRoughDamage(i,opponent2,currentmon,skill,i.basedamage)) end if movedamages.length > 0 bestmoveindex = movedamages.index(movedamages.max) bestmove = aimem2[bestmoveindex] if (currentmon.hp) < movedamages[bestmoveindex] count = -1 breakvar = false immunevar = false savedmod = -1 indexsave = -1 for i in party count+=1 next if i.nil? next if count == currentmon.pokemonIndex totalmod = bestmove.pbTypeModifierNonBattler(bestmove.type,opponent2,i) if totalmod<4 switchscore+=80 unless breakvar breakvar = true if totalmod == 0 switchscore+=20 unless immunevar immunevar = true end if savedmod<0 indexsave = count savedmod = totalmod else if savedmod>totalmod indexsave = count savedmod = totalmod end end end end if immunevar monarray.push(indexsave) if indexsave > -1 else if indexsave > -1 if party[indexsave].speed > pbRoughStat(opponent2,PBStats::SPEED,skill) monarray.push(indexsave) end end end end end end end if skill>=PBTrainerAI.highSkill if aimem.length!=0 #Fakeout Check if checkAImoves([PBMoves::FAKEOUT],aimem) && opponent1.turncount == 1 count = -1 for i in party count+=1 next if i.nil? next if count == currentmon.pokemonIndex if (i.ability == PBAbilities::STEADFAST) monarray.push(count) switchscore+=90 break end end end #Meech check if (opponent1.ability == PBAbilities::SKILLLINK) && skill>=PBTrainerAI.bestSkill #elite trainers only probablycinccino = false for i in aimem if i.function==0xC0 && i.isContactMove? probablycinccino = true end end if probablycinccino count = -1 maxpain = 0 storedmon = -1 for i in party count+=1 next if i.nil? paincount = 0 next if count == currentmon.pokemonIndex if (i.ability == PBAbilities::ROUGHSKIN) || (i.ability == PBAbilities::IRONBARBS) paincount+=1 end if (i.item == PBItems::ROCKYHELMET) paincount+=1 end if paincount>0 && paincount>maxpain maxpain=paincount storedmon = count switchscore+=70 end end if storedmon>-1 monarray.push(storedmon) end end end end if aimem.length!=0 #Fakeout Check if checkAImoves([PBMoves::FAKEOUT],aimem2) && opponent2.turncount == 1 count = -1 for i in party count+=1 next if i.nil? next if count == currentmon.pokemonIndex if (i.ability == PBAbilities::STEADFAST) monarray.push(count) switchscore+=90 break end end end #Meech check if (opponent2.ability == PBAbilities::SKILLLINK) && skill>=PBTrainerAI.bestSkill probablycinccino = false for i in aimem2 if i.function==0xC0 && i.isContactMove? probablycinccino = true end end if probablycinccino count = -1 maxpain = 0 storedmon = -1 for i in party count+=1 next if i.nil? paincount = 0 next if count == currentmon.pokemonIndex if (i.ability == PBAbilities::ROUGHSKIN) || (i.ability == PBAbilities::IRONBARBS) paincount+=1 end if (i.item == PBItems::ROCKYHELMET) paincount+=1 end if paincount>0 && paincount>maxpain maxpain=paincount storedmon = count switchscore+=70 end end if storedmon>-1 monarray.push(storedmon) end end end end end count = -1 storedmon = -1 storedhp = -1 for i in party count+=1 next if i.nil? next if i.totalhp==0 next if count == currentmon.pokemonIndex next if !pbCanSwitchLax?(currentmon.index,count,false) if storedhp < 0 storedhp = i.hp/(i.totalhp.to_f) storedmon = i #count storedcount = count else if storedhp > i.hp/(i.totalhp.to_f) storedhp = i.hp/(i.totalhp.to_f) storedmon = i #count storedcount = count end end end if storedhp < 0.20 && storedhp > 0 if ((storedmon.speed < pbRoughStat(opponent1,PBStats::SPEED,skill)) && ( storedmon.speed < pbRoughStat(opponent2,PBStats::SPEED,skill))) || currentmon.pbOwnSide.effects[PBEffects::Spikes]>0 || currentmon.pbOwnSide.effects[PBEffects::StealthRock] speedcheck = false for i in party next if i.nil? next if i==storedmon if i.speed > pbRoughStat(opponent1,PBStats::SPEED,skill) speedcheck = true end end if speedcheck monarray.push(storedcount) switchscore+=20 end end end maxlevel = -1 for i in party next if i.nil? if maxlevel < 0 maxlevel = i.level else if maxlevel < i.level maxlevel = i.level end end end if maxlevel>(opponent1.level+10) switchscore-=100 if maxlevel>(opponent1.level+20) switchscore-=1000 end end PBDebug.log(sprintf("%s: initial switchscore: %d",PBSpecies.getName(@battlers[index].species),switchscore)) if $INTERNAL PBDebug.log(sprintf(" ")) if $INTERNAL # Stat Stages PBDebug.log(sprintf("Initial noswitchscore building: Stat Stages (%d)",noswitchscore)) if $INTERNAL specialmove = false physmove = false for i in currentmon.moves specialmove = true if i.pbIsSpecial?(i.type) physmove = true if i.pbIsPhysical?(i.type) end if currentroles.include?(PBMonRoles::SWEEPER) noswitchscore+= (30)*currentmon.stages[PBStats::ATTACK] if currentmon.stages[PBStats::ATTACK]>0 && physmove noswitchscore+= (30)*currentmon.stages[PBStats::SPATK] if currentmon.stages[PBStats::SPATK]>0 && specialmove noswitchscore+= (30)*currentmon.stages[PBStats::SPEED] if currentmon.stages[PBStats::SPEED]>0 unless (currentroles.include?(PBMonRoles::PHYSICALWALL) || currentroles.include?(PBMonRoles::SPECIALWALL) || currentroles.include?(PBMonRoles::TANK)) else noswitchscore+= (15)*currentmon.stages[PBStats::ATTACK] if currentmon.stages[PBStats::ATTACK]>0 && physmove noswitchscore+= (15)*currentmon.stages[PBStats::SPATK] if currentmon.stages[PBStats::SPATK]>0 && specialmove noswitchscore+= (15)*currentmon.stages[PBStats::SPEED] if currentmon.stages[PBStats::SPEED]>0 unless (currentroles.include?(PBMonRoles::PHYSICALWALL) || currentroles.include?(PBMonRoles::SPECIALWALL) || currentroles.include?(PBMonRoles::TANK)) end if currentroles.include?(PBMonRoles::PHYSICALWALL) noswitchscore+= (30)*currentmon.stages[PBStats::DEFENSE] if currentmon.stages[PBStats::DEFENSE]<0 else noswitchscore+= (15)*currentmon.stages[PBStats::DEFENSE] if currentmon.stages[PBStats::DEFENSE]<0 end if currentroles.include?(PBMonRoles::SPECIALWALL) noswitchscore+= (30)*currentmon.stages[PBStats::SPDEF] if currentmon.stages[PBStats::SPDEF]<0 else noswitchscore+= (15)*currentmon.stages[PBStats::SPDEF] if currentmon.stages[PBStats::SPDEF]<0 end # Entry Hazards PBDebug.log(sprintf("Initial noswitchscore building: Entry Hazards (%d)",noswitchscore)) if $INTERNAL noswitchscore+= (15)*currentmon.pbOwnSide.effects[PBEffects::Spikes] noswitchscore+= (15)*currentmon.pbOwnSide.effects[PBEffects::ToxicSpikes] noswitchscore+= (15) if currentmon.pbOwnSide.effects[PBEffects::StealthRock] noswitchscore+= (15) if currentmon.pbOwnSide.effects[PBEffects::StickyWeb] noswitchscore+= (15) if (currentmon.pbOwnSide.effects[PBEffects::StickyWeb] && currentroles.include?(PBMonRoles::SWEEPER)) airmon = currentmon.isAirborne? hazarddam = totalHazardDamage(currentmon.pbOwnSide,currentmon.type1,currentmon.type2,airmon,skill) if ((currentmon.hp.to_f)/currentmon.totalhp)*100 < hazarddam noswitchscore+= 100 end temppartyko = true for i in party count+=1 next if i.nil? next if count == currentmon.pokemonIndex temproles = pbGetMonRole(i,opponent1,skill,count,party) next if temproles.include?(PBMonRoles::ACE) tempdam = totalHazardDamage(currentmon.pbOwnSide,i.type1,i.type2,i.isAirborne?,skill) if ((i.hp.to_f)/i.totalhp)*100 > tempdam temppartyko = false end end if temppartyko noswitchscore+= 200 end # Better Switching Options PBDebug.log(sprintf("Initial noswitchscore building: Better Switching Options (%d)",noswitchscore)) if $INTERNAL if pbRoughStat(currentmon,PBStats::SPEED,skill) > pbRoughStat(opponent1,PBStats::SPEED,skill) if currentmon.pbHasMove?((PBMoves::VOLTSWITCH)) || currentmon.pbHasMove?((PBMoves::UTURN)) noswitchscore+=90 end end if currentmon.effects[PBEffects::PerishSong]==0 && currentmon.pbHasMove?((PBMoves::BATONPASS)) noswitchscore+=90 end if (!currentmon.abilitynulled && currentmon.ability == PBAbilities::WIMPOUT) || (!currentmon.abilitynulled && currentmon.ability == PBAbilities::EMERGENCYEXIT) noswitchscore+=60 end # Second Wind Situations PBDebug.log(sprintf("Initial noswitchscore building: Second Wind Situations (%d)",noswitchscore)) if $INTERNAL if !checkAIpriority(aimem) if pbRoughStat(currentmon,PBStats::SPEED,skill) > pbRoughStat(opponent1,PBStats::SPEED,skill) maxdam = 0 for i in currentmon.moves if opponent1.hp>0 tempdam = (pbRoughDamage(i,opponent1,currentmon,skill,i.basedamage)*100/opponent1.hp) else tempdam=0 end if tempdam > maxdam maxdam = tempdam end end if maxdam > 100 noswitchscore+=130 end end if pbRoughStat(currentmon,PBStats::SPEED,skill) > pbRoughStat(opponent2,PBStats::SPEED,skill) maxdam = 0 for i in currentmon.moves if opponent2.hp>0 tempdam = (pbRoughDamage(i,opponent2,currentmon,skill,i.basedamage)*100/opponent2.hp) else tempdam=0 end if tempdam > maxdam maxdam = tempdam end end if maxdam > 100 noswitchscore+=130 end end maxdam = 0 for i in currentmon.moves next if i.priority < 1 if opponent1.hp>0 tempdam = (pbRoughDamage(i,opponent1,currentmon,skill,i.basedamage)*100/opponent1.hp) else tempdam=0 end if tempdam > maxdam maxdam = tempdam end end if maxdam > 100 noswitchscore+=130 end maxdam = 0 for i in currentmon.moves next if i.priority < 1 if opponent2.hp>0 tempdam = (pbRoughDamage(i,opponent2,currentmon,skill,i.basedamage)*100/opponent2.hp) else tempdam=0 end if tempdam > maxdam maxdam = tempdam end end if maxdam > 100 noswitchscore+=130 end end finalcrit = 0 for i in currentmon.moves critrate1 = pbAICritRate(currentmon,opponent1,i) critrate2 = pbAICritRate(currentmon,opponent2,i) maxcrit = [critrate1,critrate2].max if finalcrit < maxcrit finalcrit = maxcrit end end if finalcrit == 1 noswitchscore+=12.5 elsif finalcrit == 2 noswitchscore += 50 elsif finalcrit == 3 noswitchscore += 100 end if currentmon.status==PBStatuses::SLEEP && currentmon.statusCount<3 noswitchscore+=100 end monturn = (100 - (currentmon.turncount*25)) if currentroles.include?(PBMonRoles::LEAD) monturn /= 1.5 end if monturn > 0 noswitchscore+=monturn end PBDebug.log(sprintf("%s: initial noswitchscore: %d",PBSpecies.getName(@battlers[index].species),noswitchscore)) if $INTERNAL PBDebug.log(sprintf(" ")) if $INTERNAL PBDebug.log(sprintf("{")) if $INTERNAL PBDebug.log(sprintf(" ")) if $INTERNAL finalscore = switchscore - noswitchscore if skill highscore PBDebug.log(sprintf("%s < %d, will switch",highscore,finalscore)) if $INTERNAL PBDebug.log(sprintf(" ")) if $INTERNAL willswitch = true else PBDebug.log(sprintf("%s > %d, will not switch",highscore,finalscore)) if $INTERNAL PBDebug.log(sprintf(" ")) if $INTERNAL willswitch = false end if willswitch memmons = monarray.length if memmons>0 counts = Hash.new(0) monarray.each do |mon| counts[mon] += 1 end storedswitch = -1 storednumber = -1 tievar = false for i in counts.keys if counts[i] > storednumber storedswitch = i storednumber = counts[i] tievar = true elsif counts[i] == storednumber tievar=true end end if !tievar PBDebug.log(sprintf("Switching to %s",PBSpecies.getName(pbParty(currentmon)[storedswitch].species))) if $INTERNAL return pbRegisterSwitch(currentmon.index,storedswitch) else wallvar = false monindex = -1 for i in counts.keys temparr = pbGetMonRole(party[i],opponent1,skill,count,party) if temparr.include?(PBMonRoles::PHYSICALWALL) || temparr.include?(PBMonRoles::SPECIALWALL) wallvar = true monindex = i end end if wallvar return pbRegisterSwitch(currentmon.index,monindex) else maxhpvar = -1 chosenmon = -1 for i in counts.keys temphp = party[i].hp if temphp > maxhpvar maxhpvar = temphp chosenmon = i end end return pbRegisterSwitch(currentmon.index,chosenmon) end end else switchindex = pbSwitchTo(currentmon,party,skill) if switchindex==-1 return false end return pbRegisterSwitch(currentmon.index,switchindex) end else return false end end def pbSpeedChangingSwitch(mon,currentmon) speed = mon.speed #if @unburdened # speed=speed*2 #end if currentmon.pbOwnSide.effects[PBEffects::Tailwind]>0 speed=speed*2 end if (mon.ability == PBAbilities::SWIFTSWIM) && pbWeather==PBWeather::RAINDANCE && !(mon.item == PBItems::UTILITYUMBRELLA) speed=speed*2 elsif ($fefieldeffect == 21 || $fefieldeffect == 22 || $fefieldeffect == 26) && (mon.ability == PBAbilities::SWIFTSWIM) speed=speed*2 elsif $fefieldeffect == 21 || $fefieldeffect == 26 if (!mon.hasType?(:WATER) && !(mon.ability == PBAbilities::SURGESURFER)) && !mon.isAirborne? speed=(speed*0.5).floor end elsif $fefieldeffect == 22 if (!mon.hasType?(:WATER) && !(mon.ability == PBAbilities::SWIFTSWIM) && !(mon.ability == PBAbilities::STEELWORKER)) speed=(speed*0.25).floor end end if (mon.ability == PBAbilities::SLUSHRUSH) && (pbWeather==PBWeather::HAIL || $fefieldeffect==13 || $fefieldeffect==28) speed=speed*2 end if (mon.ability == PBAbilities::SURGESURFER) && (($fefieldeffect == 1) || ($fefieldeffect==18) || ($fefieldeffect==21) || ($fefieldeffect==22) || ($fefieldeffect==26)) speed=speed*2 end if (mon.ability == PBAbilities::TELEPATHY) && $fefieldeffect==37 speed=speed*2 end if $fefieldeffect == 35 && !mon.isAirborne? speed=(speed*0.5).floor end if (mon.ability == PBAbilities::CHLOROPHYLL) && (pbWeather==PBWeather::SUNNYDAY || ($fefieldeffect == 33 && $fecounter > 2)) && !(mon.item == PBItems::UTILITYUMBRELLA) speed=speed*2 end if (mon.ability == PBAbilities::SANDRUSH) && (pbWeather==PBWeather::SANDSTORM || $fefieldeffect == 12 || $fefieldeffect == 20) speed=speed*2 end if (mon.ability == PBAbilities::QUICKFEET) && mon.status>0 speed=(speed*1.5).floor end if (mon.item == PBItems::MACHOBRACE) || (mon.item == PBItems::POWERWEIGHT) || (mon.item == PBItems::POWERBRACER) || (mon.item == PBItems::POWERBELT) || (mon.item == PBItems::POWERANKLET) || (mon.item == PBItems::POWERLENS) || (mon.item == PBItems::POWERBAND) speed=(speed/2).floor end if (mon.item == PBItems::CHOICESCARF) speed=(speed*1.5).floor end if mon.item == PBItems::IRONBALL && mon.ability != PBAbilities::KLUTZ speed=(speed/2).floor end if mon.species == PBSpecies::DITTO && mon.item == PBItems::QUICKPOWDER speed=speed*2 end if (mon.ability == PBAbilities::SLOWSTART) speed=(speed/2).floor end if mon.status==PBStatuses::PARALYSIS && !(mon.ability == PBAbilities::QUICKFEET) speed=(speed/2).floor end if currentmon.pbOwnSide.effects[PBEffects::StickyWeb] && !mon.isAirborne? && ($fefieldeffect != 15) && !(mon.ability == PBAbilities::WHITESMOKE) && !(mon.ability == PBAbilities::CLEARBODY) && !(mon.ability == PBAbilities::CONTRARY) speed=(speed*2/3).floor elsif currentmon.pbOwnSide.effects[PBEffects::StickyWeb] && !mon.isAirborne? && ($fefieldeffect == 15) && !(mon.ability == PBAbilities::WHITESMOKE) && !(mon.ability == PBAbilities::CLEARBODY) && !(mon.ability == PBAbilities::CONTRARY) speed=(speed*0.5).floor elsif currentmon.pbOwnSide.effects[PBEffects::StickyWeb] && !mon.isAirborne? && ($fefieldeffect != 15) && (mon.ability == PBAbilities::CONTRARY) speed=(speed*1.5).floor elsif currentmon.pbOwnSide.effects[PBEffects::StickyWeb] && !mon.isAirborne? & ($fefieldeffect == 15) && (mon.ability == PBAbilities::CONTRARY) speed=speed*2 end speed = 1 if speed <= 0 return speed end def pbSwitchTo(currentmon,party,skill) opponent1 = currentmon.pbOppositeOpposing opponent2 = opponent1.pbPartner opp1roles = pbGetMonRole(opponent1,currentmon,skill) opp2roles = pbGetMonRole(opponent2,currentmon,skill) aimem = getAIMemory(skill,opponent1.pokemonIndex) aimem2 = getAIMemory(skill,opponent2.pokemonIndex) if skill 0 for j in aimem totalmod = j.pbTypeModifierNonBattler(j.type,opponent1,i) if totalmod > 4 sedamagevar = j.basedamage if j.basedamage>sedamagevar if totalmod >= 16 sedamagevar*=2 end if j.type == opponent1.type1 || j.type == opponent1.type2 sedamagevar*=1.5 end end end monscore-=sedamagevar end immunevar = 0 resistvar = 0 bestresist = false bestimmune = false count = 0 movedamages = [] bestmoveindex = -1 if aimem.length > 0 && skill>=PBTrainerAI.highSkill for j in aimem movedamages.push(j.basedamage) end if movedamages.length > 0 bestmoveindex = movedamages.index(movedamages.max) end for j in aimem totalmod = j.pbTypeModifierNonBattler(j.type,opponent1,i) if bestmoveindex > -1 if count == bestmoveindex if totalmod == 0 bestimmune = true elsif totalmod == 1 || totalmod == 2 bestresist = true end end end if totalmod == 0 immunevar+=1 elsif totalmod == 1 || totalmod == 2 resistvar+=1 end count+=1 end if immunevar == 4 if wallvar monscore+=300 else monscore+=200 end elsif bestimmune if wallvar monscore+=90 else monscore+=60 end end if immunevar+resistvar == 4 && immunevar!=4 if wallvar monscore+=150 else monscore+=100 end elsif bestresist if wallvar monscore+=45 else monscore+=30 end end elsif aimem.length > 0 for j in aimem totalmod = j.pbTypeModifierNonBattler(j.type,opponent1,i) if totalmod == 0 bestimmune=true elsif totalmod == 1 || totalmod == 2 bestresist=true end end if bestimmune if wallvar monscore+=90 else monscore+=60 end end if bestresist if wallvar monscore+=45 else monscore+=30 end end end otype1 = opponent1.type1 otype2 = opponent1.type2 otype3 = opponent2.type1 otype4 = opponent2.type2 atype1 = i.type1 atype2 = i.type2 stabresist1a = PBTypes.getEffectiveness(otype1,atype1) if atype1!=atype2 stabresist1b = PBTypes.getEffectiveness(otype1,atype2) else stabresist1b = 2 end stabresist2a = PBTypes.getEffectiveness(otype2,atype1) if atype1!=atype2 stabresist2b = PBTypes.getEffectiveness(otype2,atype2) else stabresist2b = 2 end stabresist3a = PBTypes.getEffectiveness(otype3,atype1) if atype1!=atype2 stabresist3b = PBTypes.getEffectiveness(otype3,atype2) else stabresist3b = 2 end stabresist4a = PBTypes.getEffectiveness(otype4,atype1) if atype1!=atype2 stabresist4b = PBTypes.getEffectiveness(otype4,atype2) else stabresist4b = 2 end if stabresist1a*stabresist1b<4 || stabresist2a*stabresist2b<4 monscore+=40 if otype1==otype2 monscore+=30 else if stabresist1a*stabresist1b<4 && stabresist2a*stabresist2b<4 monscore+=60 end end elsif stabresist1a*stabresist1b>4 || stabresist2a*stabresist2b>4 monscore-=40 if otype1==otype2 monscore-=30 else if stabresist1a*stabresist1b>4 && stabresist2a*stabresist2b>4 monscore-=60 end end end if stabresist3a*stabresist3b<4 || stabresist4a*stabresist4b<4 monscore+=40 if otype3==otype4 monscore+=30 else if stabresist3a*stabresist3b<4 && stabresist4a*stabresist4b<4 monscore+=60 end end elsif stabresist3a*stabresist3b>4 || stabresist4a*stabresist4b>4 monscore-=40 if otype3==otype4 monscore-=30 else if stabresist3a*stabresist3b>4 && stabresist4a*stabresist4b>4 monscore-=60 end end end PBDebug.log(sprintf("Defensive: %d",monscore)) if $INTERNAL # Offensive maxbasedam = -1 bestmove = -1 for k in i.moves j = PokeBattle_Move.new(self,k,i) basedam = j.basedamage if (j.pbTypeModifierNonBattler(j.type,i,opponent1)>4) || ((j.pbTypeModifierNonBattler(j.type,i,opponent2)>4) && opponent2.totalhp !=0) basedam*=2 if (j.pbTypeModifierNonBattler(j.type,i,opponent1)==16) || ((j.pbTypeModifierNonBattler(j.type,i,opponent2)==16) && opponent2.totalhp !=0) basedam*=2 end end if (j.pbTypeModifierNonBattler(j.type,i,opponent1)<4) || ((j.pbTypeModifierNonBattler(j.type,i,opponent2)<4) && opponent2.totalhp !=0) basedam/=2.0 if (j.pbTypeModifierNonBattler(j.type,i,opponent1)==1) || ((j.pbTypeModifierNonBattler(j.type,i,opponent2)==1) && opponent2.totalhp !=0) basedam/=2.0 end end if (j.pbTypeModifierNonBattler(j.type,i,opponent1)==0) || ((j.pbTypeModifierNonBattler(j.type,i,opponent2)==0) && opponent2.totalhp !=0) basedam=0 end if (j.pbTypeModifierNonBattler(j.type,i,opponent1)<=4 && (!opponent1.abilitynulled && opponent1.ability == PBAbilities::WONDERGUARD)) || ((j.pbTypeModifierNonBattler(j.type,i,opponent2)<=4 && (!opponent2.abilitynulled && opponent2.ability == PBAbilities::WONDERGUARD)) && opponent2.totalhp !=0) basedam=0 end if (((!opponent1.abilitynulled && opponent1.ability == PBAbilities::STORMDRAIN) || (!opponent2.abilitynulled && opponent2.ability == PBAbilities::STORMDRAIN) || (!opponent1.abilitynulled && opponent1.ability == PBAbilities::WATERABSORB) || (!opponent2.abilitynulled && opponent2.ability == PBAbilities::WATERABSORB) || (!opponent1.abilitynulled && opponent1.ability == PBAbilities::DRYSKIN) || (!opponent2.abilitynulled && opponent2.ability == PBAbilities::DRYSKIN)) && (j.type == PBTypes::WATER)) || (((!opponent1.abilitynulled && opponent1.ability == PBAbilities::VOLTABSORB) || (!opponent2.abilitynulled && opponent2.ability == PBAbilities::VOLTABSORB) || (!opponent1.abilitynulled && opponent1.ability == PBAbilities::MOTORDRIVE) || (!opponent2.abilitynulled && opponent2.ability == PBAbilities::MOTORDRIVE)) && (j.type == PBTypes::ELECTRIC)) || (((!opponent1.abilitynulled && opponent1.ability == PBAbilities::FLASHFIRE) || (!opponent2.abilitynulled && opponent2.ability == PBAbilities::FLASHFIRE)) && (j.type == PBTypes::FIRE)) || (((!opponent1.abilitynulled && opponent1.ability == PBAbilities::SAPSIPPER) || (!opponent2.abilitynulled && opponent2.ability == PBAbilities::SAPSIPPER)) && (j.type == PBTypes::GRASS)) basedam=0 end if j.pbIsPhysical?(j.type) && i.status==PBStatuses::BURN basedam/=2.0 end if skill>=PBTrainerAI.highSkill if i.hasType?(j.type) basedam*=1.5 end end if j.accuracy!=0 basedam*=(j.accuracy/100.0) end if basedam>maxbasedam maxbasedam = basedam bestmove = j end end if bestmove!=-1 if bestmove.priority>0 maxbasedam*=1.5 end end if i.speed i.spatk ministat = [opponent1.stages[PBStats::SPDEF] - opponent1.stages[PBStats::DEFENSE], opponent2.stages[PBStats::SPDEF] - opponent2.stages[PBStats::DEFENSE]].max else ministat = [opponent1.stages[PBStats::DEFENSE] - opponent1.stages[PBStats::SPDEF], opponent1.stages[PBStats::DEFENSE] - opponent1.stages[PBStats::SPDEF]].max end ministat*=20 monscore+=ministat end PBDebug.log(sprintf("Offensive: %d",monscore)) if $INTERNAL #Roles if skill>=PBTrainerAI.highSkill if theseRoles.include?(PBMonRoles::SWEEPER) if currentmon.pbNonActivePokemonCount<2 monscore+=60 else monscore-=50 end if i.attack >= i.spatk if (opponent1.defense= i.attack if (opponent1.spdef opponent1.pbSpeed) ^ (@trickroom!=0)) monscore *= 1.3 else monscore *= 0.7 end if opponent1.status==PBStatuses::SLEEP || opponent1.status==PBStatuses::FROZEN monscore+=50 end end if wallvar if theseRoles.include?(PBMonRoles::PHYSICALWALL) && (opponent1.spatk>opponent1.attack || opponent2.spatk>opponent2.attack) monscore+=30 end if theseRoles.include?(PBMonRoles::SPECIALWALL) && (opponent1.spatk0 monscore+=30 end if opponent2.status==PBStatuses::BURN || opponent2.status==PBStatuses::POISON || opponent2.effects[PBEffects::LeechSeed]>0 monscore+=30 end end if theseRoles.include?(PBMonRoles::TANK) if opponent1.status==PBStatuses::PARALYSIS || opponent1.effects[PBEffects::LeechSeed]>0 monscore+=40 end if opponent2.status==PBStatuses::PARALYSIS || opponent2.effects[PBEffects::LeechSeed]>0 monscore+=40 end if currentmon.pbOwnSide.effects[PBEffects::Tailwind]>0 monscore+=30 end end if theseRoles.include?(PBMonRoles::LEAD) monscore+=40 end if theseRoles.include?(PBMonRoles::CLERIC) partystatus = false partymidhp = false for k in party next if k.nil? next if k==i next if k.totalhp==0 if k.status!=0 partystatus=true end if 0.3<((k.hp.to_f)/k.totalhp) && ((k.hp.to_f)/k.totalhp)<0.6 partymidhp = true end end if partystatus monscore+=50 end if partymidhp monscore+=50 end end if theseRoles.include?(PBMonRoles::PHAZER) monscore+= (10)*opponent1.stages[PBStats::ATTACK] if opponent1.stages[PBStats::ATTACK]<0 monscore+= (10)*opponent2.stages[PBStats::ATTACK] if opponent2.stages[PBStats::ATTACK]<0 monscore+= (20)*opponent1.stages[PBStats::DEFENSE] if opponent1.stages[PBStats::DEFENSE]<0 monscore+= (20)*opponent2.stages[PBStats::DEFENSE] if opponent2.stages[PBStats::DEFENSE]<0 monscore+= (10)*opponent1.stages[PBStats::SPATK] if opponent1.stages[PBStats::SPATK]<0 monscore+= (10)*opponent2.stages[PBStats::SPATK] if opponent2.stages[PBStats::SPATK]<0 monscore+= (20)*opponent1.stages[PBStats::SPDEF] if opponent1.stages[PBStats::SPDEF]<0 monscore+= (20)*opponent2.stages[PBStats::SPDEF] if opponent2.stages[PBStats::SPDEF]<0 monscore+= (10)*opponent1.stages[PBStats::SPEED] if opponent1.stages[PBStats::SPEED]<0 monscore+= (10)*opponent2.stages[PBStats::SPEED] if opponent2.stages[PBStats::SPEED]<0 monscore+= (20)*opponent1.stages[PBStats::EVASION] if opponent1.stages[PBStats::ACCURACY]<0 monscore+= (20)*opponent2.stages[PBStats::EVASION] if opponent2.stages[PBStats::ACCURACY]<0 end if theseRoles.include?(PBMonRoles::SCREENER) monscore+=60 end if theseRoles.include?(PBMonRoles::REVENGEKILLER) if opponent2.totalhp!=0 && opponent1.totalhp!=0 if ((opponent1.hp.to_f)/opponent1.totalhp)<0.3 || ((opponent2.hp.to_f)/opponent2.totalhp)<0.3 monscore+=110 end elsif opponent1.totalhp!=0 if ((opponent1.hp.to_f)/opponent1.totalhp)<0.3 monscore+=110 end elsif opponent2.totalhp!=0 if ((opponent2.hp.to_f)/opponent2.totalhp)<0.3 monscore+=110 end end end if theseRoles.include?(PBMonRoles::SPINNER) if !opponent1.pbHasType?(:GHOST) && (opponent2.hp==0 || !opponent2.pbHasType?(:GHOST)) monscore+=20*currentmon.pbOwnSide.effects[PBEffects::Spikes] monscore+=20*currentmon.pbOwnSide.effects[PBEffects::ToxicSpikes] monscore+=30 if currentmon.pbOwnSide.effects[PBEffects::StickyWeb] monscore+=30 if currentmon.pbOwnSide.effects[PBEffects::StealthRock] end end if theseRoles.include?(PBMonRoles::PIVOT) monscore+=40 end if theseRoles.include?(PBMonRoles::BATONPASSER) monscore+=50 end if theseRoles.include?(PBMonRoles::STALLBREAKER) monscore+=80 if checkAIhealing(aimem) || checkAIhealing(aimem2) end if theseRoles.include?(PBMonRoles::STATUSABSORBER) statusmove = false if aimem.length > 0 for j in aimem statusmove=true if (j.id==(PBMoves::THUNDERWAVE) || j.id==(PBMoves::TOXIC) || j.id==(PBMoves::SPORE) || j.id==(PBMoves::SING) || j.id==(PBMoves::POISONPOWDER) || j.id==(PBMoves::STUNSPORE) || j.id==(PBMoves::SLEEPPOWDER) || j.id==(PBMoves::NUZZLE) || j.id==(PBMoves::WILLOWISP) || j.id==(PBMoves::HYPNOSIS) || j.id==(PBMoves::GLARE) || j.id==(PBMoves::DARKVOID) || j.id==(PBMoves::GRASSWHISTLE) || j.id==(PBMoves::LOVELYKISS) || j.id==(PBMoves::POISONGAS) || j.id==(PBMoves::TOXICTHREAD)) end end if skill>=PBTrainerAI.bestSkill && aimem2.length!=0 for j in aimem2 statusmove=true if (j.id==(PBMoves::THUNDERWAVE) || j.id==(PBMoves::TOXIC) || j.id==(PBMoves::SPORE) || j.id==(PBMoves::SING) || j.id==(PBMoves::POISONPOWDER) || j.id==(PBMoves::STUNSPORE) || j.id==(PBMoves::SLEEPPOWDER) || j.id==(PBMoves::NUZZLE) || j.id==(PBMoves::WILLOWISP) || j.id==(PBMoves::HYPNOSIS) || j.id==(PBMoves::GLARE) || j.id==(PBMoves::DARKVOID) || j.id==(PBMoves::GRASSWHISTLE) || j.id==(PBMoves::LOVELYKISS) || j.id==(PBMoves::POISONGAS) || j.id==(PBMoves::TOXICTHREAD)) end end monscore+=70 if statusmove end if theseRoles.include?(PBMonRoles::TRAPPER) if ((i.speed>opponent1.pbSpeed) ^ (@trickroom!=0)) if opponent1.totalhp!=0 if (opponent1.hp.to_f)/opponent1.totalhp<0.6 monscore+=100 end end end end if theseRoles.include?(PBMonRoles::WEATHERSETTER) monscore+=30 if (i.ability == PBAbilities::DROUGHT) || (nonmegaform.ability == PBAbilities::DROUGHT) || i.knowsMove?(:SUNNYDAY) if @weather!=PBWeather::SUNNYDAY monscore+=60 end elsif (i.ability == PBAbilities::DRIZZLE) || (nonmegaform.ability == PBAbilities::DRIZZLE) || i.knowsMove?(:RAINDANCE) if @weather!=PBWeather::RAINDANCE monscore+=60 end elsif (i.ability == PBAbilities::SANDSTREAM) || (nonmegaform.ability == PBAbilities::SANDSTREAM) || i.knowsMove?(:SANDSTORM) if @weather!=PBWeather::SANDSTORM monscore+=60 end elsif (i.ability == PBAbilities::SNOWWARNING) || (nonmegaform.ability == PBAbilities::SNOWWARNING) || i.knowsMove?(:HAIL) if @weather!=PBWeather::HAIL monscore+=60 end elsif (i.ability == PBAbilities::PRIMORDIALSEA) || (i.ability == PBAbilities::DESOLATELAND) || (i.ability == PBAbilities::DELTASTREAM) || (nonmegaform.ability == PBAbilities::PRIMORDIALSEA) || (nonmegaform.ability == PBAbilities::DESOLATELAND) || (nonmegaform.ability == PBAbilities::DELTASTREAM) || monscore+=60 end end # if theseRoles.include?(PBMonRoles::SECOND) # monscore-=40 #end end PBDebug.log(sprintf("Roles: %d",monscore)) if $INTERNAL # Weather case @weather when PBWeather::HAIL monscore+=25 if (i.ability == PBAbilities::MAGICGUARD) || (i.ability == PBAbilities::OVERCOAT) || i.hasType?(:ICE) monscore+=50 if (i.ability == PBAbilities::SNOWCLOAK) || (i.ability == PBAbilities::ICEBODY) monscore+=80 if (i.ability == PBAbilities::SLUSHRUSH) when PBWeather::RAINDANCE monscore+=50 if (i.ability == PBAbilities::DRYSKIN) || (i.ability == PBAbilities::HYDRATION) || (i.ability == PBAbilities::RAINDISH) monscore+=80 if (i.ability == PBAbilities::SWIFTSWIM) when PBWeather::SUNNYDAY monscore-=40 if (i.ability == PBAbilities::DRYSKIN) monscore+=50 if (i.ability == PBAbilities::SOLARPOWER) monscore+=80 if (i.ability == PBAbilities::CHLOROPHYLL) when PBWeather::SANDSTORM monscore+=25 if (i.ability == PBAbilities::MAGICGUARD) || (i.ability == PBAbilities::OVERCOAT) || i.hasType?(:ROCK) || i.hasType?(:GROUND) || i.hasType?(:STEEL) monscore+=50 if (i.ability == PBAbilities::SANDVEIL) || (i.ability == PBAbilities::SANDFORCE) monscore+=80 if (i.ability == PBAbilities::SANDRUSH) end if @trickroom>0 if i.speed 0 if i.speed=PBTrainerAI.highSkill if currentmon.pbOwnSide.effects[PBEffects::ToxicSpikes] > 0 if nonmegaform.hasType?(:POISON) && !nonmegaform.hasType?(:FLYING) && !(nonmegaform.ability == PBAbilities::LEVITATE) monscore+=80 end if nonmegaform.hasType?(:FLYING) || nonmegaform.hasType?(:STEEL) || (nonmegaform.ability == PBAbilities::LEVITATE) monscore+=30 end end if i.knowsMove?(:CLEARSMOG) || i.knowsMove?(:HAZE) monscore+= (10)* statchangecounter(opponent1,1,7,1) monscore+= (10)* statchangecounter(opponent2,1,7,1) end if i.knowsMove?(:FAKEOUT) || i.knowsMove?(:FIRSTIMPRESSION) monscore+=25 end if currentmon.pbPartner.totalhp != 0 if i.knowsMove?(:FUSIONBOLT) && currentmon.pbPartner.pbHasMove?((PBMoves::FUSIONFLARE)) monscore+=70 end if i.knowsMove?(:FUSIONFLARE) && currentmon.pbPartner.pbHasMove?((PBMoves::FUSIONBOLT)) monscore+=70 end end if i.knowsMove?(:RETALIATE) && currentmon.pbOwnSide.effects[PBEffects::Retaliate] monscore+=30 end if opponent1.totalhp>0 if i.knowsMove?(:FELLSTINGER) && (((i.speed>opponent1.pbSpeed) ^ (@trickroom!=0)) && (opponent1.hp.to_f)/opponent1.totalhp<0.2) monscore+=50 end end if opponent2.totalhp>0 if i.knowsMove?(:FELLSTINGER) && (((i.speed>opponent2.pbSpeed) ^ (@trickroom!=0)) && (opponent2.hp.to_f)/opponent2.totalhp<0.2) monscore+=50 end end if i.knowsMove?(:TAILWIND) if currentmon.pbOwnSide.effects[PBEffects::Tailwind]>0 monscore-=60 else monscore+=30 end end if i.knowsMove?(:PURSUIT) || i.knowsMove?(:SANDSTORM) || i.knowsMove?(:HAIL) || i.knowsMove?(:TOXIC) || i.knowsMove?(:LEECHSEED) monscore+=70 if (opponent1.ability == PBAbilities::WONDERGUARD) monscore+=70 if (opponent2.ability == PBAbilities::WONDERGUARD) end end PBDebug.log(sprintf("Moves: %d",monscore)) if $INTERNAL #Abilities if skill>=PBTrainerAI.highSkill if (i.ability == PBAbilities::UNAWARE) monscore+= (10)* statchangecounter(opponent1,1,7,1) monscore+= (10)* statchangecounter(opponent2,1,7,1) end if (i.ability == PBAbilities::DROUGHT) || (i.ability == PBAbilities::DESOLATELAND) || (nonmegaform.ability == PBAbilities::DROUGHT) || (nonmegaform.ability == PBAbilities::DESOLATELAND) monscore+=40 if opponent1.pbHasType?(:WATER) monscore+=40 if opponent2.pbHasType?(:WATER) typecheck=false if aimem.length!=0 for j in aimem if (j.type == PBTypes::WATER) typecheck=true end end monscore+=15 if typecheck end if aimem2.length!=0 && skill>=PBTrainerAI.bestSkill for j in aimem2 if (j.type == PBTypes::WATER) typecheck=true end end monscore+=15 if typecheck end end if (i.ability == PBAbilities::DRIZZLE) || (i.ability == PBAbilities::PRIMORDIALSEA) || (nonmegaform.ability == PBAbilities::DRIZZLE) || (nonmegaform.ability == PBAbilities::PRIMORDIALSEA) monscore+=40 if opponent1.pbHasType?(:FIRE) monscore+=40 if opponent2.pbHasType?(:FIRE) typecheck=false if aimem.length!=0 for j in aimem if (j.type == PBTypes::FIRE) typecheck=true end end monscore+=15 if typecheck end if aimem2.length!=0 && skill>=PBTrainerAI.bestSkill for j in aimem2 if (j.type == PBTypes::FIRE) typecheck=true end end monscore+=15 if typecheck end end if (i.ability == PBAbilities::LIMBER) if aimem.length!=0 monscore+=15 if checkAImoves(PBStuff::PARAMOVE,aimem) end if aimem2.length!=0 && skill>=PBTrainerAI.bestSkill monscore+=15 if checkAImoves(PBStuff::PARAMOVE,aimem2) end end if (i.ability == PBAbilities::OBLIVIOUS) monscore+=20 if (opponent1.ability == PBAbilities::CUTECHARM) || (opponent2.ability == PBAbilities::CUTECHARM) if aimem.length!=0 monscore+=20 if checkAImoves([PBMoves::ATTRACT],aimem) end if aimem2.length!=0 && skill>=PBTrainerAI.bestSkill monscore+=20 if checkAImoves([PBMoves::ATTRACT],aimem2) end end if (i.ability == PBAbilities::COMPOUNDEYES) if (opponent1.item == PBItems::LAXINCENSE) || (opponent1.item == PBItems::BRIGHTPOWDER) || opponent1.stages[PBStats::EVASION]>0 || ((opponent1.ability == PBAbilities::SANDVEIL) && @weather==PBWeather::SANDSTORM) || ((opponent1.ability == PBAbilities::SNOWCLOAK) && @weather==PBWeather::HAIL) monscore+=25 end if (opponent2.item == PBItems::LAXINCENSE) || (opponent2.item == PBItems::BRIGHTPOWDER) || opponent2.stages[PBStats::EVASION]>0 || ((opponent2.ability == PBAbilities::SANDVEIL) && @weather==PBWeather::SANDSTORM) || ((opponent2.ability == PBAbilities::SNOWCLOAK) && @weather==PBWeather::HAIL) monscore+=25 end end if (i.ability == PBAbilities::COMATOSE) monscore+=20 if checkAImoves(PBStuff::BURNMOVE,aimem) monscore+=20 if checkAImoves(PBStuff::PARAMOVE,aimem) monscore+=20 if checkAImoves(PBStuff::SLEEPMOVE,aimem) monscore+=20 if checkAImoves(PBStuff::POISONMOVE,aimem) end if (i.ability == PBAbilities::INSOMNIA) || (i.ability == PBAbilities::VITALSPIRIT) monscore+=20 if checkAImoves(PBStuff::SLEEPMOVE,aimem) end if (i.ability == PBAbilities::POISONHEAL) || (i.ability == PBAbilities::TOXICBOOST) || (i.ability == PBAbilities::IMMUNITY) monscore+=20 if checkAImoves(PBStuff::POISONMOVE,aimem) end if (i.ability == PBAbilities::MAGICGUARD) monscore+=20 if checkAImoves([PBMoves::LEECHSEED],aimem) monscore+=20 if checkAImoves([PBMoves::WILLOWISP],aimem) monscore+=20 if checkAImoves(PBStuff::POISONMOVE,aimem) end if (i.ability == PBAbilities::WATERBUBBLE) || (i.ability == PBAbilities::WATERVEIL) || (i.ability == PBAbilities::FLAREBOOST) if checkAImoves([PBMoves::WILLOWISP],aimem) monscore+=10 if (i.ability == PBAbilities::FLAREBOOST) monscore+=10 end end end if (i.ability == PBAbilities::OWNTEMPO) monscore+=20 if checkAImoves(PBStuff::CONFUMOVE,aimem) end if (i.ability == PBAbilities::INTIMIDATE) || (nonmegaform.ability == PBAbilities::INTIMIDATE) || (i.ability == PBAbilities::FURCOAT) || (i.ability == PBAbilities::STAMINA) if opponent1.attack>opponent1.spatk monscore+=40 end if opponent2.attack>opponent2.spatk monscore+=40 end end if (i.ability == PBAbilities::WONDERGUARD) dievar = false instantdievar=false if aimem.length!=0 for j in aimem if (j.type == PBTypes::FIRE) || (j.type == PBTypes::GHOST) || (j.type == PBTypes::DARK) || (j.type == PBTypes::ROCK) || (j.type == PBTypes::FLYING) dievar=true end end end if aimem2.length!=0 && skill>=PBTrainerAI.bestSkill for j in aimem2 if (j.type == PBTypes::FIRE) || (j.type == PBTypes::GHOST) || (j.type == PBTypes::DARK) || (j.type == PBTypes::ROCK) || (j.type == PBTypes::FLYING) dievar=true end end end if @weather==PBWeather::HAIL || PBWeather::SANDSTORM dievar=true instantdievar=true end if i.status==PBStatuses::BURN || i.status==PBStatuses::POISON dievar=true instantdievar=true end if currentmon.pbOwnSide.effects[PBEffects::StealthRock] || currentmon.pbOwnSide.effects[PBEffects::Spikes]>0 || currentmon.pbOwnSide.effects[PBEffects::ToxicSpikes]>0 dievar=true instantdievar=true end if (opponent1.ability == PBAbilities::MOLDBREAKER) || (opponent1.ability == PBAbilities::TURBOBLAZE) || (opponent1.ability == PBAbilities::TERAVOLT) dievar=true end if (opponent2.ability == PBAbilities::MOLDBREAKER) || (opponent2.ability == PBAbilities::TURBOBLAZE) || (opponent2.ability == PBAbilities::TERAVOLT) dievar=true end monscore+=90 if !dievar monscore-=90 if instantdievar end if (i.ability == PBAbilities::EFFECTSPORE) || (i.ability == PBAbilities::STATIC) || (i.ability == PBAbilities::POISONPOINT) || (i.ability == PBAbilities::ROUGHSKIN) || (i.ability == PBAbilities::IRONBARBS) || (i.ability == PBAbilities::FLAMEBODY) || (i.ability == PBAbilities::CUTECHARM) || (i.ability == PBAbilities::MUMMY) || (i.ability == PBAbilities::AFTERMATH) || (i.ability == PBAbilities::GOOEY) || ((i.ability == PBAbilities::FLUFFY) && (!opponent1.pbHasType?(PBTypes::FIRE) && !opponent2.pbHasType?(PBTypes::FIRE))) monscore+=30 if checkAIbest(aimem,4) || checkAIbest(aimem2,4) end if (i.ability == PBAbilities::TRACE) if (opponent1.ability == PBAbilities::WATERABSORB) || (opponent1.ability == PBAbilities::VOLTABSORB) || (opponent1.ability == PBAbilities::STORMDRAIN) || (opponent1.ability == PBAbilities::MOTORDRIVE) || (opponent1.ability == PBAbilities::FLASHFIRE) || (opponent1.ability == PBAbilities::LEVITATE) || (opponent1.ability == PBAbilities::LIGHTNINGROD) || (opponent1.ability == PBAbilities::SAPSIPPER) || (opponent1.ability == PBAbilities::DRYSKIN) || (opponent1.ability == PBAbilities::SLUSHRUSH) || (opponent1.ability == PBAbilities::SANDRUSH) || (opponent1.ability == PBAbilities::SWIFTSWIM) || (opponent1.ability == PBAbilities::CHLOROPHYLL) || (opponent1.ability == PBAbilities::SPEEDBOOST) || (opponent1.ability == PBAbilities::WONDERGUARD) || (opponent1.ability == PBAbilities::PRANKSTER) || (i.speed>opponent1.pbSpeed && ((opponent1.ability == PBAbilities::ADAPTABILITY) || (opponent1.ability == PBAbilities::DOWNLOAD) || (opponent1.ability == PBAbilities::PROTEAN))) || (opponent1.attack>opponent1.spatk && (opponent1.ability == PBAbilities::INTIMIDATE)) || (opponent1.ability == PBAbilities::UNAWARE) || (i.hp==i.totalhp && ((opponent1.ability == PBAbilities::MULTISCALE) || (opponent1.ability == PBAbilities::SHADOWSHIELD))) monscore+=60 end end if (i.ability == PBAbilities::MAGMAARMOR) typecheck=false if aimem.length!=0 for j in aimem if (j.type == PBTypes::ICE) typecheck=true end end monscore+=20 if typecheck end if aimem2.length!=0 && skill>=PBTrainerAI.bestSkill for j in aimem2 if (j.type == PBTypes::ICE) typecheck=true end end monscore+=20 if typecheck end end if (i.ability == PBAbilities::SOUNDPROOF) monscore+=60 if checkAIbest(aimem,5) || checkAIbest(aimem2,5) end if (i.ability == PBAbilities::THICKFAT) monscore+=30 if checkAIbest(aimem,1,[PBTypes::ICE,PBTypes::FIRE]) || checkAIbest(aimem2,1,[PBTypes::ICE,PBTypes::FIRE]) end if (i.ability == PBAbilities::WATERBUBBLE) monscore+=30 if checkAIbest(aimem,1,[PBTypes::FIRE]) || checkAIbest(aimem2,1,[PBTypes::FIRE]) end if (i.ability == PBAbilities::LIQUIDOOZE) if aimem.length!=0 for j in aimem monscore+=40 if j.id==(PBMoves::LEECHSEED) || j.function==0xDD || j.function==0x139 || j.function==0x158 end end end if (i.ability == PBAbilities::RIVALRY) if i.gender==opponent1.gender monscore+=30 end if i.gender==opponent2.gender monscore+=30 end end if (i.ability == PBAbilities::SCRAPPY) if opponent1.pbHasType?(PBTypes::GHOST) monscore+=30 end if opponent2.pbHasType?(PBTypes::GHOST) monscore+=30 end end if (i.ability == PBAbilities::LIGHTMETAL) monscore+=10 if checkAImoves([PBMoves::GRASSKNOT,PBMoves::LOWKICK],aimem) end if (i.ability == PBAbilities::ANALYTIC) if ((i.speedi.level) || opp1roles.include?(PBMonRoles::SWEEPER) if opponent.effects[PBEffects::Substitute] > 0 monscore = -200 end if opponent1.species != PBSpecies::DITTO monscore = -500 end end if (i.ability == PBAbilities::MOXIE) || (i.ability == PBAbilities::BEASTBOOST) || (i.ability == PBAbilities::SOULHEART) if opponent1.totalhp!=0 monscore+=40 if ((i.speed>opponent1.pbSpeed) ^ (@trickroom!=0)) && ((opponent1.hp.to_f)/opponent1.totalhp<0.5) end if @doublebattle && opponent2.totalhp!=0 monscore+=40 if ((i.speed>opponent2.pbSpeed) ^ (@trickroom!=0)) && ((opponent2.hp.to_f)/opponent2.totalhp<0.5) end end if (i.ability == PBAbilities::SPEEDBOOST) if opponent1.totalhp!=0 monscore+=25 if (i.speed>opponent1.pbSpeed) && ((opponent1.hp.to_f)/opponent1.totalhp<0.3) end if @doublebattle && opponent2.totalhp!=0 monscore+=25 if (i.speed>opponent2.pbSpeed) && ((opponent2.hp.to_f)/opponent2.totalhp<0.3) end end if (i.ability == PBAbilities::JUSTIFIED) monscore+=30 if checkAIbest(aimem,1,[PBTypes::DARK]) || checkAIbest(aimem2,1,[PBTypes::DARK]) end if (i.ability == PBAbilities::RATTLED) monscore+=15 if checkAIbest(aimem,1,[PBTypes::DARK,PBTypes::GHOST,PBTypes::BUG]) || checkAIbest(aimem2,1,[PBTypes::DARK,PBTypes::GHOST,PBTypes::BUG]) end if (i.ability == PBAbilities::IRONBARBS) || (i.ability == PBAbilities::ROUGHSKIN) monscore+=30 if (opponent1.ability == PBAbilities::SKILLLINK) monscore+=30 if (opponent2.ability == PBAbilities::SKILLLINK) end if (i.ability == PBAbilities::PRANKSTER) monscore+=50 if ((opponent1.pbSpeed>i.speed) ^ (@trickroom!=0)) && !opponent1.pbHasType?(PBTypes::DARK) monscore+=50 if ((opponent2.pbSpeed>i.speed) ^ (@trickroom!=0)) && !opponent2.pbHasType?(PBTypes::DARK) end if (i.ability == PBAbilities::GALEWINGS) monscore+=50 if ((opponent1.pbSpeed>i.speed) ^ (@trickroom!=0)) && i.hp==i.totalhp && !currentmon.pbOwnSide.effects[PBEffects::StealthRock] monscore+=50 if ((opponent2.pbSpeed>i.speed) ^ (@trickroom!=0)) && i.hp==i.totalhp && !currentmon.pbOwnSide.effects[PBEffects::StealthRock] end if (i.ability == PBAbilities::BULLETPROOF) monscore+=60 if checkAIbest(aimem,6) || checkAIbest(aimem2,6) end if (i.ability == PBAbilities::AURABREAK) monscore+=50 if (opponent1.ability == PBAbilities::FAIRYAURA) || (opponent1.ability == PBAbilities::DARKAURA) monscore+=50 if (opponent2.ability == PBAbilities::FAIRYAURA) || (opponent2.ability == PBAbilities::DARKAURA) end if (i.ability == PBAbilities::PROTEAN) monscore+=40 if ((i.speed>opponent1.pbSpeed) ^ (@trickroom!=0)) || ((i.speed>opponent2.pbSpeed) ^ (@trickroom!=0)) end if (i.ability == PBAbilities::DANCER) monscore+=30 if checkAImoves(PBStuff::DANCEMOVE,aimem) monscore+=30 if checkAImoves(PBStuff::DANCEMOVE,aimem2) && skill>=PBTrainerAI.bestSkill end if (i.ability == PBAbilities::MERCILESS) if opponent1.status==PBStatuses::POISON || opponent2.status==PBStatuses::POISON monscore+=50 end end if (i.ability == PBAbilities::DAZZLING) || (i.ability == PBAbilities::QUEENLYMAJESTY) monscore+=20 if checkAIpriority(aimem) monscore+=20 if checkAIpriority(aimem2) && skill>=PBTrainerAI.bestSkill end if (i.ability == PBAbilities::SANDSTREAM) || (i.ability == PBAbilities::SNOWWARNING) || (nonmegaform.ability == PBAbilities::SANDSTREAM) || (nonmegaform.ability == PBAbilities::SNOWWARNING) monscore+=70 if (opponent1.ability == PBAbilities::WONDERGUARD) monscore+=70 if (opponent2.ability == PBAbilities::WONDERGUARD) end if (i.ability == PBAbilities::DEFEATIST) if currentmon.hp != 0 # hard switch monscore -= 80 end end if (i.ability == PBAbilities::STURDY) && i.hp == i.totalhp if currentmon.hp != 0 # hard switch monscore -= 80 end end end PBDebug.log(sprintf("Abilities: %d",monscore)) if $INTERNAL #Items if skill>=PBTrainerAI.highSkill if (i.item == PBItems::ROCKYHELMET) monscore+=30 if (opponent1.ability == PBAbilities::SKILLLINK) monscore+=30 if (opponent2.ability == PBAbilities::SKILLLINK) monscore+=30 if checkAIbest(aimem,4) || checkAIbest(aimem2,4) end if (i.item == PBItems::AIRBALLOON) allground=true biggestpower=0 groundcheck=false if aimem.length!=0 for j in aimem if !(j.type == PBTypes::GROUND) allground=false end end end if aimem2.length!=0 && skill>=PBTrainerAI.bestSkill for j in aimem2 if !(j.type == PBTypes::GROUND) allground=false end end end monscore+=60 if checkAIbest(aimem,1,[PBTypes::GROUND]) || checkAIbest(aimem2,1,[PBTypes::GROUND]) monscore+=100 if allground end if (i.item == PBItems::FLOATSTONE) monscore+=10 if checkAImoves([PBMoves::LOWKICK,PBMoves::GRASSKNOT],aimem) end if (i.item == PBItems::DESTINYKNOT) monscore+=20 if (opponent1.ability == PBAbilities::CUTECHARM) monscore+=20 if checkAImoves([PBMoves::ATTRACT],aimem) end if (i.item == PBItems::ABSORBBULB) monscore+=25 if checkAIbest(aimem,1,[PBTypes::WATER]) || checkAIbest(aimem2,1,[PBTypes::WATER]) end if (i.item == PBItems::CELLBATTERY) monscore+=25 if checkAIbest(aimem,1,[PBTypes::ELECTRIC]) || checkAIbest(aimem2,1,[PBTypes::ELECTRIC]) end if (((i.item == PBItems::FOCUSSASH) || ((i.ability == PBAbilities::STURDY)))) && i.hp == i.totalhp if @weather==PBWeather::SANDSTORM || @weather==PBWeather::HAIL || currentmon.pbOwnSide.effects[PBEffects::StealthRock] || currentmon.pbOwnSide.effects[PBEffects::Spikes]>0 || currentmon.pbOwnSide.effects[PBEffects::ToxicSpikes]>0 monscore-=30 end if currentmon.hp != 0 # hard switch monscore -= 80 end monscore+= (30)*opponent1.stages[PBStats::ATTACK] monscore+= (30)*opponent1.stages[PBStats::SPATK] monscore+= (30)*opponent1.stages[PBStats::SPEED] end if (i.item == PBItems::SNOWBALL) monscore+=25 if checkAIbest(aimem,1,[PBTypes::ICE]) || checkAIbest(aimem2,1,[PBTypes::ICE]) end if (i.item == PBItems::PROTECTIVEPADS) if (i.ability == PBAbilities::EFFECTSPORE) || (i.ability == PBAbilities::STATIC) || (i.ability == PBAbilities::POISONPOINT) || (i.ability == PBAbilities::ROUGHSKIN) || (i.ability == PBAbilities::IRONBARBS) || (i.ability == PBAbilities::FLAMEBODY) || (i.ability == PBAbilities::CUTECHARM) || (i.ability == PBAbilities::MUMMY) || (i.ability == PBAbilities::AFTERMATH) || (i.ability == PBAbilities::GOOEY) || ((i.ability == PBAbilities::FLUFFY) && (!opponent1.pbHasType?(PBTypes::FIRE) && !opponent2.pbHasType?(PBTypes::FIRE))) || (opponent1.item == PBItems::ROCKYHELMET) monscore+=25 end end end PBDebug.log(sprintf("Items: %d",monscore)) if $INTERNAL #Fields if skill>=PBTrainerAI.bestSkill case $fefieldeffect when 1 monscore+=50 if (i.ability == PBAbilities::SURGESURFER) monscore+=25 if (i.ability == PBAbilities::GALVANIZE) monscore+=25 if i.hasType?(:ELECTRIC) when 2 monscore+=30 if (i.ability == PBAbilities::GRASSPELT) monscore+=25 if i.hasType?(:GRASS) || i.hasType?(:FIRE) when 3 monscore+=20 if i.hasType?(:FAIRY) monscore+=20 if (i.ability == PBAbilities::MARVELSCALE) monscore+=20 if (i.ability == PBAbilities::DRYSKIN) monscore+=20 if (i.ability == PBAbilities::WATERCOMPACTION) monscore+=25 if (i.ability == PBAbilities::PIXILATE) monscore+=25 if (i.ability == PBAbilities::SOULHEART) when 4 monscore+=30 if (i.ability == PBAbilities::PRISMARMOR) monscore+=30 if (i.ability == PBAbilities::SHADOWSHIELD) when 5 monscore+=10 if (i.ability == PBAbilities::ADAPTABILITY) monscore+=10 if (i.ability == PBAbilities::SYNCHRONIZE) monscore+=10 if (i.ability == PBAbilities::ANTICIPATION) monscore+=10 if (i.ability == PBAbilities::TELEPATHY) when 6 monscore+=30 if (i.ability == PBAbilities::SHEERFORCE) monscore+=30 if (i.ability == PBAbilities::PUREPOWER) monscore+=30 if (i.ability == PBAbilities::HUGEPOWER) monscore+=30 if (i.ability == PBAbilities::GUTS) monscore+=10 if (i.ability == PBAbilities::DANCER) monscore+=20 if i.hasType?(:FIGHTING) when 7 monscore+=25 if i.hasType?(:FIRE) monscore+=15 if (i.ability == PBAbilities::WATERVEIL) monscore+=15 if (i.ability == PBAbilities::WATERBUBBLE) monscore+=30 if (i.ability == PBAbilities::FLASHFIRE) monscore+=30 if (i.ability == PBAbilities::FLAREBOOST) monscore+=30 if (i.ability == PBAbilities::BLAZE) monscore-=30 if (i.ability == PBAbilities::ICEBODY) monscore-=30 if (i.ability == PBAbilities::LEAFGUARD) monscore-=30 if (i.ability == PBAbilities::GRASSPELT) monscore-=30 if (i.ability == PBAbilities::FLUFFY) when 8 monscore+=15 if (i.ability == PBAbilities::GOOEY) monscore+=20 if (i.ability == PBAbilities::WATERCOMPACTION) when 9 monscore+=10 if (i.ability == PBAbilities::WONDERSKIN) monscore+=20 if (i.ability == PBAbilities::MARVELSCALE) monscore+=25 if (i.ability == PBAbilities::SOULHEART) monscore+=30 if (i.ability == PBAbilities::CLOUDNINE) monscore+=30 if (i.ability == PBAbilities::PRISMARMOR) when 10 monscore+=20 if (i.ability == PBAbilities::POISONHEAL) monscore+=25 if (i.ability == PBAbilities::TOXICBOOST) monscore+=30 if (i.ability == PBAbilities::MERCILESS) monscore+=30 if (i.ability == PBAbilities::CORROSION) monscore+=15 if i.hasType?(:POISON) when 11 monscore+=10 if (i.ability == PBAbilities::WATERCOMPACTION) monscore+=20 if (i.ability == PBAbilities::POISONHEAL) monscore+=25 if (i.ability == PBAbilities::TOXICBOOST) monscore+=30 if (i.ability == PBAbilities::MERCILESS) monscore+=30 if (i.ability == PBAbilities::CORROSION) monscore+=15 if i.hasType?(:POISON) when 12 monscore+=20 if ((i.ability == PBAbilities::SANDSTREAM) || (nonmegaform.ability == PBAbilities::SANDSTREAM)) monscore+=25 if (i.ability == PBAbilities::SANDVEIL) monscore+=30 if (i.ability == PBAbilities::SANDFORCE) monscore+=50 if (i.ability == PBAbilities::SANDRUSH) monscore+=20 if i.hasType?(:GROUND) monscore-=25 if i.hasType?(:ELECTRIC) when 13 monscore+=25 if i.hasType?(:ICE) monscore+=25 if (i.ability == PBAbilities::ICEBODY) monscore+=25 if (i.ability == PBAbilities::SNOWCLOAK) monscore+=25 if (i.ability == PBAbilities::REFRIGERATE) monscore+=50 if (i.ability == PBAbilities::SLUSHRUSH) when 14 when 15 monscore+=20 if (i.ability == PBAbilities::SAPSIPPER) monscore+=25 if i.hasType?(:GRASS) || i.hasType?(:BUG) monscore+=30 if (i.ability == PBAbilities::GRASSPELT) monscore+=30 if (i.ability == PBAbilities::OVERGROW) monscore+=30 if (i.ability == PBAbilities::SWARM) when 16 monscore+=15 if i.hasType?(:FIRE) when 17 monscore+=25 if i.hasType?(:ELECTRIC) monscore+=20 if (i.ability == PBAbilities::MOTORDRIVE) monscore+=20 if (i.ability == PBAbilities::STEELWORKER) monscore+=25 if (i.ability == PBAbilities::DOWNLOAD) monscore+=25 if (i.ability == PBAbilities::TECHNICIAN) monscore+=25 if (i.ability == PBAbilities::GALVANIZE) when 18 monscore+=20 if (i.ability == PBAbilities::VOLTABSORB) monscore+=20 if (i.ability == PBAbilities::STATIC) monscore+=25 if (i.ability == PBAbilities::GALVANIZE) monscore+=50 if (i.ability == PBAbilities::SURGESURFER) monscore+=25 if i.hasType?(:ELECTRIC) when 19 monscore+=10 if i.hasType?(:POISON) monscore+=10 if (i.ability == PBAbilities::CORROSION) monscore+=20 if (i.ability == PBAbilities::POISONHEAL) monscore+=20 if (i.ability == PBAbilities::EFFECTSPORE) monscore+=20 if (i.ability == PBAbilities::POISONPOINT) monscore+=20 if (i.ability == PBAbilities::STENCH) monscore+=20 if (i.ability == PBAbilities::GOOEY) monscore+=25 if (i.ability == PBAbilities::TOXICBOOST) monscore+=30 if (i.ability == PBAbilities::MERCILESS) when 20 monscore+=10 if i.hasType?(:FIGHTING) monscore+=15 if (i.ability == PBAbilities::OWNTEMPO) monscore+=15 if (i.ability == PBAbilities::PUREPOWER) monscore+=15 if (i.ability == PBAbilities::STEADFAST) monscore+=20 if ((i.ability == PBAbilities::SANDSTREAM) || (nonmegaform.ability == PBAbilities::SANDSTREAM)) monscore+=20 if (i.ability == PBAbilities::WATERCOMPACTION) monscore+=30 if (i.ability == PBAbilities::SANDFORCE) monscore+=35 if (i.ability == PBAbilities::SANDVEIL) monscore+=50 if (i.ability == PBAbilities::SANDRUSH) when 21 monscore+=25 if i.hasType?(:WATER) monscore+=25 if i.hasType?(:ELECTRIC) monscore+=25 if (i.ability == PBAbilities::WATERVEIL) monscore+=25 if (i.ability == PBAbilities::HYDRATION) monscore+=25 if (i.ability == PBAbilities::TORRENT) monscore+=25 if (i.ability == PBAbilities::SCHOOLING) monscore+=25 if (i.ability == PBAbilities::WATERCOMPACTION) monscore+=50 if (i.ability == PBAbilities::SWIFTSWIM) monscore+=50 if (i.ability == PBAbilities::SURGESURFER) mod1=PBTypes.getEffectiveness(PBTypes::WATER,i.type1) mod2=(i.type1==i.type2) ? 2 : PBTypes.getEffectiveness(PBTypes::WATER,i.type2) monscore-=50 if mod1*mod2>4 when 22 monscore+=25 if i.hasType?(:WATER) monscore+=25 if i.hasType?(:ELECTRIC) monscore+=25 if (i.ability == PBAbilities::WATERVEIL) monscore+=25 if (i.ability == PBAbilities::HYDRATION) monscore+=25 if (i.ability == PBAbilities::TORRENT) monscore+=25 if (i.ability == PBAbilities::SCHOOLING) monscore+=25 if (i.ability == PBAbilities::WATERCOMPACTION) monscore+=50 if (i.ability == PBAbilities::SWIFTSWIM) monscore+=50 if (i.ability == PBAbilities::SURGESURFER) mod1=PBTypes.getEffectiveness(PBTypes::WATER,i.type1) mod2=(i.type1==i.type2) ? 2 : PBTypes.getEffectiveness(PBTypes::WATER,i.type2) monscore-=50 if mod1*mod2>4 when 23 monscore+=15 if i.hasType?(:GROUND) when 24 when 25 monscore+=25 if i.hasType?(:DRAGON) monscore+=30 if (i.ability == PBAbilities::PRISMARMOR) when 26 monscore+=25 if i.hasType?(:WATER) monscore+=25 if i.hasType?(:POISON) monscore+=25 if i.hasType?(:ELECTRIC) monscore+=25 if (i.ability == PBAbilities::SCHOOLING) monscore+=25 if (i.ability == PBAbilities::WATERCOMPACTION) monscore+=25 if (i.ability == PBAbilities::TOXICBOOST) monscore+=25 if (i.ability == PBAbilities::POISONHEAL) monscore+=25 if (i.ability == PBAbilities::MERCILESS) monscore+=50 if (i.ability == PBAbilities::SWIFTSWIM) monscore+=50 if (i.ability == PBAbilities::SURGESURFER) monscore+=20 if (i.ability == PBAbilities::GOOEY) monscore+=20 if (i.ability == PBAbilities::STENCH) when 27 monscore+=25 if i.hasType?(:ROCK) monscore+=25 if i.hasType?(:FLYING) monscore+=20 if ((i.ability == PBAbilities::SNOWWARNING) || (nonmegaform.ability == PBAbilities::SNOWWARNING)) monscore+=20 if ((i.ability == PBAbilities::DROUGHT) || (nonmegaform.ability == PBAbilities::DROUGHT)) monscore+=25 if (i.ability == PBAbilities::LONGREACH) monscore+=30 if (i.ability == PBAbilities::GALEWINGS) && @weather==PBWeather::STRONGWINDS when 28 monscore+=25 if i.hasType?(:ROCK) monscore+=25 if i.hasType?(:FLYING) monscore+=25 if i.hasType?(:ICE) monscore+=20 if ((i.ability == PBAbilities::SNOWWARNING) || (nonmegaform.ability == PBAbilities::DROUGHT)) monscore+=20 if ((i.ability == PBAbilities::DROUGHT) || (nonmegaform.ability == PBAbilities::DROUGHT)) monscore+=20 if (i.ability == PBAbilities::ICEBODY) monscore+=20 if (i.ability == PBAbilities::SNOWCLOAK) monscore+=25 if (i.ability == PBAbilities::LONGREACH) monscore+=25 if (i.ability == PBAbilities::REFRIGERATE) monscore+=30 if (i.ability == PBAbilities::GALEWINGS) && @weather==PBWeather::STRONGWINDS monscore+=50 if (i.ability == PBAbilities::SLUSHRUSH) when 29 monscore+=20 if i.hasType?(:NORMAL) monscore+=20 if (i.ability == PBAbilities::JUSTIFIED) when 30 monscore+=25 if (i.ability == PBAbilities::SANDVEIL) monscore+=25 if (i.ability == PBAbilities::SNOWCLOAK) monscore+=25 if (i.ability == PBAbilities::ILLUSION) monscore+=25 if (i.ability == PBAbilities::TANGLEDFEET) monscore+=25 if (i.ability == PBAbilities::MAGICBOUNCE) monscore+=25 if (i.ability == PBAbilities::COLORCHANGE) when 31 monscore+=25 if i.hasType?(:FAIRY) monscore+=25 if i.hasType?(:STEEL) monscore+=40 if i.hasType?(:DRAGON) monscore+=25 if (i.ability == PBAbilities::POWEROFALCHEMY) monscore+=25 if ((i.ability == PBAbilities::MAGICGUARD) || (nonmegaform.ability == PBAbilities::MAGICGUARD)) monscore+=25 if (i.ability == PBAbilities::MAGICBOUNCE) monscore+=25 if (i.ability == PBAbilities::BATTLEARMOR) monscore+=25 if (i.ability == PBAbilities::SHELLARMOR) monscore+=25 if (i.ability == PBAbilities::MAGICIAN) monscore+=25 if (i.ability == PBAbilities::MARVELSCALE) monscore+=30 if (i.ability == PBAbilities::STANCECHANGE) when 32 monscore+=25 if i.hasType?(:FIRE) monscore+=50 if i.hasType?(:DRAGON) monscore+=20 if (i.ability == PBAbilities::MARVELSCALE) monscore+=20 if (i.ability == PBAbilities::MULTISCALE) monscore+=20 if ((i.ability == PBAbilities::MAGMAARMOR) || (nonmegaform.ability == PBAbilities::MAGMAARMOR)) when 33 monscore+=25 if i.hasType?(:GRASS) monscore+=25 if i.hasType?(:BUG) monscore+=20 if (i.ability == PBAbilities::FLOWERGIFT) monscore+=20 if (i.ability == PBAbilities::FLOWERVEIL) monscore+=20 if ((i.ability == PBAbilities::DROUGHT) || (nonmegaform.ability == PBAbilities::DROUGHT)) monscore+=20 if ((i.ability == PBAbilities::DRIZZLE) || (nonmegaform.ability == PBAbilities::DRIZZLE)) when 34 monscore+=25 if i.hasType?(:PSYCHIC) monscore+=25 if i.hasType?(:FAIRY) monscore+=25 if i.hasType?(:DARK) monscore+=20 if (i.ability == PBAbilities::MARVELSCALE) monscore+=20 if (i.ability == PBAbilities::VICTORYSTAR) monscore+=25 if ((i.ability == PBAbilities::ILLUMINATE) || (nonmegaform.ability == PBAbilities::ILLUMINATE)) monscore+=30 if (i.ability == PBAbilities::SHADOWSHIELD) when 35 monscore+=25 if i.hasType?(:FLYING) monscore+=25 if i.hasType?(:DARK) monscore+=20 if (i.ability == PBAbilities::VICTORYSTAR) monscore+=25 if (i.ability == PBAbilities::LEVITATE) monscore+=30 if (i.ability == PBAbilities::SHADOWSHIELD) when 36 when 37 monscore+=25 if i.hasType?(:PSYCHIC) monscore+=20 if (i.ability == PBAbilities::PUREPOWER) monscore+=20 if ((i.ability == PBAbilities::ANTICIPATION) || (nonmegaform.ability == PBAbilities::ANTICIPATION)) monscore+=50 if (i.ability == PBAbilities::TELEPATHY) end end PBDebug.log(sprintf("Fields: %d",monscore)) if $INTERNAL if currentmon.pbOwnSide.effects[PBEffects::StealthRock] || currentmon.pbOwnSide.effects[PBEffects::Spikes]>0 monscore= (monscore*(i.hp.to_f/i.totalhp.to_f)).floor end hazpercent = totalHazardDamage(currentmon.pbOwnSide,nonmegaform.type1,nonmegaform.type2,nonmegaform.isAirborne?,skill) if hazpercent>(i.hp.to_f/i.totalhp)*100 monscore=1 end if theseRoles.include?(PBMonRoles::ACE) && skill>=PBTrainerAI.bestSkill monscore*= 0.3 end monscore.floor PBDebug.log(sprintf("Score: %d",monscore)) if $INTERNAL PBDebug.log(sprintf(" ")) if $INTERNAL scorearray.push(monscore) end count=-1 bestcount=-1 highscore=-1000000000000 for score in scorearray count+=1 next if party[count].nil? if score>highscore highscore=score bestcount=count elsif score==highscore if party[count].hp>party[bestcount].hp bestcount=count end end end if !pbCanSwitchLax?(currentmon.index,bestcount,false) return -1 else return bestcount end end def totalHazardDamage(side,type1,type2,airborne,skill) percentdamage = 0 if side.effects[PBEffects::Spikes]>0 && (!airborne || @field.effects[PBEffects::Gravity]>0) spikesdiv=[8,8,6,4][side.effects[PBEffects::Spikes]] percentdamage += (100.0/spikesdiv).floor end if side.effects[PBEffects::StealthRock] supereff = -1 atype=PBTypes::ROCK if skill>=PBTrainerAI.bestSkill if $fefieldeffect == 25 atype1=PBTypes::WATER atype2=PBTypes::GRASS atype3=PBTypes::FIRE atype4=PBTypes::PSYCHIC eff1=PBTypes.getCombinedEffectiveness(atype1,type1,type2) eff2=PBTypes.getCombinedEffectiveness(atype2,type1,type2) eff3=PBTypes.getCombinedEffectiveness(atype3,type1,type2) eff4=PBTypes.getCombinedEffectiveness(atype4,type1,type2) supereff = [eff1,eff2,eff3,eff4].max end end eff=PBTypes.getCombinedEffectiveness(atype,type1,type2) eff = supereff if supereff > -1 if eff>0 if skill>=PBTrainerAI.bestSkill if $fefieldeffect == 14 || $fefieldeffect == 23 eff = eff*2 end end percentdamage += 100*(eff/32.0) end end return percentdamage end end