#◆◇◆◇◆ ☆ 多段攻撃β ver 2.03 ◇◆◇◆◇ # ☆ マスタースクリプト ver 2.00 以降専用 # サポート掲示板 http://www2.ezbbs.net/21/minto-aaa/ # by みんと =begin ☆ 更新履歴 ver 2.03 色々と修正、及び改良 ver 2.02 多段攻撃が成功しないミスを修正 ver 2.01 コピペミスを修正 ver 2.00 仕様を大幅変更 攻撃判定のリフレッシュも変わってます ☆ セクション指定上下関係 A・C・A・システム ↓ このスクリプト ☆ 説明 多段攻撃αとの同時使用は出来ません。 従来の多段攻撃スクリプトとは違い、 多段ヒットの判定をタイミングではなく、攻撃判定で行います。 アニメに攻撃判定を設定することで、 攻撃判定に触れた瞬間にヒットします。 攻撃判定の周りに敵がいれば、その敵も巻き込みます。 攻撃判定の設定はデータベースのアニメーションで行い、 セルのパターンを100以上にしてください。 そのセルが攻撃判定となり、 セルのマスがそのまま攻撃判定の大きさです。 (大体拡大率20が適当) 通常、一度触れた攻撃判定には一度ヒットすると再ヒットしませんが、 攻撃判定セルの「透明度」を変更すると、 攻撃判定がリフレッシュされて再ヒットするようになります。 2ヒット以上させたい場合は適当なところで透明度を変更してください。 また、攻撃判定を設定したアニメには名前に「必ず」 多段 という名前を含ませてください。 設定されていないとうまく行きません。 また、コンティニューでも動作しません。 =end #============================================================================== # ■ Game_Battler (分割定義 1) #------------------------------------------------------------------------------ #  バトラーを扱うクラスです。このクラスは Game_Actor クラスと Game_Enemy クラ # スのスーパークラスとして使用されます。 #============================================================================== class Game_Battler #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_accessor :cell_hit # 攻撃判定残存フラグ attr_accessor :hit_p # ヒット数 attr_accessor :dead_ok # 戦闘不能許可フラグ #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- alias initialize_Multi_Attack_β initialize def initialize # 元の処理を実行 initialize_Multi_Attack_β @cell_hit = {} @hit_p = 0 end end #============================================================================== # ■ Game_Actor #------------------------------------------------------------------------------ #  アクターを扱うクラスです。このクラスは Game_Actors クラス ($game_actors) # の内部で使用され、Game_Party クラス ($game_party) からも参照されます。 #============================================================================== class Game_Actor < Game_Battler #-------------------------------------------------------------------------- # ● 行動可能判定 #-------------------------------------------------------------------------- def movable? # スーパークラスを実行 bool = super # 戦闘中の場合 if $game_temp.in_battle == true then # フラグを返す return (bool and not self.dead_ok) end # フラグを返す return bool end #-------------------------------------------------------------------------- # ● 戦闘不能判定 #-------------------------------------------------------------------------- def dead? # スーパークラスを実行 bool = super # 戦闘中の場合 if $game_temp.in_battle == true then # フラグを返す return (bool and self.dead_ok) end # フラグを返す return bool end #-------------------------------------------------------------------------- # ● 通常攻撃の効果適用 # attacker : 攻撃者 (バトラー) # force : 強制実行フラグ #-------------------------------------------------------------------------- def attack_effect(attacker, force = false) # 対象側アニメを取得 anima_id = attacker.animation2_id # 強制実行フラグがオンの場合 if force == true then # スーパークラスを実行 return super(attacker) end # 対象側アニメがない場合 if anima_id == 0 then # スーパークラスを実行 return super(attacker) end # アニメーション名を取得 anima_name = Data_Animations.data[anima_id].name # アニメ名に 多段 が含まれない場合 if anima_name.include?("多段") == false then # スーパークラスを実行 return super(attacker) end # メソッド終了 return false end #-------------------------------------------------------------------------- # ● スキルの効果適用 # user : スキルの使用者 (バトラー) # skill : スキル # force : 強制実行フラグ #-------------------------------------------------------------------------- def skill_effect(user, skill, force = false) # 対象側アニメを取得 anima_id = skill.animation2_id # 強制実行フラグがオンの場合 if force == true then # スーパークラスを実行 return super(user, skill) end # 対象側アニメがない場合 if anima_id == 0 then # スーパークラスを実行 return super(user, skill) end # アニメーション名を取得 anima_name = Data_Animations.data[anima_id].name # アニメ名に 多段 が含まれない場合 if anima_name.include?("多段") == false then # スーパークラスを実行 return super(user, skill) end # 戦闘中でない場合 if $game_temp.in_battle == false then # スーパークラスを実行 return super(user, skill) end # メソッド終了 return false end end #============================================================================== # ■ Game_Enemy #------------------------------------------------------------------------------ #  エネミーを扱うクラスです。このクラスは Game_Troop クラス ($game_troop) の # 内部で使用されます。 #============================================================================== class Game_Enemy < Game_Battler #-------------------------------------------------------------------------- # ● 行動可能判定 #-------------------------------------------------------------------------- def movable? # スーパークラスを実行 bool = super # 戦闘中の場合 if $game_temp.in_battle == true then # フラグを返す return (bool and not self.dead_ok) end # フラグを返す return bool end #-------------------------------------------------------------------------- # ● 戦闘不能判定 #-------------------------------------------------------------------------- def dead? # スーパークラスを実行 bool = super # 戦闘中の場合 if $game_temp.in_battle == true then # フラグを返す return (bool and self.dead_ok) end # フラグを返す return bool end #-------------------------------------------------------------------------- # ● 通常攻撃の効果適用 # attacker : 攻撃者 (バトラー) # force : 強制実行フラグ #-------------------------------------------------------------------------- def attack_effect(attacker, force = false) # 対象側アニメを取得 anima_id = attacker.animation2_id # 強制実行フラグがオンの場合 if force == true then # スーパークラスを実行 return super(attacker) end # 対象側アニメがない場合 if anima_id == 0 then # スーパークラスを実行 return super(attacker) end # アニメーション名を取得 anima_name = Data_Animations.data[anima_id].name # アニメ名に 多段 が含まれない場合 if anima_name.include?("多段") == false then # スーパークラスを実行 return super(attacker) end # メソッド終了 return false end #-------------------------------------------------------------------------- # ● スキルの効果適用 # user : スキルの使用者 (バトラー) # skill : スキル # force : 強制実行フラグ #-------------------------------------------------------------------------- def skill_effect(user, skill, force = false) # 対象側アニメを取得 anima_id = skill.animation2_id # 強制実行フラグがオンの場合 if force == true then # スーパークラスを実行 return super(user, skill) end # 対象側アニメがない場合 if anima_id == 0 then # スーパークラスを実行 return super(user, skill) end # アニメーション名を取得 anima_name = Data_Animations.data[anima_id].name # アニメ名に 多段 が含まれない場合 if anima_name.include?("多段") == false then # スーパークラスを実行 return super(user, skill) end # 戦闘中でない場合 if $game_temp.in_battle == false then # スーパークラスを実行 return super(user, skill) end # メソッド終了 return false end end #============================================================================== # ■ Spriteset_Battle #------------------------------------------------------------------------------ #  バトル画面のスプライトをまとめたクラスです。このクラスは Scene_Battle クラ # スの内部で使用されます。 #============================================================================== class Spriteset_Battle #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_reader :actor_sprites # アクタースプライト attr_reader :enemy_sprites # エネミースプライト end #============================================================================== # ■ Sprite_Battler #------------------------------------------------------------------------------ #  バトラー表示用のスプライトです。Game_Battler クラスのインスタンスを監視し、 # スプライトの状態を自動的に変化させます。 #============================================================================== class Sprite_Battler < RPG::Sprite #-------------------------------------------------------------------------- # ● フレーム更新(アニメーション) #-------------------------------------------------------------------------- def update_animation # アニメの更新カウントが 1 以上の場合 if @_animation_duration >= 1 then # 多段攻撃判定を更新 multi_attack_set end # A.C.Aシステムが有効な場合 if MINTO::RGSS["A・C・A・システム"] == true then # アニメ更新フレームが 0 の場合 if @_animation_duration == 0 then # スーパークラスを実行 super # 保管用のアニメイDを初期化 $game_temp.animation_id = 0 # アニメ表示中フラグを初期化 $game_temp.now_animation = false # メソッドを返す return end # アニメの現在のフレームを取得 frame_index = @_animation.frame_max - @_animation_duration # 実行中のアニメのデータを取得 cell_data = @_animation.frames[frame_index].cell_data # アニメーションのIDを取得 id = $game_temp.animation_id # セルリンクをセット cell_link_set(id, cell_data) cell_link_set2(id, cell_data) # スーパークラスを実行 super end end #-------------------------------------------------------------------------- # ● 多段攻撃判定セット #-------------------------------------------------------------------------- def multi_attack_set # 多段攻撃判定を更新 frame_index = @_animation.frame_max - @_animation_duration cell_data = @_animation.frames[frame_index].cell_data multi_attack_update(frame_index, cell_data, 0) multi_attack_update(frame_index, cell_data, 1) multi_attack_update(frame_index, cell_data, 2) multi_attack_update(frame_index, cell_data, 3) multi_attack_update(frame_index, cell_data, 4) multi_attack_update(frame_index, cell_data, 5) multi_attack_update(frame_index, cell_data, 6) multi_attack_update(frame_index, cell_data, 7) multi_attack_update(frame_index, cell_data, 8) multi_attack_update(frame_index, cell_data, 9) multi_attack_update(frame_index, cell_data, 10) multi_attack_update(frame_index, cell_data, 11) multi_attack_update(frame_index, cell_data, 12) multi_attack_update(frame_index, cell_data, 13) multi_attack_update(frame_index, cell_data, 14) multi_attack_update(frame_index, cell_data, 15) end #-------------------------------------------------------------------------- # ● 多段攻撃判定更新 # frame_index : 現在のアニメのカウント # cell_data : 実行中のアニメのデータ # i : セルのID #-------------------------------------------------------------------------- def multi_attack_update(frame_index, cell_data, i) # 現在のセルのデータが有効の場合 if cell_data[i, 0] != nil then # セルのパターンが 100 以上の場合 if cell_data[i, 0] >= 99 then # 先頭のターゲットに応じて分岐 case $scene.target_battlers[0] # エネミーの場合 when Game_Enemy then # トループデータを取得 battlers = $game_troop.enemies # エネミースプライトセットを取得 battler_spriteset = $scene.spriteset.enemy_sprites # アクターの場合 when Game_Actor then # パーティーデータを取得 battlers = $game_party.actors # アクタースプライトセットを取得 battler_spriteset = $scene.spriteset.actor_sprites end # 取得したメンバー分繰り返す (0...battlers.size).each do |id| # ターゲットを取得 target = battlers[id] # 現在のターゲットに応じて分岐 case target # エネミーの場合 when Game_Enemy then # バトラースプライトを取得 sprite = battler_spriteset[battlers.size - (id + 1)] # アクターの場合 when Game_Actor then # バトラースプライトを取得 sprite = battler_spriteset[id] end # 多段攻撃の判定に成功した場合 if multi_attack_prosper?(cell_data, sprite, target, i) == true then # アクティブバトラーを取得 battler = $scene.active_battler # アクティブバトラーのカレントアクションに応じて分岐 case battler.current_action.kind # 通常攻撃の場合 when 0 then # 通常攻撃の効果を適用 target.attack_effect(battler, true) # スキル攻撃の場合 when 1 then # スキルのIDを取得 skill_id = battler.current_action.skill_id # スキルを取得 skill = Data_Skills_Base.data[skill_id] # スキルの効果を適用 target.skill_effect(battler, skill, true) end # ダメージ表示フラグをオン target.damage_pop = true # 今回の攻撃判定のヒット済みフラグをオン target.cell_hit[cell_data[i, 6]] = 1 # ダメージが 1 以上の場合 if target.damage.to_i >= 1 then # ヒット数を加算 target.hit_p += 1 end # アニメのヒット済みフラグを初期化 target.animation_hit = false # アニメのヒット判定を代入 target.animation_hit = (target.damage != "Miss") # ターゲットの配列に存在しない場合 if not $scene.target_battlers.include?(target) then # ターゲットの配列にプッシュ $scene.target_battlers.push(target) end end end end end end #-------------------------------------------------------------------------- # ● 攻撃判定の取得 # cell_data : 実行中のアニメのデータ # i : セルのインデックス #-------------------------------------------------------------------------- def get_attack_check(cell_data, i) # セルの現在座標を割り出す cell_x = @battler.screen_x - self.ox + self.src_rect.width / 2 cell_y = @battler.screen_y - self.oy + self.src_rect.height / 2 # セルの座標に、セルの座標修正を加算 cell_x += cell_data[i, 1] cell_y += cell_data[i, 2] # セルの座標に拡大率/2を±した値が攻撃判定となる attack_check = [ cell_x + (cell_data[i, 3] - 20) / 2, cell_x - (cell_data[i, 3] - 20) / 2, cell_y + (cell_data[i, 3] - 20) / 2, cell_y - (cell_data[i, 3] - 20) / 2] # 攻撃判定を返す return attack_check end #-------------------------------------------------------------------------- # ● 当たり判定の取得 # sprite : バトラーのスプライト #-------------------------------------------------------------------------- def get_hit_check(sprite) # ターゲットの座標に画像のサイズ/2を±した値が当たり判定となる hit_check = [ sprite.x - sprite.bitmap.width / 2, sprite.x + sprite.bitmap.width / 2, sprite.y - sprite.bitmap.height / 2, sprite.y + sprite.bitmap.height / 2] # 当たり判定を返す return hit_check end #-------------------------------------------------------------------------- # ● 多段攻撃ヒット判定 # attack_check : 攻撃判定 # hit_check : 当たり判定 #-------------------------------------------------------------------------- def multi_attack_hit?(attack_check, hit_check) # 攻撃判定内に、ターゲットの当たり判定が存在するか判定 attack_check[0] >= hit_check[0] and attack_check[1] <= hit_check[1] and attack_check[2] >= hit_check[2] and attack_check[3] <= hit_check[3] end #-------------------------------------------------------------------------- # ● 多段攻撃成功判定 # cell_data : 実行中のアニメのデータ # sprite : ターゲットのスプライト # target : 現在のターゲット # i : セルのインデックス #-------------------------------------------------------------------------- def multi_attack_prosper?(cell_data, sprite, target, i) # 攻撃判定を取得 attack_check = get_attack_check(cell_data, i) # ターゲットの当たり判定を取得 hit_check = get_hit_check(sprite) # 攻撃判定にターゲットがいる場合 if multi_attack_hit?(attack_check, hit_check) == true then # アクティブバトラーが存在する場合 if $scene.active_battler != nil then # まだ、ヒットしていない場合 if target.cell_hit[cell_data[i, 6]] == nil then # ターゲットが存在する場合 if target.exist? == true then # フラグを返す return true end end end end # フラグを返す return false end end #============================================================================== # ■ Scene_Battle (分割定義 1) #------------------------------------------------------------------------------ #  バトル画面の処理を行うクラスです。 #============================================================================== class Scene_Battle #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_reader :target_battlers # 通常ターゲットの配列 attr_reader :active_battler # アクティブバトラー attr_reader :spriteset # スプライトセットバトルデータ #-------------------------------------------------------------------------- # ● フレーム更新 (メインフェーズ ステップ 6 : リフレッシュ) # alias : update_phase4_step6_Multi_Attack_β #-------------------------------------------------------------------------- alias update_phase4_step6_Multi_Attack_β update_phase4_step6 def update_phase4_step6 # 元の処理を実行 update_phase4_step6_Multi_Attack_β # ターゲット全員に処理を掛ける for target in @target_battlers do # ヒット済みフラグがハッシュでない場合 if not target.cell_hit.is_a?(Hash) # ヒット済みフラグをハッシュに変更 target.cell_hit = {} end # ヒット済みフラグを再作成 target.cell_hit.clear # ターゲットが不死身でなく、且つHPが0の場合 if target.immortal == false and target.hp0? == true then # 戦闘不能を許可 target.dead_ok = true target.hp = 0 else # 戦闘不能を不許可 target.dead_ok = false end end end end