#============================================================================== # ■ バリア&対バリアシステム Ver1.01 by 星潟 #------------------------------------------------------------------------------ # アイテム/スキルによるダメージを割合軽減するバリアと # そのバリアの効果を打ち消す対バリア能力を設定できるようになります。 #------------------------------------------------------------------------------ # ★設定方法 #------------------------------------------------------------------------------ #  ☆アイテム/スキルのバリア系列の設定例 # # アイテム/スキルのメモ欄に # <バリア系列:神霊,魔法>と記入した場合 # # そのアイテム/スキルのバリア系列として神霊及び魔法が設定されます。 #------------------------------------------------------------------------------ #  ☆バリアの設定例 # # 特徴を有する項目(アクターやエネミー、装備品やステート)のメモ欄に # <バリア:神霊,50>と記入した場合 # # バリア系列が神霊に設定されたアイテム/スキルを受ける時 # バリア値として50が設定されるようになります。 #------------------------------------------------------------------------------ #  ☆使用者側対バリアの設定例 # # アイテム/スキルのメモ欄に # <対バリア有効>と記入した場合 # # そのアイテム/スキルは使用者側の対バリア設定の効果も受けるようになります。 # (この設定を行わないと使用者側対バリアの影響を受けません) #------------------------------------------------------------------------------ #  ☆使用者側対バリアの設定例 # # 特徴を有する項目(アクターやエネミー、装備品やステート)のメモ欄に # <対バリア:レーザー,30>と記入した場合 # # バリア系列がレーザーに設定されたアイテム/スキルを使用する際 # そのスキルのメモ欄に<対バリア有効>という文字が # 記入されている場合に限り対バリア値として30が設定されるようになります。 #------------------------------------------------------------------------------ # ☆アイテム/スキル側対バリアの設定例 # # アイテム/スキルのメモ欄に # <対バリア追加:実体弾,75>と記入した場合 # そのスキルを使用した際に対バリア値として75が設定されるようになります。 # 使用者側の対バリア値が存在する場合は合算されます。 #------------------------------------------------------------------------------ # ★ダメージ計算例 #------------------------------------------------------------------------------ # まず、そのアイテム/スキルにバリア系列が設定されていなければ # バリアによるダメージ軽減は発生しません。 # # 対象者のバリア値の割合と # アイテム/スキル使用者の対バリア値の割合を掛け合わせます。 # # 例 バリア系列「神霊」で対バリア値50のスキルを # バリア「神霊」50と設定された対象に使用した場合 # 50%ダメージ軽減を50%打ち消し # 最終ダメージは本来のダメージから25%差し引かれた数値となる。 # # 例 バリア系列「魔法」で対バリア値75で<対バリア有効>と書かれたスキルを # 対バリア「魔法」25のキャラクターが # バリア「魔法」100と設定された対象に使用した場合 # 100%ダメージ軽減を100%打ち消し # 最終ダメージは本来のダメージをそのまま与える。 #============================================================================== module BR_ABR_SYSTEM #特徴を有する項目に対するバリア設定用キーワードを設定します。 WORD1 = "バリア" #特徴を有する項目に対する対バリア設定用キーワードを設定します。 WORD2 = "対バリア" #スキルに対する使用者の対バリア有効設定用キーワードを設定します。 WORD3 = "対バリア有効" #スキルに対する対バリア設定用キーワードを設定します。 WORD4 = "対バリア追加" #スキルに対するバリア系列設定用キーワードを設定します。 WORD5 = "バリア系列" #絶対にバリアの影響を受けない属性IDを設定します。 #ID0は「属性なし」です。 ELEM1 = [0, 9, 10] #属性IDとバリア系列の紐付けを行います。 #例としては #1 => ["全軽減","物理"]の場合は属性ID1のアイテム/スキルに #自動的にバリア系列として「全軽減」と「物理」が設定されます。 #それぞれのID設定は「,」で区切るようにして下さい。 ELEM2 = { 1 => ["全軽減","物理"], 2 => ["全軽減"], 3 => ["全軽減","精霊"], 4 => ["全軽減","精霊"], 5 => ["全軽減","精霊"], 6 => ["全軽減","精霊"], 7 => ["全軽減","精霊"], 8 => ["全軽減","精霊"] } end class Game_Temp attr_accessor :last_damage_item end class Game_Battler < Game_BattlerBase #-------------------------------------------------------------------------- # ダメージ計算 #-------------------------------------------------------------------------- alias make_damage_value_barrier make_damage_value def make_damage_value(user, item) #一時情報として、何を使用したかを保存する。 $game_temp.last_damage_item = item #通常通りダメージ計算を行う。 make_damage_value_barrier(user, item) #一時情報を削除する。 $game_temp.last_damage_item = nil end #-------------------------------------------------------------------------- # バリア特徴 #-------------------------------------------------------------------------- def br_data(type) #特徴別に、バリア効果を確認 feature_objects.inject(0) {|r,f| v = f.barrier_rate[type] r += v ? v : 0} end #-------------------------------------------------------------------------- # 対バリア特徴 #-------------------------------------------------------------------------- def abr_data(type) #特徴別に、対バリア効果を確認 feature_objects.inject(0) {|r,f| v = f.anti_barrier_rate[type] r += v ? v : 0} end #-------------------------------------------------------------------------- # 最終的なバリア値を計算する #-------------------------------------------------------------------------- def br_eval(user, item) #とりあえず初期値を設定。 main_data = 1.0 #バリア形式用配列を作成。 type_data = [] #バリア形式にアイテム/スキルに設定された形式を入れる。 type_data += item.br_type #武器属性依存スキルの場合は属性別に属性依存形式を入れ #そうでない場合は、スキル属性の属性依存形式を入れる。 if item.damage.element_id == -1 user.atk_elements.each do |elem| v = BR_ABR_SYSTEM::ELEM2[elem] type_data += v.clone if v end else v = BR_ABR_SYSTEM::ELEM2[item.damage.element_id] type_data += v if v end #バリア形式が何もない場合は処理を飛ばす。 return main_data if type_data.empty? #形式の被りを排除する。 type_data.uniq! #形式別に処理を行う。 type_data.each do |bt| #対象者のバリア値を計算。 data1 = self.br_data(bt).to_f / 100 #使用者の対バリア値が有効となるスキルで #なおかつ使用者の対バリア値が0ではない時 #使用者の対バリア値を計算。 data2 = item.ab_enable? && user.abr_data(bt) != 0 ? user.abr_data(bt).to_f / 100 : 0 #アイテム/スキルの対バリア値を計算。 data3 = item.item_abr_data[bt] ? item.item_abr_data[bt].to_f / 100 : 0 #全ての情報を元に、この形式でのダメージ補正を計算。 data = data1 * (1.0 - data2 - data3) #補正が無効な値でない場合は処理を飛ばす。 next if data <= 0 #補正を行う。 main_data *= (1.0 - data) end #最終的な補正値を0.0〜1.0の間になるように調整する。 return [[main_data, 0.0].max, 1.0].min end end class RPG::BaseItem #-------------------------------------------------------------------------- # バリア特徴 #-------------------------------------------------------------------------- def barrier_rate #キャッシュがある場合はキャッシュを返す。 @barrier_rate ||= create_barrier_rate end #-------------------------------------------------------------------------- # バリア特徴データ作成 #-------------------------------------------------------------------------- def create_barrier_rate #ハッシュを作成 h = {} #メモ欄からデータを取得。 self.note.each_line do |l| #データを取得出来無かった場合は無視する。 if /<#{BR_ABR_SYSTEM::WORD1}[::](\S+),(\d+)>/ =~ l k = $1.to_s h[k] ||= 0 h[k] += $2.to_i end end h end #-------------------------------------------------------------------------- # 対バリア特徴 #-------------------------------------------------------------------------- def anti_barrier_rate #キャッシュがある場合はキャッシュを返す。 @anti_barrier_rate ||= create_anti_barrier_rate end #-------------------------------------------------------------------------- # 対バリア特徴データ作成 #-------------------------------------------------------------------------- def create_anti_barrier_rate #ハッシュを作成 h = {} #メモ欄からデータを取得。 self.note.each_line do |l| #データを取得出来無かった場合は0無視する。 if /<#{BR_ABR_SYSTEM::WORD2}[::](\S+),(\d+)>/ =~ l k = $1.to_s h[k] ||= 0 h[k] += $2.to_i end end #データを返す。 h end end class RPG::UsableItem < RPG::BaseItem #-------------------------------------------------------------------------- # 対バリア可否 #-------------------------------------------------------------------------- def ab_enable? #キャッシュがある場合はキャッシュを返す。 (@ab_enable ||= /<#{BR_ABR_SYSTEM::WORD3}>/ =~ note ? 1 : 0) == 1 end #-------------------------------------------------------------------------- # 対バリア #-------------------------------------------------------------------------- def item_abr_data #キャッシュがある場合はキャッシュを返す。 @item_abr_data ||= create_item_abr_data end #-------------------------------------------------------------------------- # 対バリアデータ作成 #-------------------------------------------------------------------------- def create_item_abr_data #ハッシュを作成 h = {} #メモ欄からデータを取得。 self.note.each_line do |l| #データを取得出来無かった場合は0無視する。 if /<#{BR_ABR_SYSTEM::WORD4}[::](\S+),(\d+)>/ =~ l k = $1.to_s h[k] ||= 0 h[k] += $2.to_i end end #データを返す。 h end #-------------------------------------------------------------------------- # 対バリア系列 #-------------------------------------------------------------------------- def br_type #キャッシュがある場合はキャッシュを返す。 @br_type ||= /<#{BR_ABR_SYSTEM::WORD5}[::](\S+)>/ =~ note ? $1.to_s.split(/\s*,\s*/) : [] end end class RPG::UsableItem::Damage #-------------------------------------------------------------------------- # ダメージ算出 #-------------------------------------------------------------------------- unless method_defined?(:eval_barrier) alias eval_barrier eval def eval(a, b, v) #本来の処理で求められる値を取得。 data = eval_barrier(a, b, v) #一時情報に保存されたアイテム/スキル情報から #バリアによるダメージ補正値を計算し、ダメージに掛ける。 #ただし、バリア無効属性の影響を受けない場合に限る。 data *= b.br_eval(a, $game_temp.last_damage_item) if barrier_judge(a) #ダメージを返す。 return data end end #-------------------------------------------------------------------------- # バリア無効属性判定 #-------------------------------------------------------------------------- def barrier_judge(a) #ダメージ属性がバリア無効属性である場合は無効。 return false if BR_ABR_SYSTEM::ELEM1.include?(@element_id) #武器依存ダメージであり、武器がバリア無効属性である場合は無効。 return false if abr_element_weapon?(a) return true end #-------------------------------------------------------------------------- # 使用者の武器属性にバリア無効属性が入っているか否か #-------------------------------------------------------------------------- def abr_element_weapon?(battler) #武器依存ダメージ出ない場合は無効。 return false if @element_id != -1 #武器属性にバリア無効属性が存在する場合は有効。 battler.atk_elements.each do |elem| return true if BR_ABR_SYSTEM::ELEM1.include?(elem) end return false end end