A lot of FPS agnosticism, added def lerp

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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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("<ac>{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)
)
}
)

View File

@@ -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)

View File

@@ -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

View File

@@ -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

View File

@@ -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