# ▼▲▼ XRXS65. CP制御ターンシステム ver.β ▼▲▼ built 201120 # by 桜雅 在土 #============================================================================== # □ カスタマイズポイント #============================================================================== module XRXS65 # # 「バトルスピード」(数値が高いほど早い) # SPEED = 1.0 # # 戦闘開始時 CP。 固定値と占有率 # CP_PRESET_FIXNUM = 0 CP_PRESET_RATIO = 0 # # ターンコントローラ (nil : カウント/ターンを有効。 # 数値 : そのインデックスをもつエネミーが支配) # TC = 0 # # カウント/ターン (TCが有効な場合は無視) # CPT = 40 # # CP スキン # SKIN = "123" # スキンファイル名(Graphics/Windowskinsフォルダ) LINE_HEIGHT = 8 # スキンの"一行"の縦幅[単位:ピクセル] # # 表示位置セッティング # X_OFFSET = 144 # 横位置 Y_OFFSET = 464 # 縦位置 ALIGN = 1 #「位置揃え」(CPメーターの位置。0:左寄せ 1:中央 2:右寄せ) MAX = 8 # 確保するサイズ[単位:~人分] # # アクターコマンドがポップしたときの効果音 # COMMAND_UP_SE = "Audio/SE/046-Book01.ogg" end #============================================================================== # --- CP メーターの描画情報の取得 --- (Game_Battlerにインクルードされます) #============================================================================== module XRXS_CP #-------------------------------------------------------------------------- # ○ スキンライン (スキンの何行目を使うか) #-------------------------------------------------------------------------- def cp_linetype # CP フルの場合はスキンの 2 行目を使う return 2 if self.cp_full? # 通常はスキンの 1 行目を使う return 1 end #-------------------------------------------------------------------------- # ○ メーター量[単位:%] #-------------------------------------------------------------------------- def cp_lineamount # 戦闘不能の場合は 0 %として表示させる return 0 if self.dead? # CP値を%値に変換して返却する return 100 * self.cp / self.max_cp end end # # カスタマイズポイントここまで。 #------------------------------------------------------------------------------ #============================================================================== # --- XRXS. CP機構 --- #============================================================================== module XRXS_CP_SYSTEM #---------------------------------------------------------------------------- # ○ 合計 AGI の取得 #---------------------------------------------------------------------------- def self.total_agi total = 0 for battler in $game_party.actors + $game_troop.enemies total += battler.agi end return total end end #============================================================================== # --- バトラーにCP機能を追加 モジュール --- #============================================================================== module XRXS_CP #-------------------------------------------------------------------------- # ○ 最大 CP の取得 #-------------------------------------------------------------------------- def max_cp return 65535 end #-------------------------------------------------------------------------- # ○ CP の取得と設定 #-------------------------------------------------------------------------- def cp return @cp == nil ? @cp = 0 : @cp end def cp=(n) @cp = [[n.to_i, 0].max, self.max_cp].min end #-------------------------------------------------------------------------- # ○ CP 初期設定 #-------------------------------------------------------------------------- def cp_preset percent = self.max_cp * XRXS65::CP_PRESET_RATIO * (rand(16) + 16) * self.agi / XRXS_CP_SYSTEM.total_agi / 24 self.cp = XRXS65::CP_PRESET_FIXNUM + percent end #-------------------------------------------------------------------------- # ○ CP カウントアップ #-------------------------------------------------------------------------- def cp_update self.cp += XRXS65::SPEED * 4096 * self.agi / XRXS_CP_SYSTEM.total_agi end #-------------------------------------------------------------------------- # ○ CP 満タン? #-------------------------------------------------------------------------- def cp_full? return @cp == self.max_cp end end class Game_Battler include XRXS_CP end #============================================================================== # --- ガード機能 --- #============================================================================== class Game_Battler #-------------------------------------------------------------------------- # ○ ガードフラグ #-------------------------------------------------------------------------- def guarding=(n) @guarding = n end #-------------------------------------------------------------------------- # ● 防御中判定 [再定義] #-------------------------------------------------------------------------- def guarding? return @guarding end end #============================================================================== # --- アクター「コマンド入力可能判定」:CPがないとコマンドしない --- #============================================================================== module XRXS_CP_INPUTABLE def inputable? return (self.cp_full? and super) end end class Game_Actor < Game_Battler include XRXS_CP_INPUTABLE end #============================================================================== # --- エネミー「行動可能判定」:CPがないとコマンドしない --- #============================================================================== module XRXS_CP_MOVABLE def movable? return (self.cp_full? and super) end end class Game_Enemy < Game_Battler include XRXS_CP_MOVABLE end #============================================================================== # --- 戦闘時 CPカウント --- #============================================================================== module XRXS_CP_Battle #-------------------------------------------------------------------------- # ○ パーティ全員の CP を初期設定 #-------------------------------------------------------------------------- def cp_preset_party for actor in $game_party.actors actor.cp_preset end end #-------------------------------------------------------------------------- # ○ トループ全員の CP を初期設定 #-------------------------------------------------------------------------- def cp_preset_troop for enemy in $game_troop.enemies enemy.cp_preset end end #-------------------------------------------------------------------------- # ○ バトラー全員の CP をカウントアップ #-------------------------------------------------------------------------- def cp_update for battler in $game_party.actors + $game_troop.enemies battler.cp_update end end end class Scene_Battle include XRXS_CP_Battle end #============================================================================== # ■ Scene_Battle #============================================================================== class Scene_Battle #-------------------------------------------------------------------------- # ● メイン処理 #-------------------------------------------------------------------------- alias xrxs65_main main def main # エクストラスプライトの初期化 @extra_sprites = [] if @extra_sprites == nil # CP の初期化 cp_preset_party # CP メーターの作成 @cp_meters = CP_Meters.new # CP メーターをエクストラスプライトへ登録 @extra_sprites.push(@cp_meters) # 呼び戻す xrxs65_main # メーターの解放 @cp_meters.dispose end #-------------------------------------------------------------------------- # ● 战斗阶段开始(和图标冲突了) #-------------------------------------------------------------------------- # alias xrxs65_start_phase1 start_phase1 # def start_phase1 # 呼び戻す # xrxs65_start_phase1 # CP の初期化 #cp_preset_troop # CP メーターの更新 # @cp_meters.refresh # インデックスを計算 #@cp_escape_actor_command_index = @actor_command_window.height/32 - 1 # アクターコマンドウィンドウに追加 #@actor_command_window.add_command("逃跑") # if !$game_temp.battle_can_escape # @actor_command_window.disable_item(@cp_escape_actor_command_index) # end # end #-------------------------------------------------------------------------- # ● パーティコマンドフェーズ開始 #-------------------------------------------------------------------------- alias xrxs65_start_phase2 start_phase2 def start_phase2 # 呼び戻す xrxs65_start_phase2 # パーティコマンドウィンドウを無効化 @party_command_window.active = false @party_command_window.visible = false # 強制的にフェイズ 2 を保持 @phase = 2 # ただし、既に行動可能者が存在する場合は 3 へ start_phase3 if anybody_movable? end #-------------------------------------------------------------------------- # ○ CP制での ターンのカウント #-------------------------------------------------------------------------- def cp_turn_count $game_temp.battle_turn += 1 # バトルイベントの全ページを検索 for index in 0...$data_troops[@troop_id].pages.size # このページのスパンが [ターン] の場合 if $data_troops[@troop_id].pages[index].span == 1 # 実行済みフラグをクリア $game_temp.battle_event_flags[index] = false end end end #-------------------------------------------------------------------------- # ● フレーム更新 (パーティコマンドフェーズ) #-------------------------------------------------------------------------- alias xrxs65_update_phase2 update_phase2 def update_phase2 # パーティコマンドウィンドウのインデックスを無効化 @party_command_window.index = -1 # 呼び戻す xrxs65_update_phase2 # 例外補正 @turn_count_time = 1 if @turn_count_time == nil # ターンのカウント if @turn_count_time > 0 @turn_count_time -= 1 if @turn_count_time == 0 cp_turn_count @turn_count_time = XRXS65::CPT if XRXS65::TC == nil end end # CP のフレーム更新 cp_update @cp_meters.refresh # フル CP のバトラーが存在する場合、ターン開始 start_phase3 if anybody_movable? end #-------------------------------------------------------------------------- # ○ フル CP バトラーが存在するか? #-------------------------------------------------------------------------- def anybody_movable? for battler in $game_party.actors + $game_troop.enemies return true if battler.cp_full? end return false end #-------------------------------------------------------------------------- # ● アクターコマンドウィンドウのセットアップ #-------------------------------------------------------------------------- alias xrxs65_phase3_setup_command_window phase3_setup_command_window def phase3_setup_command_window # 効果音の再生 Audio.se_play(XRXS65::COMMAND_UP_SE) rescue nil # 呼び戻す xrxs65_phase3_setup_command_window end #-------------------------------------------------------------------------- # ● メインフェーズ開始 #-------------------------------------------------------------------------- alias xrxs65_start_phase4 start_phase4 def start_phase4 # ターン数を引くことによって擬似的にカウントに変化を起こさせない $game_temp.battle_turn -= 1 # フラグを退避 save_flags = $game_temp.battle_event_flags.dup # 呼び戻す xrxs65_start_phase4 # フラグを復旧 $game_temp.battle_event_flags = save_flags end #-------------------------------------------------------------------------- # ● 行動順序作成 #-------------------------------------------------------------------------- alias xrxs65_make_action_orders make_action_orders def make_action_orders # 呼び戻す xrxs65_make_action_orders # CPが不足している場合は @action_battlers から除外する for battler in @action_battlers.dup @action_battlers.delete(battler) unless battler.cp_full? end end #-------------------------------------------------------------------------- # ● フレーム更新 (メインフェーズ ステップ 2 : アクション開始) #-------------------------------------------------------------------------- alias xrxs65_update_phase4_step2 update_phase4_step2 def update_phase4_step2 # ガードの解除 @active_battler.guarding = false # CPの消費 @active_battler.cp = 0 # CP メーターの更新 @cp_meters.refresh # 呼び戻す xrxs65_update_phase4_step2 # 例外補正 return if @active_battler == nil # ターンコントローラ if @active_battler.is_a?(Game_Enemy) and @active_battler.index == XRXS65::TC cp_turn_count end end #-------------------------------------------------------------------------- # ● 基本アクション 結果作成 #-------------------------------------------------------------------------- alias xrxs65_make_basic_action_result make_basic_action_result def make_basic_action_result # 呼び戻す xrxs65_make_basic_action_result # 防御の場合 if @active_battler.current_action.basic == 1 @active_battler.guarding = true return end # パーティの逃亡の場合 if @active_battler.current_action.basic == 4 # 逃走可能ではない場合 if $game_temp.battle_can_escape == false # ブザー SE を演奏 $game_system.se_play($data_system.buzzer_se) return end # パーティ全員の CP をクリア for actor in $game_party.actors actor.cp = 0 end # CP メーターの更新 @cp_meters.refresh # 逃走処理 update_phase2_escape return end end #-------------------------------------------------------------------------- # ● フレーム更新 (メインフェーズ ステップ 5 : ダメージ表示) #-------------------------------------------------------------------------- alias xrxs65_update_phase4_step5 update_phase4_step5 def update_phase4_step5 # 呼び戻す xrxs65_update_phase4_step5 # CP メーターの更新 @cp_meters.refresh end end #============================================================================== # --- CP メーターをまとめて管理するクラス、表示関係はすべてココ --- #============================================================================== class CP_Meters #-------------------------------------------------------------------------- # ○ オブジェクト初期化 #-------------------------------------------------------------------------- def initialize # メーター群の生成 @meters = [] for i in 0...$game_party.actors.size make_meter(i) end refresh end #-------------------------------------------------------------------------- # ○ リフレッシュ #-------------------------------------------------------------------------- def refresh # 戦闘メンバー数の変更を判別 for i in @meters.size...$game_party.actors.size make_meter(i) end for i in $game_party.actors.size...@meters.size @meters[i].dispose @meters[i] = nil end @meters.compact! # 表示更新 for i in 0...$game_party.actors.size actor = $game_party.actors[i] @meters[i].line = actor.cp_linetype @meters[i].amount = actor.cp_lineamount end end #-------------------------------------------------------------------------- # ○ メーターひとつの生成 #-------------------------------------------------------------------------- def make_meter(i) # スキンの取得 skin = RPG::Cache.windowskin(XRXS65::SKIN) # space = 640 / XRXS65::MAX case XRXS65::ALIGN when 0 actor_x = i * space + 4 when 1 actor_x = (space * ((XRXS65::MAX - $game_party.actors.size)/2.0 + i)).floor when 2 actor_x = (i + XRXS65::MAX - $game_party.actors.size) * space + 4 end meter = MeterSprite.new(skin, XRXS65::LINE_HEIGHT) meter.x = actor_x + XRXS65::X_OFFSET - skin.width meter.y = XRXS65::Y_OFFSET @meters[i] = meter end #-------------------------------------------------------------------------- # ○ 可視状態 #-------------------------------------------------------------------------- def visible=(b) @meters.each{|sprite| sprite.visible = b } end #-------------------------------------------------------------------------- # ○ 解放 #-------------------------------------------------------------------------- def dispose @meters.each{|sprite| sprite.dispose } end end #============================================================================== # --- XRXS. レクタンギュラーメーター表示・極 --- #============================================================================== class MeterSprite < Sprite #-------------------------------------------------------------------------- # ○ オブジェクト初期化 #-------------------------------------------------------------------------- def initialize(skin, line_height) @skin = skin @width = @skin.width @height = line_height @line = 1 @amount = 0 @base_sprite = Sprite.new @base_sprite.bitmap = @skin @base_sprite.src_rect.set(0, 0, @width, @height) @base_sprite.z = 601 super() self.z = @base_sprite.z + 1 self.bitmap = @skin self.line = 1 end #-------------------------------------------------------------------------- # ○ 値の設定 #-------------------------------------------------------------------------- def line=(n) @line = n refresh end def amount=(n) @amount = n refresh end def refresh self.src_rect.set(0, @line * @height, @width * @amount / 100, @height) end #-------------------------------------------------------------------------- # ○ 座標の設定 #-------------------------------------------------------------------------- def x=(n) super @base_sprite.x = n end def y=(n) super @base_sprite.y = n end #-------------------------------------------------------------------------- # ○ 解放 #-------------------------------------------------------------------------- def dispose @base_sprite.dispose super end end
# ▼▲▼ XRXS65A. CP制御ターンシステム「シンセ・ゲージ」 ▼▲▼ built201202 # by 桜雅 在土 #============================================================================== # □ カスタマイズポイント #============================================================================== class XRXS65A #-------------------------------------------------------------------------- # 「アイコン設定」 #-------------------------------------------------------------------------- DEFAULT = "怪物1" # ディフォルトアイコン # アイコンハッシュ 記述方式 : アクターID=>アイコン名 ICONS = { 1=>"1", 2=>"2", 3=>"3", 4=>"4", 5=>"5", 6=>"6", 7=>"8", 9=>"9", 10=>"10", 11=>"11", } # アイコンハッシュE 記述方式 : エネミーID=>アイコン名 ICONE = { 1=>"怪物1", 2=>"怪物2", 3=>"怪物3", 4=>"怪物4", 5=>"怪物5", 6=>"怪物6", 7=>"怪物7", 8=>"怪物8", } #-------------------------------------------------------------------------- # 「シンセ・ゲージ」 #-------------------------------------------------------------------------- SKIN = "123" # スキン X = 100 # X 座標 Y = 18 # Y 座標 end #============================================================================== # --- CP メーターをまとめて管理するクラス、表示関係はすべてココ --- [再定義] #============================================================================== class CP_Meters #-------------------------------------------------------------------------- # ○ オブジェクト初期化 #-------------------------------------------------------------------------- def initialize # シンセゲージの生成 @base = Sprite.new @base.bitmap = RPG::Cache.windowskin(XRXS65A::SKIN).dup @base.x = XRXS65A::X @base.y = XRXS65A::Y @base.z = XRXS65A::X @width = @base.bitmap.width @height = @base.bitmap.height @icon_set = [] refresh end #-------------------------------------------------------------------------- # ○ リフレッシュ #-------------------------------------------------------------------------- def refresh # 生成すべきバトラーの取得 need_initializes = [] for battler in $game_party.actors + $game_troop.enemies exist = false for set in @icon_set exist |= (set[1] == battler) end need_initializes.push(battler) unless exist end for battler in need_initializes iconname = nil if battler.is_a?(Game_Actor) iconname = XRXS65A::ICONS[battler.id] else iconname = XRXS65A::ICONE[battler.id] end if iconname == nil iconname = XRXS65A::DEFAULT end sprite = Sprite.new sprite.bitmap = RPG::Cache.icon(iconname).dup sprite.y = XRXS65A::Y + @height / 2 - 12 @icon_set.push([sprite, battler]) end # 更新 for set in @icon_set set[0].x = XRXS65A::X + @width * set[1].cp / set[1].max_cp - 12 set[0].z = set[0].x set[0].visible = false if set[1].dead? or !set[1].exist? end end #-------------------------------------------------------------------------- # ○ 可視状態 #-------------------------------------------------------------------------- def visible=(b) @base.visible = b @icon_set.each{|set| set[0].visible = b } end #-------------------------------------------------------------------------- # ○ 解放 #-------------------------------------------------------------------------- def dispose @base.dispose @icon_set.each{|set| set[0].dispose } end end
#============================================================================== # 本脚本来自[url]www.66RPG.com[/url],使用和转载请保留此信息 #============================================================================== # ———————————————————————————————————— # ▼▲▼ XRXS_BP 1. CP制導入 ver..23 ▼▲▼ # by 桜雅 在土, 和希 #============================================================================== # □ カスタマイズポイント #============================================================================== module XRXS_BP1 # # 对齐方式。0:左 1:中央 2:右 # ALIGN =0 # # 人数 # MAX = 4 end class Scene_Battle_CP # # 战斗速度 # BATTLE_SPEED = 2.0 # # 战斗开始的时候气槽百分比 # START_CP_PERCENT = 100 end class Scene_Battle # 效果音效,可以自己添加 DATA_SYSTEM_COMMAND_UP_SE = "" # 各项数值功能消耗的CP值 CP_COST_BASIC_ACTIONS = 0 # 基础共同 CP_COST_SKILL_ACTION = 65535 # 技能 CP_COST_ITEM_ACTION = 65535 # 物品 CP_COST_BASIC_ATTACK = 65535 # 攻撃 CP_COST_BASIC_GUARD = 65535-25535 # 防御-32768 CP_COST_BASIC_NOTHING = 65535 # 不做任何事情 CP_COST_BASIC_ESCAPE = 65535 # 逃跑 end #============================================================================== # --- XRXS.コマンドウィンドウ?コマンド追加機構 --- #------------------------------------------------------------------------------ # Window_Commandクラスに add_command メソッドを追加します。 #============================================================================== module XRXS_Window_Command_Add_Command #-------------------------------------------------------------------------- # ○ コマンドを追加 #-------------------------------------------------------------------------- def add_command(command) # 初期化されていない場合、無効化判別用の配列 @disabled の初期化 # if @disabled == nil @disabled = [] end if @commands.size != @disabled.size for i in 0...@commands.size @disabled[i] = false end end # # 追加 # @commands.push(command) @disabled.push(false) @item_max = @commands.size self.y -= 32 self.height += 32 self.contents.dispose self.contents = nil self.contents = Bitmap.new(self.width - 32, @item_max * 32) refresh for i in 0...@commands.size if @disabled[i] disable_item(i) end end end #-------------------------------------------------------------------------- # ○ 項目の無効化 # index : 項目番号 #-------------------------------------------------------------------------- def disable_item(index) if @disabled == nil @disabled = [] end @disabled[index] = true draw_item(index, disabled_color) end end class Window_Command < Window_Selectable #-------------------------------------------------------------------------- # ○ インクルード #-------------------------------------------------------------------------- include XRXS_Window_Command_Add_Command #-------------------------------------------------------------------------- # ● 項目の無効化 # index : 項目番号 #-------------------------------------------------------------------------- def disable_item(index) super end end #============================================================================== # □ Scene_Battle_CP #============================================================================== class Scene_Battle_CP #-------------------------------------------------------------------------- # ○ 公開インスタンス変数 #-------------------------------------------------------------------------- attr_accessor :stop # CP加算ストップ #---------------------------------------------------------------------------- # ○ オブジェクトの初期化 #---------------------------------------------------------------------------- def initialize @battlers = [] @cancel = false @stop = false @agi_total = 0 # 配列 count_battlers を初期化 count_battlers = [] # エネミーを配列 count_battlers に追加 for enemy in $game_troop.enemies count_battlers.push(enemy) end # アクターを配列 count_battlers に追加 for actor in $game_party.actors count_battlers.push(actor) end for battler in count_battlers @agi_total += battler.agi end for battler in count_battlers battler.cp = [[65535 * START_CP_PERCENT * (rand(15) + 85) * 4 * battler.agi / @agi_total / 10000, 0].max, 65535].min end end #---------------------------------------------------------------------------- # ○ CPカウントアップ #---------------------------------------------------------------------------- def update # ストップされているならリターン return if @stop # for battler in $game_party.actors + $game_troop.enemies # 行動出来なければ無視 if battler.dead? == true battler.cp = 0 next end battler.cp = [[battler.cp + BATTLE_SPEED * 4096 * battler.agi / @agi_total, 0].max, 65535].min end end #---------------------------------------------------------------------------- # ○ CPカウントの開始 #---------------------------------------------------------------------------- def stop @cancel = true if @cp_thread != nil then @cp_thread.join @cp_thread = nil end end end #============================================================================== # ■ Game_Battler #============================================================================== class Game_Battler attr_accessor :now_guarding # 現在防御中フラグ attr_accessor :cp # 現在CP attr_accessor :slip_state_update_ban # スリップ?ステート自動処理の禁止 #-------------------------------------------------------------------------- # ○ CP の変更 #-------------------------------------------------------------------------- def cp=(p) @cp = [[p, 0].max, 65535].min end #-------------------------------------------------------------------------- # ● 防御中判定 [ 再定義 ] #-------------------------------------------------------------------------- def guarding? return @now_guarding end #-------------------------------------------------------------------------- # ● コマンド入力可能判定 #-------------------------------------------------------------------------- alias xrxs_bp1_inputable? inputable? def inputable? bool = xrxs_bp1_inputable? return (bool and (@cp >= 65535)) end #-------------------------------------------------------------------------- # ● ステート [スリップダメージ] 判定 #-------------------------------------------------------------------------- alias xrxs_bp1_slip_damage? slip_damage? def slip_damage? return false if @slip_state_update_ban return xrxs_bp1_slip_damage? end #-------------------------------------------------------------------------- # ● ステート自然解除 (ターンごとに呼び出し) #-------------------------------------------------------------------------- alias xrxs_bp1_remove_states_auto remove_states_auto def remove_states_auto return if @slip_state_update_ban xrxs_bp1_remove_states_auto end end #============================================================================== # ■ Game_Actor #============================================================================== class Game_Actor < Game_Battler #-------------------------------------------------------------------------- # ● セットアップ #-------------------------------------------------------------------------- alias xrxs_bp1_setup setup def setup(actor_id) xrxs_bp1_setup(actor_id) @cp = 0 @now_guarding = false @slip_state_update_ban = false end end #============================================================================== # ■ Game_Enemy #============================================================================== class Game_Enemy < Game_Battler #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- alias xrxs_bp1_initialize initialize def initialize(troop_id, member_index) xrxs_bp1_initialize(troop_id, member_index) @cp = 0 @now_guarding = false @slip_state_update_ban = false end end #============================================================================== # ■ Window_BattleStatus CP绘制 #============================================================================== class Window_BattleStatus < Window_Base #-------------------------------------------------------------------------- # ○ 公開インスタンス変数 #-------------------------------------------------------------------------- attr_accessor :update_cp_only # CPメーターのみの更新 #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- alias xrxs_bp1_initialize initialize def initialize @update_cp_only = false xrxs_bp1_initialize end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- alias xrxs_bp1_refresh refresh def refresh unless @update_cp_only xrxs_bp1_refresh end refresh_cp end #-------------------------------------------------------------------------- # ○ リフレッシュ(CPのみ) #-------------------------------------------------------------------------- def refresh_cp for i in 0...$game_party.actors.size actor = $game_party.actors[i] width = [self.width*3/4 / XRXS_BP1::MAX, 100].max space = self.width / XRXS_BP1::MAX case XRXS_BP1::ALIGN when 0 actor_x = i * space + 4 when 1 actor_x = (space * ((XRXS_BP1::MAX - $game_party.actors.size)/3.0 + i)).floor when 2 actor_x = (i + XRXS_BP1::MAX - $game_party.actors.size) * space + 4 end actor_x += self.x draw_actor_cp_meter(actor, actor_x, 90, width, 0) end end #-------------------------------------------------------------------------- # ○ CPメーター の描画 #-------------------------------------------------------------------------- def draw_actor_cp_meter(actor, x, y, width = 200, type = 0) self.contents.font.color = system_color self.contents.fill_rect(x-1, y+27, width+10,9, Color.new(0, 0, 0, 150)) if actor.cp == nil actor.cp = 0 end w = width * [actor.cp,65535].min / 65535 self.contents.fill_rect(x+1, y+28, w+4,3, Color.new(0, 0, 0, 250)) self.contents.fill_rect(x+1, y+29, w+4,3, Color.new(255, 255, 0, 250)) self.contents.fill_rect(x+1, y+30, w+4,3, Color.new(200, 200, 0, 250)) self.contents.fill_rect(x+1, y+31, w+4,3, Color.new(128, 128, 0, 250)) end end #============================================================================== # ■ Scene_Battle #============================================================================== class Scene_Battle #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- alias xrxs_bp1_update update def update xrxs_bp1_update # CP更新 @cp_thread.update end #-------------------------------------------------------------------------- # ● バトル終了 # result : 結果 (0:勝利 1:敗北 2:逃走) #-------------------------------------------------------------------------- alias xrxs_bp1_battle_end battle_end def battle_end(result) # CPカウントを停止する @cp_thread.stop # 呼び戻す xrxs_bp1_battle_end(result) end #-------------------------------------------------------------------------- # ●战斗阶段開始 #-------------------------------------------------------------------------- alias xrxs_bp1_start_phase1 start_phase1 def start_phase1 @agi_total = 0 # CP加算を開始する @cp_thread = Scene_Battle_CP.new # 引索设定計算 @cp_escape_actor_command_index = @actor_command_window.height/32 - 1 # 返回命令窗口的追加 # @actor_command_window.add_command("逃跑") if !$game_temp.battle_can_escape # @actor_command_window.disable_item(@cp_escape_actor_command_index) end # 返回 xrxs_bp1_start_phase1 end #-------------------------------------------------------------------------- # ● パーティコマンドフェーズ開始 #-------------------------------------------------------------------------- alias xrxs_bp1_start_phase2 start_phase2 def start_phase2 xrxs_bp1_start_phase2 @party_command_window.active = false @party_command_window.visible = false # CP加算を再開する @cp_thread.stop = false # 次へ start_phase3 end #-------------------------------------------------------------------------- # ● アクターコマンドウィンドウのセットアップ #-------------------------------------------------------------------------- alias xrxs_bp1_phase3_setup_command_window phase3_setup_command_window def phase3_setup_command_window # CPスレッドを一時停止する @cp_thread.stop = true # ウィンドウのCP更新 @status_window.refresh_cp # @active_battlerの防御を解除 @active_battler.now_guarding = false # 効果音の再生 Audio.se_play(DATA_SYSTEM_COMMAND_UP_SE) if DATA_SYSTEM_COMMAND_UP_SE != "" # 呼び戻す xrxs_bp1_phase3_setup_command_window end #-------------------------------------------------------------------------- # ● フレーム更新 (アクターコマンドフェーズ : 基本コマンド) #-------------------------------------------------------------------------- alias xrxs_bsp1_update_phase3_basic_command update_phase3_basic_command def update_phase3_basic_command # C ボタンが押された場合 if Input.trigger?(Input::C) # アクターコマンドウィンドウのカーソル位置で分岐 case @actor_command_window.index when @cp_escape_actor_command_index # 逃げる if $game_temp.battle_can_escape # 決定 SE を演奏 $game_system.se_play($data_system.decision_se) # アクションを設定 @active_battler.current_action.kind = 0 @active_battler.current_action.basic = 4 # 次のアクターのコマンド入力へ phase3_next_actor else # ブザー SE を演奏 $game_system.se_play($data_system.buzzer_se) end return end end xrxs_bsp1_update_phase3_basic_command end #-------------------------------------------------------------------------- # ● メインフェーズ開始 #-------------------------------------------------------------------------- alias xrxs_bp1_start_phase4 start_phase4 def start_phase4 # 呼び戻す xrxs_bp1_start_phase4 # CPスレッドを一時停止する unless @action_battlers.empty? @cp_thread.stop = true end end #-------------------------------------------------------------------------- # ● 行動順序作成 #-------------------------------------------------------------------------- alias xrxs_bp1_make_action_orders make_action_orders def make_action_orders xrxs_bp1_make_action_orders # 全員のCPを確認 exclude_battler = [] for battler in @action_battlers # CPが不足している場合は @action_battlers から除外する if battler.cp < 65535 exclude_battler.push(battler) end end @action_battlers -= exclude_battler end #-------------------------------------------------------------------------- # ● フレーム更新 (メインフェーズ ステップ 1 : アクション準備) #-------------------------------------------------------------------------- alias xrxs_bp1_update_phase4_step1 update_phase4_step1 def update_phase4_step1 # 初期化 @phase4_act_continuation = 0 # 勝敗判定 if judge @cp_thread.stop # 勝利または敗北の場合 : メソッド終了 return end # 未行動バトラー配列の先頭から取得 @active_battler = @action_battlers[0] # ステータス更新をCPだけに限定。 @status_window.update_cp_only = true # ステート更新を禁止。 @active_battler.slip_state_update_ban = true if @active_battler != nil # 戻す xrxs_bp1_update_phase4_step1 # @status_windowがリフレッシュされなかった場合は手動でリフレッシュ(CPのみ) if @phase4_step != 2 # リフレッシュ @status_window.refresh # 軽量化:たったコレだけΣ(?w? Graphics.frame_reset end # 禁止を解除 @status_window.update_cp_only = false @active_battler.slip_state_update_ban = false if @active_battler != nil end #-------------------------------------------------------------------------- # ● フレーム更新 (メインフェーズ ステップ 2 : アクション開始) #-------------------------------------------------------------------------- alias xrxs_bp1_update_phase4_step2 update_phase4_step2 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 @phase4_act_continuation == 0 and @active_battler.cp >= 65535 # ステート自然解除 @active_battler.remove_states_auto # CP消費 @active_battler.cp -= 65535 # ステータスウィンドウをリフレッシュ @status_window.refresh end # ステップ 1 に移行 @phase4_step = 1 return end end # アクションの種別で分岐 case @active_battler.current_action.kind when 0 # 攻撃?防御?逃げる?何もしない時の共通消費CP @active_battler.cp -= CP_COST_BASIC_ACTIONS if @phase4_act_continuation == 0 when 1 # スキル使用時の消費CP @active_battler.cp -= CP_COST_SKILL_ACTION if @phase4_act_continuation == 0 when 2 # アイテム使用時の消費CP @active_battler.cp -= CP_COST_ITEM_ACTION if @phase4_act_continuation == 0 end # ステート自然解除 @active_battler.remove_states_auto # 呼び戻す xrxs_bp1_update_phase4_step2 end #-------------------------------------------------------------------------- # ● 基本アクション 結果作成 #-------------------------------------------------------------------------- alias xrxs_bp1_make_basic_action_result make_basic_action_result def make_basic_action_result # 攻撃の場合 if @active_battler.current_action.basic == 0 and @phase4_act_continuation == 0 @active_battler.cp -= CP_COST_BASIC_ATTACK # 攻撃時のCP消費 end # 防御の場合 if @active_battler.current_action.basic == 1 and @phase4_act_continuation == 0 @active_battler.cp -= CP_COST_BASIC_GUARD # 防御時のCP消費 # @active_battlerの防御をON @active_battler.now_guarding = true end # 敵の逃げるの場合 if @active_battler.is_a?(Game_Enemy) and @active_battler.current_action.basic == 2 and @phase4_act_continuation == 0 @active_battler.cp -= CP_COST_BASIC_ESCAPE # 逃走時のCP消費 end # 何もしないの場合 if @active_battler.current_action.basic == 3 and @phase4_act_continuation == 0 @active_battler.cp -= CP_COST_BASIC_NOTHING # 何もしない時のCP消費 end # 逃げるの場合 if @active_battler.current_action.basic == 4 and @phase4_act_continuation == 0 @active_battler.cp -= CP_COST_BASIC_ESCAPE # 逃走時のCP消費 # 逃走可能ではない場合 if $game_temp.battle_can_escape == false # ブザー SE を演奏 $game_system.se_play($data_system.buzzer_se) return end # 逃走処理 update_phase2_escape return end # 呼び戻す xrxs_bp1_make_basic_action_result end #-------------------------------------------------------------------------- # ● フレーム更新 (メインフェーズ ステップ 6 : リフレッシュ) #-------------------------------------------------------------------------- alias xrxs_bp1_update_phase4_step6 update_phase4_step6 def update_phase4_step6 # スリップダメージ if @active_battler.hp > 0 and @active_battler.slip_damage? @active_battler.slip_damage_effect @active_battler.damage_pop = true # ステータスウィンドウをリフレッシュ @status_window.refresh end # 呼び戻す xrxs_bp1_update_phase4_step6 end end #============================================================================== # 本脚本来自[url]www.66RPG.com[/url],使用和转载请保留此信息 #==============================================================================
欢迎光临 Project1 (https://rpg.blue/) | Powered by Discuz! X3.1 |