427 lines
16 KiB
Ruby
427 lines
16 KiB
Ruby
# -*- coding: utf-8 -*-
|
|
#==============================================================================
|
|
# ** Window_BattleLog
|
|
#------------------------------------------------------------------------------
|
|
# This window is for displaying battle progress. No frame is displayed, but it
|
|
# is handled as a window for convenience.
|
|
#==============================================================================
|
|
|
|
class Window_BattleLog < Window_Selectable
|
|
#--------------------------------------------------------------------------
|
|
# * Object Initialization
|
|
#--------------------------------------------------------------------------
|
|
def initialize
|
|
super(0, 0, window_width, window_height)
|
|
self.z = 200
|
|
self.opacity = 0
|
|
@lines = []
|
|
@num_wait = 0
|
|
create_back_bitmap
|
|
create_back_sprite
|
|
refresh
|
|
end
|
|
#--------------------------------------------------------------------------
|
|
# * Free
|
|
#--------------------------------------------------------------------------
|
|
def dispose
|
|
super
|
|
dispose_back_bitmap
|
|
dispose_back_sprite
|
|
end
|
|
#--------------------------------------------------------------------------
|
|
# * Get Window Width
|
|
#--------------------------------------------------------------------------
|
|
def window_width
|
|
Graphics.width
|
|
end
|
|
#--------------------------------------------------------------------------
|
|
# * Get Window Height
|
|
#--------------------------------------------------------------------------
|
|
def window_height
|
|
fitting_height(max_line_number)
|
|
end
|
|
#--------------------------------------------------------------------------
|
|
# * Get Maximum Number of Lines
|
|
#--------------------------------------------------------------------------
|
|
def max_line_number
|
|
return 6
|
|
end
|
|
#--------------------------------------------------------------------------
|
|
# * Create Background Bitmap
|
|
#--------------------------------------------------------------------------
|
|
def create_back_bitmap
|
|
@back_bitmap = Bitmap.new(width, height)
|
|
end
|
|
#--------------------------------------------------------------------------
|
|
# * Create Background Sprite
|
|
#--------------------------------------------------------------------------
|
|
def create_back_sprite
|
|
@back_sprite = Sprite.new
|
|
@back_sprite.bitmap = @back_bitmap
|
|
@back_sprite.y = y
|
|
@back_sprite.z = z - 1
|
|
end
|
|
#--------------------------------------------------------------------------
|
|
# * Free Background Bitmap
|
|
#--------------------------------------------------------------------------
|
|
def dispose_back_bitmap
|
|
@back_bitmap.dispose
|
|
end
|
|
#--------------------------------------------------------------------------
|
|
# * Free Background Sprite
|
|
#--------------------------------------------------------------------------
|
|
def dispose_back_sprite
|
|
@back_sprite.dispose
|
|
end
|
|
#--------------------------------------------------------------------------
|
|
# * Clear
|
|
#--------------------------------------------------------------------------
|
|
def clear
|
|
@num_wait = 0
|
|
@lines.clear
|
|
refresh
|
|
end
|
|
#--------------------------------------------------------------------------
|
|
# * Get Number of Data Lines
|
|
#--------------------------------------------------------------------------
|
|
def line_number
|
|
@lines.size
|
|
end
|
|
#--------------------------------------------------------------------------
|
|
# * Go Back One Line
|
|
#--------------------------------------------------------------------------
|
|
def back_one
|
|
@lines.pop
|
|
refresh
|
|
end
|
|
#--------------------------------------------------------------------------
|
|
# * Return to Designated Line
|
|
#--------------------------------------------------------------------------
|
|
def back_to(line_number)
|
|
@lines.pop while @lines.size > line_number
|
|
refresh
|
|
end
|
|
#--------------------------------------------------------------------------
|
|
# * Add Text
|
|
#--------------------------------------------------------------------------
|
|
def add_text(text)
|
|
@lines.push(text)
|
|
refresh
|
|
end
|
|
#--------------------------------------------------------------------------
|
|
# * Replace Text
|
|
# Replaces the last line with different text.
|
|
#--------------------------------------------------------------------------
|
|
def replace_text(text)
|
|
@lines.pop
|
|
@lines.push(text)
|
|
refresh
|
|
end
|
|
#--------------------------------------------------------------------------
|
|
# * Get Text From Last Line
|
|
#--------------------------------------------------------------------------
|
|
def last_text
|
|
@lines[-1]
|
|
end
|
|
#--------------------------------------------------------------------------
|
|
# * Refresh
|
|
#--------------------------------------------------------------------------
|
|
def refresh
|
|
draw_background
|
|
contents.clear
|
|
@lines.size.times {|i| draw_line(i) }
|
|
end
|
|
#--------------------------------------------------------------------------
|
|
# * Draw Background
|
|
#--------------------------------------------------------------------------
|
|
def draw_background
|
|
@back_bitmap.clear
|
|
@back_bitmap.fill_rect(back_rect, back_color)
|
|
end
|
|
#--------------------------------------------------------------------------
|
|
# * Get Background Rectangle
|
|
#--------------------------------------------------------------------------
|
|
def back_rect
|
|
Rect.new(0, padding, width, line_number * line_height)
|
|
end
|
|
#--------------------------------------------------------------------------
|
|
# * Get Background Color
|
|
#--------------------------------------------------------------------------
|
|
def back_color
|
|
Color.new(0, 0, 0, back_opacity)
|
|
end
|
|
#--------------------------------------------------------------------------
|
|
# * Get Background Opacity
|
|
#--------------------------------------------------------------------------
|
|
def back_opacity
|
|
return 64
|
|
end
|
|
#--------------------------------------------------------------------------
|
|
# * Draw Line
|
|
#--------------------------------------------------------------------------
|
|
def draw_line(line_number)
|
|
rect = item_rect_for_text(line_number)
|
|
contents.clear_rect(rect)
|
|
draw_text_ex(rect.x, rect.y, @lines[line_number])
|
|
end
|
|
#--------------------------------------------------------------------------
|
|
# * Set Wait Method
|
|
#--------------------------------------------------------------------------
|
|
def method_wait=(method)
|
|
@method_wait = method
|
|
end
|
|
#--------------------------------------------------------------------------
|
|
# * Set Wait Method for Effect Execution
|
|
#--------------------------------------------------------------------------
|
|
def method_wait_for_effect=(method)
|
|
@method_wait_for_effect = method
|
|
end
|
|
#--------------------------------------------------------------------------
|
|
# * Wait
|
|
#--------------------------------------------------------------------------
|
|
def wait
|
|
@num_wait += 1
|
|
@method_wait.call(message_speed) if @method_wait
|
|
end
|
|
#--------------------------------------------------------------------------
|
|
# * Wait Until Effect Execution Ends
|
|
#--------------------------------------------------------------------------
|
|
def wait_for_effect
|
|
@method_wait_for_effect.call if @method_wait_for_effect
|
|
end
|
|
#--------------------------------------------------------------------------
|
|
# * Get Message Speed
|
|
#--------------------------------------------------------------------------
|
|
def message_speed
|
|
return 20
|
|
end
|
|
#--------------------------------------------------------------------------
|
|
# * Wait and Clear
|
|
# Clear after inputing minimum necessary wait for the message to be read.
|
|
#--------------------------------------------------------------------------
|
|
def wait_and_clear
|
|
wait while @num_wait < 2 if line_number > 0
|
|
clear
|
|
end
|
|
#--------------------------------------------------------------------------
|
|
# * Display Current State
|
|
#--------------------------------------------------------------------------
|
|
def display_current_state(subject)
|
|
unless subject.most_important_state_text.empty?
|
|
add_text(subject.name + subject.most_important_state_text)
|
|
wait
|
|
end
|
|
end
|
|
#--------------------------------------------------------------------------
|
|
# * Display Skill/Item Use
|
|
#--------------------------------------------------------------------------
|
|
def display_use_item(subject, item)
|
|
if item.is_a?(RPG::Skill)
|
|
add_text(subject.name + item.message1)
|
|
unless item.message2.empty?
|
|
wait
|
|
add_text(item.message2)
|
|
end
|
|
else
|
|
add_text(sprintf(Vocab::UseItem, subject.name, item.name))
|
|
end
|
|
end
|
|
#--------------------------------------------------------------------------
|
|
# * Display Counterattack
|
|
#--------------------------------------------------------------------------
|
|
def display_counter(target, item)
|
|
Sound.play_evasion
|
|
add_text(sprintf(Vocab::CounterAttack, target.name))
|
|
wait
|
|
back_one
|
|
end
|
|
#--------------------------------------------------------------------------
|
|
# * Display Reflection
|
|
#--------------------------------------------------------------------------
|
|
def display_reflection(target, item)
|
|
Sound.play_reflection
|
|
add_text(sprintf(Vocab::MagicReflection, target.name))
|
|
wait
|
|
back_one
|
|
end
|
|
#--------------------------------------------------------------------------
|
|
# * Display Substitute
|
|
#--------------------------------------------------------------------------
|
|
def display_substitute(substitute, target)
|
|
add_text(sprintf(Vocab::Substitute, substitute.name, target.name))
|
|
wait
|
|
back_one
|
|
end
|
|
#--------------------------------------------------------------------------
|
|
# * Display Action Results
|
|
#--------------------------------------------------------------------------
|
|
def display_action_results(target, item)
|
|
if target.result.used
|
|
last_line_number = line_number
|
|
display_critical(target, item)
|
|
display_damage(target, item)
|
|
display_affected_status(target, item)
|
|
display_failure(target, item)
|
|
wait if line_number > last_line_number
|
|
back_to(last_line_number)
|
|
end
|
|
end
|
|
#--------------------------------------------------------------------------
|
|
# * Display Failure
|
|
#--------------------------------------------------------------------------
|
|
def display_failure(target, item)
|
|
if target.result.hit? && !target.result.success
|
|
add_text(sprintf(Vocab::ActionFailure, target.name))
|
|
wait
|
|
end
|
|
end
|
|
#--------------------------------------------------------------------------
|
|
# * Display Critical Hit
|
|
#--------------------------------------------------------------------------
|
|
def display_critical(target, item)
|
|
if target.result.critical
|
|
text = target.actor? ? Vocab::CriticalToActor : Vocab::CriticalToEnemy
|
|
add_text(text)
|
|
wait
|
|
end
|
|
end
|
|
#--------------------------------------------------------------------------
|
|
# * Display Damage
|
|
#--------------------------------------------------------------------------
|
|
def display_damage(target, item)
|
|
if target.result.missed
|
|
display_miss(target, item)
|
|
elsif target.result.evaded
|
|
display_evasion(target, item)
|
|
else
|
|
display_hp_damage(target, item)
|
|
display_mp_damage(target, item)
|
|
display_tp_damage(target, item)
|
|
end
|
|
end
|
|
#--------------------------------------------------------------------------
|
|
# * Display Miss
|
|
#--------------------------------------------------------------------------
|
|
def display_miss(target, item)
|
|
if !item || item.physical?
|
|
fmt = target.actor? ? Vocab::ActorNoHit : Vocab::EnemyNoHit
|
|
Sound.play_miss
|
|
else
|
|
fmt = Vocab::ActionFailure
|
|
end
|
|
add_text(sprintf(fmt, target.name))
|
|
wait
|
|
end
|
|
#--------------------------------------------------------------------------
|
|
# * Display Evasion
|
|
#--------------------------------------------------------------------------
|
|
def display_evasion(target, item)
|
|
if !item || item.physical?
|
|
fmt = Vocab::Evasion
|
|
Sound.play_evasion
|
|
else
|
|
fmt = Vocab::MagicEvasion
|
|
Sound.play_magic_evasion
|
|
end
|
|
add_text(sprintf(fmt, target.name))
|
|
wait
|
|
end
|
|
#--------------------------------------------------------------------------
|
|
# * Display HP Damage
|
|
#--------------------------------------------------------------------------
|
|
def display_hp_damage(target, item)
|
|
return if target.result.hp_damage == 0 && item && !item.damage.to_hp?
|
|
if target.result.hp_damage > 0 && target.result.hp_drain == 0
|
|
target.perform_damage_effect
|
|
end
|
|
Sound.play_recovery if target.result.hp_damage < 0
|
|
add_text(target.result.hp_damage_text)
|
|
wait
|
|
end
|
|
#--------------------------------------------------------------------------
|
|
# * Display MP Damage
|
|
#--------------------------------------------------------------------------
|
|
def display_mp_damage(target, item)
|
|
return if target.dead? || target.result.mp_damage == 0
|
|
Sound.play_recovery if target.result.mp_damage < 0
|
|
add_text(target.result.mp_damage_text)
|
|
wait
|
|
end
|
|
#--------------------------------------------------------------------------
|
|
# * Display TP Damage
|
|
#--------------------------------------------------------------------------
|
|
def display_tp_damage(target, item)
|
|
return if target.dead? || target.result.tp_damage == 0
|
|
Sound.play_recovery if target.result.tp_damage < 0
|
|
add_text(target.result.tp_damage_text)
|
|
wait
|
|
end
|
|
#--------------------------------------------------------------------------
|
|
# * Display Affected Status
|
|
#--------------------------------------------------------------------------
|
|
def display_affected_status(target, item)
|
|
if target.result.status_affected?
|
|
add_text("") if line_number < max_line_number
|
|
display_changed_states(target)
|
|
display_changed_buffs(target)
|
|
back_one if last_text.empty?
|
|
end
|
|
end
|
|
#--------------------------------------------------------------------------
|
|
# * Display Automatically Affected Status
|
|
#--------------------------------------------------------------------------
|
|
def display_auto_affected_status(target)
|
|
if target.result.status_affected?
|
|
display_affected_status(target, nil)
|
|
wait if line_number > 0
|
|
end
|
|
end
|
|
#--------------------------------------------------------------------------
|
|
# * Display Added/Removed State
|
|
#--------------------------------------------------------------------------
|
|
def display_changed_states(target)
|
|
display_added_states(target)
|
|
display_removed_states(target)
|
|
end
|
|
#--------------------------------------------------------------------------
|
|
# * Display Added State
|
|
#--------------------------------------------------------------------------
|
|
def display_added_states(target)
|
|
target.result.added_state_objects.each do |state|
|
|
state_msg = target.actor? ? state.message1 : state.message2
|
|
target.perform_collapse_effect if state.id == target.death_state_id
|
|
next if state_msg.empty?
|
|
replace_text(target.name + state_msg)
|
|
wait
|
|
wait_for_effect
|
|
end
|
|
end
|
|
#--------------------------------------------------------------------------
|
|
# * Display Removed State
|
|
#--------------------------------------------------------------------------
|
|
def display_removed_states(target)
|
|
target.result.removed_state_objects.each do |state|
|
|
next if state.message4.empty?
|
|
replace_text(target.name + state.message4)
|
|
wait
|
|
end
|
|
end
|
|
#--------------------------------------------------------------------------
|
|
# * Display Buff/Debuff
|
|
#--------------------------------------------------------------------------
|
|
def display_changed_buffs(target)
|
|
display_buffs(target, target.result.added_buffs, Vocab::BuffAdd)
|
|
display_buffs(target, target.result.added_debuffs, Vocab::DebuffAdd)
|
|
display_buffs(target, target.result.removed_buffs, Vocab::BuffRemove)
|
|
end
|
|
#--------------------------------------------------------------------------
|
|
# * Display Buff/Debuff (Individual)
|
|
#--------------------------------------------------------------------------
|
|
def display_buffs(target, buffs, fmt)
|
|
buffs.each do |param_id|
|
|
replace_text(sprintf(fmt, target.name, Vocab::param(param_id)))
|
|
wait
|
|
end
|
|
end
|
|
end
|