#============================================================================== # ■ XP-RGSS-29 戦闘前後メッセージ [Ver.2.0.3] by Claimh #------------------------------------------------------------------------------ # 戦闘の前後に簡単なメッセージを出せます。 #============================================================================== module Battle_Message S_MESSAGE = [] E_MESSAGE = [] # 共通初期化用の配列(メッセージタイプ最大数だけ配列が必要) INIT_MES = [[],[],[],[],[],[],[],[],[],[],[],[],[]] #============================================================================== # カスタマイズSTART #============================================================================== # 戦闘前メッセージを表示する B_START = true # 戦闘後メッセージを表示する B_END = true # メッセージ表示位置(0:右 1:中央 2:左) MES_ALIGN = 1 # アクター名と「」を自動表示する AUTO_NAME = true # 全員メッセージ表示時の名前 ALL_NAME = "みんな" # メッセージの自動消去をする AUTO_ERASE = true # 自動消去時間(フレーム数) ERASE_TIME = 45 # ピンチと判定するHP割合(%) PINCH_HP = 10 # 強敵/ザコと判定するレベル差 LEVEL_DEF = 10 # トドメを指したアクターに優先的にメッセージを出させる # ※メッセージがない場合はパーティ内からランダムでメッセージ発信します LAST_ACTOR = false # メッセージの強制無効化 # 特定のスイッチをONにした後のみメッセージ無効化 # スイッチをOFFにする処理は勝手にやります。 STA_MES_OFF_SW = 10 # 戦闘開始メッセージ無効化用スイッチID END_MES_OFF_SW = 11 # 戦闘終了メッセージ無効化用スイッチID #-------------------------------------------------------------------------- # 戦闘開始時のメッセージ設定 #-------------------------------------------------------------------------- # S_MASSAGE[アクターID][メッセージタイプ] = ["メッセージ内容"・・・] # メッセージタイプ # 0:通常 # 1:ピンチ # 2:独り言(パーティが一人のとき用) # 3:特定ステートがかかっているとき # [["メッセージ内容",ステートID],・・・] # 4:特定アクターがいるとき # [["メッセージ内容",話相手アクターID],・・・] # 5:ザコと遭遇(要・エネミー設定) # 6:強敵と遭遇(要・エネミー設定) # 7:選択不可(効果なし) # 8:特定のエネミーと遭遇(ボス用) # [["メッセージ内容",エネミーID],・・・] # 9:特定のエネミーと遭遇(ザコ用) # [["メッセージ内容",エネミーID],・・・] # 10:単独戦闘突入(一人だけ生存時に戦闘突入) # 11:選択不可(効果なし) # 12:特定のトループと遭遇 # [["メッセージ内容",トループID],・・・] #-------------------------------------------------------------------------- # アクターID:0 = 全員メッセージ(使用可能なメッセージタイプ:0,8,9,12) S_MESSAGE[0] = INIT_MES.dup # 初期化(固定) # アクターID:1 S_MESSAGE[1] = INIT_MES.dup # 初期化(固定) S_MESSAGE[1][0] = ["さてと・・・","さぁ、来い"] S_MESSAGE[1][1] = ["ちょっときついな・・・"] S_MESSAGE[1][2] = ["・・・"] S_MESSAGE[1][4] = [["バジル、まだいける?",2]] # アクターID:2 S_MESSAGE[2] = INIT_MES.dup # 初期化(固定) S_MESSAGE[2][0] = ["この程度のザコなら軽い軽い","うざいなぁ"] S_MESSAGE[2][1] = ["うゎ、ちょっとタイム"] S_MESSAGE[2][2] = ["一人じゃきついだろこれ。"] S_MESSAGE[2][4] = [["しっかりしろよ、アルシェス",1]] # 戦闘開始時のメッセージ優先順位設定 # S_PRIORITY = [メッセージタイプ,・・・・・・] # ※[]で囲むと同じ優先順位になります。 S_PRIORITY = [12,8,10,1,3,[5,6,2,4,0,9]] # 12→8→10→1→3→5,6,2,4,0,9 #-------------------------------------------------------------------------- # 戦闘終了時のメッセージ設定 #-------------------------------------------------------------------------- # E_MASSAGE[アクターID][メッセージタイプ] = ["メッセージ内容"・・・] # メッセージタイプ # 0:通常 # 1:ピンチ # 2:独り言(パーティが一人のとき用) # 3:特定ステートがかかっているとき # [["メッセージ内容",ステートID],・・・] # 4:特定アクターがいるとき # [["メッセージ内容",話相手アクターID],・・・] # 5:ザコを倒した(要・エネミー設定) # 6:強敵を倒した(要・エネミー設定) # 7:レベルアップ # 8:特定のエネミーを倒した(ボス用) # [["メッセージ内容",エネミーID],・・・] # 9:特定のエネミーを倒した(ザコ用) # [["メッセージ内容",エネミーID],・・・] # 10:単独勝利(一人だけ生存した状態で勝利) # 11:トドメを指した # 12:特定のトループを倒した # [["メッセージ内容",トループID],・・・] #-------------------------------------------------------------------------- # アクターID:0 = 全員メッセージ(使用可能なメッセージタイプ:0,8,9,12) E_MESSAGE[0] = INIT_MES.dup # 初期化(固定) E_MESSAGE[0][0]= ["おわりッ"] # アクターID:1 E_MESSAGE[1] = INIT_MES.dup # 初期化(固定) E_MESSAGE[1][0] = ["こんなものか","ふぅ"] E_MESSAGE[1][1] = ["危なかった〜"] E_MESSAGE[1][2] = ["・・・"] E_MESSAGE[1][4] = [["バジル、大丈夫?",2]] E_MESSAGE[1][7] = ["レベルアップ!"] E_MESSAGE[1][10]= ["く、危なかった・・・"] E_MESSAGE[1][12]= [["次ッ",2]] # アクターID:2 E_MESSAGE[2] = INIT_MES.dup # 初期化(固定) E_MESSAGE[2][0] = ["楽勝、楽勝♪","この程度ならラクショー"] E_MESSAGE[2][1] = ["うゎ、きっつー"] E_MESSAGE[2][2] = ["一人じゃきついだろこれ。"] E_MESSAGE[2][3] = [["毒、くらった。。。",3]] E_MESSAGE[2][4] = [["どうした?アルシェス",1]] E_MESSAGE[2][5] = ["テゴタエナシ。"] E_MESSAGE[2][11]= ["トドメ、ゲット!"] # 戦闘終了時のメッセージ優先順位設定 # E_PRIORITY = [メッセージタイプ,・・・・・・] # ※[]で囲むと同じ優先順位になります。 E_PRIORITY = [12,8,7,10,1,[3,5,6,2,4,0,9,11]] # 12→8→7→10→1→3,5,6,2,4,0,9 #============================================================================== # カスタマイズEND #============================================================================== # 全員メッセージで使用可能なメッセージタイプ(変更不可) ALL_MES_TYPE = [0,8,9,12] end class Scene_Battle #-------------------------------------------------------------------------- # ● メイン処理 #-------------------------------------------------------------------------- alias main_battle_message main def main # トドメを指したバトラー @last_attacker = nil # 開始時メッセージ有効 if Battle_Message::B_START @b_start_message = false @show_start_message = false else @b_start_message = true end # 終了時メッセージ有効 if Battle_Message::B_END @b_end_message = false @show_end_message = false else @b_end_message = true end @message_cnt = 0 main_battle_message end #============================================================================== # 戦闘開始メッセージ #============================================================================== #-------------------------------------------------------------------------- # ● フレーム更新 (プレバトルフェーズ) #-------------------------------------------------------------------------- alias update_phase1_battle_message update_phase1 def update_phase1 if !@b_start_message @message_cnt = 0 while 0 # ゲーム画面を更新 Graphics.update # 入力情報を更新 Input.update # スプライト情報更新 @spriteset.update if !@show_start_message # メッセージ表示 ret = open_start_battle_message break if !ret end # 自動消去 if Battle_Message::AUTO_ERASE and @show_start_message @message_cnt += 1 if @message_cnt > Battle_Message::ERASE_TIME # メッセージ消去 close_start_battle_message break end end # キー入力によるメッセージ消去 if Input.trigger?(Input::C) and @show_start_message # 決定 SE を演奏 $game_system.se_play($data_system.decision_se) # メッセージ消去 close_start_battle_message break end end end update_phase1_battle_message end #-------------------------------------------------------------------------- # ● 開始時メッセージ表示 #-------------------------------------------------------------------------- def open_start_battle_message @show_start_message = true # メッセージ表示強制無効化 if $game_switches[Battle_Message::STA_MES_OFF_SW] $game_switches[Battle_Message::STA_MES_OFF_SW] = false @b_start_message = false return false end # 表示メッセージを決定 select_message = rand_message(Battle_Message::S_MESSAGE) if select_message == "" @b_start_message = false return false end @help_window.set_text(select_message, Battle_Message::MES_ALIGN) @help_window.visible = true return true end #-------------------------------------------------------------------------- # ● 開始時メッセージ消去 #-------------------------------------------------------------------------- def close_start_battle_message @help_window.visible = false @b_start_message = false end #============================================================================== # 戦闘終了メッセージ #============================================================================== #-------------------------------------------------------------------------- # ● アフターバトルフェーズ開始 #-------------------------------------------------------------------------- alias start_phase5_battle_message start_phase5 def start_phase5 start_phase5_battle_message # リザルトウィンドウはいったん消す @result_window.visible = false if !@b_end_message @message_cnt = 0 while 0 # ゲーム画面を更新 Graphics.update # 入力情報を更新 Input.update # スプライト情報更新 @spriteset.update if !@show_end_message # メッセージ表示 ret = open_end_battle_message break if !ret end # 自動消去 if Battle_Message::AUTO_ERASE and @show_end_message @message_cnt += 1 if @message_cnt > Battle_Message::ERASE_TIME # メッセージ消去 close_end_battle_message break end end # キー入力によるメッセージ消去 if Input.trigger?(Input::C) and @show_end_message # 決定 SE を演奏 $game_system.se_play($data_system.decision_se) # メッセージ消去 close_end_battle_message break end end end # リザルトウィンドウを表示 @result_window.visible = true end #-------------------------------------------------------------------------- # ● 終了時メッセージ表示 #-------------------------------------------------------------------------- def open_end_battle_message @show_end_message = true # メッセージ表示強制無効化 if $game_switches[Battle_Message::END_MES_OFF_SW] $game_switches[Battle_Message::END_MES_OFF_SW] = false @b_start_message = false return false end # 表示メッセージを決定 select_message = rand_message(Battle_Message::E_MESSAGE) if select_message == "" @b_end_message = false return false end @help_window.set_text(select_message, Battle_Message::MES_ALIGN) @help_window.visible = true return true end #-------------------------------------------------------------------------- # ● 終了時メッセージ消去 #-------------------------------------------------------------------------- def close_end_battle_message @help_window.visible = false @b_end_message = false end #============================================================================== # 汎用メッセージ抽出処理(戦闘開始/戦闘終了で処理を共通化) #============================================================================== #-------------------------------------------------------------------------- # ● メッセージ選択処理(戦闘開始/戦闘終了の差異を包含させるメソッド) #-------------------------------------------------------------------------- def rand_message(message_set) # メッセージ優先順位の確定 if message_set == Battle_Message::S_MESSAGE priority = Battle_Message::S_PRIORITY elsif message_set == Battle_Message::E_MESSAGE priority = Battle_Message::E_PRIORITY else p "err:message pattern" return "" # ありえない; end # メッセージ発信者=トドメを指したアクターに固定化(戦闘終了時のみ) if Battle_Message::LAST_ACTOR and message_set == Battle_Message::E_MESSAGE and !@last_attacker.nil? actor = @last_attacker # メッセージ抽出処理 mes_box = priority_message(actor, message_set[actor.id], priority) # 空メッセージならパーティーからランダムに抽出 if mes_box.nil? ret_act_mes = party_priority_message(message_set, priority) return "" if ret_act_mes.nil? # 空メッセージ else ret_act_mes = [] # 後処理の共有化 # 表示メッセージ発信者を定義 ret_act_mes[0] = actor.name # メッセージ抽出 ret_act_mes[1] = mes_box[rand(mes_box.size)] end else # パーティーからランダムに抽出 ret_act_mes = party_priority_message(message_set, priority) return "" if ret_act_mes.nil? # 空メッセージ end actor_name = ret_act_mes[0] # アクター抽出 ret_mes = ret_act_mes[1] # メッセージ抽出 # メッセージパッケージ化 if Battle_Message::AUTO_NAME ret_mes = actor_name + "「" + ret_mes + "」" end return ret_mes end #-------------------------------------------------------------------------- # ● メッセージ優先順位を考慮したメッセージ取得(特定アクター用) #-------------------------------------------------------------------------- def priority_message(actor, actor_message, priority) ret_mes = [] for i in 0...priority.size if priority[i].is_a?(Integer) ret_mes = get_mes_type(actor, priority[i], ret_mes, actor_message) else # 同一優先順位のメッセージ取得 for j in 0...priority[i].size ret_mes = get_mes_type(actor, priority[i][j], ret_mes, actor_message) end end # 抽出完了 break if ret_mes != [] end return nil if ret_mes == [] # 空メッセージ→エラー変換 return ret_mes end #-------------------------------------------------------------------------- # ● メッセージ優先順位を考慮したメッセージ取得(パーティー用) #-------------------------------------------------------------------------- def party_priority_message(message_set, priority) ret_mes = nil for i in 0...priority.size if priority[i].is_a?(Integer) ret_mes = get_party_message(message_set, priority[i]) else same_p_mes = [] index_cnt = 0 # 同一優先順位のメッセージ取得 for j in 0...priority[i].size message_r = get_party_message(message_set, priority[i][j]) unless message_r.nil? same_p_mes[index_cnt] = message_r.dup index_cnt += 1 end end # メッセージ有り if same_p_mes != [] # 同一優先順位の内、どれかのメッセージを入れる ret_mes = same_p_mes[rand(same_p_mes.size)] break end end # 抽出完了 break unless ret_mes.nil? end # ランダムにメッセージを抽出する unless ret_mes.nil? ret_mes = ret_mes[rand(ret_mes.size)] end return ret_mes end #-------------------------------------------------------------------------- # ● メッセージタイプに応じてパーティー内からメッセージを抽出 #-------------------------------------------------------------------------- def get_party_message(message_set, mes_type) # メッセージ抽出のためのダミーパーティ dummy_party = $game_party.actors.dup # 返却用メッセージボックス:[名前,メッセージ]の型でpushすること。 ret_mes = [] # 全員メッセージ取得 all_mes = get_all_party_message(message_set, mes_type) # メッセージがあれば入れる unless all_mes.nil? ret_mes.push(all_mes) end # アクター個別のメッセージを抽出 for i in 0...$game_party.actors.size # メッセージを抽出するアクターを決定 actor = dummy_party[i] message_actor = message_set[actor.id] # 戦闘不能ならメッセージ不可 if message_actor.nil? or actor.dead? next end # メッセージの抽出 mes_box = get_actor_message(actor, message_actor, mes_type) # メッセージがあれば入れる unless mes_box.nil? ret_mes.push(mes_box.dup) end end # 検出失敗 return nil if ret_mes == [] # 名前付きの配列を返却 return ret_mes end #-------------------------------------------------------------------------- # ● 全員用メッセージ取得 #-------------------------------------------------------------------------- def get_all_party_message(message_set, mes_type) # 規定外のメッセージタイプは無効(エラーの元回避) return nil unless Battle_Message::ALL_MES_TYPE.include?(mes_type) # 一人なら無視 person = 0 for actor in $game_party.actors person += 1 unless actor.dead? end return nil if person == 1 # 全員メッセージをあらかじめ入手(引数'actor'にはnilを入れておく) all_mes = get_mes_type(nil, mes_type, [], message_set[0]) # 抽出成功 if all_mes != [] # 複数メッセージが存在する場合 if all_mes.size != 1 # メッセージは1つに絞っておく all_mes = [all_mes[rand(all_mes.size)]] end # 返却用メッセージボックス構造体に入れて返す return [Battle_Message::ALL_NAME, all_mes[0]] end return nil end #-------------------------------------------------------------------------- # ● 個人用メッセージ取得 #-------------------------------------------------------------------------- def get_actor_message(actor, message_actor, mes_type) actor_mes = get_mes_type(actor, mes_type, [], message_actor) # 抽出成功 if actor_mes != [] # 複数メッセージが存在する場合 if actor_mes.size != 1 # メッセージは1つに絞っておく actor_mes = [actor_mes[rand(actor_mes.size)]] end # 返却用メッセージボックス構造体に入れて返す return [actor.name, actor_mes[0]] end return nil end #-------------------------------------------------------------------------- # ● メッセージタイプに応じたメッセージ取得 #-------------------------------------------------------------------------- def get_mes_type(actor, mes_type, ret_mes, message_actor) case mes_type when 0 # 通常 return push_message(ret_mes, message_actor[mes_type]) when 1 # ピンチ if actor.hp < (actor.maxhp * Battle_Message::PINCH_HP / 100) return push_message(ret_mes, message_actor[mes_type]) end when 2 # 独り言 if $game_party.actors.size == 1 return push_message(ret_mes, message_actor[mes_type]) end when 3 # 特定ステート message_state = message_actor[mes_type] for i in 0...message_state.size break if message_state.nil? actor_state = $game_party.actors[message_state[i][1]] if actor.state?(message_state[i][1]) ret_mes.push(message_state[i][0]) end end when 4 # 特定アクター message_cross = message_actor[mes_type] for i in 0...message_cross.size break if message_cross.nil? cross_actor = $game_actors[message_cross[i][1]] if $game_party.actors.include?(cross_actor) and !cross_actor.dead? ret_mes.push(message_cross[i][0]) end end when 5 # ザコ enemy_level = 0 for i in 0...$game_troop.enemies.size enemy_id = $game_troop.enemies[i].id level = Enemy_Level::ENEMY_LEVEL[enemy_id] next if level.nil? if enemy_level < level enemy_level = level end end level_def = actor.level - enemy_level if level_def > Battle_Message::LEVEL_DEF return push_message(ret_mes, message_actor[mes_type]) end when 6 # 強敵 enemy_level = 0 for i in 0...$game_troop.enemies.size enemy_id = $game_troop.enemies[i].id level = Enemy_Level::ENEMY_LEVEL[enemy_id] next if level.nil? if enemy_level < level enemy_level = level end end level_def = enemy_level - actor.level if level_def > Battle_Message::LEVEL_DEF return push_message(ret_mes, message_actor[mes_type]) end when 7 # レベルアップ for i in 0...$game_party.actors.size if actor == $game_party.actors[i] actor_index = i end end if @status_window.actor_level_up?(actor_index) return push_message(ret_mes, message_actor[mes_type]) end when 8 # 特定エネミー(ボス) message_enemy = message_actor[mes_type] unless message_enemy.nil? for i in 0...$game_troop.enemies.size enemy_id = $game_troop.enemies[i].id for j in 0...message_enemy.size if enemy_id == message_enemy[j][1] ret_mes.push(message_enemy[j][0]) end end end end when 9 # 特定エネミー(ザコ) message_enemy = message_actor[mes_type] unless message_enemy.nil? for i in 0...$game_troop.enemies.size enemy_id = $game_troop.enemies[i].id for j in 0...message_enemy.size if enemy_id == message_enemy[j][1] ret_mes.push(message_enemy[j][0]) end end end end when 10 # 単独戦闘突入/単独勝利 if $game_party.actors.size > 1 counter = 0 for i in 0...$game_party.actors.size actor = $game_party.actors[i] if !actor.dead? counter += 1 end end if counter == 1 return push_message(ret_mes, message_actor[mes_type]) end end when 11 # トドメを指す if !@last_attacker.nil? and actor.id == @last_attacker.id return push_message(ret_mes, message_actor[mes_type]) end when 12 # 特定トループ message_troop = message_actor[mes_type] unless message_troop.nil? for i in 0...message_troop.size if $game_temp.battle_troop_id == message_troop[i][1] ret_mes.push(message_troop[i][0]) end end end else p "error:message type" end return ret_mes end #-------------------------------------------------------------------------- # ● 文字配列合成処理 #-------------------------------------------------------------------------- def push_message(ret_mes, message) for i in 0...message.size ret_mes.push(message[i]) end return ret_mes end end class Window_BattleStatus < Window_Base #-------------------------------------------------------------------------- # ● レベルアップフラグの確認 # actor_index : アクターインデックス #-------------------------------------------------------------------------- def actor_level_up?(actor_index) return @level_up_flags[actor_index] end end #============================================================================== # ■ Game_Troop #============================================================================== class Game_Troop #-------------------------------------------------------------------------- # ● 行動可能なエネミーの取得 #-------------------------------------------------------------------------- def all_dead? for enemy in @enemies return false unless enemy.dead? end return true end end class Scene_Battle #-------------------------------------------------------------------------- # ● フレーム更新 (メインフェーズ ステップ 2 : アクション開始) #-------------------------------------------------------------------------- alias update_phase4_step2_last_battler update_phase4_step2 def update_phase4_step2 @last_attacker = nil update_phase4_step2_last_battler end #-------------------------------------------------------------------------- # ● フレーム更新 (メインフェーズ ステップ 5 : ダメージ表示) #-------------------------------------------------------------------------- alias update_phase4_step5_last_battler update_phase4_step5 def update_phase4_step5 # 生存バトラーがいない場合、行動したバトラーを記憶 if @active_battler.is_a?(Game_Actor) and $game_troop.all_dead? @last_attacker = @active_battler.dup end update_phase4_step5_last_battler end end