#============================================================================== # ■ XP-RGSS-13 スキル連撃 [Ver.3.3.0] by Claimh #------------------------------------------------------------------------------ # ・スキル攻撃時にタイミング良くキーを入力することで、追加攻撃が発動する。 # ・オート発動、連続追加攻撃回数も設定可能 # ・追加攻撃を発動させるキー入力のタイミング # 対象側のアニメーションが表示される直前 # ・スキルアップデートと併用することで、スキルレベル制が導入できる。 # その際、連続回数は設定した連続回数+スキルレベルとなる #============================================================================== module ExtraSkill SKILL_CHASE = [] #============================================================================== # □ カスタマイズSTART #============================================================================== # 追加攻撃発動キー SKILL_CHASE_KEY = Input::C # スキルレベル制を導入する USE_SKILL_LEVEL = false # 不要ならfalse # ダメージ一括表示 SKILL_CHASE_DMG_ALL = true # 不要ならfalse # 対象側アニメーションの間にウェイトを入れる SKILL_CHASE_WAIT = 4 # 数値はフレーム数、不要ならnil # ミスなら追加攻撃しない SKILL_CHASE_MISS = true # 不要ならfalse # クリティカル発生時にアニメーションを変化させる SKILL_CHASE_CRITICAL = true # 不要ならfalse # 物理攻撃系スキルの属性ID CHASE_WEAPON = 19 # 魔法攻撃系スキルの属性ID CHASE_MAGIC = 20 # 成功時に鳴らすSE SKILL_CHASE_SE = "020-Teleport03" # 不要ならnil # 設定例 # SKILL_CHASE[スキルID] = [追加攻撃の攻撃力(%), 連鎖アニメID, オート発動フラグ, # 成功率, 連続回数,クリティカル時アニメ]] SKILL_CHASE[57] = [100, 31, false, 100, 5, 32] SKILL_CHASE[61] = [100, 42, false, 100, 4, 43] #============================================================================== # □ カスタマイズEND #============================================================================== end class Scene_Battle include ExtraSkill attr_accessor :skill_chase_exercise # 追加攻撃実行中 attr_accessor :skill_chase_end # 追加攻撃終了 attr_accessor :skill_chase_first # 追加攻撃 第1攻撃[スキル] attr_accessor :skill_chase_set # 追加攻撃 設定値 attr_accessor :skill_atk_f # 追加攻撃 威力 attr_accessor :chase_skill_type # 追加攻撃 スキルタイプ #-------------------------------------------------------------------------- # ● 追尾判定用データ初期化 #-------------------------------------------------------------------------- def init_chase @skill_chase_flg = false # 追加攻撃開始 self.skill_chase_exercise = false # 追加攻撃実行中 self.skill_chase_end = false # 追加攻撃終了 @skill_chase_check_key = false # 追加攻撃判定実行中 @skill_chase_success = false # 追加攻撃成功 @skill_chase_count = 0 # 追加攻撃数カウント self.skill_chase_first = true # 初期フラグ self.skill_chase_set = [] self.skill_atk_f = 0 self.chase_skill_type = 0 end #-------------------------------------------------------------------------- # ● フレーム更新 (メインフェーズ ステップ 1 : アクション準備) #-------------------------------------------------------------------------- alias update_phase4_step1_skill_chase update_phase4_step1 def update_phase4_step1 update_phase4_step1_skill_chase init_chase end #-------------------------------------------------------------------------- # ● フレーム更新 (メインフェーズ ステップ 3 : 行動側アニメーション) #-------------------------------------------------------------------------- alias update_phase4_step3_skill_chase update_phase4_step3 def update_phase4_step3 # 追加攻撃実行中ならステップ4に強制移行 if self.skill_chase_exercise # ステップ 4 に移行 @phase4_step = 4 return elsif @active_battler.current_action.kind == 1 if @active_battler.is_a?(Game_Actor) # 追加攻撃チェック skill_chase_check(@skill) end end update_phase4_step3_skill_chase # 原物 end #-------------------------------------------------------------------------- # ● 判定・設定 #-------------------------------------------------------------------------- def skill_chase_check(skill) unless SKILL_CHASE[skill.id].nil? self.skill_chase_set = SKILL_CHASE[skill.id] @skill_chase_flg = true end end #-------------------------------------------------------------------------- # ● フレーム更新 (メインフェーズ ステップ 4 : 対象側アニメーション) #-------------------------------------------------------------------------- alias update_phase4_step4_skill_chase update_phase4_step4 def update_phase4_step4 # 追加攻撃 if @skill_chase_flg # キーチェックを開始する @skill_chase_check_key = true # 追加攻撃実行中ならアニメーション再セット if self.skill_chase_exercise @animation2_id = self.skill_chase_set[1] end # 対象側アニメーション for target in @target_battlers # クリティカルでアニメーション変化 if SKILL_CHASE_CRITICAL and target.critical and self.skill_chase_first target.animation_id = self.skill_chase_set[5] else # 一度でもクリティカルがあった if target.once_critical and SKILL_CHASE_DMG_ALL target.critical = true end target.animation_id = @animation2_id end target.animation_hit = (target.damage != "Miss") end # ウェイトを入れる if SKILL_CHASE_WAIT != nil @wait_count = SKILL_CHASE_WAIT end # ステップ 5 に移行 @phase4_step = 5 return end update_phase4_step4_skill_chase # 原物 end #-------------------------------------------------------------------------- # ● 追加攻撃力設定 #-------------------------------------------------------------------------- def skill_chase_atk # 物理攻撃系 if @skill.element_set.include?(CHASE_WEAPON) self.chase_skill_type = 1 self.skill_atk_f = @skill.atk_f/100 # 魔法攻撃系 elsif @skill.element_set.include?(CHASE_MAGIC) self.chase_skill_type = 2 self.skill_atk_f = @skill.int_f/100 else p "設定ミス" end self.skill_chase_set[0] = @skill.power * self.skill_chase_set[0]/100 end #-------------------------------------------------------------------------- # ● フレーム更新 (メインフェーズ ステップ 5 : ダメージ表示) #-------------------------------------------------------------------------- alias update_phase4_step5_skill_chase update_phase4_step5 def update_phase4_step5 # キーチェック終了 @skill_chase_check_key = false # 追加攻撃成功 if @skill_chase_success skill_chase_atk # 追加攻撃実行中に移行 self.skill_chase_exercise = true end # ダメージ一括表示 if SKILL_CHASE_DMG_ALL and self.skill_chase_exercise # 追加攻撃終了or追加攻撃失敗 if self.skill_chase_end or !@skill_chase_success self.skill_chase_exercise = false @skill_chase_flg = false self.skill_chase_end = false # ヘルプウィンドウを隠す @help_window.visible = false # ステータスウィンドウをリフレッシュ @status_window.refresh # 積算ダメージの描写 for target in @target_battlers if target.skill_chase_all_dmg != nil target.damage = target.skill_chase_all_dmg target.damage_pop = true target.skill_chase_all_dmg = nil # 途中で死んでたらトドメをさす if target.skill_chase_dead_end target.hp = 0 target.skill_chase_dead_end = false end # クリティカルが発生している if target.once_critical target.critical = true target.once_critical = false end end end # ステップ 6 に移行 @phase4_step = 6 return end else update_phase4_step5_skill_chase # 原物 end # 追加攻撃終了or追加攻撃失敗 if self.skill_chase_end or !@skill_chase_success self.skill_chase_exercise = false @skill_chase_flg = false self.skill_chase_end = false if SKILL_CHASE_DMG_ALL for target in @target_battlers target.skill_chase_all_dmg = nil if target.skill_chase_dead_end target.hp = 0 target.skill_chase_dead_end = false end end end end if self.skill_chase_exercise @skill_chase_success = false # 追加攻撃開始 @phase4_step = 2 @active_battler.current_action.kind = 0 @active_battler.current_action.basic = 0 end end #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- alias update_skill_chase update def update if @skill_chase_check_key and @skill_chase_flg # 追加攻撃発動チェック if (Input.trigger?(SKILL_CHASE_KEY) or self.skill_chase_set[2]) # 確率チェック if rand(100) <= self.skill_chase_set[3] @skill_chase_success = true @skill_chase_check_key = false @skill_chase_count += 1 # 追加攻撃回数チェック if @skill_chase_count >= self.skill_chase_set[4] or self.skill_chase_end self.skill_chase_end = true else # 追加攻撃成功SEを鳴らしてみる if SKILL_CHASE_SE != nil and !self.skill_chase_end Audio.se_play("Audio/SE/" + SKILL_CHASE_SE) end end end end end update_skill_chase # 原物 end #-------------------------------------------------------------------------- # ● フレーム更新 (メインフェーズ ステップ 6 : リフレッシュ) #-------------------------------------------------------------------------- alias update_phase4_step6_add_atk update_phase4_step6 def update_phase4_step6 init_chase for target in @target_battlers target.skill_chase_all_dmg = nil target.skill_chase_dead_end = false target.once_critical = false end update_phase4_step6_add_atk end end #============================================================================== # ■ Game_Battler #============================================================================== class Game_Battler include ExtraSkill attr_accessor :skill_chase_all_dmg # 積算ダメージ attr_accessor :skill_chase_dead_end # 死亡フラグ attr_accessor :once_critical # クリティカルフラグ(一括表示用) #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- alias initialize_skill_chase initialize def initialize initialize_skill_chase @skill_chase_all_dmg = nil @skill_chase_dead_end = false @once_critical = false end #-------------------------------------------------------------------------- # ● 通常攻撃の効果適用 # attacker : 攻撃者 (バトラー) #-------------------------------------------------------------------------- alias attack_effect_skill_chase attack_effect def attack_effect(attacker) if $scene.skill_chase_exercise # クリティカルフラグをクリア self.critical = false # 基本ダメージを計算 if $scene.chase_skill_type == 1 atk_skill = (attacker.atk * $scene.skill_atk_f + $scene.skill_chase_set[0])/1.2 elsif $scene.chase_skill_type == 2 atk_skill = (attacker.int * $scene.skill_atk_f + $scene.skill_chase_set[0])/1.2 else p "設定ミス2" end atk = [atk_skill.to_int - self.pdef / 2, 0].max self.damage = atk * (20 + attacker.str) / 20 # 属性修正 self.damage *= elements_correct(attacker.element_set) self.damage /= 100 # ダメージの符号が正の場合 if self.damage > 0 # クリティカル修正 if rand(100) < 4 * attacker.dex / self.agi self.damage *= 2 self.critical = true self.once_critical = true end # 防御修正 if self.guarding? self.damage /= 2 end end # 分散 if self.damage.abs > 0 amp = [self.damage.abs * 15 / 100, 1].max self.damage += rand(amp+1) + rand(amp+1) - amp end # 第二命中判定 eva = 8 * self.agi / attacker.dex + self.eva hit = self.damage < 0 ? 100 : 100 - eva hit = self.cant_evade? ? 100 : hit hit_result = (rand(100) < hit) # 命中の場合 if hit_result == true # ステート衝撃解除 remove_states_shock # HP からダメージを減算 self.hp -= self.damage # ステート変化 @state_changed = false states_plus(attacker.plus_state_set) states_minus(attacker.minus_state_set) # ミスの場合 else # ダメージに "Miss" を設定 self.damage = "Miss" # クリティカルフラグをクリア self.critical = false end else attack_effect_skill_chase(attacker) # 原物 end if self.dead? # こいつはもう死んでいる @skill_chase_dead_end = true # ダメージ一括表示 if SKILL_CHASE_DMG_ALL and $scene.skill_chase_exercise # とりあえず生かしておく self.hp = 1 else $scene.skill_chase_end = true end end # ダメージ一括表示ならダメージの蓄積 if SKILL_CHASE_DMG_ALL and self.damage != "Miss" and $scene.skill_chase_exercise @skill_chase_all_dmg = (@skill_chase_all_dmg == nil ? 0 : @skill_chase_all_dmg) @skill_chase_all_dmg += self.damage self.damage = nil elsif SKILL_CHASE_DMG_ALL and self.damage != "Miss" and $scene.skill_chase_first @skill_chase_all_dmg = (@skill_chase_all_dmg == nil ? 0 : @skill_chase_all_dmg) @skill_chase_all_dmg += self.damage $scene.skill_chase_first = false else # ダメージミスなら終了 if SKILL_CHASE_MISS and self.damage == "Miss" $scene.skill_chase_end = true if SKILL_CHASE_DMG_ALL and @skill_chase_all_dmg == nil @skill_chase_all_dmg = "Miss" end end end # メソッド終了 return true end #-------------------------------------------------------------------------- # ● スキルの効果適用 # user : スキルの使用者 (バトラー) # skill : スキル #-------------------------------------------------------------------------- alias skill_effect_skill_chase skill_effect def skill_effect(user, skill) ret = skill_effect_skill_chase(user, skill) if self.dead? # こいつはもう死んでいる @skill_chase_dead_end = true # ダメージ一括表示 if SKILL_CHASE_DMG_ALL and ($scene.skill_chase_exercise or $scene.skill_chase_first) # とりあえず生かしておく self.hp = 1 else $scene.skill_chase_end = true end end # ダメージ一括表示ならダメージの蓄積 if SKILL_CHASE_DMG_ALL and self.damage != "Miss" and $scene.skill_chase_exercise @skill_chase_all_dmg = (@skill_chase_all_dmg == nil ? 0 : @skill_chase_all_dmg) @skill_chase_all_dmg += self.damage self.damage = nil elsif SKILL_CHASE_DMG_ALL and self.damage != "Miss" and $scene.skill_chase_first @skill_chase_all_dmg = (@skill_chase_all_dmg == nil ? 0 : @skill_chase_all_dmg) @skill_chase_all_dmg = self.damage $scene.skill_chase_first = false else # ダメージミスなら終了 if SKILL_CHASE_MISS and self.damage == "Miss" $scene.skill_chase_end = true if SKILL_CHASE_DMG_ALL and @skill_chase_all_dmg == nil @skill_chase_all_dmg = "Miss" end end end return ret end end