#============================================================================== # ○RGSS2連続で出すと威力が変わる技 #作成者:riru/ガラス細工の夢幻 #http://garasuzaikunomugen.web.fc2.com/index.html #連続で出すと威力が変わる技を作れます。要するにポケモンのれんぞくぎり #<使い方> #スキルのメモ欄に下記のように記入する #<連続攻撃 (種類):(変動数(%)),(リセット),(変動上限ターン数)> #使用例:<連続攻撃 S:150%,リセット,5> # 種類…変動させるパラメータの種類です # B => 基本ダメージ # P => 打撃依存度 # S => 精神依存度 # V => 分散 # H => 成功率 # A => 速度補正値 # 増加数…1ターンに変動する数。この数×連続ターンor上限ターン数分パラメータが変動します #     -をつけるとターンごとに減少。最後に%をつけるとその数値の連続ターンor上限ターン数乗のパラメータ変動となります # リセット…ミスや回避をされたり、通常攻撃、防御や他の技を使ったときに補正をリセットする #      リセットするならリセット、リセットしないならアンリセットと記入してください # 変動上限ターン数…変動するターン数の上限。このターン数以降は設定したターン数の補正がかかります。 #          記入なしの場合は無限に変動し続けます # # 変動させたい種類が複数の場合は行を変えて↑を記入してください #*更新履歴* #2017/8/26 戦闘をした後歩行が時々カクつく不具合を修正 #2015/2/22 一部%指定にした場合十の位以下が上手く反映されないバグを修正 #============================================================================== module Riru module Successive_attack #-------------------------------------------------------------------------- # ● 変動する内容の取得 #-------------------------------------------------------------------------- def self.successive_attack(skill) @successive_attack = [] #メモ欄より内容を取得 skill.note.split(/[\r\n]+/).each{|line| case line when /<(?:連続攻撃)[ ]+([BPSVHA]):\s*?([\+\-]?\d+)([%%])?,\s*?(リセット|アンリセット)\,?\s*?([\+\-]?\d+)?>/ @successive_attack.push([$1,$2.to_i,$3,$4,$5.to_i]) end } return @successive_attack end end end #============================================================================== # ■ Scene_Battle #============================================================================== class Scene_Battle < Scene_Base #-------------------------------------------------------------------------- # ● 開始処理 #-------------------------------------------------------------------------- alias riru_successive_start start def start riru_successive_start create_successive_attack_count#連続使用カウントの配列作成 end #-------------------------------------------------------------------------- # ● スキル連続使用カウントの作成#riru新規 #-------------------------------------------------------------------------- def create_successive_attack_count $riru_successive_attack_count = [] if $riru_successive_attack_count == nil $riru_successive_attack_count_enemy = [] if $riru_successive_attack_count_enemy == nil for n in 1...$data_skills.size skill = $data_skills[n] if Riru::Successive_attack.successive_attack(skill) != []#スキルのメモ欄に連続攻撃の記述があった場合 $riru_successive_attack_count[skill.id] = [] $riru_successive_attack_count_enemy[skill.id] = [] #アクター用 for actor in $game_party.members $riru_successive_attack_count[skill.id][actor.id] = [] for i in 0..Riru::Successive_attack.successive_attack(skill).size $riru_successive_attack_count[skill.id][actor.id][i] = 0 end end #エネミー用 for enemy in $game_troop.members $riru_successive_attack_count_enemy[skill.id][enemy.enemy_id] = [] for i in 0..Riru::Successive_attack.successive_attack(skill).size $riru_successive_attack_count_enemy[skill.id][enemy.enemy_id][i] = 0 end end end end end #-------------------------------------------------------------------------- # ● 戦闘行動の実行 #-------------------------------------------------------------------------- alias riru_successive_attack_execute_action execute_action def execute_action for n in 1...$data_skills.size data_skill = $data_skills[n] data_skill_successive_attack = Riru::Successive_attack.successive_attack(data_skill) next if @active_battler.action.skill != nil and data_skill.id == @active_battler.action.skill.id if data_skill_successive_attack != []#スキルのメモ欄に連続攻撃の記述があった場合 for i in 0...data_skill_successive_attack.size if @active_battler.is_a?(Game_Actor) $riru_successive_attack_count[data_skill.id][@active_battler.id][i] = 0 if data_skill_successive_attack[i][3] == "リセット"#スキルのメモ欄に連続攻撃の記述があった場合#riru追加カウントリセット else $riru_successive_attack_count_enemy[data_skill.id][@active_battler.enemy_id][i] = 0 if data_skill_successive_attack[i][3] == "リセット"#スキルのメモ欄に連続攻撃の記述があった場合#riru追加カウントリセット end end end end riru_successive_attack_execute_action end end #============================================================================== # ■ Game_Battler #------------------------------------------------------------------------------ #  バトラーを扱うクラスです。このクラスは Game_Actor クラスと Game_Enemy クラ # スのスーパークラスとして使用されます。 #============================================================================== class Game_Battler #-------------------------------------------------------------------------- # ● スキルまたはアイテムによるダメージ計算 # user : スキルまたはアイテムの使用者 # obj : スキルまたはアイテム # 結果は @hp_damage または @mp_damage に代入する。#再定義 #-------------------------------------------------------------------------- def make_obj_damage_value(user, obj) damage = obj.base_damage # 基本ダメージを取得 atk = obj.atk_f spi = obj.spi_f variance = obj.variance if Riru::Successive_attack.successive_attack(obj) != []#スキルのメモ欄に連続攻撃の記述があった場合 successive_attack = Riru::Successive_attack.successive_attack(obj) for i in 0...successive_attack.size if user.actor? count = $riru_successive_attack_count[obj.id][user.id][i] else count = $riru_successive_attack_count_enemy[obj.id][user.enemy_id][i] end if count != 0 case successive_attack[i][0] when "B"#基本ダメージ if successive_attack[i][2] != nil#割合 a = successive_attack[i][1]/100.0 aa = a ** count damage = (obj.base_damage * aa).to_i else damage += successive_attack[i][1] * count end when "P"#打撃依存度 if successive_attack[i][2] != nil#割合 a = successive_attack[i][1]/100.0 aa = a ** count atk = (obj.atk_f * aa).to_i else atk += successive_attack[i][1] * count end when "S"#精神依存度 if successive_attack[i][2] != nil#割合 a = successive_attack[i][1]/100.0 aa = a ** count spi = (obj.spi_f * aa).to_i else spi += successive_attack[i][1] * count end when "V"#分散度 if successive_attack[i][2] != nil#割合 a = successive_attack[i][1]/100.0 aa = a ** count variance = (obj.variance * aa).to_i else variance += successive_attack[i][1] * count end end end if user.actor? if successive_attack[i][4] == 0 $riru_successive_attack_count[obj.id][user.id][i] += 1 elsif count < successive_attack[i][4] $riru_successive_attack_count[obj.id][user.id][i] += 1 end else if successive_attack[i][4] == 0 $riru_successive_attack_count_enemy[obj.id][user.enemy_id][i] += 1 elsif count < successive_attack[i][4] $riru_successive_attack_count_enemy[obj.id][user.enemy_id][i] += 1 end end end end if damage > 0 # ダメージが正の数 damage += user.atk * 4 * atk / 100 # 打撃関係度: 使用者 damage += user.spi * 2 * spi / 100 # 精神関係度: 使用者 unless obj.ignore_defense # 防御力無視以外 damage -= self.def * 2 * atk / 100 # 打撃関係度: 対象者 damage -= self.spi * 1 * spi / 100 # 精神関係度: 対象者 end damage = 0 if damage < 0 # マイナスなら 0 に elsif damage < 0 # ダメージが負の数 damage -= user.atk * 4 * atk / 100 # 打撃関係度: 使用者 damage -= user.spi * 2 * spi / 100 # 精神関係度: 使用者 end damage *= elements_max_rate(obj.element_set) # 属性修正 damage /= 100 damage = apply_variance(damage, variance) # 分散 damage = apply_guard(damage) # 防御修正 if obj.damage_to_mp @mp_damage = damage # MP にダメージ else @hp_damage = damage # HP にダメージ end end #-------------------------------------------------------------------------- # ● 最終命中率の計算 # user : 攻撃者、スキルまたはアイテムの使用者 # obj : スキルまたはアイテム (通常攻撃の場合は nil)#riru再定義 #-------------------------------------------------------------------------- def calc_hit(user, obj = nil) if obj == nil # 通常攻撃の場合 hit = user.hit # 命中率を取得 physical = true elsif obj.is_a?(RPG::Skill) # スキルの場合 hit = obj.hit # 成功率を取得 if Riru::Successive_attack.successive_attack(obj) != []#スキルのメモ欄に連続攻撃の記述があった場合 successive_attack = Riru::Successive_attack.successive_attack(obj) for i in 0..successive_attack.size if user.actor? count = $riru_successive_attack_count[obj.id][user.id][i] else count = $riru_successive_attack_count_enemy[obj.id][user.enemy_id][i] end if count != 0 if successive_attack[i][0] == "H" if successive_attack[i][2] != nil#割合 a = successive_attack[i][1]/100.0 aa = a ** count hit = (obj.hit * aa).to_i else hit += successive_attack[i][1] * count end end end end end hit = 100 if hit > 100 physical = obj.physical_attack else # アイテムの場合 hit = 100 # 命中率を 100% とする physical = obj.physical_attack end if physical # 物理攻撃の場合 hit /= 4 if user.reduce_hit_ratio? # 使用者が暗闇なら 1/4 にする end for state in user.states st_hantei = /<必中>/ =~ $data_states[state.id].note end hit = 100 if st_hantei != nil #riru新規深呼吸用 return hit end #-------------------------------------------------------------------------- # ● スキルの効果適用#riru再定義 # user : スキルの使用者 # skill : スキル #-------------------------------------------------------------------------- def skill_effect(user, skill) clear_action_results #連続を選択した場合違うスキルを選択したらカウントをリセットする successive_attack = Riru::Successive_attack.successive_attack(skill) unless skill_effective?(user, skill) @skipped = true return end if rand(100) >= calc_hit(user, skill) # 命中判定 if Riru::Successive_attack.successive_attack(skill) != []#スキルのメモ欄に連続攻撃の記述があった場合 for i in 0...Riru::Successive_attack.successive_attack(skill).size if user.is_a?(Game_Actor) $riru_successive_attack_count[skill.id][user.id][i] = 0 if successive_attack[i][3] == "リセット"#スキルのメモ欄に連続攻撃の記述があった場合#riru追加カウントリセット else $riru_successive_attack_count_enemy[skill.id][user.enemy_id][i] = 0 if successive_attack[i][3] == "リセット"#スキルのメモ欄に連続攻撃の記述があった場合#riru追加カウントリセット end end end @missed = true return end if rand(100) < calc_eva(user, skill) # 回避判定 if Riru::Successive_attack.successive_attack(skill) != []#スキルのメモ欄に連続攻撃の記述があった場合 successive_attack = Riru::Successive_attack.successive_attack(skill) for i in 0...Riru::Successive_attack.successive_attack(skill).size if user.is_a?(Game_Actor) $riru_successive_attack_count[skill.id][user.id][i] = 0 if successive_attack[i][3] == "リセット"#スキルのメモ欄に連続攻撃の記述があった場合#riru追加カウントリセット else $riru_successive_attack_count_enemy[skill.id][user.enemy_id][i] = 0 if successive_attack[i][3] == "リセット"#スキルのメモ欄に連続攻撃の記述があった場合#riru追加カウントリセット end end end @evaded = true return end make_obj_damage_value(user, skill) # ダメージ計算 make_obj_absorb_effect(user, skill) # 吸収効果計算 execute_damage(user) # ダメージ反映 if skill.physical_attack and @hp_damage == 0 # 物理ノーダメージ判定 return end apply_state_changes(skill) # ステート変化 end end #============================================================================== # ■ Game_BattleAction #------------------------------------------------------------------------------ #  戦闘行動を扱うクラスです。このクラスは Game_Battler クラスの内部で使用され # ます。 #============================================================================== class Game_BattleAction #-------------------------------------------------------------------------- # ● 行動スピードの決定 #-------------------------------------------------------------------------- alias riru_successive_make_speed make_speed def make_speed riru_successive_make_speed #元の処理を実行 if skill? if Riru::Successive_attack.successive_attack(skill) != []#スキルのメモ欄に連続攻撃の記述があった場合 successive_attack = Riru::Successive_attack.successive_attack(skill) for i in 0..successive_attack.size if battler.actor? count = $riru_successive_attack_count[skill.id][battler.id][i] else count = $riru_successive_attack_count_enemy[skill.id][battler.enemy_id][i] end if count != 0 if successive_attack[i][0] == "A" if successive_attack[i][2] != nil#割合 a = successive_attack[i][1]/100.0 aa = a ** count @speed = (skill.speed * aa).to_i else @speed += successive_attack[i][1] * count end end end end end end end end