• Our software update is now concluded. You will need to reset your password to log in. In order to do this, you will have to click "Log in" in the top right corner and then "Forgot your password?".
  • Welcome to PokéCommunity! Register now and join one of the best fan communities on the 'net to talk Pokémon and more! We are not affiliated with The Pokémon Company or Nintendo.

Plug-and-play Delta Pokemon/Alolan Forms script

824
Posts
8
Years
So, this might make me sound dumb, but how do I set up the strange souvenir item? I'm not very good at this kind of thing

Add this line of code to the bottom of your game's items.txt (found in the folder "PBS") :

Code:
700,STRANGESOUVENIR,Strange Souvenir,Strange Souvenirs,1,3000,"An ornament depicting a mysterious Pokémon that has been venerated as a guardian deity for an extremely long time in the Alola region.",2,0,0,
 

Minokun

The Rival in Space
107
Posts
10
Years
  • Seen Sep 18, 2019
If I wanted to make a Delta Pokemon a gift from an NPC, or a separate event battle or encounter, how would I do this?
 

esteban

Pokémon Moon Version
5
Posts
8
Years
  • Age 24
  • Seen Aug 7, 2017
I have made an event that gives an Alolan Vulpix to the player like this:

poke=PokeBattle_Pokemon.new(:VULPIX,50,$Trainer)
poke.makeDelta
poke.pbLearnMove(:BLIZZARD)
poke.pbLearnMove(:GRUDGE)
poke.pbLearnMove(:CAPTIVATE)
poke.pbLearnMove(:SHEERCOLD)
pbAddPokemon(poke)
poke.calcStats

But when I try to evolve Vulpix by using the Ice Stone I've added to the game's PBS files and to the script, it says "NOT ABLE". Is there any way of fixing this?

EDIT: When I catch a wild Vulpix and try to evolve that with the Ice Stone, it doesn't seen to be working for me either...
 
Last edited:
824
Posts
8
Years
But when I try to evolve Vulpix by using the Ice Stone I've added to the game's PBS files and to the script, it says "NOT ABLE". Is there any way of fixing this?

Are you absolutely certain you added it to the list of items that the game should count as evolutionary stones? Does it have the internal name ICESTONE?
 

esteban

Pokémon Moon Version
5
Posts
8
Years
  • Age 24
  • Seen Aug 7, 2017
Are you absolutely certain you added it to the list of items that the game should count as evolutionary stones? Does it have the internal name ICESTONE?

Yes, in PBItem_Items I added 'ICESTONE' (with : in front) to def pbIsEvolutionStone?(item)
In PBItem_ItemEffects I added it to ItemHandlers::UseOnPokemon.copy

Is there a specific order I have to maintain? Or do I have to add the Ice Stone in other parts of the script too?
I just searched in the script for 'WATERSTONE' and added 'ICESTONE' everywhere I could find the Water Stone.
 
824
Posts
8
Years
Yes, in PBItem_Items I added 'ICESTONE' (with : in front) to def pbIsEvolutionStone?(item)
In PBItem_ItemEffects I added it to ItemHandlers::UseOnPokemon.copy

Is there a specific order I have to maintain? Or do I have to add the Ice Stone in other parts of the script too?
I just searched in the script for 'WATERSTONE' and added 'ICESTONE' everywhere I could find the Water Stone.

Nope. The way it's coded, it should change Delta Alolan Vulpix's and Sandshrew's evolution methods as long as an item with the internal name ICESTONE exists.
 

esteban

Pokémon Moon Version
5
Posts
8
Years
  • Age 24
  • Seen Aug 7, 2017
Nope. The way it's coded, it should change Delta Alolan Vulpix's and Sandshrew's evolution methods as long as an item with the internal name ICESTONE exists.

I found a way to make it work! I went to your script and searched for the line:

ret[0][2]=getConst(PBItems,:ICESTONE) if isConst?(species,PBSpecies,:VULPIX) && getConst(PBItems,:ICESTONE)!=nil

and changed it to:

ret[0][1]=getConst(PBItems,:ICESTONE) if isConst?(species,PBSpecies,:VULPIX)

The same goes for Alolan Sandshrew.
 
35
Posts
7
Years
  • Age 36
  • Seen Nov 1, 2018
It's working but when I caught an alolan form pokemon then i let it level up, all the moves it can learn is still same as its kantonian counterpart or did i miss something?
 
824
Posts
8
Years
But I tried with vulpix and it learned all fire moves and no ice moves other than the predefined I put.
Sorry to be an ass about this.

Nope, you're not an ass. Also, you are correct, it isn't loading level-up movesets correctly. Let me fix that.

Replace your Alolan/Delta script with this. The first post in the topic has also been updated with this change.
Code:
#########################################################################
# Delta Pokemon/Alolan Form code
# This is compatible with Essentials v16.2
# Also compatible with Luka's Elite Battle System (EBS),
#    Klien's BW Essentials kit,
#    and mej's Following Pokemon script
# Note that this code adds the Alolan forms as code within the game
# It does not automatically create the Alolan forms as possible
#    encounters.
# You as the game developer need to decide how you want players to
#    encounter the Alolan Pokemon.
#########################################################################
# To use
# 1.) place in a new script section below "PSystem_Utilities" but
#    above "Main"
#  - if using the EBS or Following Pokemon scripts, place below those
#      scripts as well as "PSystem_Utilities"
# 2.) Decide how you want the player to encounter Delta/Alolan Pokemon
#  - see the bottom of this script for an example that makes Alolan
#      Exeggutor appear on a certain map
#########################################################################
# Please note that the breeding mechanics for Deltaness work under the
#    assumption that your fangame will NOT be taking place in Alola.
# Likewise, the evolution mechanics for Pikachu, Cubone, and Exeggcute
#    work under the assumption that your fangame will NOT be taking
#    place in Alola, but that you DO wish the players to be able to
#    obtain Alolan Raichu, Alolan Marowak, and Alolan Exeggutor in
#    some way.
#########################################################################

# Battlers

class PokeBattle_Battler
  def isDelta?
    return (@pokemon) ? @pokemon.isDelta? : false
  end

  def isAlolan?
    return (@pokemon) ? @pokemon.isDelta? : false
  end

  def isEgg?
    return (@pokemon) ? (@pokemon.isEgg? rescue @pokemon.egg? rescue false) : false
  end

  def isAlolaForm?
    return (@pokemon) ? @pokemon.isDelta? : false
  end
end

class PokeBattle_FakeBattler
  def isDelta?; return @pokemon.isDelta?; end
  def isAlolan?; return @pokemon.isDelta?; end
  def isAlolaForm?; return @pokemon.isDelta?; end
end

# Pokemon

class PokeBattle_Pokemon
  alias ____mf_getAbilityList getAbilityList
  def getAbilityList
    v=MultipleForms.call("getAbilityList",self)
    return v if v!=nil && v.length>0
    return self.____mf_getAbilityList
  end
  
  # generates the list of Egg Moves
  def possibleEggMoves
    v=MultipleForms.call("possibleEggMoves",self)
    return v if v!=nil
    pbRgssOpen("Data/eggEmerald.dat","rb"){|f|
         f.pos=(self.species-1)*8
         offset=f.fgetdw
         length=f.fgetdw
         if length>0
           bob=[]
           f.pos=offset
           i=0; loop do break unless i<length
             atk=f.fgetw
             bob.push(atk)
             i+=1
           end
           return bob
         else
           return []
         end
       }
  end

  attr_accessor(:deltaflag)  # Forces the deltaness (true/false)

  def isDelta?
    return @deltaflag if @deltaflag != nil
        return false
  end

  def isAlolan?
    return isDelta?
  end

  def isAlolaForm?
    return isDelta?
  end
  
  def makeDelta
    @deltaflag=true
  end

  # provides a fix for forms crashing game
  def spoofForm(val)
    @deltaflag = false
    @form = val
  end
end

# Breeding
def pbDayCareGenerateEgg
  if pbDayCareDeposited!=2
    return
  elsif $Trainer.party.length>=6
    raise _INTL("Can't store the egg")
  end
  pokemon0=$PokemonGlobal.daycare[0][0]
  pokemon1=$PokemonGlobal.daycare[1][0]
  mother=nil
  father=nil
  babyspecies=0
  ditto0=pbIsDitto?(pokemon0)
  ditto1=pbIsDitto?(pokemon1)
  if (pokemon0.isFemale? || ditto0)
    babyspecies=(ditto0) ? pokemon1.species : pokemon0.species
    mother=pokemon0
    father=pokemon1
  else
    babyspecies=(ditto1) ? pokemon0.species : pokemon1.species
    mother=pokemon1
    father=pokemon0
  end
  babyspecies=pbGetBabySpecies(babyspecies,mother.item,father.item)
  if isConst?(babyspecies,PBSpecies,:MANAPHY) && hasConst?(PBSpecies,:PHIONE)
    babyspecies=getConst(PBSpecies,:PHIONE)
  elsif (isConst?(babyspecies,PBSpecies,:NIDORANfE) && hasConst?(PBSpecies,:NIDORANmA)) ||
        (isConst?(babyspecies,PBSpecies,:NIDORANmA) && hasConst?(PBSpecies,:NIDORANfE))
    babyspecies=[getConst(PBSpecies,:NIDORANmA),
                 getConst(PBSpecies,:NIDORANfE)][rand(2)]
  elsif (isConst?(babyspecies,PBSpecies,:VOLBEAT) && hasConst?(PBSpecies,:ILLUMISE)) ||
        (isConst?(babyspecies,PBSpecies,:ILLUMISE) && hasConst?(PBSpecies,:VOLBEAT))
    babyspecies=[getConst(PBSpecies,:VOLBEAT),
                 getConst(PBSpecies,:ILLUMISE)][rand(2)]
  end
  # Generate egg
  egg=PokeBattle_Pokemon.new(babyspecies,EGGINITIALLEVEL,$Trainer)
  # Randomise personal ID
  pid=rand(65536)
  pid|=(rand(65536)<<16)
  egg.personalID=pid
  # Inheriting form
  if isConst?(babyspecies,PBSpecies,:BURMY) ||
     isConst?(babyspecies,PBSpecies,:SHELLOS) ||
     isConst?(babyspecies,PBSpecies,:BASCULIN) ||
     isConst?(babyspecies,PBSpecies,:MINIOR) ||
     isConst?(babyspecies,PBSpecies,:ORICORIO)
    egg.form=mother.form
  end
  # Inheriting Delta-ness
  if (mother.isDelta? && isConst?(mother.item,PBItems,:EVERSTONE)) ||
     (mother.isDelta? && isConst?(mother.item,PBItems,:STRANGESOUVENIR)) ||
	 (father.isDelta? && isConst?(father.item,PBItems,:EVERSTONE)) ||
     (father.isDelta? && isConst?(father.item,PBItems,:STRANGESOUVENIR))
    egg.makeDelta
  end
  # Inheriting Moves
  moves=[]
  othermoves=[] 
  movefather=father; movemother=mother
  if pbIsDitto?(movefather) && !mother.isFemale?
    movefather=mother; movemother=father
  end
  # Initial Moves
  initialmoves=egg.getMoveList
  moop=egg.possibleEggMoves
  for k in initialmoves
    if k[0]<=EGGINITIALLEVEL
      moves.push(k[1])
    else
      othermoves.push(k[1]) if mother.knowsMove?(k[1]) && father.knowsMove?(k[1])
    end
  end
  # Inheriting Natural Moves
  for move in othermoves
    moves.push(move)
  end
  # Inheriting Machine Moves
  if !USENEWBATTLEMECHANICS
    for i in 0...$ItemData.length
      next if !$ItemData[i]
      atk=$ItemData[i][ITEMMACHINE]
      next if !atk || atk==0
      if egg.isCompatibleWithMove?(atk)
        moves.push(atk) if movefather.knowsMove?(atk)
      end
    end
  end
  # Inheriting Egg Moves
  if moop.length>0 && movefather.isMale?
    for i in moop
      moves.push(i) if movefather.knowsMove?(i)
    end
  end
  if USENEWBATTLEMECHANICS && moop.length>0 && movemother.isFemale?
    for i in moop
      moves.push(i) if movemother.knowsMove?(i)
    end
  end
  # Volt Tackle
  lightball=false
  if (isConst?(father.species,PBSpecies,:PIKACHU) || 
      isConst?(father.species,PBSpecies,:RAICHU)) && 
      isConst?(father.item,PBItems,:LIGHTBALL)
    lightball=true
  end
  if (isConst?(mother.species,PBSpecies,:PIKACHU) || 
      isConst?(mother.species,PBSpecies,:RAICHU)) && 
      isConst?(mother.item,PBItems,:LIGHTBALL)
    lightball=true
  end
  if lightball && isConst?(babyspecies,PBSpecies,:PICHU) &&
     hasConst?(PBMoves,:VOLTTACKLE)
    moves.push(getConst(PBMoves,:VOLTTACKLE))
  end
  moves|=[] # remove duplicates
  # Assembling move list
  finalmoves=[]
  listend=moves.length-4
  listend=0 if listend<0
  j=0
  for i in listend..listend+3
    moveid=(i>=moves.length) ? 0 : moves[i]
    finalmoves[j]=PBMove.new(moveid)
    j+=1
  end 
  # Inheriting Individual Values
  ivs=[]
  for i in 0...6
    ivs[i]=rand(32)
  end
  ivinherit=[]
  for i in 0...2
    parent=[mother,father][i]
    ivinherit[i]=PBStats::HP if isConst?(parent.item,PBItems,:POWERWEIGHT)
    ivinherit[i]=PBStats::ATTACK if isConst?(parent.item,PBItems,:POWERBRACER)
    ivinherit[i]=PBStats::DEFENSE if isConst?(parent.item,PBItems,:POWERBELT)
    ivinherit[i]=PBStats::SPEED if isConst?(parent.item,PBItems,:POWERANKLET)
    ivinherit[i]=PBStats::SPATK if isConst?(parent.item,PBItems,:POWERLENS)
    ivinherit[i]=PBStats::SPDEF if isConst?(parent.item,PBItems,:POWERBAND)
  end
  num=0; r=rand(2)
  for i in 0...2
    if ivinherit[r]!=nil
      parent=[mother,father][r]
      ivs[ivinherit[r]]=parent.iv[ivinherit[r]]
      num+=1
      break
    end
    r=(r+1)%2
  end
  stats=[PBStats::HP,PBStats::ATTACK,PBStats::DEFENSE,
         PBStats::SPEED,PBStats::SPATK,PBStats::SPDEF]
  limit=(USENEWBATTLEMECHANICS && (isConst?(mother.item,PBItems,:DESTINYKNOT) ||
         isConst?(father.item,PBItems,:DESTINYKNOT))) ? 5 : 3
  loop do
    freestats=[]
    for i in stats
      freestats.push(i) if !ivinherit.include?(i)
    end
    break if freestats.length==0
    r=freestats[rand(freestats.length)]
    parent=[mother,father][rand(2)]
    ivs[r]=parent.iv[r]
    ivinherit.push(r)
    num+=1
    break if num>=limit
  end
  # Inheriting nature
  newnatures=[]
  newnatures.push(mother.nature) if isConst?(mother.item,PBItems,:EVERSTONE)
  newnatures.push(father.nature) if isConst?(father.item,PBItems,:EVERSTONE)
  if newnatures.length>0
    egg.setNature(newnatures[rand(newnatures.length)])
  end
  # Masuda method and Shiny Charm
  shinyretries=0
  shinyretries+=5 if father.language!=mother.language
  shinyretries+=2 if hasConst?(PBItems,:SHINYCHARM) &&
                     $PokemonBag.pbQuantity(:SHINYCHARM)>0
  if shinyretries>0
    for i in 0...shinyretries
      break if egg.isShiny?
      egg.personalID=rand(65536)|(rand(65536)<<16)
    end
  end
  # Inheriting ability from the mother
  if (!ditto0 && !ditto1)
    if mother.hasHiddenAbility?
      egg.setAbility(mother.abilityIndex) if rand(10)<6
    else
      if rand(10)<8
        egg.setAbility(mother.abilityIndex)
      else
        egg.setAbility((mother.abilityIndex+1)%2)
      end
    end
  elsif ((!ditto0 && ditto1) || (!ditto1 && ditto0)) && USENEWBATTLEMECHANICS
    parent=(!ditto0) ? mother : father
    if parent.hasHiddenAbility?
      egg.setAbility(parent.abilityIndex) if rand(10)<6
    end
  end
  # Inheriting Poké Ball from the mother
  if mother.isFemale? &&
     !isConst?(pbBallTypeToBall(mother.ballused),PBItems,:MASTERBALL) &&
     !isConst?(pbBallTypeToBall(mother.ballused),PBItems,:CHERISHBALL)
    egg.ballused=mother.ballused
  end
  egg.iv[0]=ivs[0]
  egg.iv[1]=ivs[1]
  egg.iv[2]=ivs[2]
  egg.iv[3]=ivs[3]
  egg.iv[4]=ivs[4]
  egg.iv[5]=ivs[5]
  egg.moves[0]=finalmoves[0]
  egg.moves[1]=finalmoves[1]
  egg.moves[2]=finalmoves[2]
  egg.moves[3]=finalmoves[3]
  egg.calcStats
  egg.obtainText=_INTL("Day-Care Couple")
  egg.name=_INTL("Egg")
  dexdata=pbOpenDexData
  pbDexDataOffset(dexdata,babyspecies,21)
  eggsteps=dexdata.fgetw
  dexdata.close
  egg.eggsteps=eggsteps
  if rand(65536)<POKERUSCHANCE
    egg.givePokerus
  end
  $Trainer.party[$Trainer.party.length]=egg
end

##############################################################
# Appearance change
##############################################################
class PokemonSprite < SpriteWrapper
  def setSpeciesBitmap(species,female=false,form=0,shiny=false,shadow=false,back=false,egg=false,delta=false)
    @_iconbitmap.dispose if @_iconbitmap
    @_iconbitmap=species>0 ? pbLoadSpeciesBitmap(species,female,form,shiny,shadow,back,egg,delta) : nil
    self.bitmap=@_iconbitmap ? @_iconbitmap.bitmap : nil
  end
end

class PokemonEggHatchScene
  def pbStartScene(pokemon)
    @sprites={}
    @pokemon=pokemon
    @nicknamed=false
    @viewport=Viewport.new(0,0,Graphics.width,Graphics.height)
    @viewport.z=99999
    addBackgroundOrColoredPlane(@sprites,"background","hatchbg",
      Color.new(248,248,248),@viewport)
    @sprites["pokemon"]=PokemonSprite.new(@viewport)
    @sprites["pokemon"].setSpeciesBitmap(@pokemon.species,@pokemon.isFemale?,
                                        (@pokemon.form rescue 0),@pokemon.isShiny?,
                                        false,false,true,(@pokemon.isDelta? rescue false)) # Egg sprite
    @sprites["pokemon"].x=Graphics.width/2-@sprites["pokemon"].bitmap.width/2
    @sprites["pokemon"].y=48+(Graphics.height-@sprites["pokemon"].bitmap.height)/2
    @sprites["hatch"]=BitmapSprite.new(Graphics.width,Graphics.height,@viewport)
    @sprites["overlay"]=BitmapSprite.new(Graphics.width,Graphics.height,@viewport)
    @sprites["overlay"].z=200
    @sprites["overlay"].bitmap=Bitmap.new(Graphics.width,Graphics.height)
    @sprites["overlay"].bitmap.fill_rect(0,0,Graphics.width,Graphics.height,
        Color.new(255,255,255))
    @sprites["overlay"].opacity=0
    pbFadeInAndShow(@sprites)
  end
end

def pbLoadPokemonBitmap(pokemon, back=false, scale=nil)
  return pbLoadPokemonBitmapSpecies(pokemon,pokemon.species,back,scale)
end

# Note: Returns an AnimatedBitmap, not a Bitmap
def pbLoadPokemonBitmapSpecies(pokemon, species, back=false, scale=nil)
  ret=nil
  if scale==nil
    scale=1
    if defined?(POKEMONSPRITESCALE)
      scale=POKEMONSPRITESCALE if POKEMONSPRITESCALE != nil
    end
  end
  if pokemon.isEgg?
    bitmapFileName=sprintf("Graphics/Battlers/%segg",getConstantName(PBSpecies,species)) rescue nil
    if !pbResolveBitmap(bitmapFileName)
      bitmapFileName=sprintf("Graphics/Battlers/%03degg",species)
      if !pbResolveBitmap(bitmapFileName)
        bitmapFileName=sprintf("Graphics/Battlers/egg")
      end
    end
    bitmapFileName=pbResolveBitmap(bitmapFileName)
  else
    bitmapFileName=pbCheckPokemonBitmapFiles([species,back,
                                              (pokemon.isFemale?),
                                              pokemon.isShiny?,
                                              (pokemon.form rescue 0),
                                              (pokemon.isShadow? rescue false),
                                              (pokemon.isDelta? rescue false)])
    # Alter bitmap if supported
    alterBitmap=(MultipleForms.getFunction(species,"alterBitmap") rescue nil)
  end
  if bitmapFileName && alterBitmap
    animatedBitmap=AnimatedBitmap.new(bitmapFileName)
    copiedBitmap=animatedBitmap.copy
    animatedBitmap.dispose
    copiedBitmap.each {|bitmap|
      alterBitmap.call(pokemon,bitmap)
    }
    ret=copiedBitmap
    if defined?(DynamicPokemonSprite) # if EBS code exists
      animatedBitmap=AnimatedBitmapWrapper.new(bitmapFileName,scale)
      animatedBitmap.prepareStrip
      for i in 0...animatedBitmap.totalFrames
        alterBitmap.call(pokemon,animatedBitmap.alterBitmap(i))
      end
      animatedBitmap.compileStrip
      ret=animatedBitmap
    end
  elsif bitmapFileName
    ret=AnimatedBitmap.new(bitmapFileName)
    ret=AnimatedBitmapWrapper.new(bitmapFileName,scale) if defined?(DynamicPokemonSprite) # if EBS code exists
  end
  return ret
end

# Note: Returns an AnimatedBitmap, not a Bitmap
def pbLoadSpeciesBitmap(species,female=false,form=0,shiny=false,shadow=false,back=false,egg=false,delta=false)
  ret=nil
  if egg
    bitmapFileName=sprintf("Graphics/Battlers/%segg",getConstantName(PBSpecies,species)) rescue nil
    if !pbResolveBitmap(bitmapFileName)
      bitmapFileName=sprintf("Graphics/Battlers/%03degg",species)
      if !pbResolveBitmap(bitmapFileName)
        bitmapFileName=sprintf("Graphics/Battlers/egg")
      end
    end
    bitmapFileName=pbResolveBitmap(bitmapFileName)
  else
    bitmapFileName=pbCheckPokemonBitmapFiles([species,back,female,shiny,form,shadow,delta])
  end
  if bitmapFileName
    ret=AnimatedBitmap.new(bitmapFileName)
  end
  return ret
end

def pbCheckPokemonBitmapFiles(params)
  species=params[0]
  back=params[1]
  factors=[]
  factors.push([5,params[5],false]) if params[5] && params[5]!=false    # shadow
  factors.push([2,params[2],false]) if params[2] && params[2]!=false    # gender
  factors.push([3,params[3],false]) if params[3] && params[3]!=false    # shiny
  factors.push([4,params[4].to_s,""]) if params[4] && params[4].to_s!="" &&
                                                      params[4].to_s!="0" # form
  factors.push([6,params[6],false]) if params[6] && params[6]!=false    # shiny
  tshadow=false
  tgender=false
  tshiny=false
  tdelta=false
  tform=""
  for i in 0...2**factors.length
    for j in 0...factors.length
      case factors[j][0]
      when 2  # gender
        tgender=((i/(2**j))%2==0) ? factors[j][1] : factors[j][2]
      when 3  # shiny
        tshiny=((i/(2**j))%2==0) ? factors[j][1] : factors[j][2]
      when 4  # form
        tform=((i/(2**j))%2==0) ? factors[j][1] : factors[j][2]
      when 5  # shadow
        tshadow=((i/(2**j))%2==0) ? factors[j][1] : factors[j][2]
      when 6  # delta
        tdelta=((i/(2**j))%2==0) ? factors[j][1] : factors[j][2]
      end
    end
    folder=""
    if defined?(DUALSCREENHEIGHT) # if BW data exists
      folder="Front/"
      folder="Back/" if back
      folder="FrontShiny/" if tshiny
      folder="BackShiny/" if back && tshiny
      folder+="Female/" if tgender
    end
    bitmapFileName=sprintf("Graphics/Battlers/%s%s%s%s%s%s%s%s",
      folder,
      getConstantName(PBSpecies,species),
      tgender ? "f" : "",
      tshiny ? "s" : "",
      tdelta ? "d" : "",
      back ? "b" : "",
      (tform!="" ? "_"+tform : ""),
      tshadow ? "_shadow" : "") rescue nil
    ret=pbResolveBitmap(bitmapFileName)
    return ret if ret
    bitmapFileName=sprintf("Graphics/Battlers/%s%03d%s%s%s%s%s%s",
      folder, species,
      tgender ? "f" : "",
      tshiny ? "s" : "",
      tdelta ? "d" : "",
      back ? "b" : "",
      (tform!="" ? "_"+tform : ""),
      tshadow ? "_shadow" : "")
    ret=pbResolveBitmap(bitmapFileName)
    return ret if ret
  end
  return nil
end

def pbPokemonIconFile(pokemon)
  bitmapFileName=nil
  bitmapFileName=pbCheckPokemonIconFiles([pokemon.species,
                                          (pokemon.isFemale?),
                                          pokemon.isShiny?,
                                          (pokemon.form rescue 0),
                                          (pokemon.isShadow? rescue false),
                                          pokemon.isDelta?],
                                          pokemon.isEgg?)
  return bitmapFileName
end

def pbCheckPokemonIconFiles(params,egg=false)
  species=params[0]
  if egg
    bitmapFileName=sprintf("Graphics/Icons/icon%segg",getConstantName(PBSpecies,species)) rescue nil
    if !pbResolveBitmap(bitmapFileName)
      bitmapFileName=sprintf("Graphics/Icons/icon%03degg",species)
      if !pbResolveBitmap(bitmapFileName)
        bitmapFileName=sprintf("Graphics/Icons/iconEgg")
      end
    end
    return pbResolveBitmap(bitmapFileName)
  else
    factors=[]
    factors.push([4,params[4],false]) if params[4] && params[4]!=false    # shadow
    factors.push([1,params[1],false]) if params[1] && params[1]!=false    # gender
    factors.push([2,params[2],false]) if params[2] && params[2]!=false    # shiny
    factors.push([5,params[5],false]) if params[5] && params[5]!=false    # delta
    factors.push([3,params[3].to_s,""]) if params[3] && params[3].to_s!="" &&
                                                        params[3].to_s!="0" # form
    tshadow=false
    tgender=false
    tshiny=false
    tdelta=false
    tform=""
    for i in 0...2**factors.length
      for j in 0...factors.length
        case factors[j][0]
        when 1  # gender
          tgender=((i/(2**j))%2==0) ? factors[j][1] : factors[j][2]
        when 2  # shiny
          tshiny=((i/(2**j))%2==0) ? factors[j][1] : factors[j][2]
        when 3  # form
          tform=((i/(2**j))%2==0) ? factors[j][1] : factors[j][2]
        when 4  # shadow
          tshadow=((i/(2**j))%2==0) ? factors[j][1] : factors[j][2]
        when 5  # delta
          tdelta=((i/(2**j))%2==0) ? factors[j][1] : factors[j][2]
        end
      end
      bitmapFileName=sprintf("Graphics/Icons/icon%s%s%s%s%s%s",
        getConstantName(PBSpecies,species),
        tgender ? "f" : "",
        tshiny ? "s" : "",
        tdelta ? "d" : "",
        (tform!="" ? "_"+tform : ""),
        tshadow ? "_shadow" : "") rescue nil
      ret=pbResolveBitmap(bitmapFileName)
      return ret if ret
      bitmapFileName=sprintf("Graphics/Icons/icon%03d%s%s%s%s%s",
        species,
        tgender ? "f" : "",
        tshiny ? "s" : "",
        tdelta ? "d" : "",
        (tform!="" ? "_"+tform : ""),
        tshadow ? "_shadow" : "")
      ret=pbResolveBitmap(bitmapFileName)
      return ret if ret
    end
  end
  return nil
end

#########################################################################
# Following Pokemon compatibility
#########################################################################
class DependentEvents
  def change_sprite(id, shiny=nil, animation=nil, form=nil, gender=nil, shadow=false, delta=nil)
    events=$PokemonGlobal.dependentEvents
    for i in 0...events.length
      if events[i] && events[i][8]=="Dependent"
        file=FOLLOWER_FILE_DIR+pbCheckPokemonFollowerFiles([id,gender,shiny,delta,form,shadow])
        events[i][6]=file
        @realEvents[i].character_name=file
        if animation
          $scene.spriteset.addUserAnimation(Animation_Come_Out,@realEvents[i].x,@realEvents[i].y)
        end
        $game_variables[Walking_Time_Variable]=0
      end
    end
  end

  def refresh_sprite(animation=true)
    if $game_variables[Current_Following_Variable]!=0
      return unless $game_switches[Toggle_Following_Switch]
      return if $PokemonGlobal.bicycle
      if $Trainer.party[0].isShiny?
        shiny=true
      else
        shiny=false
      end
      if defined?($Trainer.party[0].isDelta?)
        delta = $Trainer.party[0].isDelta?
      else
        delta = false
      end
      if $Trainer.party[0].form>0
        form=$Trainer.party[0].form
      else
        form=nil
      end
      if defined?($Trainer.party[0].isShadow?)
        shadow = $Trainer.party[0].isShadow?
      else
        shadow = false
      end
      if $PokemonGlobal.surfing
        if $Trainer.party[0].hp>0 && !$Trainer.party[0].isEgg? && $Trainer.party[0].hasType?(:WATER)
          events=$PokemonGlobal.dependentEvents
          if animation
            for i in 0...events.length
              $scene.spriteset.addUserAnimation(Animation_Come_Out,@realEvents[i].x,@realEvents[i].y)
              pbWait(10)
            end
          end
          change_sprite($Trainer.party[0].species, shiny, false, form, $Trainer.party[0].gender, shadow, delta)
        elsif ALWAYS_ANIMATED_CAN_SURF && ($Trainer.party[0].hasType?(:FLYING) ||
          isConst?($Trainer.party[0].ability,PBAbilities,:LEVITATE) ||
          ALWAYS_ANIMATED_FOLLOWERS.include?($Trainer.party[0].species)) &&
          !(ALWAYS_ANIMATED_EXCEPTION.include?($Trainer.party[0].species)) &&
          $Trainer.party[0].hp>0 && !$Trainer.party[0].isEgg?
          events=$PokemonGlobal.dependentEvents
          if animation
            for i in 0...events.length
              $scene.spriteset.addUserAnimation(Animation_Come_Out,@realEvents[i].x,@realEvents[i].y)
              pbWait(10)
            end
          end
          change_sprite($Trainer.party[0].species, shiny, false, form, $Trainer.party[0].gender, shadow, delta)
        else
          remove_sprite(false)
        end
      elsif $PokemonGlobal.diving
        if $Trainer.party[0].hp>0 && !$Trainer.party[0].isEgg? && $Trainer.party[0].hasType?(:WATER) && WATERPOKEMONCANDIVE
          events=$PokemonGlobal.dependentEvents
          if animation
            for i in 0...events.length
              $scene.spriteset.addUserAnimation(Animation_Come_Out,@realEvents[i].x,@realEvents[i].y)
              pbWait(10)
            end
          end
          change_sprite($Trainer.party[0].species, shiny, false, form, $Trainer.party[0].gender, shadow, delta)
        else
          remove_sprite(false)
        end
      else
        if $Trainer.party[0].hp>0 && !$Trainer.party[0].isEgg? && $scene.is_a?(Scene_Map)
          events=$PokemonGlobal.dependentEvents
          if animation
            for i in 0...events.length
              $scene.spriteset.addUserAnimation(Animation_Come_Out,@realEvents[i].x,@realEvents[i].y)
              pbWait(10)
            end
          end
          change_sprite($Trainer.party[0].species, shiny, false, form, $Trainer.party[0].gender, shadow, delta)
        elsif $Trainer.party[0].hp<=0 || $Trainer.party[0].isEgg?
          remove_sprite(animation)
        end
      end
    else
      check_faint
    end
  end

  def Come_back(shiny=nil, animation=nil, delta=nil)
    return if !$game_variables[Following_Activated_Switch]
    return if $Trainer.party.length==0
    $PokemonTemp.dependentEvents.pbMoveDependentEvents
    events=$PokemonGlobal.dependentEvents
    if $game_variables[Current_Following_Variable]==$Trainer.party[0]
      remove_sprite(false)
      if $scene.is_a?(Scene_Map)
        for i in 0...events.length
          $scene.spriteset.addUserAnimation(Animation_Come_Out,@realEvents[i].x,@realEvents[i].y)
        end
      end
    end
    if $Trainer.party[0].hp>0 && !$Trainer.party[0].isEgg?
      $game_variables[Current_Following_Variable]=$Trainer.party[0]
      refresh_sprite(animation)
    end
    for i in 0...events.length
      if events[i] && events[i][8]=="Dependent"
        file=FOLLOWER_FILE_DIR+pbCheckPokemonFollowerFiles([id,gender,shiny,delta,form,shadow])
        events[i][6]=file
        @realEvents[i].character_name=file
        if animation
          $scene.spriteset.addUserAnimation(Animation_Come_Out,@realEvents[i].x,@realEvents[i].y)
        end
      end
    end
  end
end

# this is an entirely new function, not found in the official release of Following Pokemon
# it searches for Follower sprites the same way base Essentials searches for battlers and icons
# rather than a series of "if-than" events
def pbCheckPokemonFollowerFiles(params)
  species=params[0]
  factors=[]
  factors.push([1,params[1],false]) if params[1] && params[1]!=false    # gender
  factors.push([2,params[2],false]) if params[2] && params[2]!=false    # shiny
  factors.push([3,params[3],false]) if params[3] && params[3]!=false    # delta
  factors.push([4,params[4].to_s,""]) if params[4] && params[4].to_s!="" # form
  factors.push([5,params[5],false]) if params[5] && params[5]!=false    # shadow
  tshadow=false
  tgender=false
  tshiny=false
  tdelta=false
  tform=""
  for i in 0...2**factors.length
    for j in 0...factors.length
      case factors[j][0]
      when 1  # gender
        tgender=((i/(2**j))%2==0) ? factors[j][1] : factors[j][2]
      when 2  # shiny
        tshiny=((i/(2**j))%2==0) ? factors[j][1] : factors[j][2]
      when 3  # delta
        tdelta=((i/(2**j))%2==0) ? factors[j][1] : factors[j][2]
      when 4  # form
        tform=((i/(2**j))%2==0) ? factors[j][1] : factors[j][2]
      when 5  # shadow
        tshadow=((i/(2**j))%2==0) ? factors[j][1] : factors[j][2]
      end
    end
    bitmapFileName=sprintf("%s%s%s%s%s%s",
      getConstantName(PBSpecies,species),
      tgender ? "f" : "",
      tshiny ? "s" : "",
      tdelta ? "d" : "",
      (tform!="" ? "_"+tform : ""),
      tshadow ? "_shadow" : "") rescue nil
    ret=pbResolveBitmap(sprintf("%s%s%s",FOLLOWER_FILE_PATH,FOLLOWER_FILE_DIR,bitmapFileName))
    return bitmapFileName if ret
    bitmapFileName=sprintf("%03d%s%s%s%s%s",
      species,
      tgender ? "f" : "",
      tshiny ? "s" : "",
      tdelta ? "d" : "",
      (tform!="" ? "_"+tform : ""),
      tshadow ? "_shadow" : "")
    ret=pbResolveBitmap(sprintf("%s%s%s",FOLLOWER_FILE_PATH,FOLLOWER_FILE_DIR,bitmapFileName))
    return bitmapFileName if ret
  end
end

##############################################################
# Hybrid AnimatedBitmapWrapper class to encompass both the
#    EBS version's inputs and the BW version's ones
##############################################################
class AnimatedBitmapWrapper
  attr_reader :width
  attr_reader :height
  attr_reader :totalFrames
  attr_reader :animationFrames
  attr_reader :currentIndex
  attr_accessor :scale

  def initialize(file,twoframe_scale=2)
    raise "filename is nil" if file==nil
    if scale.is_a?(Numeric) # EBS version
      @scale = twoframe_scale
      @twoframe = false
    elsif !!scale == scale # BW version
      @scale = 2
      @twoframe = twoframe_scale
    end
    if @scale==nil
      @scale=2
    end
    @width = 0
    @height = 0
    @frame = 0
    @frames = 2
    @direction = +1
    @animationFinish = false
    @totalFrames = 0
    @currentIndex = 0
    @speed = 1
      # 0 - not moving at all
      # 1 - normal speed
      # 2 - medium speed
      # 3 - slow speed
    bmp = BitmapCache.load_bitmap(file)
    #bmp = Bitmap.new(file)
    @bitmapFile=Bitmap.new(bmp.width,bmp.height); @bitmapFile.blt(0,0,bmp,Rect.new(0,0,bmp.width,bmp.height))
    # initializes full Pokemon bitmap
    @bitmap=Bitmap.new(@bitmapFile.width,@bitmapFile.height)
    @bitmap.blt(0,0,@bitmapFile,Rect.new(0,0,@bitmapFile.width,@bitmapFile.height))
    @[email protected]*@scale
    @[email protected]*@scale

    @[email protected]/@bitmap.height
    @animationFrames=@totalFrames*@frames
    # calculates total number of frames
    @loop_points=[0,@totalFrames]
    # first value is start, second is end

    @actualBitmap=Bitmap.new(@width,@height)
    @actualBitmap.clear
    @actualBitmap.stretch_blt(Rect.new(0,0,@width,@height),@bitmap,Rect.new(@currentIndex*(@width/@scale),0,@width/@scale,@height/@scale))
  end
  alias initialize_elite initialize

  def length; @totalFrames; end
  def disposed?; @actualBitmap.disposed?; end
  def dispose; @actualBitmap.dispose; end
  def copy; @actualBitmap.clone; end
  def bitmap; @actualBitmap; end
  def bitmap=(val); @actualBitmap=val; end
  def each; end
  def alterBitmap(index); return @strip[index]; end

  def prepareStrip
    @strip=[]
    for i in 0...@totalFrames
      bitmap=Bitmap.new(@width,@height)
      bitmap.stretch_blt(Rect.new(0,0,@width,@height),@bitmapFile,Rect.new((@width/@scale)*i,0,@width/@scale,@height/@scale))
      @strip.push(bitmap)
    end
  end
  def compileStrip
    @bitmap.clear
    for i in [email protected]
      @bitmap.stretch_blt(Rect.new((@width/@scale)*i,0,@width/@scale,@height/@scale),@strip[i],Rect.new(0,0,@width,@height))
    end
  end

  def reverse
    if @direction  >  0
      @direction=-1
    elsif @direction < 0
      @direction=+1
    end
  end

  def setLoop(start, finish)
    @loop_points=[start,finish]
  end

  def setSpeed(value)
    @speed=value
  end

  def toFrame(frame)
    if frame.is_a?(String)
      if frame=="last"
        frame=@totalFrames-1
      else
        frame=0
      end
    end
    frame=@totalFrames if frame > @totalFrames
    frame=0 if frame < 0
    @currentIndex=frame
    @actualBitmap.clear
    @actualBitmap.stretch_blt(Rect.new(0,0,@width,@height),@bitmap,Rect.new(@currentIndex*(@width/@scale),0,@width/@scale,@height/@scale))
  end

  def play
    return if @currentIndex >= @loop_points[1]-1
    self.update
  end

  def finished?
    return (@currentIndex==@totalFrames-1)
  end

  def update
    return false if @actualBitmap.disposed?
    return false if @speed < 1
    case @speed
    # frame skip
    when 1
      @frames=2
    when 2
      @frames=4
    when 3
      @frames=5
    end
    @frame+=1

    if @frame >=@frames
      # processes animation speed
      @currentIndex+=@direction
      @currentIndex=@loop_points[0] if @currentIndex >=@loop_points[1]
      @currentIndex=@loop_points[1]-1 if @currentIndex < @loop_points[0]
      @frame=0
    end
    @actualBitmap.clear
    @actualBitmap.stretch_blt(Rect.new(0,0,@width,@height),@bitmap,Rect.new(@currentIndex*(@width/@scale),0,@width/@scale,@height/@scale))
    # updates the actual bitmap
  end
  alias update_elite update

  # returns bitmap to original state
  def deanimate
    @frame=0
    @currentIndex=0
    @actualBitmap.clear
    @actualBitmap.stretch_blt(Rect.new(0,0,@width,@height),@bitmap,Rect.new(@currentIndex*(@width/@scale),0,@width/@scale,@height/@scale))
  end
end

##############################################################
# Evolution differences
##############################################################
def pbGetEvolvedFormData(species,delta=false)
  ret=[]
  _EVOTYPEMASK=0x3F
  _EVODATAMASK=0xC0
  _EVONEXTFORM=0x00
  pbRgssOpen("Data/evolutions.dat","rb"){|f|
     f.pos=(species-1)*8
     offset=f.fgetdw
     length=f.fgetdw
     if length>0
       f.pos=offset
       i=0; loop do break unless i<length
         evo=f.fgetb
         evonib=evo&_EVOTYPEMASK
         level=f.fgetw
         poke=f.fgetw
         if (evo&_EVODATAMASK)==_EVONEXTFORM
           ret.push([evonib,level,poke])
         end
         i+=5
       end
     end
  }
  if delta
    ret[0][0]=27 if isConst?(species,PBSpecies,:RATTATA) # Alolan Rattata only evolves at night
    ret[0][0]=1 if isConst?(species,PBSpecies,:MEOWTH) # Alolan Meowth evolves via friendship
    # Alolan Vulpix and Alolan Sandshrew evolve via the Ice Stone if it exists
    ret[0][2]=getConst(PBItems,:ICESTONE) if isConst?(species,PBSpecies,:VULPIX) && getConst(PBItems,:ICESTONE)!=nil
    ret[0][0]=7 if isConst?(species,PBSpecies,:SANDSHREW) && getConst(PBItems,:ICESTONE)!=nil
    ret[0][2]=getConst(PBItems,:ICESTONE) if isConst?(species,PBSpecies,:SANDSHREW) && getConst(PBItems,:ICESTONE)!=nil
  end
  return ret
end

def pbCheckEvolutionEx(pokemon)
  return -1 if pokemon.species<=0 || pokemon.isEgg?
  return -1 if isConst?(pokemon.species,PBSpecies,:PICHU) && pokemon.form==1
  return -1 if isConst?(pokemon.item,PBItems,:EVERSTONE) &&
               !isConst?(pokemon.species,PBSpecies,:KADABRA)
  ret=-1
  for form in pbGetEvolvedFormData(pokemon.species,pokemon.isDelta?)
    ret=yield pokemon,form[0],form[1],form[2]
    break if ret>0
  end
  return ret
end

# Pikachu, Cubone (at night), and Exeggcute holding the Strange Souvenir
#    will evolve into Alolan Raichu, Alolan Marowak, and Alolan Exeggutor
#    respectively.  (The item will not be consumed.)
# Remove this function if you wish this not to be the case.
class PokemonEvolutionScene
  def pbStartScreen(pokemon,newspecies)
    @sprites={}
    @bgviewport=Viewport.new(0,0,Graphics.width,Graphics.height)
    @bgviewport.z=99999
    @viewport=Viewport.new(0,0,Graphics.width,Graphics.height)
    @viewport.z=99999
    @msgviewport=Viewport.new(0,0,Graphics.width,Graphics.height)
    @msgviewport.z=99999
    @pokemon=pokemon
    @newspecies=newspecies
    addBackgroundOrColoredPlane(@sprites,"background","evolutionbg",
       Color.new(248,248,248),@bgviewport)
    rsprite1=PokemonSprite.new(@viewport)
    rsprite2=PokemonSprite.new(@viewport)
    rsprite1.setPokemonBitmap(@pokemon,false)
    if isConst?(pokemon.item,PBItems,:STRANGESOUVENIR)
      if (isConst?(@newspecies,PBSpecies,:MAROWAK) && PBDayNight.isNight?) ||
          isConst?(@newspecies,PBSpecies,:RAICHU) ||
          isConst?(@newspecies,PBSpecies,:EXEGGUTOR)
        @pokemon.makeDelta
      end
    end
    rsprite2.setPokemonBitmapSpecies(@pokemon,@newspecies,false)
    rsprite1.ox=rsprite1.bitmap.width/2
    rsprite1.oy=rsprite1.bitmap.height/2
    rsprite2.ox=rsprite2.bitmap.width/2
    rsprite2.oy=rsprite2.bitmap.height/2
    rsprite1.x=Graphics.width/2
    rsprite1.y=(Graphics.height-64)/2
    rsprite2.x=rsprite1.x
    rsprite2.y=rsprite1.y
    rsprite2.opacity=0
    @sprites["rsprite1"]=rsprite1
    @sprites["rsprite2"]=rsprite2
    pbGenerateMetafiles(rsprite1.ox,rsprite1.oy,rsprite2.ox,rsprite2.oy)
    @sprites["msgwindow"]=Kernel.pbCreateMessageWindow(@msgviewport)
    pbFadeInAndShow(@sprites) { pbUpdate }
  end
end

##############################################################
# Alolan Form differences
##############################################################

MultipleForms.register(:RATTATA,{
"getFormName"=>proc{|pokemon|
  next _INTL("Alola Form") if pokemon.isDelta?
  next
},
"type1"=>proc{|pokemon|
  next getID(PBTypes,:DARK) if pokemon.isDelta?
  next
},
"getAbilityList"=>proc{|pokemon|
  if pokemon.isDelta?
    next [[getID(PBAbilities,:GLUTTONY),0],
          [getID(PBAbilities,:HUSTLE),1],
          [getID(PBAbilities,:THICKFAT),2]]
  end
  next
},
"getMoveCompatibility"=>proc{|pokemon|
   next if !pokemon.isDelta?
   movelist=[# TMs
             :TOXIC,:HIDDENPOWER,:SUNNYDAY,:TAUNT,:ICEBEAM,
             :BLIZZARD,:PROTECT,:RAINDANCE,:FRUSTRATION,:RETURN,
             :SHADOWBALL,:DOUBLETEAM,:SLUDGEBOMB,:TORMENT,:FACADE,
             :REST,:ATTRACT,:THIEF,:ROUND,:QUASH,
             :EMBARGO,:SHADOWCLAW,:GRASSKNOT,:SWAGGER,:SLEEPTALK,
             :UTURN,:SUBSTITUTE,:SNARL,:DARKPULSE,:CONFIDE]
   for i in 0...movelist.length
     movelist[i]=getConst(PBMoves,movelist[i]) if getConst(PBMoves,movelist[i])!=nil
   end
   next movelist
},
"possibleEggMoves"=>proc{|pokemon|
   next if !pokemon.isDelta?
   movelist=[:COUNTER,:FINALGAMBIT,:FURYSWIPES,:MEFIRST,:REVENGE,
             :REVERSAL,:SNATCH,:STOCKPILE,:SWALLOW,:SWITCHEROO,
             :UPROAR]
   for i in 0...movelist.length
     movelist[i]=getConst(PBMoves,movelist[i]) if getConst(PBMoves,movelist[i])!=nil
   end
   next movelist
},
"onSetForm"=>proc{|pokemon,form|
  pbSeenForm(pokemon)
}
})

MultipleForms.register(:RATICATE,{
"getFormName"=>proc{|pokemon|
  next _INTL("Alola Form") if pokemon.isDelta?
  next
},
"type1"=>proc{|pokemon|
  next getID(PBTypes,:DARK) if pokemon.isDelta?
  next
},
"weight"=>proc{|pokemon|
  next 25.5 if pokemon.isDelta?
  next
},
"getBaseStats"=>proc{|pokemon|
   next [75,71,70,77,40,80] if pokemon.isDelta?
   next
},
"getAbilityList"=>proc{|pokemon|
  if pokemon.isDelta?
    next [[getID(PBAbilities,:GLUTTONY),0],
          [getID(PBAbilities,:HUSTLE),1],
          [getID(PBAbilities,:THICKFAT),2]]
  end
  next
},
"getMoveCompatibility"=>proc{|pokemon|
   next if !pokemon.isDelta?
   movelist=[# TMs
             :TOXIC,:HIDDENPOWER,:SUNNYDAY,:TAUNT,:ICEBEAM,
             :BLIZZARD,:PROTECT,:RAINDANCE,:FRUSTRATION,:RETURN,
             :SHADOWBALL,:DOUBLETEAM,:SLUDGEBOMB,:TORMENT,:FACADE,
             :REST,:ATTRACT,:THIEF,:ROUND,:QUASH,
             :EMBARGO,:SHADOWCLAW,:GRASSKNOT,:SWAGGER,:SLEEPTALK,
             :UTURN,:SUBSTITUTE,:SNARL,:DARKPULSE,:CONFIDE,
             :ROAR,:BULKUP,:VENOSHOCK,:SUNNYDAY,:HYPERBEAM,
             :SLUDGEWAVE,:GIGAIMPACT,:SWORDSDANCE]
   for i in 0...movelist.length
     movelist[i]=getConst(PBMoves,movelist[i]) if getConst(PBMoves,movelist[i])!=nil
   end
   next movelist
},
"onSetForm"=>proc{|pokemon,form|
  pbSeenForm(pokemon)
}
})

MultipleForms.register(:RAICHU,{
"getFormName"=>proc{|pokemon|
  next _INTL("Alola Form") if pokemon.isDelta?
  next
},
"type2"=>proc{|pokemon|
  next getID(PBTypes,:PSYCHIC) if pokemon.isDelta?
  next
},
"height"=>proc{|pokemon|
  next 0.7 if pokemon.isDelta?
  next
},
"weight"=>proc{|pokemon|
  next 21.0 if pokemon.isDelta?
  next
},
"getAbilityList"=>proc{|pokemon|
  if pokemon.isDelta?
    next [[getID(PBAbilities,:SURGESURFER),0],
                [getID(PBAbilities,:SURGESURFER),2]]
  end
  next
},
"getBaseStats"=>proc{|pokemon|
   next [60,85,50,110,95,85] if pokemon.isDelta?
   next
},
"getMoveList"=>proc{|pokemon|
   next if !pokemon.isDelta?
   movelist=[]
   movelist=[[1,:PSYCHIC],[1,:SPEEDSWAP],[1,:THUNDERSHOCK],
             [1,:TAILWHIP],[1,:QUICKATTACK],[1,:THUNDERBOLT]]
   for i in movelist
     i[1]=getConst(PBMoves,i[1]) if getConst(PBMoves,movelist[i])!=nil
   end
   next movelist
},
"getMoveCompatibility"=>proc{|pokemon|
   next if !pokemon.isDelta?
   movelist=[# TMs
             :PSYSHOCK,:CALMMIND,:TOXIC,:HIDDENPOWER,:HYPERBEAM,
             :LIGHTSCREEN,:PROTECT,:RAINDANCE,:SAFEGUARD,:FRUSTRATION,
             :THUNDERBOLT,:THUNDER,:RETURN,:PSYCHIC,:BRICKBREAK,
             :DOUBLETEAM,:REFLECT,:FACADE,:REST,:ATTRACT,
             :THIEF,:ROUND,:ECHOEDVOICE,:FOCUSBLAST,:FLING,
             :CHARGEBEAM,:GIGAIMPACT,:VOLTSWITCH,:THUNDERWAVE,
             :GRASSKNOT,:SWAGGER,:SLEEPTALK,:SUBSTITUTE,
             :WILDCHARGE,:CONFIDE]
   for i in 0...movelist.length
     movelist[i]=getConst(PBMoves,movelist[i]) if getConst(PBMoves,movelist[i])!=nil
   end
   next movelist
},
"onSetForm"=>proc{|pokemon,form|
  pbSeenForm(pokemon)
}
})

MultipleForms.register(:SANDSHREW,{
"getFormName"=>proc{|pokemon|
  next _INTL("Alola Form") if pokemon.isDelta?
  next
},
"type1"=>proc{|pokemon|
  next getID(PBTypes,:ICE) if pokemon.isDelta?
  next
},
"type2"=>proc{|pokemon|
  next getID(PBTypes,:STEEL) if pokemon.isDelta?
  next
},
"height"=>proc{|pokemon|
  next 0.6 if pokemon.isDelta?
  next
},
"weight"=>proc{|pokemon|
  next 40.0 if pokemon.isDelta?
  next
},
"getBaseStats"=>proc{|pokemon|
   next [50,75,90,40,10,35] if pokemon.isDelta?
   next
},
"getMoveList"=>proc{|pokemon|
  next if !pokemon.isDelta?
  movelist=[]
  if pokemon.isDelta?
    movelist=[[1,:SCRATCH],[1,:DEFENSECURL],[3,:BIDE],[5,:PODERSNOW],
              [7,:ICEBALL],[9,:RAPIDSPIN],[11,:FURYCUTTER],[14,:METALCLAW],
              [17,:SWIFT],[20,:FURYSWIPES],[23,:IRONDEFENSE],[26,:SLASH],
              [30,:IRONHEAD],[34,:GYROBALL],[38,:SWORDSDANCE],[42,:HAIL],
              [46,:BLIZZARD]]
  end
  for i in movelist
    i[1]=getConst(PBMoves,i[1]) if getConst(PBMoves,movelist[i])!=nil
  end
  next movelist
},
"getMoveCompatibility"=>proc{|pokemon|
   next if !pokemon.isDelta?
   movelist=[# TMs
             :WORKUP,:TOXIC,:HAIL,:HIDDENPOWER,:SUNNYDAY,
             :BLIZZARD,:PROTECT,:SAFEGUARD,:FRUSTRATION,:EARTHQUAKE,
             :RETURN,:LEECHLIFE,:BRICKBREAK,:DOUBLETEAM,:AERIALACE,
             :FACADE,:REST,:ATTRACT,:THIEF,:ROUND,
             :FLING,:SHADOWCLAW,:AURORAVEIL,:GYROBALL,:SWORDSDANCE,
             :BULLDOZE,:FROSTBREATH,:ROCKSLIDE,:XSCISSOR,
             :POISONJAB,:SWAGGER,:SLEEPTALK,:SUBSTITUTE,
             :CONFIDE]
   for i in 0...movelist.length
     movelist[i]=getConst(PBMoves,movelist[i]) if getConst(PBMoves,movelist[i])!=nil
   end
   next movelist
},
"possibleEggMoves"=>proc{|pokemon|
   next if !pokemon.isDelta?
   movelist=[:AMNESIA,:CHIPAWAY,:COUNTER,:CRUSHCLAW,:CURSE,
             :ENDURE,:FLAIL,:ICICLECRASH,:ICICLESPEAR,:METALCLAW,
             :NIGHTSLASH]
   for i in 0...movelist.length
     movelist[i]=getConst(PBMoves,movelist[i]) if getConst(PBMoves,movelist[i])!=nil
   end
   next movelist
},
"getAbilityList"=>proc{|pokemon|
  if pokemon.isDelta?
    next [[getID(PBAbilities,:SNOWCLOAK),0]] if getID(PBAbilities,:SLUSHRUSH)==nil
    next [[getID(PBAbilities,:SNOWCLOAK),0],
          [getID(PBAbilities,:SLUSHRUSH),2]]
  end
  next
},
"onSetForm"=>proc{|pokemon,form|
  pbSeenForm(pokemon)
}
})

MultipleForms.register(:SANDSLASH,{
"getFormName"=>proc{|pokemon|
  next _INTL("Alola Form") if pokemon.isDelta?
  next
},
"type1"=>proc{|pokemon|
  next getID(PBTypes,:ICE) if pokemon.isDelta?
  next
},
"type2"=>proc{|pokemon|
  next getID(PBTypes,:STEEL) if pokemon.isDelta?
  next
},
"height"=>proc{|pokemon|
  next 1.2 if pokemon.isDelta?
  next
},
"weight"=>proc{|pokemon|
  next 55.0 if pokemon.isDelta?
  next
},
"getBaseStats"=>proc{|pokemon|
   next [75,100,120,65,25,65] if pokemon.isDelta?
   next
},
"getMoveList"=>proc{|pokemon|
  next if !pokemon.isDelta?
  movelist=[]
  if pokemon.isDelta?
    movelist=[[1,:ICICLESPEAR],[1,:METALBURST],[1,:ICICLECRASH],[1,:SLASH],
              [1,:DEFENSECURL],[1,:ICEBALL],[1,:METALCLAW]]
  end
  for i in movelist
    i[1]=getConst(PBMoves,i[1]) if getConst(PBMoves,movelist[i])!=nil
  end
  next movelist
},
"getMoveCompatibility"=>proc{|pokemon|
   next if !pokemon.isDelta?
   movelist=[# TMs
             :WORKUP,:TOXIC,:HAIL,:HIDDENPOWER,:SUNNYDAY,
             :BLIZZARD,:PROTECT,:SAFEGUARD,:FRUSTRATION,:EARTHQUAKE,
             :RETURN,:LEECHLIFE,:BRICKBREAK,:DOUBLETEAM,:AERIALACE,
             :FACADE,:REST,:ATTRACT,:THIEF,:ROUND,
             :FLING,:SHADOWCLAW,:AURORAVEIL,:GYROBALL,:SWORDSDANCE,
             :BULLDOZE,:FROSTBREATH,:ROCKSLIDE,:XSCISSOR,
             :POISONJAB,:SWAGGER,:SLEEPTALK,:SUBSTITUTE,
             :CONFIDE,:HYPERBEAM,:FOCUSBLAST,:GIGAIMPACT]
   for i in 0...movelist.length
     movelist[i]=getConst(PBMoves,movelist[i]) if getConst(PBMoves,movelist[i])!=nil
   end
   next movelist
},
"getAbilityList"=>proc{|pokemon|
  if pokemon.isDelta?
    next [[getID(PBAbilities,:SNOWCLOAK),0]] if getID(PBAbilities,:SLUSHRUSH)==nil
    next [[getID(PBAbilities,:SNOWCLOAK),0],
          [getID(PBAbilities,:SLUSHRUSH),2]]
  end
  next
},
"onSetForm"=>proc{|pokemon,form|
  pbSeenForm(pokemon)
}
})

MultipleForms.register(:VULPIX,{
"getFormName"=>proc{|pokemon|
  next _INTL("Alola Form") if pokemon.isDelta?
  next
},
"type1"=>proc{|pokemon|
  next getID(PBTypes,:ICE) if pokemon.isDelta?
  next
},
"type2"=>proc{|pokemon|
  next getID(PBTypes,:ICE) if pokemon.isDelta?
  next
},
"getMoveList"=>proc{|pokemon|
  next if !pokemon.isDelta?
  movelist=[]
  if pokemon.isDelta?
    movelist=[[1,:POWDERSNOW],[4,:TAILWHIP],[7,:ROAR],[9,:BABYDOLLEYES],
              [10,:ICESHARD],[12,:CONFUSERAY],[15,:ICYWIND],
              [18,:PAYBACK],[20,:MIST],[23,:FEINTATTACK],[26,:HEX],
              [28,:AURORABEAM],[31,:EXTRASENSORY],[34,:SAFEGUARD],
              [36,:ICEBEAM],[39,:IMPRISON],[42,:BLIZZARD],[44,:GRUDGE],
              [47,:CAPTIVATE],[50,:SHEERCOLD]]
  end
  for i in movelist
    i[1]=getConst(PBMoves,i[1]) if getConst(PBMoves,movelist[i])!=nil
  end
  next movelist
},
"getMoveCompatibility"=>proc{|pokemon|
   next if !pokemon.isDelta?
   movelist=[# TMs
             :ROAR,:TOXIC,:HAIL,:HIDDENPOWER,:ICEBEAM,
             :BLIZZARD,:PROTECT,:RAINDANCE,:SAFEGUARD,:FRUSTRATION,
             :RETURN,:DOUBLETEAM,:FACADE,:REST,:ATTRACT,:ROUND,
             :PAYBACK,:AURORAVEIL,:PSYCHUP,:FROSTBREATH,
             :SWAGGER,:SLEEPTALK,:SUBSTITUTE,
             :CONFIDE,:DARKPULSE]
   for i in 0...movelist.length
     movelist[i]=getConst(PBMoves,movelist[i]) if getConst(PBMoves,movelist[i])!=nil
   end
   next movelist
},
"possibleEggMoves"=>proc{|pokemon|
   next if !pokemon.isDelta?
   movelist=[:AGILITY,:CHARM,:DISABLE,:ENCORE,:EXTRASENSORY,
             :FLAIL,:FREEZEDRY,:HOWL,:HYPNOSIS,:MOONBLAST,
             :POWERSWAP,:SPITE,:SECRETPOWER,:TAILSLAP]
   for i in 0...movelist.length
     movelist[i]=getConst(PBMoves,movelist[i]) if getConst(PBMoves,movelist[i])!=nil
   end
   next movelist
},
"getAbilityList"=>proc{|pokemon|
  if pokemon.isDelta?
    next [[getID(PBAbilities,:SNOWCLOAK),0],
          [getID(PBAbilities,:SNOWWARNING),2]]
  end
  next
},
"onSetForm"=>proc{|pokemon,form|
  pbSeenForm(pokemon)
}
})

MultipleForms.register(:NINETAILS,{
"getFormName"=>proc{|pokemon|
  next _INTL("Alola Form") if pokemon.isDelta?
  next
},
"type1"=>proc{|pokemon|
  next getID(PBTypes,:ICE) if pokemon.isDelta?
  next
},
"type2"=>proc{|pokemon|
  next getID(PBTypes,:FAIRY) if pokemon.isDelta?
  next
},
"getBaseStats"=>proc{|pokemon|
   next [73,67,75,109,81,100] if pokemon.isDelta?
   next
},
"getMoveList"=>proc{|pokemon|
  next if !pokemon.isDelta?
  movelist=[]
  if pokemon.isDelta?
    movelist=[[1,:DAZZLINGGLEAM],[1,:IMPRISON],[1,:NASTYPLOT],[1,:ICEBEAM],
              [1,:ICESHARD],[1,:CONFUSERAY],[1,:SAFEGUARD]]
  end
  for i in movelist
    i[1]=getConst(PBMoves,i[1]) if getConst(PBMoves,movelist[i])!=nil
  end
  next movelist
},
"getMoveCompatibility"=>proc{|pokemon|
   next if !pokemon.isDelta?
   movelist=[# TMs
             :ROAR,:TOXIC,:HAIL,:HIDDENPOWER,:ICEBEAM,
             :BLIZZARD,:PROTECT,:RAINDANCE,:SAFEGUARD,:FRUSTRATION,
             :RETURN,:DOUBLETEAM,:FACADE,:REST,:ATTRACT,:ROUND,
             :PAYBACK,:AURORAVEIL,:PSYCHUP,:FROSTBREATH,
             :SWAGGER,:SLEEPTALK,:SUBSTITUTE,:CONFIDE,:DARKPULSE,
             :PSYSHOCK,:CALMMIND,:GIGAIMPACT,:DREAMEATER,:DAZZLINGGLEAM]
   for i in 0...movelist.length
     movelist[i]=getConst(PBMoves,movelist[i]) if getConst(PBMoves,movelist[i])!=nil
   end
   next movelist
},
"getAbilityList"=>proc{|pokemon|
  if pokemon.isDelta?
    next [[getID(PBAbilities,:SNOWCLOAK),0],
          [getID(PBAbilities,:SNOWWARNING),2]]
  end
  next
},
"onSetForm"=>proc{|pokemon,form|
  pbSeenForm(pokemon)
}
})

MultipleForms.register(:DIGLETT,{
"getFormName"=>proc{|pokemon|
  next _INTL("Alola Form") if pokemon.isDelta?
  next
},
"type2"=>proc{|pokemon|
  next getID(PBTypes,:STEEL) if pokemon.isDelta?
  next
},
"weight"=>proc{|pokemon|
  next 1.0 if pokemon.isDelta?
  next
},
"getAbilityList"=>proc{|pokemon|
  if pokemon.isDelta?
    if getID(PBAbilities,:TANGLINGHAIR)==nil
      next [[getID(PBAbilities,:SANDVEIL),0],
            [getID(PBAbilities,:GOOEY),1],
            [getID(PBAbilities,:SANDFORCE),2]]
    end
    next [[getID(PBAbilities,:SANDVEIL),0],
          [getID(PBAbilities,:TANGLEDHAIR),1],
          [getID(PBAbilities,:SANDFORCE),2]]
  end
  next
},
"getBaseStats"=>proc{|pokemon|
   next [10,55,30,90,35,45] if pokemon.isDelta?
   next
},
"getMoveList"=>proc{|pokemon|
  next if !pokemon.isDelta?
  movelist=[]
  if pokemon.isDelta?
    movelist=[[1,:SANDATTACK],[1,:METALCLAW],[4,:GROWL],[7,:ASTONISH],
              [10,:MUDSLAP],[14,:MAGNITUDE],[18,:BULLDOZE],
              [22,:SUCKERPUNCH],[25,:MUDBOMB],[28,:EARTHPOWER],[31,:DIG],
              [35,:IRONHEAD],[39,:EARTHQUAKE],[43,:FISSURE]]
  end
  for i in movelist
    i[1]=getConst(PBMoves,i[1]) if getConst(PBMoves,movelist[i])!=nil
  end
  next movelist
},
"getMoveCompatibility"=>proc{|pokemon|
   next if !pokemon.isDelta?
   movelist=[# TMs
             :WORKUP,:TOXIC,:HIDDENPOWER,:SUNNYDAY,:PROTECT,
             :FRUSTRATION,:EARTHQUAKE,:RETURN,:DOUBLETEAM,
             :SLUDGEBOMB,:SANDSTORM,:ROCKTOMB,:AERIELACE,:FACADE,
             :REST,:ATTRACT,:THIEF,:ROUND,:ECHOEDVOICE,
             :SHADOWCLAW,:BULLDOZE,:ROCKSLIDE,:SWAGGER,:SLEEPTALK,
             :SUBSTITUTE,:FLASHCANNON,:CONFIDE]
   for i in 0...movelist.length
     movelist[i]=getConst(PBMoves,movelist[i]) if getConst(PBMoves,movelist[i])!=nil
   end
   next movelist
},
"possibleEggMoves"=>proc{|pokemon|
   next if !pokemon.isDelta?
   movelist=[:ANCIENTPOWER,:BEATUP,:ENDURE,:FEINTATTACK,
             :FINALGAMBIT,:HEADBUTT,:MEMENTO,:METALSOUND,
             :PURSUIT,:REVERSAL,:THRASH]
   for i in 0...movelist.length
     movelist[i]=getConst(PBMoves,movelist[i]) if getConst(PBMoves,movelist[i])!=nil
   end
   next movelist
},
"onSetForm"=>proc{|pokemon,form|
  pbSeenForm(pokemon)
}
})

MultipleForms.register(:DUGTRIO,{
"getFormName"=>proc{|pokemon|
  next _INTL("Alola Form") if pokemon.isDelta?
  next
},
"type2"=>proc{|pokemon|
  next getID(PBTypes,:STEEL) if pokemon.isDelta?
  next
},
"weight"=>proc{|pokemon|
  next 66.6 if pokemon.isDelta?
  next
},
"getAbilityList"=>proc{|pokemon|
  if pokemon.isDelta?
    if getID(PBAbilities,:TANGLINGHAIR)==nil
      next [[getID(PBAbilities,:SANDVEIL),0],
            [getID(PBAbilities,:GOOEY),1],
            [getID(PBAbilities,:SANDFORCE),2]]
    end
    next [[getID(PBAbilities,:SANDVEIL),0],
          [getID(PBAbilities,:TANGLEDHAIR),1],
          [getID(PBAbilities,:SANDFORCE),2]]
  end
  next
},
"getBaseStats"=>proc{|pokemon|
   next [35,100,60,110,50,70] if pokemon.isDelta?
   next
},
"getMoveList"=>proc{|pokemon|
  next if !pokemon.isDelta?
  movelist=[]
  if pokemon.isDelta?
    movelist=[[1,:SANDTOMB],[1,:ROTOTILLER],[1,:NIGHTSLASH],
              [1,:TRIATTACK],[1,:SANDATTACK],[1,:METALCLAW],
              [1,:GROWL],[4,:GROWL],[7,:ASTONISH],
              [10,:MUDSLAP],[14,:MAGNITUDE],[18,:BULLDOZE],
              [22,:SUCKERPUNCH],[25,:MUDBOMB],[30,:EARTHPOWER],[35,:DIG],
              [41,:IRONHEAD],[47,:EARTHQUAKE],[53,:FISSURE]]
  end
  for i in movelist
    i[1]=getConst(PBMoves,i[1]) if getConst(PBMoves,movelist[i])!=nil
  end
  next movelist
},
"getMoveCompatibility"=>proc{|pokemon|
   next if !pokemon.isDelta?
   movelist=[# TMs
             :WORKUP,:TOXIC,:HIDDENPOWER,:SUNNYDAY,:PROTECT,
             :FRUSTRATION,:EARTHQUAKE,:RETURN,:DOUBLETEAM,
             :SLUDGEBOMB,:SANDSTORM,:ROCKTOMB,:AERIELACE,:FACADE,
             :REST,:ATTRACT,:THIEF,:ROUND,:ECHOEDVOICE,
             :SHADOWCLAW,:BULLDOZE,:ROCKSLIDE,:SWAGGER,:SLEEPTALK,
             :SUBSTITUTE,:FLASHCANNON,:CONFIDE,:HYPERBEAM,
             :SLUDGEWAVE,:GIGAIMPACT,:STONEEDGE]
   for i in 0...movelist.length
     movelist[i]=getConst(PBMoves,movelist[i]) if getConst(PBMoves,movelist[i])!=nil
   end
   next movelist
},
"onSetForm"=>proc{|pokemon,form|
  pbSeenForm(pokemon)
}
})

MultipleForms.register(:MEOWTH,{
"getFormName"=>proc{|pokemon|
  next _INTL("Alola Form") if pokemon.isDelta?
  next
},
"type1"=>proc{|pokemon|
  next getID(PBTypes,:DARK) if pokemon.isDelta?
  next
},
"type2"=>proc{|pokemon|
  next getID(PBTypes,:DARK) if pokemon.isDelta?
  next
},
"getAbilityList"=>proc{|pokemon|
  if pokemon.isDelta?
    next [[getID(PBAbilities,:PICKUP),0],
          [getID(PBAbilities,:TECHNICIAN),1],
          [getID(PBAbilities,:RATTLED),2]]
  end
  next
},
"getBaseStats"=>proc{|pokemon|
   next [40,35,34,90,50,40] if pokemon.isDelta?
   next
},
"getMoveList"=>proc{|pokemon|
  next if !pokemon.isDelta?
  movelist=[]
  if pokemon.isDelta?
    movelist=[[1,:SCRATCH],[1,:GROWL],[6,:BITE],[9,:FAKEOUT],
              [14,:FURYSWIPES],[17,:SCREECH],[22,:FEINTATTACK],
              [25,:TAUNT],[30,:PAYDAY],[33,:SLASH],[38,:NASTYPLOT],
              [41,:ASSURANCE],[46,:CAPTIVATE],[49,:NIGHTSLASH],
              [50,:FEINT],[55,:DARKPULSE]]
  end
  for i in movelist
    i[1]=getConst(PBMoves,i[1]) if getConst(PBMoves,movelist[i])!=nil
  end
  next movelist
},
"getMoveCompatibility"=>proc{|pokemon|
   next if !pokemon.isDelta?
   movelist=[# TMs
             :WORKUP,:TOXIC,:HIDDENPOWER,:SUNNYDAY,:TAUNT,:PROTECT,
             :RAINDANCE,:FRUSTRATION,:THUNDERBOLT,:THUNDER,:RETURN,
             :SHADOWBALL,:DOUBLETEAM,:AERIELACE,:TORMENT,:FACADE,
             :REST,:ATTRACT,:THIEF,:ROUND,:ECHOEDVOICE,:QUASH,
             :EMBARGO,:SHADOWCLAW,:PAYBACK,:PSYCHUP,:DREAMEATER,
             :SWAGGER,:SLEEPTALK,:UTURN,:SUBSTITUTE,:DARKPULSE,
             :CONFIDE]
   for i in 0...movelist.length
     movelist[i]=getConst(PBMoves,movelist[i]) if getConst(PBMoves,movelist[i])!=nil
   end
   next movelist
},
"possibleEggMoves"=>proc{|pokemon|
   next if !pokemon.isDelta?
   movelist=[:AMNESIA,:ASSIST,:CHARM,:COVET,:FLAIL,:FLATTER,
             :FOULPLAY,:HYPNOSIS,:PARTINGSHOT,:PUNISHMENT,
             :SNATCH,:SPITE]
   for i in 0...movelist.length
     movelist[i]=getConst(PBMoves,movelist[i]) if getConst(PBMoves,movelist[i])!=nil
   end
   next movelist
},
"onSetForm"=>proc{|pokemon,form|
  pbSeenForm(pokemon)
}
})

MultipleForms.register(:PERSIAN,{
"getFormName"=>proc{|pokemon|
  next _INTL("Alola Form") if pokemon.isDelta?
  next
},
"type1"=>proc{|pokemon|
  next getID(PBTypes,:DARK) if pokemon.isDelta?
  next
},
"type2"=>proc{|pokemon|
  next getID(PBTypes,:DARK) if pokemon.isDelta?
  next
},
"height"=>proc{|pokemon|
  next 1.1 if pokemon.isDelta?
  next
},
"weight"=>proc{|pokemon|
  next 33.0 if pokemon.isDelta?
  next
},
"getAbilityList"=>proc{|pokemon|
  if pokemon.isDelta?
    next [[getID(PBAbilities,:FURCOAT),0],
          [getID(PBAbilities,:TECHNICIAN),1],
          [getID(PBAbilities,:RATTLED),2]]
  end
  next
},
"getBaseStats"=>proc{|pokemon|
   next [65,60,60,115,75,65] if pokemon.isDelta?
   next
},
"getMoveList"=>proc{|pokemon|
  next if !pokemon.isDelta?
  movelist=[]
  if pokemon.isDelta?
    movelist=[[1,:SWIFT],[1,:QUASH],[1,:PLAYROUGH],[1,:SWITCHEROO],
              [1,:SCRATCH],[1,:GROWL],[1,:BITE],[1,:FAKEOUT],
              [6,:BITE],[9,:FAKEOUT],[14,:FURYSWIPES],[17,:SCREECH],
              [22,:FEINTATTACK],[25,:TAUNT],[32,:POWERGEM],[37,:SLASH],
              [44,:NASTYPLOT],[49,:ASSURANCE],[56,:CAPTIVATE],
              [61,:NIGHTSLASH],[65,:FEINT],[69,:DARKPULSE]]
  end
  for i in movelist
    i[1]=getConst(PBMoves,i[1]) if getConst(PBMoves,movelist[i])!=nil
  end
  next movelist
},
"getMoveCompatibility"=>proc{|pokemon|
   next if !pokemon.isDelta?
   movelist=[# TMs
             :WORKUP,:TOXIC,:HIDDENPOWER,:SUNNYDAY,:TAUNT,:PROTECT,
             :RAINDANCE,:FRUSTRATION,:THUNDERBOLT,:THUNDER,:RETURN,
             :SHADOWBALL,:DOUBLETEAM,:AERIELACE,:TORMENT,:FACADE,
             :REST,:ATTRACT,:THIEF,:ROUND,:ECHOEDVOICE,:QUASH,
             :EMBARGO,:SHADOWCLAW,:PAYBACK,:PSYCHUP,:DREAMEATER,
             :SWAGGER,:SLEEPTALK,:UTURN,:SUBSTITUTE,:DARKPULSE,
             :CONFIDE,:ROAR,:HYPERBEAM,:GIGAIMPACT,:SNARL]
   for i in 0...movelist.length
     movelist[i]=getConst(PBMoves,movelist[i]) if getConst(PBMoves,movelist[i])!=nil
   end
   next movelist
},
"onSetForm"=>proc{|pokemon,form|
  pbSeenForm(pokemon)
}
})

MultipleForms.register(:GEODUDE,{
"getFormName"=>proc{|pokemon|
  next _INTL("Alola Form") if pokemon.isDelta?
  next
},
"type2"=>proc{|pokemon|
  next getID(PBTypes,:ELECTRIC) if pokemon.isDelta?
  next
},
"weight"=>proc{|pokemon|
  next 20.3 if pokemon.isDelta?
  next
},
"getAbilityList"=>proc{|pokemon|
  if pokemon.isDelta?
    if getID(PBAbilities,:GALVANIZE)==nil
      next [[getID(PBAbilities,:MAGNETPULL),0],
            [getID(PBAbilities,:STURDY),1]]
    end
    next [[getID(PBAbilities,:MAGNETPULL),0],
          [getID(PBAbilities,:STURDY),1],
          [getID(PBAbilities,:GALVANIZE),2]]
  end
  next
},
"getMoveList"=>proc{|pokemon|
  next if !pokemon.isDelta?
  movelist=[]
  if pokemon.isDelta?
    movelist=[[1,:TACKLE],[1,:DEFENSECURL],[4,:CHARGE],[6,:ROCKPOLISH],
              [10,:ROLLOUT],[12,:SPARK],[16,:ROCKTHROW],[18,:SMACKDOWN],
              [22,:THUNDERPUNCH],[24,:SELFDESTRUCT],[28,:STEALTHROCK],
              [30,:ROCKBLAST],[34,:DISCHARGE],[36,:EXPLOSION],
              [40,:DOUBLEEDGE],[42,:STONEEDGE]]
  end
  for i in movelist
    i[1]=getConst(PBMoves,i[1]) if getConst(PBMoves,movelist[i])!=nil
  end
  next movelist
},
"getMoveCompatibility"=>proc{|pokemon|
   next if !pokemon.isDelta?
   movelist=[# TMs
             :TOXIC,:HIDDENPOWER,:SUNNYDAY,:PROTECT,:SMACKDOWN,
             :THUNDERBOLT,:THUNDER,:EARTHQUAKE,:RETURN,:BRICKBREAK,
             :DOUBLETEAM,:FLAMETHROWER,:SANDSTORM,:FIREBLAST,
             :ROCKTOMB,:FACADE,:REST,:ATTRACT,:ROUND,
             :FLING,:CHARGEBEAM,:BRUTALSWING,:EXPLOSION,
             :ROCKPOLISH,:STONEEDGE,:VOLTSWITCH,:GYROBALL,
             :BULLDOZE,:ROCKSLIDE,:SWAGGER,:SLEEPTALK,
             :SUBSTITUTE,:NATUREPOWER,:CONFIDE]
   for i in 0...movelist.length
     movelist[i]=getConst(PBMoves,movelist[i]) if getConst(PBMoves,movelist[i])!=nil
   end
   next movelist
},
"possibleEggMoves"=>proc{|pokemon|
   next if !pokemon.isDelta?
   movelist=[:AUTOTOMIZE,:BLOCK,:COUNTER,:CURSE,:ENDURE,:FLAIL,
             :MAGNETRISE,:ROCKCLIMB,:SCREECH,:WIDEGUARD]
   for i in 0...movelist.length
     movelist[i]=getConst(PBMoves,movelist[i]) if getConst(PBMoves,movelist[i])!=nil
   end
   next movelist
},
"onSetForm"=>proc{|pokemon,form|
  pbSeenForm(pokemon)
}
})

MultipleForms.register(:GRAVELER,{
"getFormName"=>proc{|pokemon|
  next _INTL("Alola Form") if pokemon.isDelta?
  next
},
"type2"=>proc{|pokemon|
  next getID(PBTypes,:ELECTRIC) if pokemon.isDelta?
  next
},
"weight"=>proc{|pokemon|
  next 110.0 if pokemon.isDelta?
  next
},
"getAbilityList"=>proc{|pokemon|
  if pokemon.isDelta?
    if getID(PBAbilities,:GALVANIZE)==nil
      next [[getID(PBAbilities,:MAGNETPULL),0],
            [getID(PBAbilities,:STURDY),1]]
    end
    next [[getID(PBAbilities,:MAGNETPULL),0],
          [getID(PBAbilities,:STURDY),1],
          [getID(PBAbilities,:GALVANIZE),2]]
  end
  next
},
"getMoveList"=>proc{|pokemon|
  next if !pokemon.isDelta?
  movelist=[]
  if pokemon.isDelta?
    movelist=[[1,:TACKLE],[1,:DEFENSECURL],[1,:CHARGE],[1,:ROCKPOLISH],
              [4,:CHARGE],[6,:ROCKPOLISH],[10,:ROLLOUT],[12,:SPARK],
              [16,:ROCKTHROW],[18,:SMACKDOWN],[22,:THUNDERPUNCH],
              [24,:SELFDESTRUCT],[30,:STEALTHROCK],[34,:ROCKBLAST],
              [40,:DISCHARGE],[44,:EXPLOSION],[50,:DOUBLEEDGE],
              [54,:STONEEDGE]]
  end
  for i in movelist
    i[1]=getConst(PBMoves,i[1]) if getConst(PBMoves,movelist[i])!=nil
  end
  next movelist
},
"getMoveCompatibility"=>proc{|pokemon|
   next if !pokemon.isDelta?
   movelist=[# TMs
             :TOXIC,:HIDDENPOWER,:SUNNYDAY,:PROTECT,:SMACKDOWN,
             :THUNDERBOLT,:THUNDER,:EARTHQUAKE,:RETURN,:BRICKBREAK,
             :DOUBLETEAM,:FLAMETHROWER,:SANDSTORM,:FIREBLAST,
             :ROCKTOMB,:FACADE,:REST,:ATTRACT,:ROUND,
             :FLING,:CHARGEBEAM,:BRUTALSWING,:EXPLOSION,
             :ROCKPOLISH,:STONEEDGE,:VOLTSWITCH,:GYROBALL,
             :BULLDOZE,:ROCKSLIDE,:SWAGGER,:SLEEPTALK,
             :SUBSTITUTE,:NATUREPOWER,:CONFIDE]
   for i in 0...movelist.length
     movelist[i]=getConst(PBMoves,movelist[i]) if getConst(PBMoves,movelist[i])!=nil
   end
   next movelist
},
"onSetForm"=>proc{|pokemon,form|
  pbSeenForm(pokemon)
}
})

MultipleForms.register(:GOLEM,{
"getFormName"=>proc{|pokemon|
  next _INTL("Alola Form") if pokemon.isDelta?
  next
},
"type2"=>proc{|pokemon|
  next getID(PBTypes,:ELECTRIC) if pokemon.isDelta?
  next
},
"weight"=>proc{|pokemon|
  next 110.0 if pokemon.isDelta?
  next
},
"getAbilityList"=>proc{|pokemon|
  if pokemon.isDelta?
    if getID(PBAbilities,:GALVANIZE)==nil
      next [[getID(PBAbilities,:MAGNETPULL),0],
            [getID(PBAbilities,:STURDY),1]]
    end
    next [[getID(PBAbilities,:MAGNETPULL),0],
          [getID(PBAbilities,:STURDY),1],
          [getID(PBAbilities,:GALVANIZE),2]]
  end
  next
},
"getMoveList"=>proc{|pokemon|
  next if !pokemon.isDelta?
  movelist=[]
  if pokemon.isDelta?
    movelist=[[1,:HEAVYSLAM],[1,:TACKLE],[1,:DEFENSECURL],[1,:CHARGE],
              [1,:ROCKPOLISH],[4,:CHARGE],[6,:ROCKPOLISH],
              [10,:STEAMROLLER],[12,:SPARK],[16,:ROCKTHROW],
              [18,:SMACKDOWN],[22,:THUNDERPUNCH],[24,:SELFDESTRUCT],
              [30,:STEALTHROCK],[34,:ROCKBLAST],[40,:DISCHARGE],
              [44,:EXPLOSION],[50,:DOUBLEEDGE],[54,:STONEEDGE],
              [60,:HEAVYSLAM]]
  end
  for i in movelist
    i[1]=getConst(PBMoves,i[1]) if getConst(PBMoves,movelist[i])!=nil
  end
  next movelist
},
"getMoveCompatibility"=>proc{|pokemon|
   next if !pokemon.isDelta?
   movelist=[# TMs
             :TOXIC,:HIDDENPOWER,:SUNNYDAY,:PROTECT,:SMACKDOWN,
             :THUNDERBOLT,:THUNDER,:EARTHQUAKE,:RETURN,:BRICKBREAK,
             :DOUBLETEAM,:FLAMETHROWER,:SANDSTORM,:FIREBLAST,
             :ROCKTOMB,:FACADE,:REST,:ATTRACT,:ROUND,
             :FLING,:CHARGEBEAM,:BRUTALSWING,:EXPLOSION,
             :ROCKPOLISH,:STONEEDGE,:VOLTSWITCH,:GYROBALL,
             :BULLDOZE,:ROCKSLIDE,:SWAGGER,:SLEEPTALK,
             :SUBSTITUTE,:NATUREPOWER,:CONFIDE,:ROAR,:HYPERBEAM,
             :FRUSTRATION,:ECHOEDVOICE,:FOCUSBLAST,:GIGAIMPACT,
             :WILDCHARGE]
   for i in 0...movelist.length
     movelist[i]=getConst(PBMoves,movelist[i]) if getConst(PBMoves,movelist[i])!=nil
   end
   next movelist
},
"onSetForm"=>proc{|pokemon,form|
  pbSeenForm(pokemon)
}
})

MultipleForms.register(:GRIMER,{
"getFormName"=>proc{|pokemon|
  next _INTL("Alola Form") if pokemon.isDelta?
  next
},
"type2"=>proc{|pokemon|
  next getID(PBTypes,:DARK) if pokemon.isDelta?
  next
},
"height"=>proc{|pokemon|
  next 0.7 if pokemon.isDelta?
  next
},
"weight"=>proc{|pokemon|
  next 42.0 if pokemon.isDelta?
  next
},
"getAbilityList"=>proc{|pokemon|
  if pokemon.isDelta?
    if getID(PBAbilities,:POWEROFALCHEMY)==nil
      if getID(PBAbilities,:RECEIVER)==nil
        next [[getID(PBAbilities,:POISONTOUCH),0],
              [getID(PBAbilities,:GLUTTONY),1]]
      end
      next [[getID(PBAbilities,:POISONTOUCH),0],
            [getID(PBAbilities,:GLUTTONY),1],
            [getID(PBAbilities,:RECEIVER),2]]
    end
    next [[getID(PBAbilities,:POISONTOUCH),0],
          [getID(PBAbilities,:GLUTTONY),1],
          [getID(PBAbilities,:POWEROFALCHEMY),2]]
  end
  next
},
"getMoveList"=>proc{|pokemon|
  next if !pokemon.isDelta?
  movelist=[]
  if pokemon.isDelta?
    movelist=[[1,:POUND],[1,:POISONGAS],[4,:HARDEN],[7,:BITE],[12,:DISABLE],
              [15,:ACIDSPRAY],[18,:POISONFANG],[21,:MINIMIZE],[26,:FLING],
              [29,:KNOCKOFF],[32,:CRUNCH],[37,:SCREECH],[40,:GUNKSHOT],
              [43,:ACIDARMOR],[46,:BELCH],[48,:MEMENTO]]
  end
  for i in movelist
    i[1]=getConst(PBMoves,i[1]) if getConst(PBMoves,movelist[i])!=nil
  end
  next movelist
},
"getMoveCompatibility"=>proc{|pokemon|
   next if !pokemon.isDelta?
   movelist=[# TMs
             :TOXIC,:VENOSHOCK,:HIDDENPOWER,:SUNNYDAY,:TAUNT,
             :PROTECT,:RAINDANCE,:FRUSTRATION,:RETURN,:SHADOWBALL,
             :DOUBLETEAM,:SLUDGEWAVE,:FLAMETHROWER,:SLUDGEBOMB,
             :FIREBLAST,:ROCKTOMB,:TORMENT,:FACADE,:REST,:ATTRACT,
             :THIEF,:ROUND,:FLING,:BRUTALSWING,:QUASH,:EMBARGO,
             :EXPLOSION,:PAYBACK,:ROCKPOLISH,:STONEEDGE,:INFESTATION,
             :POISONJAB,:SWAGGER,:SLEEPTALK,:SUBSTITUTE,:SNARL,:CONFIDE]
   for i in 0...movelist.length
     movelist[i]=getConst(PBMoves,movelist[i]) if getConst(PBMoves,movelist[i])!=nil
   end
   next movelist
},
"possibleEggMoves"=>proc{|pokemon|
   next if !pokemon.isDelta?
   movelist=[:ASSURANCE,:CLEARSMOG,:CURSE,:IMPRISION,:MEANLOOK,:PURSUIT,
             :SCARYFACE,:SHADOWSNEAK,:SPITE,:STOCKPILE,:SPITUP,:SWALLOW]
   for i in 0...movelist.length
     movelist[i]=getConst(PBMoves,movelist[i]) if getConst(PBMoves,movelist[i])!=nil
   end
   next movelist
},
"onSetForm"=>proc{|pokemon,form|
  pbSeenForm(pokemon)
}
})

MultipleForms.register(:MUK,{
"getFormName"=>proc{|pokemon|
  next _INTL("Alola Form") if pokemon.isDelta?
  next
},
"type2"=>proc{|pokemon|
  next getID(PBTypes,:DARK) if pokemon.isDelta?
  next
},
"height"=>proc{|pokemon|
  next 1.0 if pokemon.isDelta?
  next
},
"weight"=>proc{|pokemon|
  next 52.0 if pokemon.isDelta?
  next
},
"getAbilityList"=>proc{|pokemon|
  if pokemon.isDelta?
    if getID(PBAbilities,:POWEROFALCHEMY)==nil
      if getID(PBAbilities,:RECEIVER)==nil
        next [[getID(PBAbilities,:POISONTOUCH),0],
              [getID(PBAbilities,:GLUTTONY),1]]
      end
      next [[getID(PBAbilities,:POISONTOUCH),0],
            [getID(PBAbilities,:GLUTTONY),1],
            [getID(PBAbilities,:RECEIVER),2]]
    end
    next [[getID(PBAbilities,:POISONTOUCH),0],
          [getID(PBAbilities,:GLUTTONY),1],
          [getID(PBAbilities,:POWEROFALCHEMY),2]]
  end
  next
},
"getMoveList"=>proc{|pokemon|
  next if !pokemon.isDelta?
  movelist=[]
  if pokemon.isDelta?
    movelist=[[1,:VENOMDRENCH],[1,:POUND],[1,:POISONGAS],[1,:HARDEN],
              [1,:BITE],[4,:HARDEN],[7,:BITE],[12,:DISABLE],
              [15,:ACIDSPRAY],[18,:POISONFANG],[21,:MINIMIZE],[26,:FLING],
              [29,:KNOCKOFF],[32,:CRUNCH],[37,:SCREECH],[40,:GUNKSHOT],
              [46,:ACIDARMOR],[52,:BELCH],[57,:MEMENTO]]
  end
  for i in movelist
    i[1]=getConst(PBMoves,i[1]) if getConst(PBMoves,movelist[i])!=nil
  end
  next movelist
},
"getMoveCompatibility"=>proc{|pokemon|
   next if !pokemon.isDelta?
   movelist=[# TMs
             :TOXIC,:VENOSHOCK,:HIDDENPOWER,:SUNNYDAY,:TAUNT,
             :PROTECT,:RAINDANCE,:FRUSTRATION,:RETURN,:SHADOWBALL,
             :DOUBLETEAM,:SLUDGEWAVE,:FLAMETHROWER,:SLUDGEBOMB,
             :FIREBLAST,:ROCKTOMB,:TORMENT,:FACADE,:REST,:ATTRACT,
             :THIEF,:ROUND,:FLING,:BRUTALSWING,:QUASH,:EMBARGO,
             :EXPLOSION,:PAYBACK,:ROCKPOLISH,:STONEEDGE,:INFESTATION,
             :POISONJAB,:SWAGGER,:SLEEPTALK,:SUBSTITUTE,:SNARL,
             :CONFIDE,:HYPERBEAM,:BRICKBREAK,:FOCUSBLAST,
             :GIGAIMPACT,:DARKPULSE]
   for i in 0...movelist.length
     movelist[i]=getConst(PBMoves,movelist[i]) if getConst(PBMoves,movelist[i])!=nil
   end
   next movelist
},
"onSetForm"=>proc{|pokemon,form|
  pbSeenForm(pokemon)
}
})

MultipleForms.register(:EXEGGUTOR,{
"getFormName"=>proc{|pokemon|
  next _INTL("Alola Form") if pokemon.isDelta?
  next
},
"type2"=>proc{|pokemon|
  next getID(PBTypes,:DRAGON) if pokemon.isDelta?
  next
},
"height"=>proc{|pokemon|
  next 10.9 if pokemon.isDelta?
  next
},
"weight"=>proc{|pokemon|
  next 415.6 if pokemon.isDelta?
  next
},
"getBaseStats"=>proc{|pokemon|
   next [95,105,85,45,125,75] if pokemon.isDelta?
   next
},
"getAbilityList"=>proc{|pokemon|
  if pokemon.isDelta?
    next [[getID(PBAbilities,:FRISK),0],
          [getID(PBAbilities,:HARVEST),2]]
  end
  next
},
"getMoveList"=>proc{|pokemon|
  next if !pokemon.isDelta?
  movelist=[]
  if pokemon.isDelta?
    movelist=[[1,:DRAGONHAMMER],[1,:SEEDBOMB],[1,:BARRAGE],[1,:HYPNOSIS],
              [1,:CONFUSION],[17,:PSYSHOCK],[27,:EGGBOMB],[37,:WOODHAMMER],
              [47,:LEAFSTORM]]
  end
  for i in movelist
    i[1]=getConst(PBMoves,i[1])
  end
  next movelist
},
"getMoveCompatibility"=>proc{|pokemon|
   next if !pokemon.isDelta?
   movelist=[# TMs
             :PSYSHOCK,:TOXIC,:HIDDENPOWER,:SUNNYDAY,:HYPERBEAM,
             :LIGHTSCREEN,:PROTECT,:FRUSTRATION,:SOLARBEAM,:EARTHQUAKE,
             :RETURN,:PSYCHIC,:BRICKBREAK,:DOUBLETEAM,:REFLECT,
             :FLAMETHROWER,:SLUDGEBOMB,:FACADE,:REST,:ATTRACT,
             :THIEF,:ROUND,:ENERGYBALL,:BRUTALSWING,:EXPLOSION,
             :GIGAIMPACT,:SWORDSDANCE,:PSYCHUP,:BULLDOZE,:DRAGONTAIL,
             :INFESTATION,:DREAMEATER,:GRASSKNOT,:SWAGGER,:SLEEPTALK,
             :SUBSTITUTE,:TRICKEROOM,:NATUREPOWER,:CONFIDE,:DRACOMETEOR]
   for i in 0...movelist.length
     movelist[i]=getConst(PBMoves,movelist[i]) if getConst(PBMoves,movelist[i])!=nil
   end
   next movelist
},
"onSetForm"=>proc{|pokemon,form|
  pbSeenForm(pokemon)
}
})

MultipleForms.register(:MAROWAK,{
"getFormName"=>proc{|pokemon|
  next _INTL("Alola Form") if pokemon.isDelta?
  next
},
"type1"=>proc{|pokemon|
  next getID(PBTypes,:FIRE) if pokemon.isDelta?
  next
},
"type2"=>proc{|pokemon|
  next getID(PBTypes,:GHOST) if pokemon.isDelta?
  next
},
"weight"=>proc{|pokemon|
  next 34.0 if pokemon.isDelta?
  next
},
"getAbilityList"=>proc{|pokemon|
  if pokemon.isDelta?
    next [[getID(PBAbilities,:CURSEDBODY),0],
          [getID(PBAbilities,:LIGHTNINGROD),1],
          [getID(PBAbilities,:ROCKHEAD),2]]
  end
  next
},
"getMoveList"=>proc{|pokemon|
  next if !pokemon.isDelta?
  movelist=[]
  if pokemon.isDelta?
    movelist=[[1,:GROWL],[1,:TAILWHIP],[1,:BONECLUB],[1,:FLAMEWHEEL],
              [3,:TAILWHIP],[7,:BONECLUB],[11,:FLAMEWHEEL],[13,:LEER],
              [17,:HEX],[21,:BONEMERANG],[23,:WILLOWISP],[27,:SHADOWBONE],
              [33,:THRASH],[37,:FLING],[43,:STOMPINGTANTRUM],[49,:ENDEAVOR],
              [53,:FLAREBLITZ],[59,:RETALIATE],[65,:BONERUSH]]
  end
  for i in movelist
    i[1]=getConst(PBMoves,i[1])
  end
  next movelist
},
"getMoveCompatibility"=>proc{|pokemon|
   next if !pokemon.isDelta?
   movelist=[# TMs
             :TOXIC,:HIDDENPOWER,:SUNNYDAY,:ICEBEAM,:BLIZZARD,:HYPERBEAM,
             :PROTECT,:RAINDANCE,:FRUSTRATION,:SMACKDOWN,:THUNDERBOLT,
             :THUNDER,:EARTHQUAKE,:RETURN,:SHADOWBALL,:BRICKBREAK,:DOUBLETEAM,
             :FLAMETHROWER,:SANDSTORM,:FIREBLAST,:ROCKTOMB,:AERIALACE,:FACADE,
             :FLAMECHARGE,:REST,:ATTRACT,:THIEF,:ROUND,:ECHOEDVOICE,
             :FOCUSBLAST,:FALSESWIPE,:FLING,:BRUTALSWING,:WILLOWISP,
             :GIGAIMPACT,:STONEEDGE,:SWORDSDANCE,:BULLDOZE,:ROCKSLIDE,
             :DREAMEATER,:SWAGGER,:SLEEPTALK,:SUBSTITUTE,:DARKPULSE,
             :CONFIDE]
   for i in 0...movelist.length
     movelist[i]=getConst(PBMoves,movelist[i]) if getConst(PBMoves,movelist[i])!=nil
   end
   next movelist
},
"onSetForm"=>proc{|pokemon,form|
  pbSeenForm(pokemon)
}
})

###################################################################
# EXAMPLE ENCOUNTER MODIFIER
# This makes Exeggutor that are created on a particular map
#    become Alolan Exeggutor automatically.
# Evolving Exeggcute on this map will not make them become Alolan
#    Exeggutor.  Only wild Exeggutor.
# "pokemon.makeDelta" is how to make the Pokemon a Delta/Alolan
###################################################################
# Events.onWildPokemonCreate+=proc {|sender,e|
#    pokemon=e[0]
#    if $game_map.map_id==51 && isConst?(pokemon.species,PBSpecies,:EXEGGUTOR)
#      pokemon.makeDelta
#    end
# }

###################################################################
# EXAMPLE RANDOM SPAWNER MODIFIER
# This makes Delta/Alolan Pokemon spawn randomly, at the same rate
#    as Shiny Pokemon do
# Note that this method doesn't allow for Shiny Delta/Alolan
#    Pokemon, as the possible numbers for it don't overlap.
# Note also that this does not make a Delta for every species.
#    If a species doesn't have a Delta/Alolan Form defined, than
#    this function is meaningless.
###################################################################
# class PokeBattle_Pokemon
#   def isDelta?
#     return @deltaflag if @deltaflag!=nil
#     a=@personalID^@trainerID
#     b=a&0xFFFF
#     c=(a>>16)&0xFFFF
#     d=b^c
#     return (d>65536-SHINYPOKEMONCHANCE)
#   end
# end
In effect, for level-up movesets, the game was ignoring the Deltaness and looking at only the internal form number (what the game uses to remember Unown forms, Mega Evolutions, etc.)
 
11
Posts
7
Years
  • Age 27
  • Seen Jul 18, 2017
I have done everything. But I can't figure it out.
My Delta Script has to be above the EBS files. Or the game will crash when it enters a battle. But when it is above EBS, the custom sprite won't show up. I have read all the posts, but those didn't help me. Please Help!! I used the newest script.
I am using EBS and Following Pokémon

Also how can I have my Delta/Alolan Pokémon have a special symbol, when catching and use them in battles.
Something like this:
TEST.png
 
Last edited:

esteban

Pokémon Moon Version
5
Posts
8
Years
  • Age 24
  • Seen Aug 7, 2017
I don't know whether this happens to everybody or just me but when I catch an Alolan Pokémon, it still has its old moves (For example: Catching an Alolan Graveler with the move Earthquake) but upon leveling up it learns the moves it should learn (like Thunderpunch)

Also thank you for this amazing script! I don't mean to shit on your hard work, I'm truly sorry :(
 

Franzo

Developing something...
95
Posts
16
Years
  • Age 28
  • ???
  • Seen Nov 6, 2023
I don't know whether this happens to everybody or just me but when I catch an Alolan Pokémon, it still has its old moves (For example: Catching an Alolan Graveler with the move Earthquake) but upon leveling up it learns the moves it should learn (like Thunderpunch)

Also thank you for this amazing script! I don't mean to **** on your hard work, I'm truly sorry :(

In the encounter section of the script where you put pokemon.makeDelta, add pokemon.resetMoves after. That will reload the Grimer's moves to have the level up set.

Also is there a way to have the Delta form appear in the pokedex?
 
824
Posts
8
Years
I have done everything. But I can't figure it out.
My Delta Script has to be above the EBS files. Or the game will crash when it enters a battle. But when it is above EBS, the custom sprite won't show up. I have read all the posts, but those didn't help me. Please Help!! I used the newest script.
I am using EBS and Following Pokémon

Also how can I have my Delta/Alolan Pokémon have a special symbol, when catching and use them in battles.
Something like this:
TEST.png

as for the first question, Deltas are supposed to be below the EBS scripts. Why is it crashing when you enter battle?

As for the special symbol, you'd need to edit the EBS GUI scripts.

Also is there a way to have the Delta form appear in the pokedex?

That would require editing the Pokedex, something I don't want to do since custom Pokedex GUIs are common.
 
11
Posts
7
Years
  • Age 27
  • Seen Jul 18, 2017
as for the first question, Deltas are supposed to be below the EBS scripts. Why is it crashing when you enter battle?

As for the special symbol, you'd need to edit the EBS GUI scripts.



That would require editing the Pokedex, something I don't want to do since custom Pokedex GUIs are common.

When entering a battle, I got this error:
Spoiler:


Please help
 
824
Posts
8
Years
When entering a battle, I got this error:
Spoiler:


Please help

I'm literally seeing nothing here from my code.
 
12
Posts
13
Years
  • Seen Jan 27, 2018
Hello, where do I need to add make.Pokemondelta part, for a custom trainer? I tried it several times in several ways and all I got are errors, or the normal Kantonian Pok?mons or Pikachus in a fight. I have the custom trainer script, I dont use EBS, nor follow me Pok?mon.
I have no issues getting wild Alolan Pok?mon encounters.
 
35
Posts
7
Years
  • Age 36
  • Seen Nov 1, 2018
Hello, where do I need to add make.Pokemondelta part, for a custom trainer? I tried it several times in several ways and all I got are errors, or the normal Kantonian Pok?mons or Pikachus in a fight. I have the custom trainer script, I dont use EBS, nor follow me Pok?mon.
I have no issues getting wild Alolan Pok?mon encounters.

Code:
p0=createPokemon("MEOWTH",38)
p1=createPokemon("RATTATA",39)
p2=createPokemon("RAICHU",39)
p0.makeDelta
p2.makeDelta
party=[p0,p1,p2]
trainer=createTrainer(10,"Epoy",party)
result=customTrainerBattle(trainer,"Oh no, you defeated me!")
pbSet(1, result == BR_WIN ? 0 : 1)

copy paste it to try.
 
Back
Top