#============================================================================== # ++ 积极时间战斗 ver. 2.56 ++ # Script by 帕拉狗(パラ犬) # # http://para.j-mx.com/ # ############################################################################### # ********* 翻译+强化+改进: *********** # # 忧郁的涟漪 # # # #在日站上找到的脚本,本来打算全文翻译...不过日文能力有限...放弃了..残念.... # #============================================================================== module PARA_CTB # 当一人CP槽填满的时候,CP是否不累积(默认为false,如果希望一个CP满了后其他人CP # 槽进行暂时的等待,改成true) COMMAND_WAIT = false # 是否等待攻击结束以后才可以行动?默认是不等待(true) SELECT_WAIT = true # 在演示攻击动画的时候是否停止CP槽的累加,默认的false不停止 ANIMATION_WAIT = false # CP槽的填充速度(数字越大填充越快,调到999的话....就光攻击吧,连等都不用等.) BATTLE_SPEED = 4 # 队员人数,多了显示的多,适合很多有多人参加战斗的游戏~ PARTY_SIZE = 4 # 各项活动时减少的CT值(100为全部) ACT_ATTACK_CT = 100 # 攻击时候消耗的CT值 ACT_GUARD_CT = 100 # 防御 ACT_ESCAPE_CT = 100 # 逃走失败 ACT_SKILL_CT = 100 # 使用特技 ACT_ITEM_CT = 100 # 使用物品 # 逃跑失败的时候显示的字样 UNESCAPE_MES = "逃跑失败" # 当CT槽满了的时候发出的效果音 FULL_CT_SE = "015-Jump01" # 効果音的响度 FULL_CT_SE_VOL = 80 # CT槽填满的时候人物发生的颜色变化(括号里对应红,绿,蓝) FULL_CT_COLOR = Tone.new(120,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/MP( 显示true / 不显示false ) MAX_DRAW = false # 是否进行敌人缩写(例如有5个幽灵的时候不分别显示5个幽灵的名字而是只显示一个) # 例子:原本显示为: # 幽灵 # 幽灵 # 改了以后显示为: # 幽灵 2 ENEMY_GROUPING = false # 在敌人窗口中显示的东西( 0:只显示名字 / 1:显示HP / 2:显示CT ) ENEMY_DRAWING_MATER = 0 # actor的帮助窗口表示HP/SP量规( true / false ) HELP_DRAWING_MATER_ACTOR = true # 是否在选择攻击对象的时候显示敌人的HP/MP和状态(默认为显示(true)) HELP_DRAWING_MATER_ENEMY = false # 是否在一个地方强制显示攻击对话框(攻击框就显示在一个地方,默认为true(是)) WINDOWPOS_CHANGE = true WINDOWPOS_X = 100 # X坐标 WINDOWPOS_Y = 320 # Y坐标 # 战斗窗口的不透明度,数字越高透明度越差 WINDOW_OPACITY = 120 # CT槽的增长间隔,越小越自然,大了大话..好像是在移动图块... CT_SKIP = 2 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 != 0 ? 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? n = $game_party.actors.size + $game_troop.enemies.size # 戦闘開始時にある程度のCTを溜めておく battler.now_ct = battler.agi * 60 * n 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 *= 100 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 PARA_CTB::CT_SKIP == 0 update_ct else if @ct_wait > 0 @ct_wait -= 1 else update_ct @ct_wait = PARA_CTB::CT_SKIP end 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 # 逃走成功判定 success = rand(100) < 50 * actors_agi / enemies_agi # 逃走成功の場合 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] @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?(Input::R) shift_activer(1) end if Input.trigger?(Input::L) 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< |