#============================================================================== # ■ RGSS3 ファイナルアタック特徴 Ver1.03 by 星潟 #------------------------------------------------------------------------------ # 戦闘不能になった際に指定したスキルを一定確率で発動します。 #============================================================================== # 特徴を有する項目のメモ欄に記述します。 # 通常、ステートは戦闘不能によって解除されますので # ステート以外を推奨とさせていただきます。 #============================================================================== # 基本 # <ファイナルアタック:A,B,C,D,E> # # AにスキルIDを指定します。 # Bにターゲット指定値を指定します。 # (-1未満で止めを刺して来た対象、0でランダム、 # 1〜がそのスキル対象において先頭から数えた対象) # Cにファイナルアタック区別IDを指定します。 # (同じスキルのファイナルアタックを同一特徴に複数設定したり # 別の特徴にも設定する場合に、使用回数の共有を極力避ける為の物です) # Dにファイナルアタック回数、Eに確率を指定します。 # Eを省略して、<ファイナルアタック:A,B,C,D>という記述方法も可能です。 # (この場合は100%となります) #------------------------------------------------------------------------------ # <ファイナルアタック:attack_skill_id,-1,0,-1> # # 止めを刺して来た対象に75%の確率で通常攻撃を仕掛けます。 # 回数に制限はありません。 #------------------------------------------------------------------------------ # <ファイナルアタック:5,0,0,3> # # スキルID5に対応したスキル対象の先頭にスキルID5を仕掛けます。 # このファイナルアタックの記述形式は1戦闘につき3回までが限度です。 #============================================================================== # 複数種設定する場合の例1. # # <ファイナルアタック:5,0,0,3> # <ファイナルアタック:5,0,1,2> # <ファイナルアタック:5,0,2,1> # # この場合、1回目のファイナルアタックではスキルID5を3回発動します。 # 2回目は<ファイナルアタック:5,0,2,1>が回数切れになっているので2回発動します。 # 3回目は<ファイナルアタック:5,0,1,2>も回数切れになっているので1回発動します。 # 4回目は<ファイナルアタック:5,0,0,3>も回数切れになっているので発動しません。 #============================================================================== # 複数種設定する場合の例2. # # <ファイナルアタック:5,0,0,3,75> # <ファイナルアタック:5,0,0,2,50> # <ファイナルアタック:5,0,0,1,25> # <ファイナルアタック:5,0,1,1,25> # # この場合、1回目のファイナルアタックでは最大スキルID5を3回発動します。 # 1つ目と2つ目と3つ目はファイナルアタック区別IDが同一の為 # 使用回数合計6回を共有します。 # 4つ目は他3つ被っていないので、使用回数は1回です。 # それぞれ回数が無くなるまで発動します。 # # 最速で2回目で区別ID0の使用回数は尽きます。 #============================================================================== module FinalAttack #ファイナルアタック設定用キーワードを指定。 Word = "ファイナルアタック" #アクターをパーティから外す処理を行った際に #ファイナルアタック設定を一旦リセットするかを指定。 RRAF = true #機能封印用スイッチIDを指定。 #封印するつもりがない場合は0にして下さい。 SID = 0 end class RPG::BaseItem #-------------------------------------------------------------------------- # ファイナルアタック特徴 #-------------------------------------------------------------------------- def final_attack_feature @final_attack_feature ||= create_final_attack_feature end #-------------------------------------------------------------------------- # ファイナルアタック特徴作成 #-------------------------------------------------------------------------- def create_final_attack_feature a = [] note.each_line {|l| t = /<#{FinalAttack::Word}[::](\S+)>/ =~ l ? $1.to_s : "" t = t.split(/\s*,\s*/) a.push(t.size == 4 ? t + ["100"] : t) if t.size > 3} a end end if FinalAttack::RRAF class Game_Party < Game_Unit #-------------------------------------------------------------------------- # アクターを外す #-------------------------------------------------------------------------- alias remove_actor_final_attack remove_actor def remove_actor(actor_id) remove_actor_final_attack(actor_id) a = $game_actors[actor_id] return unless a a.reset_final_attack SceneManager.scene.final_attack_datas.delete(a) rescue nil end end end class Game_BattlerBase #-------------------------------------------------------------------------- # 無効化するステートの配列を取得 #-------------------------------------------------------------------------- alias state_resist_set_final_attack state_resist_set def state_resist_set state_resist_set_final_attack + (@final_attack_execution ? [death_state_id] : []) end #-------------------------------------------------------------------------- # 現在のステートをオブジェクトの配列で取得 #-------------------------------------------------------------------------- alias states_final_attack states def states a = states_final_attack a.delete($data_states[death_state_id]) if @final_attack_usable_check a end end class Game_Battler < Game_BattlerBase attr_accessor :final_attack_execution #-------------------------------------------------------------------------- # スキル/アイテムの効果適用 #-------------------------------------------------------------------------- alias item_apply_final_attack item_apply def item_apply(user, item) f = self.dead? item_apply_final_attack(user, item) @final_attack_target = user if !f && self.dead? end #-------------------------------------------------------------------------- # ファイナルアタック取得メイン #-------------------------------------------------------------------------- def final_attack_execute_main return false if $game_switches[FinalAttack::SID] @final_attack_used_skill ||= {} @final_attack_usable_max = {} fa = [] feature_objects.each {|f| f.final_attack_feature.each {|a| next if a.empty? b = [eval(a[0]),eval(a[1]),eval(a[2]),eval(a[3]),eval(a[4])] s = $data_skills[b[0]] next unless s @final_attack_usable_check = true flag = usable?(s) @final_attack_usable_check = nil next unless flag k = [b[0],b[2]] @final_attack_usable_max[k] ||= 0 @final_attack_usable_max[k] += b[3] if b[3] > 0 fa.push(b) if b[4] > rand(100)}} fa.each_with_index {|a,i| t = a[1] -1 if @final_attack_target t = t < -1 ? @final_attack_target.index : t end t = t ? t : -1 final_attack_execute([a[0],t,a[2],a[3]])} @final_attack_target = nil end #-------------------------------------------------------------------------- # ファイナルアタック取得 #-------------------------------------------------------------------------- def final_attack_execute(a) if a[3] > 0 k = [a[0],a[2]] @final_attack_used_skill[k] ||= 0 return if @final_attack_used_skill[k] >= @final_attack_usable_max[k] @final_attack_used_skill[k] += 1 end @final_attack_execution = true SceneManager.scene.final_attack_add(self,a[0],a[1]) end #-------------------------------------------------------------------------- # 戦闘用ステートの解除 #-------------------------------------------------------------------------- alias remove_battle_states_final_attack remove_battle_states def remove_battle_states remove_battle_states_final_attack reset_final_attack end #-------------------------------------------------------------------------- # ファイナルアタック関係変数リセット #-------------------------------------------------------------------------- def reset_final_attack(bfl = false) @final_attack_execution = nil @final_attack_target = nil return unless bfl @final_attack_used_skill = {} end #-------------------------------------------------------------------------- # 現在の行動を除去 #-------------------------------------------------------------------------- alias remove_current_action_final_attack remove_current_action def remove_current_action remove_current_action_final_attack SceneManager.scene.final_attack_execute rescue nil end end class Scene_Battle < Scene_Base attr_accessor :final_attack_datas #-------------------------------------------------------------------------- # 開始処理 #-------------------------------------------------------------------------- alias start_final_attack start def start @final_attack_number = 0 @final_attack_datas = {} $game_party.all_members.each {|m| m.reset_final_attack(true)} start_final_attack end #-------------------------------------------------------------------------- # 終了処理 #-------------------------------------------------------------------------- alias terminate_final_attack terminate def terminate $game_party.all_members.each {|m| m.reset_final_attack(true)} terminate_final_attack end #-------------------------------------------------------------------------- # ファイナルアタックデータへの登録 #-------------------------------------------------------------------------- def final_attack_add(user,sid,t) @final_attack_datas[user] ||= [] @final_attack_datas[user].push([sid,t]) end #-------------------------------------------------------------------------- # ファイナルアタックの実行 #-------------------------------------------------------------------------- def final_attack_execute @final_attack_number += 1 h = @final_attack_datas.clone @final_attack_datas = {} h.each {|k,v| v.each {|v2| k.force_action(v2[0],v2[1]) BattleManager.force_action(k) SceneManager.scene.process_forced_action rescue nil @log_window.clear} k.reset_final_attack k.refresh k.perform_collapse_effect_final_attack if k.dead? wait_for_effect} h.keys.uniq.each {|user| user.refresh} @final_attack_number -= 1 BattleManager.judge_win_loss end #-------------------------------------------------------------------------- # ファイナルアタックの実行可否 #-------------------------------------------------------------------------- def final_attack_execute? !@final_attack_datas.empty? or @final_attack_number != 0 end #-------------------------------------------------------------------------- # イベントの処理 #-------------------------------------------------------------------------- alias process_event_final_attack process_event def process_event loop_final_attack process_event_final_attack loop_final_attack end #-------------------------------------------------------------------------- # ファイナルアタックのループ処理 #-------------------------------------------------------------------------- def loop_final_attack return unless $game_party.in_battle loop do final_attack_execute break if !$game_party.in_battle or @final_attack_datas.empty? end end end class << BattleManager #-------------------------------------------------------------------------- # 勝敗判定 #-------------------------------------------------------------------------- alias judge_win_loss_final_attack judge_win_loss def judge_win_loss return false if SceneManager.scene.final_attack_execute? rescue nil judge_win_loss_final_attack end end class Game_Actor < Game_Battler #-------------------------------------------------------------------------- # コラプスの実行 #-------------------------------------------------------------------------- alias perform_collapse_effect_final_attack perform_collapse_effect def perform_collapse_effect final_attack_execute_main if !@final_attack_execution && $game_party.in_battle return if @final_attack_execution perform_collapse_effect_final_attack end end class Game_Enemy < Game_Battler #-------------------------------------------------------------------------- # コラプスの実行 #-------------------------------------------------------------------------- alias perform_collapse_effect_final_attack perform_collapse_effect def perform_collapse_effect final_attack_execute_main if !@final_attack_execution && $game_party.in_battle return if @final_attack_execution perform_collapse_effect_final_attack end end