king-exit/Scripts/_.13.rb
2024-08-31 14:17:23 -05:00

590 lines
No EOL
23 KiB
Ruby
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#==============================================================================
# RGSS3_FF風 画面上部にスキル名表示 ver1.08 07/27修正
# 2012/06/29公開
# 2012/08/02使用者表示を追加
# 2012/08/11不具合修正
# 2012/08/13アイコン表示を追加
# 2012/11/01不具合修正
# BATTLE_LOG_DOWN の設定方法(trueとfalse)を逆に
# 2012/11/13 XPスタイルバトル併用の設定項目を追加
# 2014/03/31サイドビュー、XPスタイルバトルの対応スクリプトを本体に統合
# 2014/06/18スクリプト整理
# 2014/06/25スクリプト整理 07/27メモ取得不具合修正
# C Winter (http://ccwinter.blog.fc2.com/)
#==============================================================================
#==============================================================================
# ■ 設定項目
#==============================================================================
module Top_Skill
BATTLE_LOG_DOWN = true
# バトルログ表示位置の高さ
#  trueなら常に下げる falseならスキル名ウインドウが表示された時のみ下げる
USE_BATTLE_LOG = false
# スキル名ウインドウを表示した時は、通常の使用メッセージも出すかどうか
#  trueなら出す falseなら出さない
DEFAULT_SHOW = true
# スキル・アイテムで<上表示あり><上表示なし>を省略した場合のデフォルト表示
#  trueなら表示 falseなら非表示
DEFAULT_WINDOW_MODE = false
# <表示モード=true><表示モード=false>を省略した場合のデフォルト表示モード
#  trueなら半透明ウインドウ falseなら通常ウインドウ
ACTOR_ATTACK = nil
# 味方の通常攻撃時の表示内容
# nilなら非表示 文字列 "通常攻撃" など)ならその文字列
#  trueなら武器から取得 falseならキャラから取得
# 文字列を指定した場合、内容以外の設定(表示モードなど)はデフォルトのもの
ACTOR_NO_WEAPON_NAME = "素手"
# DEFAULT_ACTOR_ATTACK_MESSAGE = trueで武器を装備していない場合の表示内容
# 武器を装備していない場合、内容以外の設定(表示モードなど)はデフォルトのもの
ENEMY_ATTACK = nil
# 敵の通常攻撃時の内容
#  nilなら非表示 文字列ならその文字列 falseならキャラから取得
# 文字列を指定した場合、内容以外の設定(表示モードなど)はデフォルトのもの
# 表示内容の前に使用者名を表示するかどうか
ACTOR_NO_WEAPON_ATTACK_USERNAME = false # 味方通常攻撃 武器無し
ACTOR_USE_WEAPON_ATTACK_USERNAME = false # 味方通常攻撃 武器装備中
ENEMY_ATTACK_USERNAME = false # 敵通常攻撃
DEFAULT_USERNAME = false # それ以外の場合
# 使用者名を表示する場合、使用者名の直後に付け加える文字列
USERNAME_ADD = " "
# メモ指定がない場合、使用者名と表示内容の前にアイコンを表示するかどうか
# trueならスキルID1のアイコン falseなら表示しない nilなら武器アイコン
ACTOR_ATTACK_ICON = nil # 武器のメモ指定がない場合の味方の通常攻撃
# trueならスキルID1のアイコン falseなら表示しない
ENEMY_ATTACK_ICON = true # 敵キャラのメモ指定がない場合の敵の通常攻撃
# trueならスキル・アイテムのアイコン falseなら表示しない
DEFAULT_ICON = true # メモ指定がない場合のスキル・アイテム
# ※以下 XPスタイルバトル併用で、バトルログタイプが蓄積型の時のみ
# 蓄積型ログを消すタイミング
# trueなら元と同じXPスタイルコンフィグ84行目 STORAGE_TURNEND_CLEAR による)
# falseなら行動後にスキル名ウインドウを消すのと同時にログも消す
XP_LOG_CLEAR_TIMING = false
# 蓄積型ログの消え方
# trueなら元と同じ時間ごとに薄くなっていく falseなら一瞬で完全に消える
XP_LOG_CLEAR_TYPE = true
end
#==============================================================================
# ■ Top_Skill
#==============================================================================
module Top_Skill
def self.xp_style?
return ($lnx_include != nil and $lnx_include[:lnx11a] != nil)
end
def self.sideview?
begin
N03::ACTOR_POSITION
return true
rescue
return false
end
end
def self.no_atb?
return !$cwinter_script_atb
end
end
#==============================================================================
# ■ RPG::BaseItem
#==============================================================================
class RPG::BaseItem
def top_message_data
if @note =~ /<上表示あり>/
flag = true
elsif @note =~ /<上表示なし>/
flag = false
else
flag = Top_Skill::DEFAULT_SHOW
end
if flag
return [top_message, top_window_mode, top_message_color,
top_window_color, top_message_username]
else
return nil
end
end
def top_message
if @note =~ /<表示内容=(\S+?)>/
return $1.to_s
else
return @name
end
end
def top_window_mode
return true if @note =~ /<表示モード=true>/
return false if @note =~ /<表示モード=false>/
return Top_Skill::DEFAULT_WINDOW_MODE
end
def top_message_color
return @note =~ /<文字色=(\d*),(\d*),(\d*)>/ ?
Color.new($1.to_i, $2.to_i, $3.to_i, 255) : Color.new(255, 255, 255, 255)
end
def top_window_color
return @note =~ /<ウインドウ色=(\-*\d+),(\-*\d+),(\-*\d+)>/ ?
Tone.new($1.to_i, $2.to_i, $3.to_i) : $game_system.window_tone
end
def top_message_username
return true if @note =~ /<使用者名=true>/
return false if @note =~ /<使用者名=false>/
return Top_Skill::DEFAULT_USERNAME
end
def top_message_icon
return nil if @note =~ /<表示アイコン=false>/
return $1.to_i if @note =~ /<表示アイコン=(\d+)>/i
return self.icon_index if @note =~ /<表示アイコン=true>/
return self.icon_index if Top_Skill::DEFAULT_ICON
return nil
end
end
class RPG::Weapon
def top_message_username
return true if @note =~ /<使用者名=true>/
return false if @note =~ /<使用者名=false>/
return Top_Skill::ACTOR_USE_WEAPON_ATTACK_USERNAME
end
def top_message_icon
return false if @note =~ /<表示アイコン=false>/
return $1.to_i if @note =~ /<表示アイコン=(\d+)>/i
return self.icon_index if @note =~ /<表示アイコン=true>/
return self.icon_index if Top_Skill::ACTOR_ATTACK_ICON == nil
return nil
end
end
class RPG::Actor
def top_message_username
return true if @note =~ /<使用者名=true>/
return false if @note =~ /<使用者名=false>/
return Top_Skill::ACTOR_NO_WEAPON_ATTACK_USERNAME
end
end
class RPG::Enemy
def top_message_username
return true if @note =~ /<使用者名=true>/
return false if @note =~ /<使用者名=false>/
return Top_Skill::ENEMY_ATTACK_USERNAME
end
end
#==============================================================================
# ■ Game_Actor
#==============================================================================
class Game_Actor
def attack_top_message_data
if Top_Skill::ACTOR_ATTACK == nil
return nil
elsif Top_Skill::ACTOR_ATTACK.is_a?(String)
return [Top_Skill::ACTOR_ATTACK, Top_Skill::DEFAULT_WINDOW_MODE,
Color.new(255, 255, 255, 255), $game_system.window_tone,
Top_Skill::ACTOR_NO_WEAPON_ATTACK_USERNAME]
elsif Top_Skill::ACTOR_ATTACK == true
if weapons[0]
return weapons[0].top_message_data
else
return [Top_Skill::ACTOR_NO_WEAPON_NAME, Top_Skill::DEFAULT_WINDOW_MODE,
Color.new(255, 255, 255, 255), $game_system.window_tone,
Top_Skill::ACTOR_NO_WEAPON_ATTACK_USERNAME]
end
elsif Top_Skill::ACTOR_ATTACK == false
return actor.top_message_data
end
end
def top_message_icon
icon = weapons[0] ? weapons[0].top_message_icon : nil
icon = $data_skills[1].icon_index if icon == nil and
Top_Skill::ACTOR_ATTACK_ICON == true
return icon
end
end
#==============================================================================
# ■ Game_Enemy
#==============================================================================
class Game_Enemy
def attack_top_message_data
if Top_Skill::ENEMY_ATTACK == nil
return nil
elsif Top_Skill::ENEMY_ATTACK.is_a?(String)
return [Top_Skill::ENEMY_ATTACK, Top_Skill::DEFAULT_WINDOW_MODE,
Color.new(255, 255, 255, 255), $game_system.window_tone,
Top_Skill::ENEMY_ATTACK_USERNAME]
elsif Top_Skill::ENEMY_ATTACK == false
return enemy.top_message_data
end
end
def top_message_icon
return false if enemy.note =~ /<表示アイコン=false>/
return $1.to_i if enemy.note =~ /<表示アイコン=(\d+)>/i
return $data_skills[1].icon_index if Top_Skill::ENEMY_ATTACK_ICON == true
return nil
end
end
#==============================================================================
# ■ Scene_Battle
#==============================================================================
class Scene_Battle < Scene_Base
#--------------------------------------------------------------------------
# ● 全ウィンドウの作成
#--------------------------------------------------------------------------
alias :top_skill_name_create_all_windows :create_all_windows
def create_all_windows
top_skill_name_create_all_windows
@top_skill_name_window = Window_TopSkillName.new
hide_top_skill_name_window
end
#--------------------------------------------------------------------------
# ● 戦闘行動の実行
#--------------------------------------------------------------------------
alias :top_skill_name_execute_action :execute_action
def execute_action
top_skill_name_execute_action
hide_top_skill_name_window
end
#--------------------------------------------------------------------------
# ● スキル/アイテムの使用
#--------------------------------------------------------------------------
def use_item
item = @subject.current_action.item
display_top_skill_name_window(item)
if Top_Skill::USE_BATTLE_LOG or @top_skill_name_window.visible == false
@log_window.display_use_item(@subject, item)
end
@subject.use_item(item)
refresh_status
targets = @subject.current_action.make_targets.compact
show_animation(targets, item.animation_id)
targets.each {|target| item.repeats.times { invoke_item(target, item) } }
end
#--------------------------------------------------------------------------
# ● スキル名ウインドウを表示
#--------------------------------------------------------------------------
def display_top_skill_name_window(item)
if item.is_a?(RPG::Skill) and item.id == 1 # 通常攻撃の場合
data = @subject.attack_top_message_data
else
data = item.top_message_data
end
return @top_skill_name_window.draw_background(false) if data == nil
data = convert_top_skill_data(data, item, @subject)
down_log_window(true)
@top_skill_name_window.set_data(data)
end
#--------------------------------------------------------------------------
# ● データ変換
#--------------------------------------------------------------------------
def convert_top_skill_data(data, item, user)
data = convert_top_skill_data_user_name(data, item, user)
data = convert_top_skill_data_icon(data, item, user)
data = convert_top_skill_data_ae_window_color(data, item, user)
return data
end
def convert_top_skill_data_user_name(data, item, user)
if data[4]
data[6] = user.top_display_name
else
data[6] = ""
end
return data
end
def convert_top_skill_data_icon(data, item, user)
if item.is_a?(RPG::Skill) and item.id == 1 # 通常攻撃の場合
icon = @subject.top_message_icon
else
icon = item.top_message_icon
end
data[5] = icon
return data
end
def convert_top_skill_data_ae_window_color(data, item, user)
return data
end
#--------------------------------------------------------------------------
# ● バトルログを下げる
#--------------------------------------------------------------------------
def down_log_window(flag)
flag = true if Top_Skill::BATTLE_LOG_DOWN
@log_window.y = flag ? 36 : 0
@log_window.dispose_back_sprite
@log_window.create_back_sprite
end
#--------------------------------------------------------------------------
# ● スキル名ウインドウを隠す
#--------------------------------------------------------------------------
def hide_top_skill_name_window
@top_skill_name_window.draw_background(false)
@top_skill_name_window.hide
down_log_window(false)
end
end
#==============================================================================
# ■ Window_TopSkillName
#==============================================================================
class Window_TopSkillName < Window_Help
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
def initialize
@color_data = $game_system.window_tone
super(1)
hide
create_back_bitmap
create_back_sprite
self.x += 100
self.y += 0
self.width -= 200
create_contents
end
#--------------------------------------------------------------------------
# ● 解放
#--------------------------------------------------------------------------
def dispose
super
dispose_back_bitmap
dispose_back_sprite
end
#--------------------------------------------------------------------------
# ● 内容を設定
#--------------------------------------------------------------------------
def set_data(data)
draw_background(data[1])
change_color(data[2])
update_tone(data[3])
@text = data[0]
@icon = data[5]
@user_name = data[6]
refresh
show
end
#--------------------------------------------------------------------------
# ● 背景の描画
#--------------------------------------------------------------------------
def draw_background(flag)
@back_bitmap.clear
@back_bitmap.fill_rect(back_rect, back_color) if flag
self.opacity = flag ? 0 : 255
end
#--------------------------------------------------------------------------
# ● 色調の更新
#--------------------------------------------------------------------------
def update_tone(color_data = nil)
@color_data = color_data if color_data
self.tone.set(@color_data)
end
#--------------------------------------------------------------------------
# ● リフレッシュ
#--------------------------------------------------------------------------
def refresh
contents.clear
name_flag = !@user_name.empty?
if name_flag
@text = @user_name + Top_Skill::USERNAME_ADD + @text
end
rect = text_size(@text)
rect.x = (contents_width - rect.width) / 2
draw_icon(@icon, rect.x - 24, 0) if @icon
draw_text_ex(rect.x, 0, @text)
end
#--------------------------------------------------------------------------
# ● 制御文字つきテキストの描画
#--------------------------------------------------------------------------
def draw_text_ex(x, y, text)
text = convert_escape_characters(text)
pos = {:x => x, :y => y, :new_x => x, :height => calc_line_height(text)}
process_character(text.slice!(0, 1), text, pos) until text.empty?
end
#--------------------------------------------------------------------------
# ● 背景ビットマップの作成
#--------------------------------------------------------------------------
def create_back_bitmap
@back_bitmap = Bitmap.new(width, height)
end
#--------------------------------------------------------------------------
# ● 背景スプライトの作成
#--------------------------------------------------------------------------
def create_back_sprite
@back_sprite = Sprite.new
@back_sprite.bitmap = @back_bitmap
@back_sprite.y = y
@back_sprite.z = z - 1
end
#--------------------------------------------------------------------------
# ● 背景ビットマップの解放
#--------------------------------------------------------------------------
def dispose_back_bitmap
@back_bitmap.dispose
end
#--------------------------------------------------------------------------
# ● 背景スプライトの解放
#--------------------------------------------------------------------------
def dispose_back_sprite
@back_sprite.dispose
end
#--------------------------------------------------------------------------
# ● 背景の矩形を取得
#--------------------------------------------------------------------------
def back_rect
Rect.new(0, padding, width, line_height)
end
#--------------------------------------------------------------------------
# ● 背景色の取得
#--------------------------------------------------------------------------
def back_color
Color.new(0, 0, 0, back_opacity)
end
#--------------------------------------------------------------------------
# ● 背景の不透明度を取得
#--------------------------------------------------------------------------
def back_opacity
return 64
end
end
if (Top_Skill.no_atb? and Top_Skill.sideview?)
#==============================================================================
# ■ Scene_Battle
#==============================================================================
class Scene_Battle < Scene_Base
#--------------------------------------------------------------------------
# ● スキル/アイテムの使用
#--------------------------------------------------------------------------
def use_item
item = @subject.current_action.item
display_top_skill_name_window(item)
if Top_Skill::USE_BATTLE_LOG or @top_skill_name_window.visible == false
@log_window.display_use_item(@subject, item)
end
@log_window.off if !N03::BATTLE_LOG
@subject.use_item(item)
refresh_status
@targets = @subject.current_action.make_targets.compact
@targets = [@subject] if @targets.size == 0
set_substitute(item)
for time in item.repeats.times do play_sideview(@targets, item) end
end_reaction(item)
display_end_item
end
#--------------------------------------------------------------------------
# ● スキル/アイテム名の表示終了
#--------------------------------------------------------------------------
def display_end_item
set_camera_wait(N03::ACTION_END_WAIT) if @subject.sv.derivation_skill_id == 0
@log_window.clear if N03::BATTLE_LOG
hide_top_skill_name_window
end
end
#==============================================================================
# ■ Window_BattleLog
#==============================================================================
class Window_BattleLog < Window_Selectable
#--------------------------------------------------------------------------
# ● 背景スプライトの作成
#--------------------------------------------------------------------------
alias :sv_top_skill_name_create_back_sprite :create_back_sprite
def create_back_sprite
sv_top_skill_name_create_back_sprite
off if !N03::BATTLE_LOG
end
end
end
if (Top_Skill.no_atb? and Top_Skill.xp_style?)
#==============================================================================
# ■ Scene_Battle
#==============================================================================
class Scene_Battle < Scene_Base
#--------------------------------------------------------------------------
# ● バトルログを下げる
#--------------------------------------------------------------------------
def down_log_window(flag)
flag = true if Top_Skill::BATTLE_LOG_DOWN
@log_window.y = flag ? 36 : 0
@log_window.mes_sprites_set_down_y(flag ? 42 : 0)
end
#--------------------------------------------------------------------------
# ● スキル名ウインドウを隠す
#--------------------------------------------------------------------------
def hide_top_skill_name_window
@top_skill_name_window.draw_background(false)
@top_skill_name_window.hide
down_log_window(false)
$game_temp.battlelog_clear = true if Top_Skill::XP_LOG_CLEAR_TIMING == false
end
end
#==============================================================================
# ■ Window_BattleLog
#==============================================================================
class Window_BattleLog < Window_Selectable
#--------------------------------------------------------------------------
# ● ログの位置を下げる
#--------------------------------------------------------------------------
def mes_sprites_set_down_y(down_y)
return if LNX11::BATTLELOG_TYPE != 1
@mes_sprites.each {|sprite| sprite.down_y = down_y}
end
end
#==============================================================================
# ■ Sprite_OneLine_BattleLog
#==============================================================================
class Sprite_OneLine_BattleLog < Sprite
#--------------------------------------------------------------------------
# ● 公開インスタンス変数
#--------------------------------------------------------------------------
attr_accessor :down_y
#--------------------------------------------------------------------------
# ● フレーム更新
#--------------------------------------------------------------------------
def update
return if self.opacity == 0
if Top_Skill::XP_LOG_CLEAR_TYPE == false and @position < 0
self.opacity = 0
else
self.opacity += @visible && @position >= 0 ? 24 : -24
end
self.visible = self.opacity > 0
return unless @visible # 不可視状態なら座標を更新しない
@ry = (target_y + (@ry * 5)) / 6.0 if target_y < @ry
@rx += 2 if @rx < 0
self.x = @rx
self.y = @ry + @down_y
end
end
end
#==============================================================================
# ■ Game_Actor
#==============================================================================
class Game_Actor < Game_Battler
def top_display_name; return @name; end
end
#==============================================================================
# ■ Game_Enemy
#==============================================================================
class Game_Enemy < Game_Battler
def top_display_name; return name; end
# def top_display_name; return @original_name; end
# にすると"スライム A"などが"スライム"になる
end