#============================================================================== # ■ RGSS3 限界ダメージ/回復時特殊効果 Ver1.00 by 星潟 #------------------------------------------------------------------------------ # 現在HPを超えるダメージや回復を与えた時 # 超過分を反転して与えたり、特定スキルの使用効果を与えるアイテム/スキルと # 現在HPを超えるダメージや回復を受けた時 # 超過分を反転して受けたり、特定スキルの使用効果を受ける # 特徴を作成できるようになります。 # (使用効果により受けたダメージや回復では発生しません。 # 基本的にダメージタイプ:HPダメージ・HP回復のアイテム/スキルが対象です) #------------------------------------------------------------------------------ # 例.現在HPが40の敵に75ダメージを与え、超過ダメージ反転が有効の場合 # 75 - 40 = 35で現在HP分のダメージを受けた後、35回復した扱いのダメージとなる。 # つまり、40 - 35となり、与えるダメージは5に変更される。 #------------------------------------------------------------------------------ # 例.最大HP50、現在HPが40の敵が100回復する場合、超過回復反転が有効の場合 # 100 - (50 - 40) = 90で現在ダメージ分の回復をした後 # 90ダメージを受けた扱いの回復量となる。 # つまり、10 - 90となり、与える回復量は-80に変更される。 # (80ダメージを受ける。この場合は実質戦闘不能) #------------------------------------------------------------------------------ # また、特徴による反転効果を無効にする効果を # アイテム/スキルに持たせる事も出来ます。 #============================================================================== # アイテム/スキルのメモ欄に指定。 # SにスキルID、Dに起動判定となるダメージ/回復値、Rの箇所は確率を指定します。 # (1〜100の数字や、スクリプトによる指定。 # スクリプト中でaで使用者、bで対象者、vで$game_variablesを取得) #============================================================================== # <超過ダメージ時反転効果:D,R> # # 被ダメージ時、ダメージ量がD以上であれば # R%の確率で現在HPを超過した分のダメージを反転させます。 #------------------------------------------------------------------------------ # <超過ダメージ時反転S効果:S,D,R> # # 被ダメージ時、ダメージ量がD以上であれば # R%の確率でスキルID Sの使用効果を与えます。 #------------------------------------------------------------------------------ # <超過回復時反転効果:D,R> # # 被回復時、ダメージ量がD以上であれば # R%の確率で現在ダメージを超過した分の回復を反転させます。 #------------------------------------------------------------------------------ # <超過回復時反転S効果:S,D,R> # # 被回復時、ダメージ量がD以上であれば # R%の確率でスキルID Sの使用効果を与えます。 #------------------------------------------------------------------------------ # <超過ダメージ処理無効:R> # # R%の確率で超過ダメージ反転効果を無効化します。 #------------------------------------------------------------------------------ # <超過回復処理無効:R> # # R%の確率で超過回復効果を無効化します。 #============================================================================== # 特徴を有する項目(アクター・エネミー・職業・装備・ステート)のメモ欄に指定。 # SにスキルID、Dに起動判定となるダメージ/回復値、Rの箇所は確率を指定します。 # (1〜100の数字や、スクリプトによる指定。 # スクリプト中でaで使用者、bで対象者、vで$game_variablesを取得) #============================================================================== # <超過ダメージ時反転特徴:D,R> # # 被ダメージ時、ダメージ量がD以上であれば # R%の確率で現在HPを超過した分のダメージを反転させます。 #------------------------------------------------------------------------------ # <超過ダメージ時反転S効果特徴:S,D,R> # # 被ダメージ時、ダメージ量がD以上であれば # R%の確率でスキルID Sの使用効果を受けます。 #------------------------------------------------------------------------------ # <超過回復時反転特徴:D,R> # # 被回復時、ダメージ量がD以上であれば # R%の確率で現在ダメージを超過した分の回復を反転させます。 #------------------------------------------------------------------------------ # <超過回復時反転S効果特徴:S,D,R> # # 被回復時、ダメージ量がD以上であれば # R%の確率でスキルID Sの使用効果を受けます。 #============================================================================== module HpdInv Word1 = ["超過ダメージ時反転効果","超過回復時反転効果"] Word2 = ["超過ダメージ処理無効","超過回復処理無効"] Word3 = ["超過ダメージ時反転特徴","超過回復時反転特徴"] Word4 = ["超過ダメージ時反転S効果","超過回復時反転S効果"] Word5 = ["超過ダメージ時反転S効果特徴","超過回復時反転S効果特徴"] end class RPG::UsableItem < RPG::BaseItem #-------------------------------------------------------------------------- # 超過ダメージ時反転効果 #-------------------------------------------------------------------------- def hpd_invert_by_maxd_is @hpd_invert_by_maxd_is ||= HpdInv::Word1.inject([]) {|r,w| r += [/<#{w}[::](\S+),(\S+)>/ =~ note ? [$1.to_s,$2.to_s] : ["0","0"]]} end #-------------------------------------------------------------------------- # 超過ダメージ時反転スキル使用効果 #-------------------------------------------------------------------------- def hpd_invert_by_maxd_is_us @hpd_invert_by_maxd_is_us ||= HpdInv::Word4.inject([]) {|r,w| r += [/<#{w}[::](\S+),(\S+),(\S+)>/ =~ note ? [$1.to_s,$2.to_s,$3.to_s] : ["0","0","0"]]} end #-------------------------------------------------------------------------- # 超過ダメージ反転無効 #-------------------------------------------------------------------------- def hpd_invert_break @hpd_invert_break ||= HpdInv::Word2.inject([]) {|r,w| r += [/<#{w}[::](\S+)>/ =~ note ? $1.to_s : "0"]} end end class RPG::BaseItem #-------------------------------------------------------------------------- # 超過ダメージ時反転特徴 #-------------------------------------------------------------------------- def hpd_invert_by_maxd_f @hpd_invert_by_maxd_f ||= HpdInv::Word3.inject([]) {|r,w| r += [/<#{w}[::](\S+),(\S+)>/ =~ note ? [$1.to_s,$2.to_s] : ["0","0"]]} end #-------------------------------------------------------------------------- # 超過ダメージ時反転スキル使用効果特徴 #-------------------------------------------------------------------------- def hpd_invert_by_maxd_f_us @hpd_invert_by_maxd_f_us ||= HpdInv::Word5.inject([]) {|r,w| r += [/<#{w}[::](\S+),(\S+),(\S+)>/ =~ note ? [$1.to_s,$2.to_s,$3.to_s] : ["0","0","0"]]} end end class Game_ActionResult attr_accessor :hpd_invert_by_maxd_item attr_accessor :hpd_invert_by_maxd #-------------------------------------------------------------------------- # ダメージ値のクリア #-------------------------------------------------------------------------- alias clear_damage_values_hpd_invert_by_maxd clear_damage_values def clear_damage_values clear_damage_values_hpd_invert_by_maxd @hpd_invert_by_maxd_item = nil end end class Game_Battler < Game_BattlerBase #-------------------------------------------------------------------------- # 超過ダメージ反転 #-------------------------------------------------------------------------- def hpd_invert_by_maxd?(a,i,type,dp) b = self v = $game_variables d = i.hpd_invert_by_maxd_is[type] ((dp >= eval(d[0])) && eval(d[1]) > rand(100)) or hpd_invert_by_maxd_f(a,b,v,type,dp) > rand(100) end #-------------------------------------------------------------------------- # 超過ダメージ反転使用効果 #-------------------------------------------------------------------------- def hpd_invert_by_maxd_us(a,i,type,dp) b = self v = $game_variables d = i.hpd_invert_by_maxd_is_us[type] if (dp >= eval(d[1])) && eval(d[2]) > rand(100) s = $data_skills[eval(d[0])] s.effects.each {|effect| item_effect_apply(a,s,effect) } end hpd_invert_by_maxd_f_us(a,b,v,type,dp) end #-------------------------------------------------------------------------- # 超過ダメージ反転特徴 #-------------------------------------------------------------------------- def hpd_invert_by_maxd_f(a,b,v,type,dp) feature_objects.inject(0) {|r,f| d = f.hpd_invert_by_maxd_f[type] r += dp >= eval(d[0]) ? eval(d[1]) : 0} end #-------------------------------------------------------------------------- # 超過ダメージ反転特徴 #-------------------------------------------------------------------------- def hpd_invert_by_maxd_f_us(a,b,v,type,dp) feature_objects.each {|f| d = f.hpd_invert_by_maxd_f_us[type] next unless eval(d[1]) next unless eval(d[2]) > rand(100) s = $data_skills[eval(d[0])] s.effects.each {|effect| item_effect_apply(a,s,effect)}} end #-------------------------------------------------------------------------- # ダメージ計算 #-------------------------------------------------------------------------- alias make_damage_value_hpd_invert_by_maxd make_damage_value def make_damage_value(user, item) @result.hpd_invert_by_maxd_item = item make_damage_value_hpd_invert_by_maxd(user, item) end #-------------------------------------------------------------------------- # ダメージの処理 #-------------------------------------------------------------------------- alias execute_damage_hpd_invert_by_maxd execute_damage def execute_damage(user) lhp = self.hp lhpd = self.mhp - lhp rhd = @result.hp_damage i = @result.hpd_invert_by_maxd_item if rhd > 0 && !(eval(i.hpd_invert_break[0]) > rand(100)) if rhd > lhp d = (lhp - rhd).abs @result.hp_damage = -(rhd - lhp * 2) if hpd_invert_by_maxd?(user,i,0,d) hpd_invert_by_maxd_us(user,i,0,d) end elsif rhd < 0 && !(eval(i.hpd_invert_break[1]) > rand(100)) if -rhd > lhpd d = (lhpd + rhd).abs @result.hp_damage = -rhd - lhpd * 2 if hpd_invert_by_maxd?(user,i,1,d) hpd_invert_by_maxd_us(user,i,1,d) end end execute_damage_hpd_invert_by_maxd(user) end end