class SpriteMetafile
VIEWPORT=0
TONE=1
SRC_RECT=2
VISIBLE=3
X=4
Y=5
Z=6
OX=7
OY=8
ZOOM_X=9
ZOOM_Y=10
ANGLE=11
MIRROR=12
BUSH_DEPTH=13
OPACITY=14
BLEND_TYPE=15
COLOR=16
FLASHCOLOR=17
FLASHDURATION=18
BITMAP=19
def length
return @metafile.length
end
def [](i)
return @metafile[i]
end
def initialize(viewport=nil)
@metafile=[]
@values=[
viewport,
Tone.new(0,0,0,0),
Rect.new(0,0,0,0),
true,
0,0,0,0,0,100,100,
0,false,0,255,0,
Color.new(0,0,0,0),
Color.new(0,0,0,0),
0
]
end
def disposed?
return false
end
def dispose
end
def flash(color,duration)
if duration>0
@values[FLASHCOLOR]=color.clone
@values[FLASHDURATION]=duration
@metafile.push([FLASHCOLOR,color])
@metafile.push([FLASHDURATION,duration])
end
end
def x
return @values[X]
end
def x=(value)
@values[X]=value
@metafile.push([X,value])
end
def y
return @values[Y]
end
def y=(value)
@values[Y]=value
@metafile.push([Y,value])
end
def bitmap
return nil
end
def bitmap=(value)
if value && !value.disposed?
@values[SRC_RECT].set(0,0,value.width,value.height)
@metafile.push([SRC_RECT,@values[SRC_RECT].clone])
end
end
def src_rect
return @values[SRC_RECT]
end
def src_rect=(value)
@values[SRC_RECT]=value
@metafile.push([SRC_RECT,value])
end
def visible
return @values[VISIBLE]
end
def visible=(value)
@values[VISIBLE]=value
@metafile.push([VISIBLE,value])
end
def z
return @values[Z]
end
def z=(value)
@values[Z]=value
@metafile.push([Z,value])
end
def ox
return @values[OX]
end
def ox=(value)
@values[OX]=value
@metafile.push([OX,value])
end
def oy
return @values[OY]
end
def oy=(value)
@values[OY]=value
@metafile.push([OY,value])
end
def zoom_x
return @values[ZOOM_X]
end
def zoom_x=(value)
@values[ZOOM_X]=value
@metafile.push([ZOOM_X,value])
end
def zoom_y
return @values[ZOOM_Y]
end
def zoom_y=(value)
@values[ZOOM_Y]=value
@metafile.push([ZOOM_Y,value])
end
def angle
return @values[ANGLE]
end
def angle=(value)
@values[ANGLE]=value
@metafile.push([ANGLE,value])
end
def mirror
return @values[MIRROR]
end
def mirror=(value)
@values[MIRROR]=value
@metafile.push([MIRROR,value])
end
def bush_depth
return @values[BUSH_DEPTH]
end
def bush_depth=(value)
@values[BUSH_DEPTH]=value
@metafile.push([BUSH_DEPTH,value])
end
def opacity
return @values[OPACITY]
end
def opacity=(value)
@values[OPACITY]=value
@metafile.push([OPACITY,value])
end
def blend_type
return @values[BLEND_TYPE]
end
def blend_type=(value)
@values[BLEND_TYPE]=value
@metafile.push([BLEND_TYPE,value])
end
def color
return @values[COLOR]
end
def color=(value)
@values[COLOR]=value.clone
@metafile.push([COLOR,@values[COLOR]])
end
def tone
return @values[TONE]
end
def tone=(value)
@values[TONE]=value.clone
@metafile.push([TONE,@values[TONE]])
end
def update
@metafile.push([-1,nil])
end
end
class SpriteMetafilePlayer
def initialize(metafile,sprite=nil)
@metafile=metafile
@sprites=[]
@playing=false
@index=0
@sprites.push(sprite) if sprite
end
def add(sprite)
@sprites.push(sprite)
end
def playing?
return @playing
end
def play
@playing=true
@index=0
end
def update
if @playing
for j in @index...@metafile.length
@index=j+1
break if @metafile[j][0]<0
code=@metafile[j][0]
value=@metafile[j][1]
for sprite in @sprites
sprite.x=value if code==SpriteMetafile::X
sprite.y=value if code==SpriteMetafile::Y
sprite.src_rect=value if code==SpriteMetafile::SRC_RECT
sprite.visible=value if code==SpriteMetafile::VISIBLE
sprite.z=value if code==SpriteMetafile::Z
sprite.ox=value if code==SpriteMetafile::OX
sprite.oy=value if code==SpriteMetafile::OY
sprite.zoom_x=value if code==SpriteMetafile::ZOOM_X
sprite.zoom_y=value if code==SpriteMetafile::ZOOM_Y
# prevent crashes
sprite.angle=(value==180) ? 179.9 : value if code==SpriteMetafile::ANGLE
sprite.mirror=value if code==SpriteMetafile::MIRROR
sprite.bush_depth=value if code==SpriteMetafile::BUSH_DEPTH
sprite.opacity=value if code==SpriteMetafile::OPACITY
sprite.blend_type=value if code==SpriteMetafile::BLEND_TYPE
sprite.color=value if code==SpriteMetafile::COLOR
sprite.tone=value if code==SpriteMetafile::TONE
end
end
@playing=false if @index==@metafile.length
end
end
end
def pbSaveSpriteState(sprite)
state=[]
return state if !sprite||sprite.disposed?
state[SpriteMetafile::BITMAP]=sprite.x
state[SpriteMetafile::X]=sprite.x
state[SpriteMetafile::Y]=sprite.y
state[SpriteMetafile::SRC_RECT]=sprite.src_rect.clone
state[SpriteMetafile::VISIBLE]=sprite.visible
state[SpriteMetafile::Z]=sprite.z
state[SpriteMetafile::OX]=sprite.ox
state[SpriteMetafile::OY]=sprite.oy
state[SpriteMetafile::ZOOM_X]=sprite.zoom_x
state[SpriteMetafile::ZOOM_Y]=sprite.zoom_y
state[SpriteMetafile::ANGLE]=sprite.angle
state[SpriteMetafile::MIRROR]=sprite.mirror
state[SpriteMetafile::BUSH_DEPTH]=sprite.bush_depth
state[SpriteMetafile::OPACITY]=sprite.opacity
state[SpriteMetafile::BLEND_TYPE]=sprite.blend_type
state[SpriteMetafile::COLOR]=sprite.color.clone
state[SpriteMetafile::TONE]=sprite.tone.clone
return state
end
def pbRestoreSpriteState(sprite,state)
return if !state||!sprite||sprite.disposed?
sprite.x=state[SpriteMetafile::X]
sprite.y=state[SpriteMetafile::Y]
sprite.src_rect=state[SpriteMetafile::SRC_RECT]
sprite.visible=state[SpriteMetafile::VISIBLE]
sprite.z=state[SpriteMetafile::Z]
sprite.ox=state[SpriteMetafile::OX]
sprite.oy=state[SpriteMetafile::OY]
sprite.zoom_x=state[SpriteMetafile::ZOOM_X]
sprite.zoom_y=state[SpriteMetafile::ZOOM_Y]
sprite.angle=state[SpriteMetafile::ANGLE]
sprite.mirror=state[SpriteMetafile::MIRROR]
sprite.bush_depth=state[SpriteMetafile::BUSH_DEPTH]
sprite.opacity=state[SpriteMetafile::OPACITY]
sprite.blend_type=state[SpriteMetafile::BLEND_TYPE]
sprite.color=state[SpriteMetafile::COLOR]
sprite.tone=state[SpriteMetafile::TONE]
end
def pbSaveSpriteStateAndBitmap(sprite)
return [] if !sprite||sprite.disposed?
state=pbSaveSpriteState(sprite)
state[SpriteMetafile::BITMAP]=sprite.bitmap
return state
end
def pbRestoreSpriteStateAndBitmap(sprite,state)
return if !state||!sprite||sprite.disposed?
sprite.bitmap=state[SpriteMetafile::BITMAP]
pbRestoreSpriteState(sprite,state)
return state
end
#####################
class PokemonEvolutionScene
def pbGenerateMetafiles
sprite=SpriteMetafile.new
sprite2=SpriteMetafile.new
sprite.opacity=255
sprite2.opacity=0
sprite.ox=64
sprite.oy=64
sprite2.ox=64
sprite2.oy=64
for j in 0...26
sprite.color.red=100
sprite.color.green=0
sprite.color.blue=0
sprite.color.alpha=j*10
sprite.color=sprite.color
sprite2.color=sprite.color
sprite.update
sprite2.update
end
anglechange=0
sevenseconds=Graphics.frame_rate*7
for j in 0...sevenseconds
sprite.angle+=anglechange
sprite.angle%=360
anglechange+=1 if j%2==0
if j>=sevenseconds-10
sprite2.angle=sprite.angle
sprite2.opacity+=26
end
sprite.update
sprite2.update
end
sprite.angle=360-sprite.angle
sprite2.angle=360-sprite2.angle
for j in 0...sevenseconds
sprite2.angle+=anglechange
sprite2.angle%=360
anglechange-=1 if j%2==0
if j<10
sprite.angle=sprite2.angle
sprite.opacity-=26
end
sprite.update
sprite2.update
end
for j in 0...26
sprite2.color.red=100
sprite2.color.green=0
sprite2.color.blue=0
sprite2.color.alpha=(26-j)*10
sprite2.color=sprite2.color
sprite.color=sprite2.color
sprite.update
sprite2.update
end
@metafile1=sprite
@metafile2=sprite2
end
def pbStartScreen(pokemon,newspecies)
@sprites={}
@viewport=Viewport.new(0,0,Graphics.width,Graphics.height)
@viewport.z=99999
@pokemon=pokemon
@newspecies=newspecies
addBackgroundOrColoredPlane(@sprites,"background","evobg",
Color.new(248,248,248),@viewport)
rsprite1=PokemonSprite.new(@viewport)
rsprite2=PokemonSprite.new(@viewport)
rsprite1.setPokemonBitmap(@pokemon,false)
rsprite2.setPokemonBitmapSpecies(@pokemon,@newspecies,false)
rsprite1.ox=rsprite1.bitmap.width/2
rsprite1.oy=rsprite1.bitmap.height/2
rsprite2.ox=rsprite2.bitmap.width/2
rsprite2.oy=rsprite2.bitmap.height/2
rsprite1.x=Graphics.width/2
rsprite1.y=(Graphics.height-96)/2
rsprite2.x=Graphics.width/2
rsprite2.y=(Graphics.height-96)/2
rsprite2.opacity=0
@sprites["rsprite1"]=rsprite1
@sprites["rsprite2"]=rsprite2
pbGenerateMetafiles
@sprites["msgwindow"]=Kernel.pbCreateMessageWindow(@viewport)
pbFadeInAndShow(@sprites)
end
def pbEndScreen
Kernel.pbDisposeMessageWindow(@sprites["msgwindow"])
pbFadeOutAndHide(@sprites)
pbDisposeSpriteHash(@sprites)
@viewport.dispose
end
def pbEvolution(cancancel=true)
metaplayer1=SpriteMetafilePlayer.new(@metafile1,@sprites["rsprite1"])
metaplayer2=SpriteMetafilePlayer.new(@metafile2,@sprites["rsprite2"])
metaplayer1.play
metaplayer2.play
pbBGMStop()
pbPlayCry(@pokemon)
Kernel.pbMessageDisplay(@sprites["msgwindow"],
_INTL("\\se[]¿Qué?\r\n{1} está evolucionando!\\^",@pokemon.name))
Kernel.pbMessageWaitForInput(@sprites["msgwindow"],100,true)
pbPlayDecisionSE()
oldstate=pbSaveSpriteState(@sprites["rsprite1"])
oldstate2=pbSaveSpriteState(@sprites["rsprite2"])
pbBGMPlay("evolv")
canceled=false
begin
metaplayer1.update
metaplayer2.update
Graphics.update
Input.update
if Input.trigger?(Input::B) && cancancel
canceled=true
pbRestoreSpriteState(@sprites["rsprite1"],oldstate)
pbRestoreSpriteState(@sprites["rsprite2"],oldstate2)
Graphics.update
break
end
end while metaplayer1.playing? && metaplayer2.playing?
if canceled
pbBGMStop()
pbPlayCancelSE()
Kernel.pbMessageDisplay(@sprites["msgwindow"],
_INTL("¿M?\r\n{1} paró la evolución!",@pokemon.name))
else
frames=pbCryFrameLength(@newspecies)
pbBGMStop()
pbPlayCry(@newspecies)
frames.times do
Graphics.update
end
pbMEPlay("004-Victory04")
newspeciesname=PBSpecies.getName(@newspecies)
oldspeciesname=PBSpecies.getName(@pokemon.species)
Kernel.pbMessageDisplay(@sprites["msgwindow"],
_INTL("\\se[]¡Felicidades! Tu {1} evolucionó a {2}!\\wt[80]",@pokemon.name,newspeciesname))
@sprites["msgwindow"].text=""
removeItem=false
createSpecies=pbCheckEvolutionEx(@pokemon){|pokemon,evonib,level,poke|
if evonib==14 # Shedinja
next poke
elsif evonib==6 || evonib==18 || evonib==19 # Evolves if traded with item/holding item
if poke==@newspecies
removeItem=true # Item is now consumed
end
next -1
else
next -1
end
}
@pokemon.item=0 if removeItem
@pokemon.species=@newspecies
$Trainer.seen[@newspecies]=true
$Trainer.owned[@newspecies]=true
@pokemon.name=newspeciesname if @pokemon.name==oldspeciesname
@pokemon.calcStats
# Check moves for new species
atkdata=pbRgssOpen("Data/attacksRS.dat","rb")
offset=atkdata.getOffset(@pokemon.species-1)
length=atkdata.getLength(@pokemon.species-1)>>1
atkdata.pos=offset
for k in 0..length-1
level=atkdata.fgetw
move=atkdata.fgetw
if level==@pokemon.level
# Learned a new move
pbLearnMove(@pokemon,move,true)
end
end
if createSpecies>0 && $Trainer.party.length<6
newpokemon=@pokemon.clone
newpokemon.iv=@pokemon.iv.clone
newpokemon.ev=@pokemon.ev.clone
newpokemon.species=createSpecies
newpokemon.name=PBSpecies.getName(createSpecies)
newpokemon.calcStats
$Trainer.party.push(newpokemon)
$Trainer.seen[createSpecies]=true
$Trainer.owned[createSpecies]=true
end
atkdata.close
end
end
end
def pbMiniCheckEvolution(pokemon,evonib,level,poke)
case evonib
when 1 # Evolves if loyal enough
return poke if pokemon.happiness>=200
when 2 # Evolves during the day if loyal enough
time=Time.now
return poke if pokemon.happiness>=200 && PBDayNight.isDay?
when 3 # Evolves at night if loyal enough
time=Time.now
return poke if pokemon.happiness>=200 && PBDayNight.isNight?
when 4
return poke if pokemon.level>=level
when 5, 6 # Evolves if traded
return -1
when 7 # Evolves with item
return -1
when 8
return poke if pokemon.level>=level && pokemon.attack>pokemon.defense
when 9
return poke if pokemon.level>=level && pokemon.attack==pokemon.defense
when 10
return poke if pokemon.level>=level && pokemon.attack<pokemon.defense
when 11 # Silcoon
return poke if pokemon.level>=level && (((pokemon.personalID>>16)&0xFFFF)%10)<5
when 12 # Cascoon
return poke if pokemon.level>=level && (((pokemon.personalID>>16)&0xFFFF)%10)>=5
when 13 # Ninjask
return poke if pokemon.level>=level
when 14 # Shedinja
return -1
when 15 # Feebas
return -1
when 18 # Evolves during the day if holding item
time=Time.now
return poke if pokemon.item==level && PBDayNight.isDay?
when 19 # Evolves at night if holding item
time=Time.now
return poke if pokemon.item==level && PBDayNight.isNight?
when 20 # Evolves if it has move
for i in 0...4
return poke if pokemon.moves[i].id==level
end
when 21 # Evolves if there is species
for i in $Trainer.party.length
return poke if !$Trainer.party[i].egg? && $Trainer.party[i].species==level
end
when 22 # Evolves if male
return poke if pokemon.level>=level && pokemon.gender==0
when 23 # Evolves if female
return poke if pokemon.level>=level && pokemon.gender==1
when 27 # Custom 1
# Add code for custom evolution type 1
when 28 # Custom 2
# Add code for custom evolution type 2
when 29 # Custom 3
# Add code for custom evolution type 3
when 30 # Custom 4
# Add code for custom evolution type 4
when 31 # Custom 5
# Add code for custom evolution type 5
when 32 # Custom 6
# Add code for custom evolution type 6
when 33 # Custom 7
# Add code for custom evolution type 7
end
return -1
end
def pbMiniCheckEvolutionItem(pokemon,evonib,level,poke,item)
case evonib
when 7 # Evolves with item
return poke if level==item
when 16 # Evolves with item if male
return poke if pokemon.gender==0
when 17 # Evolves with item if female
return poke if pokemon.gender==1
end
return -1
end
def pbCheckEvolutionEx(pokemon)
return -1 if isConst?(pokemon.item,PBItems,:EVERSTONE)
return -1 if pokemon.species<=0 || pokemon.egg?
ret=-1
for form in pbGetEvolvedFormData(pokemon.species)
ret=yield pokemon,form[0],form[1],form[2]
break if ret>0
end
return ret
end
def pbCheckEvolution(pokemon,item=0)
if item==0
return pbCheckEvolutionEx(pokemon){|pokemon,evonib,level,poke|
next pbMiniCheckEvolution(pokemon,evonib,level,poke)
}
else
return pbCheckEvolutionEx(pokemon){|pokemon,evonib,level,poke|
next pbMiniCheckEvolutionItem(pokemon,evonib,level,poke,item)
}
end
end