diff --git a/Data/Scripts/001_Technical/002_RubyUtilities.rb b/Data/Scripts/001_Technical/002_RubyUtilities.rb index 1b796b039..339b4cab5 100644 --- a/Data/Scripts/001_Technical/002_RubyUtilities.rb +++ b/Data/Scripts/001_Technical/002_RubyUtilities.rb @@ -389,3 +389,14 @@ end def nil_or_empty?(string) return string.nil? || !string.is_a?(String) || string.size == 0 end + +# Linear interpolation between two values, given the duration of the change and +# either: +# - the time passed since the start of the change (delta), or +# - the start time of the change (delta) and the current time (now) +def lerp(start_val, end_val, duration, delta, now = nil) + delta = now - delta if now + return start_val if delta <= 0 + return end_val if delta >= duration + return start_val + (end_val - start_val) * delta / duration +end diff --git a/Data/Scripts/003_Game processing/003_Interpreter.rb b/Data/Scripts/003_Game processing/003_Interpreter.rb index 890c74651..74081865b 100644 --- a/Data/Scripts/003_Game processing/003_Interpreter.rb +++ b/Data/Scripts/003_Game processing/003_Interpreter.rb @@ -26,12 +26,13 @@ class Interpreter def clear @map_id = 0 # map ID when starting up - @event_id = 0 # event ID + @event_id = 0 @message_waiting = false # waiting for message to end @move_route_waiting = false # waiting for move completion - @wait_count = 0 # wait count - @child_interpreter = nil # child interpreter - @branch = {} # branch data + @wait_count = 0 + @wait_start = nil + @child_interpreter = nil + @branch = {} @buttonInput = false @hidden_choices = [] @renamed_choices = [] @@ -114,8 +115,9 @@ class Interpreter end # Do nothing while waiting if @wait_count > 0 - @wait_count -= 1 - return + return if System.uptime - @wait_start < @wait_count + @wait_count = 0 + @wait_start = nil end # Do nothing if the pause menu is going to open return if $game_temp.menu_calling diff --git a/Data/Scripts/003_Game processing/004_Interpreter_Commands.rb b/Data/Scripts/003_Game processing/004_Interpreter_Commands.rb index 03b1c054b..1c828f347 100644 --- a/Data/Scripts/003_Game processing/004_Interpreter_Commands.rb +++ b/Data/Scripts/003_Game processing/004_Interpreter_Commands.rb @@ -349,21 +349,16 @@ class Interpreter #----------------------------------------------------------------------------- def pbButtonInputProcessing(variable_number = 0, timeout_frames = 0) ret = 0 - timer = timeout_frames * Graphics.frame_rate / 20 + timer_start = System.uptime loop do Graphics.update Input.update pbUpdateSceneMap # Check for input and break if there is one - (1..18).each do |i| - ret = i if Input.trigger?(i) - end + (1..18).each { |i| ret = i if Input.trigger?(i) } break if ret != 0 - # Count down the timer and break if it runs out - if timeout_frames > 0 - timer -= 1 - break if timer <= 0 - end + # Break if the timer runs out + break if timeout_frames > 0 && System.uptime - timer_start >= timeout_frames / 20.0 end Input.update if variable_number && variable_number > 0 @@ -386,7 +381,8 @@ class Interpreter # * Wait #----------------------------------------------------------------------------- def command_106 - @wait_count = @parameters[0] * Graphics.frame_rate / 20 + @wait_count = @parameters[0] / 20.0 + @wait_start = System.uptime return true end diff --git a/Data/Scripts/004_Game classes/007_Game_Character.rb b/Data/Scripts/004_Game classes/007_Game_Character.rb index 05eaa1011..7479b4310 100644 --- a/Data/Scripts/004_Game classes/007_Game_Character.rb +++ b/Data/Scripts/004_Game classes/007_Game_Character.rb @@ -76,6 +76,7 @@ class Game_Character @jump_count = 0 # Frames left in a stationary jump @bob_height = 0 @wait_count = 0 + @wait_start = nil @moved_this_frame = false @moveto_happened = false @locked = false @@ -379,6 +380,7 @@ class Game_Character @move_route_forcing = true @prelock_direction = 0 @wait_count = 0 + @wait_start = nil move_type_custom end @@ -472,7 +474,8 @@ class Game_Character return end if command.code == 15 # Wait - @wait_count = (command.parameters[0] * Graphics.frame_rate / 20) - 1 + @wait_count = command.parameters[0] / 20.0 + @wait_start = System.uptime @move_route_index += 1 return end @@ -887,8 +890,11 @@ class Game_Character def update_command if @wait_count > 0 - @wait_count -= 1 - elsif @move_route_forcing + return if System.uptime - @wait_start < @wait_count + @wait_count = 0 + @wait_start = nil + end + if @move_route_forcing move_type_custom elsif !@starting && !lock? && !moving? && !jumping? update_command_new diff --git a/Data/Scripts/005_Sprites/011_PictureEx.rb b/Data/Scripts/005_Sprites/011_PictureEx.rb index b3c69df0d..b5329b609 100644 --- a/Data/Scripts/005_Sprites/011_PictureEx.rb +++ b/Data/Scripts/005_Sprites/011_PictureEx.rb @@ -109,6 +109,7 @@ class PictureEx @zoom_y = 100.0 @angle = 0 @rotate_speed = 0 + @auto_angle = 0 # Cumulative angle change caused by @rotate_speed @tone = Tone.new(0, 0, 0, 0) @tone_duration = 0 @color = Color.new(0, 0, 0, 0) @@ -136,7 +137,7 @@ class PictureEx def setCallback(delay, cb = nil) delay = ensureDelayAndDuration(delay) - @processes.push([nil, delay, 0, 0, cb]) + @processes.push([nil, delay, 0, false, cb]) end def running? @@ -149,18 +150,13 @@ class PictureEx dur = process[1] + process[2] ret = dur if dur > ret end - ret *= 20.0 / Graphics.frame_rate - return ret.to_i + return ret end def ensureDelayAndDuration(delay, duration = nil) delay = self.totalDuration if delay < 0 - delay *= Graphics.frame_rate / 20.0 - if !duration.nil? - duration *= Graphics.frame_rate / 20.0 - return delay.to_i, duration.to_i - end - return delay.to_i + return delay, duration if !duration.nil? + return delay end def ensureDelay(delay) @@ -173,11 +169,7 @@ class PictureEx # point. If you make a sprite auto-rotate, you should not try to alter # the angle another way too. def rotate(speed) - @rotate_speed = speed * 20.0 / Graphics.frame_rate - while @rotate_speed < 0 - @rotate_speed += 360 - end - @rotate_speed %= 360 + @rotate_speed = speed * 20.0 end def erase @@ -207,7 +199,7 @@ class PictureEx def moveXY(delay, duration, x, y, cb = nil) delay, duration = ensureDelayAndDuration(delay, duration) - @processes.push([Processes::XY, delay, duration, 0, cb, @x, @y, x, y]) + @processes.push([Processes::XY, delay, duration, false, cb, @x, @y, x, y]) end def setXY(delay, x, y, cb = nil) @@ -216,12 +208,12 @@ class PictureEx def moveCurve(delay, duration, x1, y1, x2, y2, x3, y3, cb = nil) delay, duration = ensureDelayAndDuration(delay, duration) - @processes.push([Processes::CURVE, delay, duration, 0, cb, [@x, @y, x1, y1, x2, y2, x3, y3]]) + @processes.push([Processes::CURVE, delay, duration, false, cb, [@x, @y, x1, y1, x2, y2, x3, y3]]) end def moveDelta(delay, duration, x, y, cb = nil) delay, duration = ensureDelayAndDuration(delay, duration) - @processes.push([Processes::DELTA_XY, delay, duration, 0, cb, @x, @y, x, y]) + @processes.push([Processes::DELTA_XY, delay, duration, false, cb, @x, @y, x, y]) end def setDelta(delay, x, y, cb = nil) @@ -230,7 +222,7 @@ class PictureEx def moveZ(delay, duration, z, cb = nil) delay, duration = ensureDelayAndDuration(delay, duration) - @processes.push([Processes::Z, delay, duration, 0, cb, @z, z]) + @processes.push([Processes::Z, delay, duration, false, cb, @z, z]) end def setZ(delay, z, cb = nil) @@ -239,7 +231,7 @@ class PictureEx def moveZoomXY(delay, duration, zoom_x, zoom_y, cb = nil) delay, duration = ensureDelayAndDuration(delay, duration) - @processes.push([Processes::ZOOM, delay, duration, 0, cb, @zoom_x, @zoom_y, zoom_x, zoom_y]) + @processes.push([Processes::ZOOM, delay, duration, false, cb, @zoom_x, @zoom_y, zoom_x, zoom_y]) end def setZoomXY(delay, zoom_x, zoom_y, cb = nil) @@ -256,7 +248,7 @@ class PictureEx def moveAngle(delay, duration, angle, cb = nil) delay, duration = ensureDelayAndDuration(delay, duration) - @processes.push([Processes::ANGLE, delay, duration, 0, cb, @angle, angle]) + @processes.push([Processes::ANGLE, delay, duration, false, cb, @angle, angle]) end def setAngle(delay, angle, cb = nil) @@ -266,7 +258,7 @@ class PictureEx def moveTone(delay, duration, tone, cb = nil) delay, duration = ensureDelayAndDuration(delay, duration) target = (tone) ? tone.clone : Tone.new(0, 0, 0, 0) - @processes.push([Processes::TONE, delay, duration, 0, cb, @tone.clone, target]) + @processes.push([Processes::TONE, delay, duration, false, cb, @tone.clone, target]) end def setTone(delay, tone, cb = nil) @@ -276,7 +268,7 @@ class PictureEx def moveColor(delay, duration, color, cb = nil) delay, duration = ensureDelayAndDuration(delay, duration) target = (color) ? color.clone : Color.new(0, 0, 0, 0) - @processes.push([Processes::COLOR, delay, duration, 0, cb, @color.clone, target]) + @processes.push([Processes::COLOR, delay, duration, false, cb, @color.clone, target]) end def setColor(delay, color, cb = nil) @@ -286,7 +278,7 @@ class PictureEx # Hue changes don't actually work. def moveHue(delay, duration, hue, cb = nil) delay, duration = ensureDelayAndDuration(delay, duration) - @processes.push([Processes::HUE, delay, duration, 0, cb, @hue, hue]) + @processes.push([Processes::HUE, delay, duration, false, cb, @hue, hue]) end # Hue changes don't actually work. @@ -296,7 +288,7 @@ class PictureEx def moveOpacity(delay, duration, opacity, cb = nil) delay, duration = ensureDelayAndDuration(delay, duration) - @processes.push([Processes::OPACITY, delay, duration, 0, cb, @opacity, opacity]) + @processes.push([Processes::OPACITY, delay, duration, false, cb, @opacity, opacity]) end def setOpacity(delay, opacity, cb = nil) @@ -305,119 +297,117 @@ class PictureEx def setVisible(delay, visible, cb = nil) delay = ensureDelay(delay) - @processes.push([Processes::VISIBLE, delay, 0, 0, cb, visible]) + @processes.push([Processes::VISIBLE, delay, 0, false, cb, visible]) end # Only values of 0 (normal), 1 (additive) and 2 (subtractive) are allowed. def setBlendType(delay, blend, cb = nil) delay = ensureDelayAndDuration(delay) - @processes.push([Processes::BLEND_TYPE, delay, 0, 0, cb, blend]) + @processes.push([Processes::BLEND_TYPE, delay, 0, false, cb, blend]) end def setSE(delay, seFile, volume = nil, pitch = nil, cb = nil) delay = ensureDelay(delay) - @processes.push([Processes::SE, delay, 0, 0, cb, seFile, volume, pitch]) + @processes.push([Processes::SE, delay, 0, false, cb, seFile, volume, pitch]) end def setName(delay, name, cb = nil) delay = ensureDelay(delay) - @processes.push([Processes::NAME, delay, 0, 0, cb, name]) + @processes.push([Processes::NAME, delay, 0, false, cb, name]) end def setOrigin(delay, origin, cb = nil) delay = ensureDelay(delay) - @processes.push([Processes::ORIGIN, delay, 0, 0, cb, origin]) + @processes.push([Processes::ORIGIN, delay, 0, false, cb, origin]) end def setSrc(delay, srcX, srcY, cb = nil) delay = ensureDelay(delay) - @processes.push([Processes::SRC, delay, 0, 0, cb, srcX, srcY]) + @processes.push([Processes::SRC, delay, 0, false, cb, srcX, srcY]) end def setSrcSize(delay, srcWidth, srcHeight, cb = nil) delay = ensureDelay(delay) - @processes.push([Processes::SRC_SIZE, delay, 0, 0, cb, srcWidth, srcHeight]) + @processes.push([Processes::SRC_SIZE, delay, 0, false, cb, srcWidth, srcHeight]) end # Used to cut Pokémon sprites off when they faint and sink into the ground. def setCropBottom(delay, y, cb = nil) delay = ensureDelay(delay) - @processes.push([Processes::CROP_BOTTOM, delay, 0, 0, cb, y]) + @processes.push([Processes::CROP_BOTTOM, delay, 0, false, cb, y]) end def update + @timer_start = System.uptime if !@timer_start + this_frame = ((System.uptime - @timer_start) * 20).to_i # 20 frames per second procEnded = false @frameUpdates.clear @processes.each_with_index do |process, i| - # Decrease delay of processes that are scheduled to start later - if process[1] >= 0 - # Set initial values if the process will start this frame - if process[1] == 0 - case process[0] - when Processes::XY - process[5] = @x - process[6] = @y - when Processes::DELTA_XY - process[5] = @x - process[6] = @y - process[7] += @x - process[8] += @y - when Processes::CURVE - process[5][0] = @x - process[5][1] = @y - when Processes::Z - process[5] = @z - when Processes::ZOOM - process[5] = @zoom_x - process[6] = @zoom_y - when Processes::ANGLE - process[5] = @angle - when Processes::TONE - process[5] = @tone.clone - when Processes::COLOR - process[5] = @color.clone - when Processes::HUE - process[5] = @hue - when Processes::OPACITY - process[5] = @opacity - end + # Skip processes that aren't due to start yet + next if process[1] > this_frame + # Set initial values if the process has just started + if !process[3] # Not started yet + process[3] = true # Running + case process[0] + when Processes::XY + process[5] = @x + process[6] = @y + when Processes::DELTA_XY + process[5] = @x + process[6] = @y + process[7] += @x + process[8] += @y + when Processes::CURVE + process[5][0] = @x + process[5][1] = @y + when Processes::Z + process[5] = @z + when Processes::ZOOM + process[5] = @zoom_x + process[6] = @zoom_y + when Processes::ANGLE + process[5] = @angle + when Processes::TONE + process[5] = @tone.clone + when Processes::COLOR + process[5] = @color.clone + when Processes::HUE + process[5] = @hue + when Processes::OPACITY + process[5] = @opacity end - # Decrease delay counter - process[1] -= 1 - # Process hasn't started yet, skip to the next one - next if process[1] >= 0 end # Update process @frameUpdates.push(process[0]) if !@frameUpdates.include?(process[0]) - fra = (process[2] == 0) ? 1 : process[3] # Frame counter - dur = (process[2] == 0) ? 1 : process[2] # Total duration of process + start_time = @timer_start + process[1] / 20.0 + duration = process[2] / 20.0 case process[0] when Processes::XY, Processes::DELTA_XY - @x = process[5] + (fra * (process[7] - process[5]) / dur) - @y = process[6] + (fra * (process[8] - process[6]) / dur) + @x = lerp(process[5], process[7], duration, start_time, System.uptime) + @y = lerp(process[6], process[8], duration, start_time, System.uptime) when Processes::CURVE - @x, @y = getCubicPoint2(process[5], fra.to_f / dur) + @x, @y = getCubicPoint2(process[5], (System.uptime - start_time) / duration) when Processes::Z - @z = process[5] + (fra * (process[6] - process[5]) / dur) + @z = lerp(process[5], process[6], duration, start_time, System.uptime) when Processes::ZOOM - @zoom_x = process[5] + (fra * (process[7] - process[5]) / dur) - @zoom_y = process[6] + (fra * (process[8] - process[6]) / dur) + @zoom_x = lerp(process[5], process[7], duration, start_time, System.uptime) + @zoom_y = lerp(process[6], process[8], duration, start_time, System.uptime) when Processes::ANGLE - @angle = process[5] + (fra * (process[6] - process[5]) / dur) + @angle = lerp(process[5], process[6], duration, start_time, System.uptime) when Processes::TONE - @tone.red = process[5].red + (fra * (process[6].red - process[5].red) / dur) - @tone.green = process[5].green + (fra * (process[6].green - process[5].green) / dur) - @tone.blue = process[5].blue + (fra * (process[6].blue - process[5].blue) / dur) - @tone.gray = process[5].gray + (fra * (process[6].gray - process[5].gray) / dur) + @tone.red = lerp(process[5].red, process[6].red, duration, start_time, System.uptime) + @tone.green = lerp(process[5].green, process[6].green, duration, start_time, System.uptime) + @tone.blue = lerp(process[5].blue, process[6].blue, duration, start_time, System.uptime) + @tone.gray = lerp(process[5].gray, process[6].gray, duration, start_time, System.uptime) when Processes::COLOR - @color.red = process[5].red + (fra * (process[6].red - process[5].red) / dur) - @color.green = process[5].green + (fra * (process[6].green - process[5].green) / dur) - @color.blue = process[5].blue + (fra * (process[6].blue - process[5].blue) / dur) - @color.alpha = process[5].alpha + (fra * (process[6].alpha - process[5].alpha) / dur) + @color.red = lerp(process[5].red, process[6].red, duration, start_time, System.uptime) + @color.green = lerp(process[5].green, process[6].green, duration, start_time, System.uptime) + @color.blue = lerp(process[5].blue, process[6].blue, duration, start_time, System.uptime) + @color.alpha = lerp(process[5].alpha, process[6].alpha, duration, start_time, System.uptime) when Processes::HUE - @hue = (process[6] - process[5]).to_f / dur + @hue = lerp(process[5], process[6], duration, start_time, System.uptime) when Processes::OPACITY - @opacity = process[5] + (fra * (process[6] - process[5]) / dur) + @opacity = lerp(process[5], process[6], duration, start_time, System.uptime) when Processes::VISIBLE @visible = process[5] when Processes::BLEND_TYPE @@ -437,19 +427,23 @@ class PictureEx when Processes::CROP_BOTTOM @cropBottom = process[5] end - # Increase frame counter - process[3] += 1 - next if process[3] <= process[2] - # Process has ended, erase it - callback(process[4]) if process[4] - @processes[i] = nil - procEnded = true + # Erase process if its duration has elapsed + if process[1] + process[2] <= this_frame + callback(process[4]) if process[4] + @processes[i] = nil + procEnded = true + end end # Clear out empty spaces in @processes array caused by finished processes @processes.compact! if procEnded # Add the constant rotation speed if @rotate_speed != 0 @frameUpdates.push(Processes::ANGLE) if !@frameUpdates.include?(Processes::ANGLE) + @auto_angle = @rotate_speed * (System.uptime - @timer_start) + while @auto_angle < 0 + @auto_angle += 360 + end + @auto_angle %= 360 @angle += @rotate_speed while @angle < 0 @angle += 360 diff --git a/Data/Scripts/007_Objects and windows/002_MessageConfig.rb b/Data/Scripts/007_Objects and windows/002_MessageConfig.rb index 80d67a911..a5fc2b1a0 100644 --- a/Data/Scripts/007_Objects and windows/002_MessageConfig.rb +++ b/Data/Scripts/007_Objects and windows/002_MessageConfig.rb @@ -555,16 +555,17 @@ end # Fades out the screen before a block is run and fades it back in after the # block exits. z indicates the z-coordinate of the viewport used for this effect def pbFadeOutIn(z = 99999, nofadeout = false) + duration = 0.4 # In seconds col = Color.new(0, 0, 0, 0) viewport = Viewport.new(0, 0, Graphics.width, Graphics.height) viewport.z = z - numFrames = (Graphics.frame_rate * 0.4).floor - alphaDiff = (255.0 / numFrames).ceil - (0..numFrames).each do |j| - col.set(0, 0, 0, j * alphaDiff) + timer_start = System.uptime + loop do + col.set(0, 0, 0, lerp(0, 255, duration, timer_start, System.uptime)) viewport.color = col Graphics.update Input.update + break if col.alpha == 255 end pbPushFade begin @@ -574,11 +575,13 @@ def pbFadeOutIn(z = 99999, nofadeout = false) ensure pbPopFade if !nofadeout - (0..numFrames).each do |j| - col.set(0, 0, 0, (numFrames - j) * alphaDiff) + timer_start = System.uptime + loop do + col.set(0, 0, 0, lerp(255, 0, duration, timer_start, System.uptime)) viewport.color = col Graphics.update Input.update + break if col.alpha == 0 end end viewport.dispose @@ -586,17 +589,18 @@ def pbFadeOutIn(z = 99999, nofadeout = false) end def pbFadeOutInWithUpdate(z, sprites, nofadeout = false) + duration = 0.4 # In seconds col = Color.new(0, 0, 0, 0) viewport = Viewport.new(0, 0, Graphics.width, Graphics.height) viewport.z = z - numFrames = (Graphics.frame_rate * 0.4).floor - alphaDiff = (255.0 / numFrames).ceil - (0..numFrames).each do |j| - col.set(0, 0, 0, j * alphaDiff) + timer_start = System.uptime + loop do + col.set(0, 0, 0, lerp(0, 255, duration, timer_start, System.uptime)) viewport.color = col pbUpdateSpriteHash(sprites) Graphics.update Input.update + break if col.alpha == 255 end pbPushFade begin @@ -604,12 +608,14 @@ def pbFadeOutInWithUpdate(z, sprites, nofadeout = false) ensure pbPopFade if !nofadeout - (0..numFrames).each do |j| - col.set(0, 0, 0, (numFrames - j) * alphaDiff) + timer_start = System.uptime + loop do + col.set(0, 0, 0, lerp(255, 0, duration, timer_start, System.uptime)) viewport.color = col pbUpdateSpriteHash(sprites) Graphics.update Input.update + break if col.alpha == 0 end end viewport.dispose @@ -633,13 +639,16 @@ def pbFadeOutInWithMusic(zViewport = 99999) end def pbFadeOutAndHide(sprites) + duration = 0.4 # In seconds + col = Color.new(0, 0, 0, 0) visiblesprites = {} - numFrames = (Graphics.frame_rate * 0.4).floor - alphaDiff = (255.0 / numFrames).ceil pbDeactivateWindows(sprites) do - (0..numFrames).each do |j| - pbSetSpritesToColor(sprites, Color.new(0, 0, 0, j * alphaDiff)) + timer_start = System.uptime + loop do + col.alpha = lerp(0, 255, duration, timer_start, System.uptime) + pbSetSpritesToColor(sprites, col) (block_given?) ? yield : pbUpdateSpriteHash(sprites) + break if col.alpha == 255 end end sprites.each do |i| @@ -652,6 +661,8 @@ def pbFadeOutAndHide(sprites) end def pbFadeInAndShow(sprites, visiblesprites = nil) + duration = 0.4 # In seconds + col = Color.new(0, 0, 0, 0) if visiblesprites visiblesprites.each do |i| if i[1] && sprites[i[0]] && !pbDisposed?(sprites[i[0]]) @@ -659,12 +670,13 @@ def pbFadeInAndShow(sprites, visiblesprites = nil) end end end - numFrames = (Graphics.frame_rate * 0.4).floor - alphaDiff = (255.0 / numFrames).ceil pbDeactivateWindows(sprites) do - (0..numFrames).each do |j| - pbSetSpritesToColor(sprites, Color.new(0, 0, 0, ((numFrames - j) * alphaDiff))) + timer_start = System.uptime + loop do + col.alpha = lerp(255, 0, duration, timer_start, System.uptime) + pbSetSpritesToColor(sprites, col) (block_given?) ? yield : pbUpdateSpriteHash(sprites) + break if col.alpha == 0 end end end diff --git a/Data/Scripts/007_Objects and windows/007_BitmapSprite.rb b/Data/Scripts/007_Objects and windows/007_BitmapSprite.rb index 8a809329b..dfaec0075 100644 --- a/Data/Scripts/007_Objects and windows/007_BitmapSprite.rb +++ b/Data/Scripts/007_Objects and windows/007_BitmapSprite.rb @@ -29,11 +29,10 @@ class AnimatedSprite < Sprite attr_reader :framecount attr_reader :animname + # frameskip is in 1/20ths of a second, and is the time between frame changes. def initializeLong(animname, framecount, framewidth, frameheight, frameskip) @animname = pbBitmapName(animname) - @realframes = 0 - @frameskip = [1, frameskip].max - @frameskip *= Graphics.frame_rate / 20 + @time_per_frame = [1, frameskip].max / 20.0 raise _INTL("Frame width is 0") if framewidth == 0 raise _INTL("Frame height is 0") if frameheight == 0 begin @@ -60,13 +59,12 @@ class AnimatedSprite < Sprite self.frame = 0 end - # Shorter version of AnimationSprite. All frames are placed on a single row - # of the bitmap, so that the width and height need not be defined beforehand + # Shorter version of AnimationSprite. All frames are placed on a single row + # of the bitmap, so that the width and height need not be defined beforehand. + # frameskip is in 1/20ths of a second, and is the time between frame changes. def initializeShort(animname, framecount, frameskip) @animname = pbBitmapName(animname) - @realframes = 0 - @frameskip = [1, frameskip].max - @frameskip *= Graphics.frame_rate / 20 + @time_per_frame = [1, frameskip].max / 20.0 begin @animbitmap = AnimatedBitmap.new(animname).deanimate rescue @@ -114,31 +112,27 @@ class AnimatedSprite < Sprite def frame=(value) @frame = value - @realframes = 0 self.src_rect.x = @frame % @framesperrow * @framewidth self.src_rect.y = @frame / @framesperrow * @frameheight end def start @playing = true - @realframes = 0 + @start_time = System.uptime end alias play start def stop @playing = false + @start_time = nil end def update super - if @playing - @realframes += 1 - if @realframes == @frameskip - @realframes = 0 - self.frame += 1 - self.frame %= self.framecount - end + if @playing && System.uptime - @start_time >= @time_per_frame + self.frame = (@frame + 1) % self.framecount + @start_time += @time_per_frame end end end diff --git a/Data/Scripts/007_Objects and windows/011_Messages.rb b/Data/Scripts/007_Objects and windows/011_Messages.rb index 2b78de1c6..a2e87d285 100644 --- a/Data/Scripts/007_Objects and windows/011_Messages.rb +++ b/Data/Scripts/007_Objects and windows/011_Messages.rb @@ -812,14 +812,15 @@ end def pbMessageWaitForInput(msgwindow, frames, showPause = false) return if !frames || frames <= 0 msgwindow.startPause if msgwindow && showPause - frames = frames * Graphics.frame_rate / 20 - frames.times do + timer_start = System.uptime + loop do Graphics.update Input.update msgwindow&.update pbUpdateSceneMap - break if Input.trigger?(Input::USE) || Input.trigger?(Input::BACK) yield if block_given? + break if Input.trigger?(Input::USE) || Input.trigger?(Input::BACK) + break if System.uptime - timer_start >= frames / 20.0 end msgwindow.stopPause if msgwindow && showPause end diff --git a/Data/Scripts/011_Battle/001_Battle/001_Battle.rb b/Data/Scripts/011_Battle/001_Battle/001_Battle.rb index 1aff162e5..9f27e80e4 100644 --- a/Data/Scripts/011_Battle/001_Battle/001_Battle.rb +++ b/Data/Scripts/011_Battle/001_Battle/001_Battle.rb @@ -845,7 +845,10 @@ class Battle return if !Scene::USE_ABILITY_SPLASH @scene.pbShowAbilitySplash(battler) if delay - Graphics.frame_rate.times { @scene.pbUpdate } # 1 second + timer_start = System.uptime + until System.uptime - timer_start >= 1 # 1 second + @scene.pbUpdate + end end end diff --git a/Data/Scripts/011_Battle/004_Scene/004_Scene_PlayAnimations.rb b/Data/Scripts/011_Battle/004_Scene/004_Scene_PlayAnimations.rb index 07a16fa9b..f65f1e116 100644 --- a/Data/Scripts/011_Battle/004_Scene/004_Scene_PlayAnimations.rb +++ b/Data/Scripts/011_Battle/004_Scene/004_Scene_PlayAnimations.rb @@ -360,9 +360,10 @@ class Battle::Scene return if !ball # Data box disappear animation dataBoxAnim = Animation::DataBoxDisappear.new(@sprites, @viewport, idxBattler) + timer_start = System.uptime loop do dataBoxAnim.update - ball.opacity -= 12 * 20 / Graphics.frame_rate if ball.opacity > 0 + ball.opacity = lerp(255, 0, 1.0, timer_start, System.uptime) pbUpdate break if dataBoxAnim.animDone? && ball.opacity <= 0 end diff --git a/Data/Scripts/011_Battle/007_Other battle code/007_BattleAnimationPlayer.rb b/Data/Scripts/011_Battle/007_Other battle code/007_BattleAnimationPlayer.rb index d36276449..02704740f 100644 --- a/Data/Scripts/011_Battle/007_Other battle code/007_BattleAnimationPlayer.rb +++ b/Data/Scripts/011_Battle/007_Other battle code/007_BattleAnimationPlayer.rb @@ -683,8 +683,9 @@ class PBAnimationPlayerX @inEditor = inEditor @looping = false @animbitmap = nil # Animation sheet graphic + @old_frame = -1 @frame = -1 - @framesPerTick = [Graphics.frame_rate / 20, 1].max # 20 ticks per second + @timer_start = nil @srcLine = nil @dstLine = nil @userOrig = getSpriteCenter(@usersprite) @@ -730,9 +731,7 @@ class PBAnimationPlayerX def dispose @animbitmap&.dispose - (2...MAX_SPRITES).each do |i| - @animsprites[i]&.dispose - end + (2...MAX_SPRITES).each { |i| @animsprites[i]&.dispose } @bgGraphic.dispose @bgColor.dispose @foGraphic.dispose @@ -752,6 +751,7 @@ class PBAnimationPlayerX def start @frame = 0 + @timer_start = System.uptime end def animDone? @@ -765,18 +765,20 @@ class PBAnimationPlayerX def update return if @frame < 0 - animFrame = @frame / @framesPerTick - + @frame = ((System.uptime - @timer_start) * 20).to_i # Loop or end the animation if the animation has reached the end - if animFrame >= @animation.length - @frame = (@looping) ? 0 : -1 - if @frame < 0 + if @frame >= @animation.length + if @looping + @frame %= @animation.length + @timer_start += @animation.length / 20.0 + else + @frame = -1 @animbitmap&.dispose @animbitmap = nil return end end - # Load the animation's spritesheet and assign it to all the sprites. + # Load the animation's spritesheet and assign it to all the sprites if !@animbitmap || @animbitmap.disposed? @animbitmap = AnimatedBitmap.new("Graphics/Animations/" + @animation.graphic, @animation.hue).deanimate @@ -789,57 +791,53 @@ class PBAnimationPlayerX @bgColor.update @foGraphic.update @foColor.update - # Update all the sprites to depict the animation's next frame - if @framesPerTick == 1 || (@frame % @framesPerTick) == 0 - thisframe = @animation[animFrame] - # Make all cel sprites invisible - MAX_SPRITES.times do |i| - @animsprites[i].visible = false if @animsprites[i] + return if @frame == @old_frame + @old_frame = @frame + thisframe = @animation[@frame] + # Make all cel sprites invisible + MAX_SPRITES.times { |i| @animsprites[i].visible = false if @animsprites[i] } + # Set each cel sprite acoordingly + thisframe.length.times do |i| + cel = thisframe[i] + next if !cel + sprite = @animsprites[i] + next if !sprite + # Set cel sprite's graphic + case cel[AnimFrame::PATTERN] + when -1 + sprite.bitmap = @userbitmap + when -2 + sprite.bitmap = @targetbitmap + else + sprite.bitmap = @animbitmap end - # Set each cel sprite acoordingly - thisframe.length.times do |i| - cel = thisframe[i] - next if !cel - sprite = @animsprites[i] - next if !sprite - # Set cel sprite's graphic - case cel[AnimFrame::PATTERN] - when -1 - sprite.bitmap = @userbitmap - when -2 - sprite.bitmap = @targetbitmap - else - sprite.bitmap = @animbitmap + # Apply settings to the cel sprite + pbSpriteSetAnimFrame(sprite, cel, @usersprite, @targetsprite) + case cel[AnimFrame::FOCUS] + when 1 # Focused on target + sprite.x = cel[AnimFrame::X] + @targetOrig[0] - Battle::Scene::FOCUSTARGET_X + sprite.y = cel[AnimFrame::Y] + @targetOrig[1] - Battle::Scene::FOCUSTARGET_Y + when 2 # Focused on user + sprite.x = cel[AnimFrame::X] + @userOrig[0] - Battle::Scene::FOCUSUSER_X + sprite.y = cel[AnimFrame::Y] + @userOrig[1] - Battle::Scene::FOCUSUSER_Y + when 3 # Focused on user and target + next if !@srcLine || !@dstLine + point = transformPoint(@srcLine[0], @srcLine[1], @srcLine[2], @srcLine[3], + @dstLine[0], @dstLine[1], @dstLine[2], @dstLine[3], + sprite.x, sprite.y) + sprite.x = point[0] + sprite.y = point[1] + if isReversed(@srcLine[0], @srcLine[2], @dstLine[0], @dstLine[2]) && + cel[AnimFrame::PATTERN] >= 0 + # Reverse direction + sprite.mirror = !sprite.mirror end - # Apply settings to the cel sprite - pbSpriteSetAnimFrame(sprite, cel, @usersprite, @targetsprite) - case cel[AnimFrame::FOCUS] - when 1 # Focused on target - sprite.x = cel[AnimFrame::X] + @targetOrig[0] - Battle::Scene::FOCUSTARGET_X - sprite.y = cel[AnimFrame::Y] + @targetOrig[1] - Battle::Scene::FOCUSTARGET_Y - when 2 # Focused on user - sprite.x = cel[AnimFrame::X] + @userOrig[0] - Battle::Scene::FOCUSUSER_X - sprite.y = cel[AnimFrame::Y] + @userOrig[1] - Battle::Scene::FOCUSUSER_Y - when 3 # Focused on user and target - next if !@srcLine || !@dstLine - point = transformPoint(@srcLine[0], @srcLine[1], @srcLine[2], @srcLine[3], - @dstLine[0], @dstLine[1], @dstLine[2], @dstLine[3], - sprite.x, sprite.y) - sprite.x = point[0] - sprite.y = point[1] - if isReversed(@srcLine[0], @srcLine[2], @dstLine[0], @dstLine[2]) && - cel[AnimFrame::PATTERN] >= 0 - # Reverse direction - sprite.mirror = !sprite.mirror - end - end - sprite.x += 64 if @inEditor - sprite.y += 64 if @inEditor end - # Play timings - @animation.playTiming(animFrame, @bgGraphic, @bgColor, @foGraphic, @foColor, @oldbg, @oldfo, @user) + sprite.x += 64 if @inEditor + sprite.y += 64 if @inEditor end - @frame += 1 + # Play timings + @animation.playTiming(@frame, @bgGraphic, @bgColor, @foGraphic, @foColor, @oldbg, @oldfo, @user) end end diff --git a/Data/Scripts/012_Overworld/001_Overworld visuals/002_Overworld_Overlays.rb b/Data/Scripts/012_Overworld/001_Overworld visuals/002_Overworld_Overlays.rb index 3bac753a2..3867276aa 100644 --- a/Data/Scripts/012_Overworld/001_Overworld visuals/002_Overworld_Overlays.rb +++ b/Data/Scripts/012_Overworld/001_Overworld visuals/002_Overworld_Overlays.rb @@ -2,6 +2,9 @@ # Location signpost #=============================================================================== class LocationWindow + APPEAR_TIME = 0.4 # In seconds; is also the disappear time + LINGER_TIME = 1.6 # In seconds; time during which self is fully visible + def initialize(name) @window = Window_AdvancedTextPokemon.new(name) @window.resizeToFit(name, Graphics.width) @@ -10,11 +13,11 @@ class LocationWindow @window.viewport = Viewport.new(0, 0, Graphics.width, Graphics.height) @window.viewport.z = 99999 @currentmap = $game_map.map_id - @frames = 0 + @timer_start = System.uptime end def disposed? - @window.disposed? + return @window.disposed? end def dispose @@ -28,12 +31,11 @@ class LocationWindow @window.dispose return end - if @frames > Graphics.frame_rate * 2 - @window.y -= 4 - @window.dispose if @window.y + @window.height < 0 + if System.uptime - @timer_start >= APPEAR_TIME + LINGER_TIME + @window.y = lerp(0, -@window.height, APPEAR_TIME, @timer_start + APPEAR_TIME + LINGER_TIME, System.uptime) + @window.dispose if @window.y + @window.height <= 0 else - @window.y += 4 if @window.y < 0 - @frames += 1 + @window.y = lerp(-@window.height, 0, APPEAR_TIME, @timer_start, System.uptime) end end end @@ -62,7 +64,7 @@ class DarknessSprite < Sprite def radiusMax; return 176; end # After using Flash def radius=(value) - @radius = value + @radius = value.round refresh end diff --git a/Data/Scripts/012_Overworld/001_Overworld visuals/003_Overworld_MapTransitionAnims.rb b/Data/Scripts/012_Overworld/001_Overworld visuals/003_Overworld_MapTransitionAnims.rb index ce2c3c841..f20fe7f1a 100644 --- a/Data/Scripts/012_Overworld/001_Overworld visuals/003_Overworld_MapTransitionAnims.rb +++ b/Data/Scripts/012_Overworld/001_Overworld visuals/003_Overworld_MapTransitionAnims.rb @@ -6,24 +6,22 @@ def pbCaveEntranceEx(exiting) sprite = BitmapSprite.new(Graphics.width, Graphics.height) sprite.z = 100000 # Define values used for the animation - totalFrames = (Graphics.frame_rate * 0.4).floor - increment = (255.0 / totalFrames).ceil + duration = 0.4 totalBands = 15 bandheight = ((Graphics.height / 2.0) - 10) / totalBands bandwidth = ((Graphics.width / 2.0) - 12) / totalBands + start_gray = (exiting) ? 0 : 255 + end_gray = (exiting) ? 255 : 0 # Create initial array of band colors (black if exiting, white if entering) - grays = Array.new(totalBands) { |i| (exiting) ? 0 : 255 } + grays = Array.new(totalBands) { |i| start_gray } # Animate bands changing color - totalFrames.times do |j| + timer_start = System.uptime + until System.uptime - timer_start >= duration x = 0 y = 0 # Calculate color of each band totalBands.times do |k| - next if k >= totalBands * j / totalFrames - inc = increment - inc *= -1 if exiting - grays[k] -= inc - grays[k] = 0 if grays[k] < 0 + grays[k] = lerp(start_gray, end_gray, duration, timer_start + k * duration / totalBands, System.uptime) end # Draw gray rectangles rectwidth = Graphics.width @@ -47,19 +45,19 @@ def pbCaveEntranceEx(exiting) pbToneChangeAll(Tone.new(-255, -255, -255), 0) end # Animate fade to white (if exiting) or black (if entering) - totalFrames.times do |j| - if exiting - sprite.color = Color.new(255, 255, 255, j * increment) - else - sprite.color = Color.new(0, 0, 0, j * increment) - end + timer_start = System.uptime + loop do + sprite.color = Color.new(end_gray, end_gray, end_gray, + lerp(0, 255, duration, timer_start, System.uptime)) Graphics.update Input.update + break if sprite.color.alpha >= 255 end # Set the tone at end of fading animation pbToneChangeAll(Tone.new(0, 0, 0), 8) # Pause briefly - (Graphics.frame_rate / 10).times do + timer_start = System.uptime + until System.uptime - timer_start >= 0.1 Graphics.update Input.update end diff --git a/Data/Scripts/012_Overworld/001_Overworld.rb b/Data/Scripts/012_Overworld/001_Overworld.rb index 4c01b5088..5f1cf4151 100644 --- a/Data/Scripts/012_Overworld/001_Overworld.rb +++ b/Data/Scripts/012_Overworld/001_Overworld.rb @@ -28,7 +28,8 @@ end class Game_Temp attr_accessor :warned_low_battery attr_accessor :cue_bgm - attr_accessor :cue_bgm_frame_delay + attr_accessor :cue_bgm_timer_start + attr_accessor :cue_bgm_delay end def pbBatteryLow? @@ -56,10 +57,9 @@ EventHandlers.add(:on_frame_update, :low_battery_warning, EventHandlers.add(:on_frame_update, :cue_bgm_after_delay, proc { - next if $game_temp.cue_bgm_frame_delay.nil? - $game_temp.cue_bgm_frame_delay -= 1 - next if $game_temp.cue_bgm_frame_delay > 0 - $game_temp.cue_bgm_frame_delay = nil + next if $game_temp.cue_bgm_delay.nil? + next if System.uptime - $game_temp.cue_bgm_timer_start < $game_temp.cue_bgm_delay + $game_temp.cue_bgm_delay = nil pbBGMPlay($game_temp.cue_bgm) if $game_system.getPlayingBGM.nil? } ) @@ -413,14 +413,15 @@ end #=============================================================================== def pbCueBGM(bgm, seconds, volume = nil, pitch = nil) return if !bgm - bgm = pbResolveAudioFile(bgm, volume, pitch) + bgm = pbResolveAudioFile(bgm, volume, pitch) playingBGM = $game_system.playing_bgm if !playingBGM || playingBGM.name != bgm.name || playingBGM.pitch != bgm.pitch pbBGMFade(seconds) - if !$game_temp.cue_bgm_frame_delay - $game_temp.cue_bgm_frame_delay = (seconds * Graphics.frame_rate) * 3 / 5 - end $game_temp.cue_bgm = bgm + if !$game_temp.cue_bgm_delay + $game_temp.cue_bgm_delay = seconds * 0.6 + $game_temp.cue_bgm_timer_start = System.uptime + end elsif playingBGM pbBGMPlay(bgm) end @@ -533,8 +534,11 @@ def pbMoveRoute(event, commands, waitComplete = false) return route end -def pbWait(numFrames) - numFrames.times do +# duration is in seconds +def pbWait(duration) + timer_start = System.uptime + until System.uptime - timer_start >= duration + yield System.uptime - timer_start if block_given? Graphics.update Input.update pbUpdateSceneMap diff --git a/Data/Scripts/012_Overworld/002_Battle triggering/001_Overworld_BattleStarting.rb b/Data/Scripts/012_Overworld/002_Battle triggering/001_Overworld_BattleStarting.rb index 24df8a9c8..6051de90f 100644 --- a/Data/Scripts/012_Overworld/002_Battle triggering/001_Overworld_BattleStarting.rb +++ b/Data/Scripts/012_Overworld/002_Battle triggering/001_Overworld_BattleStarting.rb @@ -314,7 +314,10 @@ module BattleCreationHelperMethods end if [2, 5].include?(outcome) && can_lose # if loss or draw $player.party.each { |pkmn| pkmn.heal } - (Graphics.frame_rate / 4).times { Graphics.update } + timer_start = System.uptime + until System.uptime - timer_start >= 0.25 + Graphics.update + end end EventHandlers.trigger(:on_end_battle, outcome, can_lose) $game_player.straighten diff --git a/Data/Scripts/012_Overworld/002_Battle triggering/002_Overworld_BattleIntroAnim.rb b/Data/Scripts/012_Overworld/002_Battle triggering/002_Overworld_BattleIntroAnim.rb index a7c062205..00724fe29 100644 --- a/Data/Scripts/012_Overworld/002_Battle triggering/002_Overworld_BattleIntroAnim.rb +++ b/Data/Scripts/012_Overworld/002_Battle triggering/002_Overworld_BattleIntroAnim.rb @@ -158,19 +158,23 @@ def pbBattleAnimationCore(anim, viewport, location, num_flashes = 2) viewport.color = Color.new(c, c, c) # Fade to black/white a few times half_flash_time = 0.2 # seconds num_flashes.times do # 2 flashes + fade_out = false timer_start = System.uptime loop do - if System.uptime - timer_start < half_flash_time - viewport.color.alpha = 255 * (System.uptime - timer_start) / half_flash_time + if fade_out + viewport.color.alpha = lerp(255, 0, half_flash_time, timer_start, System.uptime) else - viewport.color.alpha = 255 * (2 - ((System.uptime - timer_start) / half_flash_time)) + viewport.color.alpha = lerp(0, 255, half_flash_time, timer_start, System.uptime) end Graphics.update pbUpdateSceneMap - break if System.uptime - timer_start >= half_flash_time * 2 + break if fade_out && viewport.color.alpha <= 0 + if !fade_out && viewport.color.alpha >= 255 + fade_out = true + timer_start = System.uptime + end end end - viewport.color.alpha = 0 end # Take screenshot of game, for use in some animations $game_temp.background_bitmap&.dispose @@ -180,7 +184,7 @@ def pbBattleAnimationCore(anim, viewport, location, num_flashes = 2) viewport.color = Color.black # Ensure screen is black Graphics.transition(25, "Graphics/Transitions/" + anim) # Slight pause after animation before starting up the battle scene - pbWait(Graphics.frame_rate / 10) + pbWait(0.1) end #=============================================================================== @@ -314,22 +318,22 @@ SpecialBattleIntroAnimations.register("alternate_vs_trainer_animation", 50, # bar2 = Sprite.new(viewopp) bar2.bitmap = RPG::Cache.transition(trainer_bar_graphic) bar2.x = xoffset + vs_x = Graphics.width / 2 + vs_y = Graphics.height / 1.5 vs = Sprite.new(viewvs) vs.bitmap = RPG::Cache.transition("vs") vs.ox = vs.bitmap.width / 2 vs.oy = vs.bitmap.height / 2 - vs.x = Graphics.width / 2 - vs.y = Graphics.height / 1.5 + vs.x = vs_x + vs.y = vs_y vs.visible = false flash = Sprite.new(viewvs) flash.bitmap = RPG::Cache.transition("vsFlash") flash.opacity = 0 # Animate bars sliding in from either side - slideInTime = (Graphics.frame_rate * 0.25).floor - slideInTime.times do |i| - bar1.x = xoffset * (i + 1 - slideInTime) / slideInTime - bar2.x = xoffset * (slideInTime - i - 1) / slideInTime - pbWait(1) + pbWait(0.25) do |delta_t| + bar1.x = lerp(-xoffset, 0, 0.25, delta_t) + bar2.x = lerp(xoffset, 0, 0.25, delta_t) end bar1.dispose bar2.dispose @@ -350,16 +354,12 @@ SpecialBattleIntroAnimations.register("alternate_vs_trainer_animation", 50, # trainer.x = xoffset trainer.tone = Tone.new(-255, -255, -255) # Dim the flash and make the trainer sprites appear, while animating bars - animTime = (Graphics.frame_rate * 1.2).floor - animTime.times do |i| - flash.opacity -= 52 * 20 / Graphics.frame_rate if flash.opacity > 0 - bar1.ox -= 32 * 20 / Graphics.frame_rate - bar2.ox += 32 * 20 / Graphics.frame_rate - if i >= animTime / 2 && i < slideInTime + (animTime / 2) - player.x = xoffset * (i + 1 - slideInTime - (animTime / 2)) / slideInTime - trainer.x = xoffset * (slideInTime - i - 1 + (animTime / 2)) / slideInTime - end - pbWait(1) + pbWait(1.2) do |delta_t| + flash.opacity = lerp(255, 0, 0.25, delta_t) + bar1.ox = lerp(0, -bar1.bitmap.width * 3, 1.2, delta_t) + bar2.ox = lerp(0, bar2.bitmap.width * 3, 1.2, delta_t) + player.x = lerp(-xoffset, 0, 0.25, delta_t - 0.6) + trainer.x = lerp(xoffset, 0, 0.25, delta_t - 0.6) end player.x = 0 trainer.x = 0 @@ -378,34 +378,27 @@ SpecialBattleIntroAnimations.register("alternate_vs_trainer_animation", 50, # ] pbDrawTextPositions(overlay.bitmap, textpos) # Fade out flash, shudder Vs logo and expand it, and then fade to black - animTime = (Graphics.frame_rate * 2.75).floor - shudderTime = (Graphics.frame_rate * 1.75).floor - zoomTime = (Graphics.frame_rate * 2.5).floor - shudderDelta = [4 * 20 / Graphics.frame_rate, 1].max - animTime.times do |i| - if i < shudderTime # Fade out the white flash - flash.opacity -= 52 * 20 / Graphics.frame_rate if flash.opacity > 0 - elsif i == shudderTime # Make the flash black - flash.tone = Tone.new(-255, -255, -255) - elsif i >= zoomTime # Fade to black - flash.opacity += 52 * 20 / Graphics.frame_rate if flash.opacity < 255 + shudder_time = 1.75 + zoom_time = 2.5 + pbWait(2.8) do |delta_t| + if delta_t <= shudder_time + flash.opacity = lerp(255, 0, 0.25, delta_t) # Fade out the white flash + elsif delta_t >= zoom_time + flash.tone = Tone.new(-255, -255, -255) # Make the flash black + flash.opacity = lerp(0, 255, 0.25, delta_t - zoom_time) # Fade to black end - bar1.ox -= 32 * 20 / Graphics.frame_rate - bar2.ox += 32 * 20 / Graphics.frame_rate - if i < shudderTime - j = i % (2 * Graphics.frame_rate / 20) - if j >= 0.5 * Graphics.frame_rate / 20 && j < 1.5 * Graphics.frame_rate / 20 - vs.x += shudderDelta - vs.y -= shudderDelta - else - vs.x -= shudderDelta - vs.y += shudderDelta - end - elsif i < zoomTime - vs.zoom_x += 0.4 * 20 / Graphics.frame_rate - vs.zoom_y += 0.4 * 20 / Graphics.frame_rate + bar1.ox = lerp(0, -bar1.bitmap.width * 7, 2.8, delta_t) + bar2.ox = lerp(0, bar2.bitmap.width * 7, 2.8, delta_t) + if delta_t <= shudder_time + # +2, -2, -2, +2, repeat + period = (delta_t / 0.025).to_i % 4 + shudder_delta = [2, 0 , -2, 0][period] + vs.x = vs_x + shudder_delta + vs.y = vs_y - shudder_delta + elsif delta_t <= zoom_time + vs.zoom_x = lerp(1.0, 7.0, zoom_time - shudder_time, delta_t - shudder_time) + vs.zoom_y = vs.zoom_x end - pbWait(1) end # End of animation player.dispose diff --git a/Data/Scripts/012_Overworld/003_Overworld_Time.rb b/Data/Scripts/012_Overworld/003_Overworld_Time.rb index 9ff45f7ef..212628766 100644 --- a/Data/Scripts/012_Overworld/003_Overworld_Time.rb +++ b/Data/Scripts/012_Overworld/003_Overworld_Time.rb @@ -35,6 +35,7 @@ module PBDayNight Tone.new(-70, -90, 15, 55), # Night Tone.new(-70, -90, 15, 55) # Night ] + CACHED_TONE_LIFETIME = 30 # In seconds; recalculates overworld tone once per this time @cachedTone = nil @dayNightToneLastUpdate = nil @oneOverSixty = 1 / 60.0 @@ -81,10 +82,9 @@ module PBDayNight def self.getTone @cachedTone = Tone.new(0, 0, 0) if !@cachedTone return @cachedTone if !Settings::TIME_SHADING - if !@dayNightToneLastUpdate || - Graphics.frame_count - @dayNightToneLastUpdate >= Graphics.frame_rate * 30 + if !@dayNightToneLastUpdate || (System.uptime - @dayNightToneLastUpdate >= CACHED_TONE_LIFETIME) getToneInternal - @dayNightToneLastUpdate = Graphics.frame_count + @dayNightToneLastUpdate = System.uptime end return @cachedTone end diff --git a/Data/Scripts/012_Overworld/004_Overworld_FieldMoves.rb b/Data/Scripts/012_Overworld/004_Overworld_FieldMoves.rb index 1d3f3bb8a..995996016 100644 --- a/Data/Scripts/012_Overworld/004_Overworld_FieldMoves.rb +++ b/Data/Scripts/012_Overworld/004_Overworld_FieldMoves.rb @@ -174,9 +174,7 @@ def pbHiddenMoveAnimation(pokemon) break if phase == 6 end sprite.dispose - strobes.each do |strobe| - strobe.dispose - end + strobes.each { |strobe| strobe.dispose } strobes.clear bg.dispose viewport.dispose @@ -234,7 +232,7 @@ def pbSmashEvent(event) PBMoveRoute::TURN_LEFT, PBMoveRoute::WAIT, 2, PBMoveRoute::TURN_RIGHT, PBMoveRoute::WAIT, 2, PBMoveRoute::TURN_UP, PBMoveRoute::WAIT, 2]) - pbWait(Graphics.frame_rate * 4 / 10) + pbWait(0.4) event.erase $PokemonMap&.addErasedEvent(event.id) end @@ -458,14 +456,11 @@ HiddenMoveHandlers::UseMove.add(:FLASH, proc { |move, pokemon| end $PokemonGlobal.flashUsed = true $stats.flash_count += 1 - radiusDiff = 8 * 20 / Graphics.frame_rate - while darkness.radius < darkness.radiusMax - Graphics.update - Input.update - pbUpdateSceneMap - darkness.radius += radiusDiff - darkness.radius = darkness.radiusMax if darkness.radius > darkness.radiusMax + duration = 0.7 + pbWait(duration) do |delta_t| + darkness.radius = lerp(darkness.radiusMin, darkness.radiusMax, duration, delta_t) end + darkness.radius = darkness.radiusMax next true }) @@ -511,7 +506,7 @@ def pbFlyToNewLocation(pkmn = nil, move = :FLY) $game_map.autoplay $game_map.refresh yield if block_given? - pbWait(Graphics.frame_rate / 4) + pbWait(0.25) end pbEraseEscapePoint return true @@ -812,24 +807,19 @@ def pbSweetScent end viewport = Viewport.new(0, 0, Graphics.width, Graphics.height) viewport.z = 99999 - count = 0 viewport.color.red = 255 - viewport.color.green = 0 - viewport.color.blue = 0 + viewport.color.green = 32 + viewport.color.blue = 32 viewport.color.alpha -= 10 - alphaDiff = 12 * 20 / Graphics.frame_rate - loop do - if count == 0 && viewport.color.alpha < 128 - viewport.color.alpha += alphaDiff - elsif count > Graphics.frame_rate / 4 - viewport.color.alpha -= alphaDiff + start_alpha = viewport.color.alpha + duration = 1.1 + fade_time = 0.4 + pbWait(duration) do |delta_t| + if delta_t < duration / 2 + viewport.color.alpha = lerp(start_alpha, start_alpha + 128, fade_time, delta_t) else - count += 1 + viewport.color.alpha = lerp(start_alpha + 128, start_alpha, fade_time, delta_t - duration + fade_time) end - Graphics.update - Input.update - pbUpdateSceneMap - break if viewport.color.alpha <= 0 end viewport.dispose enctype = $PokemonEncounters.encounter_type diff --git a/Data/Scripts/012_Overworld/005_Overworld_Fishing.rb b/Data/Scripts/012_Overworld/005_Overworld_Fishing.rb index 285156020..8af02127c 100644 --- a/Data/Scripts/012_Overworld/005_Overworld_Fishing.rb +++ b/Data/Scripts/012_Overworld/005_Overworld_Fishing.rb @@ -8,11 +8,7 @@ def pbFishingBegin $game_player.lock_pattern = true 4.times do |pattern| $game_player.pattern = 3 - pattern - (Graphics.frame_rate / 20).times do - Graphics.update - Input.update - pbUpdateSceneMap - end + pbWait(0.05) end end end @@ -21,11 +17,7 @@ def pbFishingEnd if !pbCommonEvent(Settings::FISHING_END_COMMON_EVENT) 4.times do |pattern| $game_player.pattern = pattern - (Graphics.frame_rate / 20).times do - Graphics.update - Input.update - pbUpdateSceneMap - end + pbWait(0.05) end end yield if block_given? @@ -55,8 +47,8 @@ def pbFishing(hasEncounter, rodType = 1) end if hasEncounter && rand(100) < biteChance $scene.spriteset.addUserAnimation(Settings::EXCLAMATION_ANIMATION_ID, $game_player.x, $game_player.y, true, 3) - frames = Graphics.frame_rate - rand(Graphics.frame_rate / 2) # 0.5-1 second - if !pbWaitForInput(msgWindow, message + "\n" + _INTL("Oh! A bite!"), frames) + duration = rand(5..10) / 10.0 # 0.5-1 seconds + if !pbWaitForInput(msgWindow, message + "\n" + _INTL("Oh! A bite!"), duration) pbFishingEnd { pbMessageDisplay(msgWindow, _INTL("The Pokémon got away...")) } break end @@ -81,35 +73,28 @@ end # Show waiting dots before a Pokémon bites def pbWaitMessage(msgWindow, time) message = "" - periodTime = Graphics.frame_rate * 4 / 10 # 0.4 seconds, 16 frames per dot (time + 1).times do |i| message += ". " if i > 0 pbMessageDisplay(msgWindow, message, false) - periodTime.times do - Graphics.update - Input.update - pbUpdateSceneMap - if Input.trigger?(Input::USE) || Input.trigger?(Input::BACK) - return true - end + pbWait(0.4) do |delta_t| + return true if Input.trigger?(Input::USE) || Input.trigger?(Input::BACK) end end return false end # A Pokémon is biting, reflex test to reel it in -def pbWaitForInput(msgWindow, message, frames) +def pbWaitForInput(msgWindow, message, duration) pbMessageDisplay(msgWindow, message, false) - numFrame = 0 - twitchFrame = 0 - twitchFrameTime = Graphics.frame_rate * 2 / 10 # 0.2 seconds, 8 frames + twitch_frame_duration = 0.2 # 0.2 seconds + timer_start = System.uptime loop do Graphics.update Input.update pbUpdateSceneMap # Twitch cycle: 1,0,1,0,0,0,0,0 - twitchFrame = (twitchFrame + 1) % (twitchFrameTime * 8) - case twitchFrame % twitchFrameTime + twitch_frame = ((System.uptime - timer_start) / twitch_frame_duration).to_i % 8 + case twitch_frame when 0, 2 $game_player.pattern = 1 else @@ -119,8 +104,7 @@ def pbWaitForInput(msgWindow, message, frames) $game_player.pattern = 0 return true end - break if !Settings::FISHING_AUTO_HOOK && numFrame > frames - numFrame += 1 + break if !Settings::FISHING_AUTO_HOOK && System.uptime - timer_start > duration end return false end diff --git a/Data/Scripts/013_Items/002_Item_Effects.rb b/Data/Scripts/013_Items/002_Item_Effects.rb index d02f0c962..efd00270b 100644 --- a/Data/Scripts/013_Items/002_Item_Effects.rb +++ b/Data/Scripts/013_Items/002_Item_Effects.rb @@ -313,10 +313,10 @@ ItemHandlers::UseInField.add(:ITEMFINDER, proc { |item| offsetY = event.y - $game_player.y if offsetX == 0 && offsetY == 0 # Standing on the item, spin around 4.times do - pbWait(Graphics.frame_rate * 2 / 10) + pbWait(0.2) $game_player.turn_right_90 end - pbWait(Graphics.frame_rate * 3 / 10) + pbWait(0.3) pbMessage(_INTL("The {1}'s indicating something right underfoot!", GameData::Item.get(item).name)) else # Item is nearby, face towards it direction = $game_player.direction @@ -331,7 +331,7 @@ ItemHandlers::UseInField.add(:ITEMFINDER, proc { |item| when 6 then $game_player.turn_right when 8 then $game_player.turn_up end - pbWait(Graphics.frame_rate * 3 / 10) + pbWait(0.3) pbMessage(_INTL("Huh? The {1}'s responding!", GameData::Item.get(item).name) + "\1") pbMessage(_INTL("There's an item buried around here!")) end diff --git a/Data/Scripts/013_Items/005_Item_PokeRadar.rb b/Data/Scripts/013_Items/005_Item_PokeRadar.rb index 6ff2046fa..8aac5e68d 100644 --- a/Data/Scripts/013_Items/005_Item_PokeRadar.rb +++ b/Data/Scripts/013_Items/005_Item_PokeRadar.rb @@ -106,7 +106,7 @@ def pbPokeRadarHighlightGrass(showmessage = true) end end $game_temp.poke_radar_data[3] = grasses if $game_temp.poke_radar_data - pbWait(Graphics.frame_rate / 2) + pbWait(0.5) end end diff --git a/Data/Scripts/016_UI/001_Non-interactive UI/003_UI_EggHatching.rb b/Data/Scripts/016_UI/001_Non-interactive UI/003_UI_EggHatching.rb index 16d8a4cf9..4037ee9a1 100644 --- a/Data/Scripts/016_UI/001_Non-interactive UI/003_UI_EggHatching.rb +++ b/Data/Scripts/016_UI/001_Non-interactive UI/003_UI_EggHatching.rb @@ -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 diff --git a/Data/Scripts/016_UI/005_UI_Party.rb b/Data/Scripts/016_UI/005_UI_Party.rb index d2379f433..e3bb8f41c 100644 --- a/Data/Scripts/016_UI/005_UI_Party.rb +++ b/Data/Scripts/016_UI/005_UI_Party.rb @@ -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 diff --git a/Data/Scripts/016_UI/009_UI_RegionMap.rb b/Data/Scripts/016_UI/009_UI_RegionMap.rb index d4e7e7bd3..9a4caeb5b 100644 --- a/Data/Scripts/016_UI/009_UI_RegionMap.rb +++ b/Data/Scripts/016_UI/009_UI_RegionMap.rb @@ -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) diff --git a/Data/Scripts/016_UI/013_UI_Load.rb b/Data/Scripts/016_UI/013_UI_Load.rb index 4d8a7d5a4..929b01c35 100644 --- a/Data/Scripts/016_UI/013_UI_Load.rb +++ b/Data/Scripts/016_UI/013_UI_Load.rb @@ -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 diff --git a/Data/Scripts/016_UI/020_UI_PokeMart.rb b/Data/Scripts/016_UI/020_UI_PokeMart.rb index 498ce8530..e91b66e29 100644 --- a/Data/Scripts/016_UI/020_UI_PokeMart.rb +++ b/Data/Scripts/016_UI/020_UI_PokeMart.rb @@ -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 diff --git a/Data/Scripts/016_UI/021_UI_BattlePointShop.rb b/Data/Scripts/016_UI/021_UI_BattlePointShop.rb index 164b86f3d..9796816f5 100644 --- a/Data/Scripts/016_UI/021_UI_BattlePointShop.rb +++ b/Data/Scripts/016_UI/021_UI_BattlePointShop.rb @@ -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 diff --git a/Data/Scripts/016_UI/024_UI_MysteryGift.rb b/Data/Scripts/016_UI/024_UI_MysteryGift.rb index ccad05433..03bfc5775 100644 --- a/Data/Scripts/016_UI/024_UI_MysteryGift.rb +++ b/Data/Scripts/016_UI/024_UI_MysteryGift.rb @@ -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 diff --git a/Data/Scripts/016_UI/025_UI_TextEntry.rb b/Data/Scripts/016_UI/025_UI_TextEntry.rb index d6a17f700..908da2b5e 100644 --- a/Data/Scripts/016_UI/025_UI_TextEntry.rb +++ b/Data/Scripts/016_UI/025_UI_TextEntry.rb @@ -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 diff --git a/Data/Scripts/017_Minigames/001_Minigame_Duel.rb b/Data/Scripts/017_Minigames/001_Minigame_Duel.rb index 819ae802a..c4bb571f7 100644 --- a/Data/Scripts/017_Minigames/001_Minigame_Duel.rb +++ b/Data/Scripts/017_Minigames/001_Minigame_Duel.rb @@ -59,7 +59,7 @@ class PokemonDuel @viewport = Viewport.new(0, 0, Graphics.width, Graphics.height) @viewport.z = 99999 @sprites = {} - @sprites["player"] = IconSprite.new(-128 - 32, 96, @viewport) + @sprites["player"] = IconSprite.new(-160, 96, @viewport) @sprites["player"].setBitmap(GameData::TrainerType.front_sprite_filename($player.trainer_type)) @sprites["opponent"] = IconSprite.new(Graphics.width + 32, 96, @viewport) @sprites["opponent"].setBitmap(GameData::TrainerType.front_sprite_filename(opponent.trainer_type)) @@ -69,17 +69,17 @@ class PokemonDuel @sprites["opponentwindow"] = DuelWindow.new(opponent.name, true) @sprites["opponentwindow"].x = Graphics.width @sprites["opponentwindow"].viewport = @viewport - pbWait(Graphics.frame_rate / 2) - distance_per_frame = 8 * 20 / Graphics.frame_rate - while @sprites["player"].x < 0 - @sprites["player"].x += distance_per_frame - @sprites["playerwindow"].x += distance_per_frame - @sprites["opponent"].x -= distance_per_frame - @sprites["opponentwindow"].x -= distance_per_frame - Graphics.update - Input.update - pbUpdateSceneMap + pbWait(0.5) + pbWait(0.5) do |delta_t| + @sprites["player"].x = lerp(-160, 0, 0.4, delta_t) + @sprites["playerwindow"].x = lerp(-@sprites["playerwindow"].width, 160 - @sprites["playerwindow"].width, 0.4, delta_t) + @sprites["opponent"].x = lerp(Graphics.width + 32, Graphics.width - 128, 0.4, delta_t) + @sprites["opponentwindow"].x = lerp(Graphics.width, Graphics.width - 160, 0.4, delta_t) end + @sprites["player"].x = 0 + @sprites["playerwindow"].x = 160 - @sprites["playerwindow"].width + @sprites["opponent"].x = Graphics.width - 128 + @sprites["opponentwindow"].x = Graphics.width - 160 @oldmovespeed = $game_player.move_speed @oldeventspeed = event.move_speed pbMoveRoute($game_player, @@ -88,7 +88,7 @@ class PokemonDuel pbMoveRoute(event, [PBMoveRoute::CHANGE_SPEED, 2, PBMoveRoute::DIRECTION_FIX_ON]) - pbWait(Graphics.frame_rate * 3 / 4) + pbWait(0.75) end def pbDuel(opponent, event, speeches) @@ -146,13 +146,13 @@ class PokemonDuel PBMoveRoute::SCRIPT_ASYNC, "moveRight90", PBMoveRoute::SCRIPT_ASYNC, "moveRight90", PBMoveRoute::SCRIPT_ASYNC, "moveLeft90"]) - pbWait(Graphics.frame_rate / 2) + pbWait(0.5) pbMessage(_INTL("You study each other's movements...")) elsif action == 0 && command == 1 pbMoveRoute($game_player, [PBMoveRoute::CHANGE_SPEED, 4, PBMoveRoute::FORWARD]) - pbWait(Graphics.frame_rate * 4 / 10) + pbWait(0.4) pbShake(9, 9, 8) pbFlashScreens(false, true) pbMoveRoute($game_player, @@ -167,7 +167,7 @@ class PokemonDuel pbMoveRoute(event, [PBMoveRoute::CHANGE_SPEED, 4, PBMoveRoute::BACKWARD]) - pbWait(Graphics.frame_rate) + pbWait(1.0) pbMoveRoute($game_player, [PBMoveRoute::CHANGE_SPEED, 2, PBMoveRoute::BACKWARD]) @@ -179,12 +179,12 @@ class PokemonDuel pbMoveRoute($game_player, [PBMoveRoute::CHANGE_SPEED, 4, PBMoveRoute::SCRIPT_ASYNC, "jumpForward"]) - pbWait(Graphics.frame_rate * 4 / 10) + pbWait(0.4) pbMoveRoute(event, [PBMoveRoute::CHANGE_SPEED, 5, PBMoveRoute::BACKWARD, PBMoveRoute::CHANGE_SPEED, 2]) - pbWait(Graphics.frame_rate / 2) + pbWait(0.5) pbShake(9, 9, 8) pbFlashScreens(false, true) pbMoveRoute($game_player, @@ -199,7 +199,7 @@ class PokemonDuel pbMoveRoute(event, [PBMoveRoute::CHANGE_SPEED, 4, PBMoveRoute::FORWARD]) - pbWait(Graphics.frame_rate * 4 / 10) + pbWait(0.4) pbShake(9, 9, 8) pbFlashScreens(true, false) pbMoveRoute(event, @@ -211,17 +211,17 @@ class PokemonDuel pbMoveRoute($game_player, [PBMoveRoute::CHANGE_SPEED, 4, PBMoveRoute::FORWARD]) - pbWait(Graphics.frame_rate * 6 / 10) + pbWait(0.6) pbMoveRoute($game_player, [PBMoveRoute::CHANGE_SPEED, 2, PBMoveRoute::BACKWARD]) pbMoveRoute(event, [PBMoveRoute::CHANGE_SPEED, 2, PBMoveRoute::FORWARD]) - pbWait(Graphics.frame_rate * 6 / 10) + pbWait(0.6) pbMoveRoute(event, [PBMoveRoute::BACKWARD]) pbMoveRoute($game_player, [PBMoveRoute::FORWARD]) - pbWait(Graphics.frame_rate * 6 / 10) + pbWait(0.6) pbMoveRoute($game_player, [PBMoveRoute::BACKWARD]) pbMessage(_INTL("You cross blades with the opponent!")) elsif (action == 1 && command == 2) || @@ -231,11 +231,11 @@ class PokemonDuel [PBMoveRoute::BACKWARD, PBMoveRoute::CHANGE_SPEED, 4, PBMoveRoute::SCRIPT_ASYNC, "jumpForward"]) - pbWait(Graphics.frame_rate * 8 / 10) + pbWait(0.8) pbMoveRoute(event, [PBMoveRoute::CHANGE_SPEED, 4, PBMoveRoute::FORWARD]) - pbWait(Graphics.frame_rate * 9 / 10) + pbWait(0.9) pbShake(9, 9, 8) pbFlashScreens(true, true) pbMoveRoute($game_player, @@ -245,7 +245,7 @@ class PokemonDuel [PBMoveRoute::BACKWARD, PBMoveRoute::BACKWARD, PBMoveRoute::CHANGE_SPEED, 2]) - pbWait(Graphics.frame_rate) + pbWait(1.0) pbMoveRoute(event, [PBMoveRoute::FORWARD]) pbMoveRoute($game_player, [PBMoveRoute::FORWARD]) @hp[0] -= action # Enemy action @@ -258,7 +258,7 @@ class PokemonDuel pbMoveRoute($game_player, [PBMoveRoute::CHANGE_SPEED, 4, PBMoveRoute::SCRIPT_ASYNC, "jumpBackward"]) - pbWait(Graphics.frame_rate) + pbWait(1.0) pbMoveRoute($game_player, [PBMoveRoute::CHANGE_SPEED, 2, PBMoveRoute::FORWARD]) @@ -270,12 +270,12 @@ class PokemonDuel pbMoveRoute(event, [PBMoveRoute::CHANGE_SPEED, 4, PBMoveRoute::SCRIPT_ASYNC, "jumpForward"]) - pbWait(Graphics.frame_rate * 4 / 10) + pbWait(0.4) pbMoveRoute($game_player, [PBMoveRoute::CHANGE_SPEED, 5, PBMoveRoute::BACKWARD, PBMoveRoute::CHANGE_SPEED, 2]) - pbWait(Graphics.frame_rate / 2) + pbWait(0.5) pbShake(9, 9, 8) pbFlashScreens(true, false) pbMoveRoute($game_player, @@ -295,7 +295,7 @@ class PokemonDuel [PBMoveRoute::WAIT, 15, PBMoveRoute::CHANGE_SPEED, 4, PBMoveRoute::SCRIPT_ASYNC, "jumpForward"]) - pbWait(Graphics.frame_rate) + pbWait(1.0) pbMoveRoute(event, [PBMoveRoute::CHANGE_SPEED, 5, PBMoveRoute::BACKWARD, @@ -318,69 +318,60 @@ class PokemonDuel end def pbEndDuel - pbWait(Graphics.frame_rate * 3 / 4) + pbWait(0.75) pbMoveRoute($game_player, [PBMoveRoute::DIRECTION_FIX_OFF, PBMoveRoute::CHANGE_SPEED, @oldmovespeed]) pbMoveRoute(@event, [PBMoveRoute::DIRECTION_FIX_OFF, PBMoveRoute::CHANGE_SPEED, @oldeventspeed]) - fade_time = Graphics.frame_rate * 4 / 10 - alpha_diff = (255.0 / fade_time).ceil - fade_time.times do - @sprites["player"].opacity -= alpha_diff - @sprites["opponent"].opacity -= alpha_diff - @sprites["playerwindow"].contents_opacity -= alpha_diff - @sprites["opponentwindow"].contents_opacity -= alpha_diff - @sprites["playerwindow"].opacity -= alpha_diff - @sprites["opponentwindow"].opacity -= alpha_diff - Graphics.update - Input.update - pbUpdateSceneMap + pbWait(0.4) do |delta_t| + new_opacity = lerp(255, 0, 0.4, delta_t) + @sprites["player"].opacity = new_opacity + @sprites["opponent"].opacity = new_opacity + @sprites["playerwindow"].contents_opacity = new_opacity + @sprites["opponentwindow"].contents_opacity = new_opacity + @sprites["playerwindow"].opacity = new_opacity + @sprites["opponentwindow"].opacity = new_opacity end pbDisposeSpriteHash(@sprites) @viewport.dispose end def pbFlashScreens(player, opponent) - i = 0 - flash_time = Graphics.frame_rate * 2 / 10 - alpha_diff = (2 * 255.0 / flash_time).ceil - flash_time.times do - i += 1 + pbWait(0.2) do |delta_t| + new_alpha = lerp(0, 255, 0.2, delta_t) if player - @sprites["player"].color = Color.new(255, 255, 255, i * alpha_diff) - @sprites["playerwindow"].color = Color.new(255, 255, 255, i * alpha_diff) + @sprites["player"].color = Color.new(255, 255, 255, new_alpha) + @sprites["playerwindow"].color = Color.new(255, 255, 255, new_alpha) end if opponent - @sprites["opponent"].color = Color.new(255, 255, 255, i * alpha_diff) - @sprites["opponentwindow"].color = Color.new(255, 255, 255, i * alpha_diff) + @sprites["opponent"].color = Color.new(255, 255, 255, new_alpha) + @sprites["opponentwindow"].color = Color.new(255, 255, 255, new_alpha) end - Graphics.update - Input.update - pbUpdateSceneMap end - flash_time.times do - i -= 1 + pbWait(0.2) do |delta_t| + new_alpha = lerp(255, 0, 0.2, delta_t) if player - @sprites["player"].color = Color.new(255, 255, 255, i * alpha_diff) - @sprites["playerwindow"].color = Color.new(255, 255, 255, i * alpha_diff) + @sprites["player"].color = Color.new(255, 255, 255, new_alpha) + @sprites["playerwindow"].color = Color.new(255, 255, 255, new_alpha) end if opponent - @sprites["opponent"].color = Color.new(255, 255, 255, i * alpha_diff) - @sprites["opponentwindow"].color = Color.new(255, 255, 255, i * alpha_diff) + @sprites["opponent"].color = Color.new(255, 255, 255, new_alpha) + @sprites["opponentwindow"].color = Color.new(255, 255, 255, new_alpha) end - Graphics.update - Input.update - pbUpdateSceneMap end - pbWait(Graphics.frame_rate * 4 / 10) if !player || !opponent + @sprites["player"].color.alpha = 0 + @sprites["playerwindow"].color.alpha = 0 + @sprites["opponent"].color.alpha = 0 + @sprites["opponentwindow"].color.alpha = 0 + pbWait(0.4) if !player || !opponent end def pbRefresh @sprites["playerwindow"].hp = @hp[0] @sprites["opponentwindow"].hp = @hp[1] - pbWait(Graphics.frame_rate / 4) + pbWait(0.25) end end diff --git a/Data/Scripts/017_Minigames/004_Minigame_VoltorbFlip.rb b/Data/Scripts/017_Minigames/004_Minigame_VoltorbFlip.rb index 8eecdca6c..242b4e5a3 100644 --- a/Data/Scripts/017_Minigames/004_Minigame_VoltorbFlip.rb +++ b/Data/Scripts/017_Minigames/004_Minigame_VoltorbFlip.rb @@ -265,7 +265,7 @@ class VoltorbFlip end end pbDrawImagePositions(@sprites["mark"].bitmap, @marks) - pbWait(Graphics.frame_rate / 20) + pbWait(0.05) else # Display the tile for the selected spot icons = [] @@ -283,7 +283,7 @@ class VoltorbFlip animation[0] = icons[0] = [@directory + "tiles", (@index[0] * 64) + 128, @index[1] * 64, 704 + (64 * j), 0, 64, 64] pbDrawImagePositions(@sprites["animation"].bitmap, animation) - pbWait(Graphics.frame_rate / 20) + pbWait(0.05) @sprites["animation"].bitmap.clear end # Part2 @@ -292,7 +292,7 @@ class VoltorbFlip animation[0] = [@directory + "explosion", (@index[0] * 64) - 32 + 128, (@index[1] * 64) - 32, j * 128, 0, 128, 128] pbDrawImagePositions(@sprites["animation"].bitmap, animation) - pbWait(Graphics.frame_rate / 10) + pbWait(0.1) @sprites["animation"].bitmap.clear end # Unskippable text block, parameter 2 = wait time (corresponds to ME length) @@ -334,7 +334,7 @@ class VoltorbFlip animation[0] = [@directory + "flipAnimation", (@index[0] * 64) - 14 + 128, (@index[1] * 64) - 16, j * 92, 0, 92, 96] pbDrawImagePositions(@sprites["animation"].bitmap, animation) - pbWait(Graphics.frame_rate / 20) + pbWait(0.05) @sprites["animation"].bitmap.clear end if @points == 0 @@ -474,7 +474,7 @@ class VoltorbFlip points = tile if i == 2 icons[i] = [@directory + "tiles", x, y, 320 + (i * 64) + (points * 64), 0, 64, 64] pbDrawImagePositions(@sprites["icon"].bitmap, icons) - pbWait(Graphics.frame_rate / 20) + pbWait(0.05) end icons[3] = [@directory + "tiles", x, y, tile * 64, 0, 64, 64] pbDrawImagePositions(@sprites["icon"].bitmap, icons) @@ -485,14 +485,14 @@ class VoltorbFlip # Make pre-rendered sprites visible (this approach reduces lag) 5.times do |i| @sprites[i].visible = true - pbWait(Graphics.frame_rate / 20) if i < 3 + pbWait(0.05) if i < 3 @sprites[i].bitmap.clear @sprites[i].z = 99997 end pbSEPlay("Voltorb Flip tile") @sprites[5].visible = true @sprites["mark"].bitmap.clear - pbWait(Graphics.frame_rate / 10) + pbWait(0.1) # Wait for user input to continue loop do Graphics.update @@ -511,22 +511,22 @@ class VoltorbFlip 448 + (@squares[i + (j * 5)][2] * 64), 0, 64, 64] end pbDrawImagePositions(@sprites[i].bitmap, icons) - pbWait(Graphics.frame_rate / 20) + pbWait(0.05) 5.times do |j| icons[j] = [@directory + "tiles", @squares[i + (j * 5)][0], @squares[i + (j * 5)][1], 384, 0, 64, 64] end pbDrawImagePositions(@sprites[i].bitmap, icons) - pbWait(Graphics.frame_rate / 20) + pbWait(0.05) 5.times do |j| icons[j] = [@directory + "tiles", @squares[i + (j * 5)][0], @squares[i + (j * 5)][1], 320, 0, 64, 64] end pbDrawImagePositions(@sprites[i].bitmap, icons) - pbWait(Graphics.frame_rate / 20) + pbWait(0.05) 5.times do |j| icons[j] = [@directory + "tiles", @squares[i + (j * 5)][0], @squares[i + (j * 5)][1], 896, 0, 64, 64] end pbDrawImagePositions(@sprites[i].bitmap, icons) - pbWait(Graphics.frame_rate / 20) + pbWait(0.05) end @sprites["icon"].bitmap.clear 6.times do |i| @@ -538,9 +538,7 @@ class VoltorbFlip # def pbWaitText(msg,frames) # msgwindow=pbCreateMessageWindow # pbMessageDisplay(msgwindow,msg) -# frames.times do -# pbWait(1) -# end +# pbWait(frames / 20.0) # pbDisposeMessageWindow(msgwindow) # end diff --git a/Data/Scripts/017_Minigames/006_Minigame_Mining.rb b/Data/Scripts/017_Minigames/006_Minigame_Mining.rb index 5feadc9f8..8355a9261 100644 --- a/Data/Scripts/017_Minigames/006_Minigame_Mining.rb +++ b/Data/Scripts/017_Minigames/006_Minigame_Mining.rb @@ -530,12 +530,12 @@ class MiningGameScene collapseviewport = Viewport.new(0, 0, Graphics.width, Graphics.height) collapseviewport.z = 99999 @sprites["collapse"] = BitmapSprite.new(Graphics.width, Graphics.height, collapseviewport) - collapseTime = Graphics.frame_rate * 8 / 10 - collapseFraction = (Graphics.height.to_f / collapseTime).ceil - (1..collapseTime).each do |i| - @sprites["collapse"].bitmap.fill_rect(0, collapseFraction * (i - 1), - Graphics.width, collapseFraction * i, Color.black) + timer_start = System.uptime + loop do + collapse_height = lerp(0, Graphics.height, 0.8, timer_start, System.uptime) + @sprites["collapse"].bitmap.fill_rect(0, 0, Graphics.width, collapse_height, Color.black) Graphics.update + break if collapse_height == Graphics.height end pbMessage(_INTL("The wall collapsed!")) break @@ -547,7 +547,7 @@ class MiningGameScene end if foundall @sprites["cursor"].visible = false - pbWait(Graphics.frame_rate * 3 / 4) + pbWait(0.75) pbSEPlay("Mining found all") pbMessage(_INTL("Everything was dug up!")) break diff --git a/Data/Scripts/017_Minigames/007_Minigame_TilePuzzles.rb b/Data/Scripts/017_Minigames/007_Minigame_TilePuzzles.rb index 5d31c946c..dc9d6cbe3 100644 --- a/Data/Scripts/017_Minigames/007_Minigame_TilePuzzles.rb +++ b/Data/Scripts/017_Minigames/007_Minigame_TilePuzzles.rb @@ -309,17 +309,16 @@ class TilePuzzleScene if anim @sprites["cursor"].visible = false @sprites["tile#{@heldtile}"].z = 1 - oldAngle = @sprites["tile#{@heldtile}"].angle - rotateTime = Graphics.frame_rate / 4 - angleDiff = 90.0 / rotateTime - rotateTime.times do - @sprites["tile#{@heldtile}"].angle -= angleDiff + old_angle = @sprites["tile#{@heldtile}"].angle + timer_start = System.uptime + loop do + @sprites["tile#{@heldtile}"].angle = lerp(old_angle, old_angle - 90, 0.25, timer_start, System.uptime) pbUpdateSpriteHash(@sprites) Graphics.update Input.update + break if @sprites["tile#{@heldtile}"].angle == old_angle - 90 end @sprites["tile#{@heldtile}"].z = 0 - @sprites["tile#{@heldtile}"].angle = oldAngle - 90 @sprites["cursor"].visible = true if !pbCheckWin end @angles[@heldtile] -= 1 @@ -329,24 +328,23 @@ class TilePuzzleScene group = pbGetNearTiles(pos) if anim @sprites["cursor"].visible = false - oldAngles = [] + old_angles = [] group.each do |i| @sprites["tile#{@tiles[i]}"].z = 1 - oldAngles[i] = @sprites["tile#{@tiles[i]}"].angle + old_angles.push(@sprites["tile#{@tiles[i]}"].angle) end - rotateTime = Graphics.frame_rate / 4 - angleDiff = 90.0 / rotateTime - rotateTime.times do - group.each do |i| - @sprites["tile#{@tiles[i]}"].angle -= angleDiff + timer_start = System.uptime + loop do + group.each_with_index do |idx, i| + @sprites["tile#{@tiles[idx]}"].angle = lerp(old_angles[i], old_angles[i] - 90, 0.25, timer_start, System.uptime) end pbUpdateSpriteHash(@sprites) Graphics.update Input.update + break if @sprites["tile#{@tiles[group[0]]}"].angle == old_angles[0] - 90 end group.each do |i| @sprites["tile#{@tiles[i]}"].z = 0 - @sprites["tile#{@tiles[i]}"].angle = oldAngles[i] - 90 end @sprites["cursor"].visible = true if !pbCheckWin end @@ -374,26 +372,33 @@ class TilePuzzleScene movetile = pbMoveCursor(cursor, dir) @sprites["cursor"].visible = false @sprites["tile#{@tiles[cursor]}"].z = 1 - swapTime = Graphics.frame_rate * 3 / 10 + duration = 0.3 + timer_start = System.uptime if [2, 8].include?(dir) # Swap vertically - distancePerFrame = (@tileheight.to_f / swapTime).ceil + start_sprite_pos = @sprites["tile#{@tiles[movetile]}"].y + start_cursor_pos = @sprites["tile#{@tiles[cursor]}"].y dist = (dir / 4).floor - 1 - swapTime.times do - @sprites["tile#{@tiles[movetile]}"].y += dist * distancePerFrame - @sprites["tile#{@tiles[cursor]}"].y -= dist * distancePerFrame + loop do + delta_y = lerp(0, @tileheight * dist, duration, timer_start, System.uptime) + @sprites["tile#{@tiles[movetile]}"].y = start_sprite_pos + delta_y + @sprites["tile#{@tiles[cursor]}"].y = start_cursor_pos - delta_y pbUpdateSpriteHash(@sprites) Graphics.update Input.update + break if @sprites["tile#{@tiles[movetile]}"].y == start_sprite_pos + @tileheight * dist end else # Swap horizontally - distancePerFrame = (@tilewidth.to_f / swapTime).ceil + start_sprite_pos = @sprites["tile#{@tiles[movetile]}"].x + start_cursor_pos = @sprites["tile#{@tiles[cursor]}"].x dist = dir - 5 - swapTime.times do - @sprites["tile#{@tiles[movetile]}"].x -= dist * distancePerFrame - @sprites["tile#{@tiles[cursor]}"].x += dist * distancePerFrame + loop do + delta_x = lerp(0, @tilewidth * dist, duration, timer_start, System.uptime) + @sprites["tile#{@tiles[movetile]}"].x = start_sprite_pos - delta_x + @sprites["tile#{@tiles[cursor]}"].x = start_cursor_pos + delta_x pbUpdateSpriteHash(@sprites) Graphics.update Input.update + break if @sprites["tile#{@tiles[movetile]}"].x == start_sprite_pos - @tilewidth * dist end end @tiles[cursor], @tiles[movetile] = @tiles[movetile], @tiles[cursor] @@ -428,35 +433,42 @@ class TilePuzzleScene end end # Shift tiles - fadeTime = Graphics.frame_rate * 4 / 10 - fadeDiff = (255.0 / fadeTime).ceil + fade_duration = 0.4 if anim @sprites["cursor"].visible = false - fadeTime.times do - @sprites["tile#{@tiles[tiles[tiles.length - 1]]}"].opacity -= fadeDiff + timer_start = System.uptime + loop do + end_tile = @sprites["tile#{@tiles[tiles[tiles.length - 1]]}"] + end_tile.opacity = lerp(255, 0, fade_duration, timer_start, System.uptime) Graphics.update Input.update + break if end_tile.opacity == 0 end - shiftTime = Graphics.frame_rate * 3 / 10 + duration = 0.3 + timer_start = System.uptime if [2, 8].include?(dir) - distancePerFrame = (@tileheight.to_f / shiftTime).ceil - shiftTime.times do - tiles.each do |i| - @sprites["tile#{@tiles[i]}"].y -= dist * distancePerFrame + start_pos = [] + tiles.each { |i| start_pos.push(@sprites["tile#{@tiles[i]}"].y) } + loop do + tiles.each_with_index do |idx, i| + @sprites["tile#{@tiles[idx]}"].y = lerp(start_pos[i], start_pos[i] - @tileheight * dist, duration, timer_start, System.uptime) end pbUpdateSpriteHash(@sprites) Graphics.update Input.update + break if @sprites["tile#{@tiles[tiles[0]]}"].y == start_pos[0] - @tileheight * dist end else - distancePerFrame = (@tilewidth.to_f / shiftTime).ceil - shiftTime.times do - tiles.each do |i| - @sprites["tile#{@tiles[i]}"].x += dist * distancePerFrame + start_pos = [] + tiles.each { |i| start_pos.push(@sprites["tile#{@tiles[i]}"].x) } + loop do + tiles.each_with_index do |idx, i| + @sprites["tile#{@tiles[idx]}"].x = lerp(start_pos[i], start_pos[i] + @tilewidth * dist, duration, timer_start, System.uptime) end pbUpdateSpriteHash(@sprites) Graphics.update Input.update + break if @sprites["tile#{@tiles[tiles[0]]}"].x == start_pos[0] + @tilewidth * dist end end end @@ -469,10 +481,13 @@ class TilePuzzleScene end if anim update - fadeTime.times do - @sprites["tile#{@tiles[tiles[0]]}"].opacity += fadeDiff + timer_start = System.uptime + loop do + end_tile = @sprites["tile#{@tiles[tiles[0]]}"] + end_tile.opacity = lerp(0, 255, fade_duration, timer_start, System.uptime) Graphics.update Input.update + break if end_tile.opacity == 255 end @sprites["cursor"].selected = false @sprites["cursor"].visible = true if !pbCheckWin @@ -509,15 +524,15 @@ class TilePuzzleScene Rect.new(@tilewidth * (@boardwidth - 1), @tileheight * (@boardheight - 1), @tilewidth, @tileheight)) extratile.opacity = 0 - appearTime = Graphics.frame_rate * 8 / 10 - opacityDiff = (255.0 / appearTime).ceil - appearTime.times do - extratile.opacity += opacityDiff + timer_start = System.uptime + loop do + extratile.opacity = lerp(0, 255, 0.8, timer_start, System.uptime) Graphics.update Input.update + break if extratile.opacity >= 255 end else - pbWait(Graphics.frame_rate / 2) + pbWait(0.5) end loop do Graphics.update diff --git a/Data/Scripts/018_Alternate battle modes/002_BugContest.rb b/Data/Scripts/018_Alternate battle modes/002_BugContest.rb index 8756870b3..c9c48e62d 100644 --- a/Data/Scripts/018_Alternate battle modes/002_BugContest.rb +++ b/Data/Scripts/018_Alternate battle modes/002_BugContest.rb @@ -5,7 +5,7 @@ class BugContestState attr_accessor :ballcount attr_accessor :decision attr_accessor :lastPokemon - attr_accessor :timer + attr_accessor :timer_start CONTESTANT_NAMES = [ _INTL("Bug Catcher Ed"), @@ -17,7 +17,7 @@ class BugContestState _INTL("Picnicker Cindy"), _INTL("Youngster Samuel") ] - TIME_ALLOWED = Settings::BUG_CONTEST_TIME + TIME_ALLOWED = Settings::BUG_CONTEST_TIME # In seconds def initialize clear @@ -33,9 +33,7 @@ class BugContestState def expired? return false if !undecided? return false if TIME_ALLOWED <= 0 - curtime = @timer + (TIME_ALLOWED * Graphics.frame_rate) - curtime = [curtime - Graphics.frame_count, 0].max - return (curtime <= 0) + return System.uptime - timer_start >= TIME_ALLOWED end def clear @@ -176,7 +174,7 @@ class BugContestState @otherparty = [] @lastPokemon = nil @lastContest = nil - @timer = Graphics.frame_count + @timer_start = System.uptime @places = [] chosenpkmn = $player.party[@chosenPokemon] $player.party.length.times do |i| @@ -230,14 +228,14 @@ end # #=============================================================================== class TimerDisplay # :nodoc: - attr_accessor :start + attr_accessor :start_time - def initialize(start, maxtime) + def initialize(start_time, max_time) @timer = Window_AdvancedTextPokemon.newWithSize("", Graphics.width - 120, 0, 120, 64) @timer.z = 99999 - @total_sec = nil - @start = start - @maxtime = maxtime + @start_time = start_time + @max_time = max_time + @display_time = nil end def dispose @@ -249,14 +247,12 @@ class TimerDisplay # :nodoc: end def update - curtime = [(@start + @maxtime) - Graphics.frame_count, 0].max - curtime /= Graphics.frame_rate - if curtime != @total_sec - # Calculate total number of seconds - @total_sec = curtime - # Make a string for displaying the timer - min = @total_sec / 60 - sec = @total_sec % 60 + time_left = @max_time - (System.uptime - @start_time).to_i + time_left = 0 if time_left < 0 + if @display_time != time_left + @display_time = time_left + min = @display_time / 60 + sec = @display_time % 60 @timer.text = _ISPRINTF("{1:02d}:{2:02d}", min, sec) end end @@ -318,8 +314,7 @@ EventHandlers.add(:on_map_or_spriteset_change, :show_bug_contest_timer, proc { |scene, _map_changed| next if !pbInBugContest? || pbBugContestState.decision != 0 || BugContestState::TIME_ALLOWED == 0 scene.spriteset.addUserSprite( - TimerDisplay.new(pbBugContestState.timer, - BugContestState::TIME_ALLOWED * Graphics.frame_rate) + TimerDisplay.new(pbBugContestState.timer_start, BugContestState::TIME_ALLOWED) ) } ) diff --git a/Data/Scripts/020_Debug/001_Editor screens/001_EditorScreens.rb b/Data/Scripts/020_Debug/001_Editor screens/001_EditorScreens.rb index 110bcdb65..af18c46fc 100644 --- a/Data/Scripts/020_Debug/001_Editor screens/001_EditorScreens.rb +++ b/Data/Scripts/020_Debug/001_Editor screens/001_EditorScreens.rb @@ -1298,11 +1298,11 @@ def pbAnimationsOrganiser list.delete_at(cmd[1]) cmd[1] = [cmd[1], list.length - 1].min refreshlist = true - pbWait(Graphics.frame_rate * 2 / 10) + pbWait(0.2) when 4 # Insert spot list.insert(cmd[1], PBAnimation.new) refreshlist = true - pbWait(Graphics.frame_rate * 2 / 10) + pbWait(0.2) when 0 cmd2 = pbMessage(_INTL("Save changes?"), [_INTL("Yes"), _INTL("No"), _INTL("Cancel")], 3) diff --git a/Data/Scripts/020_Debug/001_Editor screens/003_EditorScreens_MapConnections.rb b/Data/Scripts/020_Debug/001_Editor screens/003_EditorScreens_MapConnections.rb index 21ceb54a9..61edbe939 100644 --- a/Data/Scripts/020_Debug/001_Editor screens/003_EditorScreens_MapConnections.rb +++ b/Data/Scripts/020_Debug/001_Editor screens/003_EditorScreens_MapConnections.rb @@ -382,11 +382,11 @@ class MapScreenScene end def onClick(mapid, x, y) - if @lastclick > 0 && Graphics.frame_count - @lastclick < Graphics.frame_rate * 0.5 + if @lastclick > 0 && System.uptime - @lastclick <= 0.5 onDoubleClick(mapid) @lastclick = -1 else - @lastclick = Graphics.frame_count + @lastclick = System.uptime if mapid >= 0 @dragging = true @dragmapid = mapid diff --git a/Data/Scripts/020_Debug/001_Editor screens/004_EditorScreens_SpritePositioning.rb b/Data/Scripts/020_Debug/001_Editor screens/004_EditorScreens_SpritePositioning.rb index 8f93c325b..7bca3f926 100644 --- a/Data/Scripts/020_Debug/001_Editor screens/004_EditorScreens_SpritePositioning.rb +++ b/Data/Scripts/020_Debug/001_Editor screens/004_EditorScreens_SpritePositioning.rb @@ -248,7 +248,7 @@ class SpritePositioner @sprites["info"].visible = true ret = false loop do - sprite.visible = (Graphics.frame_count % 16) < 12 # Flash the selected sprite + sprite.visible = ((System.uptime * 8).to_i % 4) < 3 # Flash the selected sprite Graphics.update Input.update self.update diff --git a/Data/Scripts/020_Debug/003_Debug menus/002_Debug_MenuCommands.rb b/Data/Scripts/020_Debug/003_Debug menus/002_Debug_MenuCommands.rb index 9136b41f6..0408fde93 100644 --- a/Data/Scripts/020_Debug/003_Debug menus/002_Debug_MenuCommands.rb +++ b/Data/Scripts/020_Debug/003_Debug menus/002_Debug_MenuCommands.rb @@ -100,10 +100,10 @@ MenuHandlers.add(:debug_menu, :safari_zone_and_bug_contest, { loop do cmds = [] if Settings::BUG_CONTEST_TIME > 0 - curtime = [(contest.timer + Settings::BUG_CONTEST_TIME * Graphics.frame_rate) - Graphics.frame_count, 0].max - curtime /= Graphics.frame_rate - min = curtime / 60 - sec = curtime % 60 + time_left = Settings::BUG_CONTEST_TIME - (System.uptime - contest.timer_start).to_i + time_left = 0 if time_left < 0 + min = time_left / 60 + sec = time_left % 60 time_string = _ISPRINTF("{1:02d}m {2:02d}s", min, sec) else time_string = _INTL("infinite") @@ -119,13 +119,10 @@ MenuHandlers.add(:debug_menu, :safari_zone_and_bug_contest, { params.setRange(0, 99999) params.setDefaultValue(min) new_time = pbMessageChooseNumber(_INTL("Set the time remaining (in minutes) in this Bug-Catching Contest."), params) - echoln contest.timer - echoln new_time - contest.timer += (new_time - min) * 60 * Graphics.frame_rate - echoln contest.timer + contest.timer_start += (new_time - min) * 60 $scene.spriteset.usersprites.each do |sprite| next if !sprite.is_a?(TimerDisplay) - sprite.start = contest.timer + sprite.start_time = contest.timer_start break end end