#============================================================================== # ++ アクティブタイムバトル ver. 2.60 ++ #  Script by パラ犬 #  http://2d6.parasite.jp/ #------------------------------------------------------------------------------ # CTゲージが溜まったバトラーから順にコマンド入力する戦闘形式。 # バトルステータス画面をサイドビューらしくする機能もあります。 # バトラーをサイドビュータイプに表示するスクリプトは、お好きなものを # 用意してください。 #------------------------------------------------------------------------------ #[設置上の注意] # 戦闘拡張系スクリプトを併用するときは、 # できるだけこのスクリプトより下に置いてください。 #------------------------------------------------------------------------------ #[操作] #・逃走 # 味方バトラーの一人以上がコマンド入力待ちのときにキャンセルボタンを押すことで # 「逃げる」コマンドが選択できます。 # 敵の数が多かったり、コマンド入力待ちのバトラーが少ないと、 # 逃走成功率が低くなります。 # #・行動順の入れ替え # 複数のバトラーが行動可能のとき、 # Rボタン(PageDownキー)で次のバトラーと順番を入れ替え、 # Lボタン(PageUpキー)で行動順をいちばん最後に回します。(ボタン変更可) #============================================================================== module PARA_CTB # コマンド入力時にCTのカウントを止めるか(true:止める / false:止めない) COMMAND_WAIT = false # アイテム、スキル、ターゲット選択時にCTのカウントを止めるか(true:止める / false:止めない) SELECT_WAIT = true # アニメーション表示時にCTのカウントを止めるか(true:止める / false:止めない) ANIMATION_WAIT = false # バトルスピード(数値が大きいほどCTの溜まりが速くなる) BATTLE_SPEED = 3 # バトルメンバーの最大数(多人数PTスクリプトを導入している時に設定) PARTY_SIZE = 4 # 行動終了時のCT減少パーセンテージ ACT_ATTACK_CT = 100 # 通常攻撃 ACT_GUARD_CT = 100 # 防御 ACT_ESCAPE_CT = 100 # 逃走失敗 ACT_SKILL_CT = 100 # スキル ACT_ITEM_CT = 100 # アイテム # 逃走失敗時のメッセージ UNESCAPE_MES = "逃走失敗" # CT満タン時の効果音(""で音を鳴らさない) # 効果音は「Audio/SE」フォルダ内 FULL_CT_SE = "015-Jump01" # 効果音のボリューム FULL_CT_SE_VOL = 80 # CT満タン時のバトラーの色調((0,0,0)で変化なし) FULL_CT_COLOR = Tone.new(32,0,0) # HPゲージの色(グラデーション左端) HP_COLOR_LEFT = Color.new(128, 0, 0, 255) # HPゲージの色(グラデーション右端) HP_COLOR_RIGHT= Color.new(255, 0, 0, 255) # SPゲージの色(グラデーション左端) SP_COLOR_LEFT = Color.new(0, 0, 128, 255) # SPゲージの色(グラデーション右端) SP_COLOR_RIGHT= Color.new(0, 0, 255, 255) # CTゲージの色(グラデーション左端) COLOR_LEFT = Color.new(128, 128, 64, 255) # CTゲージの色(グラデーション右端) COLOR_RIGHT= Color.new(255, 255, 128, 255) # CTが満タンになったときのゲージの色 COLOR_FULL = Color.new(255, 225, 128, 255) # ゲージ枠の色 FRAME_COLOR = Color.new(192, 192, 192, 255) # ゲージ枠の太さ FRAME_BORDER = 1 # ゲージの背景色 BACK_COLOR = Color.new(128, 128, 128, 128) # 名前のフォントサイズ NAME_FONT_SIZE = 16 # HP/SPのフォントサイズ HPSP_FONT_SIZE = 18 # エネミー名のフォントサイズ ENEMY_FONT_SIZE = 16 # 最大HP/SPを描画するか( true / false ) MAX_DRAW = false # エネミー名をグループ化( true / false ) # (trueにすると「ゴースト 2」のようにまとめて表示します) ENEMY_GROUPING = false # エネミー名の下にゲージを表示( 0:なし / 1:HP / 2:CT ) # (エネミー名をグループ化している場合は無効) ENEMY_DRAWING_MATER = 0 # アクターのヘルプウインドウにHP/SPゲージを表示( true / false ) HELP_DRAWING_MATER_ACTOR = false # エネミーのヘルプウインドウにHP/SPゲージを表示( true / false ) HELP_DRAWING_MATER_ENEMY = false # コマンドウインドウの位置を強制指定( true / false ) #(他の方のサイドビュースクリプトを併用していて # コマンドウインドウの位置がどうしても不自然になるならtrueに) # ※trueにしても適用されない場合、このスクリプトを #  サイドビューよりも下に置いてみてください WINDOWPOS_CHANGE = false WINDOWPOS_X = 100 # X座標 WINDOWPOS_Y = 320 # Y座標 # コマンドウインドウの不透明度 WINDOW_OPACITY = 160 # CTのカウント間隔。少ないほどゲージ描画がなめらかに。(最小値は0) # 処理が重い場合は、この数値を上げてください。 CT_SKIP = 2 # 逃走成功率補正。数値を大きくすると逃走しやすくなります。(最小値は0) # 敵味方の敏捷値合計が同じとき、[数値]×10%の確率で逃走が成功します。 # 11にすると敏捷値にかかわらず確実に成功します。 ESCAPEABLE = 5 # 行動順入れ替えボタン(表記方法は、Input::(ボタン)) #(キーボードとの対応表はツクールのヘルプにあります) CHANGE_NEXT = Input::R # 次のバトラーと順番を入れ替え CHANGE_LAST = Input::L # 行動順を最後に回す end # ↑ 設定項目ここまで #------------------------------------------------------------------------------ #============================================================================== # ■ Scene_Battle #============================================================================== class Scene_Battle #-------------------------------------------------------------------------- # ○ CTのカウント #-------------------------------------------------------------------------- def update_ct # カウントアップが許可されているとき if @countup for actor in $game_party.actors # 行動できるか if actor.movable? == false and actor.ct_visible and @phase4_step != 5 # 不可視状態でカウントアップ actor.ct_visible = false actor.countup = true actor.full_ct = false elsif actor.movable? and actor.ct_visible == false # 不可視カウントアップを解除 clear_ct(actor) actor.ct_visible = true end # アクターの入れ替えに対応 if actor.max_ct == 0 actor.max_ct = @max_ct end # アクターのカウントアップ if actor.countup # CTがmaxになっており、コマンド入力待ちアクターに含まれない if actor.now_ct >= @max_ct and !(@pre_action_battlers.include?(actor)) # コマンド入力待ちアクターに追加 @pre_action_battlers.push(actor) @action_count += 1 # 効果音を鳴らす if PARA_CTB::FULL_CT_SE != "" and actor.ct_visible Audio.se_play("Audio/SE/" + PARA_CTB::FULL_CT_SE,PARA_CTB::FULL_CT_SE_VOL) end # それ以上カウントアップしない actor.countup = false actor.full_ct = true else # カウントアップ actor.make_action_speed ct_skip = PARA_CTB::CT_SKIP + 1 actor.now_ct += actor.current_action.speed * PARA_CTB::BATTLE_SPEED * ct_skip end end end for enemy in $game_troop.enemies # 行動できるか if enemy.movable? == false and enemy.ct_visible and @phase4_step == 5 # 不可視状態でカウントアップ enemy.ct_visible = false enemy.countup = true enemy.full_ct = false elsif enemy.movable? and enemy.ct_visible == false # 不可視カウントアップを解除 clear_ct(enemy) enemy.ct_visible = true end # エネミーのカウントアップ if enemy.countup # CTがmaxになっており、行動待ちエネミーに含まれない if enemy.now_ct >= @max_ct and ! @pre_action_battlers.include?(enemy) # 行動待ちエネミーに追加 @pre_action_battlers.push(enemy) @action_count += 1 # それ以上カウントアップしない enemy.countup = false enemy.full_ct = true else # カウントアップ enemy.make_action_speed enemy.now_ct += enemy.current_action.speed * PARA_CTB::BATTLE_SPEED end end end # CTゲージを再描画 @status_window.refresh_ct @status_window2.refresh_ct end end #-------------------------------------------------------------------------- # ○ バトラーのCTを0に #-------------------------------------------------------------------------- def clear_ct(battler) battler.countup = true battler.now_ct = 0 battler.full_ct = false end #-------------------------------------------------------------------------- # ○ バトラーのCTを任意のパーセンテージに #-------------------------------------------------------------------------- def declease_ct(battler,percent) battler.countup = true battler.now_ct = battler.now_ct * percent / 100 battler.full_ct = false end #-------------------------------------------------------------------------- # ○ CTの初期化 #-------------------------------------------------------------------------- def initialize_ct # CTの基準値を決定 max_ct for battler in $game_party.actors + $game_troop.enemies if battler.movable? # 戦闘開始時にある程度のCTを溜めておく battler.now_ct = battler.agi * 300 battler.ct_visible = true else clear_ct(battler) battler.ct_visible = false end battler.countup = true battler.full_ct = false battler.max_ct = @max_ct end end #-------------------------------------------------------------------------- # ○ バトラー全員の素早さからCTの基準値を決定 #-------------------------------------------------------------------------- def max_ct for battler in $game_party.actors + $game_troop.enemies @max_ct += battler.agi end @max_ct = @max_ct * 500 / ($game_party.actors.size + $game_troop.enemies.size ) end #-------------------------------------------------------------------------- # ○ バトラーの行動順を変更 #-------------------------------------------------------------------------- def shift_activer(shift) # 一つシフトする時で後ろのアクターが2人以上 if @pre_action_battlers != nil if shift == 1 and @pre_action_battlers.size >= @actor_array_index + 3 # 現在のアクターを取得 act = @pre_action_battlers[@actor_array_index] # 現在のアクターを二つ後ろに挿入 @pre_action_battlers.insert(@actor_array_index+2, act) # 現在位置を消去 @pre_action_battlers.delete_at(@actor_array_index) @actor_array_index -= 1 phase3_next_actor else act = @pre_action_battlers[@actor_array_index] # 現在のアクターを一番後ろに追加 @pre_action_battlers.push(act) # 現在位置を消去 @pre_action_battlers.delete_at(@actor_array_index) @actor_array_index -= 1 phase3_next_actor end end end #-------------------------------------------------------------------------- # ● メイン処理 #-------------------------------------------------------------------------- alias main_ctb main def main # エネミー名ウインドウを作成 @status_window2 = Window_BattleStatus_enemy.new @action_battlers = [] @pre_action_battlers = [] @max_ct = 0 @countup = false @ct_wait = 0 @action_count = 0 main_ctb # エネミー名ウインドウを破棄 @status_window2.dispose end #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- alias ctb_update update def update # バトルイベント実行中の場合 if $game_system.battle_interpreter.running? # インタプリタを更新 $game_system.battle_interpreter.update # アクションを強制されているバトラーが存在しない場合 if $game_temp.forcing_battler == nil # バトルイベントの実行が終わった場合 unless $game_system.battle_interpreter.running? # 戦闘継続の場合、バトルイベントのセットアップを再実行 unless judge setup_battle_event end end # アフターバトルフェーズでなければ if @phase != 5 # ステータスウィンドウをリフレッシュ @status_window.refresh # エネミー名リストを更新 @status_window2.refresh end end else if @ct_wait > 0 @ct_wait -= 1 else update_ct @ct_wait = PARA_CTB::CT_SKIP end end ctb_update end #-------------------------------------------------------------------------- # ● プレバトルフェーズ開始 #-------------------------------------------------------------------------- alias ctb_start_phase1 start_phase1 def start_phase1 # CTを初期化 initialize_ct # カウントアップ開始 @countup = true ctb_start_phase1 end #-------------------------------------------------------------------------- # ● フレーム更新 (プレバトルフェーズ) #-------------------------------------------------------------------------- def update_phase1 # エネミー名リストを更新 @status_window2.refresh # 勝敗判定 if judge # 勝利または敗北の場合 : メソッド終了 return end # パーティーコマンドフェーズを飛ばしてアクターコマンドフェーズ開始 start_phase3 end #-------------------------------------------------------------------------- # ● パーティコマンドフェーズ開始 #-------------------------------------------------------------------------- def start_phase2 # フェーズ 2 に移行 @phase = 2 # アクターを非選択状態に設定 @actor_index = -1 @active_battler = nil # パーティコマンドウィンドウを有効化 @party_command_window.active = true @party_command_window.visible = true # アクターコマンドウィンドウを無効化 @actor_command_window.active = false @actor_command_window.visible = false # メインフェーズフラグをクリア $game_temp.battle_main_phase = false # コマンド入力不可能な場合 unless $game_party.inputable? # メインフェーズ開始 start_phase4 end end #-------------------------------------------------------------------------- # ● フレーム更新 (パーティコマンドフェーズ : 逃げる) #-------------------------------------------------------------------------- def update_phase2_escape # エネミーの素早さ合計を計算 enemies_agi = 0 for enemy in $game_troop.enemies if enemy.exist? enemies_agi += enemy.agi end end # 行動可能アクターの素早さ合計を計算 actors_agi = 0 for actor in @pre_action_battlers if actor.is_a?(Game_Actor) and actor.exist? actors_agi += actor.agi end end # 逃走成功判定 if PARA_CTB::ESCAPEABLE < 11 success = rand(100) < PARA_CTB::ESCAPEABLE * 10 * actors_agi / enemies_agi else success = true end # 逃走成功の場合 if success # 逃走 SE を演奏 $game_system.se_play($data_system.escape_se) # バトル開始前の BGM に戻す $game_system.bgm_play($game_temp.map_bgm) # CTをクリア for battler in $game_party.actors clear_ct(battler) end # バトル終了 battle_end(1) # 逃走失敗の場合 else # ヘルプウィンドウに "逃走失敗" をセット @help_window.set_text(PARA_CTB::UNESCAPE_MES, 1) # アクターのアクションとCTをクリア pre_action_battlers = @pre_action_battlers.clone for act in pre_action_battlers if act.is_a?(Game_Actor) declease_ct(act, 100-PARA_CTB::ACT_ESCAPE_CT) act.current_action.clear @pre_action_battlers.delete(act) end end @party_command_window.visible = false # ヘルプウィンドウを表示 @help_window.visible = true @wait_count = 20 # メインフェーズ開始 start_phase4 end end #-------------------------------------------------------------------------- # ● アクターコマンドフェーズ開始 #-------------------------------------------------------------------------- def start_phase3 # フェーズ 3 に移行 @phase = 3 # アクターを非選択状態に設定 @actor_index = -1 @active_battler = nil @actor_array_index = -1 # 次のアクターのコマンド入力へ if @pre_action_battlers != [] phase3_next_actor else start_phase4 end end #-------------------------------------------------------------------------- # ● 次のアクターのコマンド入力へ #-------------------------------------------------------------------------- def phase3_next_actor # ループ begin # アクターの明滅エフェクト OFF if @active_battler != nil @active_battler.blink = false end # 最後のアクターの場合 if @actor_array_index + 1 >= @pre_action_battlers.size # メインフェーズ開始 start_phase4 return #次がエネミーの場合 elsif $game_troop.enemies.include?(@pre_action_battlers[@actor_array_index + 1]) # メインフェーズ開始 start_phase4 return end # アクターのインデックスを進める @actor_array_index += 1 @actor_index = @pre_action_battlers[@actor_array_index].index @active_battler = $game_party.actors[@actor_index] # バトルイベントが予約されている場合 if @active_battler.current_action.forcing # メインフェーズ開始 start_phase4 return end @active_battler.blink = true @active_battler.current_action.clear # アクターがコマンド入力を受け付けない状態ならもう一度 end until @active_battler.inputable? # アクターコマンドウィンドウをセットアップ phase3_setup_command_window end #-------------------------------------------------------------------------- # ● 前のアクターのコマンド入力へ #-------------------------------------------------------------------------- def phase3_prior_actor # ループ begin # アクターの明滅エフェクト OFF if @active_battler != nil @active_battler.blink = false end # 最初のアクターの場合 if @actor_array_index <= 0 # アクターコマンドフェーズ開始 start_phase2 return end # アクターのインデックスを戻す @actor_array_index -= 1 @actor_index = @pre_action_battlers[@actor_array_index].index @active_battler = $game_party.actors[@actor_index] @active_battler.blink = true @active_battler.current_action.clear # アクターがコマンド入力を受け付けない状態ならもう一度 end until @active_battler.inputable? # アクターコマンドウィンドウをセットアップ phase3_setup_command_window end #-------------------------------------------------------------------------- # ● アクターコマンドウィンドウのセットアップ #-------------------------------------------------------------------------- alias phase3_setup_command_window_ctb phase3_setup_command_window def phase3_setup_command_window @actor_command_window.back_opacity = PARA_CTB::WINDOW_OPACITY phase3_setup_command_window_ctb if PARA_CTB::WINDOWPOS_CHANGE # アクターコマンドウィンドウの位置を設定 @actor_command_window.x = PARA_CTB::WINDOWPOS_X @actor_command_window.y = PARA_CTB::WINDOWPOS_Y # ステータスウインドウに隠れないように @actor_command_window.z = 9999 end end #-------------------------------------------------------------------------- # ● フレーム更新 (アクターコマンドフェーズ) #-------------------------------------------------------------------------- def update_phase3 # エネミーアローが有効の場合 if @enemy_arrow != nil @countup = PARA_CTB::SELECT_WAIT ? false : true update_phase3_enemy_select # アクターアローが有効の場合 elsif @actor_arrow != nil @countup = PARA_CTB::SELECT_WAIT ? false : true update_phase3_actor_select # スキルウィンドウが有効の場合 elsif @skill_window != nil @countup = PARA_CTB::SELECT_WAIT ? false : true update_phase3_skill_select # アイテムウィンドウが有効の場合 elsif @item_window != nil @countup = PARA_CTB::SELECT_WAIT ? false : true update_phase3_item_select # アクターコマンドウィンドウが有効の場合 elsif @actor_command_window.active @countup = PARA_CTB::COMMAND_WAIT ? false : true update_phase3_basic_command end end #-------------------------------------------------------------------------- # ● フレーム更新 (アクターコマンドフェーズ : 基本コマンド) #-------------------------------------------------------------------------- alias ctb_update_phase3_basic_command update_phase3_basic_command def update_phase3_basic_command ctb_update_phase3_basic_command # LRボタンで行動順を変更 if Input.trigger?(PARA_CTB::CHANGE_NEXT) shift_activer(1) end if Input.trigger?(PARA_CTB::CHANGE_LAST) shift_activer(-1) end end #-------------------------------------------------------------------------- # ● メインフェーズ開始 #-------------------------------------------------------------------------- def start_phase4 # フェーズ 4 に移行 @phase = 4 battler_count = $game_party.actors.size + $game_troop.enemies.size if @action_count >= battler_count or $game_temp.battle_turn == 0 # バトルイベントの全ページを検索 for index in 0...$data_troops[@troop_id].pages.size # イベントページを取得 page = $data_troops[@troop_id].pages[index] # このページのスパンが [ターン] の場合 if page.span == 1 # 実行済みフラグをクリア $game_temp.battle_event_flags[index] = false end end # ターン数カウント $game_temp.battle_turn += 1 @action_count = 0 end # アクターを非選択状態に設定 @actor_index = -1 @active_battler = nil # パーティコマンドウィンドウを有効化 @party_command_window.active = false @party_command_window.visible = false # アクターコマンドウィンドウを無効化 @actor_command_window.active = false @actor_command_window.visible = false # メインフェーズフラグをセット $game_temp.battle_main_phase = true # エネミーアクション作成 for enemy in $game_troop.enemies unless enemy.current_action.forcing enemy.make_action end end # 行動順序作成 make_action_orders # ステップ 1 に移行 @phase4_step = 1 end #-------------------------------------------------------------------------- # ● 行動順序作成 #-------------------------------------------------------------------------- def make_action_orders # 配列 @action_battlers を初期化 @action_battlers = [] if @pre_action_battlers != [] for i in 0..@actor_array_index # アクターを配列 @action_battlers に追加 @action_battlers.push(@pre_action_battlers[0]) @pre_action_battlers.shift end if @pre_action_battlers.size != 0 loop do if $game_troop.enemies.include?(@pre_action_battlers[0]) # エネミーを配列 @action_battlers に追加 @action_battlers.push(@pre_action_battlers[0]) @pre_action_battlers.shift else break end end end end end #-------------------------------------------------------------------------- # ● フレーム更新 (メインフェーズ ステップ 1 : アクション準備) #-------------------------------------------------------------------------- alias ctb_update_phase4_step1 update_phase4_step1 def update_phase4_step1 @countup = true # ヘルプウィンドウを隠す @help_window.visible = false # 勝敗判定 if judge # 勝利または敗北の場合 : メソッド終了 return end # 未行動バトラーが存在しない場合 (全員行動した) if @action_battlers.size == 0 # アクターコマンドフェーズ開始 start_phase3 return end ctb_update_phase4_step1 end #-------------------------------------------------------------------------- # ● フレーム更新 (メインフェーズ ステップ 2 : アクション開始) #-------------------------------------------------------------------------- alias ctb_update_phase4_step2 update_phase4_step2 def update_phase4_step2 # 強制アクションでなければ unless @active_battler.current_action.forcing # 制約が [行動できない] の場合 if @active_battler.restriction == 4 # CTをクリア clear_ct(@active_battler) # アクション強制対象のバトラーをクリア $game_temp.forcing_battler = nil # ステップ 1 に移行 @phase4_step = 1 return end end # アニメーション再生中にCTをカウントするか @countup = PARA_CTB::ANIMATION_WAIT ? false : true ctb_update_phase4_step2 end #-------------------------------------------------------------------------- # ● 基本アクション 結果作成 #-------------------------------------------------------------------------- alias make_basic_action_result_ctb make_basic_action_result def make_basic_action_result # 何もしないの場合 if @active_battler.current_action.basic == 3 # CTをクリア clear_ct(@active_battler) # アクション強制対象のバトラーをクリア $game_temp.forcing_battler = nil # ステップ 1 に移行 @phase4_step = 1 return end make_basic_action_result_ctb end #-------------------------------------------------------------------------- # ● スキルアクション 結果作成 #-------------------------------------------------------------------------- def make_skill_action_result # スキルを取得 @skill = $data_skills[@active_battler.current_action.skill_id] # 強制アクションでなければ unless @active_battler.current_action.forcing # SP 切れなどで使用できなくなった場合 unless @active_battler.skill_can_use?(@skill.id) # アクション強制対象のバトラーをクリア $game_temp.forcing_battler = nil # CTをクリア declease_ct(@active_battler,100-PARA_CTB::ACT_SKILL_CT) # ステップ 1 に移行 @phase4_step = 1 return end end # SP 消費 @active_battler.sp -= @skill.sp_cost # ステータスウィンドウをリフレッシュ @status_window.refresh # ヘルプウィンドウにスキル名を表示 @help_window.set_text(@skill.name, 1) # アニメーション ID を設定 @animation1_id = @skill.animation1_id @animation2_id = @skill.animation2_id # コモンイベント ID を設定 @common_event_id = @skill.common_event_id # 対象側バトラーを設定 set_target_battlers(@skill.scope) # スキルの効果を適用 for target in @target_battlers target.skill_effect(@active_battler, @skill) end end #-------------------------------------------------------------------------- # ● アイテムアクション 結果作成 #-------------------------------------------------------------------------- alias ctb_make_item_action_result make_item_action_result def make_item_action_result # アイテムを取得 @item = $data_items[@active_battler.current_action.item_id] # アイテム切れなどで使用できなくなった場合 unless $game_party.item_can_use?(@item.id) # CTをクリア declease_ct(@active_battler,100-PARA_CTB::ACT_ITEM_CT) # ステップ 1 に移行 @phase4_step = 1 return end ctb_make_item_action_result end #-------------------------------------------------------------------------- # ● フレーム更新 (メインフェーズ ステップ 5 : ダメージ表示) #-------------------------------------------------------------------------- alias update_phase4_step5_ctb update_phase4_step5 def update_phase4_step5 # ダメージを記録 for target in @target_battlers if target.damage != nil target.movable_backup = target.movable? end end update_phase4_step5_ctb end #-------------------------------------------------------------------------- # ● フレーム更新 (メインフェーズ ステップ 6 : リフレッシュ) #-------------------------------------------------------------------------- alias update_phase4_step6_ctb update_phase4_step6 def update_phase4_step6 @active_battler.countup = true if @active_battler.current_action.basic == 1 # 防御 declease_ct(@active_battler,100-PARA_CTB::ACT_GUARD_CT) else case @active_battler.current_action.kind # 攻撃 when 0 declease_ct(@active_battler,100-PARA_CTB::ACT_ATTACK_CT) # スキル when 1 declease_ct(@active_battler,100-PARA_CTB::ACT_SKILL_CT) # アイテム when 2 declease_ct(@active_battler,100-PARA_CTB::ACT_ITEM_CT) else clear_ct(@active_battler) end end # ターゲットが行動不能になったらCTを0に for target in @target_battlers if target.movable? == false and target.movable_backup == true clear_ct(target) @status_window.refresh_ct end end update_phase4_step6_ctb # エネミー名リストを更新 @status_window2.refresh # アクションをクリア @active_battler.current_action.clear end #-------------------------------------------------------------------------- # ● アフターバトルフェーズ開始 #-------------------------------------------------------------------------- alias ctb_start_phase5 start_phase5 def start_phase5 @countup = false ctb_start_phase5 end end #============================================================================== # ■ Window_BattleStatus #============================================================================== class Window_BattleStatus < Window_Base #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize super(160, 320, 480, 160) self.contents = Bitmap.new(width - 32, height - 32) @level_up_flags = [false, false, false, false] @before_hp = [] @before_sp = [] @before_states = [] @now_hp = [] @now_sp = [] @now_states = [] refresh end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def refresh @item_max = $game_party.actors.size for i in 0...$game_party.actors.size actor = $game_party.actors[i] line_height = 120 / PARA_CTB::PARTY_SIZE actor_y = i * line_height + 4 # 現在のステータスを配列に @now_hp[i] = actor.hp @now_sp[i] = actor.sp @now_states[i] = actor.states # レベルアップ if @level_up_flags[i] self.contents.fill_rect(344, actor_y+14, 100, 8, Color.new(0, 0, 0, 0)) self.contents.font.color = normal_color self.contents.draw_text(344, actor_y, 120, 32, "LEVEL UP!") end end # バトルステータスの軽量化処理 # ステータスの配列が変化したときのみ描画処理 if @before_hp == nil or @before_sp == nil or @before_states == nil or @before_hp != @now_hp or @before_sp != @now_sp or @before_states != @now_states self.contents.clear for j in 0...$game_party.actors.size actor = $game_party.actors[j] line_height = 120 / PARA_CTB::PARTY_SIZE actor_y = j * line_height + 4 self.contents.font.size = PARA_CTB::NAME_FONT_SIZE # 名前を描画 draw_actor_name(actor, 4, actor_y+16-PARA_CTB::NAME_FONT_SIZE) # HPを描画 hp_color1 = PARA_CTB::HP_COLOR_LEFT hp_color2 = PARA_CTB::HP_COLOR_RIGHT draw_meter(actor.hp, actor.maxhp, 125, actor_y+14, 80, 8, hp_color1, hp_color2) draw_actor_hp(actor, 102, actor_y+16-PARA_CTB::HPSP_FONT_SIZE, 100) # SPを描画 sp_color1 = PARA_CTB::SP_COLOR_LEFT sp_color2 = PARA_CTB::SP_COLOR_RIGHT draw_meter(actor.sp, actor.maxsp, 245, actor_y+14, 80, 8, sp_color1, sp_color2) draw_actor_sp(actor, 222, actor_y+16-PARA_CTB::HPSP_FONT_SIZE, 100) # 変化後のステータスを配列に @before_hp[j] = actor.hp @before_sp[j] = actor.sp @before_states[j] = actor.states # レベルアップ if @level_up_flags[j] self.contents.fill_rect(344, actor_y, 100, 8, Color.new(0, 0, 0, 0)) self.contents.font.color = normal_color self.contents.draw_text(344, actor_y, 120, 32, "LEVEL UP!") end end end refresh_ct end #-------------------------------------------------------------------------- # ● CTゲージのリフレッシュ #-------------------------------------------------------------------------- def refresh_ct for i in 0...$game_party.actors.size actor = $game_party.actors[i] line_height = 120 / PARA_CTB::PARTY_SIZE actor_y = i * line_height + 4 # CTが満タンになったときのゲージの色 ct_color_full = PARA_CTB::COLOR_FULL # CTゲージの色(左端) ct_color_start = actor.full_ct ? ct_color_full : PARA_CTB::COLOR_LEFT # CTゲージの色(右端) ct_color_end = actor.full_ct ? ct_color_full : PARA_CTB::COLOR_RIGHT if @level_up_flags[i] != true and actor.ct_visible draw_meter(actor.now_ct, actor.max_ct, 344, actor_y+14, 100, 8, ct_color_start, ct_color_end) elsif @level_up_flags[i] != true draw_meter(0, actor.max_ct, 344, actor_y+14, 100, 8, ct_color_start, ct_color_end) end end end #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- def update super end #-------------------------------------------------------------------------- # ● HP の描画 # actor : アクター # x : 描画先 X 座標 # y : 描画先 Y 座標 # width : 描画先の幅 #-------------------------------------------------------------------------- def draw_actor_hp(actor, x, y, width = 144) # 文字列 "HP" を描画 self.contents.font.color = system_color self.contents.font.size = 16 self.contents.draw_text(x, y+2, 32, 32, $data_system.words.hp) self.contents.font.color = normal_color self.contents.font.size = PARA_CTB::HPSP_FONT_SIZE if PARA_CTB::MAX_DRAW # MaxHP を描画 self.contents.draw_text(x, y, width, 32, actor.maxhp.to_s, 2) text_size = self.contents.text_size(actor.maxhp.to_s) text_x = x + width - text_size.width - 12 self.contents.draw_text(text_x, y, 12, 32, "/", 1) # HP を描画 self.contents.font.color = actor.hp == 0 ? knockout_color : actor.hp <= actor.maxhp / 4 ? crisis_color : normal_color text_x = text_x - text_size.width self.contents.draw_text(text_x, y, text_size.width, 32, actor.hp.to_s, 2) else self.contents.font.color = actor.hp == 0 ? knockout_color : actor.hp <= actor.maxhp / 4 ? crisis_color : normal_color self.contents.draw_text(x, y, width, 32, actor.hp.to_s, 2) end end #-------------------------------------------------------------------------- # ● SP の描画 # actor : アクター # x : 描画先 X 座標 # y : 描画先 Y 座標 # width : 描画先の幅 #-------------------------------------------------------------------------- def draw_actor_sp(actor, x, y, width = 144) # 文字列 "SP" を描画 self.contents.font.color = system_color self.contents.font.size = 16 self.contents.draw_text(x, y+2, 32, 32, $data_system.words.sp) self.contents.font.color = normal_color self.contents.font.size = PARA_CTB::HPSP_FONT_SIZE if PARA_CTB::MAX_DRAW # MaxSP を描画 self.contents.draw_text(x, y, width, 32, actor.maxsp.to_s, 2) text_size = self.contents.text_size(actor.maxsp.to_s) text_x = x + width - text_size.width - 12 self.contents.draw_text(text_x, y, 12, 32, "/", 1) # SP を描画 self.contents.font.color = actor.sp == 0 ? knockout_color : actor.sp <= actor.maxsp / 4 ? crisis_color : normal_color text_x = text_x - text_size.width self.contents.draw_text(text_x, y, text_size.width, 32, actor.sp.to_s, 2) else self.contents.font.color = actor.sp == 0 ? knockout_color : actor.sp <= actor.maxsp / 4 ? crisis_color : normal_color self.contents.draw_text(x, y, width, 32, actor.sp.to_s, 2) end end end #============================================================================== # □ 敵の名前を表示するウインドウ #============================================================================== class Window_BattleStatus_enemy < Window_Base #-------------------------------------------------------------------------- # ○ オブジェクト初期化 #-------------------------------------------------------------------------- def initialize super(0, 320, 160, 160) self.contents = Bitmap.new(width - 32, height - 32) refresh end #-------------------------------------------------------------------------- # ○ リフレッシュ #-------------------------------------------------------------------------- def refresh self.contents.clear self.contents.font.color = normal_color self.contents.font.size = PARA_CTB::ENEMY_FONT_SIZE @exist_enemies = [] if $game_troop.enemies != nil if PARA_CTB::ENEMY_GROUPING ememy_list = [] ememy_list_index = [] # エネミーをグループ化 for i in 0...$game_troop.enemies.size enemy = $game_troop.enemies[i] if enemy.exist? if ememy_list.include?(enemy.name) ememy_list_index[ememy_list.index(enemy.name)] += 1 else # エネミー名を記録 ememy_list.push(enemy.name) ememy_list_index[ememy_list.index(enemy.name)] = 1 end end end # エネミーの名前と数を描画 enemy_index = 0 for enemy_name in ememy_list enemy_y = enemy_index * (PARA_CTB::ENEMY_FONT_SIZE+6) + 4 if ememy_list_index[enemy_index] > 1 enemy_name = enemy_name + " " + ememy_list_index[enemy_index].to_s end self.contents.draw_text(4, enemy_y, 160, 20, enemy_name) enemy_index += 1 end else # エネミーの名前を描画 enemy_index = 0 for i in 0...$game_troop.enemies.size enemy = $game_troop.enemies[i] if enemy.exist? @exist_enemies.push(enemy) line_height = PARA_CTB::ENEMY_FONT_SIZE + 6 if PARA_CTB::ENEMY_DRAWING_MATER != 0 line_height += 10 end enemy_y = enemy_index * line_height + 4 self.contents.draw_text(4, enemy_y, 160, 20, enemy.name) enemy_index += 1 if PARA_CTB::ENEMY_DRAWING_MATER == 1 hp_color1 = PARA_CTB::HP_COLOR_LEFT hp_color2 = PARA_CTB::HP_COLOR_RIGHT y = enemy_y + PARA_CTB::ENEMY_FONT_SIZE + 3 draw_meter(enemy.hp, enemy.maxhp, 4, y, 80, 8, hp_color1, hp_color2) end end end end end refresh_ct end #-------------------------------------------------------------------------- # ● CTゲージのリフレッシュ #-------------------------------------------------------------------------- def refresh_ct if PARA_CTB::ENEMY_DRAWING_MATER == 2 and @exist_enemies != nil enemy_index = 0 for enemy in @exist_enemies line_height = PARA_CTB::ENEMY_FONT_SIZE + 16 enemy_y = enemy_index * line_height + 4 y = enemy_y + PARA_CTB::ENEMY_FONT_SIZE + 3 # CTが満タンになったときのゲージの色 ct_color_full = PARA_CTB::COLOR_FULL # CTゲージの色(左端) ct_color_start = enemy.full_ct ? ct_color_full : PARA_CTB::COLOR_LEFT # CTゲージの色(右端) ct_color_end = enemy.full_ct ? ct_color_full : PARA_CTB::COLOR_RIGHT if enemy.ct_visible draw_meter(enemy.now_ct, enemy.max_ct, 4, y, 100, 8, ct_color_start, ct_color_end) else draw_meter(0, enemy.max_ct, 4, y, 100, 8, ct_color_start, ct_color_end) end enemy_index += 1 end end end end #============================================================================== # ■ Window_Base #============================================================================== class Window_Base < Window #-------------------------------------------------------------------------- # ○ ゲージを描画 #-------------------------------------------------------------------------- def draw_meter(now, max, x, y, width, height, start_color, end_color=start_color ) self.contents.fill_rect(x, y, width, height, PARA_CTB::FRAME_COLOR) self.contents.fill_rect(x+PARA_CTB::FRAME_BORDER, y+PARA_CTB::FRAME_BORDER, width- PARA_CTB::FRAME_BORDER*2, height-PARA_CTB::FRAME_BORDER*2, PARA_CTB::BACK_COLOR) now = now > max ? max : now percentage = max != 0 ? (width-2) * now / max.to_f : 0 if start_color == end_color self.contents.fill_rect(x+1, y+1, percentage, height-2, start_color) else for i in 1..percentage r = start_color.red + (end_color.red - start_color.red) / percentage * i g = start_color.green + (end_color.green - start_color.green) / percentage * i b = start_color.blue + (end_color.blue - start_color.blue) / percentage * i a = start_color.alpha + (end_color.alpha - start_color.alpha) / percentage * i self.contents.fill_rect(x+i, y+1, 1, height-2, Color.new(r, g, b, a)) end end end end #============================================================================== # ■ Game_Battler #============================================================================== class Game_Battler #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_accessor :max_ct attr_accessor :now_ct attr_accessor :full_ct attr_accessor :countup attr_accessor :ct_visible attr_accessor :movable_backup #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- alias ctb_initialize initialize def initialize ctb_initialize @max_ct = 0 @now_ct = 0 @full_ct = false @countup = true @ct_visible = true end end #============================================================================== # ■ Sprite_Battler #============================================================================== class Sprite_Battler < RPG::Sprite #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- alias ctb_update update def update ctb_update if @battler != nil if @battler.full_ct and @battler.ct_visible # CTが溜まったバトラーの色調を変化させる fullct_color = PARA_CTB::FULL_CT_COLOR self.tone = fullct_color else fullct_color = Tone.new(0,0,0) self.tone = fullct_color end end end end #============================================================================== # ■ Window_Help #============================================================================== class Window_Help < Window_Base #-------------------------------------------------------------------------- # ● アクター設定 # actor : ステータスを表示するアクター #-------------------------------------------------------------------------- alias set_actor_ctb set_actor def set_actor(actor) if PARA_CTB::HELP_DRAWING_MATER_ACTOR self.contents.clear draw_actor_name(actor, 4, 0) draw_actor_state(actor, 140, 0) hp_color1 = PARA_CTB::HP_COLOR_LEFT hp_color2 = PARA_CTB::HP_COLOR_RIGHT draw_meter(actor.hp, actor.maxhp, 316, 18, 112, 8, hp_color1, hp_color2) draw_actor_hp(actor, 284, 0) sp_color1 = PARA_CTB::SP_COLOR_LEFT sp_color2 = PARA_CTB::SP_COLOR_RIGHT draw_meter(actor.sp, actor.maxsp, 492, 18, 112, 8, sp_color1, sp_color2) draw_actor_sp(actor, 460, 0) @actor = actor @text = nil self.visible = true else set_actor_ctb(actor) end end #-------------------------------------------------------------------------- # ● エネミー設定 # enemy : 名前とステートを表示するエネミー #-------------------------------------------------------------------------- alias set_enemy_ctb set_enemy def set_enemy(enemy) if PARA_CTB::HELP_DRAWING_MATER_ENEMY self.contents.clear draw_actor_name(enemy, 4, 0) draw_actor_state(enemy, 140, 0) hp_color1 = PARA_CTB::HP_COLOR_LEFT hp_color2 = PARA_CTB::HP_COLOR_RIGHT draw_meter(enemy.hp, enemy.maxhp, 316, 18, 112, 8, hp_color1, hp_color2) draw_actor_hp(enemy, 284, 0) sp_color1 = PARA_CTB::SP_COLOR_LEFT sp_color2 = PARA_CTB::SP_COLOR_RIGHT draw_meter(enemy.sp, enemy.maxsp, 492, 18, 112, 8, sp_color1, sp_color2) draw_actor_sp(enemy, 460, 0) self.visible = true else set_enemy_ctb(enemy) end end end