=begin
# CalcBattler
# バトラーAとバトラーBs(複数)との各種比較を行うモジュール
{~~~ code=CB***}
の***にメソッドを放り込むことによって
・メソッドリスト
・とりあえず全てHPとして記載
・引数--(val)とかいうやつ--は全て省略可能
・valが省略された場合は0 (加算補正用)
・nが省略された場合100 (確率用)
・symbolが省略された場合はnil 実質最後に
symbolは
:small ターゲット群のhpの仲で最も小さい値
:large ターゲット群のhpの中で最も大きい値
:flat ターゲット群のhpの平均
の三種から指定してください。コロン必須。
いずれでもない場合
最後にターゲットに追加されたバトラーが比較対象
ターゲットが単体の場合はsymbolは無視
# 以下6種のhpはmp/atk/def/agi/spi に変更できます
# アクティブバトラーのhpがvalより少ないか大きければ真
hp_small?(val)
hp_large?(val)
# (hp + val ) / n の確率で真
# valの扱いがさっきと違うので注意
hp_prob?(val ,n)
# アクティブバトラーとターゲットバトラーズを比較
# 同じくvalの扱いが異なるので注意
at_hp_large?(val , symbol)
at_hp_small?(val , symbol)
at_hp_prob?(val , n , symbol)
# 以下hp/mpのみ
# hp/maxhpの比がvalより大きいか小さいか
hp_ratio_sall?(val)
hp_ratio_large?(val)
# 以下はhp_damage/mp_damageのみ
t_hp_damage_small?(val,symbol)
t_hp_damage_large?(val,symbol)
完成形は大体こんな感じ
{type=0 target=0 eval=CB::at_agi_prob?(20,100,:flat)}
全体攻撃スキルに入れたケース
スキル使用後に
{(スキル使用者のagi + 20) - ( 全エネミーのagiの平均 ) }%の確率で
敵をもう一体適当にぶん殴る。
CB::ってのを忘れないでください。
=end
$imported ||= {}
$imported["lud_module_CB"] = true
module CB
DEBUG_RECT = Rect.new(0,24,544,24)
# セッター群
# アクティブバトラーのセッター
def set_active_battler(battler)
@active = battler
end
module_function:set_active_battler
# ターゲットのセッター
def set_target_battler(battler)
@targets ||= []
@targets << battler
debug
end
module_function:set_target_battler
# active_target双方を纏めてセット
def set_all(a ,b)
@active = a
if b.is_a?(Array)
@targets = b
elsif b.is_a?(Game_Battler)
@targets = [b]
end
end
module_function:set_all
# ゲッター群
# アクティブバトラーを返す
# get_active_battler
def gab
return @active
end
module_function:gab
# ターゲットの配列を返す
# get_target_battlers
def gtbs
return @targets
end
module_function:gtbs
# ターゲット単体を返す
# get_a_target_battler
def gatb
return @targets[0]
end
module_function:gatb
# ターゲットバトラーをクリア
def target_battler_clear
@targets = []
end
module_function:target_battler_clear
# デバグモード。
# 色々表示なさいます
# 通常は意味有りません
def self.debug
return unless $TEST
return unless $test_sprite
str = ""
([@active] + @targets).each{|battler|
str += " " + battler.name if battler}
$test_sprite.bitmap.clear_rect(DEBUG_RECT)
$test_sprite.bitmap.draw_text(DEBUG_RECT,str,2)
p 1 if Input.press?(Input::B)
end
str = '
# ステータスとvalの比較
# 対象ステータスがval以下の場合true
def %s_small?(val = 0)
return @active.%s <= val
end
module_function:%s_small?
# ステータスとvalの比較
# 対象ステータスがval以上の場合発生
def %s_large?(val = 0)
return @active.%s >= val
end
module_function:%s_large?
# (ステータス + 値)%として判定
# val :加算減算する値
# n :rand(n)に代入される値
def %s_prob?(val = 0 , n = 100)
return rand(n) < (@active.%s + val)
end
module_function:%s_prob?
#======================================================
# at群
# activeとtargetsを比較しての反応
# actve ,target の %s比較
# Valはactiveに対して加算する(-nで減算)
# 大きいか
def at_%s_large?(val = 0 , symbol = nil)
if @targets.size == 1
return @active.%s + val >= @targets[0].agi
else
return @active.%s + val >= get_targets_agi(symbol)
end
end
module_function:at_%s_large?
# 小さいか
def at_%s_small?(val = 0 , symbol = nil)
if @targets.size == 1
return @active.%s + val <= @targets[0].%s
else
return @active.%s + val <= get_targets_%s(symbol)
end
end
module_function:at_%s_small?
# (a.%s + val - b.%s) / n の確率でtrueを返す
# 例:(自分のAGI-敵のAGI)%⇒イザーク王国のりゅうせいけーん!!みたいな。
# 注意!流星剣は技依存です
def at_%s_prob?(val = 0, n = 100 ,symbol = nil)
if @targets.size == 1
return rand(n) < (@active.%s + val - @targets[0].%s )
else
return rand(n) < (@active.%s + val - get_targets_%s(symbol) )
end
end
module_function:at_%s_prob?
'
tg = '
# 現在のtargetsのステータス値%sを比較して
# 最も大きいor最も小さいステータス値%sを返す
# Integerを返す(筈)
def get_targets_%s(symbol)
case symbol
when :large
arr = []
@targets.each{|target|
arr << target.%s if target.%s.is_a?(Numeric)}
return 0 if arr.empty?
return arr.max
when :small
arr = []
@targets.each{|target|
arr << target.%s if target.%s.is_a?(Numeric)}
return 0 if arr.empty?
return arr.min
when :flat
n = 0
for target in @targets
n += target.%s if target.%s.is_a?(Numeric)
end
return n.to_f / @targets.size
else
return targets[-1].%s
end
end
module_function:get_targets_%s
# 現在のtargetsのステータス値%sを比較して
# 最も大きい、あるいは最も小さい奴の
# Game_Actor or Game_Enemyのインスタンスを返す
def get_target_by_%s(symbol)
case symbol
when :large
arr = []
return @targets.sort{|a , b| b.%s <=> a.%s}[0]
when :small
arr = []
return @targets.sort{|b , a| b.agi <=> a.agi}[0]
else
return targets[-1].agi
end
end
module_function:get_target_by_%s
'
# %sを順番にステータス名に変更した後、片っ端から実行して定義
for sta in ["hp" , "mp" , "atk" , "def" , "agi" , "spi" , "dex" , "mgk"]
eval( (str + tg).gsub("%s"){sta})
end
# hp/mhp比 or mp/mhp比とvalで比較
str = '
def self.%s_ratio_small?(val)
return (( @active.%s / @active.max%s.to_f ) * 100 ) <= val
end
def self.%s_ratio_large?(val)
return (( @active.%s / @active.max%s.to_f ) * 100 ) >= val
end
'
# %sを順番にステータス名に変更した後、片っ端から実行して定義
for sta in ["hp" , "mp"]
eval(str.gsub("%s"){sta})
end
str = "
# 戦闘中のターゲット専用
# 与えたダメージ、あるいは与えたmpダメージとval比較
def t_%s_small?(val = 0 ,symbol = :flat)
if @targets.size == 1
return @targets[0].%s <= val
else
return get_targets_%s(symbol) <= val
end
end
module_function:t_%s_small?
def t_%s_large?(val = 0,symbol = :flat)
if @targets.size == 1
return @targets[0].%s >= val
else
return get_targets_%s(symbol) >= val
end
end
module_function:t_%s_large?
"
# %sを順番にステータス名に変更した後、片っ端から実行して定義
for sta in ["hp_damage" , "mp_damage"]
eval( (str + tg).gsub("%s"){sta})
end
end