=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