module ElRate
# 複数属性時の計算方法
# 0 : 絶対値最大 : +/-の内、大きな値を採用(default同様)
# 1 : 相対値最大 : 100%基準からの差が一番大きな値を採用
# 2 : 乗算最大 : +/-の属性をそれぞれ乗算して、大きな方を採用
# 3 : 平均値 : 各属性の平均
CALC = 3
end
class RPG::BaseItem
#-------------------------------------------------------------------------
# ● 吸収属性
#-------------------------------------------------------------------------
def absorb(element_id)
result = @note.scan(/@absorb\[(\d+),(.*?+)\]/)
return 0.0 if result.nil? or result.empty?
result.scan do |n|
return (n[1].to_i/100.00) if n[0].to_i == element_id
end
return 0.0
end
end
class Game_BattlerBase
#--------------------------------------------------------------------------
# ● 属性有効度の取得
#--------------------------------------------------------------------------
alias element_rate_absorb element_rate
def element_rate(element_id)
n = element_rate_absorb(element_id)
feature_objects.each { |obj| n += obj.absorb(element_id) }
return n
end
end
class Game_Battler < Game_BattlerBase
#--------------------------------------------------------------------------
# ● 属性の最大修正値の取得 [再定義]
# elements : 属性 ID の配列
#--------------------------------------------------------------------------
def elements_max_rate(elements)
return 1.0 if elements.empty?
n = elements.inject([]) {|r, i| r.push(element_rate(i)) }
case ElRate::CALC
when 0 # 絶対値最大
max = n.select {|r| r > 0.0}.max
min = n.select {|r| r < 0.0}.min
max = 0.0 if max.nil?
min = 0.0 if min.nil?
return 0.0 if max == min.abs
return max >= min.abs ? max : min
when 1 # 相対値最大
max = n.select {|r| r > 1.0}.max
min = n.select {|r| r < 1.0}.min
max = 1.0 if max.nil?
min = 1.0 if min.nil?
return 0.0 if max == (min - 1.0).abs
return max > (min - 1.0).abs ? max : min
when 2 # 乗算最大
max = n.select {|r| r > 0.0}.inject(1.0) {|r, i| r *= i}
min = n.select {|r| r < 0.0}.inject(1.0) {|r, i| r *= i.abs}
return 0.0 if max == min
return max > min ? max : (-min)
when 3 # 平均
return n.inject(0.0) {|r, i| r += i} / n.size
end
end
end