# #  連撃(Ver2.00) #  (C)2006,2007 TYPE74RX-T # #============================================================================== # ★ メモ:再定義メソッド(エイリアスしていない部分) #------------------------------------------------------------------------------ #  RPG::Sprite # def effect? …55行目 #============================================================================== $rx_skl_dam_dur = 0 # スキル発動速度(ダメージ) $rx_skl_anm_dur = 0 # スキル発動速度(戦闘アニメ) $rx_anm_spd_limit = false # 行動側アニメーションの速度制限(初回のみ) #============================================================================== # ★ RX_T #------------------------------------------------------------------------------ #  連撃関連に使う汎用モジュールです。 #============================================================================== module RX_T #-------------------------------------------------------------------------- # ● 配列に指定名を含む属性があるか #-------------------------------------------------------------------------- def RX_T.check_element(el_set, state_name) result = false for i in 0...el_set.size if $data_system.elements[el_set[i]].include?(state_name) # 結果を真に result = true break end end return result end #-------------------------------------------------------------------------- # ● 配列に指定名を含む属性と数値があれば配列内の数値を返す #-------------------------------------------------------------------------- def RX_T.get_num_from_element(el_set, state_name) numeric = 1 for i in 0...el_set.size if $data_system.elements[el_set[i]].include?(state_name) # ステート名から数字を抜き出す numeric = $data_system.elements[el_set[i]].scan(/[\d\-]+/) # 抜き出した数字文字列を数値に変える numeric = numeric[0].to_i break end end return numeric end #-------------------------------------------------------------------------- # ● 配列に指定名を含む属性と数値があれば属性IDを返す #-------------------------------------------------------------------------- def RX_T.get_id_from_element(el_set, state_name) numeric = 0 for i in 0...el_set.size if $data_system.elements[el_set[i]].include?(state_name) # ステート名から ID を抜き出す numeric = el_set[i] break end end return numeric end end #-------------------------------------------------------------------------- # ★ RPG::Sprite(再定義) #-------------------------------------------------------------------------- class RPG::Sprite def effect? @_whiten_duration > 0 or @_appear_duration > 0 or @_escape_duration > 0 or @_collapse_duration > 0 or # ★ 戦闘アニメ速度が 0 でなく、速度制限がなければ if $rx_skl_anm_dur > 0 and not $rx_anm_spd_limit @_damage_duration > $rx_skl_dam_dur or @_animation_duration > $rx_skl_anm_dur else @_damage_duration > 0 or @_animation_duration > 0 end end end #============================================================================== # ■ Game_Temp #------------------------------------------------------------------------------ #  セーブデータに含まれない、一時的なデータを扱うクラスです。このクラスのイン # スタンスは $game_temp で参照されます。 #============================================================================== class Game_Temp #-------------------------------------------------------------------------- # ★ スキル発動時に表示されるスキル名を通常表示モードに(戦闘用) #-------------------------------------------------------------------------- def rx_skill_name_seen @rx_s_seen = true end #-------------------------------------------------------------------------- # ★ スキル発動時に表示されるスキル名を非表示モードに(戦闘用) #-------------------------------------------------------------------------- def rx_skill_name_unseen @rx_s_seen = false end #-------------------------------------------------------------------------- # ★ スキル発動時に表示されるスキル名が通常表示モードか判定(戦闘用) #-------------------------------------------------------------------------- def rx_skill_name_v_status return @rx_s_seen end end #============================================================================== # ■ Game_Battler #------------------------------------------------------------------------------ #  バトラーを扱うクラスです。このクラスは Game_Actor クラスと Game_Enemy クラ # スのスーパークラスとして使用されます。 #============================================================================== class Game_Battler #-------------------------------------------------------------------------- # ★ SP の増加(最大値を超えて増加) #-------------------------------------------------------------------------- def rx_gain_sp(point) @sp += point end #-------------------------------------------------------------------------- # ● 属性修正の計算 # element_set : 属性 #-------------------------------------------------------------------------- alias rx_rgssbx_elements_correct elements_correct def elements_correct(element_set) # 無属性の場合 if element_set == [] # 100 を返す return 100 end # システム属性を排除する if RX_T.check_element(element_set, "連撃x") element_set -= [RX_T.get_id_from_element(element_set, "連撃x")] end if RX_T.check_element(element_set, "FB") element_set -= [RX_T.get_id_from_element(element_set, "FB")] end if RX_T.check_element(element_set, "ランダムターゲット") element_set -= [RX_T.get_id_from_element(element_set, "ランダムターゲット")] end if RX_T.check_element(element_set, "敵全体攻撃") element_set -= [RX_T.get_id_from_element(element_set, "敵全体攻撃")] end if RX_T.check_element(element_set, "連撃コンプ") element_set -= [RX_T.get_id_from_element(element_set, "連撃コンプ")] end if RX_T.check_element(element_set, "スキルシフト") element_set -= [RX_T.get_id_from_element(element_set, "スキルシフト")] end if RX_T.check_element(element_set, "発動モーション") element_set -= [RX_T.get_id_from_element(element_set, "発動モーション")] end if RX_T.check_element(element_set, "全発動モーション") element_set -= [RX_T.get_id_from_element(element_set, "全発動モーション")] end if RX_T.check_element(element_set, "スキル名非表示") element_set -= [RX_T.get_id_from_element(element_set, "スキル名非表示")] end if RX_T.check_element(element_set, "発動速度D") element_set -= [RX_T.get_id_from_element(element_set, "発動速度D")] end if RX_T.check_element(element_set, "発動速度A") element_set -= [RX_T.get_id_from_element(element_set, "発動速度A")] end # メソッドを呼び戻す rx_rgssbx_elements_correct(element_set) end end #============================================================================== # ■ Window_Help #------------------------------------------------------------------------------ #  スキルやアイテムの説明、アクターのステータスなどを表示するウィンドウです。 #============================================================================== class Window_Help < Window_Base #-------------------------------------------------------------------------- # ● テキスト設定 # text : ウィンドウに表示する文字列 # align : アラインメント (0..左揃え、1..中央揃え、2..右揃え) #-------------------------------------------------------------------------- alias rx_rgssbx_set_text set_text def set_text(text, align = 0) # スキル名が通常表示モードでないなら unless $game_temp.rx_skill_name_v_status # スキル名を通常表示モードに $game_temp.rx_skill_name_seen # スキル名を表示しないまま処理を終了 return end # メソッドを呼び戻す rx_rgssbx_set_text(text, align) end end #============================================================================== # ■ Scene_Battle #------------------------------------------------------------------------------ #  バトル画面の処理を行うクラスです。 #============================================================================== class Scene_Battle #-------------------------------------------------------------------------- # ● エネミー選択開始 #-------------------------------------------------------------------------- alias rx_rgssbx_start_enemy_select start_enemy_select def start_enemy_select # 通常攻撃かつ、全体攻撃武器を装備している場合 if @active_battler.current_action.basic == 0 and @active_battler.current_action.kind == 0 and @active_battler.weapon_id > 0 and RX_T.check_element($data_weapons[@active_battler.weapon_id].element_set, "敵全体攻撃") # 通常攻撃選択フラグをOFF @rx_normal_attack = false # 次のアクターのコマンド入力へ phase3_next_actor return end # メソッドを呼び戻す rx_rgssbx_start_enemy_select end #-------------------------------------------------------------------------- # ● フレーム更新 (メインフェーズ ステップ 1 : アクション準備) #-------------------------------------------------------------------------- alias rx_rgssbx_update_phase4_step1 update_phase4_step1 def update_phase4_step1 # メソッドを呼び戻す rx_rgssbx_update_phase4_step1 # 行動者バトラーが nil または 戦闘不能状態にある時は一切処理させない # (戦闘不能者バトラーの奇行を回避) if @active_battler == nil or @active_battler.dead? @phase4_step = 1 return end # 連撃可能回数(最大値と現在値)の初期化 @rx_max_continuous_atks = 1 @rx_atk_count = 0 # 全発動モーションフラグの初期化 @rx_all_movement_motion = false # フィニッシュブローフラグの初期化 @rx_fb_flag = false $rx_skl_dam_dur = 0 # スキル発動速度(ダメージ)の初期化 $rx_skl_anm_dur = 0 # スキル発動速度(戦闘アニメ)の初期化 @rx_random_target = false # ランダムターゲットフラグの初期化 end #-------------------------------------------------------------------------- # ● フレーム更新 (メインフェーズ ステップ 2 : アクション開始) #-------------------------------------------------------------------------- alias rx_rgssbx_update_phase4_step2 update_phase4_step2 def update_phase4_step2 # メソッドを呼び戻す rx_rgssbx_update_phase4_step2 # 連続行動中かつ全発動モーションフラグが無効の場合 if @rx_atk_count >= 1 and not @rx_all_movement_motion # ステップ 4 に移行(行動側アニメーションスキップ) @phase4_step = 4 return end end #-------------------------------------------------------------------------- # ★ 基本アクション時の特殊効果前処理 #-------------------------------------------------------------------------- def rx_weapon_special_effect(weapon_id) #$rx_skl_dam_dur = 0 # スキル発動速度(ダメージ)の初期化 #$rx_skl_anm_dur = 0 # スキル発動速度(戦闘アニメ)の初期化 # 一時的に装備武器データを読み込む weapon = $data_weapons[weapon_id] # 連撃属性があれば if RX_T.check_element(weapon.element_set, "連撃x") # 連撃可能数を取得 @rx_max_continuous_atks = RX_T.get_num_from_element(weapon.element_set, "連撃x") end # スキル発動速度(戦闘アニメ)属性なら if RX_T.check_element(weapon.element_set, "発動速度A") # スキル発動速度(戦闘アニメ)速度を設定しておく $rx_skl_anm_dur = RX_T.get_num_from_element(weapon.element_set, "発動速度A") end # スキル発動速度(ダメージ)属性なら if RX_T.check_element(weapon.element_set, "発動速度D") # スキル発動速度(ダメージ)速度を設定しておく $rx_skl_dam_dur = RX_T.get_num_from_element(weapon.element_set, "発動速度D") end end #-------------------------------------------------------------------------- # ● 基本アクション 結果作成 #-------------------------------------------------------------------------- alias rx_rgssbx_make_basic_action_result make_basic_action_result def make_basic_action_result # 武器装備フラグを初期化 @rxbx_weapon_equip = false # 以下、全て行動者がアクターの場合のもの。 # 何か武器を装備している時 if @active_battler.is_a?(Game_Actor) and @active_battler.weapon_id > 0 # ★ 基本アクション時の特殊効果前処理(武器装備時) rx_weapon_special_effect(@active_battler.weapon_id) # 武器装備フラグを立てる @rxbx_weapon_equip = true end # スキル使用フラグがあり、かつ、防御を選択していなければ if @active_battler.is_a?(Game_Actor) and @active_battler.current_action.kind == 1 and @active_battler.current_action.basic != 1 # スキルアクション 結果作成へ make_skill_action_result return end # 攻撃の場合(ランダムターゲット属性の武器を装備している場合) if @rxbx_weapon_equip and @active_battler.current_action.basic == 0 and RX_T.check_element($data_weapons[@active_battler.weapon_id].element_set, "ランダムターゲット") # アニメーション ID を設定 @animation1_id = @active_battler.animation1_id @animation2_id = @active_battler.animation2_id if @active_battler.restriction == 3 # ランダムに一体を選択 target = $game_party.random_target_actor @target_battlers = [target] elsif @active_battler.restriction == 2 # ランダムに一体を選択 target = $game_troop.random_target_enemy @target_battlers = [target] else # ランダムに一体を選択 target = $game_troop.random_target_enemy @target_battlers = [target] end # 通常攻撃の効果を適用 for target in @target_battlers target.attack_effect(@active_battler) end return end # 攻撃の場合(敵全体攻撃の場合) if @rxbx_weapon_equip and @active_battler.current_action.basic == 0 and RX_T.check_element($data_weapons[@active_battler.weapon_id].element_set, "敵全体攻撃") # アニメーション ID を設定 @animation1_id = @active_battler.animation1_id @animation2_id = @active_battler.animation2_id if @active_battler.restriction == 3 # 味方全体をターゲットに for actor in $game_party.actors if actor.exist? @target_battlers.push(actor) end end elsif @active_battler.restriction == 2 # 敵全体をターゲットに for enemy in $game_troop.enemies if enemy.exist? @target_battlers.push(enemy) end end else # 敵全体をターゲットに for enemy in $game_troop.enemies if enemy.exist? @target_battlers.push(enemy) end end end # 通常攻撃の効果を適用 for target in @target_battlers target.attack_effect(@active_battler) end return end # 防御の場合 (連撃可能状態の場合) if @rxbx_weapon_equip and @active_battler.current_action.basic == 1 and @rx_max_continuous_atks > 1 # 連撃可能数を1に @rx_max_continuous_atks = 1 # ヘルプウィンドウに "防御" を表示 @help_window.set_text($data_system.words.guard, 1) return end # 何もしないの場合 (連撃可能状態の場合) if @rxbx_weapon_equip and @active_battler.current_action.basic == 3 and @rx_max_continuous_atks > 1 # 連撃可能数を1に @rx_max_continuous_atks = 1 # アクション強制対象のバトラーをクリア $game_temp.forcing_battler = nil # ステップ 1 に移行 @phase4_step = 1 return end # メソッドを呼び戻す rx_rgssbx_make_basic_action_result end #-------------------------------------------------------------------------- # ● スキルまたはアイテムの対象側バトラー設定 # scope : スキルまたはアイテムの効果範囲 #-------------------------------------------------------------------------- alias rx_rgssbx_set_target_battlers set_target_battlers def set_target_battlers(scope) # メソッドを呼び戻す rx_rgssbx_set_target_battlers(scope) # 使用スキル(またはアイテム)がランダムターゲット属性なら if @rx_random_target # 行動側バトラーがエネミーの場合 if @active_battler.is_a?(Game_Enemy) # 効果範囲が敵全体なら if scope == 2 # 味方を攻撃する場合 if @active_battler.restriction == 3 # ランダムにエネミー一体を選択 target = $game_troop.random_target_enemy @target_battlers = [target] else # ランダムにアクター一体を選択 target = $game_party.random_target_actor @target_battlers = [target] end end end # 行動側バトラーがアクターの場合 if @active_battler.is_a?(Game_Actor) # 効果範囲が敵単体(もしくは全体)なら if scope == 1 or scope == 2 # 味方を攻撃する場合 if @active_battler.restriction == 3 # ランダムにアクター一体を選択 target = $game_party.random_target_actor @target_battlers = [target] else # ランダムにエネミー一体を選択 target = $game_troop.random_target_enemy @target_battlers = [target] end end end end end #-------------------------------------------------------------------------- # ★ スキル使用時の特殊効果前処理 #-------------------------------------------------------------------------- def rx_skill_special_effect(skill_id) # 連撃の初回(もしくは連撃可能状態ではない)の場合 if @rx_atk_count < 1 # SP 切れなどで使用できなくなった場合 unless @active_battler.skill_can_use?(@active_battler.current_action.skill_id) # アクション強制対象のバトラーをクリア $game_temp.forcing_battler = nil @rx_clear = true return end end # 一時的にスキルデータを読み込む skill = $data_skills[skill_id] # ランダムターゲット属性があれば if RX_T.check_element(skill.element_set, "ランダムターゲット") # ランダムターゲットフラグをオンに @rx_random_target = true end # 連撃属性があれば if RX_T.check_element(skill.element_set, "連撃x") # 連撃可能数を取得 @rx_max_continuous_atks = RX_T.get_num_from_element(skill.element_set, "連撃x") end # 連撃の2回目以降なら if @rx_max_continuous_atks > 1 and @rx_atk_count > 0 # SP 増加 @active_battler.rx_gain_sp(skill.sp_cost) end # スキル使用時、スキル名非表示属性なら if skill.element_set.include?($data_system.elements.index("スキル名非表示")) # スキル名を非表示モードに $game_temp.rx_skill_name_unseen end # スキル発動速度(戦闘アニメ)属性なら if RX_T.check_element(skill.element_set, "発動速度A") # スキル発動速度(戦闘アニメ)速度を設定しておく $rx_skl_anm_dur = RX_T.get_num_from_element(skill.element_set, "発動速度A") end # スキル発動速度(ダメージ)属性なら if RX_T.check_element(skill.element_set, "発動速度D") # スキル発動速度(ダメージ)速度を設定しておく $rx_skl_dam_dur = RX_T.get_num_from_element(skill.element_set, "発動速度D") end end #-------------------------------------------------------------------------- # ● スキルアクション 結果作成 #-------------------------------------------------------------------------- alias rx_rgssbx_make_skill_action_result make_skill_action_result def make_skill_action_result # フラグを初期化 @rx_clear = false # ★ スキル使用時の特殊効果前処理 rx_skill_special_effect(@active_battler.current_action.skill_id) # ★ アクション強制対象のバトラーがクリアされていたら if @rx_clear # ステップ 1 に移行 @phase4_step = 1 return end # メソッドを呼び戻す rx_rgssbx_make_skill_action_result end #-------------------------------------------------------------------------- # ★ アイテム使用時の特殊効果前処理 #-------------------------------------------------------------------------- def rx_item_special_effect(item) #$rx_skl_dam_dur = 0 # スキル発動速度(ダメージ)の初期化 #$rx_skl_anm_dur = 0 # スキル発動速度(戦闘アニメ)の初期化 @rx_random_target = false # ランダムターゲットフラグの初期化 # 消耗品の場合 if item.consumable # 連撃中なら予め アイテム減少を阻止#を1つ増加しておく if @rx_atk_count > 0 $game_party.gain_item(item.id, 1) else # アイテム切れなどで使用できなくなった場合 unless $game_party.item_can_use?(item.id) # このメソッドの処理をスルーする @rx_clear = true return end end end # ランダムターゲット属性があれば if RX_T.check_element(item.element_set, "ランダムターゲット") # ランダムターゲットフラグをオンに @rx_random_target = true end # 連撃属性があれば if RX_T.check_element(item.element_set, "連撃x") # 連撃可能数を取得 @rx_max_continuous_atks = RX_T.get_num_from_element(item.element_set, "連撃x") end # スキル発動速度(戦闘アニメ)属性なら if RX_T.check_element(item.element_set, "発動速度A") # スキル発動速度(戦闘アニメ)速度を設定しておく $rx_skl_anm_dur = RX_T.get_num_from_element(item.element_set, "発動速度A") end # スキル発動速度(ダメージ)属性なら if RX_T.check_element(item.element_set, "発動速度D") # スキル発動速度(ダメージ)速度を設定しておく $rx_skl_dam_dur = RX_T.get_num_from_element(item.element_set, "発動速度D") end end #-------------------------------------------------------------------------- # ● アイテムアクション 結果作成 #-------------------------------------------------------------------------- alias rx_rgssbx_make_item_action_result make_item_action_result def make_item_action_result # フラグを初期化 @rx_clear = false # アイテム使用時の特殊効果前処理 rx_item_special_effect($data_items[@active_battler.current_action.item_id]) # ★ アイテム切れなどで使用できなくなった場合 if @rx_clear # ステップ 1 に移行 @phase4_step = 1 return end # メソッドを呼び戻す rx_rgssbx_make_item_action_result end #-------------------------------------------------------------------------- # ● フレーム更新 (メインフェーズ ステップ 3 : 行動側アニメーション) #-------------------------------------------------------------------------- alias rx_rgaabx_update_phase4_step3 update_phase4_step3 def update_phase4_step3 # 連撃の初回なら if @rx_atk_count < 1 # 行動側アニメーションの高速化を制限 $rx_anm_spd_limit = true end # メソッドを呼び戻す rx_rgaabx_update_phase4_step3 end #-------------------------------------------------------------------------- # ● フレーム更新 (メインフェーズ ステップ 4 : 対象側アニメーション) #-------------------------------------------------------------------------- alias rx_rgaabx_update_phase4_step4 update_phase4_step4 def update_phase4_step4 # 行動側アニメーションの高速化の制限を解除 $rx_anm_spd_limit = false # メソッドを呼び戻す rx_rgaabx_update_phase4_step4 end #-------------------------------------------------------------------------- # ● フレーム更新 (メインフェーズ ステップ 5 : ダメージ表示) #-------------------------------------------------------------------------- alias rx_rgssbx_update_phase4_step5 update_phase4_step5 def update_phase4_step5 # 攻撃した回数を増やす @rx_atk_count += 1 # 連撃中で、かつ、勝負がついていない場合 if @rx_atk_count < @rx_max_continuous_atks and !judge # ステータスウィンドウをリフレッシュ @status_window.refresh # ダメージ表示 for target in @target_battlers if target.damage != nil target.damage_pop = true end end # ステップ 2 に移行 @phase4_step = 2 return end # メインフェーズのステップが2に指定されていない場合 # (=連撃中でないか連撃が終了していれば) unless @phase4_step == 2 # メソッドを呼び戻す rx_rgssbx_update_phase4_step5 $rx_skl_dam_dur = 0 # スキル発動速度(ダメージ)の初期化 $rx_skl_anm_dur = 0 # スキル発動速度(戦闘アニメ)の初期化 # 全発動モーションフラグをOFFに @rx_all_movement_motion = false end end end