mirror of
https://github.com/infinitefusion/infinitefusion-e18.git
synced 2025-12-06 06:01:46 +00:00
A lot of FPS agnosticism, added def lerp
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
)
|
||||
}
|
||||
)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user