#◆◇◆◇◆ 特殊通常攻撃スクリプトVX ver 1.01 ◇◆◇◆◇ # サポート掲示板 http://www2.ezbbs.net/21/minto-aaa/ # by みんと =begin ■ 更新履歴 ○ ver 1.01(2011/09/03) いろいろなミスを修正 ○ ver 1.00(2011/08/27) 公開 ■ 説明 エターナルメモリーでお馴染(?)の、 「通常攻撃」を行う事で、一定の確率で数回連続で攻撃したり、 防御力を数%無視したりする特殊な通常攻撃を作成する事が出来ます。 「特殊通常攻撃スキル」と見なすスキルには、 メモに 特殊通常攻撃スキル と記載してください。 特殊通常攻撃スキルは覚えてるだけで効果があり、 通常攻撃時に一定の確率で発動します。 敵にも設定でき、ターンなどの条件も適用されます。 (優先度は意味がないので無視されます) 特別な攻撃スキルはないが、 特殊な通常攻撃に特化した味方や敵を作成でき、幅が生まれます。 ● 確率の設定 スキルのメモを使用します。 SRT_F値、AGI_F値、SPI_F値と記載する事で設定できます。 依存するステータスは以下の通りです。 SRT_F = 攻撃力 AGI_F = 素早さ SPI_F = 精神力 例えば、攻撃者の素早さが250でメモにAGI_Fが10と記載した場合、 素早さ×10÷100 = 25%の確率で発動する特殊通常攻撃となります。 「対象」が「敵単体」の場合は敵の能力も同じように参照し、 確率の減算処理を行います。 敵単体以外の場合は攻撃者の能力のみを参照します。 上限発動率も設定する事ができ、スキルの分散を使用します。 スキルの分散が30なら上限発動率は30%となります。 ● 効果の設定 消費MP、基本ダメージ、成功率、速度補正値、 打撃関係度、精神関係度、ステート変化を使用します。 以下のデータに変換されます。 消費MP = 攻撃力ボーナス%(0〜消費MP%のランダム上昇) 基本ダメージ = 増加攻撃回数 速度補正値 = クリティカルボーナス% 命中 = 追加ステート付加確率(「無効」でない限り、耐性は無視します) 打撃関係度 = 防御力無視% 精神関係度 = 精神力無視% ステート変化 = 追加ステート(付加のみ) 例えば、STR_Fが10で威力が1で、対象がなしなら、 攻撃者の攻撃力÷10の確率で攻撃回数を一回増やす特殊通常攻撃スキルになります。 ● 発動時のエフェクト 特殊通常攻撃スキルにアニメーションが設定されている場合、 その特殊通常攻撃スキル発動時のアニメーションになります。 フラッシュやSEなどを設定するといいでしょう。 ● 仕様 攻撃者が混乱(味方を通常攻撃する、敵を通常攻撃する)の場合、 特殊通常攻撃スキルは発動しません。 攻撃回数を増やす特殊通常攻撃スキルは攻撃が「完全に終了」するまで、 「同じスキル」は攻撃中重複しません。 それ以外のスキルは「その攻撃のみ」の効果です。 敵のHPを0にした場合、そこで強制的に特殊通常攻撃スキルは終了します。 =end #============================================================================== # ☆ MINTO #------------------------------------------------------------------------------ # 様々なフラグを扱うメインモジュールです。 #============================================================================== module MINTO # 特殊通常攻撃スクリプトを有効化 ( true で有効 / false で無効 ) RGSS["特殊通常攻撃スクリプト"] = true end # 特殊通常攻撃スクリプトが有効な場合に以降の処理を実行する if MINTO::RGSS["特殊通常攻撃スクリプト"] == true then #============================================================================== # ☆ Game_Battler_Skill #------------------------------------------------------------------------------ # 特殊攻撃スキルの状態を管理するモジュールです。 #============================================================================== module Game_Battler_Skill #-------------------------------------------------------------------------- # ● 付加したステートの記憶 # id : ステートのID #-------------------------------------------------------------------------- def added_states_push(i) @added_states.push(i) end #-------------------------------------------------------------------------- # ● 攻撃力の取得 #-------------------------------------------------------------------------- def atk # スーパークラスの処理を実行 bool = super # 戦闘中の場合 if $game_temp.in_battle # 特殊スキル発動中の場合 unless $scene.special_attack_skill[self].nil? # ボーナス値加算 bool += $scene.special_attack_skill[self].power_bonus end end return bool.to_i end #-------------------------------------------------------------------------- # ● 物理防御の取得 #-------------------------------------------------------------------------- def def # スーパークラスの処理を実行 bool = super # 戦闘中の場合 if $game_temp.in_battle special_battler = $scene.special_battler # 特殊スキル発動中の場合 unless $scene.special_attack_skill[special_battler].nil? # 防御力減算 bool *= (100 - $scene.special_attack_skill[special_battler].pdef_break) bool /= 100 end end return bool.to_i end #-------------------------------------------------------------------------- # ● 精神力の取得 #-------------------------------------------------------------------------- def spi # スーパークラスの処理を実行 bool = super # 戦闘中の場合 if $game_temp.in_battle special_battler = $scene.special_battler # 特殊スキル発動中の場合 unless $scene.special_attack_skill[special_battler].nil? # 防御力減算 bool *= (100 - $scene.special_attack_skill[special_battler].mdef_break) bool /= 100 end end return bool.to_i end end #============================================================================== # ■ Special_Attack_Skill #------------------------------------------------------------------------------ #  特殊通常攻撃のデータを管理するクラスです。 #============================================================================== class Special_Attack_Skill #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_accessor :attack_bonus # 攻撃回数ボーナス attr_accessor :power_bonus # 攻撃力ボーナス attr_accessor :crt_bonus # クリティカルボーナス attr_accessor :pdef_break # 防御力無視割合 attr_accessor :mdef_break # 魔法防御力無視割合 attr_accessor :plus_state_bonus # 付加ステートボーナス attr_accessor :state_hit # 付加ステート付加確率 attr_accessor :attack_battler # 攻撃者 attr_accessor :skill_name # 発動スキル名 attr_accessor :flash_skill_name # 一時用発動スキル名 attr_accessor :flash_skill_id # 一時用発動スキルID attr_accessor :anime1 # 行動側アニメ attr_accessor :anime2 # 対象側アニメ #-------------------------------------------------------------------------- # ● オブジェクト初期化 # battler : 攻撃者 #-------------------------------------------------------------------------- def initialize(battler) @attack_bonus = 0 @power_bonus = 0 @crt_bonus = 0 @plus_state_bonus = [] @state_hit = {} @pdef_break = 0 @mdef_break = 0 @battler = battler @skill_name = [] @flash_skill_name = [] @flash_skill_id = [] @anime1 = 0 @anime2 = 0 end #-------------------------------------------------------------------------- # ● データのクリア #-------------------------------------------------------------------------- def clear @power_bonus = 0 @crt_bonus = 0 @plus_state_bonus = [] @state_hit = {} @pdef_break = 0 @mdef_break = 0 @anime1 = 0 @anime2 = 0 end end #============================================================================== # ■ RPG::Skill #------------------------------------------------------------------------------ #  スキルのデータクラスです。 # $data_skillsとして参照されます。 #============================================================================== module RPG class Skill < UsableItem #-------------------------------------------------------------------------- # ● 攻撃力Fの取得 #-------------------------------------------------------------------------- def pow_f return self.note.split(/POW_F/)[1].to_i end #-------------------------------------------------------------------------- # ● クリティカルFの取得 #-------------------------------------------------------------------------- def crt_f return self.note.split(/CRT_F/)[1].to_i end #-------------------------------------------------------------------------- # ● 防御力Fの取得 #-------------------------------------------------------------------------- def pdef_f return self.note.split(/PDEF_F/)[1].to_i end #-------------------------------------------------------------------------- # ● 腕力Fの取得 #-------------------------------------------------------------------------- def str_f return self.note.split(/STR_F/)[1].to_i end #-------------------------------------------------------------------------- # ● 器用さFの取得 #-------------------------------------------------------------------------- def dex_f return self.note.split(/DEX_F/)[1].to_i end #-------------------------------------------------------------------------- # ● 素早さFの取得 #-------------------------------------------------------------------------- def agi_f return self.note.split(/AGI_F/)[1].to_i end #-------------------------------------------------------------------------- # ● 賢さFの取得 #-------------------------------------------------------------------------- def int_f return self.note.split(/SPI_F/)[1].to_i end end end #============================================================================== # ■ Game_Actor #------------------------------------------------------------------------------ #  アクターを扱うクラスです。このクラスは Game_Actors クラス ($game_actors) # の内部で使用され、Game_Party クラス ($game_party) からも参照されます。 #============================================================================== class Game_Actor < Game_Battler #-------------------------------------------------------------------------- # ● システムインクルード #-------------------------------------------------------------------------- include Game_Battler_Skill #-------------------------------------------------------------------------- # ● クリティカル率の取得 #-------------------------------------------------------------------------- alias mint_special_attack_skill_cri_actor cri def cri # 元の処理を実行 cri = mint_special_attack_skill_cri_actor # 特殊スキル発動中の場合 unless $scene.special_attack_skill[self].nil? # 追加クリティカル判定 cri += $scene.special_attack_skill[self].crt_bonus end # 元の処理を返す return cri end end #============================================================================== # ■ Game_Enemy #------------------------------------------------------------------------------ #  エネミーを扱うクラスです。このクラスは Game_Troop クラス ($game_troop) の # 内部で使用されます。 #============================================================================== class Game_Enemy < Game_Battler #-------------------------------------------------------------------------- # ● システムインクルード #-------------------------------------------------------------------------- include Game_Battler_Skill #-------------------------------------------------------------------------- # ● クリティカル率の取得 #-------------------------------------------------------------------------- alias mint_special_attack_skill_cri_enemy cri def cri # 元の処理を実行 cri = mint_special_attack_skill_cri_enemy # 特殊スキル発動中の場合 unless $scene.special_attack_skill[self].nil? # 追加クリティカル判定 cri += $scene.special_attack_skill[self].crt_bonus end # 元の処理を返す return cri end #-------------------------------------------------------------------------- # ● スキルの取得 #-------------------------------------------------------------------------- def skills skill = [] # 現在有効なアクションを抽出 for action in enemy.actions # スキルでない場合 if action.skill_id.zero? next end # 条件を満たしていないスキルの場合 unless conditions_met?(action) next end # このスキルを追加 skill.push(action.skill_id) end skill.sort! return skill end end #============================================================================== # ■ Scene_Battle #------------------------------------------------------------------------------ #  バトル画面の処理を行うクラスです。 #============================================================================== class Scene_Battle < Scene_Base #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_accessor :special_attack_skill # 特殊通常攻撃データハッシュ attr_accessor :special_battler # 特殊通常攻撃実行者 #-------------------------------------------------------------------------- # ● 開始処理 #-------------------------------------------------------------------------- alias mint_special_attack_skill_start start def start # 特殊通常攻撃データ初期化 @special_attack_skill = {} # 元の処理を実行 mint_special_attack_skill_start end #-------------------------------------------------------------------------- # ● 戦闘行動の実行 #-------------------------------------------------------------------------- alias mint_special_attack_skill_execute_action execute_action def execute_action # 攻撃者を取得 battler = @active_battler # 特殊通常攻撃データ未作成の場合 if @special_attack_skill[battler].nil? # 特殊通常攻撃データ作成 @special_attack_skill[battler] = Special_Attack_Skill.new(battler) end # 攻撃者(外部判定用)収納 @special_battler = battler # 特殊通常攻撃スキル発動判定 special_attack_skill_effect(battler) # 元の処理を実行 mint_special_attack_skill_execute_action end #-------------------------------------------------------------------------- # ● 特殊通常攻撃スキル発動判定 # battler : 攻撃者 #-------------------------------------------------------------------------- def special_attack_skill_effect(battler) # 攻撃者が混乱状態の場合 if battler.restriction == 2 or battler.restriction == 3 # メソッドを返す return end # 基本行動でない場合 unless battler.action.kind.zero? # メソッドを返す return # 基本行動の場合 else # 通常攻撃でない場合 unless battler.action.basic.zero? # メソッドを返す return end end # 特殊通常攻撃スキルの取得 special_attack_skills = get_special_attack_skill(battler) # スキル名クリア @special_attack_skill[battler].flash_skill_name.clear @special_attack_skill[battler].flash_skill_id.clear # 特殊通常攻撃スキルデータをクリア @special_attack_skill[battler].clear # 発動確率定義 effect_percent = 0 # 特殊通常攻撃スキルを所持している場合 unless special_attack_skills.empty? # ループ処理 for skill in special_attack_skills do # 攻撃回数ボーナスがある場合 if skill.base_damage >= 1 # 発動済みの場合 if @special_attack_skill[battler].skill_name.include?(skill.name) # スキップ next end end # 各種発動確率習得 effect_percent += battler.atk * skill.str_f / 100 effect_percent += battler.agi * skill.agi_f / 100 effect_percent += battler.spi * skill.int_f / 100 # スキルの対象が 敵単体 の場合 if skill.scope == 1 and battler.action.make_targets != nil # 攻撃対象習得 target = battler.action.make_targets[0] # 各種発動確率減算 effect_percent -= target.atk * skill.str_f / 100 effect_percent -= target.agi * skill.agi_f / 100 effect_percent -= target.spi * skill.int_f / 100 end # 最大最小スキル発動率補正 if effect_percent > skill.variance effect_percent = skill.variance elsif effect_percent < 1 effect_percent = 1 end # 発動判定 if effect_percent > rand(100) # スキル情報をプッシュ @special_attack_skill[battler].skill_name.push(skill.name.dup) @special_attack_skill[battler].flash_skill_name.push(skill.name.dup) @special_attack_skill[battler].flash_skill_id.push(skill.id) # 各種データがより強ければ更新 if skill.mp_cost > @special_attack_skill[battler].power_bonus @special_attack_skill[battler].power_bonus = skill.mp_cost end if skill.speed > @special_attack_skill[battler].crt_bonus @special_attack_skill[battler].crt_bonus = skill.speed end if skill.atk_f > @special_attack_skill[battler].pdef_break @special_attack_skill[battler].pdef_break = skill.atk_f end if skill.spi_f > @special_attack_skill[battler].mdef_break @special_attack_skill[battler].mdef_break = skill.spi_f end if skill.animation_id >= 1 @special_attack_skill[battler].anime2 = skill.animation_id end # その他のデータを加算 @special_attack_skill[battler].attack_bonus += skill.base_damage plus_state_set = skill.plus_state_set @special_attack_skill[battler].plus_state_bonus += plus_state_set for id in plus_state_set if skill.hit > @special_attack_skill[battler].state_hit[id].to_i @special_attack_skill[battler].state_hit[id] = skill.hit end end end end end # 攻撃力ボーナス算定 power_bonus = rand(@special_attack_skill[battler].power_bonus) power_bonus *= battler.atk power_bonus /= 100 @special_attack_skill[battler].power_bonus = power_bonus # 無効なデータを除外 @special_attack_skill[battler].plus_state_bonus.compact! end #-------------------------------------------------------------------------- # ● 特殊通常攻撃スキルの取得 # battler : 攻撃者 #-------------------------------------------------------------------------- def get_special_attack_skill(battler) skills = [] # ループ処理 for i in 0...battler.skills.size do # スキルデータ取得 if battler.skills[i].is_a?(RPG::Skill) skill = $data_skills[battler.skills[i].id] else skill = $data_skills[battler.skills[i]] end # 無効なデータの場合 if skill.nil? # 次の候補へ next end # メモに「特殊通常攻撃」と記載されている場合 if skill.note.include?("特殊通常攻撃") # スキルデータを収納 skills.push(skill) end end # メソッドを返す return skills end #-------------------------------------------------------------------------- # ● 戦闘行動の実行 : 攻撃 #-------------------------------------------------------------------------- alias mint_special_attack_skill_execute_action_attack execute_action_attack def execute_action_attack # 攻撃者を取得 battler = @active_battler # 元の処理を実行 mint_special_attack_skill_execute_action_attack end #-------------------------------------------------------------------------- # ● 行動結果の表示 # target : 対象者 # obj : スキルまたはアイテム #-------------------------------------------------------------------------- alias mint_special_attack_skill_display_action_effects display_action_effects def display_action_effects(target, obj = nil) # 攻撃者を取得 battler = @active_battler # データ解放済みの場合 if @special_attack_skill[battler].nil? # 元の処理を実行 mint_special_attack_skill_display_action_effects(target, obj) # メソッドを返す return end # 行動がスキップされていない場合 unless target.skipped # 何らかの特殊通常攻撃スキルが発動した場合 if @special_attack_skill[battler].flash_skill_name.size >= 1 # ループ処理(発動した特殊通常攻撃スキル) for id in @special_attack_skill[battler].flash_skill_id # スキルの取得 skill = $data_skills[id] # スキル発動テキストの作成 text = @active_battler.name + skill.message1 # スキル発動テキスト表示 @message_window.add_instant_text(text) # スキル発動アニメの表示 display_normal_animation(target.to_a, skill.animation_id) # ウェイト wait(10) # スキル発動メッセージ2が存在する場合 unless skill.message2.empty? # スキル発動メッセージ2を表示 @message_window.add_instant_text(skill.message2) # ウェイト wait(10) end # メッセージラインを戻す line_number = @message_window.line_number @message_window.back_to(line_number - 1) end end # 特殊付加ステートが有効な場合 unless @special_attack_skill[battler].plus_state_bonus.empty? # ループ処理 for id in @special_attack_skill[battler].plus_state_bonus # ステートに耐性がない場合 unless target.state_probability(id).zero? # ステート付加判定 if @special_attack_skill[battler].state_hit[id] > rand(100) # ステート強制付加 target.add_state(id) target.added_states_push(id) target.perform_collapse end end end end # 元の処理を実行 mint_special_attack_skill_display_action_effects(target, obj) # メッセージラインを戻す line_number = @message_window.line_number @message_window.back_to(line_number - 1) # HPが0になった場合 if target.hp.zero? # 攻撃回数をクリア @special_attack_skill[battler].attack_bonus = 0 end # 攻撃回数が残っている場合 if @special_attack_skill[battler].attack_bonus >= 1 # 攻撃回数減算 @special_attack_skill[battler].attack_bonus -= 1 # ステータスウィンドウをリフレッシュ @status_window.refresh # 再攻撃 @message_window.back_to(line_number - 1) execute_action # 攻撃が完全に終了した場合 else # 特殊通常攻撃データ解放 @special_attack_skill[battler] = nil end end end end end