########## クリティカル率の変動、クリティカル効果のあるスキルの作成 ########## # # # クリティカルの発生確率を変動させることができるようになります。 # # クリティカル率を変動させたい武器の属性に # # 「相対クリティカル率:」あるいは「絶対クリティカル率:」のあとに # # 整数を入力してください。 # # そのパーセンテージに変更されます。 # # # # 例えば「相対クリティカル率:100」ならば通常通り、 # # 「相対クリティカル率:200」 ならば通常の二倍の確率でクリティカルが発生。 # # 「絶対クリティカル率:50」ならば相手に関係なく50%の確率で発生します。 # # 「相対クリティカル率:0」なら絶対にクリティカルが発生しなくなります。 # # # # また、スキルにも同様の方法でクリティカルを設定可能です。 # # スキルの属性に「相対クリティカル率:100」と設定すれば # # 通常攻撃と同様の確率でクリティカルが発生するようになります。 # # # # また、相対クリティカル率が重複している場合はその積を(150と200なら300)、 # # 絶対クリティカル率が重複している場合はその和を(10と20なら30)、 # # それぞれ元にしてクリティカル率を計算します。 # # # # 相対と絶対両方が設定された場合の挙動は、 # # CRITICAL_CALCULATEで設定可能です。 # # # ############################################################################## # ココから設定 module Annex # 相対クリティカル率 #  元のクリティカル率を100としての百分率 (100なら通常攻撃と同じ) RELATIVE_CRITICAL_RATE = "相対クリティカル率:" # 絶対クリティカル率 #  どんな相手にも一定のクリティカル率(100なら絶対クリティカル) ABSOLUTE_CRITICAL_RATE = "絶対クリティカル率:" # クリティカル率計算方法 #  0 : 絶対クリティカル率が設定されているならば相対クリティカル率は無視 #  1 : 相対クリティカル率が設定されているならば絶対クリティカル率は無視 #  2 : 両方合わせる(相対クリティカル率の計算結果+絶対クリティカル率) CRITICAL_CALCULATE_TYPE = 0 end # クリティカル率の計算式を変更したい人は下記を書き換えてください。 class Game_Battler #-------------------------------------------------------------------------- # ◎追加:クリティカル計算 # user : スキル(攻撃)の使用者 (バトラー) # critical_rate : クリティカル率変動属性で得られた基底 # abs_critical_rate : クリティカル率変動属性で得られた絶対クリティカル率 #-------------------------------------------------------------------------- def calc_critical_rate(user, critical_rate = 100, abs_critical_rate = 0) # とりあえずデフォルトで使われている式をそのまま。 # critical_rate : クリティカル率変動属性で得られた基底 # user.dex 攻撃側の 器用さ # self.agi 防御側の 素早さ rate = 0 # 相対クリティカル率計算 if critical_rate > 0 rate = (critical_rate * 4 * user.dex) / (self.agi * 100) end # 絶対クリティカル率が設定されている場合 if abs_critical_rate > 0 # 計算形式 case Annex::CRITICAL_CALCULATE_TYPE when 0 # 絶対クリティカル優先 rate = abs_critical_rate when 1 # 相対クリティカル優先 if rate == 0 rate = abs_critical_rate end when 2 # 両方足す rate += abs_critical_rate end end # 0 - 100の範囲に丸める rate = [rate, 0].max rate = [rate, 100].min # 乱数との比較 if rand(100) < rate # クリティカル発生 return true end # クリティカルじゃない return false end end # ココまでが設定 #============================================================================== # ■ Game_Battler #============================================================================== class Game_Battler #-------------------------------------------------------------------------- # ○ 通常攻撃の効果適用 # attacker : 攻撃者 (バトラー) #-------------------------------------------------------------------------- alias critical_setting_attack_effect attack_effect def attack_effect(attacker) # 現在のHPを取得 last_hp = self.hp # 呼び戻し effective = critical_setting_attack_effect(attacker) # クリティカル率を変動させる属性を取得 rate = get_element_key_id(attacker.element_set, Annex::RELATIVE_CRITICAL_RATE) abs_rate = get_element_key_id(attacker.element_set, Annex::ABSOLUTE_CRITICAL_RATE) # 絶対クリティカル率算出 abs_critical_rate = 0 if abs_rate != [] for i in abs_rate abs_critical_rate += i end end # 初期値は絶対クリティカル率が1以上ならば暫定的に0 critical_rate = abs_critical_rate == 0 ? 100 : 0 print critical_rate # 相対クリティカル率算出 if rate != [] # クリティカル率算出 critical_rate = 100 for i in rate critical_rate = critical_rate * i / 100 end end # クリティカル率が100で無い場合 if critical_rate != 100 or abs_critical_rate > 0 # クリティカルが発生していた場合 if self.critical == true # HPを戻す self.hp = last_hp # クリティカルフラグをクリア self.critical = false # ダメージを半分に戻す self.damage /= 2 end # クリティカル率を変更して計算しなおす if calc_critical_rate(attacker, critical_rate, abs_critical_rate) # クリティカルフラグを設定 self.critical = true # ダメージを二倍(-1〜1の分散つき) self.damage = [self.damage * 2 + rand(2) - rand(2), 1].max end # HPの減算を再実行 self.hp -= self.damage end return effective end #-------------------------------------------------------------------------- # ○ スキルの効果適用 # user : スキルの使用者 (バトラー) # skill : スキル #-------------------------------------------------------------------------- alias critical_setting_skill_effect skill_effect def skill_effect(user, skill) # 現在のHPを取得 last_hp = self.hp # 呼び戻し effective = critical_setting_skill_effect(user, skill) # ダメージが正の場合 if self.damage > 0 # クリティカル率を変動させる属性を取得 rate = get_element_key_id(skill.element_set, Annex::RELATIVE_CRITICAL_RATE) abs_rate = get_element_key_id(skill.element_set, Annex::ABSOLUTE_CRITICAL_RATE) # 絶対クリティカル率算出 abs_critical_rate = 0 if abs_rate != [] for i in abs_rate abs_critical_rate += i end end critical_rate = 0 # 相対クリティカル率算出 if rate != [] # クリティカル率算出 critical_rate = 100 for i in rate critical_rate = critical_rate * i / 100 end end # クリティカル率が100で無い場合 if critical_rate != 0 or abs_critical_rate > 0 # クリティカル計算開始 if calc_critical_rate(user, critical_rate, abs_critical_rate) # クリティカルフラグを設定 self.critical = true # ダメージを二倍(-1〜1の分散つき) self.damage = [self.damage * 2 + rand(2) - rand(2), 1].max # HPを元に戻す self.hp = last_hp # HPの減算を再実行 self.hp -= self.damage end end end return effective end #-------------------------------------------------------------------------- # ◎ 追加:「属性名+数字」の形式の属性が含まれていればその数字部分を取得。 # element_set : 属性の配列 # key : 取得する属性名 #-------------------------------------------------------------------------- def get_element_key_id(element_set, key) id = [] for i in element_set if $data_system.elements[i] =~ /#{key}([0-9]+)/ # ID取得 id.push($1.to_i) end end return id end end