#============================================================================== # □ CTB(2013/03/08) #------------------------------------------------------------------------------ #  CTBを導入します。 #============================================================================== #============================================================================== # ☆ カスタマイズここから。 #============================================================================== # 行動するのに必要なAPを設定します。 CC_CTB_AP_ACTION_LIMIT = 100 # 行動後にAPを0にするかどうかを選択します。 # 0にする場合はtrue、しない場合はfalseを指定します。 CC_CTB_AP_RESET = true # 戦闘速度を設定します。小さいほど速くなります。 # 0より大きい値を設定します。 CC_CTB_BATTLE_SPEED = 20.0 # 戦闘速度が敏捷性によらず一定になるように調整するか設定します。 # trueの時、戦闘速度を一定にします。 CC_CTB_BATTLE_SPEED_ADJUST = true # CC_CTB_BATTLE_SPEED_ADJUSTがtrueの時の戦闘速度を設定します。 # 値が大きいほど速くなります。 CC_CTB_ADJUSTED_SPEED = 20.0 # 自動回復のタイミングを設定します。 # 行動終了時=0、TP自然増加時=1 CC_CTB_REGENERATE_TIMING = 1 # 自動回復速度を調整します。小さいほど速くなります。 # 0より大きい値を設定します。 CC_CTB_REGENERATE_SPEED = 20.0 # アイテム使用時に消費するAPを設定します。 CC_CTB_ITEM_AP_COST = CC_CTB_AP_ACTION_LIMIT #============================================================================== # ☆ カスタマイズここまで。 #============================================================================== #============================================================================== # □ BattleManager #------------------------------------------------------------------------------ #  戦闘の進行を管理するモジュールです。 #============================================================================== module BattleManager class << self #-------------------------------------------------------------------------- # ○ 戦闘開始 #-------------------------------------------------------------------------- alias cc_ctb_battle_start battle_start def battle_start cc_ctb_battle_start if @preemptive $game_party.members.each {|member| member.ap += CC_CTB_AP_ACTION_LIMIT / 2 } elsif @surprise $game_troop.members.each {|member| member.ap += CC_CTB_AP_ACTION_LIMIT / 2 } end speed_adjust_set if CC_CTB_BATTLE_SPEED_ADJUST end #-------------------------------------------------------------------------- # ○ 行動順序の作成 #-------------------------------------------------------------------------- def make_action_orders @action_battlers = [next_action_battler] @action_battlers[0].increase_turn if @action_battlers[0].is_a?(Game_Enemy) end #-------------------------------------------------------------------------- # ○ 次に行動するバトラーの取得 #-------------------------------------------------------------------------- def next_action_battler battlers = [] battlers += $game_party.alive_members unless @surprise battlers += $game_troop.alive_members unless @preemptive battlers.sort! {|a,b| b.agi - a.agi } battlers.min_by {|battler| (CC_CTB_AP_ACTION_LIMIT - battler.ap) / battler.agi } end #-------------------------------------------------------------------------- # ○ 戦闘速度修正値の取得 #-------------------------------------------------------------------------- def speed_adjust_set battlers = $game_party.members + $game_troop.members $cc_ctb_speed_adjust = battlers.max_by {|battler| battler.agi }.agi / CC_CTB_ADJUSTED_SPEED end end end #============================================================================== # □ Game_BattlerBase #------------------------------------------------------------------------------ #  バトラーを扱う基本のクラスです。主に能力値計算のメソッドを含んでいます。こ # のクラスは Game_Battler クラスのスーパークラスとして使用されます。 #============================================================================== class Game_BattlerBase alias cc_ctb_hrg hrg alias cc_ctb_mrg mrg alias cc_ctb_trg trg def hrg; cc_ctb_hrg / (CC_CTB_REGENERATE_TIMING == 1 ? CC_CTB_REGENERATE_SPEED : 1); end # HP再生率 Hp ReGeneration rate def mrg; cc_ctb_mrg / (CC_CTB_REGENERATE_TIMING == 1 ? CC_CTB_REGENERATE_SPEED : 1); end # MP再生率 Mp ReGeneration rate def trg; cc_ctb_trg / (CC_CTB_REGENERATE_TIMING == 1 ? CC_CTB_REGENERATE_SPEED : 1); end # TP再生率 Tp ReGeneration rate #-------------------------------------------------------------------------- # ○ 公開インスタンス変数 #-------------------------------------------------------------------------- attr_reader :ap # AP #-------------------------------------------------------------------------- # ○ オブジェクト初期化 #-------------------------------------------------------------------------- alias cc_atb_initialize initialize def initialize @ap = 0 cc_atb_initialize end #-------------------------------------------------------------------------- # ○ AP の変更 #-------------------------------------------------------------------------- def ap=(ap) @ap = [[ap, max_ap].min, 0].max end #-------------------------------------------------------------------------- # ○ AP の割合を取得 #-------------------------------------------------------------------------- def ap_rate @ap.to_f / max_ap end #-------------------------------------------------------------------------- # ○ AP の最大値を取得 #-------------------------------------------------------------------------- def max_ap return CC_CTB_AP_ACTION_LIMIT end #-------------------------------------------------------------------------- # ○ スキルの消費 AP 計算 #-------------------------------------------------------------------------- def skill_ap_cost(skill) skill.speed end #-------------------------------------------------------------------------- # ○ スキル使用コストの支払い可能判定 #-------------------------------------------------------------------------- alias cc_ctb_skill_cost_payable? skill_cost_payable? def skill_cost_payable?(skill) (!$game_party.in_battle || ap >= skill_ap_cost(skill)) && cc_ctb_skill_cost_payable?(skill) end #-------------------------------------------------------------------------- # ○ スキル使用コストの支払い #-------------------------------------------------------------------------- alias cc_ctb_pay_skill_cost pay_skill_cost def pay_skill_cost(skill) cc_ctb_pay_skill_cost(skill) self.ap -= skill_ap_cost(skill) if $game_party.in_battle end #-------------------------------------------------------------------------- # ○ 行動判定 #-------------------------------------------------------------------------- def action? ap >= CC_CTB_AP_ACTION_LIMIT && self == BattleManager.next_action_battler end end #============================================================================== # □ Game_Battler #------------------------------------------------------------------------------ #  スプライトや行動に関するメソッドを追加したバトラーのクラスです。このクラス # は Game_Actor クラスと Game_Enemy クラスのスーパークラスとして使用されます。 #============================================================================== class Game_Battler < Game_BattlerBase #-------------------------------------------------------------------------- # ○ AP の初期化 #-------------------------------------------------------------------------- def init_ap self.ap = rand * 25 end #-------------------------------------------------------------------------- # ○ 戦闘開始処理 #-------------------------------------------------------------------------- alias cc_ctb_on_battle_start on_battle_start def on_battle_start cc_ctb_on_battle_start init_ap end #-------------------------------------------------------------------------- # ○ 戦闘行動の作成 #-------------------------------------------------------------------------- alias cc_ctb_make_actions make_actions def make_actions cc_ctb_make_actions @actions = [] if self != BattleManager.next_action_battler end #-------------------------------------------------------------------------- # ○ コマンド入力可能判定 #-------------------------------------------------------------------------- alias cc_ctb_inputable? inputable? def inputable? cc_ctb_inputable? && action? end #-------------------------------------------------------------------------- # ○ HP の再生 #-------------------------------------------------------------------------- def regenerate_hp damage = -(mhp * hrg / (CC_CTB_REGENERATE_TIMING == 1 && CC_CTB_BATTLE_SPEED_ADJUST ? $cc_ctb_speed_adjust : 1)).to_i perform_map_damage_effect if $game_party.in_battle && damage > 0 @result.hp_damage = [damage, max_slip_damage].min self.hp -= @result.hp_damage end #-------------------------------------------------------------------------- # ○ MP の再生 #-------------------------------------------------------------------------- def regenerate_mp @result.mp_damage = -(mmp * mrg / (CC_CTB_REGENERATE_TIMING == 1 && CC_CTB_BATTLE_SPEED_ADJUST ? $cc_ctb_speed_adjust : 1)) self.mp -= @result.mp_damage end #-------------------------------------------------------------------------- # ○ TP の再生 #-------------------------------------------------------------------------- def regenerate_tp self.tp += CC_CTB_AP_ACTION_LIMIT * trg / (CC_CTB_REGENERATE_TIMING == 1 && CC_CTB_BATTLE_SPEED_ADJUST ? $cc_ctb_speed_adjust : 1) end #-------------------------------------------------------------------------- # ○ 戦闘行動終了時の処理 #-------------------------------------------------------------------------- alias cc_ctb_on_action_end on_action_end def on_action_end cc_ctb_on_action_end regenerate_all if CC_CTB_REGENERATE_TIMING == 0 end #-------------------------------------------------------------------------- # ○ 行動時 TP 消費 #-------------------------------------------------------------------------- def cc_ctb_ap_action_cost if (CC_CTB_AP_RESET || !current_action) && action? self.ap -= CC_CTB_AP_ACTION_LIMIT elsif current_action && current_action.item.is_a?(RPG::Item) self.ap -= CC_CTB_ITEM_AP_COST end end #-------------------------------------------------------------------------- # ○ ターン終了処理 #-------------------------------------------------------------------------- def on_turn_end @result.clear remove_states_auto(2) end end #============================================================================== # □ Game_Enemy #------------------------------------------------------------------------------ #  敵キャラを扱うクラスです。このクラスは Game_Troop クラス($game_troop)の # 内部で使用されます。 #============================================================================== class Game_Enemy < Game_Battler #-------------------------------------------------------------------------- # ○ 公開インスタンス変数 #-------------------------------------------------------------------------- attr_reader :turn_count # 敵グループ内インデックス #-------------------------------------------------------------------------- # ○ オブジェクト初期化 #-------------------------------------------------------------------------- alias cc_ctb_initialize initialize def initialize(index, enemy_id) cc_ctb_initialize(index, enemy_id) @turn_count = 1 end #-------------------------------------------------------------------------- # ○ 行動条件合致判定[ターン数] #-------------------------------------------------------------------------- def conditions_met_turns?(param1, param2) n = @turn_count if param2 == 0 n == param1 else n > 0 && n >= param1 && n % param2 == param1 % param2 end end #-------------------------------------------------------------------------- # ○ ターンの増加 #-------------------------------------------------------------------------- def increase_turn @turn_count += 1 end end #============================================================================== # □ Window_Base #------------------------------------------------------------------------------ #  ゲーム中の全てのウィンドウのスーパークラスです。 #============================================================================== class Window_Base < Window #-------------------------------------------------------------------------- # ○ 各種文字色の取得 #-------------------------------------------------------------------------- def ap_gauge_color1; text_color(30); end; # AP ゲージ 1 def ap_gauge_color2; text_color(31); end; # AP ゲージ 2 #-------------------------------------------------------------------------- # ○ AP の文字色を取得 #-------------------------------------------------------------------------- def ap_color(actor) return normal_color end #-------------------------------------------------------------------------- # ○ AP の描画 #-------------------------------------------------------------------------- def draw_actor_ap(actor, x, y, width = 124) draw_gauge(x, y, width, actor.ap_rate, ap_gauge_color1, ap_gauge_color2) #change_color(system_color) #draw_text(x, y, 30, line_height, Vocab::ap_a) #change_color(ap_color(actor)) #draw_text(x + width - 42, y, 42, line_height, actor.ap.to_i, 2) end #-------------------------------------------------------------------------- # ○ HP の描画 #-------------------------------------------------------------------------- def draw_actor_hp(actor, x, y, width = 124) draw_gauge(x, y, width, actor.hp_rate, hp_gauge_color1, hp_gauge_color2) change_color(system_color) draw_text(x, y, 30, line_height, Vocab::hp_a) draw_current_and_max_values(x, y, width, actor.hp.to_i, actor.mhp, hp_color(actor), normal_color) end #-------------------------------------------------------------------------- # ○ MP の描画 #-------------------------------------------------------------------------- def draw_actor_mp(actor, x, y, width = 124) draw_gauge(x, y, width, actor.mp_rate, mp_gauge_color1, mp_gauge_color2) change_color(system_color) draw_text(x, y, 30, line_height, Vocab::mp_a) draw_current_and_max_values(x, y, width, actor.mp.to_i, actor.mmp, mp_color(actor), normal_color) end end #============================================================================== # □ Window_BattleStatus #------------------------------------------------------------------------------ #  バトル画面で、パーティメンバーのステータスを表示するウィンドウです。 #============================================================================== class Window_BattleStatus < Window_Selectable #-------------------------------------------------------------------------- # ○ 基本エリアの描画 #-------------------------------------------------------------------------- alias cc_atb_draw_basic_area draw_basic_area def draw_basic_area(rect, actor) draw_actor_ap(actor, rect.x + 0, rect.y, 100) cc_atb_draw_basic_area(rect, actor) end end #============================================================================== # □ Window_Selectable #------------------------------------------------------------------------------ #  カーソルの移動やスクロールの機能を持つウィンドウクラスです。 #============================================================================== class Window_Selectable < Window_Base #-------------------------------------------------------------------------- # ○ 全項目の再描画 #-------------------------------------------------------------------------- def redraw_all_items item_max.times {|i| clear_item(i) } item_max.times {|i| draw_item(i) } end end #============================================================================== # □ Scene_Battle #------------------------------------------------------------------------------ #  バトル画面の処理を行うクラスです。 #============================================================================== class Scene_Battle < Scene_Base #-------------------------------------------------------------------------- # ○ ステータスウィンドウの情報を再描画 #-------------------------------------------------------------------------- def redraw_status @status_window.redraw_all_items @enemy_window.redraw_all_items end #-------------------------------------------------------------------------- # ○ ステータスウィンドウの情報を更新 #-------------------------------------------------------------------------- def refresh_status @status_window.refresh @enemy_window.refresh end #-------------------------------------------------------------------------- # ○ フレーム更新(AP増加) #-------------------------------------------------------------------------- def update_ap all_alive_members.each do |member| member.ap += member.agi / CC_CTB_BATTLE_SPEED / (CC_CTB_BATTLE_SPEED_ADJUST ? $cc_ctb_speed_adjust : 1) member.regenerate_all if CC_CTB_REGENERATE_TIMING == 1 end redraw_status update_basic end #-------------------------------------------------------------------------- # ○ パーティコマンド選択の開始 #-------------------------------------------------------------------------- def start_party_command_selection unless scene_changing? refresh_status @status_window.unselect @status_window.open while BattleManager.next_action_battler.ap < CC_CTB_AP_ACTION_LIMIT update_ap end if BattleManager.input_start @actor_command_window.close @party_command_window.setup else @party_command_window.deactivate turn_start end end end #-------------------------------------------------------------------------- # ○ 敵味方合わせた全バトルメンバーの取得 #-------------------------------------------------------------------------- def all_movable_members $game_party.movable_members + $game_troop.movable_members end #-------------------------------------------------------------------------- # ○ 敵味方合わせた全生存メンバーの取得 #-------------------------------------------------------------------------- def all_alive_members $game_party.alive_members + $game_troop.alive_members end #-------------------------------------------------------------------------- # ○ コマンド[逃げる] #-------------------------------------------------------------------------- alias cc_ctb_command_escape command_escape def command_escape cc_ctb_command_escape $game_party.movable_members.each do |member| member.ap = 0 end end #-------------------------------------------------------------------------- # ○ ターン開始 #-------------------------------------------------------------------------- def turn_start @party_command_window.close @actor_command_window.close @status_window.unselect @subject = nil BattleManager.turn_start @log_window.clear end #-------------------------------------------------------------------------- # ○ 戦闘行動の処理 #-------------------------------------------------------------------------- def process_action return if scene_changing? if !@subject || !@subject.current_action @subject = BattleManager.next_subject end return turn_end unless @subject if @subject.action? @subject.update_state_turns @subject.update_buff_turns end if @subject.current_action @subject.current_action.prepare if @subject.current_action.valid? @status_window.open execute_action end end if @subject.action? @subject.cc_ctb_ap_action_cost end if @subject.current_action @subject.remove_current_action end process_action_end unless @subject.current_action end end