• 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
  • 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
    • 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
    • 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