Custom Turn Battle (CTB)

Nguyen_Kain

Quậy hết mình
Moderator
Đâ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
 
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 ...
 
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:
 
Back
Top