A lot of FPS agnosticism, added def lerp

This commit is contained in:
Maruno17
2023-05-20 18:37:54 +01:00
parent 62e372f4d7
commit d112e2361a
38 changed files with 619 additions and 628 deletions

View File

@@ -52,50 +52,52 @@ class PokemonEggHatch_Scene
def pbMain
pbBGMPlay("Evolution")
# Egg animation
updateScene(Graphics.frame_rate * 15 / 10)
updateScene(1.5)
pbPositionHatchMask(0)
pbSEPlay("Battle ball shake")
swingEgg(4)
updateScene(Graphics.frame_rate * 2 / 10)
updateScene(0.2)
pbPositionHatchMask(1)
pbSEPlay("Battle ball shake")
swingEgg(4)
updateScene(Graphics.frame_rate * 4 / 10)
updateScene(0.4)
pbPositionHatchMask(2)
pbSEPlay("Battle ball shake")
swingEgg(8, 2)
updateScene(Graphics.frame_rate * 4 / 10)
updateScene(0.4)
pbPositionHatchMask(3)
pbSEPlay("Battle ball shake")
swingEgg(16, 4)
updateScene(Graphics.frame_rate * 2 / 10)
updateScene(0.2)
pbPositionHatchMask(4)
pbSEPlay("Battle recall")
# Fade and change the sprite
fadeTime = Graphics.frame_rate * 4 / 10
toneDiff = (255.0 / fadeTime).ceil
(1..fadeTime).each do |i|
@sprites["pokemon"].tone = Tone.new(i * toneDiff, i * toneDiff, i * toneDiff)
@sprites["overlay"].opacity = i * toneDiff
timer_start = System.uptime
loop do
tone_val = lerp(0, 255, 0.4, timer_start, System.uptime)
@sprites["pokemon"].tone = Tone.new(tone_val, tone_val, tone_val)
@sprites["overlay"].opacity = tone_val
updateScene
break if tone_val >= 255
end
updateScene(Graphics.frame_rate * 3 / 4)
updateScene(0.75)
@sprites["pokemon"].setPokemonBitmap(@pokemon) # Pokémon sprite
@sprites["pokemon"].x = Graphics.width / 2
@sprites["pokemon"].y = 264
@pokemon.species_data.apply_metrics_to_sprite(@sprites["pokemon"], 1)
@sprites["hatch"].visible = false
(1..fadeTime).each do |i|
@sprites["pokemon"].tone = Tone.new(255 - (i * toneDiff), 255 - (i * toneDiff), 255 - (i * toneDiff))
@sprites["overlay"].opacity = 255 - (i * toneDiff)
timer_start = System.uptime
loop do
tone_val = lerp(255, 0, 0.4, timer_start, System.uptime)
@sprites["pokemon"].tone = Tone.new(tone_val, tone_val, tone_val)
@sprites["overlay"].opacity = tone_val
updateScene
break if tone_val <= 0
end
@sprites["pokemon"].tone = Tone.new(0, 0, 0)
@sprites["overlay"].opacity = 0
# Finish scene
frames = (GameData::Species.cry_length(@pokemon) * Graphics.frame_rate).ceil
cry_duration = GameData::Species.cry_length(@pokemon)
@pokemon.play_cry
updateScene(frames + 4)
updateScene(cry_duration + 0.1)
pbBGMStop
pbMEPlay("Evolution success")
@pokemon.name = nil
@@ -140,8 +142,8 @@ class PokemonEggHatch_Scene
def swingEgg(speed, swingTimes = 1)
@sprites["hatch"].visible = true
speed = speed.to_f * 20 / Graphics.frame_rate
amplitude = 8
duration = 0.05 * amplitude / speed
targets = []
swingTimes.times do
targets.push(@sprites["pokemon"].x + amplitude)
@@ -149,21 +151,23 @@ class PokemonEggHatch_Scene
end
targets.push(@sprites["pokemon"].x)
targets.each_with_index do |target, i|
timer_start = System.uptime
start_x = @sprites["pokemon"].x
loop do
break if i.even? && @sprites["pokemon"].x >= target
break if i.odd? && @sprites["pokemon"].x <= target
@sprites["pokemon"].x += speed
@sprites["hatch"].x = @sprites["pokemon"].x
@sprites["pokemon"].x = lerp(start_x, target, duration, timer_start, System.uptime)
@sprites["hatch"].x = @sprites["pokemon"].x
updateScene
end
speed *= -1
end
@sprites["pokemon"].x = targets[targets.length - 1]
@sprites["hatch"].x = @sprites["pokemon"].x
end
def updateScene(frames = 1) # Can be used for "wait" effect
frames.times do
def updateScene(duration = 0.01) # Can be used for "wait" effect
timer_start = System.uptime
while System.uptime - timer_start < duration
Graphics.update
Input.update
self.update

View File

@@ -654,14 +654,18 @@ class PokemonParty_Scene
pbSEPlay("GUI party switch")
oldsprite = @sprites["pokemon#{oldid}"]
newsprite = @sprites["pokemon#{newid}"]
timeTaken = Graphics.frame_rate * 4 / 10
distancePerFrame = (Graphics.width / (2.0 * timeTaken)).ceil
timeTaken.times do
oldsprite.x += (oldid & 1) == 0 ? -distancePerFrame : distancePerFrame
newsprite.x += (newid & 1) == 0 ? -distancePerFrame : distancePerFrame
old_start_x = oldsprite.x
new_start_x = newsprite.x
old_mult = oldid.even? ? -1 : 1
new_mult = newid.even? ? -1 : 1
timer_start = System.uptime
loop do
oldsprite.x = lerp(old_start_x, old_start_x + old_mult * Graphics.width / 2, 0.4, timer_start, System.uptime)
newsprite.x = lerp(new_start_x, new_start_x + new_mult * Graphics.width / 2, 0.4, timer_start, System.uptime)
Graphics.update
Input.update
self.update
break if oldsprite.x == old_start_x + old_mult * Graphics.width / 2
end
end
@@ -671,14 +675,18 @@ class PokemonParty_Scene
newsprite = @sprites["pokemon#{newid}"]
oldsprite.pokemon = @party[oldid]
newsprite.pokemon = @party[newid]
timeTaken = Graphics.frame_rate * 4 / 10
distancePerFrame = (Graphics.width / (2.0 * timeTaken)).ceil
timeTaken.times do
oldsprite.x -= (oldid & 1) == 0 ? -distancePerFrame : distancePerFrame
newsprite.x -= (newid & 1) == 0 ? -distancePerFrame : distancePerFrame
old_start_x = oldsprite.x
new_start_x = newsprite.x
old_mult = oldid.even? ? -1 : 1
new_mult = newid.even? ? -1 : 1
timer_start = System.uptime
loop do
oldsprite.x = lerp(old_start_x, old_start_x - old_mult * Graphics.width / 2, 0.4, timer_start, System.uptime)
newsprite.x = lerp(new_start_x, new_start_x - new_mult * Graphics.width / 2, 0.4, timer_start, System.uptime)
Graphics.update
Input.update
self.update
break if oldsprite.x == old_start_x - old_mult * Graphics.width / 2
end
Settings::MAX_PARTY_SIZE.times do |i|
@sprites["pokemon#{i}"].preselected = false

View File

@@ -250,17 +250,21 @@ class PokemonRegionMap_Scene
y_offset = 0
new_x = 0
new_y = 0
dist_per_frame = 8 * 20 / Graphics.frame_rate
timer_start = System.uptime
loop do
Graphics.update
Input.update
pbUpdate
if x_offset != 0 || y_offset != 0
x_offset += (x_offset > 0) ? -dist_per_frame : (x_offset < 0) ? dist_per_frame : 0
y_offset += (y_offset > 0) ? -dist_per_frame : (y_offset < 0) ? dist_per_frame : 0
@sprites["cursor"].x = new_x - x_offset
@sprites["cursor"].y = new_y - y_offset
next
if x_offset != 0
@sprites["cursor"].x = lerp(new_x - x_offset, new_x, 0.1, timer_start, System.uptime)
x_offset = 0 if @sprites["cursor"].x == new_x
end
if y_offset != 0
@sprites["cursor"].y = lerp(new_y - y_offset, new_y, 0.1, timer_start, System.uptime)
y_offset = 0 if @sprites["cursor"].y == new_y
end
next if x_offset != 0 || y_offset != 0
end
ox = 0
oy = 0
@@ -283,6 +287,7 @@ class PokemonRegionMap_Scene
y_offset = oy * SQUARE_HEIGHT
new_x = @sprites["cursor"].x + x_offset
new_y = @sprites["cursor"].y + y_offset
timer_start = System.uptime
end
@sprites["mapbottom"].maplocation = pbGetMapLocation(@map_x, @map_y)
@sprites["mapbottom"].mapdetails = pbGetMapDetails(@map_x, @map_y)

View File

@@ -4,20 +4,20 @@
class PokemonLoadPanel < Sprite
attr_reader :selected
TEXTCOLOR = Color.new(232, 232, 232)
TEXTSHADOWCOLOR = Color.new(136, 136, 136)
MALETEXTCOLOR = Color.new(56, 160, 248)
MALETEXTSHADOWCOLOR = Color.new(56, 104, 168)
FEMALETEXTCOLOR = Color.new(240, 72, 88)
FEMALETEXTSHADOWCOLOR = Color.new(160, 64, 64)
TEXT_COLOR = Color.new(232, 232, 232)
TEXT_SHADOW_COLOR = Color.new(136, 136, 136)
MALE_TEXT_COLOR = Color.new(56, 160, 248)
MALE_TEXT_SHADOW_COLOR = Color.new(56, 104, 168)
FEMALE_TEXT_COLOR = Color.new(240, 72, 88)
FEMALE_TEXT_SHADOW_COLOR = Color.new(160, 64, 64)
def initialize(index, title, isContinue, trainer, framecount, stats, mapid, viewport = nil)
def initialize(index, title, isContinue, trainer, stats, mapid, viewport = nil)
super(viewport)
@index = index
@title = title
@isContinue = isContinue
@trainer = trainer
@totalsec = (stats) ? stats.play_time.to_i : ((framecount || 0) / Graphics.frame_rate)
@totalsec = stats.play_time.to_i
@mapid = mapid
@selected = (index == 0)
@bgbitmap = AnimatedBitmap.new("Graphics/UI/Load/panels")
@@ -62,31 +62,31 @@ class PokemonLoadPanel < Sprite
end
textpos = []
if @isContinue
textpos.push([@title, 32, 16, :left, TEXTCOLOR, TEXTSHADOWCOLOR])
textpos.push([_INTL("Badges:"), 32, 118, :left, TEXTCOLOR, TEXTSHADOWCOLOR])
textpos.push([@trainer.badge_count.to_s, 206, 118, :right, TEXTCOLOR, TEXTSHADOWCOLOR])
textpos.push([_INTL("Pokédex:"), 32, 150, :left, TEXTCOLOR, TEXTSHADOWCOLOR])
textpos.push([@trainer.pokedex.seen_count.to_s, 206, 150, :right, TEXTCOLOR, TEXTSHADOWCOLOR])
textpos.push([_INTL("Time:"), 32, 182, :left, TEXTCOLOR, TEXTSHADOWCOLOR])
textpos.push([@title, 32, 16, :left, TEXT_COLOR, TEXT_SHADOW_COLOR])
textpos.push([_INTL("Badges:"), 32, 118, :left, TEXT_COLOR, TEXT_SHADOW_COLOR])
textpos.push([@trainer.badge_count.to_s, 206, 118, :right, TEXT_COLOR, TEXT_SHADOW_COLOR])
textpos.push([_INTL("Pokédex:"), 32, 150, :left, TEXT_COLOR, TEXT_SHADOW_COLOR])
textpos.push([@trainer.pokedex.seen_count.to_s, 206, 150, :right, TEXT_COLOR, TEXT_SHADOW_COLOR])
textpos.push([_INTL("Time:"), 32, 182, :left, TEXT_COLOR, TEXT_SHADOW_COLOR])
hour = @totalsec / 60 / 60
min = @totalsec / 60 % 60
if hour > 0
textpos.push([_INTL("{1}h {2}m", hour, min), 206, 182, :right, TEXTCOLOR, TEXTSHADOWCOLOR])
textpos.push([_INTL("{1}h {2}m", hour, min), 206, 182, :right, TEXT_COLOR, TEXT_SHADOW_COLOR])
else
textpos.push([_INTL("{1}m", min), 206, 182, :right, TEXTCOLOR, TEXTSHADOWCOLOR])
textpos.push([_INTL("{1}m", min), 206, 182, :right, TEXT_COLOR, TEXT_SHADOW_COLOR])
end
if @trainer.male?
textpos.push([@trainer.name, 112, 70, :left, MALETEXTCOLOR, MALETEXTSHADOWCOLOR])
textpos.push([@trainer.name, 112, 70, :left, MALE_TEXT_COLOR, MALE_TEXT_SHADOW_COLOR])
elsif @trainer.female?
textpos.push([@trainer.name, 112, 70, :left, FEMALETEXTCOLOR, FEMALETEXTSHADOWCOLOR])
textpos.push([@trainer.name, 112, 70, :left, FEMALE_TEXT_COLOR, FEMALE_TEXT_SHADOW_COLOR])
else
textpos.push([@trainer.name, 112, 70, :left, TEXTCOLOR, TEXTSHADOWCOLOR])
textpos.push([@trainer.name, 112, 70, :left, TEXT_COLOR, TEXT_SHADOW_COLOR])
end
mapname = pbGetMapNameFromId(@mapid)
mapname.gsub!(/\\PN/, @trainer.name)
textpos.push([mapname, 386, 16, :right, TEXTCOLOR, TEXTSHADOWCOLOR])
textpos.push([mapname, 386, 16, :right, TEXT_COLOR, TEXT_SHADOW_COLOR])
else
textpos.push([@title, 32, 14, :left, TEXTCOLOR, TEXTSHADOWCOLOR])
textpos.push([@title, 32, 14, :left, TEXT_COLOR, TEXT_SHADOW_COLOR])
end
pbDrawTextPositions(self.bitmap, textpos)
end
@@ -98,7 +98,7 @@ end
#
#===============================================================================
class PokemonLoad_Scene
def pbStartScene(commands, show_continue, trainer, frame_count, stats, map_id)
def pbStartScene(commands, show_continue, trainer, stats, map_id)
@commands = commands
@sprites = {}
@viewport = Viewport.new(0, 0, Graphics.width, Graphics.height)
@@ -107,8 +107,7 @@ class PokemonLoad_Scene
y = 32
commands.length.times do |i|
@sprites["panel#{i}"] = PokemonLoadPanel.new(
i, commands[i], (show_continue) ? (i == 0) : false, trainer,
frame_count, stats, map_id, @viewport
i, commands[i], (show_continue) ? (i == 0) : false, trainer, stats, map_id, @viewport
)
@sprites["panel#{i}"].x = 48
@sprites["panel#{i}"].y = y
@@ -298,8 +297,7 @@ class PokemonLoadScreen
commands[cmd_debug = commands.length] = _INTL("Debug") if $DEBUG
commands[cmd_quit = commands.length] = _INTL("Quit Game")
map_id = show_continue ? @save_data[:map_factory].map.map_id : 0
@scene.pbStartScene(commands, show_continue, @save_data[:player],
@save_data[:frame_count] || 0, @save_data[:stats], map_id)
@scene.pbStartScene(commands, show_continue, @save_data[:player], @save_data[:stats], map_id)
@scene.pbSetParty(@save_data[:player]) if show_continue
@scene.pbStartScene2
loop do

View File

@@ -313,14 +313,10 @@ class PokemonMart_Scene
@adapter = adapter
@viewport2 = Viewport.new(0, 0, Graphics.width, Graphics.height)
@viewport2.z = 99999
numFrames = Graphics.frame_rate * 4 / 10
alphaDiff = (255.0 / numFrames).ceil
(0..numFrames).each do |j|
col = Color.new(0, 0, 0, j * alphaDiff)
@viewport2.color = col
Graphics.update
Input.update
pbWait(0.4) do |delta_t|
@viewport2.color.alpha = lerp(0, 255, 0.4, delta_t)
end
@viewport2.color.alpha = 255
@subscene.pbStartScene(bag)
@viewport = Viewport.new(0, 0, Graphics.width, Graphics.height)
@viewport.z = 99999
@@ -357,13 +353,8 @@ class PokemonMart_Scene
@subscene&.pbEndScene
pbDisposeSpriteHash(@sprites)
if @viewport2
numFrames = Graphics.frame_rate * 4 / 10
alphaDiff = (255.0 / numFrames).ceil
(0..numFrames).each do |j|
col = Color.new(0, 0, 0, (numFrames - j) * alphaDiff)
@viewport2.color = col
Graphics.update
Input.update
pbWait(0.4) do |delta_t|
@viewport2.color.alpha = lerp(255, 0, 0.4, delta_t)
end
@viewport2.dispose
end
@@ -402,21 +393,25 @@ class PokemonMart_Scene
cw.text = msg
pbBottomLeftLines(cw, 2)
cw.visible = true
i = 0
pbPlayDecisionSE
refreshed_after_busy = false
timer_start = System.uptime
loop do
Graphics.update
Input.update
self.update
if !cw.busy?
return if brief
pbRefresh if i == 0
if !refreshed_after_busy
pbRefresh
timer_start = System.uptime
refreshed_after_busy = true
end
end
if Input.trigger?(Input::USE) || Input.trigger?(Input::BACK)
cw.resume if cw.busy?
end
return if i >= Graphics.frame_rate * 3 / 2
i += 1 if !cw.busy?
return if refreshed_after_busy && System.uptime - timer_start >= 1.5
end
end

View File

@@ -248,21 +248,25 @@ class BattlePointShop_Scene
cw.text = msg
pbBottomLeftLines(cw, 2)
cw.visible = true
i = 0
pbPlayDecisionSE
refreshed_after_busy = false
timer_start = System.uptime
loop do
Graphics.update
Input.update
self.update
if !cw.busy?
return if brief
pbRefresh if i == 0
if !refreshed_after_busy
pbRefresh
timer_start = System.uptime
refreshed_after_busy = true
end
end
if Input.trigger?(Input::USE) || Input.trigger?(Input::BACK)
cw.resume if cw.busy?
end
return if i >= Graphics.frame_rate * 3 / 2
i += 1 if !cw.busy?
return if refreshed_after_busy && System.uptime - timer_start >= 1.5
end
end

View File

@@ -286,32 +286,28 @@ def pbDownloadMysteryGift(trainer)
sprite.x = Graphics.width / 2
sprite.y = -sprite.height / 2
end
distanceDiff = 8 * 20 / Graphics.frame_rate
timer_start = System.uptime
start_y = sprite.y
loop do
sprite.y = lerp(start_y, Graphics.height / 2, 1.5, timer_start, System.uptime)
Graphics.update
Input.update
sprite.update
sprite.y += distanceDiff
break if sprite.y >= Graphics.height / 2
end
pbMEPlay("Battle capture success")
(Graphics.frame_rate * 3).times do
Graphics.update
Input.update
sprite.update
pbUpdateSceneMap
end
pbWait(3.0) { sprite.update }
sprites["msgwindow"].visible = true
pbMessageDisplay(sprites["msgwindow"], _INTL("The gift has been received!") + "\1") { sprite.update }
pbMessageDisplay(sprites["msgwindow"], _INTL("Please pick up your gift from the deliveryman in any Poké Mart.")) { sprite.update }
trainer.mystery_gifts.push(gift)
pending.delete_at(command)
opacityDiff = 16 * 20 / Graphics.frame_rate
timer_start = System.uptime
loop do
sprite.opacity = lerp(255, 0, 1.5, timer_start, System.uptime)
Graphics.update
Input.update
sprite.update
sprite.opacity -= opacityDiff
break if sprite.opacity <= 0
end
sprite.dispose

View File

@@ -524,17 +524,10 @@ class PokemonEntryScene2
@sprites["toptab"].bitmap = @bitmaps[(newtab % @@Characters.length) + @@Characters.length]
# Move bottom (old) tab down off the screen, and move top (new) tab right
# onto the screen
deltaX = 48 * 20 / Graphics.frame_rate
deltaY = 24 * 20 / Graphics.frame_rate
timer_start = System.uptime
loop do
if @sprites["bottomtab"].y < 414
@sprites["bottomtab"].y += deltaY
@sprites["bottomtab"].y = 414 if @sprites["bottomtab"].y > 414
end
if @sprites["toptab"].x < 22
@sprites["toptab"].x += deltaX
@sprites["toptab"].x = 22 if @sprites["toptab"].x > 22
end
@sprites["bottomtab"].y = lerp(162, 414, 0.5, timer_start, System.uptime)
@sprites["toptab"].x = lerp(22 - 504, 22, 0.5, timer_start, System.uptime)
Graphics.update
Input.update
pbUpdate