mirror of
https://github.com/infinitefusion/infinitefusion-e18.git
synced 2025-12-06 06:01:46 +00:00
135 lines
4.7 KiB
Ruby
135 lines
4.7 KiB
Ruby
#===============================================================================
|
|
# ** Game_Screen
|
|
#-------------------------------------------------------------------------------
|
|
# This class handles screen maintenance data, such as change in color tone,
|
|
# flashing, etc. Refer to "$game_screen" for the instance of this class.
|
|
#===============================================================================
|
|
class Game_Screen
|
|
attr_reader :brightness # brightness
|
|
attr_reader :tone # color tone
|
|
attr_reader :flash_color # flash color
|
|
attr_reader :shake # shake positioning
|
|
attr_reader :pictures # pictures
|
|
attr_reader :weather_type # weather type
|
|
attr_reader :weather_max # max number of weather sprites
|
|
attr_accessor :weather_duration # ticks in which the weather should fade in
|
|
|
|
def initialize
|
|
@brightness = 255
|
|
@tone = Tone.new(0, 0, 0, 0)
|
|
@tone_target = Tone.new(0, 0, 0, 0)
|
|
@tone_duration = 0
|
|
@tone_timer_start = nil
|
|
@flash_color = Color.new(0, 0, 0, 0)
|
|
@flash_duration = 0
|
|
@flash_timer_start = nil
|
|
@shake_power = 0
|
|
@shake_speed = 0
|
|
@shake_duration = 0
|
|
@shake = 0
|
|
@pictures = [nil]
|
|
(1..100).each { |i| @pictures.push(Game_Picture.new(i)) }
|
|
@weather_type = :None
|
|
@weather_max = 0.0
|
|
@weather_duration = 0
|
|
end
|
|
|
|
# duration is time in 1/20ths of a second.
|
|
def start_tone_change(tone, duration)
|
|
if duration == 0
|
|
@tone = tone.clone
|
|
return
|
|
end
|
|
@tone_initial = @tone.clone
|
|
@tone_target = tone.clone
|
|
@tone_duration = duration / 20.0
|
|
@tone_timer_start = $stats.play_time
|
|
end
|
|
|
|
# duration is time in 1/20ths of a second.
|
|
def start_flash(color, duration)
|
|
@flash_color = color.clone
|
|
@flash_initial_alpha = @flash_color.alpha
|
|
@flash_duration = duration / 20.0
|
|
@flash_timer_start = $stats.play_time
|
|
end
|
|
|
|
# duration is time in 1/20ths of a second.
|
|
def start_shake(power, speed, duration)
|
|
@shake_power = power
|
|
@shake_speed = speed
|
|
@shake_duration = duration / 20.0
|
|
@shake_timer_start = $stats.play_time
|
|
end
|
|
|
|
# duration is time in 1/20ths of a second.
|
|
def weather(type, power, duration)
|
|
@weather_type = GameData::Weather.get(type).id
|
|
@weather_max = (power + 1) * RPG::Weather::MAX_SPRITES / 10
|
|
@weather_duration = duration
|
|
end
|
|
|
|
def update
|
|
now = $stats.play_time
|
|
if @tone_timer_start
|
|
@tone.red = lerp(@tone_initial.red, @tone_target.red, @tone_duration, @tone_timer_start, now)
|
|
@tone.green = lerp(@tone_initial.green, @tone_target.green, @tone_duration, @tone_timer_start, now)
|
|
@tone.blue = lerp(@tone_initial.blue, @tone_target.blue, @tone_duration, @tone_timer_start, now)
|
|
@tone.gray = lerp(@tone_initial.gray, @tone_target.gray, @tone_duration, @tone_timer_start, now)
|
|
if now - @tone_timer_start >= @tone_duration
|
|
@tone_initial = nil
|
|
@tone_timer_start = nil
|
|
end
|
|
end
|
|
if @flash_timer_start
|
|
@flash_color.alpha = lerp(@flash_initial_alpha, 0, @flash_duration, @flash_timer_start, now)
|
|
if now - @flash_timer_start >= @flash_duration
|
|
@flash_initial_alpha = nil
|
|
@flash_timer_start = nil
|
|
end
|
|
end
|
|
if @shake_timer_start
|
|
delta_t = now - @shake_timer_start
|
|
movement_per_second = @shake_power * @shake_speed * 4
|
|
limit = @shake_power * 2.5 # Maximum pixel displacement
|
|
phase = (delta_t * movement_per_second / limit).to_i % 4
|
|
case phase
|
|
when 0, 2
|
|
@shake = (movement_per_second * delta_t) % limit
|
|
@shake *= -1 if phase == 2
|
|
else
|
|
@shake = limit - ((movement_per_second * delta_t) % limit)
|
|
@shake *= -1 if phase == 3
|
|
end
|
|
if delta_t >= @shake_duration
|
|
@shake_phase = phase if !@shake_phase || phase == 1 || phase == 3
|
|
if phase != @shake_phase || @shake < 2
|
|
@shake_timer_start = nil
|
|
@shake = 0
|
|
end
|
|
end
|
|
end
|
|
if $game_temp.in_battle
|
|
(51..100).each { |i| @pictures[i].update }
|
|
else
|
|
(1..50).each { |i| @pictures[i].update }
|
|
end
|
|
end
|
|
end
|
|
|
|
#===============================================================================
|
|
#
|
|
#===============================================================================
|
|
def pbToneChangeAll(tone, duration)
|
|
$game_screen.start_tone_change(tone, duration)
|
|
$game_screen.pictures.each { |picture| picture&.start_tone_change(tone, duration) }
|
|
end
|
|
|
|
def pbFlash(color, frames)
|
|
$game_screen.start_flash(color, frames)
|
|
end
|
|
|
|
def pbShake(power, speed, frames)
|
|
$game_screen.start_shake(power, speed, frames)
|
|
end
|