#◆◇◆◇◆ ☆ 多段攻撃γ ver 1.02 ◇◆◇◆◇ # ☆ マスタースクリプト ver 2.00 以降専用 # サポート掲示板 http://www2.ezbbs.net/21/minto-aaa/ # by みんと =begin 更新履歴 ver 1.02 色々とバグ修正 ver 1.01 色々とバグ修正 他の多段攻撃スクリプトとの同時使用は出来ません。 ※注意 ダメージ計算式を再定義しています。 ダメージ計算式を変更している方は、同じように変更してください。 セクション指定上下関係 ウェーブダメージ ↓ このスクリプト 導入場所の注意 エイリアスで構成されていますので、 出来るだけ下のほうに導入してください。 説明 多段攻撃βに攻撃判定ごとの威力変化を追加した多段攻撃スクリプトです。 攻撃判定にしたセルのパターンごとに威力設定が出来ます。 例えば、 この攻撃判定は範囲が小さいけど、 当たれば必ずクリティカルといったことが出来ます。 多段ヒットの判定をタイミングではなく、攻撃判定で行います。 アニメに攻撃判定を設定することで、 攻撃判定に触れた瞬間にヒットします。 攻撃判定の周りに敵がいれば、その敵も巻き込みます。 攻撃判定の設定はデータベースのアニメーションで行い、 セルのパターンを100以上にしてください。 そのセルが攻撃判定となり、 セルのマスがそのまま攻撃判定の大きさです。 (大体拡大率20が適当) 通常、一度触れた攻撃判定には一度ヒットすると再ヒットしませんが、 攻撃判定セルの「透明度」を変更すると、 攻撃判定がリフレッシュされて再ヒットするようになります。 2ヒット以上させたい場合は適当なところで透明度を変更してください。 ダメージの複数表示と トータルダメージ表示にも対応しています。 尚、多段攻撃アニメには 多段 の文字を含ませてください。 ない場合は多段攻撃と認識されません。 =end #============================================================================== # ☆ MINTO #------------------------------------------------------------------------------ # 様々なフラグを扱うメインモジュールです。 #============================================================================== module MINTO # Multi_Attackγを有効化( true で有効 / false で無効 ) RGSS["Multi_Attackγ"] = true end if MINTO::RGSS["Multi_Attackγ"] #============================================================================== # ☆ カスタマイズ #------------------------------------------------------------------------------ # 機能のカスタマイズを行います。 #============================================================================== class Sprite_Battler #-------------------------------------------------------------------------- # ● 多段ヒットデータ # battler : 行動者 # target : 対象者 # pattern : セルのパターン # data情報 # 威力%→命中%→クリティカル%→属性配列→ # 付加ステート配列→解除ステート配列 #-------------------------------------------------------------------------- def multi_hit_data(battler, target, pattern) # 多段データをクリア data = nil # セルのパターンで分岐 case pattern when 100 then # 多段データを設定 data = [99, 100, 100, [], [], []] when 101 then # 多段データを設定 data = [100, 100, 100, [], [], []] else # 多段データを設定(通常) data = [100, 0, 0, [], [], []] end # 多段データを返す return data end end #============================================================================== # ■ Sprite #------------------------------------------------------------------------------ #  スプライト表示を扱う組み込みクラスです。 #============================================================================== class Sprite #-------------------------------------------------------------------------- # ● 複製の作成 #-------------------------------------------------------------------------- def copy # 各データをコピー sprite = Sprite.new(self.viewport) sprite.bitmap = self.bitmap.dup if self.bitmap sprite.x = self.x sprite.y = self.y sprite.z = self.z sprite.visible = self.visible sprite.ox = self.ox sprite.oy = self.oy sprite.angle = self.angle sprite.mirror = self.mirror sprite.opacity = self.opacity sprite.blend_type = self.blend_type sprite.color = self.color.dup sprite.src_rect = self.src_rect sprite.zoom_x = self.zoom_x sprite.zoom_y = self.zoom_y return sprite end end #============================================================================== # ■ Game_Battler (分割定義 1) #------------------------------------------------------------------------------ #  バトラーを扱うクラスです。このクラスは Game_Actor クラスと Game_Enemy クラ # スのスーパークラスとして使用されます。 #============================================================================== class Game_Battler #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_accessor :cell_hit # 攻撃判定残存フラグ attr_accessor :hit_p # ヒット数 attr_accessor :dead_ok # 戦闘不能許可フラグ attr_accessor :t_damage # 総合ダメージ #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- alias initialize_Multi_Attack_γ initialize def initialize # 元の処理を実行 initialize_Multi_Attack_γ @cell_hit = {} @hit_p = 0 @dead_ok = false @t_damage = 0 end end #============================================================================== # ■ Game_Battler (分割定義 3) #------------------------------------------------------------------------------ #  バトラーを扱うクラスです。このクラスは Game_Actor クラスと Game_Enemy クラ # スのスーパークラスとして使用されます。 #============================================================================== class Game_Battler #-------------------------------------------------------------------------- # ● 通常攻撃の効果適用 # attacker : 攻撃者 (バトラー) #-------------------------------------------------------------------------- def attack_effect(attacker, data = nil) # データを初期定義(攻撃、ヒット、必殺、属性、付加、解除) data ||= [100, 0, 0, [], [], []] # クリティカルフラグをクリア self.critical = false # 第一命中判定 hit_result = (rand(100) < attacker.hit + data[1]) # 命中の場合 if hit_result == true # 基本ダメージを計算 atk = [attacker.atk - self.pdef / 2, 0].max self.damage = atk * (20 + attacker.str) / 20 self.damage = self.damage * data[0] / 100 # 属性修正 element = attacker.element_set + data[3] self.damage *= elements_correct(element) self.damage /= 100 # ダメージの符号が正の場合 if self.damage > 0 # クリティカル修正 crt = 4 * attacker.dex / self.agi if rand(100) < crt + data[2] self.damage *= 2 self.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 += data[1] hit = self.cant_evade? ? 100 : hit hit_result = (rand(100) < hit) end # 命中の場合 if hit_result == true # ステート衝撃解除 remove_states_shock # HP からダメージを減算 self.hp -= self.damage # ステート変化 @state_changed = false plus = attacker.plus_state_set + data[4] states_plus(plus) minus = attacker.minus_state_set + data[5] states_minus(minus) # ミスの場合 else # ダメージに "Miss" を設定 self.damage = "Miss" # クリティカルフラグをクリア self.critical = false end # メソッド終了 return true end #-------------------------------------------------------------------------- # ● スキルの効果適用 # user : スキルの使用者 (バトラー) # skill : スキル #-------------------------------------------------------------------------- def skill_effect(user, skill, data = nil) # データを初期定義(攻撃、ヒット、必殺、属性、付加、解除) data ||= [100, 0, 0, [], [], []] # クリティカルフラグをクリア self.critical = false # スキルの効果範囲が HP 1 以上の味方で、自分の HP が 0、 # またはスキルの効果範囲が HP 0 の味方で、自分の HP が 1 以上の場合 if ((skill.scope == 3 or skill.scope == 4) and self.hp == 0) or ((skill.scope == 5 or skill.scope == 6) and self.hp >= 1) # メソッド終了 return false end # 有効フラグをクリア effective = false # コモンイベント ID が有効の場合は有効フラグをセット effective |= skill.common_event_id > 0 # 第一命中判定 hit = skill.hit + data[1] if skill.atk_f > 0 hit *= user.hit / 100 end hit_result = (rand(100) < hit) # 不確実なスキルの場合は有効フラグをセット effective |= hit < 100 # 命中の場合 if hit_result == true # 威力を計算 power = skill.power + user.atk * skill.atk_f / 100 if power > 0 power -= self.pdef * skill.pdef_f / 200 power -= self.mdef * skill.mdef_f / 200 power = [power, 0].max end # 倍率を計算 rate = 20 rate += (user.str * skill.str_f / 100) rate += (user.dex * skill.dex_f / 100) rate += (user.agi * skill.agi_f / 100) rate += (user.int * skill.int_f / 100) # 基本ダメージを計算 self.damage = power * rate / 20 self.damage = self.damage * data[0] / 100 # 属性修正 element = skill.element_set + data[3] self.damage *= elements_correct(element) self.damage /= 100 # ダメージの符号が正の場合 if self.damage > 0 # クリティカル修正 if rand(100) < data[2] self.damage *= 2 self.critical = true end # 防御修正 if self.guarding? self.damage /= 2 end end # 分散 if skill.variance > 0 and self.damage.abs > 0 amp = [self.damage.abs * skill.variance / 100, 1].max self.damage += rand(amp+1) + rand(amp+1) - amp end # 第二命中判定 eva = 8 * self.agi / user.dex + self.eva hit = self.damage < 0 ? 100 : 100 - eva * skill.eva_f / 100 hit += data[1] hit = self.cant_evade? ? 100 : hit hit_result = (rand(100) < hit) # 不確実なスキルの場合は有効フラグをセット effective |= hit < 100 end # 命中の場合 if hit_result == true # 威力 0 以外の物理攻撃の場合 if skill.power != 0 and skill.atk_f > 0 # ステート衝撃解除 remove_states_shock # 有効フラグをセット effective = true end # HP からダメージを減算 last_hp = self.hp self.hp -= self.damage effective |= self.hp != last_hp # ステート変化 @state_changed = false # ステートを記憶 last_state = self.states.dup effective |= states_plus(skill.plus_state_set+data[4]) effective |= states_minus(skill.minus_state_set+data[5]) # 威力が 0 の場合 if skill.power == 0 # ダメージに空文字列を設定 self.damage = "" # ステートに変化がない場合 unless @state_changed or last_state != self.states # ダメージに "Miss" を設定 self.damage = "Miss" end end # ミスの場合 else # ダメージに "Miss" を設定 self.damage = "Miss" end # 戦闘中でない場合 unless $game_temp.in_battle # ダメージに nil を設定 self.damage = nil end # メソッド終了 return effective 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 : 強制実行フラグ # data : 多段攻撃データ #-------------------------------------------------------------------------- def attack_effect(attacker, force = false, data = nil) # 対象側アニメを取得 anima_id = attacker.animation2_id # 対象側アニメがない場合 if anima_id == 0 then # スーパークラスを実行 return super(attacker, data) end # アニメーション名を取得 anima_name = Data_Animations.data[anima_id].name # アニメ名に 多段 が含まれない場合 if anima_name.include?("多段") == false then # スーパークラスを実行 return super(attacker, data) end # 強制実行フラグがオンの場合 if force == true then # スーパークラスを実行 return super(attacker, data) end # メソッド終了 return false end #-------------------------------------------------------------------------- # ● スキルの効果適用 # user : スキルの使用者 (バトラー) # skill : スキル # force : 強制実行フラグ # data : 多段攻撃データ #-------------------------------------------------------------------------- def skill_effect(user, skill, force = false, data = nil) # 対象側アニメを取得 anima_id = skill.animation2_id # 対象側アニメがない場合 if anima_id == 0 then # スーパークラスを実行 return super(user, skill, data) end # アニメーション名を取得 anima_name = Data_Animations.data[anima_id].name # アニメ名に 多段 が含まれない場合 if anima_name.include?("多段") == false then # スーパークラスを実行 return super(user, skill, data) end # 戦闘中でない場合 if $game_temp.in_battle == false then # スーパークラスを実行 return super(user, skill, data) end # 強制実行フラグがオンの場合 if force == true then # スーパークラスを実行 return super(user, skill, data) 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 dead?) 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 : 強制実行フラグ # data : 多段攻撃データ #-------------------------------------------------------------------------- def attack_effect(attacker, force = false, data = nil) # 対象側アニメを取得 anima_id = attacker.animation2_id # 対象側アニメがない場合 if anima_id == 0 then # スーパークラスを実行 return super(attacker, data) end # アニメーション名を取得 anima_name = Data_Animations.data[anima_id].name # アニメ名に 多段 が含まれない場合 if anima_name.include?("多段") == false then # スーパークラスを実行 return super(attacker, data) end # 強制実行フラグがオンの場合 if force == true then # スーパークラスを実行 return super(attacker, data) end # メソッド終了 return false end #-------------------------------------------------------------------------- # ● スキルの効果適用 # user : スキルの使用者 (バトラー) # skill : スキル # force : 強制実行フラグ # data : 多段攻撃データ #-------------------------------------------------------------------------- def skill_effect(user, skill, force = false, data = nil) # 対象側アニメを取得 anima_id = skill.animation2_id # 対象側アニメがない場合 if anima_id == 0 then # スーパークラスを実行 return super(user, skill, data) end # アニメーション名を取得 anima_name = Data_Animations.data[anima_id].name # アニメ名に 多段 が含まれない場合 if anima_name.include?("多段") == false then # スーパークラスを実行 return super(user, skill, data) end # 戦闘中でない場合 if $game_temp.in_battle == false then # スーパークラスを実行 return super(user, skill, data) end # 強制実行フラグがオンの場合 if force == true then # スーパークラスを実行 return super(user, skill, data) 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 #-------------------------------------------------------------------------- # ● オブジェクト初期化 # viewport : ビューポート # battler : バトラー (Game_Battler) # alias : initialize_Multi_Attack_γ #-------------------------------------------------------------------------- alias initialize_Multi_Attack_γ initialize def initialize(viewport, battler = nil) # 多段ダメージ用の配列を作成 @damage = [] @damage_duration = [] # 解放禁止フラグをクリア @not_dispose = false # 元の処理を実行 initialize_Multi_Attack_γ(viewport, battler) end #-------------------------------------------------------------------------- # ● 解放 #-------------------------------------------------------------------------- alias dispose_Multi_Attack_γ dispose def dispose # ダメージが存在する場合 if @damage != nil then # ウェーブダメージが有効な場合 if MINTO::RGSS["Wave_Damage"] == true then # ダメージを解放 dispose_damage # ダミーダメージを作成 @damage = Sprite.new # ウェーブダメージが無効な場合 else # ダメージを解放 dispose_damage end end # 解放禁止フラグを設定 @not_dispose = true # 元の処理を実行 dispose_Multi_Attack_γ end #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- alias update_Multi_Attack_γ update def update # 元の処理を実行 update_Multi_Attack_γ # ウェーブダメージが無効な場合 if MINTO::RGSS["Wave_Damage"] == false then # ダメージを更新 update_damage end end #------------------------------------------------------------------------- # ● ダメージの表示 # value : ダメージ値 # critical : クリティカルの有無 #------------------------------------------------------------------------- def damage(value, critical) # 無効なダメージの場合 if value == nil then # メソッドを返す return end # 求められた文字を一文字ずつ配列にする text = value.to_s.dup.split(//) # ダメージから - を削除 text -= ["-"] # ウェーブダメージが有効な場合 if MINTO::RGSS["Wave_Damage"] == true then # ダメージオブジェクト生成 @damage.unshift(Mint_Damage_System.new(0, 0, text.size, 3000)) # ダメージを作成 set_damage(value, critical, text.size) # ウェーブダメージが無効な場合 else # ダメージスプライトが存在する場合 if @_damage_sprite != nil then # ダメージスプライトを解放 @_damage_sprite.dispose @_damage_sprite = nil end # 解放禁止フラグを設定 @not_dispose = true # スーパークラスを実行 super(value, critical) # 解放禁止フラグをクリア @not_dispose = false # ダメージオブジェクトに収納 @damage.unshift(@_damage_sprite.copy) # ダメージカウントをセット @damage_duration.unshift(40) # ダメージが空文字の場合 if value == "" then # ダメージカウントをリセット @damage_duration[0] = 0 end # ダミーダメージカウントをセット @_damage_duration = @damage_duration[0] end # ダミーダメージが存在する場合 if @_damage_sprite != nil then # ダミーダメージを解放 @_damage_sprite.dispose @_damage_sprite = nil end # ダミーダメージを作成 @_damage_sprite = Sprite.new # 座標を取得 x = @battler.screen_x - self.ox / 2 y = @battler.screen_y - self.oy / 2 + self.viewport.rect.y # ヒット数に応じて表示位置を調節 y -= 5 + @battler.hit_p % 5 * 16 # ウェーブダメージが有効な場合 if MINTO::RGSS["Wave_Damage"] == true then # ダメージが Miss の場合 if value == "Miss" then # ダメージの座標をセット @damage[0].set_x(x, 1233) else # ダメージの座標をセット @damage[0].set_x(x, value) end end # ダメージの表示位置(高さ)を設定 @damage[0].y = y end #------------------------------------------------------------------------- # ● ダメージ作成 # value : ダメージ値 # critical : クリティカルの有無 # size : 文字数 #------------------------------------------------------------------------- def set_damage(value, critical, size) # ダメージが文字列の場合 if value.is_a?(String) # ダメージが Miss の場合 if value == "Miss" then # 数値ダメージとして表示 @damage[0].set_text(1233, 5, false) else # ダメージをセット(文字列) @damage[0].set_string(value.to_s, 0, critical) end # ダメージが数字の場合 else # ダメージが 0 以上の場合 if value.to_i >= -1 then # クリティカルフラグに応じて分岐 case critical # トータルダメージ表示 when 1 then # カラーIDを通常に設定 c = 0 # クリティカルの場合 when true then # カラーIDをクリティカルに設定 c = 1 # それ以外の場合 else # カラーIDを通常に設定 c = 0 end # ダメージがマイナスの場合 else # カラーIDを回復に設定 c = 2 end # ダメージをセット(数値) @damage[0].set_text(value, c, critical) end # ダメージカウントをセット @damage_duration.unshift(40 + (size * MINTO::Wave_Rate)) # ダメージが空文字の場合 if value == "" then # ダメージカウントをリセット @damage_duration[0] = 0 end # ダミーダメージカウントをセット @_damage_duration = @damage_duration[0] end #------------------------------------------------------------------------- # ● ダメージ解放 # index : 解放するダメージのインデックス #------------------------------------------------------------------------- def dispose_damage(index = nil) # 解放禁止フラグが有効な場合 if @not_dispose == true then # メソッドを返す return end # インデックスが指定されている場合 if index != nil then # ダメージオブジェクトを解放 @damage[index].dispose @damage[index] = nil @damage_duration[index] = nil # 存在しないオブジェクトを除外 @damage.compact! @damage_duration.compact! # インデックスが指定されていない場合 else # 全ダメージを解放 for i in 0...@damage.size do # ダメージオブジェクトを解放 @damage[i].dispose @damage[i] = nil @damage_duration[i] = nil end # 存在しないオブジェクトを除外 @damage.compact! @damage_duration.compact! # ダミーダメージが存在する場合 if @_damage_sprite != nil then # ダミーダメージを解放 @_damage_sprite.dispose @_damage_sprite = nil end end end #----------------------------------------------------------------------- # ● フレーム更新(ダメージ) #----------------------------------------------------------------------- def update_damage # ダメージオブジェクトの数が1以上の場合 if @damage.size >= 1 then # ダメージオブジェクトと、そのインデックスを取得 @damage.each_with_index do |damage, i| # ダメージカウントが0の場合 if @damage_duration[i] == 0 then # ダメージオブジェクトを解放 dispose_damage(i) # 次の処理へ next end # ダメージカウントを進める @damage_duration[i] -= 1 # ウェーブダメージが無効な場合 if MINTO::RGSS["Wave_Damage"] == false then # ダメージカウントに応じて分岐 case @damage_duration[i] when 38..39 then @damage[i].y -= 4 when 36..37 then @damage[i].y -= 2 when 34..35 then @damage[i].y += 2 when 28..33 then @damage[i].y += 4 end end # ダメージカウントが5以下の場合 if @damage_duration[i] <= 5 then # 透明度の配列(6段階) opacity = [0, 50, 100, 150, 200, 250] # 表示中のダメージの透明度を下げる @damage[i].opacity = opacity[@damage_duration[i]] end # ダメージオブジェクトを更新 @damage[i].update end end end #-------------------------------------------------------------------------- # ● フレーム更新(アニメーション) #-------------------------------------------------------------------------- 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 # メソッドを返す return end # スーパークラスを実行 super 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 # 多段データを取得 multi_data = multi_hit_data(battler, target, cell_data[i, 0]+1) # アクティブバトラーのカレントアクションに応じて分岐 case battler.current_action.kind # 通常攻撃の場合 when 0 then # 通常攻撃の効果を適用 target.attack_effect(battler, true, multi_data) # スキル攻撃の場合 when 1 then # スキルのIDを取得 skill_id = battler.current_action.skill_id # スキルを取得 skill = Data_Skills_Base.data[skill_id] # スキルの効果を適用 target.skill_effect(battler, skill, true, multi_data) 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 # 総合ダメージに加算 target.t_damage += target.damage 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]] != 1 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 # スプライトセットバトルデータ end #============================================================================== # ■ Scene_Battle (分割定義 4) #------------------------------------------------------------------------------ #  バトル画面の処理を行うクラスです。 #============================================================================== class Scene_Battle #-------------------------------------------------------------------------- # ● フレーム更新 (メインフェーズ ステップ 5 : ダメージ表示) # alias : update_phase4_step5_Multi_Attack_γ #-------------------------------------------------------------------------- alias update_phase4_step5_Multi_Attack_γ update_phase4_step6 def update_phase4_step5 # 総合ダメージ表示 for target in @target_battlers do # 2ヒット以上している場合 if target.hit_p >= 2 then # 総合ダメージを渡す target.damage = target.t_damage end # 総合ダメージを初期化 target.t_damage = 0 # ヒット数を初期化 target.hit_p = 0 # ダメージ表示フラグをオン target.damage_pop = true # ヒット済みフラグをクリア target.cell_hit = {} # ターゲットが不死身でなく、且つHPが0の場合 if target.immortal == false and target.hp <= 0 then # 戦闘不能を許可 target.dead_ok = true target.hp = 0 else # 戦闘不能を不許可 target.dead_ok = false target.hp = target.hp end end # 元の処理を実行 update_phase4_step5_Multi_Attack_γ end end end