Registrarse

Añadir menu nuevo y cambiar battle system

Estado
Cerrado para nuevas respuestas.

randaku

Pokémon Cielo Infinito
Hola WAH!
Buenos tengo dos dudas bien simples:
Quiero cambiar el menu que se abre al presionar X en el mapa
Mi menu es asi:
Necesito algo asi, obviamente los graficos y eso lo edito yo, necesito el script uso un essentials mas o menos antiguo pero he podido hacer varias cosas ahi.
Eso es un ejemplo de lo que necesito ojala me ayuden :)

A lo otro que necesito es modificar el script de batalla como lo tiene BW no como en los juegos antiguos, me explico cuando salga un entrenador o pokémon que la pantalla se acerque al sprite del entrenador/pokemon y despues que se aleje.
De hecho creo que no es tan dificil lograrlo es solo un acercamiento de pantalla, otra cosa sobre esto es que asi se modifique el que tengo porque los Pokémon y los entrenadores cuando aparecen, aparecen desde el lado izquierdo de la pantalla, como digo me gustaria al estilo bw que ya este el entrenador/pokemon en su sitio solo que con la pantalla acercada, y algo que igual me gustaria es que cuando los pokemon sean golpeados tambien haya un movimiento de pantalla que se acerque a los pokémon.
Bueno y la 3ra y ultima duda es pequeña, la barra de vida de mi pokemon en batalla se mueve de arriba hacia abajo cuando espera que ejecute alguna accion, es un movimiento leve pero este movmiento que tiene esta barra tambien mueve a mi pokémon son solo unos movimientos mmuy pequeños pero quiero eliminar ese detalle.
Desde ya gracias :D
 

randaku

Pokémon Cielo Infinito
Encontre un menu de la forma que quiero ahora lo estoy modificando, en cuanto al battle system bw encontre un essentials con ese sistema de batalla si que por ahora gracias por tu ayuda, como no soy scripter y no se nada me cuesta un poco pero lo estoy intentando xd
 

randaku

Pokémon Cielo Infinito
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:
Código:
  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.

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
con respecto al battle system nose como hacer lo que necesito
aca tengo el pokebattle_actualscene el que esta en mi essentials
=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
@Window=Window_CommandPokemon.newWithSize([],
Graphics.width-240,Graphics.height-96,240,96);
@Window.columns=2
@Window.columnSpacing=4
@Window.viewport=viewport
@msgbox=Window_UnformattedTextPokemon.newWithSize(
"",4,Graphics.height-96,
Graphics.width [MENTION=24700]Wind[/MENTION]ow.width-4,
96,viewport)
@msgbox.baseColor=PokeBattle_Scene::MESSAGEBASECOLOR
@msgbox.shadowColor=PokeBattle_Scene::MESSAGESHADOWCOLOR
@msgbox.windowskin=nil
if PokeBattle_Scene::USECOMMANDBOX
@Window.opacity=0
end
@title=""
end
def index; @Window.index; end
def index=(value); @Window.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
}
@Window.commands=commands
end
def visible; @Window.visible; end
def visible=(value)
@Window.visible=value
@msgbox.visible=value
@display.visible=value if @display
end
def x; @Window.x; end
def x=(value)
@Window.x=value
@msgbox.x=value
@display.x=value if @display
end
def y; @Window.y; end
def y=(value)
@Window.y=value
@msgbox.y=value
@display.y=value if @display
end
def oy; @Window.oy; end
def oy=(value)
@Window.oy=value
@msgbox.oy=value
@display.oy=value if @display
end
def color; @Window.color; end
def color=(value)
@Window.color=value
@msgbox.color=value
@display.color=value if @display
end
def ox; @Window.ox; end
def ox=(value)
@Window.ox=value
@msgbox.ox=value
@display.ox=value if @display
end
def z; @Window.z; end
def z=(value)
@Window.z=value
@msgbox.z=value
@display.z=value if @display
end
def disposed?
return @msgbox.disposed? || @Window.disposed?
end
def dispose
return if disposed?
@msgbox.dispose
@Window.dispose
@display.dispose if @display
end
def update
@msgbox.update
@Window.update
@display.update if @display
end
def refresh
@msgbox.refresh
@Window.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
@Window.index=value
refresh
end
end
def visible; @Window.visible; end
def visible=(value)
@Window.visible=value
@info.visible=value
@display.visible=value if @display
end
def x; @Window.x; end
def x=(value)
@Window.x=value
@info.x=value
@display.x=value if @display
end
def y; @Window.y; end
def y=(value)
@Window.y=value
@info.y=value
@display.y=value if @display
end
def oy; @Window.oy; end
def oy=(value)
@Window.oy=value
@info.oy=value
@display.oy=value if @display
end
def color; @Window.color; end
def color=(value)
@Window.color=value
@info.color=value
@display.color=value if @display
end
def ox; @Window.ox; end
def ox=(value)
@Window.ox=value
@info.ox=value
@display.ox=value if @display
end
def z; @Window.z; end
def z=(value)
@Window.z=value
@info.z=value
@display.z=value if @display
end
def disposed?
return @info.disposed? || @Window.disposed?
end
def dispose
return if disposed?
@info.dispose
@display.dispose if @display
@Window.dispose
end
def update
@info.update
@Window.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
@Window=Window_CommandPokemon.newWithSize([],
0,Graphics.height-96,320,96,viewport)
@Window.columns=2
@Window.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
@Window.opacity=0
@info.opacity=0
end
@battler=battler
@index=0
refresh
end
def refresh
return if !@battler
pbSetNarrowFont @Window.contents)
commands=[]
for i in 0...4
if @battler.moves.id!=0
commands.push(@battler.moves.name)
else
break
end
end
@Window.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
@Frame=0
@index=index
@updating=false
@doublebattle=doublebattle
@index=index
@SpriteX=0
@SpriteY=0
@SpriteXExtra=0
@SpriteYExtra=0
@SpriteVisible=false
@_iconbitmap=nil
self.visible=false
end
def selected=(value)
if @selected==1 && value!=1 && @SpriteYExtra>0
@SpriteYExtra=0
self.y @SpriteY
end
@selected=value
end
def visible=(value)
@SpriteVisible=value if !@updating
super
end
def x
return @SpriteX
end
def y
return @SpriteY
end
def x=(value)
@SpriteX=value
super(value @SpriteXExtra)
end
def y=(value)
@SpriteY=value
super(value @SpriteYExtra)
end
def update
@Frame+=1
@updating=true
if ( @Frame/9).floor&1)==1 && @selected==1 # When choosing commands for this Pokémon
@SpriteYExtra=2
else
@SpriteYExtra=0
end
if ( @Frame/9).floor&1)==1 && @selected==1 # When choosing commands for this Pokémon
self.x @SpriteX
self.y @SpriteY
self.visible @SpriteVisible
elsif @selected==2 # When targeted or damaged
self.x @SpriteX
self.y @SpriteY
self.visible= @Frame%10<7)
elsif
self.x @SpriteX
self.y @SpriteY
self.visible @SpriteVisible
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")
@SpriteX=254
@SpriteY=148+(Graphics.height-320)
@SpritebaseY=0
@SpritebaseX=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 @SpriteX+320
self.y @SpriteY
@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") @SpritebaseX+14 @SpritebaseY+6,false,base,shadow])
textpos.push([_INTL("Left: {1}",@battle.ballcount) @SpritebaseX+170 @SpritebaseY+40,
true,base,shadow])
pbDrawTextPositions(self.bitmap,textpos)
end
def update
super
if @appearing
self.x-=8
@appearing=false if self.x< @SpriteX
self.y @SpriteY
return
end
self.x @SpriteX
self.y @SpriteY
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
@SpritebaseY=0
@selected=0
@Frame=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
@SpritebaseX=16
else
@SpritebaseX=0
end
yoffset=(Graphics.height-320)
if doublebattle
case @battler.index
when 0
@databox=AnimatedBitmap.new("Graphics/Pictures/doublePlayerBox")
@SpriteX=256
@SpriteY=124+yoffset
when 1
@databox=AnimatedBitmap.new("Graphics/Pictures/doubleEnemyBox")
@SpriteX=26
@SpriteY=10+yoffset
@SpritebaseX=0
@SpritebaseY=0
when 2
@databox=AnimatedBitmap.new("Graphics/Pictures/doublePlayerBox")
@SpriteX=280
@SpriteY=174+yoffset
when 3
@databox=AnimatedBitmap.new("Graphics/Pictures/doubleEnemyBox")
@SpriteX=2
@SpriteY=60+yoffset
end
else
case @battler.index
when 0
@databox=AnimatedBitmap.new("Graphics/Pictures/singlePlayerBox")
@SpriteX=254
@SpriteY=148
@showhp=true
@showexp=true
@statusCX=40
@statusY=44
when 1
@databox=AnimatedBitmap.new("Graphics/Pictures/singleEnemyBox")
@SpriteX=26
@SpriteY=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 @SpriteX+320
else
self.x @SpriteX-320
end
self.y @SpriteY
@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+ @SpritebaseX+14
textpos.push([@battler.name @SpritebaseX+14 @SpritebaseY+6,false,base,shadow])
if @battler.gender==0 # Male
textpos.push([_INTL("?"),genderX @SpritebaseY+6,false,Color.new(8*8,25*8,31*8),shadow])
elsif @battler.gender==1 # Female
textpos.push([_INTL("?"),genderX @SpritebaseY+6,false,Color.new(31*8,19*8,18*8),shadow])
end
textpos.push([_INTL("Lv{1}",@battler.level) @SpritebaseX+170 @SpritebaseY+6,true,base,shadow])
if @showhp
textpos.push([hpstring @SpritebaseX+170 @SpritebaseY+40,true,base,shadow])
end
pbDrawTextPositions(self.bitmap,textpos)
if @battler.status>0
self.bitmap.blt @SpritebaseX+14 @SpritebaseY+@statusY,@statuses.bitmap,
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 @SpritebaseX+hpGaugeX @SpritebaseY+hpGaugeY,hpgauge,2,hpcolors[hpzone*2])
self.bitmap.fill_rect @SpritebaseX+hpGaugeX @SpritebaseY+hpGaugeY+2,hpgauge,2,hpcolors[hpzone*2+1])
# fill with black
self.bitmap.fill_rect @SpritebaseX+hpGaugeX+hpgauge @SpritebaseY+hpGaugeY,hpGaugeSize-hpgauge,2,PokeBattle_Scene::HPCOLORSHADOW4)
self.bitmap.fill_rect @SpritebaseX+hpGaugeX+hpgauge @SpritebaseY+hpGaugeY+2,hpGaugeSize-hpgauge,2,PokeBattle_Scene::HPCOLORBASE4)
if @showexp
# fill with EXP color
self.bitmap.fill_rect @SpritebaseX+expGaugeX @SpritebaseY+expGaugeY,self.exp,4,PokeBattle_Scene::EXPCOLOR)
end
end
def update
super
@Frame+=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< @SpriteX
else
self.x+=8
@appearing=false if self.x> @SpriteX
end
self.y @SpriteY
return
end
if ( @Frame/10).floor&1)==1 && @selected==1 # When choosing commands for this Pokémon
self.x @SpriteX
self.y @SpriteY+2
elsif ( @Frame/5).floor&1)==1 && @selected==2 # When targeted or damaged
self.x @SpriteX
self.y @SpriteY+2
else
self.x @SpriteX
self.y @SpriteY
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
@pokemonBattlerSprite=sprite
@pokemonBattlerSprite.visible=false
@pokemonBattlerSprite.color=Color.new(31*8,22*8,30*8)
@pokeballsprite=IconSprite.new(0,0,sprite.viewport)
@pokeballsprite.setBitmap(sprintf("Graphics/Pictures/ball%02d_0",@ballused))
if doublebattle
@Spritex=pkmn.index==1 ? 400 : 304
else
@Spritex=344
end
@Spritey=120+(Graphics.height-320)
@Spritehash=spritehash
@pokeballsprite.x @Spritex-8
@pokeballsprite.y @Spritey-8
@pkmn=pkmn
@endspritey=adjustBattleSpriteY(sprite,pkmn.species,pkmn.index)
@ShadowY @Spritey+18 # from top
@ShadowX @Spritex-32 # from left
@ShadowVisible=showShadow?(pkmn.species)
@ShadowY-=16 if doublebattle && pkmn.index==3
@stepspritey= @Spritey-@endspritey)
@zoomstep=(1.0-STARTZOOM)/SPRITESTEPS
@animdone=false
@Frame=0
end
def disposed?
return @disposed
end
def animdone?
return @animdone
end
def dispose
return if disposed?
@pokeballsprite.dispose
@disposed=true
end
def update
return if disposed?
@pokeballsprite.update
@Frame+=1
if @Frame==2
pbSEPlay("recall")
@pokeballsprite.setBitmap(sprintf("Graphics/Pictures/ball%02d_1",@ballused))
end
if @Frame==4
@pokemonBattlerSprite.visible=true
@pokemonBattlerSprite.zoom_x=STARTZOOM
@pokemonBattlerSprite.zoom_y=STARTZOOM
pbSpriteSetCenter @pokemonBattlerSprite @Spritex @Spritey)
pbPlayCry @pkmn.pokemon ? @pkmn.pokemon : @pkmn.species)
@pokeballsprite.setBitmap(sprintf("Graphics/Pictures/ball%02d_2",@ballused))
end
if @Frame==8
@pokeballsprite.visible=false
end
if @Frame>8 && @Frame<=16
color=Color.new(248,248,248,256-(16 @Frame)*32)
@Spritehash["enemybase"].color=color
@Spritehash["playerbase"].color=color
@Spritehash["battlebg"].color=color
end
if @Frame>16 && @Frame<=24
color=Color.new(248,248,248,(24 @Frame)*32)
@pokemonBattlerSprite.color.alpha=(24 @Frame)*32
@Spritehash["enemybase"].color=color
@Spritehash["playerbase"].color=color
@Spritehash["battlebg"].color=color
end
if @Frame>5 && @pokemonBattlerSprite.zoom_x<1.0
@pokemonBattlerSprite.zoom_x+=@zoomstep
@pokemonBattlerSprite.zoom_y+=@zoomstep
@pokemonBattlerSprite.zoom_x=1.0 if @pokemonBattlerSprite.zoom_x > 1.0
@pokemonBattlerSprite.zoom_y=1.0 if @pokemonBattlerSprite.zoom_y > 1.0
currentY @Spritey-(@stepspritey @pokemonBattlerSprite.zoom_y)
pbSpriteSetCenter @pokemonBattlerSprite @Spritex,currentY)
@pokemonBattlerSprite.y=currentY
end
if @pokemonBattlerSprite.color.alpha<=0 &&
@pokemonBattlerSprite.zoom_x>=1.0
@animdone=true
if @Spritehash["shadow# @pkmn.index}"]
@Spritehash["shadow# @pkmn.index}"].x @ShadowX
@Spritehash["shadow# @pkmn.index}"].y @ShadowY
@Spritehash["shadow# @pkmn.index}"].visible @ShadowVisible
end
end
end
end

def pokeballThrow(ball,shakes,targetBattler)
balltype=@battle.pbGetBallType(ball)
oldvisible @Sprites["shadow#{targetBattler}"].visible
@Sprites["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 @Sprites["pokemon#{targetBattler}"]
# pictures
pictureBall=PictureEx.new(0)
picturePoke=PictureEx.new(0)
pokeball=[360,32]
dims=[spritePoke.x,spritePoke.y]
center=getSpriteCenter @Sprites["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
@Sprites["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
@pokemonBattlerSprite=sprite
@pkmn=pkmn
@pokemonBattlerSprite.visible=false
@pokemonBattlerSprite.color=Color.new(16*8,23*8,30*8)
@Spritehash=spritehash
if doublebattle
@Spritex=pkmn.index==0 ? 64 : 180
else
@Spritex=128
end
@Spritey=Graphics.height-64
@endspritey=adjustBattleSpriteY @pokemonBattlerSprite,
pkmn.species,pkmn.index)
@animdone=false
@Frame=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?
@Frame+=1
if @Frame==4
@pokemonBattlerSprite.visible=true
@pokemonBattlerSprite.zoom_x=STARTZOOM
@pokemonBattlerSprite.zoom_y=STARTZOOM
pbSEPlay("recall")
pbSpriteSetCenter @pokemonBattlerSprite @Spritex @Spritey)
pbPlayCry @pkmn.pokemon ? @pkmn.pokemon : @pkmn.species)
end
if @Frame>8 && @Frame<=16
color=Color.new(248,248,248,256-(16 @Frame)*32)
@Spritehash["enemybase"].color=color
@Spritehash["playerbase"].color=color
@Spritehash["battlebg"].color=color
end
if @Frame>16 && @Frame<=24
color=Color.new(248,248,248,(24 @Frame)*32)
@pokemonBattlerSprite.color.alpha=(24 @Frame)*32
@Spritehash["enemybase"].color=color
@Spritehash["playerbase"].color=color
@Spritehash["battlebg"].color=color
end
if @Frame>5 && @pokemonBattlerSprite.zoom_x<1.0
@pokemonBattlerSprite.zoom_x+=0.1
@pokemonBattlerSprite.zoom_y+=0.1
@pokemonBattlerSprite.zoom_x=1.0 if @pokemonBattlerSprite.zoom_x > 1.0
@pokemonBattlerSprite.zoom_y=1.0 if @pokemonBattlerSprite.zoom_y > 1.0
pbSpriteSetCenter @pokemonBattlerSprite @Spritex,0)
@pokemonBattlerSprite.y @Spritey+(@endspritey @Spritey) @pokemonBattlerSprite.zoom_y
end
if @pokemonBattlerSprite.color.alpha<=0 &&
@pokemonBattlerSprite.zoom_x>=1.0
@animdone=true
end
end
end



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

class PlayerFadeAnimation
def initialize(sprites)
@Frame=0
@Sprites=sprites
@animdone=false
end
def animdone?
return @animdone
end
def update
return if @animdone
@Frame+=1
@Sprites["player"].x-=8
@Sprites["playerB"].x-=8 if @Sprites["playerB"]
@Sprites["partybase2"].x-=8
@Sprites["partybase2"].opacity-=12
for i in 0...6
if @Sprites["player#{i}"]
@Sprites["player#{i}"].opacity-=12
@Sprites["player#{i}"].x-=8 if @Frame>=i*4
end
end
pa @Sprites["player"]
pb @Sprites["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
@Sprites["player"].src_rect.x=pawidth*1 if @Frame>0
@Sprites["player"].src_rect.x=pawidth*2 if @Frame>8
@Sprites["player"].src_rect.x=pawidth*3 if @Frame>11
@Sprites["player"].src_rect.width=pawidth
else
pawidth=pa.bitmap.width
@Sprites["player"].src_rect.x=0
@Sprites["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
@Sprites["playerB"].src_rect.x=pbwidth*1 if @Frame>0
@Sprites["playerB"].src_rect.x=pbwidth*2 if @Frame>8
@Sprites["playerB"].src_rect.x=pbwidth*3 if @Frame>11
@Sprites["playerB"].src_rect.width=pbwidth
else
pbwidth=pb.bitmap.width
@Sprites["playerB"].src_rect.x=0
@Sprites["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]
@pkmnwindows=[nil,nil,nil,nil]
@Sprites={}
@battlestart=true
@messagemode=false
@abortable=false
@aborted=false
end

def pbUpdate
partyAnimationUpdate
@Sprites["battlebg"].update if @Sprites["battlebg"].respond_to?("update")
end

def pbGraphicsUpdate
partyAnimationUpdate
@Sprites["battlebg"].update if @Sprites["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)
@Sprites["messagebox"].visible=(windowtype==MESSAGEBOX||windowtype==COMMANDBOX||windowtype==FIGHTBOX||
windowtype==BLANK)
@Sprites["messagewindow"].visible=(windowtype==MESSAGEBOX)
@Sprites["commandwindow"].visible=(windowtype==COMMANDBOX)
@Sprites["fightwindow"].visible=(windowtype==FIGHTBOX)
end

def pbSetMessageMode(mode)
@messagemode=mode
msgwindow @Sprites["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 @Sprites["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 @Sprites["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 @Sprites["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 @Sprites["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 @Sprites["battler#{i}"]
@Sprites["battler#{i}"].update
end
if @Sprites["pokemon#{i}"]
@Sprites["pokemon#{i}"].update
end
end
end

def pbRefresh
for i in 0..3
if @Sprites["battler#{i}"]
@Sprites["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
@Sprites[id]=sprite
return sprite
end

def pbAddPlane(id,filename,viewport)
sprite=AnimatedPlane.new(viewport)
if filename
sprite.setBitmap(filename)
end
@Sprites[id]=sprite
return sprite
end

def pbDisposeSprites
pbDisposeSpriteHash @Sprites)
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 @Sprites["trainer"].bitmap
@Sprites["trainer"].y- @Sprites["trainer"].bitmap.height-128
end
20.times do
pbGraphicsUpdate
pbInputUpdate
@Sprites["trainer"].x-=6
end
end

def pbHideOpponent
20.times do
pbGraphicsUpdate
pbInputUpdate
@Sprites["trainer"].x+=6
end
end

def pbShowHelp(text)
@Sprites["helpwindow"].resizeToFit(text,Graphics.width)
@Sprites["helpwindow"].y=0
@Sprites["helpwindow"].x=0
@Sprites["helpwindow"].text=text
@Sprites["helpwindow"].visible=true
end

def pbHideHelp
@Sprites["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)
@Sprites["enemybase"].z=-1 # For compatibility with RGSS2
@Sprites["playerbase"].z=-1 # For compatibility with RGSS2
@Sprites["battlebg"].z=-1 # For compatibility with RGSS2
=begin
if outdoor
tone = $HourlyTones[Time.now.hour]
@Sprites["battlebg"].tone=tone
@Sprites["enemybase"].tone=tone
@Sprites["playerbase"].tone=tone
end
=end
end

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

def partyAnimationUpdate
return if !inPartyAnimation?
if @partyAnimPhase==0
@Sprites["partybase1"].x+=16
@Sprites["partybase2"].x-=16
@partyAnimPhase=1 if @Sprites["partybase1"].x @Sprites["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
@Sprites["enemy#{@partyAnimI}"].x+=20
@Sprites["player#{@partyAnimI}"].x-=20
if @Sprites["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]
@Sprites.clear
@Sprites.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)
@Sprites["partybase2"].mirror=true
@Sprites["partybase1"].visible=false
@Sprites["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 @Sprites["trainer"].bitmap
@Sprites["trainer"].y- @Sprites["trainer"].bitmap.height-128
end
if @Sprites["trainer2"] && @Sprites["trainer2"].bitmap
@Sprites["trainer2"].y- @Sprites["trainer2"].bitmap.height-128
end
@Sprites["shadow0"]=IconSprite.new(0,0,@viewport)
pbAddSprite("shadow1",0,0+@yoffset,"Graphics/Pictures/enemyshadow",@viewport)
@Sprites["shadow1"].visible=false
@Sprites["pokemon0"]=PokemonBattlerSprite.new(battle.doublebattle,0,@viewport)
@Sprites["pokemon1"]=PokemonBattlerSprite.new(battle.doublebattle,1,@viewport)
if battle.doublebattle
pbAddSprite("shadow3",0,0+@yoffset,"Graphics/Pictures/enemyshadow",@viewport)
@Sprites["shadow3"].visible=false
@Sprites["shadow2"]=IconSprite.new(0,0,@viewport)
@Sprites["pokemon3"]=PokemonBattlerSprite.new(battle.doublebattle,3,@viewport)
@Sprites["pokemon2"]=PokemonBattlerSprite.new(battle.doublebattle,2,@viewport)
end
@Sprites["battler0"]=PokemonDataBox.new(battle.battlers[0],battle.doublebattle,@viewport)
@Sprites["battler1"]=PokemonDataBox.new(battle.battlers[1],battle.doublebattle,@viewport)
if battle.doublebattle
@Sprites["battler2"]=PokemonDataBox.new(battle.battlers[2],battle.doublebattle,@viewport)
@Sprites["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 @Sprites["player"].bitmap
if @Sprites["player"].bitmap.width @Sprites["player"].bitmap.height
@Sprites["player"].src_rect.x=0
@Sprites["player"].src_rect.width @Sprites["player"].bitmap.width/4
end
end
if @Sprites["playerB"].bitmap
if @Sprites["playerB"].bitmap.width @Sprites["playerB"].bitmap.height
@Sprites["playerB"].src_rect.x=0
@Sprites["playerB"].src_rect.width @Sprites["playerB"].bitmap.width/4
end
end
else
trainerfile=sprintf("Graphics/Pictures/trback%03d",@battle.player.trainertype)
pbAddSprite("player",576,96+@yoffset,trainerfile,@viewport)
if @Sprites["player"].bitmap
if @Sprites["player"].bitmap.width @Sprites["player"].bitmap.height
@Sprites["player"].src_rect.x=0
@Sprites["player"].src_rect.width @Sprites["player"].bitmap.width/4
end
end
end
pbAddSprite("messagebox",0,Graphics.height-96,"Graphics/Pictures/messagebox",@viewport)
@Sprites["helpwindow"]=Window_UnformattedTextPokemon.newWithSize("",0,0,32,32,@viewport)
@Sprites["helpwindow"].visible=false
@Sprites["messagewindow"]=Window_AdvancedTextPokemon.new("")
@Sprites["commandwindow"]=CommandMenuDisplay.new(@viewport)
@Sprites["fightwindow"]=FightMenuDisplay.new(nil,@viewport)
@Sprites["messagewindow"].letterbyletter=true
@Sprites["messagewindow"].viewport=@viewport
@Sprites["messagebox"].z=50
@Sprites["messagewindow"].z=100
@Sprites["commandwindow"].z=100
@Sprites["fightwindow"].z=100
pbShowWindow(MESSAGEBOX)
pbSetMessageMode(false)
trainersprite1 @Sprites["trainer"]
trainersprite2 @Sprites["trainer2"]
if !@battle.opponent
@Sprites["trainer"].visible=false
if @battle.party2.length>=1
@Sprites["pokemon1"].color=Color.new(0,0,0,128)
@Sprites["pokemon1"].setPokemonBitmap(@battle.party2[0],false)
@Sprites["pokemon1"].x=-192 # ends at 144*2
@Sprites["shadow1"].x=-192+16*2
@Sprites["shadow1"].y=65*2+@yoffset
species=@battle.party2[0].species
@Sprites["pokemon1"].visible=true
@Sprites["shadow1"].visible=showShadow?(species)
pbPositionPokemonSprite(
@Sprites["pokemon1"],
@Sprites["pokemon1"].x,
@Sprites["pokemon1"].y
)
@Sprites["pokemon1"].y=adjustBattleSpriteY(
@Sprites["pokemon1"],species,1)
trainersprite1 @Sprites["pokemon1"]
end
if @battle.party2.length==2
@Sprites["pokemon1"].color=Color.new(0,0,0,160)
@Sprites["pokemon3"].color=Color.new(0,0,0,160)
@Sprites["pokemon1"].x=-144
@Sprites["shadow1"].x=-144+16*2
@Sprites["pokemon1"].y+=8
@Sprites["shadow1"].y=65*2+@yoffset+8
@Sprites["pokemon3"].setPokemonBitmap(@battle.party2[1],false)
@Sprites["pokemon3"].x=-240
@Sprites["shadow3"].x=-240+16*2
@Sprites["shadow3"].y=65*2+@yoffset
species=@battle.party2[1].species
@Sprites["pokemon3"].visible=true
@Sprites["shadow3"].visible=showShadow?(species)
pbPositionPokemonSprite(
@Sprites["pokemon3"],
@Sprites["pokemon3"].x,
@Sprites["pokemon3"].y
)
@Sprites["pokemon3"].y=adjustBattleSpriteY(
@Sprites["pokemon3"],species,3)
trainersprite2 @Sprites["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 @Sprites
i[1].ox=@viewport.rect.x
i[1].oy=@viewport.rect.y
end
@Sprites["enemybase"].x+=4
@Sprites["playerbase"].x-=4
@Sprites["shadow1"].x+=4
@Sprites["shadow3"].x+=4 if @Sprites["shadow3"]
trainersprite1.x+=4
trainersprite2.x+=4 if trainersprite2
@Sprites["player"].x-=4
@Sprites["playerB"].x-=4 if @Sprites["playerB"]
pbGraphicsUpdate
pbInputUpdate
break if @Sprites["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
@Sprites["partybase1"].visible=true
@Sprites["partybase2"].visible=true
else
@Sprites["battler1"].appear
@Sprites["battler3"].appear if @battle.party2.length==2
appearing=true
begin
pbGraphicsUpdate
pbInputUpdate
@Sprites["battler1"].update
appearing @Sprites["battler1"].appearing
@Sprites["pokemon1"].color.alpha-=16
@Sprites["pokemon1"].color @Sprites["pokemon1"].color
if @battle.party2.length==2
@Sprites["battler3"].update
@Sprites["pokemon3"].color.alpha-=16
@Sprites["pokemon3"].color @Sprites["pokemon3"].color
appearing=(appearing| @Sprites["battler3"].appearing)
end
end while appearing
end
end

def pbEndBattle(result)
@abortable=false
pbShowWindow(BLANK)
# Fade out all sprites
pbBGMFade(1.0)
pbFadeOutAndHide @Sprites)
pbDisposeSprites
end

def pbRecall(battlerindex)
@briefmessage=false
if @battle.pbIsOpposing?(battlerindex)
@Sprites["shadow#{battlerindex}"].visible=false
else
spritePoke @Sprites["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 @Sprites)
end
frame=0
@Sprites["pokemon#{battlerindex}"].setPokemonBitmap(pkmn,false)
sendout=PokeballSendOutAnimation.new @Sprites["pokemon#{battlerindex}"],
@Sprites,@battle.battlers[battlerindex],@battle.doublebattle)
loop do
pbGraphicsUpdate
pbInputUpdate
fadeanim.update if fadeanim
frame+=1
if frame==1
@Sprites["battler#{battlerindex}"].appear
end
if frame>=10
sendout.update
end
@Sprites["battler#{battlerindex}"].update
break if
(!fadeanim || fadeanim.animdone?) &&
sendout.animdone? &&
@Sprites["battler#{battlerindex}"].appearing
end
if @battle.battlers[battlerindex].pokemon.isShiny?
pbCommonAnimation("Shiny",@battle.battlers[battlerindex],nil)
end
sendout.dispose
if @showingenemy
@showingenemy=false
pbDisposeSprite @Sprites,"trainer")
pbDisposeSprite @Sprites,"partybase1")
for i in 0...6
pbDisposeSprite @Sprites,"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)
@Sprites["battler#{battlerindex}"].visible=false
@briefmessage=false
fadeanim=nil
if @showingplayer
fadeanim=PlayerFadeAnimation.new @Sprites)
end
frame=0
@Sprites["pokemon#{battlerindex}"].setPokemonBitmap(pkmn,true)
sendout=PokeballPlayerSendOutAnimation.new @Sprites["pokemon#{battlerindex}"],
@Sprites,@battle.battlers[battlerindex],@battle.doublebattle)
loop do
fadeanim.update if fadeanim
frame+=1
if frame>1 && !pictureBall.running? &&
@Sprites["battler#{battlerindex}"].appearing
@Sprites["battler#{battlerindex}"].appear
end
if frame>=3 && !pictureBall.running?
sendout.update
end
if (frame>=10 || !fadeanim) && pictureBall.running?
pictureBall.update
setPictureIconSprite(spriteBall,pictureBall)
end
@Sprites["battler#{battlerindex}"].update
pbGraphicsUpdate
pbInputUpdate
break if
(!fadeanim || fadeanim.animdone?) &&
sendout.animdone? &&
@Sprites["battler#{battlerindex}"].appearing
end
spriteBall.dispose
sendout.dispose
if @battle.battlers[battlerindex].pokemon.isShiny?
pbCommonAnimation("Shiny",@battle.battlers[battlerindex],nil)
end
if @showingplayer
@showingplayer=false
pbDisposeSprite @Sprites,"player")
pbDisposeSprite @Sprites,"partybase2")
for i in 0...6
pbDisposeSprite @Sprites,"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
@Sprites["battler0"]=SafariDataBox.new(@battle,@viewport)
@Sprites["battler0"].appear
loop do
@Sprites["battler0"].update
pbGraphicsUpdate
pbInputUpdate
break if
@Sprites["battler0"].appearing
end
pbRefresh
end

def pbCommandMenuEx(index,texts)
pbShowWindow(COMMANDBOX)
cw2 @Sprites["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 = @Sprites["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 @Sprites)
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 @Sprites["battler#{i}"]
@Sprites["battler#{i}"].refresh
end
end
pbFadeInAndShow @Sprites,oldsprites)
return ret
end

def pbSelectBattler(index,selectmode=1)
numwindows=@battle.doublebattle ? 4 : 2
for i in 0...numwindows
sprite @Sprites["battler#{i}"]
sprite.selected=(i==index) ? selectmode : 0
sprite @Sprites["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
@Sprites["battler#{i}"].selected=2
@Sprites["pokemon#{i}"].selected=2
else
@Sprites["battler#{i}"].selected=0
@Sprites["pokemon#{i}"].selected=0
end
@Sprites["battler#{i}"].update
@Sprites["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 @Sprites)
battler=@battle.battlers[0]
activecmd=0 if battler.index==index
inactives[battler.pokemonIndex]=0
partypos[0]=battler.pokemonIndex
if @battle.doublebattle && !@battle.fullparty1
battler=@battle.battlers[2]
activecmd=1 if battler.index==index
inactives[battler.pokemonIndex]=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 @Sprites,visiblesprites)
return ret
end

def pbDamageAnimation(pkmn,effectiveness)
pkmnsprite @Sprites["pokemon#{pkmn.index}"]
shadowsprite @Sprites["shadow#{pkmn.index}"]
sprite @Sprites["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 @Sprites["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
@Sprites["shadow#{pkmn.index}"].visible=false
pkmnsprite @Sprites["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
@Sprites["battler#{pkmn.index}"].opacity=32
pbGraphicsUpdate
pbInputUpdate
end
@Sprites["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
@Sprites["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
@Sprites["battler#{battler.index}"].animateEXP(startexplevel,endexplevel)
while @Sprites["battler#{battler.index}"].animatingEXP
pbGraphicsUpdate
pbInputUpdate
@Sprites["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 @Sprites["pokemon#{attacker.index}"]
shadow @Sprites["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 @Sprites["pokemon#{attacker.index}"]
shadow @Sprites["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 @Sprites["shadow#{i}"]
shadows=s ? s.visible : false
s.visible=false if s
end
yield
for i in 0...4
s @Sprites["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) ? @Sprites["pokemon#{attacker.index}"] : nil
target=(opponent) ? @Sprites["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


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.
=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
@Window=Window_CommandPokemon.newWithSize([],
Graphics.width-240,0-96,5,96);
@Window.columns=2
@Window.columnSpacing=4
@Window.viewport=viewport
@msgbox=Window_UnformattedTextPokemon.newWithSize(
"",4,384-96,Graphics.width @Window.width-4, 296,viewport) # @Window.width-4
@msgbox.baseColor=PokeBattle_Scene::MESSAGEBASECOLOR
@msgbox.shadowColor=PokeBattle_Scene::MESSAGESHADOWCOLOR
@msgbox.windowskin=nil
if PokeBattle_Scene::USECOMMANDBOX
@Window.opacity=0
end
@title=""
end

def index; @Window.index; end
def index=(value); @Window.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
}
@Window.commands=commands
end

def visible; @Window.visible; end
def visible=(value)
@Window.visible=value
@msgbox.visible=value
@display.visible=value if @display
end

def x; @Window.x; end
def x=(value)
@Window.x=value
@msgbox.x=value
@display.x=value if @display
end

def y; @Window.y; end
def y=(value)
@Window.y=value
@msgbox.y=value
@display.y=value if @display
end

def oy; @Window.oy; end
def oy=(value)
@Window.oy=value
@msgbox.oy=value
@display.oy=value if @display
end

def color; @Window.color; end
def color=(value)
@Window.color=value
@msgbox.color=value
@display.color=value if @display
end

def ox; @Window.ox; end
def ox=(value)
@Window.ox=value
@msgbox.ox=value
@display.ox=value if @display
end

def z; @Window.z; end
def z=(value)
@Window.z=value
@msgbox.z=value
@display.z=value if @display
end

def disposed?
return @msgbox.disposed? || @Window.disposed?
end

def dispose
return if disposed?
@msgbox.dispose
@Window.dispose
@display.dispose if @display
end

def update
@Sprites["pokemon1"].update if @sprit
@msgbox.update
@Window.update
@display.update if @display
end

def refresh
@msgbox.refresh
@Window.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
@Window.index=value
refresh
end
end

def visible; @Window.visible; end
def visible=(value)
@Window.visible=value
@info.visible=value
@display.visible=value if @display
end

def x; @Window.x; end
def x=(value)
@Window.x=value
@info.x=value
@display.x=value if @display
end

def y; @Window.y; end
def y=(value)
@Window.y=value
@info.y=value
@display.y=value if @display
end

def oy; @Window.oy; end
def oy=(value)
@Window.oy=value
@info.oy=value
@display.oy=value if @display
end

def color; @Window.color; end
def color=(value)
@Window.color=value
@info.color=value
@display.color=value if @display
end

def ox; @Window.ox; end
def ox=(value)
@Window.ox=value
@info.ox=value
@display.ox=value if @display
end

def z; @Window.z; end
def z=(value)
@Window.z=value
@info.z=value
@display.z=value if @display
end

def disposed?
return @info.disposed? || @Window.disposed?
end

def dispose
return if disposed?
@info.dispose
@display.dispose if @display
@Window.dispose
end

def update
@Sprites["pokemon1"].update if @sprit
@info.update
@Window.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
@Window=Window_CommandPokemon.newWithSize([],
0,384-96,320,96,viewport)
@Window.columns=2
@Window.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
@Window.opacity=0
@info.opacity=0
end
@battler=battler
@index=0
refresh
end

def refresh
return if !@battler
pbSetNarrowFont @Window.contents)
commands=[]
for i in 0...4
if @battler.moves.id!=0
commands.push(@battler.moves.name)
else
break
end
end
@Window.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
@Frame=0
@index=index
@updating=false
@doublebattle=doublebattle
@index=index
@SpriteX=0
@SpriteY=0
@SpriteXExtra=0
@SpriteYExtra=0
@SpriteVisible=false
@_iconbitmap=nil
self.visible=false
end

def selected=(value)
if @selected==1 && value!=1 && @SpriteYExtra>0
@SpriteYExtra=0
self.y @SpriteY
end
@selected=value
end

def visible=(value)
@SpriteVisible=value if !@updating
super
end

def x
return @SpriteX
end

def y
return @SpriteY
end

def x=(value)
@SpriteX=value
super(value @SpriteXExtra)
end

def y=(value)
@SpriteY=value
super(value @SpriteYExtra)
end

def update
@Sprites["pokemon1"].update if @sprit
@Frame+=1
@updating=true
if ( @Frame/9).floor&1)==1 && @selected==1 # When choosing commands for this Pokémon
@SpriteYExtra=2
else
@SpriteYExtra=0
end
if ( @Frame/9).floor&1)==1 && @selected==1 # When choosing commands for this Pokémon
self.x @SpriteX
self.y @SpriteY
self.visible @SpriteVisible
elsif @selected==2 # When targeted or damaged
self.x @SpriteX
self.y @SpriteY
self.visible= @Frame%10<7)
elsif
self.x @SpriteX
self.y @SpriteY
self.visible @SpriteVisible
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")
@SpriteX=254
@SpriteY=148+(384-320)
@SpritebaseY=0
@SpritebaseX=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 @SpriteX+320
self.y @SpriteY
@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") @SpritebaseX+14 @SpritebaseY+6,false,base,shadow])
textpos.push([_INTL("Left: {1}",@battle.ballcount) @SpritebaseX+170 @SpritebaseY+40,
true,base,shadow])
pbDrawTextPositions(self.bitmap,textpos)
end

def update
super
@Sprites["pokemon1"].update if @sprit
if @appearing
self.x-=8
@appearing=false if self.x< @SpriteX
self.y @SpriteY
return
end
self.x @SpriteX
self.y @SpriteY
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
@SpritebaseY=0
@selected=0
@Frame=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
@SpritebaseX=16
else
@SpritebaseX=0
end
yoffset=(384-320)
if doublebattle
case @battler.index
when 0
@databox=AnimatedBitmap.new("Graphics/Pictures/doublePlayerBox")

@SpriteX=256
@SpriteY=124+yoffset
when 1
@databox=AnimatedBitmap.new("Graphics/Pictures/doubleEnemyBox")

@SpriteX=26
@SpriteY=10+yoffset
@SpritebaseX=0
@SpritebaseY=0
when 2
@databox=AnimatedBitmap.new("Graphics/Pictures/doublePlayerBox")

@SpriteX=280
@SpriteY=174+yoffset
when 3
@databox=AnimatedBitmap.new("Graphics/Pictures/doubleEnemyBox")

@SpriteX=2
@SpriteY=60+yoffset
end
else
case @battler.index
when 0
@databox=AnimatedBitmap.new("Graphics/Pictures/singlePlayerBox")
@SpriteX=278-11
@SpriteY=148+yoffset+4
@showhp=true
@showexp=true
@statusCX=40
@statusY=44
@tubox = true
when 1
@databox=AnimatedBitmap.new("Graphics/Pictures/singleEnemyBox")
@SpriteX=26-36+10
@SpriteY=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 @SpriteX+320
else
self.x @SpriteX-320
end
self.y @SpriteY
@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+ @SpritebaseX+14

if @tubox == true
textpos.push([@battler.name @SpritebaseX+18 @SpritebaseY-2,false,base,shadow])
else
textpos.push([@battler.name @SpritebaseX+14+28 @SpritebaseY-2,false,base,shadow])
end

if @battler.index == 0

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

else

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

end

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

if @showhp
textpos.push([hpstring @SpritebaseX+154 @SpritebaseY+26,true,base,shadow])
end

pbDrawTextPositionsTB(self.bitmap,textpos)

if @battler.status>0
self.bitmap.blt @SpritebaseX+14 @SpritebaseY+@statusY,@statuses.bitmap,
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 @SpritebaseX+hpGaugeX @SpritebaseY+hpGaugeY,hpgauge,2,hpcolors[hpzone*2+1])
self.bitmap.fill_rect @SpritebaseX+hpGaugeX @SpritebaseY+hpGaugeY+2,hpgauge,2,hpcolors[hpzone*2])
# fill with black
#self.bitmap.fill_rect @SpritebaseX+hpGaugeX+hpgauge @SpritebaseY+hpGaugeY,hpGaugeSize-hpgauge,2,PokeBattle_Scene::HPCOLORSHADOW4)
#self.bitmap.fill_rect @SpritebaseX+hpGaugeX+hpgauge @SpritebaseY+hpGaugeY+2,hpGaugeSize-hpgauge,2,PokeBattle_Scene::HPCOLORBASE4)
if @showexp
# fill with EXP color
self.bitmap.fill_rect @SpritebaseX+expGaugeX @SpritebaseY+expGaugeY,self.exp,2,PokeBattle_Scene::EXPCOLOR)
end
end
def update
super

@Frame+=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< @SpriteX
else
self.x+=8
@appearing=false if self.x> @SpriteX
end
self.y @SpriteY
return
end

if ( @Frame/10).floor&1)==1 && @selected==1 # When choosing commands for this Pokémon
self.x @SpriteX
self.y @SpriteY+2
elsif ( @Frame/5).floor&1)==1 && @selected==2 # When targeted or damaged
self.x @SpriteX
self.y @SpriteY+2
else
self.x @SpriteX
self.y @SpriteY
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
@pokemonBattlerSprite=sprite
@pokemonBattlerSprite.visible=false
@pokemonBattlerSprite.color=Color.new(31*8,22*8,30*8)
@pokeballsprite=IconSprite.new(0,0,sprite.viewport)
@pokeballsprite.setBitmap(sprintf("Graphics/Pictures/ball%02d_0",@ballused))
if doublebattle
@Spritex=pkmn.index==1 ? 400 : 304
else
@Spritex=344
end
@Spritex+=Graphics.width-480
@Spritey=120
@Spritehash=spritehash
@pokeballsprite.x @Spritex-8
@pokeballsprite.y @Spritey-8
@pkmn=pkmn
@endspritey=adjustBattleSpriteY(sprite,pkmn.species,pkmn.index)
@ShadowY @Spritey+18 # from top
@ShadowX @Spritex-32 # from left
@ShadowVisible=showShadow?(pkmn.species)
@ShadowY-=16 if doublebattle && pkmn.index==3
@stepspritey= @Spritey-@endspritey)
@zoomstep=(2.0-STARTZOOM)/SPRITESTEPS
@animdone=false
@Frame=0
end

def disposed?
return @disposed
end

def animdone?
return @animdone
end

def dispose
return if disposed?
@pokeballsprite.dispose
@disposed=true
end

def update
return if disposed?
@Sprites["pokemon1"].update if @sprit
@pokeballsprite.update
@Frame+=1
if @Frame==2
pbSEPlay("recall")
@pokeballsprite.setBitmap(sprintf("Graphics/Pictures/ball%02d_1",@ballused))
end
if @Frame==4
@pokemonBattlerSprite.visible=true
@pokemonBattlerSprite.zoom_x=STARTZOOM
@pokemonBattlerSprite.zoom_y=STARTZOOM
pbSpriteSetCenter @pokemonBattlerSprite @Spritex @Spritey)
pbPlayCry @pkmn.pokemon ? @pkmn.pokemon : @pkmn.species)
@pokeballsprite.setBitmap(sprintf("Graphics/Pictures/ball%02d_2",@ballused))
end
if @Frame==8
@pokeballsprite.visible=false
end
if @Frame>8 && @Frame<=16
color=Color.new(248,248,248,256-(16 @Frame)*32)
@Spritehash["enemybase"].color=color
@Spritehash["playerbase"].color=color
@Spritehash["battlebg"].color=color
end
if @Frame>16 && @Frame<=24
color=Color.new(248,248,248,(24 @Frame)*32)
@pokemonBattlerSprite.color.alpha=(24 @Frame)*32
@Spritehash["enemybase"].color=color
@Spritehash["playerbase"].color=color
@Spritehash["battlebg"].color=color
end
if @Frame>5 && @pokemonBattlerSprite.zoom_x<2.0
@pokemonBattlerSprite.zoom_x+=@zoomstep
@pokemonBattlerSprite.zoom_y+=@zoomstep
@pokemonBattlerSprite.zoom_x=2.0 if @pokemonBattlerSprite.zoom_x > 2.0
@pokemonBattlerSprite.zoom_y=2.0 if @pokemonBattlerSprite.zoom_y > 2.0
currentY @Spritey-(@stepspritey @pokemonBattlerSprite.zoom_y)
pbSpriteSetCenter @pokemonBattlerSprite @Spritex,currentY)
@pokemonBattlerSprite.y=currentY
end
if @pokemonBattlerSprite.color.alpha<=0 && @pokemonBattlerSprite.zoom_x>=2.0
@animdone=true
if @Spritehash["shadow# @pkmn.index}"]
@Spritehash["shadow# @pkmn.index}"].x @ShadowX
@Spritehash["shadow# @pkmn.index}"].y @ShadowY
@Spritehash["shadow# @pkmn.index}"].visible @ShadowVisible
end
end
end
end



def pokeballThrow(ball,shakes,targetBattler)
balltype=@battle.pbGetBallType(ball)
oldvisible @Sprites["shadow#{targetBattler}"].visible
@Sprites["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 @Sprites["pokemon#{targetBattler}"]
# pictures
pictureBall=PictureEx.new(0)
picturePoke=PictureEx.new(0)
pokeball=[Graphics.width-130,64]
dims=[spritePoke.x,spritePoke.y]
center=getSpriteCenter @Sprites["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
@Sprites["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
@pokemonBattlerSprite=sprite
@pkmn=pkmn
@pokemonBattlerSprite.visible=false
@pokemonBattlerSprite.color=Color.new(16*8,23*8,30*8)
@Spritehash=spritehash
$tupkmn @pokemonBattlerSprite
@pokemonBattlerSprite.z=99999
@sumandoplayer = 814
if doublebattle
@Spritex=pkmn.index==0 ? 64 : 180
else
@Spritex=232+26
end
@Spritey=384-64+30
@endspritey=adjustBattleSpriteYBattle @pokemonBattlerSprite,
pkmn.species,pkmn.index)
@animdone=false
@lolsal = 0
@Frame=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?
@Frame+=1

if @Frame==4
@pokemonBattlerSprite.visible=true
@pokemonBattlerSprite.zoom_x=STARTZOOM
@pokemonBattlerSprite.zoom_y=STARTZOOM
pbSEPlay("recall")
pbSpriteSetCenter @pokemonBattlerSprite @Spritex @Spritey)
pbPlayCry @pkmn.pokemon ? @pkmn.pokemon : @pkmn.species)
end
if @Frame>8 && @Frame<=16
color=Color.new(248,248,248,256-(16 @Frame)*32)
@Spritehash["enemybase"].color=color
@Spritehash["playerbase"].color=color
@Spritehash["battlebg"].color=color
end
if @Frame>16 && @Frame<=24
color=Color.new(248,248,248,(24 @Frame)*32)
@pokemonBattlerSprite.color.alpha=(24 @Frame)*32
@Spritehash["enemybase"].color=color
@Spritehash["playerbase"].color=color
@Spritehash["battlebg"].color=color
end
if @Frame>5 && @pokemonBattlerSprite.zoom_x<2.0
@pokemonBattlerSprite.zoom_x+=0.1
@pokemonBattlerSprite.zoom_y+=0.1
@pokemonBattlerSprite.zoom_x=2.0 if @pokemonBattlerSprite.zoom_x > 2.0
@pokemonBattlerSprite.zoom_y=2.0 if @pokemonBattlerSprite.zoom_y > 2.0
pbSpriteSetCenter @pokemonBattlerSprite @Spritex,0)
@pokemonBattlerSprite.y @Spritey+(@endspritey @Spritey) @pokemonBattlerSprite.zoom_y
end
if @pokemonBattlerSprite.color.alpha<=0 &&
@pokemonBattlerSprite.zoom_x>=2.0
@animdone=true
$canupdate5 = false
@lolsal +=1

if @lolsal>=16
$esperahp = true
end

if @lolsal>=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
@pokemonBattlerSprite.x-=20 if @pokemonBattlerSprite.zoom_x != 3.0 @pokemonBattlerSprite.y+=10 if @pokemonBattlerSprite.zoom_x != 3.0
@pokemonBattlerSprite.zoom_x+=0.125 if @pokemonBattlerSprite.zoom_x != 3.0 @pokemonBattlerSprite.zoom_y+=0.125 if @pokemonBattlerSprite.zoom_x != 3.0

end

end
end
end

class TrainerFadeAnimation
def initialize(sprites)
@Frame=0
@Sprites=sprites
@animdone=false
end

def animdone?
return @animdone
end

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



class PlayerFadeAnimation
def initialize(sprites)
@Frame=0
@Sprites=sprites
@animdone=false
@salpokemon1 = 0
@salpokemon2 = 0
@salpokemon3 = 0
@salpokemon4 = 0
@salpokemon5 = 0
@Sprites["playerbase"].zoom_y = 3.0
end
def animdone?
return @animdone
end
def update
return if @animdone

@Sprites["enemybase"].zoom_x-=0.125 if @Sprites["enemybase"].zoom_x != 1.0 @Sprites["enemybase"].zoom_y-=0.125 if @Sprites["enemybase"].zoom_x != 1.0
@Sprites["enemybase"].y-=2 if @Sprites["enemybase"].zoom_x != 1.0 @Sprites["enemybase"].x+=12 if @Sprites["enemybase"].zoom_x != 1.0
@Sprites["playerbase"].zoom_x-=0.125 if @Sprites["playerbase"].zoom_x != 2.0 @Sprites["playerbase"].zoom_y-=0.125 if @Sprites["playerbase"].zoom_y != 2.0
@Sprites["playerbase"].y-=16 if @Sprites["playerbase"].zoom_x != 2.0 @Sprites["playerbase"].x+=26 if @Sprites["playerbase"].zoom_x != 2.0
@Sprites["pokemon1"].zoom_x-=0.125 if @Sprites["enemybase"].zoom_x != 1.0 @Sprites["pokemon1"].zoom_y-=0.125 if @Sprites["enemybase"].zoom_x != 1.0
@Sprites["pokemon1"].y+=5.5 if @Sprites["enemybase"].zoom_x != 1.0 @Sprites["pokemon1"].x+=8.5 if @Sprites["enemybase"].zoom_x != 1.0

$pokemon1 = @Sprites["pokemon1"]

@Frame+=1
@Sprites["player"].x-=8
@Sprites["playerB"].x-=8 if @Sprites["playerB"]
@Sprites["partybase2"].x-=8
@Sprites["partybase2"].opacity-=12
for i in 0...6
if @Sprites["player#{i}"]
@Sprites["player#{i}"].opacity-=12
@Sprites["player#{i}"].x-=8 if @Frame>=i*4
end
end
pa @Sprites["player"]
pb @Sprites["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
@Sprites["player"].src_rect.x=pawidth*1 if @Frame>0
@Sprites["player"].src_rect.x=pawidth*2 if @Frame>8
@Sprites["player"].src_rect.x=pawidth*3 if @Frame>11
@Sprites["player"].src_rect.width=pawidth
else
pawidth=pa.bitmap.width
@Sprites["player"].src_rect.x=0
@Sprites["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
@Sprites["playerB"].src_rect.x=pbwidth*1 if @Frame>0
@Sprites["playerB"].src_rect.x=pbwidth*2 if @Frame>8
@Sprites["playerB"].src_rect.x=pbwidth*3 if @Frame>11
@Sprites["playerB"].src_rect.width=pbwidth
else
pbwidth=pb.bitmap.width
@Sprites["playerB"].src_rect.x=0
@Sprites["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]
@pkmnwindows=[nil,nil,nil,nil]
@Sprites={}
@battlestart=true
@messagemode=false
@abortable=false
@aborted=false
end

def pbUpdate
partyAnimationUpdate
@Sprites["battlebg"].update if @Sprites["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

@Sprites["battlebg"].update if @Sprites["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)
@Sprites["messagebox"].visible=(windowtype==MESSAGEBOX||windowtype==COMMANDBOX||windowtype==FIGHTBOX||
windowtype==BLANK)
@Sprites["messagebox"].visible=false
@Sprites["messagebox"].z=99999
@Sprites["messagebox"].opacity=150
@Sprites["messagewindow"].visible=(windowtype==MESSAGEBOX)
@Sprites["messagewindow"].z=999999
@Sprites["commandwindow"].visible=(windowtype==COMMANDBOX)
@Sprites["fightwindow"].visible=(windowtype==FIGHTBOX)
end

def pbSetMessageMode(mode)
@messagemode=mode
msgwindow @Sprites["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 @Sprites["messagewindow"]
@Sprites["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 @Sprites["messagewindow"]
@Sprites["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 @Sprites["messagewindow"]
@Sprites["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 @Sprites["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 @Sprites["battler#{i}"]
@Sprites["battler#{i}"].update
end
if @Sprites["pokemon#{i}"]
@Sprites["pokemon#{i}"].update
end
end
end

def pbRefresh
for i in 0..3
if @Sprites["battler#{i}"]
@Sprites["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
@Sprites[id]=sprite
return sprite
end

def pbAddPlane(id,filename,viewport)
sprite=AnimatedPlane.new(viewport)
if filename
sprite.setBitmap(filename)
end
@Sprites[id]=sprite
return sprite
end

def pbDisposeSprites
pbDisposeSpriteHash @Sprites)
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 @Sprites["trainer"].bitmap
@Sprites["trainer"].y- @Sprites["trainer"].bitmap.height-128
end
20.times do
pbGraphicsUpdate
pbInputUpdate
@Sprites["trainer"].x-=6
end
end

def pbHideOpponent
20.times do
pbGraphicsUpdate
pbInputUpdate
@Sprites["trainer"].x+=6
end
end

def pbShowHelp(text)
@Sprites["helpwindow"].resizeToFit(text,Graphics.width)
@Sprites["helpwindow"].y=0
@Sprites["helpwindow"].x=0
@Sprites["helpwindow"].text=text
@Sprites["helpwindow"].visible=true
end

def pbHideHelp
@Sprites["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)
@Sprites["enemybase"].z=-1 # For compatibility with RGSS2
@Sprites["playerbase"].z=-1 # For compatibility with RGSS2
@Sprites["battlebg"].z=-1 # For compatibility with RGSS2

@Sprites["enemybase"].zoom_x = 3.0
@Sprites["enemybase"].zoom_y = 3.6

@Sprites["playerbase"].zoom_x = 3.0
@Sprites["playerbase"].zoom_y = 3.9

@Sprites["battlebg"].zoom_x = 3.0
@Sprites["battlebg"].zoom_y = 3.0

=begin
if outdoor
tone = $HourlyTones[Time.now.hour]
@Sprites["battlebg"].tone=tone
@Sprites["enemybase"].tone=tone
@Sprites["playerbase"].tone=tone
end
=end
end

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

def partyAnimationUpdate
return if !inPartyAnimation?
if @partyAnimPhase==0
@Sprites["partybase1"].x+=16
@Sprites["partybase2"].x-=16
@partyAnimPhase=1 if @Sprites["partybase1"].x @Sprites["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
@Sprites["enemy#{@partyAnimI}"].x+=20
@Sprites["player#{@partyAnimI}"].x-=20
if @Sprites["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]
@Sprites.clear
@Sprites.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)

@Sprites["battlebg2"] = Sprite.new(@viewport)
@Sprites["battlebg2"].bitmap=RPG::Cache.picture("battleballbg")
@Sprites["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)
@Sprites["partybase2"].mirror=true
@Sprites["partybase1"].visible=false
@Sprites["partybase2"].visible=false
$enemybase = @Sprites["enemybase"]
$playerbase = @Sprites["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 @Sprites["trainer"].bitmap
@Sprites["trainer"].y- @Sprites["trainer"].bitmap.height-128
end
if @Sprites["trainer2"] && @Sprites["trainer2"].bitmap
@Sprites["trainer2"].y- @Sprites["trainer2"].bitmap.height-128
end
@Sprites["shadow0"]=IconSprite.new(0,0,@viewport)
pbAddSprite("shadow1",0,0,"Graphics/Pictures/enemyshadow",@viewport)
@Sprites["shadow1"].visible=false
@Sprites["pokemon0"]=PokemonBattlerSprite.new(battle.doublebattle,0,@viewport)
@Sprites["pokemon1"]=PokemonBattlerSprite.new(battle.doublebattle,1,@viewport)
if battle.doublebattle
pbAddSprite("shadow3",0,0,"Graphics/Pictures/enemyshadow",@viewport)
@Sprites["shadow3"].visible=false
@Sprites["shadow2"]=IconSprite.new(0,0,@viewport)
@Sprites["pokemon3"]=PokemonBattlerSprite.new(battle.doublebattle,3,@viewport)
@Sprites["pokemon2"]=PokemonBattlerSprite.new(battle.doublebattle,2,@viewport)
end
@Sprites["battler0"]=PokemonDataBox.new(battle.battlers[0],battle.doublebattle,@viewport)
@Sprites["battler1"]=PokemonDataBox.new(battle.battlers[1],battle.doublebattle,@viewport)
if battle.doublebattle
@Sprites["battler2"]=PokemonDataBox.new(battle.battlers[2],battle.doublebattle,@viewport)
@Sprites["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 @Sprites["player"].bitmap
if @Sprites["player"].bitmap.width @Sprites["player"].bitmap.height
@Sprites["player"].src_rect.x=0
@Sprites["player"].src_rect.width @Sprites["player"].bitmap.width/5
end
end
if @Sprites["playerB"].bitmap
if @Sprites["playerB"].bitmap.width @Sprites["playerB"].bitmap.height
@Sprites["playerB"].src_rect.x=0
@Sprites["playerB"].src_rect.width @Sprites["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 @Sprites["player"].bitmap
if @Sprites["player"].bitmap.width @Sprites["player"].bitmap.height
@Sprites["player"].src_rect.x=0
@Sprites["player"].src_rect.width @Sprites["player"].bitmap.width/5
end
end
end
pbAddSprite("messagebox",0,384-90,"Graphics/Pictures/messagebox",@viewport)
@Sprites["helpwindow"]=Window_UnformattedTextPokemon.newWithSize("",0,0,32,32,@viewport)
@Sprites["helpwindow"].visible=false
@Sprites["messagewindow"]=Window_AdvancedTextPokemon.new("")
@Sprites["commandwindow"]=CommandMenuDisplay.new(@viewport)
@Sprites["fightwindow"]=FightMenuDisplay.new(nil,@viewport)
@Sprites["messagewindow"].letterbyletter=true
@Sprites["messagewindow"].viewport=@viewport


@Sprites["messagebox"].z=99999
@Sprites["messagewindow"].z=999999
@Sprites["commandwindow"].z=999999
@Sprites["fightwindow"].z=999999
pbShowWindow(MESSAGEBOX)
pbSetMessageMode(false)
trainersprite1 @Sprites["trainer"]
trainersprite2 @Sprites["trainer2"]
if !@battle.opponent
$batallasalvaje = true
@Sprites["trainer"].visible=false
if @battle.party2.length>=1
@Sprites["pokemon1"].color=Color.new(0,0,0,128)
@Sprites["pokemon1"].setPokemonBitmap(@battle.party2[0],false)
@Sprites["pokemon1"].x=180-40 # ends at 144*2
@Sprites["pokemon1"].zoom_x = 3.0
@Sprites["pokemon1"].zoom_y = 3.0
@Sprites["shadow1"].x=-192+16*2
@Sprites["shadow1"].y=65*2
species=@battle.party2[0].species
@Sprites["pokemon1"].visible=true
@Sprites["shadow1"].visible=showShadow?(species)
pbPositionPokemonSprite(
@Sprites["pokemon1"] @Sprites["pokemon1"].x @Sprites["pokemon1"].y
)
@Sprites["pokemon1"].y=adjustBattleSpriteY(
@Sprites["pokemon1"],species,1)+10
trainersprite1 @Sprites["pokemon1"]

if @Sprites["pokemon1"]

@Sprites["wildshadow"]=Sprite.new(@viewport)
@Sprites["wildshadow"].bitmap @Sprites["pokemon1"].bitmap
@Sprites["wildshadow"].y @Sprites["pokemon1"].y*3+20
@Sprites["wildshadow"].x @Sprites["pokemon1"].x+10
@Sprites["wildshadow"].zoom_y @Sprites["pokemon1"].zoom_y/3
@Sprites["wildshadow"].zoom_x @Sprites["pokemon1"].zoom_x
@Sprites["wildshadow"].tone=Tone.new(-255,-255,-255,-255)
@Sprites["wildshadow"].opacity=0
@Sprites["wildshadow"].z @Sprites["pokemon1"].z-1
@Sprites["wildshadow"].angle=-10

end

end
if @battle.party2.length==2
@Sprites["pokemon1"].color=Color.new(0,0,0,160)
@Sprites["pokemon3"].color=Color.new(0,0,0,160)
@Sprites["pokemon1"].x=-144
@Sprites["shadow1"].x=-144+16*2
@Sprites["pokemon1"].y+=8
@Sprites["shadow1"].y=65*2+8
@Sprites["pokemon3"].setPokemonBitmap(@battle.party2[1],false)
@Sprites["pokemon3"].x=-240
@Sprites["shadow3"].x=-240+16*2
@Sprites["shadow3"].y=65*2
species=@battle.party2[1].species
@Sprites["pokemon3"].visible=true
@Sprites["shadow3"].visible=showShadow?(species)
pbPositionPokemonSprite(
@Sprites["pokemon3"] @Sprites["pokemon3"].x @Sprites["pokemon3"].y
)
@Sprites["pokemon3"].y=adjustBattleSpriteY(
@Sprites["pokemon3"],species,3)
trainersprite2 @Sprites["pokemon3"]
end
end
loop do

appearspeed=4
@tpb += 1
pbGraphicsUpdate
pbInputUpdate

if @tpb >= 20
@Sprites["pokemon1"].zoom_x -= 0.125 if @Sprites["pokemon1"].zoom_x != 2.0 @Sprites["pokemon1"].zoom_y = @Sprites["pokemon1"].zoom_x
@Sprites["wildshadow"].zoom_y = @Sprites["pokemon1"].zoom_y/3 @Sprites["wildshadow"].zoom_x = @Sprites["pokemon1"].zoom_x
@Sprites["enemybase"].zoom_x -= 0.125 if @Sprites["enemybase"].zoom_x != 2.0 @Sprites["enemybase"].zoom_y = @Sprites["enemybase"].zoom_x
@Sprites["battlebg"].zoom_x -= 0.125 if @Sprites["enemybase"].zoom_x != 2.0 @Sprites["battlebg"].zoom_y = @Sprites["battlebg"].zoom_x
@Sprites["enemybase"].x += 20 if @Sprites["enemybase"].zoom_x != 2.0 @Sprites["enemybase"].y -= 10 if @Sprites["enemybase"].zoom_x != 2.0
@Sprites["playerbase"].x += 68 if @Sprites["enemybase"].zoom_x != 2.0 @Sprites["playerbase"].y -= 30 if @Sprites["enemybase"].zoom_x != 2.0
@Sprites["pokemon1"].x += 17 if @Sprites["pokemon1"].zoom_x != 2.0 @Sprites["pokemon1"].y -= 5 if @Sprites["pokemon1"].zoom_x != 2.0
@Sprites["wildshadow"].y = @Sprites["pokemon1"].y*3+20 @Sprites["wildshadow"].x = @Sprites["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
@Sprites["partybase1"].visible=true
@Sprites["partybase2"].visible=true
else
@Sprites["battler1"].appear
@Sprites["battler3"].appear if @battle.party2.length==2
appearing=true
begin
pbGraphicsUpdate
pbInputUpdate
@Sprites["battler1"].update
appearing @Sprites["battler1"].appearing
@Sprites["pokemon1"].color.alpha-=16
@Sprites["pokemon1"].color @Sprites["pokemon1"].color
if @battle.party2.length==2
@Sprites["battler3"].update
@Sprites["pokemon3"].color.alpha-=16
@Sprites["pokemon3"].color @Sprites["pokemon3"].color
appearing=(appearing| @Sprites["battler3"].appearing)
end
end while appearing
end
end

def pbEndBattle(result)
@abortable=false
pbShowWindow(BLANK)
# Fade out all sprites
pbBGMFade(2.0)
pbFadeOutAndHide @Sprites)
pbDisposeSprites
end

def pbRecall(battlerindex)
@briefmessage=false
if @battle.pbIsOpposing?(battlerindex)
@Sprites["shadow#{battlerindex}"].visible=false
else
spritePoke @Sprites["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 @Sprites)
end
frame=0
@Sprites["pokemon#{battlerindex}"].setPokemonBitmap(pkmn,false)
sendout=PokeballSendOutAnimation.new @Sprites["pokemon#{battlerindex}"],
@Sprites,@battle.battlers[battlerindex],@battle.doublebattle)
loop do
pbGraphicsUpdate
pbInputUpdate
fadeanim.update if fadeanim
frame+=1
if frame==1
@Sprites["battler#{battlerindex}"].appear
end
if frame>=10
sendout.update
end
@Sprites["battler#{battlerindex}"].update
break if (!fadeanim || fadeanim.animdone?) && sendout.animdone? &&
@Sprites["battler#{battlerindex}"].appearing
end
if @battle.battlers[battlerindex].pokemon.isShiny?
pbCommonAnimation("Shiny",@battle.battlers[battlerindex],nil)
end
sendout.dispose
if @showingenemy
@showingenemy=false
pbDisposeSprite @Sprites,"trainer")
pbDisposeSprite @Sprites,"partybase1")
for i in 0...6
pbDisposeSprite @Sprites,"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)
@Sprites["battler#{battlerindex}"].visible=false
@briefmessage=false
fadeanim=nil

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


@tpb9 +=1

fadeanim.update if fadeanim
frame+=1
if frame>1 && !pictureBall.running? && @Sprites["battler#{battlerindex}"].appearing
@Sprites["battler#{battlerindex}"].appear
end
if frame>=3 && !pictureBall.running?
sendout.update
end
if (frame>=10 || !fadeanim) && pictureBall.running?
pictureBall.update
setPictureIconSprite(spriteBall,pictureBall)
end
@Sprites["battler#{battlerindex}"].update

pictureBall.moveVisible(1,false) if @tpb9 ==60

pbGraphicsUpdate
pbInputUpdate
$mouse.visible
$mouse.update

if @Sprites["playerbase"].zoom_y >= 3.0
@Sprites["playerbase"].zoom_y = 3.9
end

break if @tpb9 == 130
end
@tpb9 = 0
spriteBall.dispose
sendout.dispose
if @battle.battlers[battlerindex].pokemon.isShiny?
pbCommonAnimation("Shiny",@battle.battlers[battlerindex],nil)
end
if @showingplayer
@showingplayer=false
pbDisposeSprite @Sprites,"player")
pbDisposeSprite @Sprites,"partybase2")
for i in 0...6
pbDisposeSprite @Sprites,"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
@Sprites["battler0"]=SafariDataBox.new(@battle,@viewport)
@Sprites["battler0"].appear
loop do
@Sprites["battler0"].update
pbGraphicsUpdate
pbInputUpdate
break if @Sprites["battler0"].appearing
end
pbRefresh
end

def pbCommandMenuEx(index,texts)
pbShowWindow(COMMANDBOX)

@Sprites["messagebox"].visible=true
@Sprites["battlebg2"].bitmap = RPG::Cache.picture("battlebg2")

cw2 @Sprites["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)
@Sprites["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 = @Sprites["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
@pokemonno.dispose if @pokemonno
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

@Sprites["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 @Sprites)
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 @Sprites["battler#{i}"]
@Sprites["battler#{i}"].refresh
end
end
pbFadeInAndShow @Sprites,oldsprites)
return ret
end

def pbSelectBattler(index,selectmode=1)
numwindows=@battle.doublebattle ? 4 : 2
for i in 0...numwindows
sprite @Sprites["battler#{i}"]
sprite.selected=(i==index) ? selectmode : 0
sprite @Sprites["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
@Sprites["battler#{i}"].selected=2
@Sprites["pokemon#{i}"].selected=2
else
@Sprites["battler#{i}"].selected=0
@Sprites["pokemon#{i}"].selected=0
end
@Sprites["battler#{i}"].update
@Sprites["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 @Sprites)
battler=@battle.battlers[0]
activecmd=0 if battler.index==index
inactives[battler.pokemonIndex]=0
partypos[0]=battler.pokemonIndex
if @battle.doublebattle && !@battle.fullparty1
battler=@battle.battlers[2]
activecmd=1 if battler.index==index
inactives[battler.pokemonIndex]=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 @Sprites,visiblesprites)
return ret
end

def pbDamageAnimation(pkmn,effectiveness)
pkmnsprite @Sprites["pokemon#{pkmn.index}"]
shadowsprite @Sprites["shadow#{pkmn.index}"]
sprite @Sprites["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 @Sprites["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
@Sprites["shadow#{pkmn.index}"].visible=false
pkmnsprite @Sprites["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
@Sprites["battler#{pkmn.index}"].opacity=32
pbGraphicsUpdate
pbInputUpdate
end
@Sprites["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
@Sprites["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
@Sprites["battler#{battler.index}"].animateEXP(startexplevel,endexplevel)
while @Sprites["battler#{battler.index}"].animatingEXP
pbGraphicsUpdate
pbInputUpdate
@Sprites["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 @Sprites["pokemon#{attacker.index}"]
shadow @Sprites["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 @Sprites["pokemon#{attacker.index}"]
shadow @Sprites["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 @Sprites["shadow#{i}"]
shadows=s ? s.visible : false
s.visible=false if s
end
yield
for i in 0...4
s @Sprites["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) ? @Sprites["pokemon#{attacker.index}"] : nil
target=(opponent) ? @Sprites["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

busque lo que dices drimer pero no doy bien con la parte que hace esos acercamientos de pantalla, solo necesito la introduccion al combate
 
Estado
Cerrado para nuevas respuestas.
Arriba