Author Id: 16831
Author Name: randaku
Post Content: [QUOTE][url=http://wahackforo.com/showthread.php?p=236877]Iniciado por Drimer[/url]
[spoiler="Sobre el menú"]
Puedes hacerlo en un script de tipo Escena, de hecho es lo mejor que puedes hacer xD
Una vez que tengas preparado tu menú, ve al script Scene_Map y cambia lo siguiente:

  def call_menu
    $game_temp.menu_calling = false
    $game_player.straighten
    $game_map.update
    sscene=PokemonMenu_Scene.new
    sscreen=PokemonMenu.new(sscene) 
    sscreen.pbStartPokemonMenu
  end
Lo cambiarás por lo correspondiente al menú que hiciste.
[/spoiler]

Sobre los combates

Todo está en el script: PokeBattle_ActualScene.
Si quieres editar únicamente la introducción al combate entonces busca:
  def pbStartBattle(battle)
Si quieres hacer escena BW entonces edita todo el script[/QUOTE]
con respecto al battle system nose como hacer lo que necesito
aca tengo el pokebattle_actualscene el que esta en mi essentials
[SPOILER="pokebattle_actualscene"]
=begin

-  def pbChooseNewEnemy(index,party)
Use this method to choose a new Pokémon for the enemy
The enemy's party is guaranteed to have at least one 
choosable member.
index - Index to the battler to be replaced (use e.g. @battle.battlers[index] to 
access the battler)
party - Enemy's party

- def pbWildBattleSuccess
This method is called when the player wins a wild Pokémon battle.
This method can change the battle's music for example.

- def pbTrainerBattleSuccess
This method is called when the player wins a Trainer battle.
This method can change the battle's music for example.

- def pbFainted(pkmn)
This method is called whenever a Pokémon faints.
pkmn - PokeBattle_Battler object indicating the Pokémon that fainted

- def pbChooseEnemyCommand(index)
Use this method to choose a command for the enemy.
index - Index of enemy battler (use e.g. @battle.battlers[index] to 
access the battler)

- def pbCommandMenu(index)
Use this method to display the list of commands and choose
a command for the player.
index - Index of battler (use e.g. @battle.battlers[index] to 
access the battler)
Return values:
0 - Fight
1 - Pokémon
2 - Bag
3 - Run


=end


################################################



class CommandMenuDisplay
 def initialize(viewport=nil)
  @display=nil
  if PokeBattle_Scene::USECOMMANDBOX
   @display=IconSprite.new(0,Graphics.height-96,viewport)
   @display.setBitmap("Graphics/Pictures/commandbox")
  end
  [MENTION=24700]Wind[/MENTION]ow=Window_CommandPokemon.newWithSize([],
    Graphics.width-240,Graphics.height-96,240,96);
  [MENTION=24700]Wind[/MENTION]ow.columns=2
  [MENTION=24700]Wind[/MENTION]ow.columnSpacing=4
  [MENTION=24700]Wind[/MENTION]ow.viewport=viewport
  @msgbox=Window_UnformattedTextPokemon.newWithSize(
   "",4,Graphics.height-96,
   [email]Graphics.width [MENTION=24700]Wind[/MENTION]ow.width[/email]-4,
   96,viewport)
  @msgbox.baseColor=PokeBattle_Scene::MESSAGEBASECOLOR
  @msgbox.shadowColor=PokeBattle_Scene::MESSAGESHADOWCOLOR
  @msgbox.windowskin=nil
  if PokeBattle_Scene::USECOMMANDBOX
   [MENTION=24700]Wind[/MENTION]ow.opacity=0
  end
  @title=""
 end
 def index; [MENTION=24700]Wind[/MENTION]ow.index; end
 def index=(value); [MENTION=24700]Wind[/MENTION]ow.index=value; end
 def setTexts(value)
  @msgbox.text=value[0]
  # Note 2 and 3 were intentionally switched
  commands=[]
  [1,3,2,4].each{|i|
   commands.push(value) if value && value!=nil
  }
  [MENTION=24700]Wind[/MENTION]ow.commands=commands
 end
 def visible; [MENTION=24700]Wind[/MENTION]ow.visible; end
 def visible=(value)
  [MENTION=24700]Wind[/MENTION]ow.visible=value
  @msgbox.visible=value
  @display.visible=value if @display
 end
 def x; [MENTION=24700]Wind[/MENTION]ow.x; end
 def x=(value)
  [MENTION=24700]Wind[/MENTION]ow.x=value
  @msgbox.x=value
  @display.x=value if @display
 end
 def y; [MENTION=24700]Wind[/MENTION]ow.y; end
 def y=(value)
  [MENTION=24700]Wind[/MENTION]ow.y=value
  @msgbox.y=value
  @display.y=value if @display
 end
 def oy; [MENTION=24700]Wind[/MENTION]ow.oy; end
 def oy=(value)
  [MENTION=24700]Wind[/MENTION]ow.oy=value
  @msgbox.oy=value
  @display.oy=value if @display
 end
 def color; [MENTION=24700]Wind[/MENTION]ow.color; end
 def color=(value)
  [MENTION=24700]Wind[/MENTION]ow.color=value
  @msgbox.color=value
  @display.color=value if @display
 end
 def ox; [MENTION=24700]Wind[/MENTION]ow.ox; end
 def ox=(value)
  [MENTION=24700]Wind[/MENTION]ow.ox=value
  @msgbox.ox=value
  @display.ox=value if @display
 end
 def z; [MENTION=24700]Wind[/MENTION]ow.z; end
 def z=(value)
  [MENTION=24700]Wind[/MENTION]ow.z=value
  @msgbox.z=value
  @display.z=value if @display
 end
 def disposed?
  return @msgbox.disposed? || [MENTION=24700]Wind[/MENTION]ow.disposed?
 end
 def dispose
  return if disposed?
  @msgbox.dispose
  [MENTION=24700]Wind[/MENTION]ow.dispose
  @display.dispose if @display
 end
 def update
  @msgbox.update
  [MENTION=24700]Wind[/MENTION]ow.update
  @display.update if @display
 end
 def refresh
  @msgbox.refresh
  [MENTION=24700]Wind[/MENTION]ow.refresh
 end
end

class FightMenuDisplay
 attr_reader :battler
 attr_reader :index
 def battler=(value)
  @battler=value
  refresh
 end
 def setIndex(value)
  if @battler && @battler.moves[value].id!=0
   @index=value
   [MENTION=24700]Wind[/MENTION]ow.index=value
   refresh
  end
 end
 def visible; [MENTION=24700]Wind[/MENTION]ow.visible; end
 def visible=(value)
  [MENTION=24700]Wind[/MENTION]ow.visible=value
  @info.visible=value
  @display.visible=value if @display
 end
 def x; [MENTION=24700]Wind[/MENTION]ow.x; end
 def x=(value)
  [MENTION=24700]Wind[/MENTION]ow.x=value
  @info.x=value
  @display.x=value if @display
 end
 def y; [MENTION=24700]Wind[/MENTION]ow.y; end
 def y=(value)
  [MENTION=24700]Wind[/MENTION]ow.y=value
  @info.y=value
  @display.y=value if @display
 end
 def oy; [MENTION=24700]Wind[/MENTION]ow.oy; end
 def oy=(value)
  [MENTION=24700]Wind[/MENTION]ow.oy=value
  @info.oy=value
  @display.oy=value if @display
 end
 def color; [MENTION=24700]Wind[/MENTION]ow.color; end
 def color=(value)
  [MENTION=24700]Wind[/MENTION]ow.color=value
  @info.color=value
  @display.color=value if @display
 end
 def ox; [MENTION=24700]Wind[/MENTION]ow.ox; end
 def ox=(value)
  [MENTION=24700]Wind[/MENTION]ow.ox=value
  @info.ox=value
  @display.ox=value if @display
 end
 def z; [MENTION=24700]Wind[/MENTION]ow.z; end
 def z=(value)
  [MENTION=24700]Wind[/MENTION]ow.z=value
  @info.z=value
  @display.z=value if @display
 end
 def disposed?
  return @info.disposed? || [MENTION=24700]Wind[/MENTION]ow.disposed?
 end
 def dispose
  return if disposed?
  @info.dispose
  @display.dispose if @display
  [MENTION=24700]Wind[/MENTION]ow.dispose
 end
 def update
  @info.update
  [MENTION=24700]Wind[/MENTION]ow.update
  @display.update if @display
 end
 def initialize(battler,viewport=nil)
  @display=nil
  if PokeBattle_Scene::USEFIGHTBOX
   @display=IconSprite.new(0,Graphics.height-96,viewport)
   @display.setBitmap("Graphics/Pictures/fightbox")
  end
  [MENTION=24700]Wind[/MENTION]ow=Window_CommandPokemon.newWithSize([],
    0,Graphics.height-96,320,96,viewport)
  [MENTION=24700]Wind[/MENTION]ow.columns=2
  [MENTION=24700]Wind[/MENTION]ow.columnSpacing=4
  @info=Window_AdvancedTextPokemon.newWithSize(
   "",320,Graphics.height-96,Graphics.width-320,96,viewport)
  @ctag=shadowctag(PokeBattle_Scene::MENUBASECOLOR,
    PokeBattle_Scene::MENUSHADOWCOLOR)
  if PokeBattle_Scene::USEFIGHTBOX
   [MENTION=24700]Wind[/MENTION]ow.opacity=0
   @info.opacity=0
  end
  @battler=battler
  @index=0
  refresh
 end
 def refresh
  return if !@battler
  pbSetNarrowFont [MENTION=24700]Wind[/MENTION]ow.contents)
  commands=[]
  for i in 0...4
   if @battler.moves.id!=0
    commands.push(@battler.moves.name)
   else
    break
   end
  end
  [MENTION=24700]Wind[/MENTION]ow.commands=commands
  selmove=@battler.moves[@index]
  movetype=PBTypes.getName(selmove.type)
  pbSetNarrowFont(@info.contents)
  @info.text=_ISPRINTF("{1:s}PP: {2: 2d}/{3: 2d}<br>TYPE/{4:s}",
    @ctag,selmove.pp,selmove.totalpp,movetype)
 end
end

class PokemonBattlerSprite < RPG::Sprite
 attr_accessor :selected
 def initialize(doublebattle,index,viewport=nil)
  super(viewport)
  @selected=0
  [MENTION=19010]Frame[/MENTION]=0
  @index=index
  @updating=false
  @doublebattle=doublebattle
  @index=index
  [MENTION=24071]Sprite[/MENTION]X=0
  [MENTION=24071]Sprite[/MENTION]Y=0
  [MENTION=24071]Sprite[/MENTION]XExtra=0
  [MENTION=24071]Sprite[/MENTION]YExtra=0
  [MENTION=24071]Sprite[/MENTION]Visible=false
  @_iconbitmap=nil
  self.visible=false
 end
 def selected=(value)
  if @selected==1 && value!=1 && [MENTION=24071]Sprite[/MENTION]YExtra>0
   [MENTION=24071]Sprite[/MENTION]YExtra=0
   self.y [MENTION=24071]Sprite[/MENTION]Y
  end
  @selected=value
 end
 def visible=(value)
  [MENTION=24071]Sprite[/MENTION]Visible=value if !@updating
  super
 end
 def x
  return [MENTION=24071]Sprite[/MENTION]X
 end
 def y
  return [MENTION=24071]Sprite[/MENTION]Y
 end
 def x=(value)
  [MENTION=24071]Sprite[/MENTION]X=value
  super(value [MENTION=24071]Sprite[/MENTION]XExtra)
 end
 def y=(value)
  [MENTION=24071]Sprite[/MENTION]Y=value
  super(value [MENTION=24071]Sprite[/MENTION]YExtra)
 end
 def update
  [MENTION=19010]Frame[/MENTION]+=1
  @updating=true
  if ( [MENTION=19010]Frame[/MENTION]/9).floor&1)==1 && @selected==1 # When choosing commands for this Pokémon
   [MENTION=24071]Sprite[/MENTION]YExtra=2
  else
   [MENTION=24071]Sprite[/MENTION]YExtra=0
  end
  if ( [MENTION=19010]Frame[/MENTION]/9).floor&1)==1 && @selected==1 # When choosing commands for this Pokémon
   self.x [MENTION=24071]Sprite[/MENTION]X
   self.y [MENTION=24071]Sprite[/MENTION]Y
   self.visible [MENTION=24071]Sprite[/MENTION]Visible
  elsif @selected==2 # When targeted or damaged
   self.x [MENTION=24071]Sprite[/MENTION]X
   self.y [MENTION=24071]Sprite[/MENTION]Y
   self.visible= [MENTION=19010]Frame[/MENTION]%10<7)
  elsif 
   self.x [MENTION=24071]Sprite[/MENTION]X
   self.y [MENTION=24071]Sprite[/MENTION]Y
   self.visible [MENTION=24071]Sprite[/MENTION]Visible
  end
  if @_iconbitmap
   @_iconbitmap.update
   self.bitmap=@_iconbitmap.bitmap
  end
  @updating=false
 end
 def dispose
  @_iconbitmap.dispose if @_iconbitmap
  @_iconbitmap=nil
  self.bitmap=nil if !self.disposed?
  super
 end
 def setPokemonBitmap(pokemon,back=false)
  @_iconbitmap.dispose if @_iconbitmap
  @_iconbitmap=pbLoadPokemonBitmap(pokemon,back)
  self.bitmap=@_iconbitmap ? @_iconbitmap.bitmap : nil
 end
 def setPokemonBitmapSpecies(pokemon,species,back=false)
  @_iconbitmap.dispose if @_iconbitmap
  @_iconbitmap=pbLoadPokemonBitmapSpecies(pokemon,species,back)
  self.bitmap=@_iconbitmap ? @_iconbitmap.bitmap : nil
 end
end

class SafariDataBox < SpriteWrapper
 attr_accessor :selected
 attr_reader :appearing
 def initialize(battle,viewport=nil)
  super(viewport)
  @selected=0
  @battle=battle
  @databox=AnimatedBitmap.new("Graphics/Pictures/safariPlayerBox")
  [MENTION=24071]Sprite[/MENTION]X=254
  [MENTION=24071]Sprite[/MENTION]Y=148+(Graphics.height-320)
  [MENTION=24071]Sprite[/MENTION]baseY=0
  [MENTION=24071]Sprite[/MENTION]baseX=16
  @appearing=false
  @contents=BitmapWrapper.new(@databox.width,@databox.height)
  self.bitmap=@contents
  self.visible=false
  self.z=2
  refresh
 end
 def appear
  refresh
  self.visible=true
  self.opacity=255
  self.x [MENTION=24071]Sprite[/MENTION]X+320
  self.y [MENTION=24071]Sprite[/MENTION]Y
  @appearing=true
 end
 def refresh
  self.bitmap.clear
  self.bitmap.blt(0,0,@databox.bitmap,Rect.new(0,0,@databox.width,@databox.height))
  pbSetSmallFont(self.bitmap)
  textpos=[]
  base=PokeBattle_Scene::BOXTEXTBASECOLOR
  shadow=PokeBattle_Scene::BOXTEXTSHADOWCOLOR
  textpos.push([_INTL("SAFARI BALLS") [MENTION=24071]Sprite[/MENTION]baseX+14 [MENTION=24071]Sprite[/MENTION]baseY+6,false,base,shadow])
  textpos.push([_INTL("Left: {1}",@battle.ballcount) [MENTION=24071]Sprite[/MENTION]baseX+170 [MENTION=24071]Sprite[/MENTION]baseY+40,
    true,base,shadow])
  pbDrawTextPositions(self.bitmap,textpos)
 end
 def update
  super
  if @appearing
   self.x-=8
   @appearing=false if self.x< [MENTION=24071]Sprite[/MENTION]X
   self.y [MENTION=24071]Sprite[/MENTION]Y
   return
  end
  self.x [MENTION=24071]Sprite[/MENTION]X
  self.y [MENTION=24071]Sprite[/MENTION]Y
 end
end

class PokemonDataBox < SpriteWrapper
 attr_reader :battler
 attr_accessor :selected
 attr_accessor :appearing
 attr_reader :animatingHP
 attr_reader :animatingEXP
 def initialize(battler,doublebattle,viewport=nil)
  super(viewport)
  @explevel=0
  @battler=battler
  [MENTION=24071]Sprite[/MENTION]baseY=0
  @selected=0
  [MENTION=19010]Frame[/MENTION]=0
  @showhp=false
  @showexp=false
  @appearing=false
  @animatingHP=false
  @currenthp=0
  @endhp=0
  @expflash=0
  @statusCX=64
  @statusY=28
  if (@battler.index&1)==0 # if player's Pokémon
   [MENTION=24071]Sprite[/MENTION]baseX=16
  else
   [MENTION=24071]Sprite[/MENTION]baseX=0
  end
  yoffset=(Graphics.height-320)
  if doublebattle
   case @battler.index
    when 0
     @databox=AnimatedBitmap.new("Graphics/Pictures/doublePlayerBox")
     [MENTION=24071]Sprite[/MENTION]X=256
     [MENTION=24071]Sprite[/MENTION]Y=124+yoffset
    when 1 
     @databox=AnimatedBitmap.new("Graphics/Pictures/doubleEnemyBox")
     [MENTION=24071]Sprite[/MENTION]X=26
     [MENTION=24071]Sprite[/MENTION]Y=10+yoffset
     [MENTION=24071]Sprite[/MENTION]baseX=0
     [MENTION=24071]Sprite[/MENTION]baseY=0
    when 2 
     @databox=AnimatedBitmap.new("Graphics/Pictures/doublePlayerBox")
     [MENTION=24071]Sprite[/MENTION]X=280
     [MENTION=24071]Sprite[/MENTION]Y=174+yoffset
    when 3 
     @databox=AnimatedBitmap.new("Graphics/Pictures/doubleEnemyBox")
     [MENTION=24071]Sprite[/MENTION]X=2
     [MENTION=24071]Sprite[/MENTION]Y=60+yoffset
   end
  else
   case @battler.index
    when 0
     @databox=AnimatedBitmap.new("Graphics/Pictures/singlePlayerBox")
     [MENTION=24071]Sprite[/MENTION]X=254
     [MENTION=24071]Sprite[/MENTION]Y=148
     @showhp=true
     @showexp=true
     @statusCX=40
     @statusY=44
    when 1 
     @databox=AnimatedBitmap.new("Graphics/Pictures/singleEnemyBox")
     [MENTION=24071]Sprite[/MENTION]X=26
     [MENTION=24071]Sprite[/MENTION]Y=32+yoffset
   end
  end
  @statuses=AnimatedBitmap.new(_INTL("Graphics/Pictures/boxstatuses"))
  @contents=BitmapWrapper.new(@databox.width,@databox.height)
  self.bitmap=@contents
  self.visible=false
  self.z=2
  refreshExpLevel
  refresh
 end
 def dispose
  @statuses.dispose
  @databox.dispose
  @contents.dispose
  super
 end
 def refreshExpLevel
   if !@battler.pokemon
     @explevel=0
   else
     growthrate=@battler.pokemon.growthrate
     startexp=PBExperience.pbGetStartExperience(@battler.pokemon.level,growthrate)
     endexp=PBExperience.pbGetStartExperience(@battler.pokemon.level+1,growthrate)
     if startexp==endexp
       @explevel=0
     else
       @explevel=(@battler.pokemon.exp-startexp)*PokeBattle_Scene::EXPGAUGESIZE/(endexp-startexp)
     end
   end
 end
 def exp
  return @animatingEXP ? @currentexp : @explevel
 end
 def hp
  return @animatingHP ? @currenthp : @battler.hp
 end
 def animateHP(oldhp,newhp)
  @currenthp=oldhp
  @endhp=newhp
  @animatingHP=true
 end
 def animateEXP(oldexp,newexp)
  @currentexp=oldexp
  @endexp=newexp
  @animatingEXP=true
 end
 def appear
  refreshExpLevel
  refresh
  self.visible=true
  self.opacity=255
  if (@battler.index&1)==0 # if player's Pokémon
   self.x [MENTION=24071]Sprite[/MENTION]X+320
  else
   self.x [MENTION=24071]Sprite[/MENTION]X-320
  end
  self.y [MENTION=24071]Sprite[/MENTION]Y
  @appearing=true
 end
 def refresh
  self.bitmap.clear
  return if !@battler.pokemon
  self.bitmap.blt(0,0,@databox.bitmap,Rect.new(0,0,@databox.width,@databox.height))
  pbSetSmallFont(self.bitmap)
  hpstring=_ISPRINTF("{1: 2d}/{2: 2d}",self.hp,@battler.totalhp)
  textpos=[]
  base=PokeBattle_Scene::BOXTEXTBASECOLOR
  shadow=PokeBattle_Scene::BOXTEXTSHADOWCOLOR
  genderX=self.bitmap.text_size(@battler.name).width
  genderX+ [MENTION=24071]Sprite[/MENTION]baseX+14
  textpos.push([@battler.name [MENTION=24071]Sprite[/MENTION]baseX+14 [MENTION=24071]Sprite[/MENTION]baseY+6,false,base,shadow])
  if @battler.gender==0 # Male
   textpos.push([_INTL("?"),genderX [MENTION=24071]Sprite[/MENTION]baseY+6,false,Color.new(8*8,25*8,31*8),shadow])
  elsif @battler.gender==1 # Female
   textpos.push([_INTL("?"),genderX [MENTION=24071]Sprite[/MENTION]baseY+6,false,Color.new(31*8,19*8,18*8),shadow])
  end
  textpos.push([_INTL("Lv{1}",@battler.level) [MENTION=24071]Sprite[/MENTION]baseX+170 [MENTION=24071]Sprite[/MENTION]baseY+6,true,base,shadow])
  if @showhp
   textpos.push([hpstring [MENTION=24071]Sprite[/MENTION]baseX+170 [MENTION=24071]Sprite[/MENTION]baseY+40,true,base,shadow])
  end
  pbDrawTextPositions(self.bitmap,textpos)
  if @battler.status>0
   self.bitmap.blt [MENTION=24071]Sprite[/MENTION]baseX+14 [MENTION=24071]Sprite[/MENTION][url]baseY+@statusY,@statuses.bitmap[/url],
      Rect.new(0,(@battler.status-1)*16,@statusCX,16))
  end
  hpGaugeSize=PokeBattle_Scene::HPGAUGESIZE
  hpgauge=@battler.totalhp==0 ? 0 : (self.hp*hpGaugeSize/@battler.totalhp)
  hpgauge=1 if hpgauge==0 && self.hp>0
  hpzone=0
  hpzone=1 if self.hp<=(@battler.totalhp/2).floor
  hpzone=2 if self.hp<=(@battler.totalhp/4).floor
  hpcolors=[
   PokeBattle_Scene::HPCOLORSHADOW1,
   PokeBattle_Scene::HPCOLORBASE1,
   PokeBattle_Scene::HPCOLORSHADOW2,
   PokeBattle_Scene::HPCOLORBASE2,
   PokeBattle_Scene::HPCOLORSHADOW3,
   PokeBattle_Scene::HPCOLORBASE3
  ]
  # fill with HP color
  hpGaugeX=PokeBattle_Scene::HPGAUGE_X
  hpGaugeY=PokeBattle_Scene::HPGAUGE_Y
  expGaugeX=PokeBattle_Scene::EXPGAUGE_X
  expGaugeY=PokeBattle_Scene::EXPGAUGE_Y
  self.bitmap.fill_rect [MENTION=24071]Sprite[/MENTION]baseX+hpGaugeX [MENTION=24071]Sprite[/MENTION]baseY+hpGaugeY,hpgauge,2,hpcolors[hpzone*2])
  self.bitmap.fill_rect [MENTION=24071]Sprite[/MENTION]baseX+hpGaugeX [MENTION=24071]Sprite[/MENTION]baseY+hpGaugeY+2,hpgauge,2,hpcolors[hpzone*2+1])
  # fill with black
    self.bitmap.fill_rect [MENTION=24071]Sprite[/MENTION]baseX+hpGaugeX+hpgauge [MENTION=24071]Sprite[/MENTION]baseY+hpGaugeY,hpGaugeSize-hpgauge,2,PokeBattle_Scene::HPCOLORSHADOW4)
    self.bitmap.fill_rect [MENTION=24071]Sprite[/MENTION]baseX+hpGaugeX+hpgauge [MENTION=24071]Sprite[/MENTION]baseY+hpGaugeY+2,hpGaugeSize-hpgauge,2,PokeBattle_Scene::HPCOLORBASE4)
  if @showexp
   # fill with EXP color
   self.bitmap.fill_rect [MENTION=24071]Sprite[/MENTION]baseX+expGaugeX [MENTION=24071]Sprite[/MENTION]baseY+expGaugeY,self.exp,4,PokeBattle_Scene::EXPCOLOR)
  end
 end
 def update
  super
  [MENTION=19010]Frame[/MENTION]+=1
  if @animatingHP
   if @currenthp<@endhp
    @currenthp+=1
   elsif @currenthp>@endhp
    @currenthp-=1
   end
   refresh
   @animatingHP=false if @currenthp==@endhp
  end
  if @animatingEXP
   if !@showexp
    @currentexp=@endexp
   elsif @currentexp<@endexp
    @currentexp+=1
   elsif @currentexp>@endexp
    @currentexp-=1
   end
   refresh
   if @currentexp==@endexp
    if @currentexp==PokeBattle_Scene::EXPGAUGESIZE
     if @expflash==0
      pbSEPlay("expfull")
      self.flash(Color.new(64,200,248),8)
      @expflash=8
     else
      @expflash-=1
      if @expflash==0
       @animatingEXP=false
       refreshExpLevel
      end
     end
    else
     @animatingEXP=false
    end
   end
  end
  if @appearing
   if (@battler.index&1)==0 # if player's Pokémon
    self.x-=8
    @appearing=false if self.x< [MENTION=24071]Sprite[/MENTION]X
   else
    self.x+=8
    @appearing=false if self.x> [MENTION=24071]Sprite[/MENTION]X
   end
   self.y [MENTION=24071]Sprite[/MENTION]Y
   return
  end
  if ( [MENTION=19010]Frame[/MENTION]/10).floor&1)==1 && @selected==1 # When choosing commands for this Pokémon
   self.x [MENTION=24071]Sprite[/MENTION]X
   self.y [MENTION=24071]Sprite[/MENTION]Y+2
  elsif ( [MENTION=19010]Frame[/MENTION]/5).floor&1)==1 && @selected==2 # When targeted or damaged
   self.x [MENTION=24071]Sprite[/MENTION]X
   self.y [MENTION=24071]Sprite[/MENTION]Y+2
  else
   self.x [MENTION=24071]Sprite[/MENTION]X
   self.y [MENTION=24071]Sprite[/MENTION]Y
  end
 end
end

def showShadow?(species)
  metrics=load_data("Data/metrics.dat")
  return metrics[2][species]>0
end

def adjustBattleSpriteY(sprite,species,index)
  ret=0
  metrics=load_data("Data/metrics.dat")
  if index==1 || index==3
   factor=metrics[1][species] # enemy Y
   factor-=metrics[2][species] # altitude (affects shadows)
   halfY=(sprite.bitmap && 
     !sprite.bitmap.disposed?) ? sprite.bitmap.height/2 : 64
   ret=factor*2+(64-halfY)
   ret+=16 if index==1
  else
   ret=(index==0) ? 96 : 112
   ret+=(metrics[0][species])*2
   halfY=(sprite.bitmap && 
     !sprite.bitmap.disposed?) ? sprite.bitmap.height/2 : 64
   ret+=(64-halfY)
  end
  return ret+(Graphics.height-320)
end

class PokeballSendOutAnimation
 SPRITESTEPS=10
 STARTZOOM=0.125
 def initialize(sprite,spritehash,pkmn,doublebattle)
  @disposed=false
  @ballused=pkmn.pokemon ? pkmn.pokemon.ballused : 0
  [MENTION=12671]pokemon[/MENTION]BattlerSprite=sprite
  [MENTION=12671]pokemon[/MENTION]BattlerSprite.visible=false
  [MENTION=12671]pokemon[/MENTION]BattlerSprite.color=Color.new(31*8,22*8,30*8)
  [MENTION=19050]poke[/MENTION]ballsprite=IconSprite.new(0,0,sprite.viewport)
  [MENTION=19050]poke[/MENTION]ballsprite.setBitmap(sprintf("Graphics/Pictures/ball%02d_0",@ballused))
  if doublebattle
   [MENTION=24071]Sprite[/MENTION]x=pkmn.index==1 ? 400 : 304
  else
   [MENTION=24071]Sprite[/MENTION]x=344
  end
  [MENTION=24071]Sprite[/MENTION]y=120+(Graphics.height-320)
  [MENTION=24071]Sprite[/MENTION]hash=spritehash
  [MENTION=19050]poke[/MENTION]ballsprite.x [MENTION=24071]Sprite[/MENTION]x-8
  [MENTION=19050]poke[/MENTION]ballsprite.y [MENTION=24071]Sprite[/MENTION]y-8
  [MENTION=28203]pkmn[/MENTION]=pkmn
  @endspritey=adjustBattleSpriteY(sprite,pkmn.species,pkmn.index)
  [MENTION=12804]Shadow[/MENTION]Y [MENTION=24071]Sprite[/MENTION]y+18 # from top
  [MENTION=12804]Shadow[/MENTION]X [MENTION=24071]Sprite[/MENTION]x-32 # from left
  [MENTION=12804]Shadow[/MENTION]Visible=showShadow?(pkmn.species)
  [MENTION=12804]Shadow[/MENTION]Y-=16 if doublebattle && pkmn.index==3
  @stepspritey= [MENTION=24071]Sprite[/MENTION]y-@endspritey)
  @zoomstep=(1.0-STARTZOOM)/SPRITESTEPS
  @animdone=false
  [MENTION=19010]Frame[/MENTION]=0
 end
 def disposed?
  return @disposed
 end
 def animdone?
  return @animdone
 end
 def dispose
  return if disposed?
  [MENTION=19050]poke[/MENTION]ballsprite.dispose
  @disposed=true
 end
 def update
  return if disposed?
  [MENTION=19050]poke[/MENTION]ballsprite.update
  [MENTION=19010]Frame[/MENTION]+=1
  if [MENTION=19010]Frame[/MENTION]==2
   pbSEPlay("recall")
   [MENTION=19050]poke[/MENTION]ballsprite.setBitmap(sprintf("Graphics/Pictures/ball%02d_1",@ballused))
  end
  if [MENTION=19010]Frame[/MENTION]==4
   [MENTION=12671]pokemon[/MENTION]BattlerSprite.visible=true
   [MENTION=12671]pokemon[/MENTION]BattlerSprite.zoom_x=STARTZOOM
   [MENTION=12671]pokemon[/MENTION]BattlerSprite.zoom_y=STARTZOOM
   pbSpriteSetCenter [MENTION=12671]pokemon[/MENTION]BattlerSprite [MENTION=24071]Sprite[/MENTION]x [MENTION=24071]Sprite[/MENTION]y)
   pbPlayCry [MENTION=28203]pkmn[/MENTION].pokemon ? [MENTION=28203]pkmn[/MENTION].pokemon : [MENTION=28203]pkmn[/MENTION].species)
   [MENTION=19050]poke[/MENTION]ballsprite.setBitmap(sprintf("Graphics/Pictures/ball%02d_2",@ballused))
  end
  if [MENTION=19010]Frame[/MENTION]==8
   [MENTION=19050]poke[/MENTION]ballsprite.visible=false
  end
  if [MENTION=19010]Frame[/MENTION]>8 && [MENTION=19010]Frame[/MENTION]<=16
   color=Color.new(248,248,248,256-(16 [MENTION=19010]Frame[/MENTION])*32)
   [MENTION=24071]Sprite[/MENTION]hash["enemybase"].color=color
   [MENTION=24071]Sprite[/MENTION]hash["playerbase"].color=color   
   [MENTION=24071]Sprite[/MENTION]hash["battlebg"].color=color
  end
  if [MENTION=19010]Frame[/MENTION]>16 && [MENTION=19010]Frame[/MENTION]<=24
   color=Color.new(248,248,248,(24 [MENTION=19010]Frame[/MENTION])*32)
   [MENTION=12671]pokemon[/MENTION]BattlerSprite.color.alpha=(24 [MENTION=19010]Frame[/MENTION])*32
   [MENTION=24071]Sprite[/MENTION]hash["enemybase"].color=color
   [MENTION=24071]Sprite[/MENTION]hash["playerbase"].color=color   
   [MENTION=24071]Sprite[/MENTION]hash["battlebg"].color=color
  end
  if [MENTION=19010]Frame[/MENTION]>5 && [MENTION=12671]pokemon[/MENTION]BattlerSprite.zoom_x<1.0
   [MENTION=12671]pokemon[/MENTION]BattlerSprite.zoom_x+=@zoomstep
   [MENTION=12671]pokemon[/MENTION]BattlerSprite.zoom_y+=@zoomstep
   [MENTION=12671]pokemon[/MENTION]BattlerSprite.zoom_x=1.0 if [MENTION=12671]pokemon[/MENTION]BattlerSprite.zoom_x > 1.0
   [MENTION=12671]pokemon[/MENTION]BattlerSprite.zoom_y=1.0 if [MENTION=12671]pokemon[/MENTION]BattlerSprite.zoom_y > 1.0
   currentY [MENTION=24071]Sprite[/MENTION]y-(@stepspritey [MENTION=12671]pokemon[/MENTION]BattlerSprite.zoom_y)
   pbSpriteSetCenter [MENTION=12671]pokemon[/MENTION]BattlerSprite [MENTION=24071]Sprite[/MENTION]x,currentY)
   [MENTION=12671]pokemon[/MENTION]BattlerSprite.y=currentY
  end
  if [MENTION=12671]pokemon[/MENTION]BattlerSprite.color.alpha<=0 &&
     [MENTION=12671]pokemon[/MENTION]BattlerSprite.zoom_x>=1.0
   @animdone=true
   if [MENTION=24071]Sprite[/MENTION]hash["shadow# [MENTION=28203]pkmn[/MENTION].index}"]
    [MENTION=24071]Sprite[/MENTION]hash["shadow# [MENTION=28203]pkmn[/MENTION].index}"].x [MENTION=12804]Shadow[/MENTION]X
    [MENTION=24071]Sprite[/MENTION]hash["shadow# [MENTION=28203]pkmn[/MENTION].index}"].y [MENTION=12804]Shadow[/MENTION]Y
    [MENTION=24071]Sprite[/MENTION]hash["shadow# [MENTION=28203]pkmn[/MENTION].index}"].visible [MENTION=12804]Shadow[/MENTION]Visible
   end
  end
 end
end

def pokeballThrow(ball,shakes,targetBattler)
 balltype=@battle.pbGetBallType(ball)
 oldvisible [MENTION=24071]Sprite[/MENTION]s["shadow#{targetBattler}"].visible
 [MENTION=24071]Sprite[/MENTION]s["shadow#{targetBattler}"].visible=false
 ball0=sprintf("Graphics/Pictures/ball%02d_0",balltype)
 ball1=sprintf("Graphics/Pictures/ball%02d_1",balltype)
 ball2=sprintf("Graphics/Pictures/ball%02d_2",balltype)
 # sprites
 spriteBall=IconSprite.new(0,0,@viewport)
 spriteBall.visible=false
 spritePoke [MENTION=24071]Sprite[/MENTION]s["pokemon#{targetBattler}"]
 # pictures
 pictureBall=PictureEx.new(0)
 picturePoke=PictureEx.new(0)
 pokeball=[360,32]
 dims=[spritePoke.x,spritePoke.y]
 center=getSpriteCenter [MENTION=24071]Sprite[/MENTION]s["pokemon#{targetBattler}"])
 # starting positions
 pictureBall.moveVisible(1,true)
 pictureBall.moveName(1,ball0)
 pictureBall.moveOrigin(1,PictureOrigin::Center)
 pictureBall.moveXY(0,1,83,103)
 picturePoke.moveVisible(1,true)
 picturePoke.moveOrigin(1,PictureOrigin::Center)
 picturePoke.moveXY(0,1,center[0],center[1])
 # directives
 picturePoke.moveSE(1,"Audio/SE/throw")
 pictureBall.moveCurve(20,1,233,47,314,33,360,32)
 delay=pictureBall.totalDuration+2
 picturePoke.moveColor(10,delay,Color.new(31*8,22*8,30*8))
 delay=picturePoke.totalDuration
 picturePoke.moveSE(delay,"Audio/SE/recall")
 pictureBall.moveName(delay,ball1)
 pictureBall.moveName(delay+4,ball2)
 picturePoke.moveZoom(15,delay,0)
 picturePoke.moveXY(15,delay,pokeball[0],pokeball[1])
 picturePoke.moveSE(delay+10,"Audio/SE/jumptoball")
 picturePoke.moveVisible(delay+15,false)
 pictureBall.moveName(picturePoke.totalDuration+2,ball0)
 delay=picturePoke.totalDuration+6
 pictureBall.moveXY(15,delay,pokeball[0],128)
 pictureBall.moveSE(pictureBall.totalDuration,"Audio/SE/balldrop")
 pictureBall.moveXY(8,pictureBall.totalDuration+2,pokeball[0],80)
 pictureBall.moveXY(7,pictureBall.totalDuration+2,pokeball[0],128)
 pictureBall.moveSE(pictureBall.totalDuration,"Audio/SE/balldrop")
 pictureBall.moveXY(6,pictureBall.totalDuration+2,pokeball[0],96)
 pictureBall.moveXY(5,pictureBall.totalDuration+2,pokeball[0],128)
 pictureBall.moveSE(pictureBall.totalDuration,"Audio/SE/balldrop")
 pictureBall.moveXY(4,pictureBall.totalDuration+2,pokeball[0],112)
 pictureBall.moveXY(3,pictureBall.totalDuration+2,pokeball[0],128)
 pictureBall.moveSE(pictureBall.totalDuration,"Audio/SE/balldrop")
 picturePoke.moveXY(0,pictureBall.totalDuration,pokeball[0],128)
 delay=pictureBall.totalDuration+18 if shakes==0
 [shakes,3].min.times do
  delay=pictureBall.totalDuration+18
  pictureBall.moveSE(delay,"Audio/SE/ballshake")
  pictureBall.moveXY(4,delay,pokeball[0]-8,128)
  pictureBall.moveAngle(4,delay,20) # positive means counterclockwise
  delay=pictureBall.totalDuration
  pictureBall.moveXY(8,delay,pokeball[0]+8,128)
  pictureBall.moveAngle(8,delay,-20) # negative means clockwise
  delay=pictureBall.totalDuration
  pictureBall.moveXY(4,delay,pokeball[0],128)
  pictureBall.moveAngle(4,delay,0)
 end
 if shakes<4
  picturePoke.moveSE(delay,"Audio/SE/recall")
  pictureBall.moveName(delay,ball1)
  pictureBall.moveName(delay+4,ball2)
  pictureBall.moveVisible(delay+10,false)
  picturePoke.moveVisible(delay,true)
  picturePoke.moveZoom(15,delay,100)
  picturePoke.moveXY(15,delay,center[0],center[1])
  delay=picturePoke.totalDuration
  picturePoke.moveColor(10,delay,Color.new(31*8,22*8,30*8,0))
 end
 picturePoke.moveOrigin(picturePoke.totalDuration,PictureOrigin::TopLeft)
 picturePoke.moveXY(0,picturePoke.totalDuration,dims[0],dims[1])
 loop do
  pictureBall.update
  picturePoke.update
  setPictureIconSprite(spriteBall,pictureBall)
  setPictureSprite(spritePoke,picturePoke)
  pbGraphicsUpdate
  pbInputUpdate
  break if !pictureBall.running? && !picturePoke.running?
 end
 if shakes<4
  [MENTION=24071]Sprite[/MENTION]s["shadow#{targetBattler}"].visible=oldvisible
 end
 spriteBall.dispose
end

class PokeballPlayerSendOutAnimation
#  Ball curve: 8,52; 22,44; 52, 96
#  Player: Color.new(16*8,23*8,30*8)
 SPRITESTEPS=10
 STARTZOOM=0.125
 def initialize(sprite,spritehash,pkmn,doublebattle)
  @disposed=false
  [MENTION=12671]pokemon[/MENTION]BattlerSprite=sprite
  [MENTION=28203]pkmn[/MENTION]=pkmn
  [MENTION=12671]pokemon[/MENTION]BattlerSprite.visible=false
  [MENTION=12671]pokemon[/MENTION]BattlerSprite.color=Color.new(16*8,23*8,30*8)
  [MENTION=24071]Sprite[/MENTION]hash=spritehash
  if doublebattle
   [MENTION=24071]Sprite[/MENTION]x=pkmn.index==0 ? 64 : 180
  else
   [MENTION=24071]Sprite[/MENTION]x=128
  end
  [MENTION=24071]Sprite[/MENTION]y=Graphics.height-64
  @endspritey=adjustBattleSpriteY [MENTION=12671]pokemon[/MENTION]BattlerSprite,
    pkmn.species,pkmn.index)
  @animdone=false
  [MENTION=19010]Frame[/MENTION]=0
 end
 def disposed?
  return @disposed
 end
 def animdone?
  return @animdone
 end
 def dispose
  return if disposed?
  @disposed=true
 end
 def update
  return if disposed?
  [MENTION=19010]Frame[/MENTION]+=1
  if [MENTION=19010]Frame[/MENTION]==4
   [MENTION=12671]pokemon[/MENTION]BattlerSprite.visible=true
   [MENTION=12671]pokemon[/MENTION]BattlerSprite.zoom_x=STARTZOOM
   [MENTION=12671]pokemon[/MENTION]BattlerSprite.zoom_y=STARTZOOM
   pbSEPlay("recall")
   pbSpriteSetCenter [MENTION=12671]pokemon[/MENTION]BattlerSprite [MENTION=24071]Sprite[/MENTION]x [MENTION=24071]Sprite[/MENTION]y)
   pbPlayCry [MENTION=28203]pkmn[/MENTION].pokemon ? [MENTION=28203]pkmn[/MENTION].pokemon : [MENTION=28203]pkmn[/MENTION].species)
  end
  if [MENTION=19010]Frame[/MENTION]>8 && [MENTION=19010]Frame[/MENTION]<=16
   color=Color.new(248,248,248,256-(16 [MENTION=19010]Frame[/MENTION])*32)
   [MENTION=24071]Sprite[/MENTION]hash["enemybase"].color=color
   [MENTION=24071]Sprite[/MENTION]hash["playerbase"].color=color   
   [MENTION=24071]Sprite[/MENTION]hash["battlebg"].color=color
  end
  if [MENTION=19010]Frame[/MENTION]>16 && [MENTION=19010]Frame[/MENTION]<=24
   color=Color.new(248,248,248,(24 [MENTION=19010]Frame[/MENTION])*32)
   [MENTION=12671]pokemon[/MENTION]BattlerSprite.color.alpha=(24 [MENTION=19010]Frame[/MENTION])*32
   [MENTION=24071]Sprite[/MENTION]hash["enemybase"].color=color
   [MENTION=24071]Sprite[/MENTION]hash["playerbase"].color=color   
   [MENTION=24071]Sprite[/MENTION]hash["battlebg"].color=color
  end
  if [MENTION=19010]Frame[/MENTION]>5 && [MENTION=12671]pokemon[/MENTION]BattlerSprite.zoom_x<1.0
   [MENTION=12671]pokemon[/MENTION]BattlerSprite.zoom_x+=0.1
   [MENTION=12671]pokemon[/MENTION]BattlerSprite.zoom_y+=0.1
   [MENTION=12671]pokemon[/MENTION]BattlerSprite.zoom_x=1.0 if [MENTION=12671]pokemon[/MENTION]BattlerSprite.zoom_x > 1.0
   [MENTION=12671]pokemon[/MENTION]BattlerSprite.zoom_y=1.0 if [MENTION=12671]pokemon[/MENTION]BattlerSprite.zoom_y > 1.0
   pbSpriteSetCenter [MENTION=12671]pokemon[/MENTION]BattlerSprite [MENTION=24071]Sprite[/MENTION]x,0)
   [MENTION=12671]pokemon[/MENTION]BattlerSprite.y [MENTION=24071]Sprite[/MENTION]y+(@endspritey [MENTION=24071]Sprite[/MENTION]y) [MENTION=12671]pokemon[/MENTION]BattlerSprite.zoom_y
  end
  if [MENTION=12671]pokemon[/MENTION]BattlerSprite.color.alpha<=0 &&
     [MENTION=12671]pokemon[/MENTION]BattlerSprite.zoom_x>=1.0
   @animdone=true
  end
 end
end



class TrainerFadeAnimation
 def initialize(sprites)
  [MENTION=19010]Frame[/MENTION]=0
  [MENTION=24071]Sprite[/MENTION]s=sprites
  @animdone=false
 end
 def animdone?
  return @animdone
 end
 def update
  return if @animdone
  [MENTION=19010]Frame[/MENTION]+=1
  [MENTION=24071]Sprite[/MENTION]s["trainer"].x+=8
  [MENTION=24071]Sprite[/MENTION]s["trainer2"].x+=8 if [MENTION=24071]Sprite[/MENTION]s["trainer2"]
  [MENTION=24071]Sprite[/MENTION]s["partybase1"].x+=8
  [MENTION=24071]Sprite[/MENTION]s["partybase1"].opacity-=12
  for i in 0...6
   [MENTION=24071]Sprite[/MENTION]s["enemy#{i}"].opacity-=12
   [MENTION=24071]Sprite[/MENTION]s["enemy#{i}"].x+=8 if [MENTION=19010]Frame[/MENTION]>=i*4
  end
  @animdone=true if [MENTION=24071]Sprite[/MENTION]s["trainer"].x>=480 &&
    (  [MENTION=24071]Sprite[/MENTION]s["trainer2"]| [MENTION=24071]Sprite[/MENTION]s["trainer2"].x>=480)
 end
end

class PlayerFadeAnimation
 def initialize(sprites)
  [MENTION=19010]Frame[/MENTION]=0
  [MENTION=24071]Sprite[/MENTION]s=sprites
  @animdone=false
 end
 def animdone?
  return @animdone
 end
 def update
  return if @animdone
  [MENTION=19010]Frame[/MENTION]+=1
  [MENTION=24071]Sprite[/MENTION]s["player"].x-=8
  [MENTION=24071]Sprite[/MENTION]s["playerB"].x-=8 if [MENTION=24071]Sprite[/MENTION]s["playerB"]
  [MENTION=24071]Sprite[/MENTION]s["partybase2"].x-=8
  [MENTION=24071]Sprite[/MENTION]s["partybase2"].opacity-=12
  for i in 0...6
   if [MENTION=24071]Sprite[/MENTION]s["player#{i}"]
    [MENTION=24071]Sprite[/MENTION]s["player#{i}"].opacity-=12 
    [MENTION=24071]Sprite[/MENTION]s["player#{i}"].x-=8 if [MENTION=19010]Frame[/MENTION]>=i*4
   end
  end
  pa [MENTION=24071]Sprite[/MENTION]s["player"]
  pb [MENTION=24071]Sprite[/MENTION]s["playerB"]
  pawidth=224
  pbwidth=224
  if (pa && pa.bitmap && !pa.bitmap.disposed?)
   if pa.bitmap.height<pa.bitmap.width
    numframes=pa.bitmap.width/pa.bitmap.height # Number of frames
    pawidth=pa.bitmap.width/numframes # Width per frame
    [MENTION=24071]Sprite[/MENTION]s["player"].src_rect.x=pawidth*1 if [MENTION=19010]Frame[/MENTION]>0
    [MENTION=24071]Sprite[/MENTION]s["player"].src_rect.x=pawidth*2 if [MENTION=19010]Frame[/MENTION]>8
    [MENTION=24071]Sprite[/MENTION]s["player"].src_rect.x=pawidth*3 if [MENTION=19010]Frame[/MENTION]>11
    [MENTION=24071]Sprite[/MENTION]s["player"].src_rect.width=pawidth
   else
    pawidth=pa.bitmap.width
    [MENTION=24071]Sprite[/MENTION]s["player"].src_rect.x=0
    [MENTION=24071]Sprite[/MENTION]s["player"].src_rect.width=pawidth
   end
  end
  if (pb && pb.bitmap && !pb.bitmap.disposed?)
   if pb.bitmap.height<pb.bitmap.width
    numframes=pb.bitmap.width/pb.bitmap.height # Number of frames
    pbwidth=pb.bitmap.width/numframes # Width per frame
    [MENTION=24071]Sprite[/MENTION]s["playerB"].src_rect.x=pbwidth*1 if [MENTION=19010]Frame[/MENTION]>0
    [MENTION=24071]Sprite[/MENTION]s["playerB"].src_rect.x=pbwidth*2 if [MENTION=19010]Frame[/MENTION]>8
    [MENTION=24071]Sprite[/MENTION]s["playerB"].src_rect.x=pbwidth*3 if [MENTION=19010]Frame[/MENTION]>11
    [MENTION=24071]Sprite[/MENTION]s["playerB"].src_rect.width=pbwidth
   else
    pbwidth=pb.bitmap.width
    [MENTION=24071]Sprite[/MENTION]s["playerB"].src_rect.x=0
    [MENTION=24071]Sprite[/MENTION]s["playerB"].src_rect.width=pbwidth
   end
  end
  if pb
   @animdone=true if pb.x<=-pbwidth
  else
   @animdone=true if pa.x<=-pawidth
  end
 end
end

####################################################

class PokeBattle_Scene

USECOMMANDBOX=false # If true, expects a file named Graphics/Pictures/commandbox.png
USEFIGHTBOX=false # If true, expects a file named Graphics/Pictures/fightbox.png
MESSAGEBASECOLOR=Color.new(248,248,248)
MESSAGESHADOWCOLOR=Color.new(104,88,112)
MENUBASECOLOR=Color.new(255,255,255)
MENUSHADOWCOLOR=Color.new(0,0,0)
BOXTEXTBASECOLOR=Color.new(255,255,255)
BOXTEXTSHADOWCOLOR=Color.new(0,0,0)
EXPCOLOR=Color.new(64,200,248)
# Green HP color
HPCOLORBASE1=Color.new(14*8,31*8,21*8)
HPCOLORSHADOW1=Color.new(11*8,26*8,16*8)
# Orange HP color
HPCOLORBASE2=Color.new(31*8,28*8,7*8)
HPCOLORSHADOW2=Color.new(25*8,21*8,1*8)
# Red HP color
HPCOLORBASE3=Color.new(31*8,11*8,7*8)
HPCOLORSHADOW3=Color.new(21*8,8*8,9*8)
# Blank HP color
HPCOLORBASE4=Color.new(0,0,0)
HPCOLORSHADOW4=Color.new(0,0,0)
# Position of HP gauge
HPGAUGE_X=78
HPGAUGE_Y=34
# Position of EXP gauge
EXPGAUGE_X=46
EXPGAUGE_Y=66
# Size of gauges
EXPGAUGESIZE=128
HPGAUGESIZE=96

BLANK=0
MESSAGEBOX=1
COMMANDBOX=2
FIGHTBOX=3

attr_accessor :abortable

def initialize
 @battle=nil
 @lastcmd=[0,0,0,0]
 @lastmove=[0,0,0,0]
 [MENTION=28203]pkmn[/MENTION]windows=[nil,nil,nil,nil]
 [MENTION=24071]Sprite[/MENTION]s={}
 @battlestart=true
 @messagemode=false
 @abortable=false
 @aborted=false
end

def pbUpdate
 partyAnimationUpdate
 [MENTION=24071]Sprite[/MENTION]s["battlebg"].update if [MENTION=24071]Sprite[/MENTION]s["battlebg"].respond_to?("update")
end

def pbGraphicsUpdate
 partyAnimationUpdate
 [MENTION=24071]Sprite[/MENTION]s["battlebg"].update if [MENTION=24071]Sprite[/MENTION]s["battlebg"].respond_to?("update")
 Graphics.update
end
def pbInputUpdate
 Input.update
 if Input.trigger?(Input::B) && @abortable && !@aborted
  @aborted=true
  @battle.pbAbort
 end
end

def pbShowWindow(windowtype)
 [MENTION=24071]Sprite[/MENTION]s["messagebox"].visible=(windowtype==MESSAGEBOX||windowtype==COMMANDBOX||windowtype==FIGHTBOX||
    windowtype==BLANK)
 [MENTION=24071]Sprite[/MENTION]s["messagewindow"].visible=(windowtype==MESSAGEBOX)
 [MENTION=24071]Sprite[/MENTION]s["commandwindow"].visible=(windowtype==COMMANDBOX)
 [MENTION=24071]Sprite[/MENTION]s["fightwindow"].visible=(windowtype==FIGHTBOX)
end

def pbSetMessageMode(mode)
 @messagemode=mode
 msgwindow [MENTION=24071]Sprite[/MENTION]s["messagewindow"]
 if mode # Within Pokémon command
  msgwindow.baseColor=MENUBASECOLOR
  msgwindow.shadowColor=MENUSHADOWCOLOR
  msgwindow.opacity=255
  msgwindow.x=0
  msgwindow.width=Graphics.width
  msgwindow.height=96
  msgwindow.y=Graphics.height-msgwindow.height
 else
  msgwindow.baseColor=MESSAGEBASECOLOR
  msgwindow.shadowColor=MESSAGESHADOWCOLOR
  msgwindow.opacity=0
  msgwindow.x=16
  msgwindow.width=Graphics.width-32
  msgwindow.height=96
  msgwindow.y=Graphics.height-msgwindow.height
 end
end


def pbWaitMessage
 if @briefmessage
  pbShowWindow(MESSAGEBOX)
  cw [MENTION=24071]Sprite[/MENTION]s["messagewindow"]
  60.times do
   pbGraphicsUpdate
   pbInputUpdate
  end
  cw.text=""
  cw.visible=false
  @briefmessage=false
 end
end

def pbDisplayMessage(msg,brief=false)
 pbWaitMessage
 pbRefresh
 pbShowWindow(MESSAGEBOX)
 cw [MENTION=24071]Sprite[/MENTION]s["messagewindow"]
 cw.text=msg
 i=0
 loop do
  pbGraphicsUpdate
  pbInputUpdate
  cw.update
  if i==60
   cw.text=""
   cw.visible=false
   return
  end
  if Input.trigger?(Input::C) || @abortable
   if cw.pausing?
    pbPlayDecisionSE() if !@abortable
    cw.resume
   end
  end
  if !cw.busy?
   if brief
    @briefmessage=true
    return
   end
   i+=1
  end
 end
end

def pbDisplayPausedMessage(msg)
 pbWaitMessage
 pbRefresh
 pbShowWindow(MESSAGEBOX)
 if @messagemode
  @switchscreen.pbDisplay(msg)
  return
 end
 cw [MENTION=24071]Sprite[/MENTION]s["messagewindow"]
 cw.text=_ISPRINTF("{1:s}\1",msg)
 loop do
  pbGraphicsUpdate
  pbInputUpdate
  if Input.trigger?(Input::C) || @abortable
   if cw.busy?
    pbPlayDecisionSE() if cw.pausing? && !@abortable
    cw.resume
   else
    cw.text=""
    pbPlayDecisionSE()
    cw.visible=false if @messagemode
    return
   end
  end
  cw.update
 end
end

def pbDisplayConfirmMessage(msg)
 pbWaitMessage
 pbRefresh
 pbShowWindow(MESSAGEBOX)
 dw [MENTION=24071]Sprite[/MENTION]s["messagewindow"]
 dw.text=msg
 commands=[_INTL("YES"),_INTL("NO")]
 cw = Window_CommandPokemon.new(commands)
 cw.x=Graphics.width-cw.width
 cw.y=Graphics.height-cw.height-dw.height
 cw.index=0
 cw.viewport=@viewport
 pbRefresh
 loop do
  cw.visible=!dw.busy?
  pbGraphicsUpdate
  pbInputUpdate
  pbFrameUpdate(cw)
  dw.update
  if Input.trigger?(Input::B)
   if dw.busy?
    pbPlayDecisionSE() if dw.pausing?
    dw.resume
   else
    cw.dispose
    dw.text=""
    return false
   end
  end
  if Input.trigger?(Input::C)
   if dw.busy?
    pbPlayDecisionSE() if dw.pausing?
    dw.resume
   else
    cw.dispose
    dw.text=""
    return (cw.index==0)?true:false
   end
  end
 end
end

def pbFrameUpdate(cw)
 cw.update if cw
 for i in 0..3
  if [MENTION=24071]Sprite[/MENTION]s["battler#{i}"]
   [MENTION=24071]Sprite[/MENTION]s["battler#{i}"].update
  end
  if [MENTION=24071]Sprite[/MENTION]s["pokemon#{i}"]
   [MENTION=24071]Sprite[/MENTION]s["pokemon#{i}"].update
  end
 end
end

def pbRefresh
 for i in 0..3
  if [MENTION=24071]Sprite[/MENTION]s["battler#{i}"]
   [MENTION=24071]Sprite[/MENTION]s["battler#{i}"].refresh
  end
 end
end


def pbAddSprite(id,x,y,filename,viewport)
 sprite=IconSprite.new(x,y,viewport)
 if filename
  sprite.setBitmap(filename) rescue nil
 end
 [MENTION=24071]Sprite[/MENTION]s[id]=sprite
 return sprite
end

def pbAddPlane(id,filename,viewport)
 sprite=AnimatedPlane.new(viewport)
 if filename
  sprite.setBitmap(filename)
 end
 [MENTION=24071]Sprite[/MENTION]s[id]=sprite
 return sprite
end

def pbDisposeSprites
 pbDisposeSpriteHash [MENTION=24071]Sprite[/MENTION]s)
end

def pbBeginCommandPhase
# Called whenever a new round begins.
 @battlestart=false
end

def pbShowOpponent(index)
 if @battle.opponent
  if @battle.opponent.is_a?(Array)
   trainerfile=sprintf("Graphics/Characters/trainer%03d",@battle.opponent[index].trainertype)
  else
   trainerfile=sprintf("Graphics/Characters/trainer%03d",@battle.opponent.trainertype)
  end
 else
  trainerfile="Graphics/Pictures/trfront"
 end
 pbAddSprite("trainer",Graphics.width,16+@yoffset,trainerfile,@viewport)
 if [MENTION=24071]Sprite[/MENTION]s["trainer"].bitmap
  [MENTION=24071]Sprite[/MENTION]s["trainer"].y- [MENTION=24071]Sprite[/MENTION]s["trainer"].bitmap.height-128
 end
 20.times do
  pbGraphicsUpdate
  pbInputUpdate
  [MENTION=24071]Sprite[/MENTION]s["trainer"].x-=6
 end
end

def pbHideOpponent
 20.times do
  pbGraphicsUpdate
  pbInputUpdate
  [MENTION=24071]Sprite[/MENTION]s["trainer"].x+=6
 end
end

def pbShowHelp(text)
  [MENTION=24071]Sprite[/MENTION]s["helpwindow"].resizeToFit(text,Graphics.width)
  [MENTION=24071]Sprite[/MENTION]s["helpwindow"].y=0
  [MENTION=24071]Sprite[/MENTION]s["helpwindow"].x=0
  [MENTION=24071]Sprite[/MENTION]s["helpwindow"].text=text
  [MENTION=24071]Sprite[/MENTION]s["helpwindow"].visible=true
end

def pbHideHelp
  [MENTION=24071]Sprite[/MENTION]s["helpwindow"].visible=false
end


def pbBackdrop
 outdoor=false
 if $game_map && pbGetMetadata($game_map.map_id,MetadataOutdoor)
  outdoor=true
 end
 case @battle.environment
  when PBEnvironment::Grass
   id=1
  when PBEnvironment::TallGrass
   id=2
  when PBEnvironment::MovingWater
   id=3
  when PBEnvironment::StillWater
   id=4
  when PBEnvironment::Underwater
   id=5
  when PBEnvironment::Rock
   id=7
  when PBEnvironment::Cave
   id=8
  when PBEnvironment::Sand
   id=9
  else
   id=(outdoor) ? 0 : 6
 end
 if $PokemonGlobal && $PokemonGlobal.nextBattleBack
  id=$PokemonGlobal.nextBattleBack
 elsif $game_map
  back=pbGetMetadata($game_map.map_id,MetadataBattleBack)
  if back && back!=""
   id=pbGetMetadata($game_map.map_id,MetadataBattleBack)
  end
 end
 battlebg="Graphics/Pictures/battlebg#{id}"
 enemybase="Graphics/Pictures/enemybase#{id}"
 playerbase="Graphics/Pictures/playerbase#{id}"
 pbAddPlane("battlebg",battlebg,@viewport)
 pbAddSprite("enemybase",-256,96+@yoffset,enemybase,@viewport) # ends at (224,96)
 pbAddSprite("playerbase",Graphics.width,192+@yoffset,playerbase,@viewport) # ends at (0,192)
 [MENTION=24071]Sprite[/MENTION]s["enemybase"].z=-1 # For compatibility with RGSS2
 [MENTION=24071]Sprite[/MENTION]s["playerbase"].z=-1 # For compatibility with RGSS2
 [MENTION=24071]Sprite[/MENTION]s["battlebg"].z=-1 # For compatibility with RGSS2
=begin
 if outdoor
  tone = $HourlyTones[Time.now.hour]
  [MENTION=24071]Sprite[/MENTION]s["battlebg"].tone=tone
  [MENTION=24071]Sprite[/MENTION]s["enemybase"].tone=tone
  [MENTION=24071]Sprite[/MENTION]s["playerbase"].tone=tone
 end
=end
end

def inPartyAnimation?
 return @enablePartyAnim && @partyAnimPhase<4
end

def partyAnimationUpdate
  return if !inPartyAnimation?
  if @partyAnimPhase==0
   [MENTION=24071]Sprite[/MENTION]s["partybase1"].x+=16
   [MENTION=24071]Sprite[/MENTION]s["partybase2"].x-=16
   @partyAnimPhase=1 if [MENTION=24071]Sprite[/MENTION]s["partybase1"].x [MENTION=24071]Sprite[/MENTION]s["partybase1"].bitmap.width>=208
   return
  end
  if @partyAnimPhase==1
   @enemyendpos=152
   @playerendpos=312
   @partyAnimPhase=2
   @partyAnimI=0
  end
  if @partyAnimPhase==2
   if @partyAnimI>=6
    @partyAnimPhase=4
    return
   end
   if @partyAnimI>=@battle.party2.length || !@battle.party2[@partyAnimI]
    pbAddSprite("enemy#{@partyAnimI}",-28,64+@yoffset,"Graphics/Pictures/ballempty",@viewport)
   elsif @battle.party2[@partyAnimI].hp<=0 || @battle.party2[@partyAnimI].status>0 || @battle.party2[@partyAnimI].egg?
    pbAddSprite("enemy#{@partyAnimI}",-28,64+@yoffset,"Graphics/Pictures/ballfainted",@viewport)
   else
    pbAddSprite("enemy#{@partyAnimI}",-28,64+@yoffset,"Graphics/Pictures/ballnormal",@viewport)
   end
   if @partyAnimI==@battle.party1.length || !@battle.party1[@partyAnimI]
    pbAddSprite("player#{@partyAnimI}",492,176+@yoffset,"Graphics/Pictures/ballempty",@viewport)
   elsif @battle.party1[@partyAnimI].hp<=0 || @battle.party1[@partyAnimI].status>0 || @battle.party1[@partyAnimI].egg?
    pbAddSprite("player#{@partyAnimI}",492,176+@yoffset,"Graphics/Pictures/ballfainted",@viewport)
   else
    pbAddSprite("player#{@partyAnimI}",492,176+@yoffset,"Graphics/Pictures/ballnormal",@viewport)
   end
   @partyAnimPhase=3
  end
  if @partyAnimPhase==3
    [MENTION=24071]Sprite[/MENTION]s["enemy#{@partyAnimI}"].x+=20
    [MENTION=24071]Sprite[/MENTION]s["player#{@partyAnimI}"].x-=20 
    if [MENTION=24071]Sprite[/MENTION]s["enemy#{@partyAnimI}"].x>=@enemyendpos
      @partyAnimPhase=2
      @partyAnimI+=1
      @enemyendpos-=20
      @playerendpos+=20
    end
  end
end

def pbStartBattle(battle)
 # Called whenever the battle begins
 @battle=battle
 @lastcmd=[0,0,0,0]
 @lastmove=[0,0,0,0]
 [MENTION=24071]Sprite[/MENTION]s.clear
 [MENTION=24071]Sprite[/MENTION]s.clear
 @viewport=Viewport.new(0,Graphics.height/2,Graphics.width,0)
 @viewport.z=99999
 @battleboxvp=Viewport.new(0,0,Graphics.width,Graphics.height)
 @battleboxvp.z=99999
 @showingplayer=true
 @showingenemy=true
 @yoffset=(Graphics.height-320)
 pbBackdrop
 pbAddSprite("partybase1",-400,80+@yoffset,"Graphics/Pictures/pbarrow",@viewport)
 pbAddSprite("partybase2",480,192+@yoffset,"Graphics/Pictures/pbarrow",@viewport)
 [MENTION=24071]Sprite[/MENTION]s["partybase2"].mirror=true
 [MENTION=24071]Sprite[/MENTION]s["partybase1"].visible=false
 [MENTION=24071]Sprite[/MENTION]s["partybase2"].visible=false
 if @battle.opponent
  if @battle.opponent.is_a?(Array)
   trainerfile=sprintf("Graphics/Characters/trainer%03d",@battle.opponent[0].trainertype)
   pbAddSprite("trainer",-144,16+@yoffset,trainerfile,@viewport)
   trainerfile=sprintf("Graphics/Characters/trainer%03d",@battle.opponent[1].trainertype)
   pbAddSprite("trainer2",-240,16+@yoffset,trainerfile,@viewport)
  else
   trainerfile=sprintf("Graphics/Characters/trainer%03d",@battle.opponent.trainertype)
   pbAddSprite("trainer",-192,16+@yoffset,trainerfile,@viewport)
  end
 else
  trainerfile="Graphics/Pictures/trfront"
  pbAddSprite("trainer",-192,16+@yoffset,trainerfile,@viewport)
 end
 if [MENTION=24071]Sprite[/MENTION]s["trainer"].bitmap
  [MENTION=24071]Sprite[/MENTION]s["trainer"].y- [MENTION=24071]Sprite[/MENTION]s["trainer"].bitmap.height-128
 end
 if [MENTION=24071]Sprite[/MENTION]s["trainer2"] && [MENTION=24071]Sprite[/MENTION]s["trainer2"].bitmap
  [MENTION=24071]Sprite[/MENTION]s["trainer2"].y- [MENTION=24071]Sprite[/MENTION]s["trainer2"].bitmap.height-128
 end
 [MENTION=24071]Sprite[/MENTION]s["shadow0"]=IconSprite.new(0,0,@viewport)
 pbAddSprite("shadow1",0,0+@yoffset,"Graphics/Pictures/enemyshadow",@viewport)
 [MENTION=24071]Sprite[/MENTION]s["shadow1"].visible=false
 [MENTION=24071]Sprite[/MENTION]s["pokemon0"]=PokemonBattlerSprite.new(battle.doublebattle,0,@viewport)
 [MENTION=24071]Sprite[/MENTION]s["pokemon1"]=PokemonBattlerSprite.new(battle.doublebattle,1,@viewport)
 if battle.doublebattle
  pbAddSprite("shadow3",0,0+@yoffset,"Graphics/Pictures/enemyshadow",@viewport)
  [MENTION=24071]Sprite[/MENTION]s["shadow3"].visible=false
  [MENTION=24071]Sprite[/MENTION]s["shadow2"]=IconSprite.new(0,0,@viewport)
  [MENTION=24071]Sprite[/MENTION]s["pokemon3"]=PokemonBattlerSprite.new(battle.doublebattle,3,@viewport)
  [MENTION=24071]Sprite[/MENTION]s["pokemon2"]=PokemonBattlerSprite.new(battle.doublebattle,2,@viewport)
 end
 [MENTION=24071]Sprite[/MENTION]s["battler0"]=PokemonDataBox.new(battle.battlers[0],battle.doublebattle,@viewport)
 [MENTION=24071]Sprite[/MENTION]s["battler1"]=PokemonDataBox.new(battle.battlers[1],battle.doublebattle,@viewport)
 if battle.doublebattle
  [MENTION=24071]Sprite[/MENTION]s["battler2"]=PokemonDataBox.new(battle.battlers[2],battle.doublebattle,@viewport)
  [MENTION=24071]Sprite[/MENTION]s["battler3"]=PokemonDataBox.new(battle.battlers[3],battle.doublebattle,@viewport)
 end
 if @battle.player.is_a?(Array)
   trainerfile=sprintf("Graphics/Pictures/trback%03d",@battle.player[0].trainertype)
   pbAddSprite("player",576-48,96+@yoffset,trainerfile,@viewport)
   trainerfile=sprintf("Graphics/Pictures/trback%03d",@battle.player[1].trainertype)
   pbAddSprite("playerB",576+48,96+@yoffset,trainerfile,@viewport)
   if [MENTION=24071]Sprite[/MENTION]s["player"].bitmap
    if [MENTION=24071]Sprite[/MENTION]s["player"].bitmap.width [MENTION=24071]Sprite[/MENTION]s["player"].bitmap.height
      [MENTION=24071]Sprite[/MENTION]s["player"].src_rect.x=0
      [MENTION=24071]Sprite[/MENTION]s["player"].src_rect.width [MENTION=24071]Sprite[/MENTION]s["player"].bitmap.width/4
    end
   end
   if [MENTION=24071]Sprite[/MENTION]s["playerB"].bitmap
    if [MENTION=24071]Sprite[/MENTION]s["playerB"].bitmap.width [MENTION=24071]Sprite[/MENTION]s["playerB"].bitmap.height
      [MENTION=24071]Sprite[/MENTION]s["playerB"].src_rect.x=0
      [MENTION=24071]Sprite[/MENTION]s["playerB"].src_rect.width [MENTION=24071]Sprite[/MENTION]s["playerB"].bitmap.width/4
    end
   end
 else
   trainerfile=sprintf("Graphics/Pictures/trback%03d",@battle.player.trainertype)
   pbAddSprite("player",576,96+@yoffset,trainerfile,@viewport)
   if [MENTION=24071]Sprite[/MENTION]s["player"].bitmap
    if [MENTION=24071]Sprite[/MENTION]s["player"].bitmap.width [MENTION=24071]Sprite[/MENTION]s["player"].bitmap.height
      [MENTION=24071]Sprite[/MENTION]s["player"].src_rect.x=0
      [MENTION=24071]Sprite[/MENTION]s["player"].src_rect.width [MENTION=24071]Sprite[/MENTION]s["player"].bitmap.width/4
    end
   end
 end
 pbAddSprite("messagebox",0,Graphics.height-96,"Graphics/Pictures/messagebox",@viewport)
 [MENTION=24071]Sprite[/MENTION]s["helpwindow"]=Window_UnformattedTextPokemon.newWithSize("",0,0,32,32,@viewport)
 [MENTION=24071]Sprite[/MENTION]s["helpwindow"].visible=false
 [MENTION=24071]Sprite[/MENTION]s["messagewindow"]=Window_AdvancedTextPokemon.new("")
 [MENTION=24071]Sprite[/MENTION]s["commandwindow"]=CommandMenuDisplay.new(@viewport)
 [MENTION=24071]Sprite[/MENTION]s["fightwindow"]=FightMenuDisplay.new(nil,@viewport)
 [MENTION=24071]Sprite[/MENTION]s["messagewindow"].letterbyletter=true
 [MENTION=24071]Sprite[/MENTION]s["messagewindow"].viewport=@viewport
 [MENTION=24071]Sprite[/MENTION]s["messagebox"].z=50
 [MENTION=24071]Sprite[/MENTION]s["messagewindow"].z=100
 [MENTION=24071]Sprite[/MENTION]s["commandwindow"].z=100
 [MENTION=24071]Sprite[/MENTION]s["fightwindow"].z=100
 pbShowWindow(MESSAGEBOX)
 pbSetMessageMode(false)
 trainersprite1 [MENTION=24071]Sprite[/MENTION]s["trainer"]
 trainersprite2 [MENTION=24071]Sprite[/MENTION]s["trainer2"]
 if !@battle.opponent
  [MENTION=24071]Sprite[/MENTION]s["trainer"].visible=false
  if @battle.party2.length>=1
   [MENTION=24071]Sprite[/MENTION]s["pokemon1"].color=Color.new(0,0,0,128)
   [MENTION=24071]Sprite[/MENTION]s["pokemon1"].setPokemonBitmap(@battle.party2[0],false)
   [MENTION=24071]Sprite[/MENTION]s["pokemon1"].x=-192 # ends at 144*2
   [MENTION=24071]Sprite[/MENTION]s["shadow1"].x=-192+16*2
   [MENTION=24071]Sprite[/MENTION]s["shadow1"].y=65*2+@yoffset
   species=@battle.party2[0].species
   [MENTION=24071]Sprite[/MENTION]s["pokemon1"].visible=true
   [MENTION=24071]Sprite[/MENTION]s["shadow1"].visible=showShadow?(species)
   pbPositionPokemonSprite(
    [MENTION=24071]Sprite[/MENTION]s["pokemon1"],
    [MENTION=24071]Sprite[/MENTION]s["pokemon1"].x,
    [MENTION=24071]Sprite[/MENTION]s["pokemon1"].y
   )
   [MENTION=24071]Sprite[/MENTION]s["pokemon1"].y=adjustBattleSpriteY(
     [MENTION=24071]Sprite[/MENTION]s["pokemon1"],species,1)
   trainersprite1 [MENTION=24071]Sprite[/MENTION]s["pokemon1"]
  end
  if @battle.party2.length==2
   [MENTION=24071]Sprite[/MENTION]s["pokemon1"].color=Color.new(0,0,0,160)
   [MENTION=24071]Sprite[/MENTION]s["pokemon3"].color=Color.new(0,0,0,160)
   [MENTION=24071]Sprite[/MENTION]s["pokemon1"].x=-144
   [MENTION=24071]Sprite[/MENTION]s["shadow1"].x=-144+16*2
   [MENTION=24071]Sprite[/MENTION]s["pokemon1"].y+=8
   [MENTION=24071]Sprite[/MENTION]s["shadow1"].y=65*2+@yoffset+8
   [MENTION=24071]Sprite[/MENTION]s["pokemon3"].setPokemonBitmap(@battle.party2[1],false)
   [MENTION=24071]Sprite[/MENTION]s["pokemon3"].x=-240
   [MENTION=24071]Sprite[/MENTION]s["shadow3"].x=-240+16*2
   [MENTION=24071]Sprite[/MENTION]s["shadow3"].y=65*2+@yoffset
   species=@battle.party2[1].species
   [MENTION=24071]Sprite[/MENTION]s["pokemon3"].visible=true
   [MENTION=24071]Sprite[/MENTION]s["shadow3"].visible=showShadow?(species)
   pbPositionPokemonSprite(
    [MENTION=24071]Sprite[/MENTION]s["pokemon3"],
    [MENTION=24071]Sprite[/MENTION]s["pokemon3"].x,
    [MENTION=24071]Sprite[/MENTION]s["pokemon3"].y
   )
   [MENTION=24071]Sprite[/MENTION]s["pokemon3"].y=adjustBattleSpriteY(
     [MENTION=24071]Sprite[/MENTION]s["pokemon3"],species,3)
   trainersprite2 [MENTION=24071]Sprite[/MENTION]s["pokemon3"]
  end
 end
 loop do
  if @viewport.rect.y>Graphics.height/4
   @viewport.rect.y-=2
   @viewport.rect.height+=4
  elsif @viewport.rect.y>0
   @viewport.rect.y-=4
   @viewport.rect.height+=8
  end
  for i in [MENTION=24071]Sprite[/MENTION]s
   i[1].ox=@viewport.rect.x
   i[1].oy=@viewport.rect.y
  end
  [MENTION=24071]Sprite[/MENTION]s["enemybase"].x+=4
  [MENTION=24071]Sprite[/MENTION]s["playerbase"].x-=4
  [MENTION=24071]Sprite[/MENTION]s["shadow1"].x+=4
  [MENTION=24071]Sprite[/MENTION]s["shadow3"].x+=4 if [MENTION=24071]Sprite[/MENTION]s["shadow3"]
  trainersprite1.x+=4
  trainersprite2.x+=4 if trainersprite2
  [MENTION=24071]Sprite[/MENTION]s["player"].x-=4
  [MENTION=24071]Sprite[/MENTION]s["playerB"].x-=4  if [MENTION=24071]Sprite[/MENTION]s["playerB"]
  pbGraphicsUpdate
  pbInputUpdate
  break if [MENTION=24071]Sprite[/MENTION]s["enemybase"].x>=224
 end
 # Show shiny animation
 if !@battle.opponent
  pbPlayCry(@battle.party2[0])
  if @battle.party2[0].isShiny?
   pbCommonAnimation("Shiny",@battle.battlers[1],nil)
  end
  if @battle.party2.length==2
   if @battle.party2[1].isShiny?
    pbCommonAnimation("Shiny",@battle.battlers[3],nil)
   end
  end
 end
 if @battle.opponent
  @enablePartyAnim=true
  @partyAnimPhase=0
  [MENTION=24071]Sprite[/MENTION]s["partybase1"].visible=true
  [MENTION=24071]Sprite[/MENTION]s["partybase2"].visible=true
 else
  [MENTION=24071]Sprite[/MENTION]s["battler1"].appear
  [MENTION=24071]Sprite[/MENTION]s["battler3"].appear if @battle.party2.length==2 
  appearing=true
  begin
   pbGraphicsUpdate
   pbInputUpdate
   [MENTION=24071]Sprite[/MENTION]s["battler1"].update
   appearing [MENTION=24071]Sprite[/MENTION]s["battler1"].appearing
   [MENTION=24071]Sprite[/MENTION]s["pokemon1"].color.alpha-=16
   [MENTION=24071]Sprite[/MENTION]s["pokemon1"].color [MENTION=24071]Sprite[/MENTION]s["pokemon1"].color
   if @battle.party2.length==2 
    [MENTION=24071]Sprite[/MENTION]s["battler3"].update
    [MENTION=24071]Sprite[/MENTION]s["pokemon3"].color.alpha-=16
    [MENTION=24071]Sprite[/MENTION]s["pokemon3"].color [MENTION=24071]Sprite[/MENTION]s["pokemon3"].color
    appearing=(appearing| [MENTION=24071]Sprite[/MENTION]s["battler3"].appearing)
   end
  end while appearing
 end
end

def pbEndBattle(result)
 @abortable=false
 pbShowWindow(BLANK)
 # Fade out all sprites
 pbBGMFade(1.0)
 pbFadeOutAndHide [MENTION=24071]Sprite[/MENTION]s)
 pbDisposeSprites
end

def pbRecall(battlerindex)
 @briefmessage=false
 if @battle.pbIsOpposing?(battlerindex)
  [MENTION=24071]Sprite[/MENTION]s["shadow#{battlerindex}"].visible=false
 else
  spritePoke [MENTION=24071]Sprite[/MENTION]s["pokemon#{battlerindex}"]
  picturePoke=PictureEx.new(0)
  dims=[spritePoke.x,spritePoke.y]
  center=getSpriteCenter(spritePoke)
  # starting positions
  picturePoke.moveVisible(1,true)
  picturePoke.moveOrigin(1,PictureOrigin::Center)
  picturePoke.moveXY(0,1,center[0],center[1])
  # directives
  picturePoke.moveColor(10,1,Color.new(16*8,23*8,30*8))
  delay=picturePoke.totalDuration
  picturePoke.moveSE(delay,"Audio/SE/recall")
  picturePoke.moveZoom(15,delay,0)
  picturePoke.moveXY(15,delay,center[0],Graphics.height-80)
  picturePoke.moveVisible(picturePoke.totalDuration,false)
  picturePoke.moveColor(0,picturePoke.totalDuration,Color.new(0,0,0,0))
  picturePoke.moveOrigin(picturePoke.totalDuration,PictureOrigin::TopLeft)
  loop do
   picturePoke.update
   setPictureSprite(spritePoke,picturePoke)
   pbGraphicsUpdate
   pbInputUpdate
   break if !picturePoke.running?
  end
 end
end

def pbTrainerSendOut(battlerindex,pkmn)
  @briefmessage=false
  fadeanim=nil
  while inPartyAnimation?; end
  if @showingenemy
   fadeanim=TrainerFadeAnimation.new [MENTION=24071]Sprite[/MENTION]s)
  end
  frame=0
  [MENTION=24071]Sprite[/MENTION]s["pokemon#{battlerindex}"].setPokemonBitmap(pkmn,false)
  sendout=PokeballSendOutAnimation.new [MENTION=24071]Sprite[/MENTION]s["pokemon#{battlerindex}"],
   [MENTION=24071]Sprite[/MENTION]s,@battle.battlers,@battle.doublebattle)
  loop do
   pbGraphicsUpdate
   pbInputUpdate
   fadeanim.update if fadeanim
   frame+=1    
   if frame==1
    [MENTION=24071]Sprite[/MENTION]s["battler#{battlerindex}"].appear
   end
   if frame>=10
    sendout.update
   end
   [MENTION=24071]Sprite[/MENTION]s["battler#{battlerindex}"].update
   break if  
     (!fadeanim || fadeanim.animdone?) && 
     sendout.animdone? &&
      [MENTION=24071]Sprite[/MENTION]s["battler#{battlerindex}"].appearing
  end
  if @battle.battlers.pokemon.isShiny?
   pbCommonAnimation("Shiny",@battle.battlers,nil)
  end
  sendout.dispose
  if @showingenemy
   @showingenemy=false
   pbDisposeSprite [MENTION=24071]Sprite[/MENTION]s,"trainer")
   pbDisposeSprite [MENTION=24071]Sprite[/MENTION]s,"partybase1")
   for i in 0...6
    pbDisposeSprite [MENTION=24071]Sprite[/MENTION]s,"enemy#{i}")
   end
  end
  pbRefresh
end

def pbSendOut(battlerindex,pkmn)
while inPartyAnimation?; end
balltype=pkmn.ballused
ballbitmap=sprintf("Graphics/Pictures/ball%02d_0",balltype)
pictureBall=PictureEx.new(0)
delay=1
pictureBall.moveVisible(delay,true)
pictureBall.moveName(delay,ballbitmap)
pictureBall.moveOrigin(delay,PictureOrigin::Center)
# Setting the ball's movement path
path=[[111, 164], [113, 154], [115, 145], [118, 136], 
[122, 128], [130, 124], [137, 129], [140, 138], 
[142, 147], [143, 156], [144, 166], [145, 175], 
[145, 185], [146, 194], [146, 203], [146, 213], 
[147, 222], [147, 232], [147, 241], [147, 250]]
spriteBall=IconSprite.new(0,0,@viewport)
spriteBall.visible=false
angle=0
for coord in path
 delay=pictureBall.totalDuration
 pictureBall.moveAngle(0,delay,angle)
 pictureBall.moveXY(1,delay,coord[0],coord[1])
 angle+=80
 angle%=360
end
pictureBall.adjustPosition(0,Graphics.height-320)
  [MENTION=24071]Sprite[/MENTION]s["battler#{battlerindex}"].visible=false
  @briefmessage=false
  fadeanim=nil
  if @showingplayer
   fadeanim=PlayerFadeAnimation.new [MENTION=24071]Sprite[/MENTION]s)
  end
  frame=0
  [MENTION=24071]Sprite[/MENTION]s["pokemon#{battlerindex}"].setPokemonBitmap(pkmn,true)
  sendout=PokeballPlayerSendOutAnimation.new [MENTION=24071]Sprite[/MENTION]s["pokemon#{battlerindex}"],
    [MENTION=24071]Sprite[/MENTION]s,@battle.battlers,@battle.doublebattle)
  loop do
   fadeanim.update if fadeanim
   frame+=1
   if frame>1 && !pictureBall.running? && 
       [MENTION=24071]Sprite[/MENTION]s["battler#{battlerindex}"].appearing
    [MENTION=24071]Sprite[/MENTION]s["battler#{battlerindex}"].appear
   end
   if frame>=3 && !pictureBall.running?
    sendout.update
   end
   if (frame>=10 || !fadeanim) && pictureBall.running?
    pictureBall.update
    setPictureIconSprite(spriteBall,pictureBall)
   end
   [MENTION=24071]Sprite[/MENTION]s["battler#{battlerindex}"].update
   pbGraphicsUpdate
   pbInputUpdate
   break if  
     (!fadeanim || fadeanim.animdone?) && 
     sendout.animdone? &&
      [MENTION=24071]Sprite[/MENTION]s["battler#{battlerindex}"].appearing
  end
  spriteBall.dispose
  sendout.dispose
  if @battle.battlers.pokemon.isShiny?
   pbCommonAnimation("Shiny",@battle.battlers,nil)
  end
  if @showingplayer
   @showingplayer=false
   pbDisposeSprite [MENTION=24071]Sprite[/MENTION]s,"player")
   pbDisposeSprite [MENTION=24071]Sprite[/MENTION]s,"partybase2")
   for i in 0...6
    pbDisposeSprite [MENTION=24071]Sprite[/MENTION]s,"player#{i}")
   end
  end
  pbRefresh
end

def pbTrainerWithdraw(battle,pkmn)
 pbRefresh
end

def pbWithdraw(battle,pkmn)
 pbRefresh
end

def pbForgetMove(pokemon,moveToLearn)
# Called whenever a Pokémon should forget a move.  It
# should return -1 if the selection is canceled, or 0 to 3
# to indicate the move to forget.  The function should not
# allow HM moves to be forgotten.
 ret=-1
 pbFadeOutIn(99999){
  scene=PokemonSummaryScene.new
  screen=PokemonSummary.new(scene)
  ret=screen.pbStartForgetScreen([pokemon],0,moveToLearn)
 }
 return ret
end

def pbBeginAttackPhase
 pbSelectBattler(-1)
end



def pbSafariStart
  @briefmessage=false
  [MENTION=24071]Sprite[/MENTION]s["battler0"]=SafariDataBox.new(@battle,@viewport)
  [MENTION=24071]Sprite[/MENTION]s["battler0"].appear
  loop do
   [MENTION=24071]Sprite[/MENTION]s["battler0"].update
   pbGraphicsUpdate
   pbInputUpdate
   break if  
      [MENTION=24071]Sprite[/MENTION]s["battler0"].appearing
  end
  pbRefresh
end

def pbCommandMenuEx(index,texts)
 pbShowWindow(COMMANDBOX)
 cw2 [MENTION=24071]Sprite[/MENTION]s["commandwindow"]
 cw2.setTexts(texts)
 cw2.index=[0,2,1,3][@lastcmd[index]]
 pbSelectBattler(index)
 pbRefresh
 loop do
  pbGraphicsUpdate
  pbInputUpdate
  pbFrameUpdate(cw2)
  if Input.trigger?(Input::C)
   ret=[0,2,1,3][cw2.index]
   pbPlayDecisionSE()
   @lastcmd[index]=ret
   return ret
  end
  nextindex=pbNextIndex(cw2.index)
  if cw2.index!=nextindex
   pbPlayCursorSE()
   cw2.index=nextindex
  end
 end 
end

def pbSafariCommandMenu(index)
 pbCommandMenuEx(index,[
  _INTL("¿Qué lanzará \n{1}?",@battle.pbPlayer.name),
  _INTL("BALL"),
  _INTL("ROCA"),
  _INTL("CEBO"),
  _INTL("HUIR")
 ])
end

def pbCommandMenu(index)
# Use this method to display the list of commands.
#  Return values:
#  0 - Fight
#  1 - Pokémon
#  2 - Bag
#  3 - Run
 shadowTrainer=(hasConst?(PBTypes,:SHADOW) && @opponent)
 ret=pbCommandMenuEx(index,[
  _INTL("¿Qué hará \n{1}?",@battle.battlers[index].name),
  _INTL("LUCHAR"),
  _INTL("POKéMON"),
  _INTL("BOLSA"),
  shadowTrainer ? _INTL("LLAMAR") : _INTL("HUIR")
 ])
 if ret==3 && shadowTrainer
  ret=4 # convert "Run" to "Call"
 end
 return ret
end

def pbMoveString(move)
 ret=_INTL("{1}",move.name)
 typename=PBTypes.getName(move.type)
 if move.id>0
  ret+=_INTL(" ({1}) PP: {2}/{3}",typename,move.pp,move.totalpp)
 end
 return ret
end

def pbNameEntry(helptext)
 return pbEnterText(helptext,0,10)
end

def pbFightMenu(index)
# Use this method to display the list of moves for a Pokémon
 pbShowWindow(FIGHTBOX)
 cw = [MENTION=24071]Sprite[/MENTION]s["fightwindow"]
 battler=@battle.battlers[index]
 cw.battler=battler
 lastIndex=@lastmove[index]
 if battler.moves[lastIndex].id!=0
  cw.setIndex(lastIndex)
 else
  cw.setIndex(0)
 end
 pbSelectBattler(index)
 pbRefresh
 loop do
  pbGraphicsUpdate
  pbInputUpdate
  pbFrameUpdate(cw)
  if Input.trigger?(Input::B) # Cancel fight menu
   @lastmove[index]=cw.index
   pbPlayCancelSE()
   return -1
  end
  if Input.trigger?(Input::C)# Confirm choice
   ret=cw.index
   pbPlayDecisionSE() 
   @lastmove[index]=ret
   return ret
  end
  nextindex=pbNextIndex(cw.index)
  if cw.index!=nextindex # Move cursor
   pbPlayCursorSE()
   cw.setIndex(nextindex)
  end
 end
end

def pbItemMenu(index)
# Use this method to display the inventory
# The return value is the item chosen, or 0 if the choice was canceled.
 ret=0
 endscene=true
 oldsprites=pbFadeOutAndHide [MENTION=24071]Sprite[/MENTION]s)
 itemscene=PokemonBag_Scene.new
 itemscene.pbStartScene($PokemonBag)
 loop do
  item=itemscene.pbChooseItem
  break if item==0
  usetype=$ItemData[item][ITEMBATTLEUSE]
  cmdUse=-1
  commands=[]
  if usetype==0
   commands[commands.length]=_INTL("CANCELAR")
  else
   commands[cmdUse=commands.length]=_INTL("USAR")
   commands[commands.length]=_INTL("CANCELAR")
  end
  itemname=PBItems.getName(item)
  command=itemscene.pbShowCommands(_INTL("{1} es seleccionado.",itemname),commands)
  if cmdUse>=0 && command==cmdUse
   if usetype==1
    pkmnlist=PokemonScreen_Scene.new
    pkmnscreen=PokemonScreen.new(pkmnlist,@battle.party1)
    itemscene.pbEndScene
    pkmnlist.pbStartScene(@battle.party1,_INTL("¿Usar en qué pokémon?"))
    pkmnid=pkmnlist.pbChoosePokemon
    if pkmnid>=0 && @battle.pbUseItemOnPokemon(item,pkmnid,pkmnscreen)
     pkmnscreen.pbRefresh
     pkmnlist.pbEndScene
     ret=item
     endscene=false
     break
    end
    pkmnlist.pbEndScene
    itemscene.pbStartScene($PokemonBag)
   elsif usetype==2
     if @battle.pbUseItemOnBattler(item,index,itemscene)
      ret=item
      break
     end
   end
  end
 end
 if ret!=0 && $ItemData[ret][ITEMBATTLEUSE]!=3
   # Delete the item just used from stock
   $PokemonBag.pbDeleteItem(ret)
 end
 itemscene.pbEndScene if endscene
 for i in 0..4
  if [MENTION=24071]Sprite[/MENTION]s["battler#{i}"]
   [MENTION=24071]Sprite[/MENTION]s["battler#{i}"].refresh
  end
 end
 pbFadeInAndShow [MENTION=24071]Sprite[/MENTION]s,oldsprites)
 return ret
end

def pbSelectBattler(index,selectmode=1)
 numwindows=@battle.doublebattle ? 4 : 2
 for i in 0...numwindows
  sprite [MENTION=24071]Sprite[/MENTION]s["battler#{i}"]
  sprite.selected=(i==index) ? selectmode : 0
  sprite [MENTION=24071]Sprite[/MENTION]s["pokemon#{i}"]
  sprite.selected=(i==index) ? selectmode : 0
 end
end

def pbFirstTarget(index)
 for i in 0..3
  if i!=index && @battle.battlers.hp>0 && 
     @battle.battlers[index].pbIsOpposing?(i)
   return i
  end  
 end
 return -1
end

def pbNextIndex(curindex)
 if Input.trigger?(Input::LEFT) && (curindex&1)==1
  return curindex-1
 elsif Input.trigger?(Input::RIGHT) &&  (curindex&1)==0
  return curindex+1
 elsif Input.trigger?(Input::UP) &&  (curindex&2)==2
  return curindex-2
 elsif Input.trigger?(Input::DOWN) &&  (curindex&2)==0
  return curindex+2
 end
 return curindex
end

def pbUpdateSelected(index)
 numwindows=@battle.doublebattle ? 4 : 2
 for i in 0...numwindows
  if i==index
   [MENTION=24071]Sprite[/MENTION]s["battler#{i}"].selected=2
   [MENTION=24071]Sprite[/MENTION]s["pokemon#{i}"].selected=2
  else
   [MENTION=24071]Sprite[/MENTION]s["battler#{i}"].selected=0
   [MENTION=24071]Sprite[/MENTION]s["pokemon#{i}"].selected=0
  end
  [MENTION=24071]Sprite[/MENTION]s["battler#{i}"].update
  [MENTION=24071]Sprite[/MENTION]s["pokemon#{i}"].update
 end
end

def pbChooseTarget(index)
# Use this method to make the player choose a target 
# for certain moves in double battles.
 pbShowWindow(FIGHTBOX)
 curwindow=pbFirstTarget(index)
 if curwindow==-1
  raise RuntimeError.new(_INTL("No targets somehow..."))
 end
 loop do
  pbGraphicsUpdate
  pbInputUpdate
  pbUpdateSelected(curwindow)
  if Input.trigger?(Input::C)
   pbUpdateSelected(-1)
   return curwindow
  end
  if Input.trigger?(Input::B)
   pbUpdateSelected(-1)
   return -1
  end
  if curwindow>=0
   if Input.trigger?(Input::RIGHT) || Input.trigger?(Input::DOWN)
    loop do
     newcurwindow=3 if curwindow==0
     newcurwindow=1 if curwindow==3
     newcurwindow=2 if curwindow==1
     newcurwindow=0 if curwindow==2
     curwindow=newcurwindow
     next if curwindow==index
     break if @battle.battlers[curwindow].hp>0
    end
   elsif Input.trigger?(Input::LEFT) || Input.trigger?(Input::UP)
    loop do 
     newcurwindow=2 if curwindow==0
     newcurwindow=1 if curwindow==2
     newcurwindow=3 if curwindow==1
     newcurwindow=0 if curwindow==3
     curwindow=newcurwindow
     next if curwindow==index
     break if @battle.battlers[curwindow].hp>0
    end
   end
  end
 end
end

def pbSwitch(index,lax,cancancel)
 party=@battle.pbParty(index)
 inactives=[1,1,1,1,1,1]
 partypos=[]
 switchsprites={}
 activecmd=0
 ret=-1
 numactive=(@doublebattle)?2:1
 pbShowWindow(BLANK)
 pbSetMessageMode(true)
 # Fade out and hide all sprites
 visiblesprites=pbFadeOutAndHide [MENTION=24071]Sprite[/MENTION]s)
 battler=@battle.battlers[0]
 activecmd=0 if battler.index==index
 inactives=0
 partypos[0]=battler.pokemonIndex
 if @battle.doublebattle && !@battle.fullparty1
  battler=@battle.battlers[2]
  activecmd=1 if battler.index==index
  inactives=0
  partypos[1]=battler.pokemonIndex
 end
 # Add all non-active Pokémon
 for i in 0...6
  partypos[partypos.length]=i if inactives==1
 end
 modparty=[]
 for i in 0...6
  modparty.push(party[partypos])
 end
 scene=PokemonScreen_Scene.new
 @switchscreen=PokemonScreen.new(scene,modparty)
 @switchscreen.pbStartScene(_INTL("Escoge un pokémon."),
    @battle.doublebattle && !@battle.fullparty1)
 loop do
  scene.pbSetHelpText(_INTL("Escoge un pokémon."))
  activecmd=@switchscreen.pbChoosePokemon
  if cancancel && activecmd==-1
   ret=-1
   break
  end
  if activecmd>=0
   commands=[]
   cmdShift=-1
   cmdSummary=-1
   pkmnindex=partypos[activecmd]
   commands[cmdShift=commands.length]=_INTL("MOVER") if !party[pkmnindex].egg?
   commands[cmdSummary=commands.length]=_INTL("DATOS")
   commands[commands.length]=_INTL("CANCELAR")
   command=scene.pbShowCommands(_INTL("¿Qué hacer con {1}?",party[pkmnindex].name),commands)
   if cmdShift>=0 && command==cmdShift
    canswitch=lax ? 
       @battle.pbCanSwitchLax?(index,pkmnindex,true) :
       @battle.pbCanSwitch?(index,pkmnindex,true)
    if canswitch
     ret=pkmnindex
     break
    end
   elsif cmdSummary>=0 && command==cmdSummary
    scene.pbSummary(activecmd)
   end
  end
 end
 @switchscreen.pbEndScene
 @switchscreen=nil
 pbSetMessageMode(false)
 # back to main battle screen
 pbFadeInAndShow [MENTION=24071]Sprite[/MENTION]s,visiblesprites)
 return ret
end

def pbDamageAnimation(pkmn,effectiveness)
 pkmnsprite [MENTION=24071]Sprite[/MENTION]s["pokemon#{pkmn.index}"]
 shadowsprite [MENTION=24071]Sprite[/MENTION]s["shadow#{pkmn.index}"]
 sprite [MENTION=24071]Sprite[/MENTION]s["battler#{pkmn.index}"]
 oldshadowvisible=shadowsprite.visible
 oldvisible=sprite.visible
 sprite.selected=2
 @briefmessage=false
 6.times do
  pbGraphicsUpdate
  pbInputUpdate
 end
 case effectiveness
  when 0
   pbSEPlay("normaldamage")
  when 1
   pbSEPlay("notverydamage")
  when 2
   pbSEPlay("superdamage")
 end
 8.times do
  pkmnsprite.visible=!pkmnsprite.visible
  if oldshadowvisible
   shadowsprite.visible=!shadowsprite.visible
  end
  4.times do
   pbGraphicsUpdate
   pbInputUpdate
   sprite.update
  end
 end
 sprite.selected=0
 sprite.visible=oldvisible
end

def pbHPChanged(pkmn,oldhp)
# This method is called whenever a Pokémon's HP changes.
# Used to animate the HP bar.
 @briefmessage=false
 hpchange=pkmn.hp-oldhp
 if hpchange<0
  hpchange=-hpchange
  PBDebug.log("[#{pkmn.pbThis} perdió #{hpchange} PS, ahora tiene #{pkmn.hp} PS]") if @battle.debug
 else
  PBDebug.log("[#{pkmn.pbThis} ganó #{hpchange} PS, ahora tiene #{pkmn.hp} PS]") if @battle.debug
 end
 sprite [MENTION=24071]Sprite[/MENTION]s["battler#{pkmn.index}"]
 sprite.animateHP(oldhp,pkmn.hp)
 while sprite.animatingHP
  pbGraphicsUpdate
  pbInputUpdate
  sprite.update
 end
end

def pbFainted(pkmn)
# This method is called whenever a Pokémon faints
 frames=pbCryFrameLength(pkmn.pokemon)
 pbPlayCry(pkmn.pokemon)
 frames.times do
  pbGraphicsUpdate
  pbInputUpdate
 end
 [MENTION=24071]Sprite[/MENTION]s["shadow#{pkmn.index}"].visible=false
 pkmnsprite [MENTION=24071]Sprite[/MENTION]s["pokemon#{pkmn.index}"]
 pkmnsprite.visible=false
 if @battle.pbIsOpposing?(pkmn.index)
  tempvp=Viewport.new(0,0,480,144+@yoffset)
 else
  tempvp=Viewport.new(0,0,480,224+@yoffset)
 end
 tempvp.z=@viewport.z
 tempsprite=SpriteWrapper.new(tempvp)
 tempsprite.x=pkmnsprite.x
 tempsprite.y=pkmnsprite.y
 tempsprite.bitmap=pkmnsprite.bitmap
 tempsprite.visible=true
 pbSEPlay("faint")
 16.times do
  tempsprite.y+=8
  pbGraphicsUpdate
  pbInputUpdate
 end
 tempsprite.dispose
 tempvp.dispose
 8.times do
  [MENTION=24071]Sprite[/MENTION]s["battler#{pkmn.index}"].opacity=32
  pbGraphicsUpdate
  pbInputUpdate
 end
 [MENTION=24071]Sprite[/MENTION]s["battler#{pkmn.index}"].visible=false
end


def pbChooseEnemyCommand(index)
# Use this method to choose a command for the enemy.
 @battle.pbDefaultChooseEnemyCommand(index)
end

def pbChooseNewEnemy(index,party)
# Use this method to choose a new Pokémon for the enemy
# The enemy's party is guaranteed to have at least one choosable member.
 for i in 0..party.length-1
  return i if @battle.pbCanSwitchLax?(index,i,false)
 end
 return -1
end

def pbWildBattleSuccess
# This method is called when the player wins a wild Pokémon battle.
# This method can change the battle's music for example.
 pbBGMPlay(pbGetWildVictoryME())
end

def pbTrainerBattleSuccess
# This method is called when the player wins a Trainer battle.
# This method can change the battle's music for example.
 pbBGMPlay(pbGetTrainerVictoryME(@battle.opponent))
end

def pbEXPBar(pokemon,battler,startexp,endexp,tempexp1,tempexp2)
 if battler
  [MENTION=24071]Sprite[/MENTION]s["battler#{battler.index}"].refreshExpLevel
  exprange=(endexp-startexp)
  startexplevel=0
  endexplevel=0
  if exprange!=0
   startexplevel=(tempexp1-startexp)*128/exprange
   endexplevel=(tempexp2-startexp)*128/exprange
  end
  [MENTION=24071]Sprite[/MENTION]s["battler#{battler.index}"].animateEXP(startexplevel,endexplevel)
  while [MENTION=24071]Sprite[/MENTION]s["battler#{battler.index}"].animatingEXP
   pbGraphicsUpdate
   pbInputUpdate
   [MENTION=24071]Sprite[/MENTION]s["battler#{battler.index}"].update
  end
 end
end

def pbShowPokedex(species)
 pbFadeOutIn(99999){
    scene=PokemonPokedexScene.new
    screen=PokemonPokedex.new(scene)
    screen.pbDexEntry(species)
 }
end

def pbFindAnimation(moveid)
 begin
  move2anim=load_data("Data/move2anim.dat")
  anim=move2anim[0][moveid]
  return anim if anim
  if hasConst?(PBMoves,:TACKLE)
   anim=move2anim[0][getConst(PBMoves,:TACKLE)]
   return anim if anim
  end
 rescue
  return nil
 end
 return nil
end



def pbCommonAnimation(animname,attacker,opponent,side=true)
 animations=load_data("Data/PkmnAnimations.rxdata")
 for i in 0...animations.length
  if animations && animations.name=="Common:"+animname
   pbAnimationCore(animations,attacker,opponent,side)
   return
  end
 end
end

def pbChangeSpecies(attacker,species)
 pkmn [MENTION=24071]Sprite[/MENTION]s["pokemon#{attacker.index}"]
 shadow [MENTION=24071]Sprite[/MENTION]s["shadow#{attacker.index}"]
 back=!@battle.pbIsOpposing?(attacker.index)
 pkmn.setPokemonBitmapSpecies(
  attacker.pokemon,species,back
 )
 pkmn.y=adjustBattleSpriteY(pkmn,species,attacker.index)
 if shadow && !back
  shadow.visible=showShadow?(species)
 end
end

def pbChangePokemon(attacker,pokemon)
 pkmn [MENTION=24071]Sprite[/MENTION]s["pokemon#{attacker.index}"]
 shadow [MENTION=24071]Sprite[/MENTION]s["shadow#{attacker.index}"]
 back=!@battle.pbIsOpposing?(attacker.index)
 pkmn.setPokemonBitmap(pokemon,back
 )
 pkmn.y=adjustBattleSpriteY(pkmn,pokemon.species,attacker.index)
 if shadow && !back
  shadow.visible=showShadow?(pokemon.species)
 end
end

def pbAnimation(moveid,attacker,opponent,side=true)
 animid=pbFindAnimation(moveid)
 return if !animid
 animations=load_data("Data/PkmnAnimations.rxdata")
 pbSaveShadows {
  pbAnimationCore(animations[animid],attacker,opponent,side)
 }
 if isConst?(moveid,PBMoves,:TRANSFORM) && attacker && opponent
  # Change form to transformed version
  pbChangePokemon(attacker,opponent.pokemon)
 end
end

def pbSaveShadows
 shadows=[]
 for i in 0...4
  s [MENTION=24071]Sprite[/MENTION]s["shadow#{i}"]
  shadows=s ? s.visible : false
  s.visible=false if s
 end
 yield
 for i in 0...4
  s [MENTION=24071]Sprite[/MENTION]s["shadow#{i}"]
  s.visible=shadows if s
 end
end

def pbAnimationCore(animation,attacker,opponent,side=true)
 if !attacker || !animation
  return
 end
 @briefmessage=false
 user=(attacker) ? [MENTION=24071]Sprite[/MENTION]s["pokemon#{attacker.index}"] : nil
 target=(opponent) ? [MENTION=24071]Sprite[/MENTION]s["pokemon#{opponent.index}"] : nil
 olduserx=user.x
 oldusery=user.y
 oldtargetx=target ? target.x : 0
 oldtargety=target ? target.y : 0
 if !target
  animplayer=PBAnimationPlayer.new(
    animation,user,user,@viewport
  )
  userwidth=(!user.bitmap || user.bitmap.disposed?) ? 128 : user.bitmap.width
  userheight=(!user.bitmap || user.bitmap.disposed?) ? 128 : user.bitmap.height
  animplayer.setLineTransform(
    144,188,352,108,
    user.x+(userwidth/2),
    user.y+(userheight/2),
    user.x+(userwidth/2),
    user.y+(userheight/2)
  )
 else
  animplayer=PBAnimationPlayer.new(
    animation,user,target,@viewport
  )
  userwidth=(!user.bitmap || user.bitmap.disposed?) ? 128 : user.bitmap.width
  targetwidth=(!target.bitmap || target.bitmap.disposed?) ? 128 : target.bitmap.width
  userheight=(!user.bitmap || user.bitmap.disposed?) ? 128 : user.bitmap.height
  targetheight=(!target.bitmap || target.bitmap.disposed?) ? 128 : target.bitmap.height
  animplayer.setLineTransform(
    144,188,352,108,
    user.x+(userwidth/2),
    user.y+(userheight/2),
    target.x+(targetwidth/2),
    target.y+(targetheight/2)
  )
 end
 animplayer.start
 while animplayer.playing?
  animplayer.update
  pbGraphicsUpdate
  pbInputUpdate
 end
 user.ox=0
 user.oy=0
 target.ox=0 if target
 target.oy=0 if target
 user.x=olduserx
 user.y=oldusery
 target.x=oldtargetx if target
 target.y=oldtargety if target
 animplayer.dispose
end

def pbLevelUp(pokemon,battler,oldtotalhp,oldattack,
            olddefense,oldspeed,oldspatk,oldspdef)
     pbTopRightWindow(_INTL("MaxHP<r>+{1}\r\nATTACK<r>+{2}\r\nDEFENSE<r>+{3}\r\nSP.  ATK<r>+{4}\r\nSP. DEF<r>+{5}\r\nSPEED<r>+{6}",
       pokemon.totalhp-oldtotalhp,
       pokemon.attack-oldattack,
       pokemon.defense-olddefense,
       pokemon.spatk-oldspatk,
       pokemon.spdef-oldspdef,
       pokemon.speed-oldspeed
   ))
     pbTopRightWindow(_INTL("MaxHP<r>{1}\r\nATTACK<r>{2}\r\nDEFENSE<r>{3}\r\nSP.  ATK<r>{4}\r\nSP. DEF<r>{5}\r\nSPEED<r>{6}",
       pokemon.totalhp,pokemon.attack,pokemon.defense,pokemon.spatk,pokemon.spdef,pokemon.speed))
end

def pbThrowAndDeflect(ball,targetBattler)
end
def pbThrow(ball,shakes,targetBattler)
 @briefmessage=false
 pokeballThrow(ball,shakes,targetBattler)
end
def pbThrowSuccess
 if !@opponent
  @briefmessage=false
  pbBGMPlay("../ME/PkmRS-Caught")
  frames=(3.5*Graphics.frame_rate).to_i
  frames.times do
   pbGraphicsUpdate
   pbInputUpdate
  end
 end
end


end

[/SPOILER]
Mi  modo de batalla que viene en el essentials muestra al sprite del  enemigo moviendose de izquierda a derecha y al entrenador tambien, y al  jugador lo muestra de derecha a izquierda como en los juegos de pokemon  rubi.
En el otro script que encontré aparece el entrenador desde  cerca luego se aleja la pantalla y lanza su pokemon, cuando son salvajes  igual pasa eso,
y el jugador cuando saca su pokemon hce tambien ese  acercamiento de pantalla y luego vuelve a su posicion, cosa que quiero  lograr hacer pero ese script no es compatible con mi essentials.
[SPOILER="pokebattle_actualscenebw"]=begin
-  def pbChooseNewEnemy(index,party)
Use this method to choose a new Pokémon for the enemy
The enemy's party is guaranteed to have at least one 
choosable member.
index - Index to the battler to be replaced (use e.g. @battle.battlers[index] to 
access the battler)
party - Enemy's party

- def pbWildBattleSuccess
This method is called when the player wins a wild Pokémon battle.
This method can change the battle's music for example.

- def pbTrainerBattleSuccess
This method is called when the player wins a Trainer battle.
This method can change the battle's music for example.

- def pbFainted(pkmn)
This method is called whenever a Pokémon faints.
pkmn - PokeBattle_Battler object indicating the Pokémon that fainted

- def pbChooseEnemyCommand(index)
Use this method to choose a command for the enemy.
index - Index of enemy battler (use e.g. @battle.battlers[index] to 
access the battler)

- def pbCommandMenu(index)
Use this method to display the list of commands and choose
a command for the player.
index - Index of battler (use e.g. @battle.battlers[index] to 
access the battler)
Return values:
0 - Fight
1 - Pokémon
2 - Bag
3 - Run
=end

################################################

class CommandMenuDisplay
  def initialize(viewport=nil)
    @display=nil
    if PokeBattle_Scene::USECOMMANDBOX
      @display=IconSprite.new(0,384-96,viewport)
      @display.setBitmap("Graphics/Pictures/commandbox")
    end
  [MENTION=24700]Wind[/MENTION]ow=Window_CommandPokemon.newWithSize([],
    Graphics.width-240,0-96,5,96);
  [MENTION=24700]Wind[/MENTION]ow.columns=2
  [MENTION=24700]Wind[/MENTION]ow.columnSpacing=4
  [MENTION=24700]Wind[/MENTION]ow.viewport=viewport
  @msgbox=Window_UnformattedTextPokemon.newWithSize(
   "",4,384-96,Graphics.width [MENTION=24700]Wind[/MENTION]ow.width-4, 296,viewport) # [MENTION=24700]Wind[/MENTION]ow.width-4
  @msgbox.baseColor=PokeBattle_Scene::MESSAGEBASECOLOR
  @msgbox.shadowColor=PokeBattle_Scene::MESSAGESHADOWCOLOR
  @msgbox.windowskin=nil
  if PokeBattle_Scene::USECOMMANDBOX
   [MENTION=24700]Wind[/MENTION]ow.opacity=0
  end
  @title=""
  end

  def index; [MENTION=24700]Wind[/MENTION]ow.index; end
  def index=(value); [MENTION=24700]Wind[/MENTION]ow.index=value; end

  def setTexts(value)
    @msgbox.text=value[0]
    # Note 2 and 3 were intentionally switched
    commands=[]
    [1,3,2,4].each{|i|
       commands.push(value) if value && value!=nil
    }
    [MENTION=24700]Wind[/MENTION]ow.commands=commands
  end

  def visible; [MENTION=24700]Wind[/MENTION]ow.visible; end
  def visible=(value)
    [MENTION=24700]Wind[/MENTION]ow.visible=value
    @msgbox.visible=value
    @display.visible=value if @display
  end

  def x; [MENTION=24700]Wind[/MENTION]ow.x; end
  def x=(value)
    [MENTION=24700]Wind[/MENTION]ow.x=value
    @msgbox.x=value
    @display.x=value if @display
  end

  def y; [MENTION=24700]Wind[/MENTION]ow.y; end
  def y=(value)
    [MENTION=24700]Wind[/MENTION]ow.y=value
    @msgbox.y=value
    @display.y=value if @display
  end

  def oy; [MENTION=24700]Wind[/MENTION]ow.oy; end
  def oy=(value)
    [MENTION=24700]Wind[/MENTION]ow.oy=value
    @msgbox.oy=value
    @display.oy=value if @display
  end

  def color; [MENTION=24700]Wind[/MENTION]ow.color; end
  def color=(value)
    [MENTION=24700]Wind[/MENTION]ow.color=value
    @msgbox.color=value
    @display.color=value if @display
  end

  def ox; [MENTION=24700]Wind[/MENTION]ow.ox; end
  def ox=(value)
    [MENTION=24700]Wind[/MENTION]ow.ox=value
    @msgbox.ox=value
    @display.ox=value if @display
  end

  def z; [MENTION=24700]Wind[/MENTION]ow.z; end
  def z=(value)
    [MENTION=24700]Wind[/MENTION]ow.z=value
    @msgbox.z=value
    @display.z=value if @display
  end

  def disposed?
    return @msgbox.disposed? || [MENTION=24700]Wind[/MENTION]ow.disposed?
  end

  def dispose
    return if disposed?
    @msgbox.dispose
    [MENTION=24700]Wind[/MENTION]ow.dispose
    @display.dispose if @display
  end

  def update
     [MENTION=24071]Sprite[/MENTION]s["pokemon1"].update if @sprit
    @msgbox.update
    [MENTION=24700]Wind[/MENTION]ow.update
    @display.update if @display
  end

  def refresh
    @msgbox.refresh
    [MENTION=24700]Wind[/MENTION]ow.refresh
  end
end



class FightMenuDisplay
  attr_reader :battler
  attr_reader :index

  def battler=(value)
    @battler=value
    refresh
  end

  def setIndex(value)
    if @battler && @battler.moves[value].id!=0
      @index=value
      [MENTION=24700]Wind[/MENTION]ow.index=value
      refresh
    end
  end

  def visible; [MENTION=24700]Wind[/MENTION]ow.visible; end
  def visible=(value)
    [MENTION=24700]Wind[/MENTION]ow.visible=value
    @info.visible=value
    @display.visible=value if @display
  end

  def x; [MENTION=24700]Wind[/MENTION]ow.x; end
  def x=(value)
    [MENTION=24700]Wind[/MENTION]ow.x=value
    @info.x=value
    @display.x=value if @display
  end

  def y; [MENTION=24700]Wind[/MENTION]ow.y; end
  def y=(value)
    [MENTION=24700]Wind[/MENTION]ow.y=value
    @info.y=value
    @display.y=value if @display
  end

  def oy; [MENTION=24700]Wind[/MENTION]ow.oy; end
  def oy=(value)
    [MENTION=24700]Wind[/MENTION]ow.oy=value
    @info.oy=value
    @display.oy=value if @display
  end

  def color; [MENTION=24700]Wind[/MENTION]ow.color; end
  def color=(value)
    [MENTION=24700]Wind[/MENTION]ow.color=value
    @info.color=value
    @display.color=value if @display
  end

  def ox; [MENTION=24700]Wind[/MENTION]ow.ox; end
  def ox=(value)
    [MENTION=24700]Wind[/MENTION]ow.ox=value
    @info.ox=value
    @display.ox=value if @display
  end

  def z; [MENTION=24700]Wind[/MENTION]ow.z; end
  def z=(value)
    [MENTION=24700]Wind[/MENTION]ow.z=value
    @info.z=value
    @display.z=value if @display
  end

  def disposed?
    return @info.disposed? || [MENTION=24700]Wind[/MENTION]ow.disposed?
  end

  def dispose
    return if disposed?
    @info.dispose
    @display.dispose if @display
    [MENTION=24700]Wind[/MENTION]ow.dispose
  end

  def update
     [MENTION=24071]Sprite[/MENTION]s["pokemon1"].update if @sprit
    @info.update
    [MENTION=24700]Wind[/MENTION]ow.update
    @display.update if @display
  end

  def initialize(battler,viewport=nil)
    @display=nil
    if PokeBattle_Scene::USEFIGHTBOX
      @display=IconSprite.new(0,384-96,viewport)
      @display.setBitmap("Graphics/Pictures/fightbox")
    end
    [MENTION=24700]Wind[/MENTION]ow=Window_CommandPokemon.newWithSize([],
       0,384-96,320,96,viewport)
    [MENTION=24700]Wind[/MENTION]ow.columns=2
    [MENTION=24700]Wind[/MENTION]ow.columnSpacing=4
    @info=Window_AdvancedTextPokemon.newWithSize(
       "",320,384-96,Graphics.width-320,96,viewport)
    @ctag=shadowctag(PokeBattle_Scene::MENUBASECOLOR,
       PokeBattle_Scene::MENUSHADOWCOLOR)
    if PokeBattle_Scene::USEFIGHTBOX
      [MENTION=24700]Wind[/MENTION]ow.opacity=0
      @info.opacity=0
    end
    @battler=battler
    @index=0
    refresh
  end

  def refresh
    return if !@battler
    pbSetNarrowFont [MENTION=24700]Wind[/MENTION]ow.contents)
    commands=[]
    for i in 0...4
      if @battler.moves.id!=0
        commands.push(@battler.moves.name)
      else
        break
      end
    end
    [MENTION=24700]Wind[/MENTION]ow.commands=commands
    selmove=@battler.moves[@index]
    movetype=PBTypes.getName(selmove.type)
    pbSetNarrowFont(@info.contents)
    @info.text=_ISPRINTF("{1:s}PP: {2: 2d}/{3: 2d}<br>TYPE/{4:s}",
       @ctag,selmove.pp,selmove.totalpp,movetype)
  end
end



class PokemonBattlerSprite < RPG::Sprite
  attr_accessor :selected

  def initialize(doublebattle,index,viewport=nil)
    super(viewport)
    @selected=0
    [MENTION=19010]Frame[/MENTION]=0
    @index=index
    @updating=false
    @doublebattle=doublebattle
    @index=index
    [MENTION=24071]Sprite[/MENTION]X=0
    [MENTION=24071]Sprite[/MENTION]Y=0
    [MENTION=24071]Sprite[/MENTION]XExtra=0
    [MENTION=24071]Sprite[/MENTION]YExtra=0
    [MENTION=24071]Sprite[/MENTION]Visible=false
    @_iconbitmap=nil
    self.visible=false
  end

  def selected=(value)
    if @selected==1 && value!=1 && [MENTION=24071]Sprite[/MENTION]YExtra>0
      [MENTION=24071]Sprite[/MENTION]YExtra=0
      self.y [MENTION=24071]Sprite[/MENTION]Y
    end
    @selected=value
  end

  def visible=(value)
    [MENTION=24071]Sprite[/MENTION]Visible=value if !@updating
    super
  end

  def x
    return [MENTION=24071]Sprite[/MENTION]X
  end

  def y
    return [MENTION=24071]Sprite[/MENTION]Y
  end

  def x=(value)
    [MENTION=24071]Sprite[/MENTION]X=value
    super(value [MENTION=24071]Sprite[/MENTION]XExtra)
  end

  def y=(value)
    [MENTION=24071]Sprite[/MENTION]Y=value
    super(value [MENTION=24071]Sprite[/MENTION]YExtra)
  end

  def update
      [MENTION=24071]Sprite[/MENTION]s["pokemon1"].update if @sprit
    [MENTION=19010]Frame[/MENTION]+=1
    @updating=true
    if ( [MENTION=19010]Frame[/MENTION]/9).floor&1)==1 && @selected==1 # When choosing commands for this Pokémon
      [MENTION=24071]Sprite[/MENTION]YExtra=2
    else
      [MENTION=24071]Sprite[/MENTION]YExtra=0
    end
    if ( [MENTION=19010]Frame[/MENTION]/9).floor&1)==1 && @selected==1 # When choosing commands for this Pokémon
      self.x [MENTION=24071]Sprite[/MENTION]X
      self.y [MENTION=24071]Sprite[/MENTION]Y
      self.visible [MENTION=24071]Sprite[/MENTION]Visible
    elsif @selected==2 # When targeted or damaged
      self.x [MENTION=24071]Sprite[/MENTION]X
      self.y [MENTION=24071]Sprite[/MENTION]Y
      self.visible= [MENTION=19010]Frame[/MENTION]%10<7)
    elsif 
      self.x [MENTION=24071]Sprite[/MENTION]X
      self.y [MENTION=24071]Sprite[/MENTION]Y
      self.visible [MENTION=24071]Sprite[/MENTION]Visible
    end
    if @_iconbitmap
      @_iconbitmap.update
      self.bitmap=@_iconbitmap.bitmap
    end
    @updating=false
  end

  def dispose
    @_iconbitmap.dispose if @_iconbitmap
    @_iconbitmap=nil
    self.bitmap=nil if !self.disposed?
    super
  end

  def setPokemonBitmap(pokemon,back=false)
    @_iconbitmap.dispose if @_iconbitmap
    @_iconbitmap=pbLoadPokemonBitmap(pokemon,back)
    self.bitmap=@_iconbitmap ? @_iconbitmap.bitmap : nil
  end

  def setPokemonBitmapSpecies(pokemon,species,back=false)
    @_iconbitmap.dispose if @_iconbitmap
    @_iconbitmap=pbLoadPokemonBitmapSpecies(pokemon,species,back)
    self.bitmap=@_iconbitmap ? @_iconbitmap.bitmap : nil
  end
end



class SafariDataBox < SpriteWrapper
  attr_accessor :selected
  attr_reader :appearing

  def initialize(battle,viewport=nil)
    super(viewport)
    @selected=0
    @battle=battle
    @databox=AnimatedBitmap.new("Graphics/Pictures/safariPlayerBox")
    [MENTION=24071]Sprite[/MENTION]X=254
    [MENTION=24071]Sprite[/MENTION]Y=148+(384-320)
    [MENTION=24071]Sprite[/MENTION]baseY=0
    [MENTION=24071]Sprite[/MENTION]baseX=16
    @appearing=false
    @contents=BitmapWrapper.new(@databox.width,@databox.height)
    self.bitmap=@contents
    self.visible=false
    self.z=2
    refresh
  end

  def appear
    refresh
    self.visible=true
    self.opacity=255
    self.x [MENTION=24071]Sprite[/MENTION]X+320
    self.y [MENTION=24071]Sprite[/MENTION]Y
    @appearing=true
  end

  def refresh
    self.bitmap.clear
    self.bitmap.blt(0,0,@databox.bitmap,Rect.new(0,0,@databox.width,@databox.height))
    pbSetSmallFont(self.bitmap)
    textpos=[]
    base=PokeBattle_Scene::BOXTEXTBASECOLOR
    shadow=PokeBattle_Scene::BOXTEXTSHADOWCOLOR
    textpos.push([_INTL("SAFARI BALLS") [MENTION=24071]Sprite[/MENTION]baseX+14 [MENTION=24071]Sprite[/MENTION]baseY+6,false,base,shadow])
    textpos.push([_INTL("Left: {1}",@battle.ballcount) [MENTION=24071]Sprite[/MENTION]baseX+170 [MENTION=24071]Sprite[/MENTION]baseY+40,
       true,base,shadow])
    pbDrawTextPositions(self.bitmap,textpos)
  end

  def update
    super
      [MENTION=24071]Sprite[/MENTION]s["pokemon1"].update if @sprit
    if @appearing
      self.x-=8
      @appearing=false if self.x< [MENTION=24071]Sprite[/MENTION]X
      self.y [MENTION=24071]Sprite[/MENTION]Y
      return
    end
    self.x [MENTION=24071]Sprite[/MENTION]X
    self.y [MENTION=24071]Sprite[/MENTION]Y
  end
end



class PokemonDataBox < SpriteWrapper
 attr_reader :battler
 attr_accessor :selected
 attr_accessor :appearing
 attr_reader :animatingHP
 attr_reader :animatingEXP
 def initialize(battler,doublebattle,viewport=nil)
  super(viewport)
  @explevel=0
  @battler=battler
  [MENTION=24071]Sprite[/MENTION]baseY=0
  @selected=0
  [MENTION=19010]Frame[/MENTION]=0
  @showhp=false
  @showexp=false
  @appearing=false
  @animatingHP=false
  @currenthp=0
  @endhp=0
  @expflash=0
  @statusCX=64
  @statusY=28
  if (@battler.index&1)==0 # if player's Pokémon
   [MENTION=24071]Sprite[/MENTION]baseX=16
  else
   [MENTION=24071]Sprite[/MENTION]baseX=0
  end
  yoffset=(384-320)
  if doublebattle
   case @battler.index
    when 0
     @databox=AnimatedBitmap.new("Graphics/Pictures/doublePlayerBox")
     
     [MENTION=24071]Sprite[/MENTION]X=256
     [MENTION=24071]Sprite[/MENTION]Y=124+yoffset
    when 1 
     @databox=AnimatedBitmap.new("Graphics/Pictures/doubleEnemyBox")
     
     [MENTION=24071]Sprite[/MENTION]X=26
     [MENTION=24071]Sprite[/MENTION]Y=10+yoffset
     [MENTION=24071]Sprite[/MENTION]baseX=0
     [MENTION=24071]Sprite[/MENTION]baseY=0
    when 2 
     @databox=AnimatedBitmap.new("Graphics/Pictures/doublePlayerBox")
     
     [MENTION=24071]Sprite[/MENTION]X=280
     [MENTION=24071]Sprite[/MENTION]Y=174+yoffset
    when 3 
     @databox=AnimatedBitmap.new("Graphics/Pictures/doubleEnemyBox")
     
     [MENTION=24071]Sprite[/MENTION]X=2
     [MENTION=24071]Sprite[/MENTION]Y=60+yoffset
   end
  else
   case @battler.index
    when 0
     @databox=AnimatedBitmap.new("Graphics/Pictures/singlePlayerBox")
     [MENTION=24071]Sprite[/MENTION]X=278-11
     [MENTION=24071]Sprite[/MENTION]Y=148+yoffset+4
     @showhp=true
     @showexp=true
     @statusCX=40
     @statusY=44
     @tubox = true
    when 1 
     @databox=AnimatedBitmap.new("Graphics/Pictures/singleEnemyBox")
     [MENTION=24071]Sprite[/MENTION]X=26-36+10
     [MENTION=24071]Sprite[/MENTION]Y=32+yoffset-36
    
     @rivalbox = true
   end
  end
  @statuses=AnimatedBitmap.new(_INTL("Graphics/Pictures/boxstatuses"))
  @contents=BitmapWrapper.new(@databox.width,@databox.height)
  self.bitmap=@contents
  self.visible=false
  self.z=99999
  refreshExpLevel
  refresh
 end
 def dispose
  @statuses.dispose
  @databox.dispose
  @contents.dispose
  super
 end
 def refreshExpLevel
   if !@battler.pokemon
     @explevel=0
   else
     growthrate=@battler.pokemon.growthrate
     startexp=PBExperience.pbGetStartExperience(@battler.pokemon.level,growthrate)
     endexp=PBExperience.pbGetStartExperience(@battler.pokemon.level+1,growthrate)
     if startexp==endexp
       @explevel=0
     else
       @explevel=(@battler.pokemon.exp-startexp)*PokeBattle_Scene::EXPGAUGESIZE/(endexp-startexp)
     end
   end
 end
 def exp
  return @animatingEXP ? @currentexp : @explevel
 end
 def hp
  return @animatingHP ? @currenthp : @battler.hp
 end
 def animateHP(oldhp,newhp)
  @currenthp=oldhp
  @endhp=newhp
  @animatingHP=true
 end
 def animateEXP(oldexp,newexp)
  @currentexp=oldexp
  @endexp=newexp
  @animatingEXP=true
end

 def appear
  refreshExpLevel
  refresh
  self.visible=true
  self.opacity=255
  if (@battler.index&1)==0 # if player's Pokémon
   self.x [MENTION=24071]Sprite[/MENTION]X+320
  else
   self.x [MENTION=24071]Sprite[/MENTION]X-320
  end
  self.y [MENTION=24071]Sprite[/MENTION]Y
  @appearing=true
end

 def refresh
   
  self.bitmap.clear
  return if !@battler.pokemon
  self.bitmap.blt(0,0,@databox.bitmap,Rect.new(0,0,@databox.width,@databox.height))
  pbSetSmallFont(self.bitmap)
  hpstring=_ISPRINTF("{1: 2d}/{2: 2d}",self.hp,@battler.totalhp)
  textpos=[]
  base=Color.new(255,255,255)
  shadow=Color.new(33,33,33)
  genderX=self.bitmap.text_size(@battler.name).width
  genderX+ [MENTION=24071]Sprite[/MENTION]baseX+14
  
  if @tubox == true
  textpos.push([@battler.name [MENTION=24071]Sprite[/MENTION]baseX+18 [MENTION=24071]Sprite[/MENTION]baseY-2,false,base,shadow])
  else
  textpos.push([@battler.name [MENTION=24071]Sprite[/MENTION]baseX+14+28 [MENTION=24071]Sprite[/MENTION]baseY-2,false,base,shadow])
  end

if @battler.index == 0
  
if @battler.gender==0 # Male  genderX+40-2
textpos.push([_INTL("♂"),156-8 [MENTION=24071]Sprite[/MENTION]baseY-2,false,Color.new(8*8,25*8,31*8),shadow])
elsif @battler.gender==1 # Female
textpos.push([_INTL("♀"),156-8 [MENTION=24071]Sprite[/MENTION]baseY-2,false,Color.new(31*8,19*8,18*8),shadow])
end

else
  
if @battler.gender==0 # Male 
textpos.push([_INTL("♂"),156 [MENTION=24071]Sprite[/MENTION]baseY-2,false,Color.new(8*8,25*8,31*8),shadow])
elsif @battler.gender==1 # Female
textpos.push([_INTL("♀"),156 [MENTION=24071]Sprite[/MENTION]baseY-2,false,Color.new(31*8,19*8,18*8),shadow])
end

end

  if @tubox == true
  textpos.push([_INTL("{1}",@battler.level) [MENTION=24071]Sprite[/MENTION]baseX+188-24 [MENTION=24071]Sprite[/MENTION]baseY-2,false,base,shadow])
  else
  textpos.push([_INTL("{1}",@battler.level) [MENTION=24071]Sprite[/MENTION]baseX+198-10 [MENTION=24071]Sprite[/MENTION]baseY-2,false,base,shadow])
  end

  if @showhp
   textpos.push([hpstring [MENTION=24071]Sprite[/MENTION]baseX+154 [MENTION=24071]Sprite[/MENTION]baseY+26,true,base,shadow])
 end
 
  pbDrawTextPositionsTB(self.bitmap,textpos)
  
  if @battler.status>0
   self.bitmap.blt [MENTION=24071]Sprite[/MENTION]baseX+14 [MENTION=24071]Sprite[/MENTION][url]baseY+@statusY,@statuses.bitmap[/url],
      Rect.new(0,(@battler.status-1)*16,@statusCX,16))
  end
  hpGaugeSize=PokeBattle_Scene::HPGAUGESIZE
  hpgauge=@battler.totalhp==0 ? 0 : (self.hp*hpGaugeSize/@battler.totalhp)
  hpgauge=1 if hpgauge==0 && self.hp>0
  hpzone=0
  hpzone=1 if self.hp<=(@battler.totalhp/2).floor
  hpzone=2 if self.hp<=(@battler.totalhp/4).floor
  hpcolors=[
   PokeBattle_Scene::HPCOLORSHADOW1,
   PokeBattle_Scene::HPCOLORBASE1,
   PokeBattle_Scene::HPCOLORSHADOW2,
   PokeBattle_Scene::HPCOLORBASE2,
   PokeBattle_Scene::HPCOLORSHADOW3,
   PokeBattle_Scene::HPCOLORBASE3
  ]
  # fill with HP color
  
  if @tubox == true
  hpGaugeX=PokeBattle_Scene::HPGAUGE_X+18
  hpGaugeY=PokeBattle_Scene::HPGAUGE_Y-10
  expGaugeX=PokeBattle_Scene::EXPGAUGE_X+2
  expGaugeY=PokeBattle_Scene::EXPGAUGE_Y-14
else
  hpGaugeX=PokeBattle_Scene::HPGAUGE_X+10
  hpGaugeY=PokeBattle_Scene::HPGAUGE_Y-10
  expGaugeX=PokeBattle_Scene::EXPGAUGE_X
  expGaugeY=PokeBattle_Scene::EXPGAUGE_Y
end
  
  self.bitmap.fill_rect [MENTION=24071]Sprite[/MENTION]baseX+hpGaugeX [MENTION=24071]Sprite[/MENTION]baseY+hpGaugeY,hpgauge,2,hpcolors[hpzone*2+1])
  self.bitmap.fill_rect [MENTION=24071]Sprite[/MENTION]baseX+hpGaugeX [MENTION=24071]Sprite[/MENTION]baseY+hpGaugeY+2,hpgauge,2,hpcolors[hpzone*2])
  # fill with black
    #self.bitmap.fill_rect [MENTION=24071]Sprite[/MENTION]baseX+hpGaugeX+hpgauge [MENTION=24071]Sprite[/MENTION]baseY+hpGaugeY,hpGaugeSize-hpgauge,2,PokeBattle_Scene::HPCOLORSHADOW4)
    #self.bitmap.fill_rect [MENTION=24071]Sprite[/MENTION]baseX+hpGaugeX+hpgauge [MENTION=24071]Sprite[/MENTION]baseY+hpGaugeY+2,hpGaugeSize-hpgauge,2,PokeBattle_Scene::HPCOLORBASE4)
  if @showexp
   # fill with EXP color
   self.bitmap.fill_rect [MENTION=24071]Sprite[/MENTION]baseX+expGaugeX [MENTION=24071]Sprite[/MENTION]baseY+expGaugeY,self.exp,2,PokeBattle_Scene::EXPCOLOR)
  end
 end
 def update
  super
   
  [MENTION=19010]Frame[/MENTION]+=1
  if @animatingHP
   if @currenthp<@endhp
    @currenthp+=1
   elsif @currenthp>@endhp
    @currenthp-=1
   end
   refresh
   @animatingHP=false if @currenthp==@endhp
  end
  if @animatingEXP
   if !@showexp
    @currentexp=@endexp
   elsif @currentexp<@endexp
    @currentexp+=1
   elsif @currentexp>@endexp
    @currentexp-=1
   end
   refresh
   if @currentexp==@endexp
    if @currentexp==PokeBattle_Scene::EXPGAUGESIZE
     if @expflash==0
      pbSEPlay("expfull")
      self.flash(Color.new(64,200,248),8)
      @expflash=8
     else
      @expflash-=1
      if @expflash==0
       @animatingEXP=false
       refreshExpLevel
      end
     end
    else
     @animatingEXP=false
    end
   end
 end
 
  if @appearing
   if (@battler.index&1)==0 # if player's Pokémon
    self.x-=8 if $esperahp != true
    @appearing=false if self.x< [MENTION=24071]Sprite[/MENTION]X
   else
    self.x+=8
    @appearing=false if self.x> [MENTION=24071]Sprite[/MENTION]X
   end
   self.y [MENTION=24071]Sprite[/MENTION]Y
   return
 end
 
  if ( [MENTION=19010]Frame[/MENTION]/10).floor&1)==1 && @selected==1 # When choosing commands for this Pokémon
   self.x [MENTION=24071]Sprite[/MENTION]X
   self.y [MENTION=24071]Sprite[/MENTION]Y+2
  elsif ( [MENTION=19010]Frame[/MENTION]/5).floor&1)==1 && @selected==2 # When targeted or damaged
   self.x [MENTION=24071]Sprite[/MENTION]X
   self.y [MENTION=24071]Sprite[/MENTION]Y+2
  else
   self.x [MENTION=24071]Sprite[/MENTION]X
   self.y [MENTION=24071]Sprite[/MENTION]Y
  end
 end
end 

def adjustBattleSpriteYBattle(sprite,species,index)
  ret=0
  metrics=load_data("Data/metrics.dat")
  if index==1 || index==3
   factor=metrics[1][species] # enemy Y
   factor-=metrics[2][species] # altitude (affects shadows)
   halfY=(sprite.bitmap && 
     !sprite.bitmap.disposed?) ? sprite.bitmap.height/2 : 64
   ret=factor*2+(64-halfY)
   ret+=16 if index==1
  else
   ret=(index==0) ? 96 : 112
   ret+=(metrics[0][species])*2
   halfY=(sprite.bitmap && 
     !sprite.bitmap.disposed?) ? sprite.bitmap.height/2 : 64
   ret+=(64-halfY)
  end
  return ret+(384-320)
end

def showShadow?(species)
  metrics=load_data("Data/metrics.dat")
  return metrics[2][species]>0
end



class PokeballSendOutAnimation
  SPRITESTEPS=10
  STARTZOOM=0.125

  def initialize(sprite,spritehash,pkmn,doublebattle)
    @disposed=false
    @ballused=pkmn.pokemon ? pkmn.pokemon.ballused : 0
    [MENTION=12671]pokemon[/MENTION]BattlerSprite=sprite
    [MENTION=12671]pokemon[/MENTION]BattlerSprite.visible=false
    [MENTION=12671]pokemon[/MENTION]BattlerSprite.color=Color.new(31*8,22*8,30*8)
    [MENTION=19050]poke[/MENTION]ballsprite=IconSprite.new(0,0,sprite.viewport)
    [MENTION=19050]poke[/MENTION]ballsprite.setBitmap(sprintf("Graphics/Pictures/ball%02d_0",@ballused))
    if doublebattle
      [MENTION=24071]Sprite[/MENTION]x=pkmn.index==1 ? 400 : 304
    else
      [MENTION=24071]Sprite[/MENTION]x=344
    end
    [MENTION=24071]Sprite[/MENTION]x+=Graphics.width-480
    [MENTION=24071]Sprite[/MENTION]y=120
    [MENTION=24071]Sprite[/MENTION]hash=spritehash
    [MENTION=19050]poke[/MENTION]ballsprite.x [MENTION=24071]Sprite[/MENTION]x-8
    [MENTION=19050]poke[/MENTION]ballsprite.y [MENTION=24071]Sprite[/MENTION]y-8
    [MENTION=28203]pkmn[/MENTION]=pkmn
    @endspritey=adjustBattleSpriteY(sprite,pkmn.species,pkmn.index)
    [MENTION=12804]Shadow[/MENTION]Y [MENTION=24071]Sprite[/MENTION]y+18 # from top
    [MENTION=12804]Shadow[/MENTION]X [MENTION=24071]Sprite[/MENTION]x-32 # from left
    [MENTION=12804]Shadow[/MENTION]Visible=showShadow?(pkmn.species)
    [MENTION=12804]Shadow[/MENTION]Y-=16 if doublebattle && pkmn.index==3
    @stepspritey= [MENTION=24071]Sprite[/MENTION]y-@endspritey)
    @zoomstep=(2.0-STARTZOOM)/SPRITESTEPS
    @animdone=false
    [MENTION=19010]Frame[/MENTION]=0
  end

  def disposed?
    return @disposed
  end

  def animdone?
    return @animdone
  end

  def dispose
    return if disposed?
    [MENTION=19050]poke[/MENTION]ballsprite.dispose
    @disposed=true
  end

  def update
    return if disposed?
      [MENTION=24071]Sprite[/MENTION]s["pokemon1"].update if @sprit
    [MENTION=19050]poke[/MENTION]ballsprite.update
    [MENTION=19010]Frame[/MENTION]+=1
    if [MENTION=19010]Frame[/MENTION]==2
      pbSEPlay("recall")
      [MENTION=19050]poke[/MENTION]ballsprite.setBitmap(sprintf("Graphics/Pictures/ball%02d_1",@ballused))
    end
    if [MENTION=19010]Frame[/MENTION]==4
      [MENTION=12671]pokemon[/MENTION]BattlerSprite.visible=true
      [MENTION=12671]pokemon[/MENTION]BattlerSprite.zoom_x=STARTZOOM
      [MENTION=12671]pokemon[/MENTION]BattlerSprite.zoom_y=STARTZOOM
      pbSpriteSetCenter [MENTION=12671]pokemon[/MENTION]BattlerSprite [MENTION=24071]Sprite[/MENTION]x [MENTION=24071]Sprite[/MENTION]y)
      pbPlayCry [MENTION=28203]pkmn[/MENTION].pokemon ? [MENTION=28203]pkmn[/MENTION].pokemon : [MENTION=28203]pkmn[/MENTION].species)
      [MENTION=19050]poke[/MENTION]ballsprite.setBitmap(sprintf("Graphics/Pictures/ball%02d_2",@ballused))
    end
    if [MENTION=19010]Frame[/MENTION]==8
      [MENTION=19050]poke[/MENTION]ballsprite.visible=false
    end
    if [MENTION=19010]Frame[/MENTION]>8 && [MENTION=19010]Frame[/MENTION]<=16
      color=Color.new(248,248,248,256-(16 [MENTION=19010]Frame[/MENTION])*32)
      [MENTION=24071]Sprite[/MENTION]hash["enemybase"].color=color
      [MENTION=24071]Sprite[/MENTION]hash["playerbase"].color=color   
      [MENTION=24071]Sprite[/MENTION]hash["battlebg"].color=color
    end
    if [MENTION=19010]Frame[/MENTION]>16 && [MENTION=19010]Frame[/MENTION]<=24
      color=Color.new(248,248,248,(24 [MENTION=19010]Frame[/MENTION])*32)
      [MENTION=12671]pokemon[/MENTION]BattlerSprite.color.alpha=(24 [MENTION=19010]Frame[/MENTION])*32
      [MENTION=24071]Sprite[/MENTION]hash["enemybase"].color=color
      [MENTION=24071]Sprite[/MENTION]hash["playerbase"].color=color   
      [MENTION=24071]Sprite[/MENTION]hash["battlebg"].color=color
    end
    if [MENTION=19010]Frame[/MENTION]>5 && [MENTION=12671]pokemon[/MENTION]BattlerSprite.zoom_x<2.0
      [MENTION=12671]pokemon[/MENTION]BattlerSprite.zoom_x+=@zoomstep
      [MENTION=12671]pokemon[/MENTION]BattlerSprite.zoom_y+=@zoomstep
      [MENTION=12671]pokemon[/MENTION]BattlerSprite.zoom_x=2.0 if [MENTION=12671]pokemon[/MENTION]BattlerSprite.zoom_x > 2.0
      [MENTION=12671]pokemon[/MENTION]BattlerSprite.zoom_y=2.0 if [MENTION=12671]pokemon[/MENTION]BattlerSprite.zoom_y > 2.0
      currentY [MENTION=24071]Sprite[/MENTION]y-(@stepspritey [MENTION=12671]pokemon[/MENTION]BattlerSprite.zoom_y)
      pbSpriteSetCenter [MENTION=12671]pokemon[/MENTION]BattlerSprite [MENTION=24071]Sprite[/MENTION]x,currentY)
      [MENTION=12671]pokemon[/MENTION]BattlerSprite.y=currentY
    end
    if [MENTION=12671]pokemon[/MENTION]BattlerSprite.color.alpha<=0 && [MENTION=12671]pokemon[/MENTION]BattlerSprite.zoom_x>=2.0
      @animdone=true
      if [MENTION=24071]Sprite[/MENTION]hash["shadow# [MENTION=28203]pkmn[/MENTION].index}"]
        [MENTION=24071]Sprite[/MENTION]hash["shadow# [MENTION=28203]pkmn[/MENTION].index}"].x [MENTION=12804]Shadow[/MENTION]X
        [MENTION=24071]Sprite[/MENTION]hash["shadow# [MENTION=28203]pkmn[/MENTION].index}"].y [MENTION=12804]Shadow[/MENTION]Y
        [MENTION=24071]Sprite[/MENTION]hash["shadow# [MENTION=28203]pkmn[/MENTION].index}"].visible [MENTION=12804]Shadow[/MENTION]Visible
      end
    end
  end
end



def pokeballThrow(ball,shakes,targetBattler)
  balltype=@battle.pbGetBallType(ball)
  oldvisible [MENTION=24071]Sprite[/MENTION]s["shadow#{targetBattler}"].visible
  [MENTION=24071]Sprite[/MENTION]s["shadow#{targetBattler}"].visible=false
  ball0=sprintf("Graphics/Pictures/ball%02d_0",balltype)
  ball1=sprintf("Graphics/Pictures/ball%02d_1",balltype)
  ball2=sprintf("Graphics/Pictures/ball%02d_2",balltype)
  # sprites
  spriteBall=IconSprite.new(0,0,@viewport)
  spriteBall.visible=false
  spritePoke [MENTION=24071]Sprite[/MENTION]s["pokemon#{targetBattler}"]
  # pictures
  pictureBall=PictureEx.new(0)
  picturePoke=PictureEx.new(0)
  pokeball=[Graphics.width-130,64]
  dims=[spritePoke.x,spritePoke.y]
  center=getSpriteCenter [MENTION=24071]Sprite[/MENTION]s["pokemon#{targetBattler}"])
  # starting positions
  pictureBall.moveVisible(1,true)
  pictureBall.moveName(1,ball0)
  pictureBall.moveOrigin(1,PictureOrigin::Center)
  pictureBall.moveXY(0,1,10,180)
  picturePoke.moveVisible(1,true)
  picturePoke.moveOrigin(1,PictureOrigin::Center)
  picturePoke.moveXY(0,1,center[0],center[1])
  # directives
  picturePoke.moveSE(1,"Audio/SE/throw")
  pictureBall.moveCurve(20,1,150,70,30+Graphics.width/2,10,Graphics.width-130,48)
  delay=pictureBall.totalDuration+2
  picturePoke.moveColor(10,delay,Color.new(31*8,22*8,30*8))
  delay=picturePoke.totalDuration
  picturePoke.moveSE(delay,"Audio/SE/recall")
  pictureBall.moveName(delay,ball1)
  pictureBall.moveName(delay+4,ball2)
  picturePoke.moveZoom(15,delay,0)
  picturePoke.moveXY(15,delay,pokeball[0],pokeball[1])
  picturePoke.moveSE(delay+10,"Audio/SE/jumptoball")
  picturePoke.moveVisible(delay+15,false)
  pictureBall.moveName(picturePoke.totalDuration+2,ball0)
  delay=picturePoke.totalDuration+6
  pictureBall.moveXY(15,delay,pokeball[0],128)
  pictureBall.moveSE(pictureBall.totalDuration,"Audio/SE/balldrop")
  pictureBall.moveXY(8,pictureBall.totalDuration+2,pokeball[0],80)
  pictureBall.moveXY(7,pictureBall.totalDuration+2,pokeball[0],128)
  pictureBall.moveSE(pictureBall.totalDuration,"Audio/SE/balldrop")
  pictureBall.moveXY(6,pictureBall.totalDuration+2,pokeball[0],96)
  pictureBall.moveXY(5,pictureBall.totalDuration+2,pokeball[0],128)
  pictureBall.moveSE(pictureBall.totalDuration,"Audio/SE/balldrop")
  pictureBall.moveXY(4,pictureBall.totalDuration+2,pokeball[0],112)
  pictureBall.moveXY(3,pictureBall.totalDuration+2,pokeball[0],128)
  pictureBall.moveSE(pictureBall.totalDuration,"Audio/SE/balldrop")
  picturePoke.moveXY(0,pictureBall.totalDuration,pokeball[0],128)
  delay=pictureBall.totalDuration+18 if shakes==0
  [shakes,3].min.times do
    delay=pictureBall.totalDuration+18
    pictureBall.moveSE(delay,"Audio/SE/ballshake")
    pictureBall.moveXY(4,delay,pokeball[0]-8,128)
    pictureBall.moveAngle(4,delay,20) # positive means counterclockwise
    delay=pictureBall.totalDuration
    pictureBall.moveXY(8,delay,pokeball[0]+8,128)
    pictureBall.moveAngle(8,delay,-20) # negative means clockwise
    delay=pictureBall.totalDuration
    pictureBall.moveXY(4,delay,pokeball[0],128)
    pictureBall.moveAngle(4,delay,0)
  end
  if shakes<4
    picturePoke.moveSE(delay,"Audio/SE/recall")
    pictureBall.moveName(delay,ball1)
    pictureBall.moveName(delay+4,ball2)
    pictureBall.moveVisible(delay+10,false)
    picturePoke.moveVisible(delay,true)
    picturePoke.moveZoom(15,delay,100)
    picturePoke.moveXY(15,delay,center[0],center[1])
    delay=picturePoke.totalDuration
    picturePoke.moveColor(10,delay,Color.new(31*8,22*8,30*8,0))
  end
  picturePoke.moveOrigin(picturePoke.totalDuration,PictureOrigin::TopLeft)
  picturePoke.moveXY(0,picturePoke.totalDuration,dims[0],dims[1])
  loop do
    pictureBall.update
    picturePoke.update
    setPictureIconSprite(spriteBall,pictureBall)
    setPictureSprite(spritePoke,picturePoke)
    pbGraphicsUpdate
    pbInputUpdate
    break if !pictureBall.running? && !picturePoke.running?
  end
  if shakes<4
    [MENTION=24071]Sprite[/MENTION]s["shadow#{targetBattler}"].visible=oldvisible
  end
  spriteBall.dispose
end







class PokeballPlayerSendOutAnimation # SACA TU POKéMON
#  Ball curve: 8,52; 22,44; 52, 96
#  Player: Color.new(16*8,23*8,30*8)
 SPRITESTEPS=10
 STARTZOOM=0.125
 def initialize(sprite,spritehash,pkmn,doublebattle)
  @disposed=false
  [MENTION=12671]pokemon[/MENTION]BattlerSprite=sprite
  [MENTION=28203]pkmn[/MENTION]=pkmn
  [MENTION=12671]pokemon[/MENTION]BattlerSprite.visible=false
  [MENTION=12671]pokemon[/MENTION]BattlerSprite.color=Color.new(16*8,23*8,30*8)
  [MENTION=24071]Sprite[/MENTION]hash=spritehash
  $tupkmn [MENTION=12671]pokemon[/MENTION]BattlerSprite
  [MENTION=12671]pokemon[/MENTION]BattlerSprite.z=99999
  @sumandoplayer = 814
  if doublebattle
   [MENTION=24071]Sprite[/MENTION]x=pkmn.index==0 ? 64 : 180
  else
   [MENTION=24071]Sprite[/MENTION]x=232+26
  end
  [MENTION=24071]Sprite[/MENTION]y=384-64+30
  @endspritey=adjustBattleSpriteYBattle [MENTION=12671]pokemon[/MENTION]BattlerSprite,
    pkmn.species,pkmn.index)
  @animdone=false
  [MENTION=26553]lol[/MENTION]sal = 0
  [MENTION=19010]Frame[/MENTION]=0
 end
 def disposed?
  return @disposed
 end
 def animdone?
  return @animdone
 end
 def dispose
  return if disposed?
  @disposed=true
 end
 def update
  return if disposed?
  [MENTION=19010]Frame[/MENTION]+=1
  
  if [MENTION=19010]Frame[/MENTION]==4
   [MENTION=12671]pokemon[/MENTION]BattlerSprite.visible=true
   [MENTION=12671]pokemon[/MENTION]BattlerSprite.zoom_x=STARTZOOM
   [MENTION=12671]pokemon[/MENTION]BattlerSprite.zoom_y=STARTZOOM
   pbSEPlay("recall")
   pbSpriteSetCenter [MENTION=12671]pokemon[/MENTION]BattlerSprite [MENTION=24071]Sprite[/MENTION]x [MENTION=24071]Sprite[/MENTION]y)
   pbPlayCry [MENTION=28203]pkmn[/MENTION].pokemon ? [MENTION=28203]pkmn[/MENTION].pokemon : [MENTION=28203]pkmn[/MENTION].species)
  end
  if [MENTION=19010]Frame[/MENTION]>8 && [MENTION=19010]Frame[/MENTION]<=16
   color=Color.new(248,248,248,256-(16 [MENTION=19010]Frame[/MENTION])*32)
   [MENTION=24071]Sprite[/MENTION]hash["enemybase"].color=color
   [MENTION=24071]Sprite[/MENTION]hash["playerbase"].color=color   
   [MENTION=24071]Sprite[/MENTION]hash["battlebg"].color=color
  end
  if [MENTION=19010]Frame[/MENTION]>16 && [MENTION=19010]Frame[/MENTION]<=24
   color=Color.new(248,248,248,(24 [MENTION=19010]Frame[/MENTION])*32)
   [MENTION=12671]pokemon[/MENTION]BattlerSprite.color.alpha=(24 [MENTION=19010]Frame[/MENTION])*32
   [MENTION=24071]Sprite[/MENTION]hash["enemybase"].color=color
   [MENTION=24071]Sprite[/MENTION]hash["playerbase"].color=color   
   [MENTION=24071]Sprite[/MENTION]hash["battlebg"].color=color
  end
  if [MENTION=19010]Frame[/MENTION]>5 && [MENTION=12671]pokemon[/MENTION]BattlerSprite.zoom_x<2.0
   [MENTION=12671]pokemon[/MENTION]BattlerSprite.zoom_x+=0.1
   [MENTION=12671]pokemon[/MENTION]BattlerSprite.zoom_y+=0.1
   [MENTION=12671]pokemon[/MENTION]BattlerSprite.zoom_x=2.0 if [MENTION=12671]pokemon[/MENTION]BattlerSprite.zoom_x > 2.0
   [MENTION=12671]pokemon[/MENTION]BattlerSprite.zoom_y=2.0 if [MENTION=12671]pokemon[/MENTION]BattlerSprite.zoom_y > 2.0
   pbSpriteSetCenter [MENTION=12671]pokemon[/MENTION]BattlerSprite [MENTION=24071]Sprite[/MENTION]x,0)
   [MENTION=12671]pokemon[/MENTION]BattlerSprite.y [MENTION=24071]Sprite[/MENTION]y+(@endspritey [MENTION=24071]Sprite[/MENTION]y) [MENTION=12671]pokemon[/MENTION]BattlerSprite.zoom_y
  end
  if [MENTION=12671]pokemon[/MENTION]BattlerSprite.color.alpha<=0 &&
     [MENTION=12671]pokemon[/MENTION]BattlerSprite.zoom_x>=2.0
   @animdone=true
   $canupdate5 = false
  [MENTION=26553]lol[/MENTION]sal +=1

if [MENTION=26553]lol[/MENTION]sal>=16
$esperahp = true 
end

if [MENTION=26553]lol[/MENTION]sal>=50
  
$enemybase.zoom_x+=0.125 if $enemybase.zoom_x != 2.0
$enemybase.zoom_y+=0.125 if $enemybase.zoom_x != 2.0
 
$enemybase.y+=2 if $enemybase.zoom_x != 2.0
$enemybase.x-=12 if $enemybase.zoom_x != 2.0

$playerbase.zoom_x+=0.125 if $playerbase.zoom_x != 3.0
$playerbase.zoom_y+=0.125 if $playerbase.zoom_y != 3.0

$playerbase.y+=16 if $playerbase.zoom_x != 3.0
$playerbase.x-=26 if $playerbase.zoom_x != 3.0
 
$pokemon1.zoom_x+=0.125 if $enemybase.zoom_x != 2.0
$pokemon1.zoom_y+=0.125 if $enemybase.zoom_x != 2.0

$pokemon1.y-=5.5 if $enemybase.zoom_x != 2.0
$pokemon1.x-=8.5 if $enemybase.zoom_x != 2.0
 [MENTION=12671]pokemon[/MENTION]BattlerSprite.x-=20 if [MENTION=12671]pokemon[/MENTION]BattlerSprite.zoom_x != 3.0 [MENTION=12671]pokemon[/MENTION]BattlerSprite.y+=10 if [MENTION=12671]pokemon[/MENTION]BattlerSprite.zoom_x != 3.0
 [MENTION=12671]pokemon[/MENTION]BattlerSprite.zoom_x+=0.125 if [MENTION=12671]pokemon[/MENTION]BattlerSprite.zoom_x != 3.0 [MENTION=12671]pokemon[/MENTION]BattlerSprite.zoom_y+=0.125 if [MENTION=12671]pokemon[/MENTION]BattlerSprite.zoom_x != 3.0

end

  end
 end
end

class TrainerFadeAnimation
  def initialize(sprites)
    [MENTION=19010]Frame[/MENTION]=0
    [MENTION=24071]Sprite[/MENTION]s=sprites
    @animdone=false
  end

  def animdone?
    return @animdone
  end

  def update
    return if @animdone
      [MENTION=24071]Sprite[/MENTION]s["pokemon1"].update if @sprit
    [MENTION=19010]Frame[/MENTION]+=1
    [MENTION=24071]Sprite[/MENTION]s["trainer"].x+=8
    [MENTION=24071]Sprite[/MENTION]s["trainer2"].x+=8 if [MENTION=24071]Sprite[/MENTION]s["trainer2"]
    [MENTION=24071]Sprite[/MENTION]s["partybase1"].x+=8
    [MENTION=24071]Sprite[/MENTION]s["partybase1"].opacity-=12
    for i in 0...6
      [MENTION=24071]Sprite[/MENTION]s["enemy#{i}"].opacity-=12
      [MENTION=24071]Sprite[/MENTION]s["enemy#{i}"].x+=8 if [MENTION=19010]Frame[/MENTION]>=i*4
    end
    @animdone=true if [MENTION=24071]Sprite[/MENTION]s["trainer"].x>=Graphics.width &&
       (  [MENTION=24071]Sprite[/MENTION]s["trainer2"]| [MENTION=24071]Sprite[/MENTION]s["trainer2"].x>=Graphics.width )
  end
end



class PlayerFadeAnimation
 def initialize(sprites)
  [MENTION=19010]Frame[/MENTION]=0
  [MENTION=24071]Sprite[/MENTION]s=sprites
  @animdone=false
  @salpokemon1 = 0
  @salpokemon2 = 0
  @salpokemon3 = 0
  @salpokemon4 = 0
  @salpokemon5 = 0
  [MENTION=24071]Sprite[/MENTION]s["playerbase"].zoom_y = 3.0
 end
 def animdone?
  return @animdone
 end
 def update
  return if @animdone
  
 [MENTION=24071]Sprite[/MENTION]s["enemybase"].zoom_x-=0.125 if [MENTION=24071]Sprite[/MENTION]s["enemybase"].zoom_x != 1.0 [MENTION=24071]Sprite[/MENTION]s["enemybase"].zoom_y-=0.125 if [MENTION=24071]Sprite[/MENTION]s["enemybase"].zoom_x != 1.0
  [MENTION=24071]Sprite[/MENTION]s["enemybase"].y-=2 if [MENTION=24071]Sprite[/MENTION]s["enemybase"].zoom_x != 1.0 [MENTION=24071]Sprite[/MENTION]s["enemybase"].x+=12 if [MENTION=24071]Sprite[/MENTION]s["enemybase"].zoom_x != 1.0
 [MENTION=24071]Sprite[/MENTION]s["playerbase"].zoom_x-=0.125 if [MENTION=24071]Sprite[/MENTION]s["playerbase"].zoom_x != 2.0 [MENTION=24071]Sprite[/MENTION]s["playerbase"].zoom_y-=0.125 if [MENTION=24071]Sprite[/MENTION]s["playerbase"].zoom_y != 2.0
 [MENTION=24071]Sprite[/MENTION]s["playerbase"].y-=16 if [MENTION=24071]Sprite[/MENTION]s["playerbase"].zoom_x != 2.0 [MENTION=24071]Sprite[/MENTION]s["playerbase"].x+=26 if [MENTION=24071]Sprite[/MENTION]s["playerbase"].zoom_x != 2.0
  [MENTION=24071]Sprite[/MENTION]s["pokemon1"].zoom_x-=0.125 if [MENTION=24071]Sprite[/MENTION]s["enemybase"].zoom_x != 1.0 [MENTION=24071]Sprite[/MENTION]s["pokemon1"].zoom_y-=0.125 if [MENTION=24071]Sprite[/MENTION]s["enemybase"].zoom_x != 1.0
 [MENTION=24071]Sprite[/MENTION]s["pokemon1"].y+=5.5 if [MENTION=24071]Sprite[/MENTION]s["enemybase"].zoom_x != 1.0 [MENTION=24071]Sprite[/MENTION]s["pokemon1"].x+=8.5 if [MENTION=24071]Sprite[/MENTION]s["enemybase"].zoom_x != 1.0

$pokemon1 = [MENTION=24071]Sprite[/MENTION]s["pokemon1"]

  [MENTION=19010]Frame[/MENTION]+=1
  [MENTION=24071]Sprite[/MENTION]s["player"].x-=8
  [MENTION=24071]Sprite[/MENTION]s["playerB"].x-=8 if [MENTION=24071]Sprite[/MENTION]s["playerB"]
  [MENTION=24071]Sprite[/MENTION]s["partybase2"].x-=8
  [MENTION=24071]Sprite[/MENTION]s["partybase2"].opacity-=12
  for i in 0...6
   if [MENTION=24071]Sprite[/MENTION]s["player#{i}"]
    [MENTION=24071]Sprite[/MENTION]s["player#{i}"].opacity-=12 
    [MENTION=24071]Sprite[/MENTION]s["player#{i}"].x-=8 if [MENTION=19010]Frame[/MENTION]>=i*4
   end
  end
  pa [MENTION=24071]Sprite[/MENTION]s["player"]
  pb [MENTION=24071]Sprite[/MENTION]s["playerB"]
  pawidth=128
  pbwidth=128
  if (pa && pa.bitmap && !pa.bitmap.disposed?)
   if pa.bitmap.height<pa.bitmap.width
    numframes=pa.bitmap.width/pa.bitmap.height # Number of frames
    pawidth=pa.bitmap.width/numframes # Width per frame
    [MENTION=24071]Sprite[/MENTION]s["player"].src_rect.x=pawidth*1 if [MENTION=19010]Frame[/MENTION]>0
    [MENTION=24071]Sprite[/MENTION]s["player"].src_rect.x=pawidth*2 if [MENTION=19010]Frame[/MENTION]>8
    [MENTION=24071]Sprite[/MENTION]s["player"].src_rect.x=pawidth*3 if [MENTION=19010]Frame[/MENTION]>11
    [MENTION=24071]Sprite[/MENTION]s["player"].src_rect.width=pawidth
   else
    pawidth=pa.bitmap.width
    [MENTION=24071]Sprite[/MENTION]s["player"].src_rect.x=0
    [MENTION=24071]Sprite[/MENTION]s["player"].src_rect.width=pawidth
   end
  end
  if (pb && pb.bitmap && !pb.bitmap.disposed?)
   if pb.bitmap.height<pb.bitmap.width
    numframes=pb.bitmap.width/pb.bitmap.height # Number of frames
    pbwidth=pb.bitmap.width/numframes # Width per frame
    [MENTION=24071]Sprite[/MENTION]s["playerB"].src_rect.x=pbwidth*1 if [MENTION=19010]Frame[/MENTION]>0
    [MENTION=24071]Sprite[/MENTION]s["playerB"].src_rect.x=pbwidth*2 if [MENTION=19010]Frame[/MENTION]>8
    [MENTION=24071]Sprite[/MENTION]s["playerB"].src_rect.x=pbwidth*3 if [MENTION=19010]Frame[/MENTION]>11
    [MENTION=24071]Sprite[/MENTION]s["playerB"].src_rect.width=pbwidth
   else
    pbwidth=pb.bitmap.width
    [MENTION=24071]Sprite[/MENTION]s["playerB"].src_rect.x=0
    [MENTION=24071]Sprite[/MENTION]s["playerB"].src_rect.width=pbwidth
   end
  end
  if pb
   @animdone=true if pb.x<=-pbwidth
  else
   @animdone=true if pa.x<=-pawidth
  end
 end
end




####################################################

class PokeBattle_Scene
  USECOMMANDBOX=false # If true, expects a file named Graphics/Pictures/commandbox.png
  USEFIGHTBOX=false # If true, expects a file named Graphics/Pictures/fightbox.png
  MESSAGEBASECOLOR=Color.new(255,255,255)
  MESSAGESHADOWCOLOR=Color.new(173,165,140)
  MENUBASECOLOR=Color.new(72,72,72)
  MENUSHADOWCOLOR=Color.new(208,208,208)
  BOXTEXTBASECOLOR=Color.new(64,64,64)
  BOXTEXTSHADOWCOLOR=Color.new(216,208,176)
  EXPCOLOR=Color.new(64,200,248)
# Green HP color
HPCOLORBASE1=Color.new(1,255,74)
HPCOLORSHADOW1=Color.new(0,189,33)
# Orange HP color
HPCOLORBASE2=Color.new(255,173,0)
HPCOLORSHADOW2=Color.new(165,132,41)
# Red HP color
HPCOLORBASE3=Color.new(255,66,115)
HPCOLORSHADOW3=Color.new(165,74,90)
# Blank HP color
HPCOLORBASE4=Color.new(49,49,49)
HPCOLORSHADOW4=Color.new(49,49,49)
# Position of HP gauge
  HPGAUGE_X=78
  HPGAUGE_Y=34
# Position of EXP gauge
  EXPGAUGE_X=46
  EXPGAUGE_Y=66
# Size of gauges
  EXPGAUGESIZE=160
  HPGAUGESIZE=96

  BLANK=0
  MESSAGEBOX=1
  COMMANDBOX=2
  FIGHTBOX=3

  attr_accessor :abortable

  def initialize
    @battle=nil
    @lastcmd=[0,0,0,0]
    @lastmove=[0,0,0,0]
    [MENTION=28203]pkmn[/MENTION]windows=[nil,nil,nil,nil]
    [MENTION=24071]Sprite[/MENTION]s={}
    @battlestart=true
    @messagemode=false
    @abortable=false
    @aborted=false
  end

  def pbUpdate
    partyAnimationUpdate
    [MENTION=24071]Sprite[/MENTION]s["battlebg"].update if [MENTION=24071]Sprite[/MENTION]s["battlebg"].respond_to?("update")
  end

  def pbGraphicsUpdate
    partyAnimationUpdate
    
  if $pokemon1
    #$pokemon1.update if $pokemon1.respond_to?("update")
  end
  
  if $tupkmn
    #$tupkmn.update if $tupkmn.respond_to?("update")
  end
  
    [MENTION=24071]Sprite[/MENTION]s["battlebg"].update if [MENTION=24071]Sprite[/MENTION]s["battlebg"].respond_to?("update")
    Graphics.update
  end

  def pbInputUpdate
    Input.update
    $mouse.visible
    $mouse.update
    if Input.trigger?(Input::B) && @abortable && !@aborted
      @aborted=true
      @battle.pbAbort
    end
  end

  def pbShowWindow(windowtype)
 [MENTION=24071]Sprite[/MENTION]s["messagebox"].visible=(windowtype==MESSAGEBOX||windowtype==COMMANDBOX||windowtype==FIGHTBOX||
    windowtype==BLANK)
 [MENTION=24071]Sprite[/MENTION]s["messagebox"].visible=false
 [MENTION=24071]Sprite[/MENTION]s["messagebox"].z=99999
 [MENTION=24071]Sprite[/MENTION]s["messagebox"].opacity=150
 [MENTION=24071]Sprite[/MENTION]s["messagewindow"].visible=(windowtype==MESSAGEBOX)
 [MENTION=24071]Sprite[/MENTION]s["messagewindow"].z=999999
 [MENTION=24071]Sprite[/MENTION]s["commandwindow"].visible=(windowtype==COMMANDBOX)
 [MENTION=24071]Sprite[/MENTION]s["fightwindow"].visible=(windowtype==FIGHTBOX)
  end

  def pbSetMessageMode(mode)
    @messagemode=mode
    msgwindow [MENTION=24071]Sprite[/MENTION]s["messagewindow"]
    if mode # Within Pokémon command
      msgwindow.baseColor=MENUBASECOLOR
      msgwindow.shadowColor=MENUSHADOWCOLOR
      msgwindow.opacity=255
      msgwindow.x=0
      msgwindow.width=Graphics.width
      msgwindow.height=96
      msgwindow.y=384-msgwindow.height
    else
      msgwindow.baseColor=MESSAGEBASECOLOR
      msgwindow.shadowColor=MESSAGESHADOWCOLOR
      msgwindow.opacity=0
      msgwindow.x=16
      msgwindow.width=Graphics.width-32
      msgwindow.height=96
      msgwindow.y=384-msgwindow.height
    end
  end

  def pbWaitMessage
    if @briefmessage
      pbShowWindow(MESSAGEBOX)
      cw [MENTION=24071]Sprite[/MENTION]s["messagewindow"]
      [MENTION=24071]Sprite[/MENTION]s["messagebox"].visible = true
      60.times do
        pbGraphicsUpdate
        pbInputUpdate
      end
      cw.text=""
      cw.visible=false
      @briefmessage=false
    end
  end

  def pbDisplayMessage(msg,brief=false)
    pbWaitMessage
    pbRefresh
    pbShowWindow(MESSAGEBOX)
    cw [MENTION=24071]Sprite[/MENTION]s["messagewindow"]
     [MENTION=24071]Sprite[/MENTION]s["messagebox"].visible = true
    cw.text=msg
    i=0
    loop do
      pbGraphicsUpdate
      pbInputUpdate
      cw.update
      if i==60
        cw.text=""
        cw.visible=false
        return
      end
      if Input.trigger?(Input::C) || @abortable
        if cw.pausing?
          pbPlayDecisionSE() if !@abortable
          cw.resume
        end
      end
      if !cw.busy?
        if brief
          @briefmessage=true
          return
        end
        i+=1
      end
    end
  end

  def pbDisplayPausedMessage(msg)
    pbWaitMessage
    pbRefresh
    pbShowWindow(MESSAGEBOX)
    if @messagemode
      @switchscreen.pbDisplay(msg)
      return
    end
    cw [MENTION=24071]Sprite[/MENTION]s["messagewindow"]
     [MENTION=24071]Sprite[/MENTION]s["messagebox"].visible = true
    cw.text=_ISPRINTF("{1:s}\1",msg)
    loop do
      pbGraphicsUpdate
      pbInputUpdate
      if Input.trigger?(Input::C) || @abortable
        if cw.busy?
          pbPlayDecisionSE() if cw.pausing? && !@abortable
          cw.resume
        else
          cw.text=""
          pbPlayDecisionSE()
          cw.visible=false if @messagemode
          return
        end
      end
      cw.update
    end
  end

  def pbDisplayConfirmMessage(msg)
    return pbShowCommands(msg,[_INTL("YES"),_INTL("NO")],1)==0
  end

  def pbShowCommands(msg,commands,defaultValue)
    pbWaitMessage
    pbRefresh
    pbShowWindow(MESSAGEBOX)
    dw [MENTION=24071]Sprite[/MENTION]s["messagewindow"]
    dw.text=msg
    cw = Window_CommandPokemon.new(commands)
    cw.x=Graphics.width-cw.width
    cw.y=384-cw.height-dw.height
    cw.index=0
    cw.viewport=@viewport
    pbRefresh
    loop do
      cw.visible=!dw.busy?
      pbGraphicsUpdate
      pbInputUpdate
      pbFrameUpdate(cw)
      dw.update
      if Input.trigger?(Input::B) && defaultValue>=0
        if dw.busy?
          pbPlayDecisionSE() if dw.pausing?
          dw.resume
        else
          cw.dispose
          dw.text=""
          return defaultValue
        end
      end
      if Input.trigger?(Input::C)
        if dw.busy?
          pbPlayDecisionSE() if dw.pausing?
          dw.resume
        else
          cw.dispose
          dw.text=""
          return cw.index
        end
      end
    end
  end

  def pbFrameUpdate(cw)
    cw.update if cw
    for i in 0..3
      if [MENTION=24071]Sprite[/MENTION]s["battler#{i}"]
        [MENTION=24071]Sprite[/MENTION]s["battler#{i}"].update
      end
      if [MENTION=24071]Sprite[/MENTION]s["pokemon#{i}"]
        [MENTION=24071]Sprite[/MENTION]s["pokemon#{i}"].update
      end
    end
  end

  def pbRefresh
    for i in 0..3
      if [MENTION=24071]Sprite[/MENTION]s["battler#{i}"]
        [MENTION=24071]Sprite[/MENTION]s["battler#{i}"].refresh
      end
    end
  end

  def pbAddSprite(id,x,y,filename,viewport)
    sprite=IconSprite.new(x,y,viewport)
    if filename
      sprite.setBitmap(filename) rescue nil
    end
    [MENTION=24071]Sprite[/MENTION]s[id]=sprite
    return sprite
  end

  def pbAddPlane(id,filename,viewport)
    sprite=AnimatedPlane.new(viewport)
    if filename
      sprite.setBitmap(filename)
    end
    [MENTION=24071]Sprite[/MENTION]s[id]=sprite
    return sprite
  end

  def pbDisposeSprites
    pbDisposeSpriteHash [MENTION=24071]Sprite[/MENTION]s)
  end

  def pbBeginCommandPhase
    # Called whenever a new round begins.
    @battlestart=false
  end

  def pbShowOpponent(index)
    if @battle.opponent
      if @battle.opponent.is_a?(Array)
        trainerfile=sprintf("Graphics/Characters/trainer%03d",@battle.opponent[index].trainertype)
      else
        trainerfile=sprintf("Graphics/Characters/trainer%03d",@battle.opponent.trainertype)
      end
    else
      trainerfile="Graphics/Characters/trfront"
    end
    pbAddSprite("trainer",Graphics.width,16,trainerfile,@viewport)
    if [MENTION=24071]Sprite[/MENTION]s["trainer"].bitmap
      [MENTION=24071]Sprite[/MENTION]s["trainer"].y- [MENTION=24071]Sprite[/MENTION]s["trainer"].bitmap.height-128
    end
    20.times do
      pbGraphicsUpdate
      pbInputUpdate
      [MENTION=24071]Sprite[/MENTION]s["trainer"].x-=6
    end
  end

  def pbHideOpponent
    20.times do
      pbGraphicsUpdate
      pbInputUpdate
      [MENTION=24071]Sprite[/MENTION]s["trainer"].x+=6
    end
  end

  def pbShowHelp(text)
    [MENTION=24071]Sprite[/MENTION]s["helpwindow"].resizeToFit(text,Graphics.width)
    [MENTION=24071]Sprite[/MENTION]s["helpwindow"].y=0
    [MENTION=24071]Sprite[/MENTION]s["helpwindow"].x=0
    [MENTION=24071]Sprite[/MENTION]s["helpwindow"].text=text
    [MENTION=24071]Sprite[/MENTION]s["helpwindow"].visible=true
  end

  def pbHideHelp
    [MENTION=24071]Sprite[/MENTION]s["helpwindow"].visible=false
  end

  def pbBackdrop
    outdoor=false
    if $game_map && pbGetMetadata($game_map.map_id,MetadataOutdoor)
      outdoor=true
    end
    case @battle.environment
      when PBEnvironment::Grass
        id=1
      when PBEnvironment::TallGrass
        id=2
      when PBEnvironment::MovingWater
        id=3
      when PBEnvironment::StillWater
        id=4
      when PBEnvironment::Underwater
        id=5
      when PBEnvironment::Rock
        id=7
      when PBEnvironment::Cave
        id=8
      when PBEnvironment::Sand
        id=9
      else
        id=(outdoor) ? 0 : 6
    end
    if $PokemonGlobal && $PokemonGlobal.nextBattleBack
      id=$PokemonGlobal.nextBattleBack
    elsif $game_map
      back=pbGetMetadata($game_map.map_id,MetadataBattleBack)
      if back && back!=""
        id=pbGetMetadata($game_map.map_id,MetadataBattleBack)
      end
    end

    battlebg="Graphics/Battlebacks/battlebg#{id}"
    bases="Graphics/Battlebacks/base#{id}"

    pbAddPlane("battlebg",battlebg,@viewport)
    pbAddSprite("enemybase",100,210,bases,@viewport) # ends at (224,96)
    pbAddSprite("playerbase",-544,500,bases,@viewport) # ends at (0,192)
    [MENTION=24071]Sprite[/MENTION]s["enemybase"].z=-1 # For compatibility with RGSS2
    [MENTION=24071]Sprite[/MENTION]s["playerbase"].z=-1 # For compatibility with RGSS2
    [MENTION=24071]Sprite[/MENTION]s["battlebg"].z=-1 # For compatibility with RGSS2
    
    [MENTION=24071]Sprite[/MENTION]s["enemybase"].zoom_x = 3.0
    [MENTION=24071]Sprite[/MENTION]s["enemybase"].zoom_y = 3.6
    
    [MENTION=24071]Sprite[/MENTION]s["playerbase"].zoom_x = 3.0
    [MENTION=24071]Sprite[/MENTION]s["playerbase"].zoom_y = 3.9
    
    [MENTION=24071]Sprite[/MENTION]s["battlebg"].zoom_x = 3.0
    [MENTION=24071]Sprite[/MENTION]s["battlebg"].zoom_y = 3.0
    
=begin
    if outdoor
      tone = $HourlyTones[Time.now.hour]
      [MENTION=24071]Sprite[/MENTION]s["battlebg"].tone=tone
      [MENTION=24071]Sprite[/MENTION]s["enemybase"].tone=tone
      [MENTION=24071]Sprite[/MENTION]s["playerbase"].tone=tone
    end
=end
  end

  def inPartyAnimation?
    return @enablePartyAnim && @partyAnimPhase<4
  end

  def partyAnimationUpdate
    return if !inPartyAnimation?
    if @partyAnimPhase==0
      [MENTION=24071]Sprite[/MENTION]s["partybase1"].x+=16
      [MENTION=24071]Sprite[/MENTION]s["partybase2"].x-=16
      @partyAnimPhase=1 if [MENTION=24071]Sprite[/MENTION]s["partybase1"].x [MENTION=24071]Sprite[/MENTION]s["partybase1"].bitmap.width>=208
      return
    end
    if @partyAnimPhase==1
      @enemyendpos=152
      @playerendpos=312
      @partyAnimPhase=2
      @partyAnimI=0
    end
    if @partyAnimPhase==2
      if @partyAnimI>=6
        @partyAnimPhase=4
        return
      end
      if @partyAnimI>=@battle.party2.length || !@battle.party2[@partyAnimI]
        pbAddSprite("enemy#{@partyAnimI}",-28,64,
           "Graphics/Pictures/ballempty",@viewport)
      elsif @battle.party2[@partyAnimI].hp<=0 || @battle.party2[@partyAnimI].status>0 ||
         @battle.party2[@partyAnimI].egg?
        pbAddSprite("enemy#{@partyAnimI}",-28,64,
           "Graphics/Pictures/ballfainted",@viewport)
      else
        pbAddSprite("enemy#{@partyAnimI}",-28,64,
           "Graphics/Pictures/ballnormal",@viewport)
      end
      if @partyAnimI==@battle.party1.length || !@battle.party1[@partyAnimI]
        pbAddSprite("player#{@partyAnimI}",Graphics.width+12,176+@yoffset,
           "Graphics/Pictures/ballempty",@viewport)
      elsif @battle.party1[@partyAnimI].hp<=0 || @battle.party1[@partyAnimI].status>0 ||
         @battle.party1[@partyAnimI].egg?
        pbAddSprite("player#{@partyAnimI}",Graphics.width+12,176+@yoffset,
           "Graphics/Pictures/ballfainted",@viewport)
      else
        pbAddSprite("player#{@partyAnimI}",Graphics.width+12,176+@yoffset,
           "Graphics/Pictures/ballnormal",@viewport)
      end
      @partyAnimPhase=3
    end
    if @partyAnimPhase==3
      [MENTION=24071]Sprite[/MENTION]s["enemy#{@partyAnimI}"].x+=20
      [MENTION=24071]Sprite[/MENTION]s["player#{@partyAnimI}"].x-=20 
      if [MENTION=24071]Sprite[/MENTION]s["enemy#{@partyAnimI}"].x>=@enemyendpos
        @partyAnimPhase=2
        @partyAnimI+=1
        @enemyendpos-=20
        @playerendpos+=20
      end
    end
  end

  def pbStartBattle(battle)
    # Called whenever the battle begins
    @battle=battle
    @lastcmd=[0,0,0,0]
    @lastmove=[0,0,0,0]
    [MENTION=24071]Sprite[/MENTION]s.clear
    [MENTION=24071]Sprite[/MENTION]s.clear
    @viewport=Viewport.new(0,0,Graphics.width,Graphics.height)
    @viewport.z=99999
    
    @viewport3=Viewport.new(0,0,Graphics.width,Graphics.height)
    @viewport3.z=99999999
    
   # @viewport.rect.y=0
   # @viewport.rect.height=384
    
    @viewport2=Viewport.new(0,384,Graphics.width,0)
    @viewport2.z=999999
    
    @viewport2.rect.y=400
    @viewport2.rect.height=384

    @battleboxvp=Viewport.new(0,0,Graphics.width,384)
    @battleboxvp.z=99999
    @showingplayer=true
    @showingenemy=true
    @yoffset=(384-320)
    
    [MENTION=24071]Sprite[/MENTION]s["battlebg2"] = Sprite.new(@viewport)
    [MENTION=24071]Sprite[/MENTION]s["battlebg2"].bitmap=RPG::Cache.picture("battleballbg")
    [MENTION=24071]Sprite[/MENTION]s["battlebg2"].y = 400
    
    @tpb = 0
    @tpb9 = 0
    
    pbBackdrop
    pbAddSprite("partybase1",-400,80,"Graphics/Pictures/pbarrow",@viewport)
    pbAddSprite("partybase2",Graphics.width,192+@yoffset,"Graphics/Pictures/pbarrow",@viewport)
    [MENTION=24071]Sprite[/MENTION]s["partybase2"].mirror=true
    [MENTION=24071]Sprite[/MENTION]s["partybase1"].visible=false
    [MENTION=24071]Sprite[/MENTION]s["partybase2"].visible=false
    $enemybase = [MENTION=24071]Sprite[/MENTION]s["enemybase"]
    $playerbase = [MENTION=24071]Sprite[/MENTION]s["playerbase"]
    if @battle.opponent
      if @battle.opponent.is_a?(Array)
        trainerfile=sprintf("Graphics/Characters/trainer%03d",@battle.opponent[0].trainertype)
        pbAddSprite("trainer",-144,16,trainerfile,@viewport)
        trainerfile=sprintf("Graphics/Characters/trainer%03d",@battle.opponent[1].trainertype)
        pbAddSprite("trainer2",-240,16,trainerfile,@viewport)
      else
        trainerfile=sprintf("Graphics/Characters/trainer%03d",@battle.opponent.trainertype)
        pbAddSprite("trainer",-192,16,trainerfile,@viewport)
      end
    else
      trainerfile="Graphics/Characters/trfront"
      pbAddSprite("trainer",-192,16,trainerfile,@viewport)
    end
    if [MENTION=24071]Sprite[/MENTION]s["trainer"].bitmap
      [MENTION=24071]Sprite[/MENTION]s["trainer"].y- [MENTION=24071]Sprite[/MENTION]s["trainer"].bitmap.height-128
    end
    if [MENTION=24071]Sprite[/MENTION]s["trainer2"] && [MENTION=24071]Sprite[/MENTION]s["trainer2"].bitmap
      [MENTION=24071]Sprite[/MENTION]s["trainer2"].y- [MENTION=24071]Sprite[/MENTION]s["trainer2"].bitmap.height-128
    end
    [MENTION=24071]Sprite[/MENTION]s["shadow0"]=IconSprite.new(0,0,@viewport)
    pbAddSprite("shadow1",0,0,"Graphics/Pictures/enemyshadow",@viewport)
    [MENTION=24071]Sprite[/MENTION]s["shadow1"].visible=false
    [MENTION=24071]Sprite[/MENTION]s["pokemon0"]=PokemonBattlerSprite.new(battle.doublebattle,0,@viewport)
    [MENTION=24071]Sprite[/MENTION]s["pokemon1"]=PokemonBattlerSprite.new(battle.doublebattle,1,@viewport)
    if battle.doublebattle
      pbAddSprite("shadow3",0,0,"Graphics/Pictures/enemyshadow",@viewport)
      [MENTION=24071]Sprite[/MENTION]s["shadow3"].visible=false
      [MENTION=24071]Sprite[/MENTION]s["shadow2"]=IconSprite.new(0,0,@viewport)
      [MENTION=24071]Sprite[/MENTION]s["pokemon3"]=PokemonBattlerSprite.new(battle.doublebattle,3,@viewport)
      [MENTION=24071]Sprite[/MENTION]s["pokemon2"]=PokemonBattlerSprite.new(battle.doublebattle,2,@viewport)
    end
    [MENTION=24071]Sprite[/MENTION]s["battler0"]=PokemonDataBox.new(battle.battlers[0],battle.doublebattle,@viewport)
    [MENTION=24071]Sprite[/MENTION]s["battler1"]=PokemonDataBox.new(battle.battlers[1],battle.doublebattle,@viewport)
    if battle.doublebattle
      [MENTION=24071]Sprite[/MENTION]s["battler2"]=PokemonDataBox.new(battle.battlers[2],battle.doublebattle,@viewport)
      [MENTION=24071]Sprite[/MENTION]s["battler3"]=PokemonDataBox.new(battle.battlers[3],battle.doublebattle,@viewport)
    end
    if @battle.player.is_a?(Array)
      trainerfile=sprintf("Graphics/Characters/trback%03d",@battle.player[0].trainertype)
      pbAddSprite("player",Graphics.width+96-48,96+@yoffset,trainerfile,@viewport)
      trainerfile=sprintf("Graphics/Characters/trback%03d",@battle.player[1].trainertype)
      pbAddSprite("playerB",Graphics.width+96+48,96+@yoffset,trainerfile,@viewport)
      if [MENTION=24071]Sprite[/MENTION]s["player"].bitmap
        if [MENTION=24071]Sprite[/MENTION]s["player"].bitmap.width [MENTION=24071]Sprite[/MENTION]s["player"].bitmap.height
          [MENTION=24071]Sprite[/MENTION]s["player"].src_rect.x=0
          [MENTION=24071]Sprite[/MENTION]s["player"].src_rect.width [MENTION=24071]Sprite[/MENTION]s["player"].bitmap.width/5
        end
      end
      if [MENTION=24071]Sprite[/MENTION]s["playerB"].bitmap
        if [MENTION=24071]Sprite[/MENTION]s["playerB"].bitmap.width [MENTION=24071]Sprite[/MENTION]s["playerB"].bitmap.height
          [MENTION=24071]Sprite[/MENTION]s["playerB"].src_rect.x=0
          [MENTION=24071]Sprite[/MENTION]s["playerB"].src_rect.width [MENTION=24071]Sprite[/MENTION]s["playerB"].bitmap.width/5
        end
      end
    else
      trainerfile=sprintf("Graphics/Characters/trback%03d",@battle.player.trainertype)
      pbAddSprite("player",Graphics.width+96,96+@yoffset,trainerfile,@viewport)
      if [MENTION=24071]Sprite[/MENTION]s["player"].bitmap
        if [MENTION=24071]Sprite[/MENTION]s["player"].bitmap.width [MENTION=24071]Sprite[/MENTION]s["player"].bitmap.height
          [MENTION=24071]Sprite[/MENTION]s["player"].src_rect.x=0
          [MENTION=24071]Sprite[/MENTION]s["player"].src_rect.width [MENTION=24071]Sprite[/MENTION]s["player"].bitmap.width/5
        end
      end
    end
    pbAddSprite("messagebox",0,384-90,"Graphics/Pictures/messagebox",@viewport)
    [MENTION=24071]Sprite[/MENTION]s["helpwindow"]=Window_UnformattedTextPokemon.newWithSize("",0,0,32,32,@viewport)
    [MENTION=24071]Sprite[/MENTION]s["helpwindow"].visible=false
    [MENTION=24071]Sprite[/MENTION]s["messagewindow"]=Window_AdvancedTextPokemon.new("")
    [MENTION=24071]Sprite[/MENTION]s["commandwindow"]=CommandMenuDisplay.new(@viewport)
    [MENTION=24071]Sprite[/MENTION]s["fightwindow"]=FightMenuDisplay.new(nil,@viewport)
    [MENTION=24071]Sprite[/MENTION]s["messagewindow"].letterbyletter=true
    [MENTION=24071]Sprite[/MENTION]s["messagewindow"].viewport=@viewport
    
  
 [MENTION=24071]Sprite[/MENTION]s["messagebox"].z=99999
 [MENTION=24071]Sprite[/MENTION]s["messagewindow"].z=999999
 [MENTION=24071]Sprite[/MENTION]s["commandwindow"].z=999999
 [MENTION=24071]Sprite[/MENTION]s["fightwindow"].z=999999
    pbShowWindow(MESSAGEBOX)
    pbSetMessageMode(false)
    trainersprite1 [MENTION=24071]Sprite[/MENTION]s["trainer"]
    trainersprite2 [MENTION=24071]Sprite[/MENTION]s["trainer2"]
    if !@battle.opponent
      $batallasalvaje = true
      [MENTION=24071]Sprite[/MENTION]s["trainer"].visible=false
      if @battle.party2.length>=1
        [MENTION=24071]Sprite[/MENTION]s["pokemon1"].color=Color.new(0,0,0,128)
        [MENTION=24071]Sprite[/MENTION]s["pokemon1"].setPokemonBitmap(@battle.party2[0],false)
        [MENTION=24071]Sprite[/MENTION]s["pokemon1"].x=180-40 # ends at 144*2
        [MENTION=24071]Sprite[/MENTION]s["pokemon1"].zoom_x = 3.0
        [MENTION=24071]Sprite[/MENTION]s["pokemon1"].zoom_y = 3.0
        [MENTION=24071]Sprite[/MENTION]s["shadow1"].x=-192+16*2
        [MENTION=24071]Sprite[/MENTION]s["shadow1"].y=65*2
        species=@battle.party2[0].species
        [MENTION=24071]Sprite[/MENTION]s["pokemon1"].visible=true
        [MENTION=24071]Sprite[/MENTION]s["shadow1"].visible=showShadow?(species)
        pbPositionPokemonSprite(
           [MENTION=24071]Sprite[/MENTION]s["pokemon1"] [MENTION=24071]Sprite[/MENTION]s["pokemon1"].x [MENTION=24071]Sprite[/MENTION]s["pokemon1"].y
        )
        [MENTION=24071]Sprite[/MENTION]s["pokemon1"].y=adjustBattleSpriteY(
           [MENTION=24071]Sprite[/MENTION]s["pokemon1"],species,1)+10
        trainersprite1 [MENTION=24071]Sprite[/MENTION]s["pokemon1"]
        
    if [MENTION=24071]Sprite[/MENTION]s["pokemon1"]
      
    [MENTION=24071]Sprite[/MENTION]s["wildshadow"]=Sprite.new(@viewport)
    [MENTION=24071]Sprite[/MENTION]s["wildshadow"].bitmap [MENTION=24071]Sprite[/MENTION]s["pokemon1"].bitmap
    [MENTION=24071]Sprite[/MENTION]s["wildshadow"].y [MENTION=24071]Sprite[/MENTION]s["pokemon1"].y*3+20
    [MENTION=24071]Sprite[/MENTION]s["wildshadow"].x [MENTION=24071]Sprite[/MENTION]s["pokemon1"].x+10
    [MENTION=24071]Sprite[/MENTION]s["wildshadow"].zoom_y [MENTION=24071]Sprite[/MENTION]s["pokemon1"].zoom_y/3
    [MENTION=24071]Sprite[/MENTION]s["wildshadow"].zoom_x [MENTION=24071]Sprite[/MENTION]s["pokemon1"].zoom_x
    [MENTION=24071]Sprite[/MENTION]s["wildshadow"].tone=Tone.new(-255,-255,-255,-255)
    [MENTION=24071]Sprite[/MENTION]s["wildshadow"].opacity=0
    [MENTION=24071]Sprite[/MENTION]s["wildshadow"].z [MENTION=24071]Sprite[/MENTION]s["pokemon1"].z-1
    [MENTION=24071]Sprite[/MENTION]s["wildshadow"].angle=-10
    
  end
  
      end
      if @battle.party2.length==2
        [MENTION=24071]Sprite[/MENTION]s["pokemon1"].color=Color.new(0,0,0,160)
        [MENTION=24071]Sprite[/MENTION]s["pokemon3"].color=Color.new(0,0,0,160)
        [MENTION=24071]Sprite[/MENTION]s["pokemon1"].x=-144
        [MENTION=24071]Sprite[/MENTION]s["shadow1"].x=-144+16*2
        [MENTION=24071]Sprite[/MENTION]s["pokemon1"].y+=8
        [MENTION=24071]Sprite[/MENTION]s["shadow1"].y=65*2+8
        [MENTION=24071]Sprite[/MENTION]s["pokemon3"].setPokemonBitmap(@battle.party2[1],false)
        [MENTION=24071]Sprite[/MENTION]s["pokemon3"].x=-240
        [MENTION=24071]Sprite[/MENTION]s["shadow3"].x=-240+16*2
        [MENTION=24071]Sprite[/MENTION]s["shadow3"].y=65*2
        species=@battle.party2[1].species
        [MENTION=24071]Sprite[/MENTION]s["pokemon3"].visible=true
        [MENTION=24071]Sprite[/MENTION]s["shadow3"].visible=showShadow?(species)
        pbPositionPokemonSprite(
           [MENTION=24071]Sprite[/MENTION]s["pokemon3"] [MENTION=24071]Sprite[/MENTION]s["pokemon3"].x [MENTION=24071]Sprite[/MENTION]s["pokemon3"].y
        )
        [MENTION=24071]Sprite[/MENTION]s["pokemon3"].y=adjustBattleSpriteY(
           [MENTION=24071]Sprite[/MENTION]s["pokemon3"],species,3)
        trainersprite2 [MENTION=24071]Sprite[/MENTION]s["pokemon3"]
      end
    end
    loop do

      appearspeed=4
      @tpb += 1
      pbGraphicsUpdate
      pbInputUpdate

if @tpb >= 20
   [MENTION=24071]Sprite[/MENTION]s["pokemon1"].zoom_x -= 0.125 if [MENTION=24071]Sprite[/MENTION]s["pokemon1"].zoom_x != 2.0 [MENTION=24071]Sprite[/MENTION]s["pokemon1"].zoom_y = [MENTION=24071]Sprite[/MENTION]s["pokemon1"].zoom_x 
 [MENTION=24071]Sprite[/MENTION]s["wildshadow"].zoom_y = [MENTION=24071]Sprite[/MENTION]s["pokemon1"].zoom_y/3 [MENTION=24071]Sprite[/MENTION]s["wildshadow"].zoom_x = [MENTION=24071]Sprite[/MENTION]s["pokemon1"].zoom_x 
 [MENTION=24071]Sprite[/MENTION]s["enemybase"].zoom_x -= 0.125 if [MENTION=24071]Sprite[/MENTION]s["enemybase"].zoom_x != 2.0 [MENTION=24071]Sprite[/MENTION]s["enemybase"].zoom_y = [MENTION=24071]Sprite[/MENTION]s["enemybase"].zoom_x 
 [MENTION=24071]Sprite[/MENTION]s["battlebg"].zoom_x -= 0.125 if [MENTION=24071]Sprite[/MENTION]s["enemybase"].zoom_x != 2.0 [MENTION=24071]Sprite[/MENTION]s["battlebg"].zoom_y = [MENTION=24071]Sprite[/MENTION]s["battlebg"].zoom_x 
 [MENTION=24071]Sprite[/MENTION]s["enemybase"].x += 20 if [MENTION=24071]Sprite[/MENTION]s["enemybase"].zoom_x != 2.0 [MENTION=24071]Sprite[/MENTION]s["enemybase"].y -= 10 if [MENTION=24071]Sprite[/MENTION]s["enemybase"].zoom_x != 2.0
 [MENTION=24071]Sprite[/MENTION]s["playerbase"].x += 68  if [MENTION=24071]Sprite[/MENTION]s["enemybase"].zoom_x != 2.0 [MENTION=24071]Sprite[/MENTION]s["playerbase"].y -= 30 if [MENTION=24071]Sprite[/MENTION]s["enemybase"].zoom_x != 2.0
 [MENTION=24071]Sprite[/MENTION]s["pokemon1"].x += 17 if [MENTION=24071]Sprite[/MENTION]s["pokemon1"].zoom_x != 2.0 [MENTION=24071]Sprite[/MENTION]s["pokemon1"].y -= 5 if [MENTION=24071]Sprite[/MENTION]s["pokemon1"].zoom_x != 2.0
 [MENTION=24071]Sprite[/MENTION]s["wildshadow"].y = [MENTION=24071]Sprite[/MENTION]s["pokemon1"].y*3+20 [MENTION=24071]Sprite[/MENTION]s["wildshadow"].x = [MENTION=24071]Sprite[/MENTION]s["pokemon1"].x+20
end

      break if @tpb == 48
      
    end
    # Show shiny animation
    if !@battle.opponent
      pbPlayCry(@battle.party2[0])
      if @battle.party2[0].isShiny?
        pbCommonAnimation("Shiny",@battle.battlers[1],nil)
      end
      if @battle.party2.length==2
        if @battle.party2[1].isShiny?
          pbCommonAnimation("Shiny",@battle.battlers[3],nil)
        end
      end
    end
    if @battle.opponent
      @enablePartyAnim=true
      @partyAnimPhase=0
      [MENTION=24071]Sprite[/MENTION]s["partybase1"].visible=true
      [MENTION=24071]Sprite[/MENTION]s["partybase2"].visible=true
    else
      [MENTION=24071]Sprite[/MENTION]s["battler1"].appear
      [MENTION=24071]Sprite[/MENTION]s["battler3"].appear if @battle.party2.length==2 
      appearing=true
      begin
        pbGraphicsUpdate
        pbInputUpdate
        [MENTION=24071]Sprite[/MENTION]s["battler1"].update
        appearing [MENTION=24071]Sprite[/MENTION]s["battler1"].appearing
        [MENTION=24071]Sprite[/MENTION]s["pokemon1"].color.alpha-=16
        [MENTION=24071]Sprite[/MENTION]s["pokemon1"].color [MENTION=24071]Sprite[/MENTION]s["pokemon1"].color
        if @battle.party2.length==2 
          [MENTION=24071]Sprite[/MENTION]s["battler3"].update
          [MENTION=24071]Sprite[/MENTION]s["pokemon3"].color.alpha-=16
          [MENTION=24071]Sprite[/MENTION]s["pokemon3"].color [MENTION=24071]Sprite[/MENTION]s["pokemon3"].color
          appearing=(appearing| [MENTION=24071]Sprite[/MENTION]s["battler3"].appearing)
        end
      end while appearing
    end
  end

  def pbEndBattle(result)
    @abortable=false
    pbShowWindow(BLANK)
    # Fade out all sprites
    pbBGMFade(2.0)
    pbFadeOutAndHide [MENTION=24071]Sprite[/MENTION]s)
    pbDisposeSprites
  end

  def pbRecall(battlerindex)
    @briefmessage=false
    if @battle.pbIsOpposing?(battlerindex)
      [MENTION=24071]Sprite[/MENTION]s["shadow#{battlerindex}"].visible=false
    else
      spritePoke [MENTION=24071]Sprite[/MENTION]s["pokemon#{battlerindex}"]
      picturePoke=PictureEx.new(0)
      dims=[spritePoke.x,spritePoke.y]
      center=getSpriteCenter(spritePoke)
      # starting positions
      picturePoke.moveVisible(1,true)
      picturePoke.moveOrigin(1,PictureOrigin::Center)
      picturePoke.moveXY(0,1,center[0],center[1])
      # directives
      picturePoke.moveColor(10,1,Color.new(16*8,23*8,30*8))
      delay=picturePoke.totalDuration
      picturePoke.moveSE(delay,"Audio/SE/recall")
      picturePoke.moveZoom(15,delay,0)
      picturePoke.moveXY(15,delay,center[0],384-80)
      picturePoke.moveVisible(picturePoke.totalDuration,false)
      picturePoke.moveColor(0,picturePoke.totalDuration,Color.new(0,0,0,0))
      picturePoke.moveOrigin(picturePoke.totalDuration,PictureOrigin::TopLeft)
      loop do
        picturePoke.update
        setPictureSprite(spritePoke,picturePoke)
        pbGraphicsUpdate
        pbInputUpdate
        break if !picturePoke.running?
      end
    end
  end

  def pbTrainerSendOut(battlerindex,pkmn)
    @briefmessage=false
    fadeanim=nil
    while inPartyAnimation?; end
    if @showingenemy
      fadeanim=TrainerFadeAnimation.new [MENTION=24071]Sprite[/MENTION]s)
    end
    frame=0
    [MENTION=24071]Sprite[/MENTION]s["pokemon#{battlerindex}"].setPokemonBitmap(pkmn,false)
    sendout=PokeballSendOutAnimation.new [MENTION=24071]Sprite[/MENTION]s["pokemon#{battlerindex}"],
       [MENTION=24071]Sprite[/MENTION]s,@battle.battlers,@battle.doublebattle)
    loop do
      pbGraphicsUpdate
      pbInputUpdate
      fadeanim.update if fadeanim
      frame+=1    
      if frame==1
        [MENTION=24071]Sprite[/MENTION]s["battler#{battlerindex}"].appear
      end
      if frame>=10
        sendout.update
      end
      [MENTION=24071]Sprite[/MENTION]s["battler#{battlerindex}"].update
      break if (!fadeanim || fadeanim.animdone?) && sendout.animdone? &&
          [MENTION=24071]Sprite[/MENTION]s["battler#{battlerindex}"].appearing
    end
    if @battle.battlers.pokemon.isShiny?
      pbCommonAnimation("Shiny",@battle.battlers,nil)
    end
    sendout.dispose
    if @showingenemy
      @showingenemy=false
      pbDisposeSprite [MENTION=24071]Sprite[/MENTION]s,"trainer")
      pbDisposeSprite [MENTION=24071]Sprite[/MENTION]s,"partybase1")
      for i in 0...6
        pbDisposeSprite [MENTION=24071]Sprite[/MENTION]s,"enemy#{i}")
      end
    end
    pbRefresh
  end

  def pbSendOut(battlerindex,pkmn)
    while inPartyAnimation?; end
    balltype=pkmn.ballused
    ballbitmap=sprintf("Graphics/Pictures/ball%02d_0",balltype)
    pictureBall=PictureEx.new(0)
    delay=1
    pictureBall.moveVisible(delay,true)
    pictureBall.moveName(delay,ballbitmap)
    pictureBall.moveOrigin(delay,PictureOrigin::Center)
    # Setting the ball's movement path
    path=[[111, 164], [113, 154], [115, 145], [118, 136], 
          [122, 128], [130, 124], [137, 129], [140, 138], 
          [142, 147], [143, 156], [144, 166], [145, 175], 
          [145, 185], [146, 194], [146, 203], [146, 213], 
          [147, 222], [147, 232], [147, 241], [147, 250]]
    spriteBall=IconSprite.new(0,0,@viewport)
    spriteBall.visible=false
    angle=0
    for coord in path
      delay=pictureBall.totalDuration
      pictureBall.moveAngle(0,delay,angle)
      pictureBall.moveXY(1,delay,coord[0],coord[1])
      angle+=80
      angle%=360
    end
    pictureBall.adjustPosition(0,@yoffset)
    [MENTION=24071]Sprite[/MENTION]s["battler#{battlerindex}"].visible=false
    @briefmessage=false
    fadeanim=nil

    if @showingplayer
      fadeanim=PlayerFadeAnimation.new [MENTION=24071]Sprite[/MENTION]s)
    end
    frame=0
    [MENTION=24071]Sprite[/MENTION]s["pokemon#{battlerindex}"].setPokemonBitmap(pkmn,true)
    sendout=PokeballPlayerSendOutAnimation.new [MENTION=24071]Sprite[/MENTION]s["pokemon#{battlerindex}"],
       [MENTION=24071]Sprite[/MENTION]s,@battle.battlers,@battle.doublebattle)
    loop do
      

    @tpb9 +=1
      
      fadeanim.update if fadeanim
      frame+=1
      if frame>1 && !pictureBall.running? &&  [MENTION=24071]Sprite[/MENTION]s["battler#{battlerindex}"].appearing
        [MENTION=24071]Sprite[/MENTION]s["battler#{battlerindex}"].appear
      end
      if frame>=3 && !pictureBall.running?
        sendout.update
      end
      if (frame>=10 || !fadeanim) && pictureBall.running?
        pictureBall.update
        setPictureIconSprite(spriteBall,pictureBall)
      end
      [MENTION=24071]Sprite[/MENTION]s["battler#{battlerindex}"].update
    
      pictureBall.moveVisible(1,false) if @tpb9 ==60
      
      pbGraphicsUpdate
      pbInputUpdate
            $mouse.visible
      $mouse.update
      
      if [MENTION=24071]Sprite[/MENTION]s["playerbase"].zoom_y >= 3.0
        [MENTION=24071]Sprite[/MENTION]s["playerbase"].zoom_y = 3.9
      end
      
      break if @tpb9 == 130
    end
    @tpb9 = 0
    spriteBall.dispose
    sendout.dispose
    if @battle.battlers.pokemon.isShiny?
      pbCommonAnimation("Shiny",@battle.battlers,nil)
    end
    if @showingplayer
      @showingplayer=false
      pbDisposeSprite [MENTION=24071]Sprite[/MENTION]s,"player")
      pbDisposeSprite [MENTION=24071]Sprite[/MENTION]s,"partybase2")
      for i in 0...6
        pbDisposeSprite [MENTION=24071]Sprite[/MENTION]s,"player#{i}")
      end
    end
    pbRefresh
  end

  def pbTrainerWithdraw(battle,pkmn)
    pbRefresh
  end

  def pbWithdraw(battle,pkmn)
    pbRefresh
  end

# Called whenever a Pokémon should forget a move.  It should return -1 if the
# selection is canceled, or 0 to 3 to indicate the move to forget.  The function
# should not allow HM moves to be forgotten.
  def pbForgetMove(pokemon,moveToLearn)
    ret=-1
    pbFadeOutIn(99999){
       scene=PokemonSummaryScene.new
       screen=PokemonSummary.new(scene)
       ret=screen.pbStartForgetScreen([pokemon],0,moveToLearn)
    }
    return ret
  end

  def pbBeginAttackPhase
    pbSelectBattler(-1)
  end

  def pbSafariStart
    @briefmessage=false
    [MENTION=24071]Sprite[/MENTION]s["battler0"]=SafariDataBox.new(@battle,@viewport)
    [MENTION=24071]Sprite[/MENTION]s["battler0"].appear
    loop do
      [MENTION=24071]Sprite[/MENTION]s["battler0"].update
      pbGraphicsUpdate
      pbInputUpdate
      break if  [MENTION=24071]Sprite[/MENTION]s["battler0"].appearing
    end
    pbRefresh
  end

  def pbCommandMenuEx(index,texts)
    pbShowWindow(COMMANDBOX)
    
    [MENTION=24071]Sprite[/MENTION]s["messagebox"].visible=true
    [MENTION=24071]Sprite[/MENTION]s["battlebg2"].bitmap = RPG::Cache.picture("battlebg2")
    
    cw2 [MENTION=24071]Sprite[/MENTION]s["commandwindow"]
    
    texts=[
    _INTL("¿Qué debería hacer {1}?",@battle.battlers[index].name)
    ]
    
    cw2.setTexts(texts)
    cw2.index=[0,2,1,3][@lastcmd[index]]
    
    #pbSelectBattler(index)
    pbRefresh
    loop do
       pbWait(3)
      pbGraphicsUpdate
      pbInputUpdate
      #pbFrameUpdate(cw2)
      
      if pbMouseClick?(91,119+400,323,114)
        [MENTION=24071]Sprite[/MENTION]s["battlebg2"].bitmap = RPG::Cache.picture("battlebg3")
        pbPlayDecisionSE()
        return 0
      end
      
      if pbMouseClick?(0,266+400,156,120)
        pbPlayDecisionSE()
        return 2
      end
      
      if pbMouseClick?(180,296+400,152,88)
        pbPlayDecisionSE()
        return 3
      end
      
      if pbMouseClick?(356,266+400,156,120)
        pbPlayDecisionSE()
        return 1
      end
      
    end 
  end

  def pbSafariCommandMenu(index)
    pbCommandMenuEx(index,[
       _INTL("What will {1} throw?",@battle.pbPlayer.name),
       _INTL("BALL"),
       _INTL("ROCK"),
       _INTL("BAIT"),
       _INTL("RUN")
    ])
  end

  def pbCommandMenu(index)
    # Use this method to display the list of commands.
    #  Return values:
    #  0 - Fight
    #  1 - Pokémon
    #  2 - Bag
    #  3 - Run
    shadowTrainer=(hasConst?(PBTypes,:SHADOW) && @opponent)
    ret=pbCommandMenuEx(index,[
       _INTL("¿Qué debería hacer {1}?",@battle.battlers[index].name),
       _INTL("FIGHT"),
       _INTL("POKéMON"),
       _INTL("BAG"),
       shadowTrainer ? _INTL("CALL") : _INTL("RUN")
    ])
    if ret==3 && shadowTrainer
      ret=4 # convert "Run" to "Call"
    end
    return ret
  end

def pbMoveString(move)
 ret=_INTL("{1}",move.name)
 typename=PBTypes.getName(move.type)
 if move.id>0
  ret+=_INTL(" ({1}) PP: {2}/{3}",typename,move.pp,move.totalpp)
 end
 return ret
end

def MoveType(move)
 typename=PBTypes.getName(move.type)
 if move.id>0
  ret=_INTL(typename)
else
  ret="testbox"
end
 return ret
end

def MoveName(move)
 if move.id>0
  ret=_INTL("{1}",move.name)
else
  ret=""
end
 return ret
end

def MovePP(move)
 if move.id>0
  ret=_INTL("PP {1}/{2}",move.pp,move.totalpp)
else
  ret=""
end
 return ret
end

  def pbNameEntry(helptext)
    return pbEnterText(helptext,0,10)
  end

# Use this method to display the list of moves for a Pokémon
  def pbFightMenu(index)
 #pbShowWindow(FIGHTBOX)
 @ret=0
 moves=@battle.battlers[index].moves
 types=[
   MoveType(moves[0]),
   MoveType(moves[1]),
   MoveType(moves[2]),
   MoveType(moves[3])
 ]
 movenames=[
   MoveName(moves[0]),
   MoveName(moves[1]),
   MoveName(moves[2]),
   MoveName(moves[3])
 ]
 movepp=[
   MovePP(moves[0]),
   MovePP(moves[1]),
   MovePP(moves[2]),
   MovePP(moves[3])
 ]
 move1 = Window_UnformattedTextPokemon.new(movenames[0].to_s)
 #move1.baseColor = Color.new(248,248,248)
 #move1.shadowColor = Color.new(104,88,112)
 move1.x=34+68-6-64
 move1.y=458+20-$ResizeOffsetY-20
 move1.opacity = 0
 move1.z=99999
 move1.baseColor=Color.new(255,255,255)
 
 move2 = Window_UnformattedTextPokemon.new(movenames[1].to_s)
 move2.x=288+68-8-64
 move2.y=458+20-$ResizeOffsetY-20
 move2.opacity = 0
 move2.z=99999
 move2.baseColor=Color.new(255,255,255)
 
 move3 = Window_UnformattedTextPokemon.new(movenames[2].to_s)
 move3.x=34+75-14-64
 move3.y=591-14-$ResizeOffsetY-20
 move3.opacity = 0
 move3.z=99999
 move3.baseColor=Color.new(255,255,255)
 
 move4 = Window_UnformattedTextPokemon.new(movenames[3].to_s)
 move4.x=288+75-14-64
 move4.y=591-14-$ResizeOffsetY-20
 move4.opacity = 0
 move4.z=99999
 move4.baseColor=Color.new(255,255,255)
 
 pp1 = Window_UnformattedTextPokemon.new(movepp[0].to_s)
 pp1.x=100+75-64
 pp1.y=490+26-$ResizeOffsetY-20
 pp1.opacity = 0
 pp1.z=99999
 pp1.baseColor=Color.new(255,255,255)
 
 pp2 = Window_UnformattedTextPokemon.new(movepp[1].to_s)
 pp2.x=357+75-64
 pp2.y=490+26-$ResizeOffsetY-20
 pp2.opacity = 0
 pp2.z=99999
 pp2.baseColor=Color.new(255,255,255)
 
 pp3 = Window_UnformattedTextPokemon.new(movepp[2].to_s)
 pp3.x=100+75-64
 pp3.y=614-$ResizeOffsetY-20
 pp3.opacity = 0
 pp3.z=99999
 pp3.baseColor=Color.new(255,255,255)
 
 pp4 = Window_UnformattedTextPokemon.new(movepp[3].to_s)
 pp4.x=357+75-64
 pp4.y=614-$ResizeOffsetY-20
 pp4.opacity = 0
 pp4.z=99999
 pp4.baseColor=Color.new(255,255,255)
 
 @movesprites={}
 @movesprites["move1"]=IconSprite.new(4+75-80, 480-18,@viewport)
 @movesprites["move1"].setBitmap("Graphics/Pictures/move_" + types[0].to_s)
 @movesprites["move1"].z=999999991
 
 @movesprites["move2"]=IconSprite.new(260+75-80, 480-18,@viewport)
 @movesprites["move2"].setBitmap("Graphics/Pictures/move_" + types[1].to_s)
 @movesprites["move2"].z=999999991
 
 @movesprites["move3"]=IconSprite.new(4+75-80, 578-18,@viewport)
 @movesprites["move3"].setBitmap("Graphics/Pictures/move_" + types[2].to_s)
 @movesprites["move3"].z=999999991
 
 @movesprites["move4"]=IconSprite.new(260+75-80, 578-18,@viewport)
 @movesprites["move4"].setBitmap("Graphics/Pictures/move_" + types[3].to_s)
 @movesprites["move4"].z=999999991
 
 @movesprites["cancel"]=IconSprite.new(18, 706)
 @movesprites["cancel"].setBitmap("Graphics/Pictures/botoncancelar")
 @movesprites["cancel"].z=999999
 cw = [MENTION=24071]Sprite[/MENTION]s["fightwindow"]
 battler=@battle.battlers[index]
 cw.battler=battler
 lastIndex=@lastmove[index]
 if battler.moves[lastIndex].id!=0
  cw.setIndex(lastIndex)
 else
  cw.setIndex(0)
 end
 #pbSelectBattler(index)
 pbRefresh
 loop do
   
    pbWait(3)
  $mouse.visible
  $mouse.update
  pbGraphicsUpdate
  pbInputUpdate
  #pbFrameUpdate(cw)

if Input.trigger?(Input::B) or pbMouseClick?(356,264+400,156,120)
      pbPlayCancelSE()
      Graphics.wait(2)
     pbDisposeSpriteHash(@movesprites)
     move1.dispose
     move2.dispose
     move3.dispose
     move4.dispose
     [MENTION=12671]pokemon[/MENTION]no.dispose if [MENTION=12671]pokemon[/MENTION]no
     pp1.dispose
     pp2.dispose
     pp3.dispose
     pp4.dispose
     @lastmove[index]=cw.index
     return -1
   end
   
if @battle.battlers[index].moves[0].id != 0
  
  if pbMouseClickImage?(@movesprites["move1"])
      @command=0
      @ret=1
      end
    elsif @battle.battlers[index].moves[1].id != 0
      if pbMouseClickImage?(@movesprites["move2"])
      @command=1
      @ret=1
      end
    elsif @battle.battlers[index].moves[2].id != 0
      if pbMouseClickImage?(@movesprites["move3"])
      @command=2
      @ret=1
      end
    elsif @battle.battlers[index].moves[3].id != 0
      if pbMouseClickImage?(@movesprites["move4"])
      @command=3
      @ret=1
      end
    
  end
  if @ret == 1
   ret=@command
   
   [MENTION=24071]Sprite[/MENTION]s["battlebg2"].bitmap = RPG::Cache.picture("battleballbg")
   pbDisposeSpriteHash(@movesprites)
   move1.dispose
   move2.dispose
   move3.dispose
   move4.dispose
   pp1.dispose
   pp2.dispose
   pp3.dispose
   pp4.dispose
   pbPlayDecisionSE()
   return ret
  end
  nextindex=pbNextIndex(cw.index)
  if cw.index!=nextindex # Move cursor
   pbPlayCursorSE()
   cw.setIndex(nextindex)
  end
 end
end

# Use this method to display the inventory
# The return value is the item chosen, or 0 if the choice was canceled.
  def pbItemMenu(index)
    ret=0
    endscene=true
    oldsprites=pbFadeOutAndHide [MENTION=24071]Sprite[/MENTION]s)
    itemscene=PokemonBag_Scene.new
    itemscene.pbStartScene($PokemonBag)
    loop do
      item=itemscene.pbChooseItem
      break if item==0
      usetype=$ItemData[item][ITEMBATTLEUSE]
      cmdUse=-1
      commands=[]
      if usetype==0
        commands[commands.length]=_INTL("CANCEL")
      else
        commands[cmdUse=commands.length]=_INTL("USE")
        commands[commands.length]=_INTL("CANCEL")
      end
      itemname=PBItems.getName(item)
      command=itemscene.pbShowCommands(_INTL("{1} is selected.",itemname),commands)
      if cmdUse>=0 && command==cmdUse
        if usetype==1
          pkmnlist=PokemonScreen_Scene.new
          pkmnscreen=PokemonScreen.new(pkmnlist,@battle.party1)
          itemscene.pbEndScene
          pkmnlist.pbStartScene(@battle.party1,_INTL("Use on which Pokémon?"),@battle.doublebattle)
          pkmnid=pkmnlist.pbChoosePokemon
          if pkmnid>=0 && @battle.pbUseItemOnPokemon(item,pkmnid,pkmnscreen)
            pkmnscreen.pbRefresh
            pkmnlist.pbEndScene
            ret=item
            endscene=false
            break
          end
          pkmnlist.pbEndScene
          itemscene.pbStartScene($PokemonBag)
        elsif usetype==2
          if @battle.pbUseItemOnBattler(item,index,itemscene)
            ret=item
            break
          end
        end
      end
    end
    pbConsumeItemInBattle($PokemonBag,ret)
    itemscene.pbEndScene if endscene
    for i in 0..4
      if [MENTION=24071]Sprite[/MENTION]s["battler#{i}"]
        [MENTION=24071]Sprite[/MENTION]s["battler#{i}"].refresh
      end
    end
    pbFadeInAndShow [MENTION=24071]Sprite[/MENTION]s,oldsprites)
    return ret
  end

  def pbSelectBattler(index,selectmode=1)
    numwindows=@battle.doublebattle ? 4 : 2
    for i in 0...numwindows
      sprite [MENTION=24071]Sprite[/MENTION]s["battler#{i}"]
      sprite.selected=(i==index) ? selectmode : 0
      sprite [MENTION=24071]Sprite[/MENTION]s["pokemon#{i}"]
      sprite.selected=(i==index) ? selectmode : 0
    end
  end

  def pbFirstTarget(index)
    for i in 0..3
      if i!=index && @battle.battlers.hp>0 && 
         @battle.battlers[index].pbIsOpposing?(i)
        return i
      end  
    end
    return -1
  end

  def pbNextIndex(curindex)
    if Input.trigger?(Input::LEFT) && (curindex&1)==1
      return curindex-1
    elsif Input.trigger?(Input::RIGHT) &&  (curindex&1)==0
      return curindex+1
    elsif Input.trigger?(Input::UP) &&  (curindex&2)==2
      return curindex-2
    elsif Input.trigger?(Input::DOWN) &&  (curindex&2)==0
      return curindex+2
    end
    return curindex
  end

  def pbUpdateSelected(index)
    numwindows=@battle.doublebattle ? 4 : 2
    for i in 0...numwindows
      if i==index
        [MENTION=24071]Sprite[/MENTION]s["battler#{i}"].selected=2
        [MENTION=24071]Sprite[/MENTION]s["pokemon#{i}"].selected=2
      else
        [MENTION=24071]Sprite[/MENTION]s["battler#{i}"].selected=0
        [MENTION=24071]Sprite[/MENTION]s["pokemon#{i}"].selected=0
      end
      [MENTION=24071]Sprite[/MENTION]s["battler#{i}"].update
      [MENTION=24071]Sprite[/MENTION]s["pokemon#{i}"].update
    end
  end

# Use this method to make the player choose a target 
# for certain moves in double battles.
  def pbChooseTarget(index)
    pbShowWindow(FIGHTBOX)
    curwindow=pbFirstTarget(index)
    if curwindow==-1
      raise RuntimeError.new(_INTL("No targets somehow..."))
    end
    loop do
      pbGraphicsUpdate
      pbInputUpdate
      pbUpdateSelected(curwindow)
      if Input.trigger?(Input::C)
        pbUpdateSelected(-1)
        return curwindow
      end
      if Input.trigger?(Input::B)
        pbUpdateSelected(-1)
        return -1
      end
      if curwindow>=0
        if Input.trigger?(Input::RIGHT) || Input.trigger?(Input::DOWN)
          loop do
            newcurwindow=3 if curwindow==0
            newcurwindow=1 if curwindow==3
            newcurwindow=2 if curwindow==1
            newcurwindow=0 if curwindow==2
            curwindow=newcurwindow
            next if curwindow==index
            break if @battle.battlers[curwindow].hp>0
          end
        elsif Input.trigger?(Input::LEFT) || Input.trigger?(Input::UP)
          loop do 
            newcurwindow=2 if curwindow==0
            newcurwindow=1 if curwindow==2
            newcurwindow=3 if curwindow==1
            newcurwindow=0 if curwindow==3
            curwindow=newcurwindow
            next if curwindow==index
            break if @battle.battlers[curwindow].hp>0
          end
        end
      end
    end
  end

  def pbSwitch(index,lax,cancancel)
    party=@battle.pbParty(index)
    inactives=[1,1,1,1,1,1]
    partypos=[]
    switchsprites={}
    activecmd=0
    ret=-1
    numactive=(@doublebattle)?2:1
    pbShowWindow(BLANK)
    pbSetMessageMode(true)
    # Fade out and hide all sprites
    visiblesprites=pbFadeOutAndHide [MENTION=24071]Sprite[/MENTION]s)
    battler=@battle.battlers[0]
    activecmd=0 if battler.index==index
    inactives=0
    partypos[0]=battler.pokemonIndex
    if @battle.doublebattle && !@battle.fullparty1
      battler=@battle.battlers[2]
      activecmd=1 if battler.index==index
      inactives=0
      partypos[1]=battler.pokemonIndex
    end
    # Add all non-active Pokémon
    for i in 0...6
      partypos[partypos.length]=i if inactives==1
    end
    modparty=[]
    for i in 0...6
      modparty.push(party[partypos])
    end
    scene=PokemonScreen_Scene.new
    @switchscreen=PokemonScreen.new(scene,modparty)
    @switchscreen.pbStartScene(_INTL("Choose a Pokémon."),
    @battle.doublebattle && !@battle.fullparty1)
    loop do
      scene.pbSetHelpText(_INTL("Choose a Pokémon."))
      activecmd=@switchscreen.pbChoosePokemon
      if cancancel && activecmd==-1
        ret=-1
        break
      end
      if activecmd>=0
        commands=[]
        cmdShift=-1
        cmdSummary=-1
        pkmnindex=partypos[activecmd]
        commands[cmdShift=commands.length]=_INTL("SHIFT") if !party[pkmnindex].egg?
        commands[cmdSummary=commands.length]=_INTL("SUMMARY")
        commands[commands.length]=_INTL("CANCEL")
        command=scene.pbShowCommands(_INTL("Do what with {1}?",party[pkmnindex].name),commands)
        if cmdShift>=0 && command==cmdShift
          canswitch=lax ? @battle.pbCanSwitchLax?(index,pkmnindex,true) :
             @battle.pbCanSwitch?(index,pkmnindex,true)
          if canswitch
            ret=pkmnindex
            break
          end
        elsif cmdSummary>=0 && command==cmdSummary
          scene.pbSummary(activecmd)
        end
      end
    end
    @switchscreen.pbEndScene
    @switchscreen=nil
    pbSetMessageMode(false)
    # back to main battle screen
    pbFadeInAndShow [MENTION=24071]Sprite[/MENTION]s,visiblesprites)
    return ret
  end

  def pbDamageAnimation(pkmn,effectiveness)
    pkmnsprite [MENTION=24071]Sprite[/MENTION]s["pokemon#{pkmn.index}"]
    shadowsprite [MENTION=24071]Sprite[/MENTION]s["shadow#{pkmn.index}"]
    sprite [MENTION=24071]Sprite[/MENTION]s["battler#{pkmn.index}"]
    oldshadowvisible=shadowsprite.visible
    oldvisible=sprite.visible
    sprite.selected=2
    @briefmessage=false
    6.times do
      pbGraphicsUpdate
      pbInputUpdate
    end
    case effectiveness
      when 0
        pbSEPlay("normaldamage")
      when 1
        pbSEPlay("notverydamage")
      when 2
        pbSEPlay("superdamage")
    end
    8.times do
      pkmnsprite.visible=!pkmnsprite.visible
      if oldshadowvisible
        shadowsprite.visible=!shadowsprite.visible
      end
      4.times do
        pbGraphicsUpdate
        pbInputUpdate
        sprite.update
      end
    end
    sprite.selected=0
    sprite.visible=oldvisible
  end

# This method is called whenever a Pokémon's HP changes.
# Used to animate the HP bar.
  def pbHPChanged(pkmn,oldhp)
    @briefmessage=false
    hpchange=pkmn.hp-oldhp
    if hpchange<0
      hpchange=-hpchange
      PBDebug.log("[#{pkmn.pbThis} lost #{hpchange} HP, now has #{pkmn.hp} HP]") if @battle.debug
    else
      PBDebug.log("[#{pkmn.pbThis} gained #{hpchange} HP, now has #{pkmn.hp} HP]") if @battle.debug
    end
    sprite [MENTION=24071]Sprite[/MENTION]s["battler#{pkmn.index}"]
    sprite.animateHP(oldhp,pkmn.hp)
    while sprite.animatingHP
      pbGraphicsUpdate
      pbInputUpdate
      sprite.update
    end
  end

# This method is called whenever a Pokémon faints
  def pbFainted(pkmn)
    frames=pbCryFrameLength(pkmn.pokemon)
    pbPlayCry(pkmn.pokemon)
    frames.times do
      pbGraphicsUpdate
      pbInputUpdate
    end
    [MENTION=24071]Sprite[/MENTION]s["shadow#{pkmn.index}"].visible=false
    pkmnsprite [MENTION=24071]Sprite[/MENTION]s["pokemon#{pkmn.index}"]
    pkmnsprite.visible=false
    if @battle.pbIsOpposing?(pkmn.index)
      tempvp=Viewport.new(0,0,Graphics.width,144)
    else
      tempvp=Viewport.new(0,0,Graphics.width,224+@yoffset)
    end
    tempvp.z=@viewport.z
    tempsprite=SpriteWrapper.new(tempvp)
    tempsprite.x=pkmnsprite.x
    tempsprite.y=pkmnsprite.y
    tempsprite.bitmap=pkmnsprite.bitmap
    tempsprite.visible=true
    pbSEPlay("faint")
    16.times do
      tempsprite.y+=8
      pbGraphicsUpdate
      pbInputUpdate
    end
    tempsprite.dispose
    tempvp.dispose
    8.times do
      [MENTION=24071]Sprite[/MENTION]s["battler#{pkmn.index}"].opacity=32
      pbGraphicsUpdate
      pbInputUpdate
    end
    [MENTION=24071]Sprite[/MENTION]s["battler#{pkmn.index}"].visible=false
  end

# Use this method to choose a command for the enemy.
  def pbChooseEnemyCommand(index)
    @battle.pbDefaultChooseEnemyCommand(index)
  end

# Use this method to choose a new Pokémon for the enemy
# The enemy's party is guaranteed to have at least one choosable member.
  def pbChooseNewEnemy(index,party)
    @battle.pbDefaultChooseNewEnemy(index,party)
  end

# This method is called when the player wins a wild Pokémon battle.
# This method can change the battle's music for example.
  def pbWildBattleSuccess
    pbBGMPlay(pbGetWildVictoryME())
  end

# This method is called when the player wins a Trainer battle.
# This method can change the battle's music for example.
  def pbTrainerBattleSuccess
    pbBGMPlay(pbGetTrainerVictoryME(@battle.opponent))
  end

  def pbEXPBar(pokemon,battler,startexp,endexp,tempexp1,tempexp2)
    if battler
      [MENTION=24071]Sprite[/MENTION]s["battler#{battler.index}"].refreshExpLevel
      exprange=(endexp-startexp)
      startexplevel=0
      endexplevel=0
      if exprange!=0
        startexplevel=(tempexp1-startexp)*EXPGAUGESIZE/exprange
        endexplevel=(tempexp2-startexp)*EXPGAUGESIZE/exprange
      end
      [MENTION=24071]Sprite[/MENTION]s["battler#{battler.index}"].animateEXP(startexplevel,endexplevel)
      while [MENTION=24071]Sprite[/MENTION]s["battler#{battler.index}"].animatingEXP
        pbGraphicsUpdate
        pbInputUpdate
        [MENTION=24071]Sprite[/MENTION]s["battler#{battler.index}"].update
      end
    end
  end

  def pbShowPokedex(species)
    pbFadeOutIn(99999){
       scene=PokemonPokedexScene.new
       screen=PokemonPokedex.new(scene)
       screen.pbDexEntry(species)
    }
  end

  def pbFindAnimation(moveid)
    begin
      move2anim=load_data("Data/move2anim.dat")
      anim=move2anim[0][moveid]
      return anim if anim
      if hasConst?(PBMoves,:TACKLE)
        anim=move2anim[0][getConst(PBMoves,:TACKLE)]
        return anim if anim
      end
      rescue
      return nil
    end
    return nil
  end

  def pbCommonAnimation(animname,attacker,opponent,side=true)
    animations=load_data("Data/PkmnAnimations.rxdata")
    for i in 0...animations.length
      if animations && animations.name=="Common:"+animname
        pbAnimationCore(animations,attacker,opponent,side)
        return
      end
    end
  end

  def pbChangeSpecies(attacker,species)
    pkmn [MENTION=24071]Sprite[/MENTION]s["pokemon#{attacker.index}"]
    shadow [MENTION=24071]Sprite[/MENTION]s["shadow#{attacker.index}"]
    back=!@battle.pbIsOpposing?(attacker.index)
    pkmn.setPokemonBitmapSpecies(attacker.pokemon,species,back)
    pkmn.y=adjustBattleSpriteY(pkmn,species,attacker.index)
    if shadow && !back
      shadow.visible=showShadow?(species)
    end
  end

  def pbChangePokemon(attacker,pokemon)
    pkmn [MENTION=24071]Sprite[/MENTION]s["pokemon#{attacker.index}"]
    shadow [MENTION=24071]Sprite[/MENTION]s["shadow#{attacker.index}"]
    back=!@battle.pbIsOpposing?(attacker.index)
    pkmn.setPokemonBitmap(pokemon,back)
    pkmn.y=adjustBattleSpriteY(pkmn,pokemon.species,attacker.index)
    if shadow && !back
      shadow.visible=showShadow?(pokemon.species)
    end
  end

  def pbAnimation(moveid,attacker,opponent,side=true)
    animid=pbFindAnimation(moveid)
    return if !animid
    animations=load_data("Data/PkmnAnimations.rxdata")
    pbSaveShadows {
       pbAnimationCore(animations[animid],attacker,opponent,side)
    }
    if isConst?(moveid,PBMoves,:TRANSFORM) && attacker && opponent
      # Change form to transformed version
      pbChangePokemon(attacker,opponent.pokemon)
    end
  end

  def pbSaveShadows
    shadows=[]
    for i in 0...4
      s [MENTION=24071]Sprite[/MENTION]s["shadow#{i}"]
      shadows=s ? s.visible : false
      s.visible=false if s
    end
    yield
    for i in 0...4
      s [MENTION=24071]Sprite[/MENTION]s["shadow#{i}"]
      s.visible=shadows if s
    end
  end

  def pbAnimationCore(animation,attacker,opponent,side=true)
    if !attacker || !animation
      return
    end
    @briefmessage=false
    user=(attacker) ? [MENTION=24071]Sprite[/MENTION]s["pokemon#{attacker.index}"] : nil
    target=(opponent) ? [MENTION=24071]Sprite[/MENTION]s["pokemon#{opponent.index}"] : nil
    olduserx=user.x
    oldusery=user.y
    oldtargetx=target ? target.x : 0
    oldtargety=target ? target.y : 0
    if !target
      animplayer=PBAnimationPlayer.new(animation,user,user,@viewport3)
      userwidth=(!user.bitmap || user.bitmap.disposed?) ? 128 : user.bitmap.width
      userheight=(!user.bitmap || user.bitmap.disposed?) ? 128 : user.bitmap.height
      animplayer.setLineTransform(144,188,352,108,
         user.x+(userwidth/2),user.y+(userheight/2),
         user.x+(userwidth/2),user.y+(userheight/2))
    else
      animplayer=PBAnimationPlayer.new(animation,user,target,@viewport3)
      userwidth=(!user.bitmap || user.bitmap.disposed?) ? 128 : user.bitmap.width
      targetwidth=(!target.bitmap || target.bitmap.disposed?) ? 128 : target.bitmap.width
      userheight=(!user.bitmap || user.bitmap.disposed?) ? 128 : user.bitmap.height
      targetheight=(!target.bitmap || target.bitmap.disposed?) ? 128 : target.bitmap.height
      animplayer.setLineTransform(144,188,352,108,
         user.x+(userwidth/2),user.y+(userheight/2),
         target.x+(targetwidth/2),target.y+(targetheight/2))
    end
    animplayer.start
    while animplayer.playing?
      animplayer.update
      pbGraphicsUpdate
      pbInputUpdate
    end
    user.ox=0
    user.oy=0
    target.ox=0 if target
    target.oy=0 if target
    user.x=olduserx
    user.y=oldusery
    target.x=oldtargetx if target
    target.y=oldtargety if target
    animplayer.dispose
  end

  def pbLevelUp(pokemon,battler,oldtotalhp,oldattack,olddefense,oldspeed,
                oldspatk,oldspdef)
      pbTopRightWindow(_INTL("MaxHP<r>+{1}\r\nATTACK<r>+{2}\r\nDEFENSE<r>+{3}\r\nSP.  ATK<r>+{4}\r\nSP. DEF<r>+{5}\r\nSPEED<r>+{6}",
       pokemon.totalhp-oldtotalhp,
       pokemon.attack-oldattack,
       pokemon.defense-olddefense,
       pokemon.spatk-oldspatk,
       pokemon.spdef-oldspdef,
       pokemon.speed-oldspeed))
      pbTopRightWindow(_INTL("MaxHP<r>{1}\r\nATTACK<r>{2}\r\nDEFENSE<r>{3}\r\nSP.  ATK<r>{4}\r\nSP. DEF<r>{5}\r\nSPEED<r>{6}",
       pokemon.totalhp,pokemon.attack,pokemon.defense,pokemon.spatk,pokemon.spdef,pokemon.speed))
  end

  def pbThrowAndDeflect(ball,targetBattler)
  end

  def pbThrow(ball,shakes,targetBattler)
    @briefmessage=false
    pokeballThrow(ball,shakes,targetBattler)
  end

  def pbThrowSuccess
    if !@opponent
      @briefmessage=false
      pbBGMPlay("../ME/PkmRS-Caught")
      frames=(3.5*Graphics.frame_rate).to_i
      frames.times do
        pbGraphicsUpdate
        pbInputUpdate
      end
    end
  end
end[/SPOILER]
busque  lo que dices drimer pero no doy bien con la parte que hace esos  acercamientos de pantalla, solo necesito la introduccion al combate