#◆◇◆◇◆ ☆ セリフスクリプト ver 1・26 ◇◆◇◆◇ # ☆ マスタースクリプト ver 2.00 以降専用 # サポート掲示板 http://www2.ezbbs.net/21/minto-aaa/ # by みんと =begin 更新履歴 ver 1.26(2010/03/22) 条件次第で逃げると落ちるミスを修正 ver 1.25(2009/10/25) 戦闘不能キャラがセリフを実行していたミスを修正 ver 1.24(2009/05/23) 同位置入れ替えに非対応だったミスを修正 ver 1.23(2009/01/20) コマンドキャンセル時のミスを修正 ver 1.22(2008/2/28) 一部ソースを変更 ver 1.21(2008/2/4) 戦闘中にメンバーが増えた場合のエラー落ちを修正 ver 1.20 制御文字を増設 ☆ \\bg[グラフィック名] セリフ未設定のアクターに対応 ver 1.10 制御文字を増設 ☆ \\aw[n,n], \\bw ver 1.01 テロップスクリプトがないと エラー落ちするミスを修正 セクション指定上下関係 リアル・シャドウシステム ↓ テロップスクリプト ↓ このスクリプト 導入場所の注意 エイリアスで構成されていますので、 出来るだけシステム下部に導入してください。 説明 戦闘時において各アクターごとに いくつかのセリフを実行させることができるようになります。 設定可能なセリフは ・戦闘開始時 ・通常攻撃開始時 ・プラスダメージ時 ・スキル開始時 ・アニメ実行時 となります。 また、各制御文字にも対応しています。 対応制御文字 ※ n は 1 や 2 などの任意の「半角数値」です。 \\S[n] 改行を実行します。 数値を設定した場合、その数値フレーム分改行を待ち、 32ピクセル文章全体を上にスクロールさせます。 0 なら即改行でスクロールも実行しません。 \\C[n] n に該当するIDの文字色に変更します。 内容は Window_Base の text_color に依存します。 \\N[n] 指定したIDのアクターの名前に変換します。 \\AL[n] その行のアライメント(文章の整列)を変更します。 1で中央寄せ、2で右寄せ、未記入で左寄せです。 \\FO["フォント名"] 以降の文章のフォントを指定したフォントに変更します。 \\TY[n] 以降の文字の描写タイプを変更します。 0 で通常通り、1 で影文字に、2 で縁文字に変更します。 \\B[0 か 1] 以降の文字をボールド(太文字)に変更します。 \\B[0] でオフ \\B[1] でオンになります。 \\I[0 か 1] 以降の文字をイタリック(斜体文字)に変更します。 \\I[0] でオフ \\I[1] でオンになります。 \\SI[n] 以降の文字のサイズを指定したサイズに変更します。 基本値は22で上限は32です。 \\W[n] 指定した数値フレーム分、以降の処理を待ちます。 \\SP[n] 文字の速度を変更します。 基準は 2 で最速値は 1 です。 なお、小数点は無効です。 高い値ほど遅くなります。 \\AW[id,no] id で指定したIDのアクターの凡庸セリフを実行します。 実行する凡庸セリフのIDは no で指定してください。 \\BW Cボタンを入力するまで以降の処理を待ちます。 \\BG[グラフィック名] セリフを実行したアクターのグラフィックを セリフ実行時中のみ変更します。 \\bg[攻] なら、 アクターのグラフィック名の最後に 攻 の字のついたグラフィックに変更します。 詳しい設定方法はソース内部を参照してください。 =end #============================================================================== # ☆ MINTO #------------------------------------------------------------------------------ # 様々なフラグを扱うメインモジュールです。 #============================================================================== module MINTO # セリフスクリプトを有効化 ( true で有効 / false で無効 ) RGSS["BT_Message_Script"] = true # アニメ実行中セリフ用の判定SE名 # アニメに設定したSEが演奏されるフレームで、 # 使用したアクターにセリフが実行されます # なお、実行SEを指定した場合はフラッシュの対象を なし に設定してください Message_SE = "セリフ実行" # 戦闘開始時のセリフ用のハッシュ(変更しない) @battle_start_hash = {} # 攻撃開始時のセリフ用のハッシュ(変更しない) @attack_hash = {} # ダメージ時のセリフ用のハッシュ(変更しない) @damage_hash = {} # スキル使用時のセリフ用のハッシュ(変更しない) @skill_hash = {} # 凡庸セリフ用のハッシュ(変更しない) @normal_hash = {} # ループ処理(変更しない) Data_Actors.data.each do |actor| # 有効なアクターでない場合 if actor == nil then # 次の処理へ next end # 初期定義(変更しない) @battle_start_hash[actor.id] = [] @attack_hash[actor.id] = [] @damage_hash[actor.id] = [] @skill_hash[actor.id] = {} @normal_hash[actor.id] = {} end end if MINTO::RGSS["BT_Message_Script"] == true then #============================================================================== # ☆ カスタマイズ #------------------------------------------------------------------------------ # 機能のカスタマイズをここで行います。 #============================================================================== module MINTO #------------------------------------------------------------------------- # ☆ 戦闘開始時のセリフの設定 #------------------------------------------------------------------------- def self.setup_custom_01 # 例 @battle_start_hash[アクターID][セリフ候補ID] = "セリフ" # 候補が2つ以上ある場合はランダムでセリフが決まります # セリフの最後に適度なウェイトをおいてください # アクターID1 @battle_start_hash[1][0] = "さあ、行くぞ!\\w[8]" @battle_start_hash[1][1] = "油断するな!\\w[8]" # アクターID2 @battle_start_hash[2][0] = "がんばりましょう\\w[8]" @battle_start_hash[2][1] = "敵です\\w[8]" @battle_start_hash[2][2] = "油断は禁物です\\w[8]" end #------------------------------------------------------------------------- # ☆ 攻撃時のセリフの設定 #------------------------------------------------------------------------- def self.setup_custom_02 # 例 @attack_hash[アクターID][セリフ候補ID] = "セリフ" # 候補が2つ以上ある場合はランダムでセリフが決まります # セリフの最後に適度なウェイトをおいてください # アクターID1 @attack_hash[1][0] = "たあッ!\\w[8]" @attack_hash[1][1] = "セイッ!\\w[8]" # アクターID2 @attack_hash[2][0] = "ハッ!\\w[8]" @attack_hash[2][1] = "ヤッ!\\w[8]" end #------------------------------------------------------------------------- # ☆ ダメージ時のセリフの設定 #------------------------------------------------------------------------- def self.setup_custom_03 # 例 @damage_hash[アクターID][セリフ候補ID] = "セリフ" # 候補が2つ以上ある場合はランダムでセリフが決まります # セリフの最後に適度なウェイトをおいてください # アクターID1 @damage_hash[1][0] = "グァッ!\\w[8]" @damage_hash[1][1] = "ちッ!\\w[8]" # アクターID2 @damage_hash[2][0] = "うッ!\\w[8]" @damage_hash[2][1] = "クッ!\\w[8]" end #------------------------------------------------------------------------- # ☆ スキル使用時のセリフの設定 #------------------------------------------------------------------------- def self.setup_custom_04 # 例 @skill_hash[アクターID]["スキル名"][セリフ候補ID] = "セリフ" # 候補が2つ以上ある場合はランダムでセリフが決まります # セリフの最後に適度なウェイトをおいてください # アクターID1 # 以下のように必ず初期定義してください @skill_hash[1]["ギガブレイク"] = [] @skill_hash[1]["ギガブレイク"][0] = "ギガブレイク!\\w[8]" # 以下のように必ず初期定義してください @skill_hash[1]["クロスカット"] = [] @skill_hash[1]["クロスカット"][0] = "必殺!\\s[4]クロスカット!\\w[8]" @skill_hash[1]["クロスカット"][1] = "もらった!\\w[8]" # アクターID2 # 以下のように必ず初期定義してください @skill_hash[2]["ヒール"] = [] @skill_hash[2]["ヒール"][0] = "癒しの力よ!\\s[4]ヒール!\\w[8]" @skill_hash[2]["ヒール"][0] = "ヒール!\\w[8]" end #------------------------------------------------------------------------- # ☆ 凡庸セリフの設定 #------------------------------------------------------------------------- def self.setup_custom_05 # 例 @normal_hash[アクターID][セリフID][セリフ候補ID] = "セリフ" # 候補が2つ以上ある場合はランダムでセリフが決まります # セリフの最後に適度なウェイトをおいてください # 主にアニメ表示中などに使います # セリフIDをスキルIDにすると管理しやすいかもしれません # イベントのスクリプトで実行したい場合は # actor = $game_actors[アクターID] # window = $scene.battle_message_window[actor.index]. # window.normal_message(actor, セリフID) # で実行されます # アクターID1 # 以下のように必ず初期定義してください @normal_hash[1][1] = [] @normal_hash[1][1][0] = "十字に\\s[4]砕けろ!\\w[8]" @normal_hash[1][1][1] = "タッ!\\s[4]セイッ!!\\w[8]" # 以下のように必ず初期定義してください @normal_hash[1][2] = [] @normal_hash[1][2][0] = "そこだ!\\w[8]" # アクターID2 # 以下のように必ず初期定義してください @normal_hash[2][2] = [] @normal_hash[2][2][0] = "がんばって!\\w[8]" @normal_hash[2][2][1] = "負けないで!\\w[8]" end #------------------------------------------------------------------------- # ☆ 戦闘メッセージの取得 # type : メッセージのタイプ #------------------------------------------------------------------------- def self.battle_message(type) # タイプに応じて分岐 case type when "戦闘開始" then return @battle_start_hash when "攻撃" then return @attack_hash when "ダメージ" then return @damage_hash when "スキル" then return @skill_hash when "凡庸" then return @normal_hash end end # カスタマイズ設定を読み込む # 長くなったら設定を分割して管理するといいかも知れません MINTO.setup_custom_01 MINTO.setup_custom_02 MINTO.setup_custom_03 MINTO.setup_custom_04 MINTO.setup_custom_05 end #============================================================================== # ■ Game_Battler (分割定義 1) #------------------------------------------------------------------------------ #  バトラーを扱うクラスです。このクラスは Game_Actor クラスと Game_Enemy クラ # スのスーパークラスとして使用されます。 #============================================================================== class Game_Battler #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_accessor :battle_name # バトラー ファイル名 attr_accessor :battler_name # バトラー ファイル名 end #============================================================================== # ■ Sprite_Battler (分割定義 1) #------------------------------------------------------------------------------ #  バトラー表示用のスプライトです。 # Game_Battler クラスのインスタンスを監視し、 # スプライトの状態を自動的に変化させます。 #============================================================================== class Sprite_Battler < RPG::Sprite #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_accessor :window # ウィンドウ #-------------------------------------------------------------------------- # ● アニメーション・プロセスタイミング # timing : SEなどのデータ # hit : ヒットフラグ #-------------------------------------------------------------------------- # 多重エイリアスでない場合 unless method_defined?("process_timing_MINTO_BattleMessage") then # エイリアスを実行 alias :process_timing_MINTO_BattleMessage :animation_process_timing end def animation_process_timing(timing, hit) # 条件が ヒット で攻撃がヒットした場合か、 # 条件が ミス で攻撃がミスだった場合、 # もしくは条件が なし だった場合 if (timing.condition == 0) or (timing.condition == 1 and hit == true) or (timing.condition == 2 and hit == false) then # 対象無しのフラッシュが設定されている場合 if timing.flash_scope == 0 then # SE セリフ実行 が設定されている場合 if timing.se.name == MINTO::Message_SE then # アクティブバトラーがアクターの場合 if $scene.active_battler.class == Game_Actor then # アクターインデックスを取得 index = $scene.active_battler.index # メッセージウィンドウを取得 message_window = $scene.battle_message_window[index] # 凡庸セリフIDを取得 id = timing.flash_color.alpha.to_i # 凡庸セリフを実行 message_window.normal_message($scene.active_battler, id) end # メソッドを返す return end end end # 元の処理を実行 process_timing_MINTO_BattleMessage(timing, hit) end #------------------------------------------------------------------------- # ● ダメージの表示 # value : ダメージ値 # critical : クリティカルの有無 #------------------------------------------------------------------------- # 多重エイリアスでない場合 if not method_defined?("damage_MINTO_BattleMessage") then # エイリアスを実行 alias :damage_MINTO_BattleMessage :damage end def damage(value, critical) # 元の処理を実行 damage_MINTO_BattleMessage(value, critical) # メッセージウィンドウが有効な場合 if self.window != nil then # ダメージが 1 以上の場合 if value.to_i >= 1 then # ダメージセリフを描写 self.window.damage_effect(@battler) end end end #-------------------------------------------------------------------------- # ● バトラーの変更 # new_battler : 新しいバトラー #-------------------------------------------------------------------------- alias :battler_MINTO_BattleMessage :battler def battler=(new_battler) # バトラーを変更 @battler = new_battler # 元の処理を実行 battler_MINTO_BattleMessage # 戦闘画面でない場合 unless $scene.is_a?(Scene_Battle) # メソッドを返す return end # バトラーが有効な場合 if @battler != nil and MINTO::RGSS["Real_Shadow"] == true then # バトラーグラフィックを描写 bitmap_set # 影を作成 shadow_set end # バトラーがアクターの場合 if @battler.class == Game_Actor then # ウィンドウが存在しない場合 if self.window.nil? or $scene.battle_message_window[@battler.name].nil? then # 戦闘メッセージウィンドウを取得 window = $scene.battle_message_window # 元のウィンドウが存在しない場合 if window[@battler.name] == nil then # 戦闘メッセージウィンドウを作成 window[@battler.name] = Window_Battle_Message.new(@battler) end # メッセージウィンドウを関連付け self.window = window[@battler.name] # 存在する場合 if @battler.exist? then # 戦闘開始時のセリフを実行 self.window.battle_start(@battler) end end end end #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- alias :update_MINTO_BattleMessage :update def update # メッセージウィンドウが有効な場合 if self.window != nil then # メッセージウィンドウを更新 self.window.update end # 元の処理を実行 update_MINTO_BattleMessage end end #============================================================================== # ■ Window_Battle_Message #------------------------------------------------------------------------------ # 戦闘メンバーのセリフを管理するウィンドウです。 #============================================================================== class Window_Battle_Message < Window_Base #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_accessor :actor # アクター #-------------------------------------------------------------------------- # ● オブジェクト初期化 # actor : アクター #-------------------------------------------------------------------------- def initialize(actor) @actor = actor @actor.battle_name = @actor.battler_name.dup super(0, 0, 32, 32) self.z = 10000 self.visible = false self.contents = Bitmap.new(32, 32) @message_duration = 0 @wait_count = 0 @scroll = [] @scroll_count = 0 @scroll_duration = 0 @save_text = "" @text = [] @text_y = 0 @text_x = 0 @text_type = 0 @text_index = 0 @text_width = [] @align = [] @speed = 2 end #-------------------------------------------------------------------------- # ● 外部ウィンドウ取得 # id : アクターID #-------------------------------------------------------------------------- def actor_window(id) index = $game_actors[id].index # 有効なインデックスの場合 if index != nil then # ウィンドウを返す return $scene.battle_message_window[$game_actors[id].name] # 無効なインデックスの場合 else # nil を返す return nil end end #-------------------------------------------------------------------------- # ● 影文字描写 #-------------------------------------------------------------------------- def draw_shadow_text(x, y, width, height, text, ag = 0) # 元の色を保存 ori_color = self.contents.font.color.clone # 影の色を定義 self.contents.font.color.set(0, 0, 0) # 影文字を描写 self.contents.draw_text(x+2, y+2, width, height, text, ag) # 元の色に戻す self.contents.font.color = ori_color # 本体の文字を描写 self.contents.draw_text(x, y, width, height, text, ag) end #-------------------------------------------------------------------------- # ● 縁文字描写 #-------------------------------------------------------------------------- def draw_frame_text(x, y, width, height, text, ag = 0) # 元の色を保存 ori_color = self.contents.font.color.clone # 縁の色を定義 self.contents.font.color.set(0, 0, 0) # 縁文字を描写 self.contents.draw_text(x-1, y, width, height, text, ag) self.contents.draw_text(x+1, y, width, height, text, ag) self.contents.draw_text(x, y-1, width, height, text, ag) self.contents.draw_text(x, y+1, width, height, text, ag) # 元の色に戻す self.contents.font.color = ori_color # 本体の文字を描写 self.contents.draw_text(x, y, width, height, text, ag) end #-------------------------------------------------------------------------- # ● テキスト設定 # text : スプライトに表示する文字列 # duration : 表示カウント補正 #-------------------------------------------------------------------------- def set_text(text = "") # 求められたテキストが無効な場合 if text.to_s == "" then # メソッドを終了 return end # テロップ表示中フラグをオン $scene.telop_wait = true # スプライトを可視状態にする self.visible = true # 各データを初期化 @speed = 2 @scroll = [] @scroll_count = 0 @scroll_duration = 0 @save_text = "" @text = [] @text_width = [] @text_index = 0 @text_type = 0 @align = [] self.oy = 0 self.opacity = 255 self.contents_opacity = 255 # 表示カウントを設定 @message_duration = 32 # 設定用のデータを定義 height_p = 1 normal_height = 1 text_width = 0 max_width = 0 # テキストを再描画 self.contents.clear self.contents.font.size = 22 # 文字を複製 data = text.to_s.dup # 各制御文字を仮変換 data.gsub!(/\\\\/) { "\000" } data.gsub!(/\\[Cc]\[([0-9]+)\]/) { "" } data.gsub!(/\\[Ww]\[([0-9]+)\]/) { "" } data.gsub!(/\\[Ff][Oo]\[(.+?)\]/) { "" } data.gsub!(/\\[Nn]\[([0-9]+)\]/) { $game_actors[$1.to_i].name } data.gsub!(/\\[Vv]\[([0-9]+)\]/) { $game_variables[$1.to_i] } data.gsub!(/\\[Ss]\[([0-9]+)\]/) { "\002[#{$1}]" } data.gsub!(/\\[Aa][Ll]\[([0-9]+)\]/) { "\004[#{$1}]" } data.gsub!(/\\[Ss][Ii]\[([0-9]+)\]/) { "\006[#{$1}]" } data.gsub!(/\\[Bb]\[([0-9]+)\]/) { "\10[#{$1}]" } data.gsub!(/\\[Ii]\[([0-9]+)\]/) { "" } data.gsub!(/\\[Ss][Pp]\[([0-9]+)\]/) { "" } data.gsub!(/\\[Tt][Yy]\[([0-9]+)\]/) { "" } data.gsub!(/\\[Bb][Ww]/) { "" } data.gsub!(/\\[Aa][Ww]\[([0-9]+),([0-9]+)\]/) { "" } data.gsub!(/\\[Bb][Gg]\[(.+?)\]/) { "" } # c に 1 文字を取得 (文字が取得できなくなるまでループ) while ((c = data.slice!(/./m)) != nil) do # \SI[n] の場合 if c == "\006" then # 制御文字を処理 data.sub!(/\[([0-9]+)\]/, "") # 文字サイズを変更 self.contents.font.size = [[$1.to_i, 32].min, 1].max # 次の文字へ next end # \S[n] の場合 if c == "\002" then # 文字幅が最高値以上の場合 if text_width > max_width then # 文字幅を更新 max_width = text_width end # 文字幅を記憶 @text_width.push(text_width) # 文字幅を初期化 text_width = 0 data.sub!(/\[([0-9]+)\]/, "") # 描写の高さを増やす height_p += 1 # スクロールが設定されていない場合 if $1.to_i == 0 then # 通常のを増やす normal_height += 1 end # 次の文字へ next end # \AL[n] の場合 if c == "\004" then # 制御文字を処理 data.sub!(/\[([0-9]+)\]/, "") # アライメントを設定 @align[height_p-1] = $1.to_i # 次の文字へ next end # \B[n] の場合 if c == "\010" then # 制御文字を処理 data.sub!(/\[([0-9]+)\]/, "") # 太文字に変更 self.contents.font.bold = ($1.to_i == 1) # 次の文字へ next end # text_width に描画した文字の幅を加算 text_width += self.contents.text_size(c).width end # 文字幅を記憶 @text_width.push(text_width) # 文字幅が最高値以上の場合 if text_width > max_width # 文字幅を更新 max_width = text_width end # ウィンドウのサイズを調節 self.width = max_width + 32 self.height = 32 + (32 * normal_height) # ウィンドウの座標を更新 self.x = @actor.screen_x - self.width / 2 self.y = 16 + @actor.screen_y / 2 # ビットマップを再作成 self.contents = Bitmap.new(self.width - 32, 32 * height_p) # リフレッシュ refresh(text.to_s.dup) end #-------------------------------------------------------------------------- # ● リフレッシュ # text : スプライトに表示する文字列 #-------------------------------------------------------------------------- def refresh(text) # 基本情報を初期化 self.contents.clear self.contents.font.color = normal_color self.contents.font.size = 22 self.contents.font.bold = false self.contents.font.italic = false @text_y = 0 # 初期アライメントに応じて分岐 case @align[0].to_i # 左寄せ(デフォルト) when 0 then @text_x = 0 # 中央寄せ when 1 then @text_x = ((self.width - 32) - @text_width[0]) / 2 # 右寄せ when 2 then @text_x = (self.width - 32) - @text_width[0] end # 文章のインデックスを初期化 @text_index = 0 # 表示待ちのメッセージがある場合 if text != "" then # 制御文字処理 begin last_text = text.clone end until text == last_text text.gsub!(/\\[Nn]\[([0-9]+)\]/) do $game_actors[$1.to_i] != nil ? $game_actors[$1.to_i].name : "" end # 便宜上、"\\\\" を "\000" に変換 text.gsub!(/\\\\/) { "\000" } # 各制御文字を実際のものに変換 text.gsub!(/\\[Cc]\[([0-9]+)\]/) { "\001[#{$1}]" } text.gsub!(/\\[Ss]\[([0-9]+)\]/) { "\002[#{$1}]" } text.gsub!(/\\[Ww]\[([0-9]+)\]/) { "\003[#{$1}]" } text.gsub!(/\\[Aa][Ll]\[([0-9]+)\]/) { "" } text.gsub!(/\\[Ff][Oo]\[(.+?)\]/) { "\005[#{$1}]" } text.gsub!(/\\[Ss][Ii]\[([0-9]+)\]/) { "\006[#{$1}]" } text.gsub!(/\\[Bb]\[([0-9]+)\]/) { "\010[#{$1}]" } text.gsub!(/\\[Ii]\[([0-9]+)\]/) { "\016[#{$1}]" } text.gsub!(/\\[Bb][Ww]/) { "\017" } text.gsub!(/\\[Ss][Pp]\[([0-9]+)\]/) { "\020[#{$1}]" } text.gsub!(/\\[Tt][Yy]\[([0-9]+)\]/) { "\021[#{$1}]" } text.gsub!(/\\[Vv]\[([0-9]+)\]/) { $game_variables[$1.to_i] } text.gsub!(/\\[Aa][Ww]\[([0-9]+),([0-9]+)\]/) { "\022[#{$1},#{$2}]" } text.gsub!(/\\[Bb][Gg]\[(.+?)\]/) { "\023[#{$1}]" } @save_text = text.to_s.dup end end #-------------------------------------------------------------------------- # ● テキストの更新 #-------------------------------------------------------------------------- def text_update @text = @save_text.split(//) # 無効な文字列の場合 if @text[@text_index] == nil then # メソッドを返す return false end # スプライトを可視状態にする self.visible = true # テキストを取得 c = @text[@text_index] # \\ の場合 if c == "\000" then # 本来の文字に戻す c = "\\" end # \C[n] の場合 if c == "\001" then # 制御文字を処理 @save_text.sub!(/\[([0-9]+)\]/, "") # 文字色のIDを取得 color = $1.to_i # 文字色のIDが有効な場合 if color >= 0 then # 文字色を変更 self.contents.font.color = text_color(color) end # インデックスを進める @text_index += 1 # メソッドを返す return true end # \S[n] の場合 if c == "\002" then # 制御文字を処理 @save_text.sub!(/\[([0-9]+)\]/, "") # スクロールを予約 @scroll.push($1.to_i+1) # インデックスを進める @text_index += 1 # @text_y に 1 を加算 @text_y += 1 # 現在の行のアライメントに応じて分岐 case @align[@text_y].to_i # 左寄せ(デフォルト) when 0 then @text_x = 0 # 中央寄せ when 1 then @text_x = ((self.width - 32) - @text_width[@text_y]) / 2 # 右寄せ when 2 then @text_x = (self.width - 32) - @text_width[@text_y] end # メソッドを返す return true end # \W[n] の場合 if c == "\003" then # 制御文字を処理 @save_text.sub!(/\[([0-9]+)\]/, "") # ウェイトカウントを設定 @wait_count = $1.to_i # インデックスを進める @text_index += 1 # メソッドを返す return true end # \FO[n] の場合 if c == "\005" then # 制御文字を処理 @save_text.sub!(/\[(.+?)\]/, "") # フォントを変更 self.contents.font.name = $1.to_s # インデックスを進める @text_index += 1 # メソッドを返す return true end # \SI[n] の場合 if c == "\006" then # 制御文字を処理 @save_text.sub!(/\[([0-9]+)\]/, "") # 文字サイズを変更 self.contents.font.size = [[$1.to_i, 32].min, 1].max # インデックスを進める @text_index += 1 # メソッドを返す return true end # \B[n] の場合 if c == "\010" then # 制御文字を処理 @save_text.sub!(/\[([0-9]+)\]/, "") # 太文字に変更 self.contents.font.bold = ($1.to_i == 1) # インデックスを進める @text_index += 1 # メソッドを返す return true end # \I[n] の場合 if c == "\016" then # 制御文字を処理 @save_text.sub!(/\[([0-9]+)\]/, "") # 斜体文字に変更 self.contents.font.italic = ($1.to_i == 1) # インデックスを進める @text_index += 1 # メソッドを返す return true end # \BW の場合 if c == "\017" then # ボタン待ちフラグをオン @press = true # インデックスを進める @text_index += 1 # メソッドを返す return true end # \SP[n] の場合 if c == "\020" then # 制御文字を処理 @save_text.sub!(/\[([0-9]+)\]/, "") # 表示速度を変更 @speed = [$1.to_i, 1].max # インデックスを進める @text_index += 1 # メソッドを返す return true end # \TY[n] の場合 if c == "\021" then # 制御文字を処理 @save_text.sub!(/\[([0-9]+)\]/, "") # 文字の描写タイプを変更 @text_type = $1.to_i # インデックスを進める @text_index += 1 # メソッドを返す return true end # \AW[n,n] の場合 if c == "\022" then # 制御文字を処理 @save_text.sub!(/\[([0-9]+),([0-9]+)\]/, "") # アクターIDを取得 actor_id = $1.to_i # セリフIDを取得 id = $2.to_i # インデックスを進める @text_index += 1 # 外部アクターのセリフウィンドウを取得 window = actor_window(actor_id) # ウィンドウが有効で、且つアクターが存在する場合 if window != nil and window.actor.exist? == true then # 凡庸セリフを実行 window.normal_message(window.actor, id) end # メソッドを返す return true end # \BG[s] の場合 if c == "\023" then # 制御文字を処理 @save_text.sub!(/\[(.+?)\]/, "") # グラフィック名を取得 graphic = $1 # バトラーグラフィックを変更 @actor.battler_name = @actor.battle_name + graphic # インデックスを進める @text_index += 1 # メソッドを返す return true end # 文字の描写タイプに応じて分岐 case @text_type # デフォルト when 0 then # 文字を描画 self.contents.draw_text(@text_x, 32 * @text_y, 40, 32, c) # 影文字 when 1 then # 影文字を描画 draw_shadow_text(@text_x, 32 * @text_y, 40, 32, c) # 縁文字 when 2 then # 縁文字を描画 draw_frame_text(@text_x, 32 * @text_y, 40, 32, c) end # @text_x に描画した文字の幅を加算 @text_x += self.contents.text_size(c).width # インデックスを進める @text_index += 1 return true end #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- def update # ボタン入力待ちフラグがオンの場合 if @press == true then # C ボタンが押された場合 if Input.trigger?(Input::C) == true then # ボタン入力待ちフラグをオフ @press = false end # メソッドを返す return end # ウェイトカウントが 1 以上の場合 if @wait_count >= 1 then # ウェイトカウントを減らす @wait_count -= 1 # メソッドを返す return end # スクロール中の場合 if @scroll_duration >= 1 then # 実際にスプライトをスクロールさせる self.oy += 2 # カウントを減らす @scroll_duration -= 1 # メソッドを返す return end # スクロールが有効な場合 if @scroll[0] != nil and @scroll_count == 0 then # スクロールカウントを有効にする @scroll_count = @scroll[0] # スクロールカウントを詰める @scroll[0] = nil @scroll.compact! end # スクロールの待ち時間がある場合 if @scroll_count >= 1 then # カウントを減らす @scroll_count -= 1 # 残りカウントが 1 の場合 if @scroll_count == 1 then # スクロールをはじめる @scroll_duration = 16 end # メソッドを返す return end # 更新が可能なフレームでない場合 if (Graphics.frame_count % @speed != 0) then # メソッドを返す return end # テロップを更新中の場合 if text_update == true then # メソッドを返す return else # 文章の表示速度を最速化 @speed = 1 end # 更新カウントが設定してある場合 if @message_duration >= 1 then # 更新カウントを減らす @message_duration -= 1 # 透明度を調節する self.contents_opacity -= 32 self.opacity = self.contents_opacity # 更新カウントが丁度 0 になった場合 if @message_duration == 0 then # グラフィックを戻す @actor.battler_name = @actor.battle_name # 文章の表示速度を初期化 @speed = 2 # ボタン入力待ちフラグをオフ @press = false # テロップ表示中フラグをオフ $scene.telop_wait = false # テロップを不可視にする self.visible = false end end end #-------------------------------------------------------------------------- # ● 戦闘開始セリフ処理 # actor : アクター #-------------------------------------------------------------------------- def battle_start(actor) # メッセージを取得 text_array = MINTO.battle_message("戦闘開始")[actor.id] # セリフが設定されていない場合 if text_array.to_a == [] then # メソッドを返す return end # メッセージを決定 text = "\\w[4]" + text_array[rand(text_array.size)] # メッセージを描写 set_text(text.to_s.dup) end #-------------------------------------------------------------------------- # ● 攻撃セリフ処理 # actor : アクター #-------------------------------------------------------------------------- def attack_start(actor) # メッセージを取得 text_array = MINTO.battle_message("攻撃")[actor.id] # セリフが設定されていない場合 if text_array.to_a == [] then # メソッドを返す return end # メッセージを決定 text = text_array[rand(text_array.size)] # メッセージを描写 set_text(text.to_s.dup) end #-------------------------------------------------------------------------- # ● ダメージセリフ処理 # actor : アクター #-------------------------------------------------------------------------- def damage_effect(actor) # メッセージを取得 text_array = MINTO.battle_message("ダメージ")[actor.id] # セリフが設定されていない場合 if text_array.to_a == [] then # メソッドを返す return end # メッセージを決定 text = text_array[rand(text_array.size)] # メッセージを描写 set_text(text.to_s.dup) end #-------------------------------------------------------------------------- # ● スキルセリフ処理 # actor : アクター # skill : スキル #-------------------------------------------------------------------------- def skill_start(actor, skill) # メッセージを取得 text_array = MINTO.battle_message("スキル")[actor.id][skill.name] # セリフが設定されていない場合 if text_array.to_a == [] then # メソッドを返す return end # メッセージを決定 text = text_array[rand(text_array.size)] # メッセージを描写 set_text(text.to_s.dup) end #-------------------------------------------------------------------------- # ● 凡庸セリフ処理 # actor : アクター # id : ID #-------------------------------------------------------------------------- def normal_message(actor, id) # メッセージを取得 text_array = MINTO.battle_message("凡庸")[actor.id][id] # セリフが設定されていない場合 if text_array.to_a == [] then # メソッドを返す return end # メッセージを決定 text = text_array[rand(text_array.size)] # メッセージを描写 set_text(text.to_s.dup) end end # テロップスクリプトが有効でない場合 if MINTO::RGSS["Telop_Script"] == false then #============================================================================== # ■ Interpreter (分割定義 1) #------------------------------------------------------------------------------ #  イベントコマンドを実行するインタプリタです。 # このクラスは Game_System クラスや Game_Event クラスの内部で使用されます。 #============================================================================== class Interpreter #-------------------------------------------------------------------------- # ● フレーム更新 # alias : update_MINTO_BattleMessage #-------------------------------------------------------------------------- alias :update_MINTO_BattleMessage :update def update # テロップ表示中フラグがオンの場合 if not $game_temp.in_battle and $scene.telop_wait == true then # メソッドを返す return else # 元の処理を実行 update_MINTO_BattleMessage end end end #============================================================================== # ■ Interpreter (分割定義 7) #------------------------------------------------------------------------------ #  イベントコマンドを実行するインタプリタです。 # このクラスは Game_System クラスや Game_Event クラスの内部で使用されます。 #============================================================================== class Interpreter #-------------------------------------------------------------------------- # ● スクリプト # alias : command_355_MINTO_BattleMessage #-------------------------------------------------------------------------- alias :command_355_MINTO_BattleMessage :command_355 def command_355 # スクリプトがテロップ表示の場合 if @list[@index].parameters[0].include?("map_telop") == true then # ウェイトカウントに1を加算 @wait_count += 1 end # 元の処理を実行 command_355_MINTO_BattleMessage end end end #============================================================================== # ■ Scene_Battle (分割定義 1) #------------------------------------------------------------------------------ #  バトル画面の処理を行うクラスです。 #============================================================================== class Scene_Battle #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_accessor :telop_wait # テロップ表示中フラグ attr_accessor :battle_message_window # 戦闘メッセージウィンドウ attr_reader :active_battler # アクティブバトラー #-------------------------------------------------------------------------- # ● メイン処理 # alias : main_MINTO_BattleMessage #-------------------------------------------------------------------------- alias :main_MINTO_BattleMessage :main def main # 戦闘メッセージウィンドウ用のハッシュを作成 @battle_message_window = {} # ループ処理(パーティー) $game_party.actors.each do |actor| # 戦闘メッセージウィンドウを作成 @battle_message_window[actor.name] = Window_Battle_Message.new(actor) end # 元の処理を実行 main_MINTO_BattleMessage # ループ処理(パーティー) @battle_message_window.keys.each do |key| # 戦闘メッセージウィンドウを解放 @battle_message_window[key].dispose end end end #============================================================================== # ■ Scene_Battle (分割定義 4) #------------------------------------------------------------------------------ #  バトル画面の処理を行うクラスです。 #============================================================================== class Scene_Battle #-------------------------------------------------------------------------- # ● フレーム更新 (メインフェーズ ステップ 3 : 行動側アニメーション) # alias : update_phase4_step3_MINTO_BattleMessage #-------------------------------------------------------------------------- alias :update_phase4_step3_MINTO_BattleMessage :update_phase4_step3 def update_phase4_step3 # アクティブバトラーがアクターの場合 if @active_battler.class == Game_Actor then # アクターを取得 actor = @active_battler # スキルの場合 if @active_battler.current_action.kind == 1 and @active_battler.current_action.skill_id >= 1 # スキルを取得 skill = $data_skills[actor.current_action.skill_id] # スキルのセリフを実行 @battle_message_window[actor.name].skill_start(actor, skill) # 通常攻撃の場合 elsif actor.current_action.basic == 0 # 通常攻撃セリフを実行 @battle_message_window[actor.name].attack_start(actor) end end # 元の処理を実行 update_phase4_step3_MINTO_BattleMessage end #-------------------------------------------------------------------------- # ● フレーム更新 (メインフェーズ ステップ 6 : リフレッシュ) # alias : update_phase4_step6_MINTO_BattleMessage #-------------------------------------------------------------------------- alias :update_phase4_step6_MINTO_BattleMessage :update_phase4_step6 def update_phase4_step6 # 元の処理を実行 update_phase4_step6_MINTO_BattleMessage # カレントアクションを解放 @active_battler.current_action.clear end end end