mirror of
https://github.com/infinitefusion/infinitefusion-e18.git
synced 2025-12-09 22:24:58 +00:00
Removed last possible usages of Graphics.frame_rate and Graphics.frame_count, improved screen scrolling code, player now animates walking into a wall
This commit is contained in:
@@ -1,483 +1,22 @@
|
||||
#===============================================================================
|
||||
# Evolution animation metafiles and related methods
|
||||
#===============================================================================
|
||||
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 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 dispose; end
|
||||
|
||||
def disposed?
|
||||
return false
|
||||
end
|
||||
|
||||
def [](i)
|
||||
return @metafile[i]
|
||||
end
|
||||
|
||||
def length
|
||||
return @metafile.length
|
||||
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 zoom=(value)
|
||||
@values[ZOOM_X] = value
|
||||
@metafile.push([ZOOM_X, 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
|
||||
return if !@playing
|
||||
(@index...@metafile.length).each do |j|
|
||||
@index = j + 1
|
||||
break if @metafile[j][0] < 0
|
||||
code = @metafile[j][0]
|
||||
value = @metafile[j][1]
|
||||
@sprites.each do |sprite|
|
||||
case code
|
||||
when SpriteMetafile::X then sprite.x = value
|
||||
when SpriteMetafile::Y then sprite.y = value
|
||||
when SpriteMetafile::OX then sprite.ox = value
|
||||
when SpriteMetafile::OY then sprite.oy = value
|
||||
when SpriteMetafile::ZOOM_X then sprite.zoom_x = value
|
||||
when SpriteMetafile::ZOOM_Y then sprite.zoom_y = value
|
||||
when SpriteMetafile::SRC_RECT then sprite.src_rect = value
|
||||
when SpriteMetafile::VISIBLE then sprite.visible = value
|
||||
when SpriteMetafile::Z then sprite.z = value # prevent crashes
|
||||
when SpriteMetafile::ANGLE then sprite.angle = (value == 180) ? 179.9 : value
|
||||
when SpriteMetafile::MIRROR then sprite.mirror = value
|
||||
when SpriteMetafile::BUSH_DEPTH then sprite.bush_depth = value
|
||||
when SpriteMetafile::OPACITY then sprite.opacity = value
|
||||
when SpriteMetafile::BLEND_TYPE then sprite.blend_type = value
|
||||
when SpriteMetafile::COLOR then sprite.color = value
|
||||
when SpriteMetafile::TONE then sprite.tone = value
|
||||
end
|
||||
end
|
||||
end
|
||||
@playing = false if @index == @metafile.length
|
||||
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
|
||||
|
||||
#===============================================================================
|
||||
# Evolution screen
|
||||
#===============================================================================
|
||||
class PokemonEvolutionScene
|
||||
private
|
||||
|
||||
def pbGenerateMetafiles(s1x, s1y, s2x, s2y)
|
||||
sprite = SpriteMetafile.new
|
||||
sprite.ox = s1x
|
||||
sprite.oy = s1y
|
||||
sprite.opacity = 255
|
||||
sprite2 = SpriteMetafile.new
|
||||
sprite2.ox = s2x
|
||||
sprite2.oy = s2y
|
||||
sprite2.zoom = 0.0
|
||||
sprite2.opacity = 255
|
||||
alpha = 0
|
||||
alphaDiff = 10 * 20 / Graphics.frame_rate
|
||||
loop do
|
||||
sprite.color.red = 255
|
||||
sprite.color.green = 255
|
||||
sprite.color.blue = 255
|
||||
sprite.color.alpha = alpha
|
||||
sprite.color = sprite.color
|
||||
sprite2.color = sprite.color
|
||||
sprite2.color.alpha = 255
|
||||
sprite.update
|
||||
sprite2.update
|
||||
break if alpha >= 255
|
||||
alpha += alphaDiff
|
||||
end
|
||||
totaltempo = 0
|
||||
currenttempo = 25
|
||||
maxtempo = 7 * Graphics.frame_rate
|
||||
while totaltempo < maxtempo
|
||||
currenttempo.times do |j|
|
||||
if alpha < 255
|
||||
sprite.color.red = 255
|
||||
sprite.color.green = 255
|
||||
sprite.color.blue = 255
|
||||
sprite.color.alpha = alpha
|
||||
sprite.color = sprite.color
|
||||
alpha += 10
|
||||
end
|
||||
sprite.zoom = [1.1 * (currenttempo - j - 1) / currenttempo, 1.0].min
|
||||
sprite2.zoom = [1.1 * (j + 1) / currenttempo, 1.0].min
|
||||
sprite.update
|
||||
sprite2.update
|
||||
end
|
||||
totaltempo += currenttempo
|
||||
if totaltempo + currenttempo < maxtempo
|
||||
currenttempo.times do |j|
|
||||
sprite.zoom = [1.1 * (j + 1) / currenttempo, 1.0].min
|
||||
sprite2.zoom = [1.1 * (currenttempo - j - 1) / currenttempo, 1.0].min
|
||||
sprite.update
|
||||
sprite2.update
|
||||
end
|
||||
end
|
||||
totaltempo += currenttempo
|
||||
currenttempo = [(currenttempo / 1.5).floor, 5].max
|
||||
end
|
||||
@metafile1 = sprite
|
||||
@metafile2 = sprite2
|
||||
end
|
||||
|
||||
public
|
||||
|
||||
def pbUpdate(animating = false)
|
||||
if animating # Pokémon shouldn't animate during the evolution animation
|
||||
@sprites["background"].update
|
||||
@sprites["msgwindow"].update
|
||||
else
|
||||
pbUpdateSpriteHash(@sprites)
|
||||
end
|
||||
end
|
||||
|
||||
def pbUpdateNarrowScreen(timer_start)
|
||||
return if @bgviewport.rect.y >= 80
|
||||
buffer = 80
|
||||
@bgviewport.rect.height = Graphics.height - lerp(0, 64 + (buffer * 2), 0.7, timer_start, System.uptime).to_i
|
||||
@bgviewport.rect.y = lerp(0, buffer, 0.5, timer_start + 0.2, System.uptime).to_i
|
||||
@sprites["background"].oy = @bgviewport.rect.y
|
||||
end
|
||||
|
||||
def pbUpdateExpandScreen(timer_start)
|
||||
return if @bgviewport.rect.height >= Graphics.height
|
||||
buffer = 80
|
||||
@bgviewport.rect.height = Graphics.height - lerp(64 + (buffer * 2), 0, 0.7, timer_start, System.uptime).to_i
|
||||
@bgviewport.rect.y = lerp(buffer, 0, 0.5, timer_start, System.uptime).to_i
|
||||
@sprites["background"].oy = @bgviewport.rect.y
|
||||
end
|
||||
|
||||
def pbFlashInOut(canceled, oldstate, oldstate2)
|
||||
timer_start = System.uptime
|
||||
loop do
|
||||
Graphics.update
|
||||
pbUpdate(true)
|
||||
pbUpdateExpandScreen(timer_start)
|
||||
tone = lerp(0, 255, 0.7, timer_start, System.uptime)
|
||||
@viewport.tone.set(tone, tone, tone, 0)
|
||||
break if tone >= 255
|
||||
end
|
||||
@bgviewport.rect.y = 0
|
||||
@bgviewport.rect.height = Graphics.height
|
||||
@sprites["background"].oy = 0
|
||||
if canceled
|
||||
pbRestoreSpriteState(@sprites["rsprite1"], oldstate)
|
||||
pbRestoreSpriteState(@sprites["rsprite2"], oldstate2)
|
||||
@sprites["rsprite1"].zoom_x = 1.0
|
||||
@sprites["rsprite1"].zoom_y = 1.0
|
||||
@sprites["rsprite1"].color.alpha = 0
|
||||
@sprites["rsprite1"].visible = true
|
||||
@sprites["rsprite2"].visible = false
|
||||
else
|
||||
@sprites["rsprite1"].visible = false
|
||||
@sprites["rsprite2"].visible = true
|
||||
@sprites["rsprite2"].zoom_x = 1.0
|
||||
@sprites["rsprite2"].zoom_y = 1.0
|
||||
@sprites["rsprite2"].color.alpha = 0
|
||||
end
|
||||
timer_start = System.uptime
|
||||
loop do
|
||||
Graphics.update
|
||||
pbUpdate(true)
|
||||
break if System.uptime - timer_start >= 0.25
|
||||
end
|
||||
timer_start = System.uptime
|
||||
loop do
|
||||
Graphics.update
|
||||
pbUpdate
|
||||
pbUpdateExpandScreen(timer_start)
|
||||
tone = lerp(255, 0, 0.4, timer_start, System.uptime)
|
||||
@viewport.tone.set(tone, tone, tone, 0)
|
||||
break if tone <= 0
|
||||
end
|
||||
def self.pbDuplicatePokemon(pkmn, new_species)
|
||||
new_pkmn = pkmn.clone
|
||||
new_pkmn.species = new_species
|
||||
new_pkmn.name = nil
|
||||
new_pkmn.markings = []
|
||||
new_pkmn.poke_ball = :POKEBALL
|
||||
new_pkmn.item = nil
|
||||
new_pkmn.clearAllRibbons
|
||||
new_pkmn.calc_stats
|
||||
new_pkmn.heal
|
||||
# Add duplicate Pokémon to party
|
||||
$player.party.push(new_pkmn)
|
||||
# See and own duplicate Pokémon
|
||||
$player.pokedex.register(new_pkmn)
|
||||
$player.pokedex.set_owned(new_species)
|
||||
end
|
||||
|
||||
def pbStartScreen(pokemon, newspecies)
|
||||
@@ -502,32 +41,47 @@ class PokemonEvolutionScene
|
||||
rsprite2.setPokemonBitmapSpecies(@pokemon, @newspecies, false)
|
||||
rsprite2.x = rsprite1.x
|
||||
rsprite2.y = rsprite1.y
|
||||
rsprite2.opacity = 0
|
||||
rsprite2.visible = false
|
||||
@sprites["rsprite1"] = rsprite1
|
||||
@sprites["rsprite2"] = rsprite2
|
||||
pbGenerateMetafiles(rsprite1.ox, rsprite1.oy, rsprite2.ox, rsprite2.oy)
|
||||
@sprites["msgwindow"] = pbCreateMessageWindow(@msgviewport)
|
||||
set_up_animation
|
||||
pbFadeInAndShow(@sprites) { pbUpdate }
|
||||
end
|
||||
|
||||
# Closes the evolution screen.
|
||||
def pbEndScreen(need_fade_out = true)
|
||||
pbDisposeMessageWindow(@sprites["msgwindow"]) if @sprites["msgwindow"]
|
||||
if need_fade_out
|
||||
pbFadeOutAndHide(@sprites) { pbUpdate }
|
||||
def set_up_animation
|
||||
sprite = PictureEx.new(0)
|
||||
sprite.setVisible(0, true)
|
||||
sprite.setColor(0, Color.new(255, 255, 255, 0))
|
||||
sprite2 = PictureEx.new(0)
|
||||
sprite2.setVisible(0, true)
|
||||
sprite2.setZoom(0, 0.0)
|
||||
sprite2.setColor(0, Color.new(255, 255, 255, 255))
|
||||
# Make sprite turn white
|
||||
sprite.moveColor(0, 25, Color.new(255, 255, 255, 255))
|
||||
total_duration = 9 * 20 # 9 seconds
|
||||
duration = 25 + 15
|
||||
zoom_duration = 12
|
||||
loop do
|
||||
# Shrink prevo sprite, enlarge evo sprite
|
||||
sprite.moveZoom(duration, zoom_duration, 0)
|
||||
sprite2.moveZoom(duration, zoom_duration, 110)
|
||||
duration += zoom_duration
|
||||
# If animation has played for long enough, end it now while the evo sprite is large
|
||||
break if duration >= total_duration
|
||||
# Enlarge prevo sprite, shrink evo sprite
|
||||
sprite.moveZoom(duration, zoom_duration, 110)
|
||||
sprite2.moveZoom(duration, zoom_duration, 0)
|
||||
duration += zoom_duration
|
||||
# Shorten the duration of zoom changes for the next cycle
|
||||
zoom_duration = [(zoom_duration / 1.2).round, 2].max
|
||||
end
|
||||
pbDisposeSpriteHash(@sprites)
|
||||
@viewport.dispose
|
||||
@bgviewport.dispose
|
||||
@msgviewport.dispose
|
||||
@picture1 = sprite
|
||||
@picture2 = sprite2
|
||||
end
|
||||
|
||||
# Opens the evolution screen
|
||||
def pbEvolution(cancancel = true)
|
||||
metaplayer1 = SpriteMetafilePlayer.new(@metafile1, @sprites["rsprite1"])
|
||||
metaplayer2 = SpriteMetafilePlayer.new(@metafile2, @sprites["rsprite2"])
|
||||
metaplayer1.play
|
||||
metaplayer2.play
|
||||
pbBGMStop
|
||||
pbMessageDisplay(@sprites["msgwindow"], "\\se[]" + _INTL("What?") + "\1") { pbUpdate }
|
||||
pbPlayDecisionSE
|
||||
@@ -540,16 +94,24 @@ class PokemonEvolutionScene
|
||||
pbUpdate
|
||||
break if System.uptime - timer_start >= 1
|
||||
end
|
||||
oldstate = pbSaveSpriteState(@sprites["rsprite1"])
|
||||
oldstate2 = pbSaveSpriteState(@sprites["rsprite2"])
|
||||
pbMEPlay("Evolution start")
|
||||
pbBGMPlay("Evolution")
|
||||
canceled = false
|
||||
timer_start = System.uptime
|
||||
loop do
|
||||
pbUpdateNarrowScreen(timer_start)
|
||||
metaplayer1.update
|
||||
metaplayer2.update
|
||||
@picture1.update
|
||||
setPictureSprite(@sprites["rsprite1"], @picture1)
|
||||
if @sprites["rsprite1"].zoom_x > 1.0
|
||||
@sprites["rsprite1"].zoom_x = 1.0
|
||||
@sprites["rsprite1"].zoom_y = 1.0
|
||||
end
|
||||
@picture2.update
|
||||
setPictureSprite(@sprites["rsprite2"], @picture2)
|
||||
if @sprites["rsprite2"].zoom_x > 1.0
|
||||
@sprites["rsprite2"].zoom_x = 1.0
|
||||
@sprites["rsprite2"].zoom_y = 1.0
|
||||
end
|
||||
Graphics.update
|
||||
Input.update
|
||||
pbUpdate(true)
|
||||
@@ -559,9 +121,9 @@ class PokemonEvolutionScene
|
||||
canceled = true
|
||||
break
|
||||
end
|
||||
break unless metaplayer1.playing? && metaplayer2.playing?
|
||||
break if !@picture1.running? && !@picture2.running?
|
||||
end
|
||||
pbFlashInOut(canceled, oldstate, oldstate2)
|
||||
pbFlashInOut(canceled)
|
||||
if canceled
|
||||
$stats.evolutions_cancelled += 1
|
||||
pbMessageDisplay(@sprites["msgwindow"],
|
||||
@@ -571,6 +133,65 @@ class PokemonEvolutionScene
|
||||
end
|
||||
end
|
||||
|
||||
def pbUpdateNarrowScreen(timer_start)
|
||||
return if @bgviewport.rect.y >= 80
|
||||
buffer = 80
|
||||
@bgviewport.rect.height = Graphics.height - lerp(0, 64 + (buffer * 2), 0.7, timer_start, System.uptime).to_i
|
||||
@bgviewport.rect.y = lerp(0, buffer, 0.5, timer_start + 0.2, System.uptime).to_i
|
||||
@sprites["background"].oy = @bgviewport.rect.y
|
||||
end
|
||||
|
||||
def pbUpdateExpandScreen(timer_start)
|
||||
return if @bgviewport.rect.height >= Graphics.height
|
||||
buffer = 80
|
||||
@bgviewport.rect.height = Graphics.height - lerp(64 + (buffer * 2), 0, 0.7, timer_start, System.uptime).to_i
|
||||
@bgviewport.rect.y = lerp(buffer, 0, 0.5, timer_start, System.uptime).to_i
|
||||
@sprites["background"].oy = @bgviewport.rect.y
|
||||
end
|
||||
|
||||
def pbFlashInOut(canceled)
|
||||
timer_start = System.uptime
|
||||
loop do
|
||||
Graphics.update
|
||||
pbUpdate(true)
|
||||
pbUpdateExpandScreen(timer_start)
|
||||
tone = lerp(0, 255, 0.7, timer_start, System.uptime)
|
||||
@viewport.tone.set(tone, tone, tone, 0)
|
||||
break if tone >= 255
|
||||
end
|
||||
@bgviewport.rect.y = 0
|
||||
@bgviewport.rect.height = Graphics.height
|
||||
@sprites["background"].oy = 0
|
||||
if canceled
|
||||
@sprites["rsprite1"].visible = true
|
||||
@sprites["rsprite1"].zoom_x = 1.0
|
||||
@sprites["rsprite1"].zoom_y = 1.0
|
||||
@sprites["rsprite1"].color.alpha = 0
|
||||
@sprites["rsprite2"].visible = false
|
||||
else
|
||||
@sprites["rsprite1"].visible = false
|
||||
@sprites["rsprite2"].visible = true
|
||||
@sprites["rsprite2"].zoom_x = 1.0
|
||||
@sprites["rsprite2"].zoom_y = 1.0
|
||||
@sprites["rsprite2"].color.alpha = 0
|
||||
end
|
||||
timer_start = System.uptime
|
||||
loop do
|
||||
Graphics.update
|
||||
pbUpdate(true)
|
||||
break if System.uptime - timer_start >= 0.25
|
||||
end
|
||||
timer_start = System.uptime
|
||||
loop do
|
||||
Graphics.update
|
||||
pbUpdate
|
||||
pbUpdateExpandScreen(timer_start)
|
||||
tone = lerp(255, 0, 0.4, timer_start, System.uptime)
|
||||
@viewport.tone.set(tone, tone, tone, 0)
|
||||
break if tone <= 0
|
||||
end
|
||||
end
|
||||
|
||||
def pbEvolutionSuccess
|
||||
$stats.evolution_count += 1
|
||||
# Play cry of evolved species
|
||||
@@ -631,20 +252,24 @@ class PokemonEvolutionScene
|
||||
@pokemon.action_after_evolution(@newspecies)
|
||||
end
|
||||
|
||||
def self.pbDuplicatePokemon(pkmn, new_species)
|
||||
new_pkmn = pkmn.clone
|
||||
new_pkmn.species = new_species
|
||||
new_pkmn.name = nil
|
||||
new_pkmn.markings = []
|
||||
new_pkmn.poke_ball = :POKEBALL
|
||||
new_pkmn.item = nil
|
||||
new_pkmn.clearAllRibbons
|
||||
new_pkmn.calc_stats
|
||||
new_pkmn.heal
|
||||
# Add duplicate Pokémon to party
|
||||
$player.party.push(new_pkmn)
|
||||
# See and own duplicate Pokémon
|
||||
$player.pokedex.register(new_pkmn)
|
||||
$player.pokedex.set_owned(new_species)
|
||||
def pbUpdate(animating = false)
|
||||
if animating # Pokémon shouldn't animate during the evolution animation
|
||||
@sprites["background"].update
|
||||
@sprites["msgwindow"].update
|
||||
else
|
||||
pbUpdateSpriteHash(@sprites)
|
||||
end
|
||||
end
|
||||
|
||||
# Closes the evolution screen.
|
||||
def pbEndScreen(need_fade_out = true)
|
||||
pbDisposeMessageWindow(@sprites["msgwindow"]) if @sprites["msgwindow"]
|
||||
if need_fade_out
|
||||
pbFadeOutAndHide(@sprites) { pbUpdate }
|
||||
end
|
||||
pbDisposeSpriteHash(@sprites)
|
||||
@viewport.dispose
|
||||
@bgviewport.dispose
|
||||
@msgviewport.dispose
|
||||
end
|
||||
end
|
||||
|
||||
@@ -17,30 +17,31 @@
|
||||
class HallOfFame_Scene
|
||||
# When true, all pokémon will be in one line
|
||||
# When false, all pokémon will be in two lines
|
||||
SINGLEROW = false
|
||||
SINGLE_ROW_OF_POKEMON = false
|
||||
# Make the pokémon movement ON in hall entry
|
||||
ANIMATION = true
|
||||
# Speed in pokémon movement in hall entry. Don't use less than 2!
|
||||
ANIMATIONSPEED = 32
|
||||
# Entry wait time (in 1/20 seconds) between showing each Pokémon (and trainer)
|
||||
ENTRYWAITTIME = 64
|
||||
# Entry wait time (in seconds) between showing each Pokémon (and trainer).
|
||||
# Waits for twice this tme when showing "Welcome to the Hall of Fame!".
|
||||
ENTRY_WAIT_TIME = 3.0
|
||||
# Maximum number limit of simultaneous hall entries saved.
|
||||
# 0 = Doesn't save any hall. -1 = no limit
|
||||
# Prefer to use larger numbers (like 500 and 1000) than don't put a limit
|
||||
# If a player exceed this limit, the first one will be removed
|
||||
HALLLIMIT = 50
|
||||
HALL_ENTRIES_LIMIT = 50
|
||||
# The entry music name. Put "" to doesn't play anything
|
||||
ENTRYMUSIC = "Hall of Fame"
|
||||
HALL_OF_FAME_BGM = "Hall of Fame"
|
||||
# Allow eggs to be show and saved in hall
|
||||
ALLOWEGGS = true
|
||||
ALLOW_EGGS = true
|
||||
# Remove the hallbars when the trainer sprite appears
|
||||
REMOVEBARS = true
|
||||
REMOVE_BARS_WHEN_SHOWING_TRAINER = true
|
||||
# The final fade speed on entry
|
||||
FINALFADESPEED = 16
|
||||
# Sprites opacity value when them aren't selected
|
||||
FINAL_FADE_DURATION = 1.0
|
||||
# Sprite's opacity value when it isn't selected
|
||||
OPACITY = 64
|
||||
BASECOLOR = Color.new(248, 248, 248)
|
||||
SHADOWCOLOR = Color.new(0, 0, 0)
|
||||
TEXT_BASE_COLOR = Color.new(248, 248, 248)
|
||||
TEXT_SHADOW_COLOR = Color.new(0, 0, 0)
|
||||
|
||||
# Placement for pokemon icons
|
||||
def pbStartScene
|
||||
@@ -64,8 +65,8 @@ class HallOfFame_Scene
|
||||
|
||||
def pbStartSceneEntry
|
||||
pbStartScene
|
||||
@useMusic = (ENTRYMUSIC && ENTRYMUSIC != "")
|
||||
pbBGMPlay(ENTRYMUSIC) if @useMusic
|
||||
@useMusic = (HALL_OF_FAME_BGM && HALL_OF_FAME_BGM != "")
|
||||
pbBGMPlay(HALL_OF_FAME_BGM) if @useMusic
|
||||
saveHallEntry
|
||||
@xmovement = []
|
||||
@ymovement = []
|
||||
@@ -90,22 +91,15 @@ class HallOfFame_Scene
|
||||
@viewport.dispose
|
||||
end
|
||||
|
||||
def slowFadeOut(sprites, exponent) # 2 exponent
|
||||
# To handle values above 8
|
||||
extraWaitExponent = exponent - 9
|
||||
exponent = 8 if exponent > 8
|
||||
max = 2**exponent
|
||||
speed = (2**8) / max
|
||||
(0..max).each do |j|
|
||||
if extraWaitExponent > -1
|
||||
(2**extraWaitExponent).times do
|
||||
Graphics.update
|
||||
Input.update
|
||||
pbUpdate
|
||||
end
|
||||
end
|
||||
pbSetSpritesToColor(sprites, Color.new(0, 0, 0, j * speed))
|
||||
block_given? ? yield : pbUpdateSpriteHash(sprites)
|
||||
def slowFadeOut(duration)
|
||||
timer_start = System.uptime
|
||||
loop do
|
||||
alpha = lerp(255, 0, duration, timer_start, System.uptime)
|
||||
pbSetSpritesToColor(@sprites, Color.new(0, 0, 0, alpha))
|
||||
Graphics.update
|
||||
Input.update
|
||||
pbUpdate
|
||||
break if alpha == 0
|
||||
end
|
||||
end
|
||||
|
||||
@@ -125,20 +119,21 @@ class HallOfFame_Scene
|
||||
def saveHallEntry
|
||||
$player.party.each do |pkmn|
|
||||
# Clones every pokémon object
|
||||
@hallEntry.push(pkmn.clone) if !pkmn.egg? || ALLOWEGGS
|
||||
@hallEntry.push(pkmn.clone) if !pkmn.egg? || ALLOW_EGGS
|
||||
end
|
||||
# Update the global variables
|
||||
$PokemonGlobal.hallOfFame.push(@hallEntry)
|
||||
$PokemonGlobal.hallOfFameLastNumber += 1
|
||||
$PokemonGlobal.hallOfFame.delete_at(0) if HALLLIMIT > -1 &&
|
||||
$PokemonGlobal.hallOfFame.size > HALLLIMIT
|
||||
if HALL_ENTRIES_LIMIT >= 0 && $PokemonGlobal.hallOfFame.size > HALL_ENTRIES_LIMIT
|
||||
$PokemonGlobal.hallOfFame.delete_at(0)
|
||||
end
|
||||
end
|
||||
|
||||
# Return the x/y point position in screen for battler index number
|
||||
# Don't use odd numbers!
|
||||
def xpointformula(battlernumber)
|
||||
ret = 0
|
||||
if SINGLEROW
|
||||
if SINGLE_ROW_OF_POKEMON
|
||||
ret = ((60 * (battlernumber / 2)) + 48) * (xpositionformula(battlernumber) - 1)
|
||||
ret += (Graphics.width / 2) - 56
|
||||
else
|
||||
@@ -149,7 +144,7 @@ class HallOfFame_Scene
|
||||
|
||||
def ypointformula(battlernumber)
|
||||
ret = 0
|
||||
if SINGLEROW
|
||||
if SINGLE_ROW_OF_POKEMON
|
||||
ret = 96 - (8 * (battlernumber / 2))
|
||||
else
|
||||
ret = 32 + (128 * ypositionformula(battlernumber) / 2)
|
||||
@@ -160,7 +155,7 @@ class HallOfFame_Scene
|
||||
# Returns 0, 1 or 2 as the x/y column value
|
||||
def xpositionformula(battlernumber)
|
||||
ret = 0
|
||||
if SINGLEROW
|
||||
if SINGLE_ROW_OF_POKEMON
|
||||
ret = (battlernumber % 2) * 2
|
||||
else
|
||||
ret = (battlernumber / 3).even? ? (19 - battlernumber) % 3 : (19 + battlernumber) % 3
|
||||
@@ -170,7 +165,7 @@ class HallOfFame_Scene
|
||||
|
||||
def ypositionformula(battlernumber)
|
||||
ret = 0
|
||||
if SINGLEROW
|
||||
if SINGLE_ROW_OF_POKEMON
|
||||
ret = 1
|
||||
else
|
||||
ret = ((battlernumber / 3) % 2) * 2
|
||||
@@ -219,7 +214,7 @@ class HallOfFame_Scene
|
||||
@sprites["pokemon#{i}"].x += (128 - @sprites["pokemon#{i}"].bitmap.width) / 2
|
||||
@sprites["pokemon#{i}"].y += (128 - @sprites["pokemon#{i}"].bitmap.height) / 2
|
||||
end
|
||||
@sprites["pokemon#{i}"].z = 7 - i if SINGLEROW
|
||||
@sprites["pokemon#{i}"].z = 7 - i if SINGLE_ROW_OF_POKEMON
|
||||
next if !hide
|
||||
# Animation distance calculation
|
||||
horizontal = 1 - xpositionformula(i)
|
||||
@@ -244,7 +239,7 @@ class HallOfFame_Scene
|
||||
def createTrainerBattler
|
||||
@sprites["trainer"] = IconSprite.new(@viewport)
|
||||
@sprites["trainer"].setBitmap(GameData::TrainerType.front_sprite_filename($player.trainer_type))
|
||||
if SINGLEROW
|
||||
if SINGLE_ROW_OF_POKEMON
|
||||
@sprites["trainer"].x = Graphics.width / 2
|
||||
@sprites["trainer"].y = 178
|
||||
else
|
||||
@@ -254,22 +249,24 @@ class HallOfFame_Scene
|
||||
@sprites["trainer"].z = 9
|
||||
@sprites["trainer"].ox = @sprites["trainer"].bitmap.width / 2
|
||||
@sprites["trainer"].oy = @sprites["trainer"].bitmap.height / 2
|
||||
if REMOVEBARS
|
||||
if REMOVE_BARS_WHEN_SHOWING_TRAINER
|
||||
@sprites["overlay"].bitmap.clear
|
||||
@sprites["hallbars"].visible = false
|
||||
end
|
||||
@xmovement[@battlerIndex] = 0
|
||||
@ymovement[@battlerIndex] = 0
|
||||
if ANIMATION && !SINGLEROW # Trainer Animation
|
||||
if ANIMATION && !SINGLE_ROW_OF_POKEMON # Trainer Animation
|
||||
startpoint = Graphics.width / 2
|
||||
# 2 is the trainer speed
|
||||
@xmovement[@battlerIndex] = (startpoint - @sprites["trainer"].x) / 2
|
||||
@sprites["trainer"].x = startpoint
|
||||
else
|
||||
ENTRYWAITTIME.times do
|
||||
timer_start = System.uptime
|
||||
loop do
|
||||
Graphics.update
|
||||
Input.update
|
||||
pbUpdate
|
||||
break if System.uptime - timer_start >= ENTRY_WAIT_TIME
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -319,16 +316,16 @@ class HallOfFame_Scene
|
||||
dexnumber = _ISPRINTF("No. {1:03d}", number)
|
||||
end
|
||||
textPositions = [
|
||||
[dexnumber, 32, Graphics.height - 74, :left, BASECOLOR, SHADOWCOLOR],
|
||||
[pokename, Graphics.width - 192, Graphics.height - 74, :center, BASECOLOR, SHADOWCOLOR],
|
||||
[dexnumber, 32, Graphics.height - 74, :left, TEXT_BASE_COLOR, TEXT_SHADOW_COLOR],
|
||||
[pokename, Graphics.width - 192, Graphics.height - 74, :center, TEXT_BASE_COLOR, TEXT_SHADOW_COLOR],
|
||||
[_INTL("Lv. {1}", pokemon.egg? ? "?" : pokemon.level),
|
||||
64, Graphics.height - 42, :left, BASECOLOR, SHADOWCOLOR],
|
||||
64, Graphics.height - 42, :left, TEXT_BASE_COLOR, TEXT_SHADOW_COLOR],
|
||||
[_INTL("ID No. {1}", pokemon.egg? ? "?????" : idno),
|
||||
Graphics.width - 192, Graphics.height - 42, :center, BASECOLOR, SHADOWCOLOR]
|
||||
Graphics.width - 192, Graphics.height - 42, :center, TEXT_BASE_COLOR, TEXT_SHADOW_COLOR]
|
||||
]
|
||||
if hallNumber > -1
|
||||
textPositions.push([_INTL("Hall of Fame No."), (Graphics.width / 2) - 104, 6, :left, BASECOLOR, SHADOWCOLOR])
|
||||
textPositions.push([hallNumber.to_s, (Graphics.width / 2) + 104, 6, :right, BASECOLOR, SHADOWCOLOR])
|
||||
textPositions.push([_INTL("Hall of Fame No."), (Graphics.width / 2) - 104, 6, :left, TEXT_BASE_COLOR, TEXT_SHADOW_COLOR])
|
||||
textPositions.push([hallNumber.to_s, (Graphics.width / 2) + 104, 6, :right, TEXT_BASE_COLOR, TEXT_SHADOW_COLOR])
|
||||
end
|
||||
pbDrawTextPositions(overlay, textPositions)
|
||||
end
|
||||
@@ -337,7 +334,7 @@ class HallOfFame_Scene
|
||||
overlay = @sprites["overlay"].bitmap
|
||||
overlay.clear
|
||||
pbDrawTextPositions(overlay, [[_INTL("Welcome to the Hall of Fame!"),
|
||||
Graphics.width / 2, Graphics.height - 68, :center, BASECOLOR, SHADOWCOLOR]])
|
||||
Graphics.width / 2, Graphics.height - 68, :center, TEXT_BASE_COLOR, TEXT_SHADOW_COLOR]])
|
||||
end
|
||||
|
||||
def pbAnimationLoop
|
||||
@@ -386,26 +383,30 @@ class HallOfFame_Scene
|
||||
@battlerIndex += 1
|
||||
if @battlerIndex <= @hallEntry.size
|
||||
# If it is a pokémon, write the pokémon text, wait the
|
||||
# ENTRYWAITTIME and goes to the next battler
|
||||
# ENTRY_WAIT_TIME and goes to the next battler
|
||||
@hallEntry[@battlerIndex - 1].play_cry
|
||||
writePokemonData(@hallEntry[@battlerIndex - 1])
|
||||
(ENTRYWAITTIME * Graphics.frame_rate / 20).times do
|
||||
timer_start = System.uptime
|
||||
loop do
|
||||
Graphics.update
|
||||
Input.update
|
||||
pbUpdate
|
||||
break if System.uptime - timer_start >= ENTRY_WAIT_TIME
|
||||
end
|
||||
if @battlerIndex < @hallEntry.size # Preparates the next battler
|
||||
setPokemonSpritesOpacity(@battlerIndex, OPACITY)
|
||||
@sprites["overlay"].bitmap.clear
|
||||
else # Show the welcome message and preparates the trainer
|
||||
else # Show the welcome message and prepares the trainer
|
||||
setPokemonSpritesOpacity(-1)
|
||||
writeWelcome
|
||||
(ENTRYWAITTIME * 2 * Graphics.frame_rate / 20).times do
|
||||
timer_start = System.uptime
|
||||
loop do
|
||||
Graphics.update
|
||||
Input.update
|
||||
pbUpdate
|
||||
break if System.uptime - timer_start >= ENTRY_WAIT_TIME * 2
|
||||
end
|
||||
setPokemonSpritesOpacity(-1, OPACITY) if !SINGLEROW
|
||||
setPokemonSpritesOpacity(-1, OPACITY) if !SINGLE_ROW_OF_POKEMON
|
||||
createTrainerBattler
|
||||
end
|
||||
end
|
||||
@@ -413,14 +414,15 @@ class HallOfFame_Scene
|
||||
elsif @battlerIndex > @hallEntry.size
|
||||
# Write the trainer data and fade
|
||||
writeTrainerData
|
||||
(ENTRYWAITTIME * Graphics.frame_rate / 20).times do
|
||||
timer_start = System.uptime
|
||||
loop do
|
||||
Graphics.update
|
||||
Input.update
|
||||
pbUpdate
|
||||
break if System.uptime - timer_start >= ENTRY_WAIT_TIME
|
||||
end
|
||||
fadeSpeed = ((Math.log(2**12) - Math.log(FINALFADESPEED)) / Math.log(2)).floor
|
||||
pbBGMFade((2**fadeSpeed).to_f / 20) if @useMusic
|
||||
slowFadeOut(@sprites, fadeSpeed) { pbUpdate }
|
||||
pbBGMFade(FINAL_FADE_DURATION) if @useMusic
|
||||
slowFadeOut(FINAL_FADE_DURATION)
|
||||
@alreadyFadedInEnd = true
|
||||
@battlerIndex += 1
|
||||
end
|
||||
|
||||
@@ -124,8 +124,12 @@ class PokemonPokedexInfo_Scene
|
||||
|
||||
def pbUpdate
|
||||
if @page == 2
|
||||
intensity = (Graphics.frame_count % 40) * 12
|
||||
intensity = 480 - intensity if intensity > 240
|
||||
intensity_time = System.uptime % 1.0 # 1 second per glow
|
||||
if intensity_time >= 0.5
|
||||
intensity = lerp(64, 256 + 64, 0.5, intensity_time - 0.5)
|
||||
else
|
||||
intensity = lerp(256 + 64, 64, 0.5, intensity_time)
|
||||
end
|
||||
@sprites["areahighlight"].opacity = intensity
|
||||
end
|
||||
pbUpdateSpriteHash(@sprites)
|
||||
|
||||
@@ -108,9 +108,32 @@ end
|
||||
#
|
||||
#===============================================================================
|
||||
class AutoMosaicPokemonSprite < MosaicPokemonSprite
|
||||
INITIAL_MOSAIC = 10 # Pixellation factor
|
||||
|
||||
def mosaic=(value)
|
||||
@mosaic = value
|
||||
@mosaic = 0 if @mosaic < 0
|
||||
@start_mosaic = @mosaic if !@start_mosaic
|
||||
end
|
||||
|
||||
def mosaic_duration=(val)
|
||||
@mosaic_duration = val
|
||||
@mosaic_duration = 0 if @mosaic_duration < 0
|
||||
@mosaic_timer_start = System.uptime if @mosaic_duration > 0
|
||||
end
|
||||
|
||||
def update
|
||||
super
|
||||
self.mosaic -= 1
|
||||
if @mosaic_timer_start
|
||||
@start_mosaic = INITIAL_MOSAIC if !@start_mosaic || @start_mosaic == 0
|
||||
new_mosaic = lerp(@start_mosaic, 0, @mosaic_duration, @mosaic_timer_start, System.uptime).to_i
|
||||
self.mosaic = new_mosaic
|
||||
mosaicRefresh(@oldbitmap)
|
||||
if new_mosaic == 0
|
||||
@mosaic_timer_start = nil
|
||||
@start_mosaic = nil
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -120,16 +143,17 @@ end
|
||||
class PokemonBoxArrow < Sprite
|
||||
attr_accessor :quickswap
|
||||
|
||||
# Time in seconds for the cursor to move down and back up to grab/drop a
|
||||
# Pokémon.
|
||||
GRAB_TIME = 0.4
|
||||
|
||||
def initialize(viewport = nil)
|
||||
super(viewport)
|
||||
@frame = 0
|
||||
@holding = false
|
||||
@updating = false
|
||||
@quickswap = false
|
||||
@grabbingState = 0
|
||||
@placingState = 0
|
||||
@heldpkmn = nil
|
||||
@handsprite = ChangelingSprite.new(0, 0, viewport)
|
||||
@holding = false
|
||||
@updating = false
|
||||
@quickswap = false
|
||||
@heldpkmn = nil
|
||||
@handsprite = ChangelingSprite.new(0, 0, viewport)
|
||||
@handsprite.addBitmap("point1", "Graphics/UI/Storage/cursor_point_1")
|
||||
@handsprite.addBitmap("point2", "Graphics/UI/Storage/cursor_point_2")
|
||||
@handsprite.addBitmap("grab", "Graphics/UI/Storage/cursor_grab")
|
||||
@@ -149,38 +173,6 @@ class PokemonBoxArrow < Sprite
|
||||
super
|
||||
end
|
||||
|
||||
def heldPokemon
|
||||
@heldpkmn = nil if @heldpkmn&.disposed?
|
||||
@holding = false if !@heldpkmn
|
||||
return @heldpkmn
|
||||
end
|
||||
|
||||
def visible=(value)
|
||||
super
|
||||
@handsprite.visible = value
|
||||
sprite = heldPokemon
|
||||
sprite.visible = value if sprite
|
||||
end
|
||||
|
||||
def color=(value)
|
||||
super
|
||||
@handsprite.color = value
|
||||
sprite = heldPokemon
|
||||
sprite.color = value if sprite
|
||||
end
|
||||
|
||||
def holding?
|
||||
return self.heldPokemon && @holding
|
||||
end
|
||||
|
||||
def grabbing?
|
||||
return @grabbingState > 0
|
||||
end
|
||||
|
||||
def placing?
|
||||
return @placingState > 0
|
||||
end
|
||||
|
||||
def x=(value)
|
||||
super
|
||||
@handsprite.x = self.x
|
||||
@@ -200,6 +192,38 @@ class PokemonBoxArrow < Sprite
|
||||
@handsprite.z = value
|
||||
end
|
||||
|
||||
def visible=(value)
|
||||
super
|
||||
@handsprite.visible = value
|
||||
sprite = heldPokemon
|
||||
sprite.visible = value if sprite
|
||||
end
|
||||
|
||||
def color=(value)
|
||||
super
|
||||
@handsprite.color = value
|
||||
sprite = heldPokemon
|
||||
sprite.color = value if sprite
|
||||
end
|
||||
|
||||
def heldPokemon
|
||||
@heldpkmn = nil if @heldpkmn&.disposed?
|
||||
@holding = false if !@heldpkmn
|
||||
return @heldpkmn
|
||||
end
|
||||
|
||||
def holding?
|
||||
return self.heldPokemon && @holding
|
||||
end
|
||||
|
||||
def grabbing?
|
||||
return !@grabbing_timer_start.nil?
|
||||
end
|
||||
|
||||
def placing?
|
||||
return !@placing_timer_start.nil?
|
||||
end
|
||||
|
||||
def setSprite(sprite)
|
||||
if holding?
|
||||
@heldpkmn = sprite
|
||||
@@ -219,7 +243,7 @@ class PokemonBoxArrow < Sprite
|
||||
end
|
||||
|
||||
def grab(sprite)
|
||||
@grabbingState = 1
|
||||
@grabbing_timer_start = System.uptime
|
||||
@heldpkmn = sprite
|
||||
@heldpkmn.viewport = self.viewport
|
||||
@heldpkmn.z = 1
|
||||
@@ -227,7 +251,7 @@ class PokemonBoxArrow < Sprite
|
||||
end
|
||||
|
||||
def place
|
||||
@placingState = 1
|
||||
@placing_timer_start = System.uptime
|
||||
end
|
||||
|
||||
def release
|
||||
@@ -241,46 +265,40 @@ class PokemonBoxArrow < Sprite
|
||||
heldpkmn&.update
|
||||
@handsprite.update
|
||||
@holding = false if !heldpkmn
|
||||
if @grabbingState > 0
|
||||
if @grabbingState <= 4 * Graphics.frame_rate / 20
|
||||
if @grabbing_timer_start
|
||||
if System.uptime - @grabbing_timer_start <= GRAB_TIME / 2
|
||||
@handsprite.changeBitmap((@quickswap) ? "grabq" : "grab")
|
||||
self.y = @spriteY + (4.0 * @grabbingState * 20 / Graphics.frame_rate)
|
||||
@grabbingState += 1
|
||||
elsif @grabbingState <= 8 * Graphics.frame_rate / 20
|
||||
self.y = @spriteY + lerp(0, 16, GRAB_TIME / 2, @grabbing_timer_start, System.uptime)
|
||||
else
|
||||
@holding = true
|
||||
@handsprite.changeBitmap((@quickswap) ? "fistq" : "fist")
|
||||
self.y = @spriteY + (4 * ((8 * Graphics.frame_rate / 20) - @grabbingState) * 20 / Graphics.frame_rate)
|
||||
@grabbingState += 1
|
||||
else
|
||||
@grabbingState = 0
|
||||
delta_y = lerp(16, 0, GRAB_TIME / 2, @grabbing_timer_start + (GRAB_TIME / 2), System.uptime)
|
||||
self.y = @spriteY + delta_y
|
||||
@grabbing_timer_start = nil if delta_y == 0
|
||||
end
|
||||
elsif @placingState > 0
|
||||
if @placingState <= 4 * Graphics.frame_rate / 20
|
||||
elsif @placing_timer_start
|
||||
if System.uptime - @placing_timer_start <= GRAB_TIME / 2
|
||||
@handsprite.changeBitmap((@quickswap) ? "fistq" : "fist")
|
||||
self.y = @spriteY + (4.0 * @placingState * 20 / Graphics.frame_rate)
|
||||
@placingState += 1
|
||||
elsif @placingState <= 8 * Graphics.frame_rate / 20
|
||||
self.y = @spriteY + lerp(0, 16, GRAB_TIME / 2, @placing_timer_start, System.uptime)
|
||||
else
|
||||
@holding = false
|
||||
@heldpkmn = nil
|
||||
@handsprite.changeBitmap((@quickswap) ? "grabq" : "grab")
|
||||
self.y = @spriteY + (4 * ((8 * Graphics.frame_rate / 20) - @placingState) * 20 / Graphics.frame_rate)
|
||||
@placingState += 1
|
||||
else
|
||||
@placingState = 0
|
||||
delta_y = lerp(16, 0, GRAB_TIME / 2, @placing_timer_start + (GRAB_TIME / 2), System.uptime)
|
||||
self.y = @spriteY + delta_y
|
||||
@placing_timer_start = nil if delta_y == 0
|
||||
end
|
||||
elsif holding?
|
||||
@handsprite.changeBitmap((@quickswap) ? "fistq" : "fist")
|
||||
else
|
||||
else # Idling
|
||||
self.x = @spriteX
|
||||
self.y = @spriteY
|
||||
if @frame < Graphics.frame_rate / 2
|
||||
if (System.uptime / 0.5).to_i.even? # Changes every 0.5 seconds
|
||||
@handsprite.changeBitmap((@quickswap) ? "point1q" : "point1")
|
||||
else
|
||||
@handsprite.changeBitmap((@quickswap) ? "point2q" : "point2")
|
||||
end
|
||||
end
|
||||
@frame += 1
|
||||
@frame = 0 if @frame >= Graphics.frame_rate
|
||||
@updating = false
|
||||
end
|
||||
end
|
||||
@@ -902,7 +920,7 @@ class PokemonStorageScene
|
||||
ret = pbSelectPartyInternal(party, false)
|
||||
if ret < 0
|
||||
pbHidePartyTab
|
||||
@selection = 0
|
||||
@selection = -2
|
||||
@choseFromParty = false
|
||||
else
|
||||
@choseFromParty = true
|
||||
@@ -997,44 +1015,38 @@ class PokemonStorageScene
|
||||
Input.update
|
||||
end
|
||||
|
||||
def pbSwitchBoxToRight(newbox)
|
||||
newbox = PokemonBoxSprite.new(@storage, newbox, @boxviewport)
|
||||
newbox.x = 520
|
||||
Graphics.frame_reset
|
||||
distancePerFrame = 64 * 20 / Graphics.frame_rate
|
||||
def pbSwitchBoxToRight(new_box_number)
|
||||
start_x = @sprites["box"].x
|
||||
newbox = PokemonBoxSprite.new(@storage, new_box_number, @boxviewport)
|
||||
newbox.x = start_x + 336
|
||||
timer_start = System.uptime
|
||||
loop do
|
||||
Graphics.update
|
||||
Input.update
|
||||
@sprites["box"].x -= distancePerFrame
|
||||
newbox.x -= distancePerFrame
|
||||
@sprites["box"].x = lerp(start_x, start_x - 336, 0.25, timer_start, System.uptime)
|
||||
newbox.x = @sprites["box"].x + 336
|
||||
self.update
|
||||
break if newbox.x <= 184
|
||||
Graphics.update
|
||||
break if newbox.x == start_x
|
||||
end
|
||||
diff = newbox.x - 184
|
||||
newbox.x = 184
|
||||
@sprites["box"].x -= diff
|
||||
@sprites["box"].dispose
|
||||
@sprites["box"] = newbox
|
||||
Input.update
|
||||
end
|
||||
|
||||
def pbSwitchBoxToLeft(newbox)
|
||||
newbox = PokemonBoxSprite.new(@storage, newbox, @boxviewport)
|
||||
newbox.x = -152
|
||||
Graphics.frame_reset
|
||||
distancePerFrame = 64 * 20 / Graphics.frame_rate
|
||||
def pbSwitchBoxToLeft(new_box_number)
|
||||
start_x = @sprites["box"].x
|
||||
newbox = PokemonBoxSprite.new(@storage, new_box_number, @boxviewport)
|
||||
newbox.x = start_x - 336
|
||||
timer_start = System.uptime
|
||||
loop do
|
||||
Graphics.update
|
||||
Input.update
|
||||
@sprites["box"].x += distancePerFrame
|
||||
newbox.x += distancePerFrame
|
||||
@sprites["box"].x = lerp(start_x, start_x + 336, 0.25, timer_start, System.uptime)
|
||||
newbox.x = @sprites["box"].x - 336
|
||||
self.update
|
||||
break if newbox.x >= 184
|
||||
Graphics.update
|
||||
break if newbox.x == start_x
|
||||
end
|
||||
diff = newbox.x - 184
|
||||
newbox.x = 184
|
||||
@sprites["box"].x -= diff
|
||||
@sprites["box"].dispose
|
||||
@sprites["box"] = newbox
|
||||
Input.update
|
||||
end
|
||||
|
||||
def pbJumpToBox(newbox)
|
||||
@@ -1050,7 +1062,7 @@ class PokemonStorageScene
|
||||
def pbSetMosaic(selection)
|
||||
return if @screen.pbHeldPokemon
|
||||
return if @boxForMosaic == @storage.currentBox && @selectionForMosaic == selection
|
||||
@sprites["pokemon"].mosaic = Graphics.frame_rate / 4
|
||||
@sprites["pokemon"].mosaic_duration = 0.25 # In seconds
|
||||
@boxForMosaic = @storage.currentBox
|
||||
@selectionForMosaic = selection
|
||||
end
|
||||
@@ -1061,29 +1073,43 @@ class PokemonStorageScene
|
||||
end
|
||||
|
||||
def pbShowPartyTab
|
||||
pbSEPlay("GUI storage show party panel")
|
||||
distancePerFrame = 48 * 20 / Graphics.frame_rate
|
||||
loop do
|
||||
Graphics.update
|
||||
Input.update
|
||||
@sprites["boxparty"].y -= distancePerFrame
|
||||
self.update
|
||||
break if @sprites["boxparty"].y <= Graphics.height - 352
|
||||
@sprites["arrow"].visible = false
|
||||
if !@screen.pbHeldPokemon
|
||||
pbUpdateOverlay(-1)
|
||||
pbSetMosaic(-1)
|
||||
end
|
||||
@sprites["boxparty"].y = Graphics.height - 352
|
||||
pbSEPlay("GUI storage show party panel")
|
||||
start_y = @sprites["boxparty"].y # Graphics.height
|
||||
timer_start = System.uptime
|
||||
loop do
|
||||
@sprites["boxparty"].y = lerp(start_y, start_y - @sprites["boxparty"].height,
|
||||
0.4, timer_start, System.uptime)
|
||||
self.update
|
||||
Graphics.update
|
||||
break if @sprites["boxparty"].y == start_y - @sprites["boxparty"].height
|
||||
end
|
||||
Input.update
|
||||
@sprites["arrow"].visible = true
|
||||
end
|
||||
|
||||
def pbHidePartyTab
|
||||
pbSEPlay("GUI storage hide party panel")
|
||||
distancePerFrame = 48 * 20 / Graphics.frame_rate
|
||||
loop do
|
||||
Graphics.update
|
||||
Input.update
|
||||
@sprites["boxparty"].y += distancePerFrame
|
||||
self.update
|
||||
break if @sprites["boxparty"].y >= Graphics.height
|
||||
@sprites["arrow"].visible = false
|
||||
if !@screen.pbHeldPokemon
|
||||
pbUpdateOverlay(-1)
|
||||
pbSetMosaic(-1)
|
||||
end
|
||||
@sprites["boxparty"].y = Graphics.height
|
||||
pbSEPlay("GUI storage hide party panel")
|
||||
start_y = @sprites["boxparty"].y # Graphics.height - @sprites["boxparty"].height
|
||||
timer_start = System.uptime
|
||||
loop do
|
||||
@sprites["boxparty"].y = lerp(start_y, start_y + @sprites["boxparty"].height,
|
||||
0.4, timer_start, System.uptime)
|
||||
self.update
|
||||
Graphics.update
|
||||
break if @sprites["boxparty"].y == start_y + @sprites["boxparty"].height
|
||||
end
|
||||
Input.update
|
||||
@sprites["arrow"].visible = true
|
||||
end
|
||||
|
||||
def pbHold(selected)
|
||||
@@ -1115,7 +1141,7 @@ class PokemonStorageScene
|
||||
@sprites["box"].setPokemon(selected[1], heldpokesprite)
|
||||
end
|
||||
@sprites["arrow"].setSprite(boxpokesprite)
|
||||
@sprites["pokemon"].mosaic = 10
|
||||
@sprites["pokemon"].mosaic_duration = 0.25 # In seconds
|
||||
@boxForMosaic = @storage.currentBox
|
||||
@selectionForMosaic = selected[1]
|
||||
end
|
||||
|
||||
@@ -479,7 +479,6 @@ class PokemonEntryScene2
|
||||
@sprites["controls"].x = 16
|
||||
@sprites["controls"].y = 96
|
||||
@sprites["controls"].setBitmap(_INTL("Graphics/UI/Naming/overlay_controls"))
|
||||
@init = true
|
||||
@sprites["overlay"] = BitmapSprite.new(Graphics.width, Graphics.height, @viewport)
|
||||
pbDoUpdateOverlay2
|
||||
@sprites["cursor"] = NameEntryCursor.new(@viewport)
|
||||
@@ -556,15 +555,12 @@ class PokemonEntryScene2
|
||||
@@Characters.length.times do |i|
|
||||
@bitmaps[i].update
|
||||
end
|
||||
if @init || Graphics.frame_count % 5 == 0
|
||||
@init = false
|
||||
cursorpos = @helper.cursor
|
||||
cursorpos = @maxlength - 1 if cursorpos >= @maxlength
|
||||
cursorpos = 0 if cursorpos < 0
|
||||
@maxlength.times do |i|
|
||||
@blanks[i] = (i == cursorpos) ? 1 : 0
|
||||
@sprites["blank#{i}"].y = [78, 82][@blanks[i]]
|
||||
end
|
||||
# Update which inputted text's character's underline is lowered to indicate
|
||||
# which character is selected
|
||||
cursorpos = @helper.cursor.clamp(0, @maxlength - 1)
|
||||
@maxlength.times do |i|
|
||||
@blanks[i] = (i == cursorpos) ? 1 : 0
|
||||
@sprites["blank#{i}"].y = [78, 82][@blanks[i]]
|
||||
end
|
||||
pbDoUpdateOverlay
|
||||
pbUpdateSpriteHash(@sprites)
|
||||
|
||||
Reference in New Issue
Block a user