Custom Turn Battle (CTB)

Thảo luận trong 'Demo - Project' bắt đầu bởi Nguyen_Kain, 7/2/05.

  1. Nguyen_Kain

    Nguyen_Kain Quậy hết mình Moderator

    Tham gia ngày:
    28/5/04
    Bài viết:
    1,299
    Đây là sự bổ sung cho ATB , vì vậy ai muốn dùng hãy lục trong Forum , có một topic có dạy cách làm ATB (Action Turn Base)

    Mã:
    #########################################################################
    # FF10にあった、カウントタイムバトル的なモノです。
    #
    # ☆良くあるATB(ゲージがたまると行動可能になるやつね)との違い
    # ・行動順を割り出す計算式が変わっています。
    # ATBでは毎フレームすばやさに応じた値が足されていき、
    # 行動を終了したら規定の値(ほとんどの方が0だと思いますが)になります。
    # それに対して、この似非CTBシステム(以下CTB)では、
    # 全員のゲージが同じスピードで上昇し、
    # 行動を終了したあと、素早さに応じた値を減算します。
    # このため、行動順がATBと微妙に変化するかと思われます。
    #
    # ・行動順の表示が名前の羅列になってます。
    # この名前は、ゲージのように動くことはなく、
    # 現在の行動者含めて五人先の人までを名前で表示しています。
    # なお、行動先読みには「全ての行動が物理攻撃だった時」を前提にしてます。
    # そのため、スキルやアイテムなどを使ってしまうと、その分微妙にズレます。
    #
    # ☆制約
    # ・パーティーが三人
    # 行動順を表示する部分どこにあっても邪魔なので、
    # 結局パーティー表示部分の左端を削りました。
    # 
    # ・「何もしない」の動作が不審
    # 何の前触れもなくスキップしてしまうように設定していますので、
    # 見かけ上は無視されたように見えてしまいます。
    # 
    # ☆特殊操作
    # ・パーティーコマンド呼び出し
    # アクターのコマンドが表示されている時にXボタンを押してください。
    # パーティーコマンドが呼び出されます。
    # 戦闘再開はそのまま、戦闘再開。
    # 行動順表示は、50人先まで行動順を表示します。
    # あまり使えないかもしれませんが。
    # 一応、L、Rによるページ送り機能などもつけてます。
    # 逃走は、「全員のCPを一定値減算したのち、逃走する」という形式にしてます。
    # 
    # ☆スキルについて
    # 「スキル名,ディレイ値,詠唱時間」とスキル名を書き換えてください。
    # ディレイ値は「その行動が終了した後に減算するCPの基準となる値」です。
    # たとえば通常攻撃はこれがCP_COST_ATTACKで定義されています。
    # 何も書いていない場合の値も定義可能です。
    # 詠唱時間は「そのスキルが発動するまでの時間」です。
    # 詠唱中はステート「詠唱」が付加されます。
    # 攻撃の場合はもちろんこの詠唱時間は0ですね。
    # なので、こんな感じで↓
    # 「クイックカット,120,0」
    # これでCP_COST_ATTACKを120以上にしておけば、
    # 通常攻撃よりも早く次の出番がきますね。
    # 「パワフルスイング,100,120」
    # これだとスキルを選択してから発動するまでのタイムラグが120ありますね。
    #########################################################################
    
    #==============================================================================
    # ■ 初期定義
    #==============================================================================
    module RPG
     class Skill
     CP_COST_DELAY = 200 # スキルで値を何も書いていない場合のディレイ値
     CP_COST_SPELL = 0 # スキルで値を何も書いていない場合の詠唱時間
     end
    end
    
    module CTB_Define
     # 詠唱ステートのID
     SPELL_STATE_ID = 2
     # 消費CP
     # 消費CPの算出方法は「消費CP(ここで定義)×すばやさ平均÷すばやさ」です。
     CP_COST_ITEM   = 180 # アイテムを使用したときの減算値
     CP_COST_ATTACK  = 200 # 攻撃したときの減算値
     CP_COST_GUARD   = 170 # 防御したときの減算値
     CP_COST_NOTHING = 150 # なにもしないときの減算値
     CP_COST_ESCAPE  = 230 # 「逃げる」時*全員の*の減算値
    end
    
    #==============================================================================
    # ■ RPG::Skill
    #==============================================================================
    module RPG
     class Skill
       def name
         name = @name.split(/,/)[0]
         return name != nil ? name : ''
       end
       def delay
         name = @name.split(/,/)[1].to_i
         return name != nil ? name : CP_COST_DELAY
       end
       def spell
         name = @name.split(/,/)[2].to_i
         return name != nil ? name : CP_COST_SPELL
       end
     end
    end
    
    #==============================================================================
    # ■ Window_CTB
    #------------------------------------------------------------------------------
    # キャラの行動順を表示するウィンドウです。
    #==============================================================================
    class Window_CTB < Window_Base
     # 詠唱ステートのID読み込み
     include CTB_Define
     #--------------------------------------------------------------------------
     # ● オブジェクト初期化
     #--------------------------------------------------------------------------
     def initialize(avg)
       super(0, 320, 160, 160)
       self.contents = Bitmap.new(self.width - 32, self.height - 32)
       # 平均AGI算出    
       @agi_avg = avg
       # キャラ名列
       @names = []
     end
     #--------------------------------------------------------------------------
     # ● リフレッシュ
     #--------------------------------------------------------------------------
     def refresh
       # 再描画開始
       self.contents.clear
        self.contents.font.name = $fontface
       self.contents.font.size = 22
       self.contents.font.color = system_color
       self.contents.font.size = 16
       self.contents.draw_text(0, 0, 100, 17, "Next Battler")
       # キャラ名列
       @names = []
       # 攻撃コマンド後の全員のCPを先読み
       get_cps
       # cpの値でソート
       @names.sort!{|a,b| b[0] <=> a[0] }    
       h = 0
       self.contents.font.size = 17
       for i in 0...6
         @nam = @names[i]
         if @nam == nil
           break
         end
         x = 4
         y = 18 * h + 17
         if @nam[0] >= 500 # 500より大きければ白文字。
           if @nam[2] == true
             self.contents.font.color = Color.new(230, 255, 255, 255)
           else
              self.contents.font.name = $fontface
       self.contents.font.size = 12
             self.contents.font.color = normal_color
           end
         else
           if @nam[2] == true
             self.contents.font.color = Color.new(190, 225, 225, 255)
           else
             self.contents.font.color = disabled_color
           end
         end
         self.contents.draw_text(x, y, 128, 18, @nam[1])
         h += 1
       end
     end
     #--------------------------------------------------------------------------
     # ● 行動後のCPの取得
     #--------------------------------------------------------------------------
     def get_cps
       # メンバー全員の行動後のCPと名前を@namesに格納
       i = 0
       while @names.size < 15
         for member in $game_party.actors + $game_troop.enemies
           next if member.dead? or !member.exist?
           cp = CP_COST_ATTACK * @agi_avg / member.agi # 攻撃時に減算するCP先読み
           if i == 1 and member.current_action.kind == 1
             skill = $data_skills[member.current_action.skill_id]
             cp = skill.delay * @agi_avg / member.agi
           end
           cp = member.cp - (cp * i)
           if i == 0
             spell = member.state?(SPELL_STATE_ID)
           else
             spell = false
           end
           @names.push([cp, member.name, spell]) 
         end
         i += 1
       end
     end
     #--------------------------------------------------------------------------
     # ● CTBウィンドウの中身が空かどうかを確認する
     #--------------------------------------------------------------------------
     def names_empty
       if @names == []
         return true
       else
         return false
       end
     end
    end
    
    #==============================================================================
    # ■ Window_CTB_All
    #------------------------------------------------------------------------------
    # キャラの行動順を表示するウィンドウの拡大版です。
    #==============================================================================
    class Window_CTB_All < Window_Base
     # 詠唱ステートのID読み込み
     include CTB_Define
     #--------------------------------------------------------------------------
     # ● オブジェクト初期化
     #--------------------------------------------------------------------------
     def initialize(avg)
       super(0, 0, 160, 480)
       self.contents = Bitmap.new(self.width - 32, self.height - 32)
        self.contents.font.name = $fontface
       self.contents.font.size = 12
       # 平均AGI算出    
       @agi_avg = avg
       # キャラ名列
       @names = []
       # 攻撃コマンド後の全員のCPを先読み
       get_init_cps
       # cpの値でソート
       @names.sort!{|a,b| b[0] <=> a[0] }
     end
     #--------------------------------------------------------------------------
     # ● リフレッシュ
     #--------------------------------------------------------------------------
     def refresh(id)
       # 再描画開始
       self.contents.clear
        self.contents.font.name = $fontface
       self.contents.font.size = 20
       self.contents.font.color = system_color
       self.contents.font.size = 18
       self.contents.draw_text(0, 0, 100, 20, "Next Battler")
       h = 0
       self.contents.font.size = 19
       for i in id-1...[id+18,50].min
         @nam = @names[i]
         if @nam == nil
           break
         end
         x = 4
         y = 22 * h + 20
         if @nam[0] >= 500 # 500より大きければ白文字。
           if @nam[2] == true
             self.contents.font.color = Color.new(230, 255, 255, 255)
           else
             self.contents.font.color = normal_color
           end
         else
           if @nam[2] == true
             self.contents.font.color = Color.new(190, 225, 225, 255)
           else
             self.contents.font.color = disabled_color
           end
         end
          self.contents.font.name = $fontface
       self.contents.font.size = $fontsize
         self.contents.draw_text(x, y, 32, 22, (i+1).to_s) 
         self.contents.draw_text(x+32, y, 128, 22, @nam[1])
         h += 1
       end
     end
     #--------------------------------------------------------------------------
     # ● 行動後のCPの取得
     #--------------------------------------------------------------------------
     def get_init_cps
       # メンバー全員の行動後のCPと名前を@namesに格納
       i = 0
       while @names.size < 75
         for member in $game_party.actors + $game_troop.enemies
           next if member.dead? or !member.exist?
           cp = CP_COST_ATTACK * @agi_avg / member.agi # 攻撃時に減算するCP先読み
           if i == 1 and member.current_action.kind == 1
             skill = $data_skills[member.current_action.skill_id]
             cp = skill.delay * @agi_avg / member.agi
           end
           cp = member.cp - (cp * i)
           if i == 0
             spell = member.state?(SPELL_STATE_ID)
           else
             spell = false
           end
           @names.push([cp, member.name, spell]) 
         end
         i += 1
       end
     end
     #--------------------------------------------------------------------------
     # ● CTBウィンドウの中身が空かどうかを確認する
     #--------------------------------------------------------------------------
     def names_full(id)
       if @names[id] == nil
         return false
       end
       return true
     end
    end
    #==============================================================================
    # ■ Window_PartyCommand(座標がおかしくなるので、全部再定義しちゃってます)
    #==============================================================================
    class Window_PartyCommand < Window_Selectable
     #--------------------------------------------------------------------------
     # ● オブジェクト初期化(再定義)
     #--------------------------------------------------------------------------
     def initialize
       super(0, 0, 640, 64)
       self.contents = Bitmap.new(width - 32, height - 32)
       self.back_opacity = 160
       # コマンド追加
       @commands = ["Attack", "CTB", "Escape"]
       @item_max = 3
       @column_max = 3
       draw_item(0, normal_color)
       draw_item(1, normal_color)    
       draw_item(2, $game_temp.battle_can_escape ? normal_color : disabled_color)
       self.active = false
       self.visible = false
       self.index = 0
     end
     #--------------------------------------------------------------------------
     # ● 項目の描画(再定義)
     #     index : 項目番号
     #     color : 文字色
     #--------------------------------------------------------------------------
     def draw_item(index, color)
       self.contents.font.color = color
       rect = Rect.new(80 + index * 160 + 4, 0, 128 - 10, 32)
       self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))
       self.contents.draw_text(rect, @commands[index], 1)
     end
     #--------------------------------------------------------------------------
     # ● カーソルの矩形更新(再定義)
     #--------------------------------------------------------------------------
     def update_cursor_rect
       self.cursor_rect.set(80 + index * 160, 0, 128, 32)
     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]
       refresh
     end
     #--------------------------------------------------------------------------
     # ● リフレッシュ(再定義)(微妙に座標調整)
     #--------------------------------------------------------------------------
     def refresh
       self.contents.clear
        self.contents.font.name = $fontface
       self.contents.font.size = 19
       @item_max = $game_party.actors.size
       for i in 0...$game_party.actors.size
         actor = $game_party.actors[i]
         actor_x = i * 160 + 4
         draw_actor_name(actor, actor_x, 0)
         draw_actor_hp(actor, actor_x, 31, 120)
         draw_actor_sp(actor, actor_x, 65, 120)
         if @level_up_flags[i]
           self.contents.font.color = normal_color
           self.contents.draw_text(actor_x, 99, 120, 32, "LEVEL UP!")
         else
           draw_actor_state(actor, actor_x, 99)
         end
       end
     end
    end
    
    #==============================================================================
    # ■ Game_Battler
    #==============================================================================
    class Game_Battler
     # 詠唱ステートのID読み込み
     include CTB_Define
    
     attr_accessor :now_guarding             # 現在防御中フラグ
     attr_accessor :cp                       # 現在CP
     #--------------------------------------------------------------------------
     # ● コマンド入力可能判定
     #--------------------------------------------------------------------------
     alias ctb_sys_inputable? inputable?
     def inputable?
       bool = ctb_sys_inputable?
       return false if state?(SPELL_STATE_ID)
       return false if bool == false
       return false if @cp < 500
       return true
     end
    end
    
    #==============================================================================
    # ■ Game_Actor
    #==============================================================================
    class Game_Actor < Game_Battler
     #--------------------------------------------------------------------------
     # ● セットアップ
     #--------------------------------------------------------------------------
     alias ctb_sys_setup setup
     def setup(actor_id)
       ctb_sys_setup(actor_id)
       @cp = 0
       @now_guarding = false
     end
     #--------------------------------------------------------------------------
     # ● バトル画面 X 座標の取得(再定義)
     #--------------------------------------------------------------------------
     def screen_x
       # パーティ内の並び順から X 座標を計算して返す
       if self.index != nil
         return self.index * 160 + 80 + 160
       else
         return 0
       end
     end
    end
    
    #==============================================================================
    # ■ Game_Enemy
    #==============================================================================
    class Game_Enemy < Game_Battler
     #--------------------------------------------------------------------------
     # ● オブジェクト初期化
     #--------------------------------------------------------------------------
     alias ctb_sys_initialize initialize
     def initialize(troop_id, member_index)
       ctb_sys_initialize(troop_id, member_index)
       @cp = 0
       @now_guarding = false
     end
    end
    
    #==============================================================================
    # ■ Game_BattleAction
    #==============================================================================
    class Game_BattleAction
     #--------------------------------------------------------------------------
     # ● 公開インスタンス変数
     #--------------------------------------------------------------------------
     attr_accessor :spell                    # 詠唱中か否か
     #--------------------------------------------------------------------------
     # ● オブジェクト初期化
     #--------------------------------------------------------------------------
     alias ctb_sys_initialize initialize
     def initialize
       @spell = false # spellをfalseにする
       ctb_sys_initialize
     end
    
     #--------------------------------------------------------------------------
     # ● クリア
     #--------------------------------------------------------------------------
     alias ctb_sys_clear clear
     def clear
       # spell がtrueならば実行しない
       return if @spell
       ctb_sys_clear
     end
    end
    
    #==============================================================================
    # ■ Scene_Battle
    #==============================================================================
    class Scene_Battle
     # 詠唱ステートのID読み込み
     include CTB_Define
    
     #--------------------------------------------------------------------------
     # ● メイン処理 (再定義)
     #--------------------------------------------------------------------------
     def main
       # 戦闘用の各種一時データを初期化
       $game_temp.in_battle = true
       $game_temp.battle_turn = 0
       $game_temp.battle_event_flags.clear
       $game_temp.battle_abort = false
       $game_temp.battle_main_phase = false
       $game_temp.battleback_name = $game_map.battleback_name
       $game_temp.forcing_battler = nil
       # バトルイベント用インタプリタを初期化
       $game_system.battle_interpreter.setup(nil, 0)
       # トループを準備
       @troop_id = $game_temp.battle_troop_id
       $game_troop.setup(@troop_id)   
       # アクターコマンドウィンドウを作成
       s1 = $data_system.words.attack
       s2 = $data_system.words.skill
       s3 = $data_system.words.guard
       s4 = $data_system.words.item
       @actor_command_window = Window_Command.new(160, [s1, s2, s3, s4])
       @actor_command_window.y = 160
       @actor_command_window.back_opacity = 160
       @actor_command_window.active = false
       @actor_command_window.visible = false
       # その他のウィンドウを作成
       @party_command_window = Window_PartyCommand.new
       @help_window = Window_Help.new
       @help_window.back_opacity = 160
       @help_window.visible = false
       @status_window = Window_BattleStatus.new
       @message_window = Window_Message.new
    
       ### ココから追加部分
       # 全員のすばやさの平均を割り出す
       @avg = read_avg
       # CTB用Windowを作成
       @ctb_window = Window_CTB.new(@avg)
       # 全員の初期CPを代入
       first_cp
       ### ココまで追加部分
    
       # スプライトセットを作成
       @spriteset = Spriteset_Battle.new
       # ウェイトカウントを初期化
       @wait_count = 0
       # トランジション実行
       if $data_system.battle_transition == ""
         Graphics.transition(20)
       else
         Graphics.transition(40, "Graphics/Transitions/" +
           $data_system.battle_transition)
       end
       
       # プレバトルフェーズ開始
       start_phase1
       # メインループ
       loop do
         # ゲーム画面を更新
         Graphics.update
         # 入力情報を更新
         Input.update
         # フレーム更新
         update
         # 画面が切り替わったらループを中断
         if $scene != self
           break
         end
       end
       # マップをリフレッシュ
       $game_map.refresh
       # トランジション準備
       Graphics.freeze
       # ウィンドウを解放
       @actor_command_window.dispose
       @party_command_window.dispose
       @help_window.dispose
       @status_window.dispose
       @message_window.dispose
       ### ココから追加部分
       @ctb_window.dispose
       if @skill_window != nil
         @skill_window.dispose
       end
       ### ココまで追加部分
       if @skill_window != nil
         @skill_window.dispose
       end
       if @item_window != nil
         @item_window.dispose
       end
       if @result_window != nil
         @result_window.dispose
       end
       # スプライトセットを解放
       @spriteset.dispose
       # タイトル画面に切り替え中の場合
       if $scene.is_a?(Scene_Title)
         # 画面をフェードアウト
         Graphics.transition
         Graphics.freeze
       end
       # 戦闘テストからゲームオーバー画面以外に切り替え中の場合
       if $BTEST and not $scene.is_a?(Scene_Gameover)
         $scene = nil
       end
     end
     #--------------------------------------------------------------------------
     # ● フレーム更新(再定義)
     #--------------------------------------------------------------------------
     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
           end
         end
       end
       # システム (タイマー)、画面を更新
       $game_system.update
       $game_screen.update
       # タイマーが 0 になった場合
       if $game_system.timer_working and $game_system.timer == 0
         # バトル中断
         $game_temp.battle_abort = true
       end
       
       # ココから追加
       # CP更新
       if @phase != 4
         cp_countup
       end
       @ctb_window.update
       # CTB ウィンドウに名前が表示されていない場合(戦闘開始時)はrefresh
       @ctb_window.refresh if @ctb_window.names_empty
       # ココまで追加
    
       # ウィンドウを更新
       @help_window.update
       @party_command_window.update
       @actor_command_window.update
       @status_window.update
       @message_window.update
       # スプライトセットを更新
       @spriteset.update
       # トランジション処理中の場合
       if $game_temp.transition_processing
         # トランジション処理中フラグをクリア
         $game_temp.transition_processing = false
         # トランジション実行
         if $game_temp.transition_name == ""
           Graphics.transition(20)
         else
           Graphics.transition(40, "Graphics/Transitions/" +
             $game_temp.transition_name)
         end
       end
       # メッセージウィンドウ表示中の場合
       if $game_temp.message_window_showing
         return
       end
       # エフェクト表示中の場合
       if @spriteset.effect?
         return
       end
       # ゲームオーバーの場合
       if $game_temp.gameover
         # ゲームオーバー画面に切り替え
         $scene = Scene_Gameover.new
         return
       end
       # タイトル画面に戻す場合
       if $game_temp.to_title
         # タイトル画面に切り替え
         $scene = Scene_Title.new
         return
       end
       # バトル中断の場合
       if $game_temp.battle_abort
         # バトル開始前の BGM に戻す
         $game_system.bgm_play($game_temp.map_bgm)
         # バトル終了
         battle_end(1)
         return
       end
       # ウェイト中の場合
       if @wait_count > 0
         # ウェイトカウントを減らす
         @wait_count -= 1
         return
       end
       # アクションを強制されているバトラーが存在せず、
       # かつバトルイベントが実行中の場合
       if $game_temp.forcing_battler == nil and
          $game_system.battle_interpreter.running?
         return
       end
       # フェーズによって分岐
       case @phase
       when 1  # プレバトルフェーズ
         update_phase1
       when 2  # パーティコマンドフェーズ
         update_phase2
       when 3  # アクターコマンドフェーズ
         update_phase3
       when 4  # メインフェーズ
         update_phase4
       when 5  # アフターバトルフェーズ
         update_phase5
       # ココから追加
       when 6 # 全行動順確認フェーズ(追加部分)
         update_ctb_all
       end 
     end
     #--------------------------------------------------------------------------
     # ● パーティコマンドフェーズ開始(再定義)
     #--------------------------------------------------------------------------
     def start_phase2
       # フェーズ 2 に移行
       @phase = 2
       # アクターを非選択状態に設定
       @actor_index = -1
       @active_battler = nil
       # ココから変更
       # アクターコマンドウィンドウを無効化
       @actor_command_window.active = false
       @actor_command_window.visible = false
       # ココまで変更
       # メインフェーズフラグをクリア
       $game_temp.battle_main_phase = false
       # パーティ全員のアクションをクリア
       $game_party.clear_actions    
       # コマンド入力不可能な場合
       unless $game_party.inputable?
         # メインフェーズ開始
         start_phase4
       end
       # ココから変更
       # パーティーコマンドがアクティブならばパーティーコマンドフェーズへ
       if @party_command_window.active != true
         start_phase3
       else
         update_phase2
       end
       # ココまで変更
     end
     #--------------------------------------------------------------------------
     # ● フレーム更新 (パーティコマンドフェーズ)(再定義)
     #--------------------------------------------------------------------------
     def update_phase2
       # 全部変更してます
       # C ボタンが押された場合
       if Input.trigger?(Input::C)
         # パーティコマンドウィンドウのカーソル位置で分岐
         case @party_command_window.index
         when 0  # 戦う
           # 決定 SE を演奏
           $game_system.se_play($data_system.decision_se)
           # アクターコマンドフェーズ開始
           start_phase3
         when 1  # CTBWindow2
           # 決定 SE を演奏
           $game_system.se_play($data_system.decision_se)
           # CTB表示開始
           start_phase2_CTB
         when 2  # 逃げる
           # 逃走可能ではない場合
           if $game_temp.battle_can_escape == false
             # ブザー SE を演奏
             $game_system.se_play($data_system.buzzer_se)
             return
           end
           # 決定 SE を演奏
           $game_system.se_play($data_system.decision_se)
           # 逃走処理
           update_phase2_escape
         end
         return
       elsif Input.trigger?(Input::B)
         # 決定 SE を演奏
         $game_system.se_play($data_system.cancel_se)
         # アクターコマンドフェーズ開始
         start_phase3
       end
     end
     #--------------------------------------------------------------------------
     # ● フレーム更新 (パーティコマンドフェーズ : 逃げる)
     #--------------------------------------------------------------------------
     alias ctb_sys_update_phase2_escape update_phase2_escape
     def update_phase2_escape
       # CP消費 (全員)
       for actor in $game_party.actors
         if actor.exist?
           actor.cp -= CP_COST_ESCAPE * @avg / actor.agi
         end
       end
       ctb_sys_update_phase2_escape
     end
     #--------------------------------------------------------------------------
     # ● アクターコマンドウィンドウのセットアップ
     #--------------------------------------------------------------------------
     alias ctb_sys_phase3_setup_command_window phase3_setup_command_window
     def phase3_setup_command_window
       ctb_sys_phase3_setup_command_window
       # ガードフラグをfalseにする
       @active_battler.now_guarding = false
       # アクターコマンドウィンドウの位置を再設定(右へ160移動)
       @actor_command_window.x = @actor_index * 160 + 160
     end
     #--------------------------------------------------------------------------
     # ● フレーム更新 (アクターコマンドフェーズ : 基本コマンド)
     #--------------------------------------------------------------------------
     alias ctb_sys_update_phase3_basic_command update_phase3_basic_command
     def update_phase3_basic_command
       # X ボタンが押された場合
       if Input.trigger?(Input::X)
         # 決定 SE を演奏
         $game_system.se_play($data_system.decision_se)
         # パーティーコマンド呼び出し
         @party_command_window.active = true
         @party_command_window.visible = true      
         start_phase2      
       else
         ctb_sys_update_phase3_basic_command
       end
     end
     #--------------------------------------------------------------------------
     # ● 行動順序作成 (再定義)
     #--------------------------------------------------------------------------
     def make_action_orders
       # CP500以上のバトラーはpushしないようにした。
       # 配列 @action_battlers を初期化
       @action_battlers = []
       # CP500以上のエネミーを配列 @action_battlers に追加
       for enemy in $game_troop.enemies
         if enemy.cp >= 500
           @action_battlers.push(enemy)
         end
       end
       # CP500以上のアクターを配列 @action_battlers に追加
       for actor in $game_party.actors
         if actor.cp >= 500
           @action_battlers.push(actor)
         end
       end
       # 全員のアクションスピードを決定
       for battler in @action_battlers
         battler.make_action_speed
       end
       # アクションスピードの大きい順に並び替え
       @action_battlers.sort! {|a,b|
         b.current_action.speed - a.current_action.speed }
     end
     #--------------------------------------------------------------------------
     # ● フレーム更新 (メインフェーズ ステップ 1 : アクション準備)
     #--------------------------------------------------------------------------
     alias ctb_sys_update_phase4_step1 update_phase4_step1
     def update_phase4_step1
       # CTBリフレッシュ
       @ctb_window.refresh
       ctb_sys_update_phase4_step1
     end
     #--------------------------------------------------------------------------
     # ● フレーム更新 (メインフェーズ ステップ 2 : アクション開始)(再定義)
     #--------------------------------------------------------------------------
     def update_phase4_step2
       # 強制アクションでなければ
       unless @active_battler.current_action.forcing
         # 制約が [敵を通常攻撃する] か [味方を通常攻撃する] の場合
         if @active_battler.restriction == 2 or @active_battler.restriction == 3
           # アクションに攻撃を設定
           @active_battler.current_action.kind = 0
           @active_battler.current_action.basic = 0
         end
         # 制約が [行動できない] の場合
         if @active_battler.restriction == 4
           # アクション強制対象のバトラーをクリア
           $game_temp.forcing_battler = nil
           if @active_battler.cp >= 500
             # ステート自然解除
             @active_battler.remove_states_auto
             # CP消費 (行動できない場合は何もしない場合と同じ) ココ追加
             @active_battler.cp -= CP_COST_NOTHING * @avg / @active_battler.agi
             # cpをカウントアップ
             cp_countup
           end
           # ステップ 1 に移行
           @phase4_step = 1
           return
         end
       end
       # 対象バトラーをクリア
       @target_battlers = []
       # アクションの種別で分岐
       case @active_battler.current_action.kind
       when 0  # 基本
         make_basic_action_result
       when 1  # スキル
         make_skill_action_result
       when 2  # アイテム
         make_item_action_result
       end
       # ステップ 3 に移行
       if @phase4_step == 2
         @phase4_step = 3
       end
     end
     #--------------------------------------------------------------------------
     # ● 基本アクション 結果作成
     #--------------------------------------------------------------------------
     alias ctb_sys_make_basic_action_result make_basic_action_result
     def make_basic_action_result
       # 攻撃の場合
       if @active_battler.current_action.basic == 0
    @active_battler.cp -= CP_COST_ATTACK * @avg / @active_battler.agi
       end
       # 防御の場合
       if @active_battler.current_action.basic == 1
         # CP消費
         @active_battler.cp -= CP_COST_GUARD * @avg / @active_battler.agi
       end
       # 敵の逃げるの場合
       if @active_battler.is_a?(Game_Enemy) and
          @active_battler.current_action.basic == 2
         # CP消費
         @active_battler.cp -= CP_COST_ESCAPE * @avg / @active_battler.agi
       end
       # 何もしないの場合
       if @active_battler.current_action.basic == 3
         # CP消費
         @active_battler.cp -= CP_COST_NOTHING * @avg / @active_battler.agi
         # アクション強制対象のバトラーをクリア
         $game_temp.forcing_battler = nil
         # cpをカウントアップ
         cp_countup
         # ステップ 1 に移行
         @phase4_step = 1
         return
       end
       # 呼び戻し
       ctb_sys_make_basic_action_result
     end
     #--------------------------------------------------------------------------
     # ● スキルアクション 結果作成(再定義)
     #--------------------------------------------------------------------------
     def make_skill_action_result
       # スキルを取得
       @skill = $data_skills[@active_battler.current_action.skill_id]
       # ステータスウィンドウをリフレッシュ
       @status_window.refresh
       @ctb_window.refresh
       # ヘルプウィンドウにスキル名を表示
       @help_window.set_text(@skill.name, 1)
       # 詠唱中の場合
       if @active_battler.state?(SPELL_STATE_ID)
         # ステート「詠唱」を削除
         @active_battler.remove_state(SPELL_STATE_ID)
         @active_battler.current_action.spell = false
       else
         # SP 消費
         @active_battler.sp -= @skill.sp_cost
         # SkillのSpell値が1以上の場合
         if @skill.spell > 0
           # CP 消費 skill.spellの減算
           @active_battler.cp -= @skill.spell * @avg / @active_battler.agi
           # ステート「詠唱」を付加
           @active_battler.add_state(SPELL_STATE_ID)
           @active_battler.current_action.spell = true
         end
       end
       # ステート「詠唱」がなければ効果実行
       unless @active_battler.state?(SPELL_STATE_ID)
         # SP 消費を戻す。
         @active_battler.sp += @skill.sp_cost
         # 強制アクションでなければ
         unless @active_battler.current_action.forcing
           # SP 切れなどで使用できなくなった場合
           unless @active_battler.skill_can_use?(@skill.id)
             # アクション強制対象のバトラーをクリア
             $game_temp.forcing_battler = nil
             # ステップ 1 に移行
             @phase4_step = 1
             return
           end
         end
         # SP をまた消費
         @active_battler.sp -= @skill.sp_cost
         # CP 消費 skill.delayの減算
         @active_battler.cp -= @skill.delay * @avg / @active_battler.agi
         # アニメーション 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
     end
     #--------------------------------------------------------------------------
     # ● アイテムアクション 結果作成
     #--------------------------------------------------------------------------
     def make_item_action_result
     alias ctb_sys_make_item_action_result make_item_action_result
       ctb_sys_make_item_action_result
       # CP 消費
       @active_battler.cp -= CP_COST_ITEM * @avg / @active_battler.agi
     end
     #--------------------------------------------------------------------------
     # ● フレーム更新 (メインフェーズ ステップ 6 : リフレッシュ)
     #--------------------------------------------------------------------------
     alias ctb_sys_update_phase4_step6 update_phase4_step6
     def update_phase4_step6
       ctb_sys_update_phase4_step6
       # cpをカウントアップ
       cp_countup
     end
     #--------------------------------------------------------------------------
     # ● すばやさ平均割り出し
     #--------------------------------------------------------------------------
     def read_avg
       temp = 0
       for member in $game_party.actors + $game_troop.enemies
         temp += member.agi
       end
       temp /= $game_troop.enemies.size + $game_party.actors.size
       return temp
     end  
     #--------------------------------------------------------------------------
     # ● 全員の初期CPを決定
     #--------------------------------------------------------------------------
     def first_cp
       for member in $game_party.actors + $game_troop.enemies
         member.cp = [[5 * (rand(20) + 60) * member.agi / @avg, 0].max, 490].min
       end
     end
     #----------------------------------------------------------------------------
     # ● 次の行動者までCPをカウントアップ
     #----------------------------------------------------------------------------
     def cp_countup    
       # 500 - cpの最小値を読み込む
       cpmin = 500
       edead = 0
       for enemy in $game_troop.enemies
         # 行動出来なければ無視
         if enemy.dead? == true
           edead +=1
           enemy.cp = 0
           next
         end
         cpmin = [cpmin, 500 - enemy.cp].min
       end
    
       # エネミーが全員死んでいればreturn
       return if $game_troop.enemies.size == edead
       
       for actor in $game_party.actors
         # 行動出来なければ無視
         if actor.dead? == true
           actor.cp = 0
           next
         end
         cpmin = [cpmin, 500 - actor.cp].min
       end
       
       # cpminが0ならばここで処理終了
       return if cpmin <= 0
       
       # 全員のCPをcpmin加算
       for member in $game_party.actors + $game_troop.enemies
         # 行動出来なければ無視
         next if member.dead?
         member.cp += cpmin
         # cpが500より小さければ次へ
         next if member.cp < 500
         # ステート自然解除
         member.remove_states_auto
         # MP回復
         plus = [member.maxsp * 5/ 100,1].max
         member.sp = [member.sp + plus,member.maxsp].min
         if member.slip_damage?
           # スリップダメージ
           member.slip_damage_effect
           member.damage_pop = true
         end
       end
       @status_window.refresh
     end
     #--------------------------------------------------------------------------
     # ● フレーム更新 (パーティコマンドフェーズ : 行動順表示)
     #--------------------------------------------------------------------------
     def start_phase2_CTB
       @party_command_window.active = false
       @party_command_window.visible = false
       # フェーズ 6 に移行
       @phase = 6
       @ctb_window.visible = false
       @ctb_window_all = Window_CTB_All.new(@avg)
       @ctb_window_all.update
       @id = 1
       @ctb_window_all.refresh(@id)
     end  
     #--------------------------------------------------------------------------
     # ● フレーム更新 (パーティコマンドフェーズ : 行動順アップデート)
     #--------------------------------------------------------------------------
     def update_ctb_all
       # 下 ボタンが押された場合
       if Input.trigger?(Input::DOWN) or Input.repeat?(Input::DOWN)
         if @id < 50
           @id +=1
         else
           @id = 1
         end
         @ctb_window_all.refresh(@id)
       # 上 ボタンが押された場合      
       elsif Input.trigger?(Input::UP) or Input.repeat?(Input::UP)
         if @id > 1
           @id -= 1
         else
           @id = 50
         end
         @ctb_window_all.refresh(@id)
       # L ボタンが押された場合      
       elsif Input.trigger?(Input::L)
         @id = [@id-18,1].max
         @ctb_window_all.refresh(@id)
       # R ボタンが押された場合      
       elsif Input.trigger?(Input::R)
         @id = [@id+18, 50].min
         @ctb_window_all.refresh(@id)
       # BかAが押されたら
       elsif Input.trigger?(Input::B)
         # キャンセル SE を演奏
         $game_system.se_play($data_system.cancel_se)
         @ctb_window.visible = true
         @ctb_window_all.dispose
         @party_command_window.active = true
         @party_command_window.visible = true      
         start_phase2      
       end
     end
    end
     
  2. doiloithoi

    doiloithoi Youtube Master Race

    Tham gia ngày:
    14/2/05
    Bài viết:
    44
    Bác có thể cho biết bác đã tìm thấy cái đó ở đâu ko ? Chỉ cho đàn em với , làm ơn , em đang cần mấy cái này lắm ...
     
  3. Nguyen_Kain

    Nguyen_Kain Quậy hết mình Moderator

    Tham gia ngày:
    28/5/04
    Bài viết:
    1,299
    Cần làm gì ?? Tất cả cái này tui đều moi ở mấy trang JP ( đôi khi là ở trang Eng :D ) , nhưng không sao , PM cho tui , tui nói cho :wink:
     

Chia sẻ trang này