require "./AI/USER_AI/mobdata.lua" ---------------------------------------------------------------------------------------------------- -- -- 戦闘計算機 -- -- BattleCalc.lua -- -- Date Version Author Memo -- ---------- ------- ------------------------- ----------------------------------------------- -- 2006/04/01 1.0 食べるとレアが出るゼリー@sara 1stリリース -- 2006/04/06 1.1 食べるとレアが出るゼリー@sara 通常ダメ、魔法ダメ、回避率を追加 -- 2006/04/07 1.2 食べるとレアが出るゼリー@sara カプリス、ムーンライトでのダメージ取得を追加 -- 2006/04/08 1.3 食べるとレアが出るゼリー@sara 回避率の計算が誤っていたバグを修正 -- -- Update Plan -- ----------------------------------------------------------------------------------------------- -- ディフェンス、フリートムーブ、オーバードスピードの補正が効くようにする -- 治癒の手助け、カオティックベネディクションの回復量取得 -- --------------------------------------------------------------------------------------------------- -- -- 機能説明 -- 戦闘関連の計算を行います。 -- 計算結果をAIで好きなように使用して下さい。 -- -- GetHit -- ホムのモンスターに対する命中率(最大0.95)を取得します。 -- -- GetFlee -- ホムのモンスターに対する回避率(最大0.95)を取得します。 -- -- GetBattleTime -- ホムが対象モンスターを殲滅に掛かる時間を取得します。 -- -- GetAttackDamage -- ホムが対象モンスターに通常攻撃で与えられるダメージを取得します。 -- -- GetMattackDamage -- ホムが対象モンスターに魔法攻撃で与えられるダメージを取得します。 -- (注意:属性は考慮に入っていませんので、あしからず) -- -- GetTotalDamage -- ホムが対象モンスターを殲滅する間に受けるダメージの総量を取得します。 -- 戦闘後の残HPが何割以上だったら攻撃開始するなどの条件にお使い下さい。 -- 例)戦闘後のHP残量が25%以上だったら -- (GetV(V_HP, MyID) - GetTotalDamage(v)) / GetV(V_MAXHP, MyID) * 100 > 25 -- -- GetCapriceDamage -- 第二パラメータで指定したレベルのカプリスで与えるダメージ取得 -- レベルが指定されない場合、レベル1使用時のダメージ取得 -- -- GetMoonlightDamage -- 第二パラメータで指定したレベルのムーンライトで与えるダメージ取得 -- レベルが指定されない場合、レベル1使用時のダメージ取得 -- -- DebugBattleCalc -- 既に計算済みの情報を一覧で出力します。 -- 計算結果の確認にお使い下さい。 -- -------------------------------------------------- -- constants # 定数 # -------------------------------------------------- V_CAL_NAME = 1 -- モンスター名 V_CAL_HIT = 2 -- 命中率 V_CAL_FLEE = 3 -- 回避率 V_CAL_DAMAGE = 4 -- 通常攻撃によるダメージ V_CAL_MDAMAGE = 5 -- 魔法攻撃によるダメージ(属性は考慮なし) V_CAL_TIME = 6 -- 殲滅時間 V_CAL_TOTAL = 7 -- 被ダメ総量 V_MOONLIGHT = {} -- ムーンライトダメージ倍率 V_MOONLIGHT[1] = 2.2 V_MOONLIGHT[2] = 3.3 V_MOONLIGHT[3] = 4.4 V_MOONLIGHT[4] = 5.5 V_MOONLIGHT[5] = 6.6 -------------------------------------------------- -- ホムの能力(各自のホムに合わせて書き換えて下さい) -------------------------------------------------- V_ATK = 100 -- ATK V_MATK = 106 -- MATK V_HIT = 70 -- HIT V_FLEE = 58 -- FLEE V_DEF = 46 -- DEF V_ASPD = 141 -- ASPD do -------------------------------------------------- -- variable # 変数 # -------------------------------------------------- result = {} -- 計算結果格納テーブル ------------------------------------------- -- 命中率取得 ------------------------------------------- function GetHit(v) return GetResult(v, V_CAL_HIT) end ------------------------------------------- -- 回避率取得 ------------------------------------------- function GetFlee(v) return GetResult(v, V_CAL_FLEE) end ------------------------------------------- -- 殲滅取得 ------------------------------------------- function GetBattleTime(v) return GetResult(v, V_CAL_TIME) end ------------------------------------------- -- 通常ダメ取得 ------------------------------------------- function GetAttackDamage(v) return GetResult(v, V_CAL_DAMAGE) end ------------------------------------------- -- 魔法ダメ取得 ------------------------------------------- function GetMattackDamage(v) return GetResult(v, V_CAL_MDAMAGE) end ------------------------------------------- -- 被ダメ総量取得 ------------------------------------------- function GetTotalDamage(v) return GetResult(v, V_CAL_TOTAL) end ------------------------------------------- -- カプリスダメ取得 ------------------------------------------- function GetCapriceDamage(v, level) if level == nil then level = 5 end return GetResult(v, V_CAL_MDAMAGE) * level end ------------------------------------------- -- ムーンライトダメ取得 ------------------------------------------- function GetMoonlightDamage(v, level) if level == nil then level = 5 end return GetResult(v, V_CAL_MDAMAGE) * V_MOONLIGHT[level] end ------------------------------------------- -- デバッグ ------------------------------------------- function DebugBattleCalc() for k, v in pairs(result) do TraceAI(string.format("モンスター名 : %q",result[k][V_CAL_NAME] )) TraceAI(string.format("命中率 : %f",result[k][V_CAL_HIT] )) TraceAI(string.format("回避率 : %f",result[k][V_CAL_FLEE] )) TraceAI(string.format("通常ダメ : %f",result[k][V_CAL_DAMAGE] )) TraceAI(string.format("魔法ダメ : %f",result[k][V_CAL_MDAMAGE])) TraceAI(string.format("殲滅時間 : %f",result[k][V_CAL_TIME] )) TraceAI(string.format("被ダメ総量 : %f",result[k][V_CAL_TOTAL] )) end end ------------------------------------------- -- 計算 ------------------------------------------- function calculate(id) -- モンスターデータ取得 local mob = GetV(V_HOMUNTYPE, id) local name = MOBDATA[mob][M_V_NAME] local mobhp = MOBDATA[mob][M_V_MAXHP] local mobatk = (MOBDATA[mob][M_V_ATKMIN] + MOBDATA[mob][M_V_ATKMAX]) / 2 local mobhit = MOBDATA[mob][M_V_HIT] local mobflee = MOBDATA[mob][M_V_FLEE] local mobaspd = MOBDATA[mob][M_V_ASPD] local mobdefsub = MOBDATA[mob][M_V_DEFSUB] local mobdefdiv = MOBDATA[mob][M_V_DEFDIV] local mobmdefsub = MOBDATA[mob][M_V_MDEFSUB] local mobmdefdiv = MOBDATA[mob][M_V_MDEFDIV] -- 与ダメ local dmghom = CalDamage(V_ATK, mobdefsub, mobdefdiv) local dmgmob = CalDamage(mobatk, V_DEF, 0) -- 魔法与ダメ local mdmghom = CalDamage(V_MATK, mobmdefsub, mobmdefdiv) -- 秒間攻撃回数 local apshom = CalAtkPerSec(V_ASPD) local apsmob = CalAtkPerSec(mobaspd) -- 命中率 local hithom = CalHitMob(V_HIT, mobhit) local hitmob = CalHitHom(V_FLEE, mobflee) -- 殲滅時間 local sec = mobhp / (dmghom * hithom * apshom) -- 被ダメ local hidmg = sec * dmgmob * apsmob * (1 - hitmob) -- 計算結果を保存 result[mob] = {name, hithom, hitmob, dmghom, mdmghom, sec, hidmg} end ------------------------------------------- -- 結果取得 ------------------------------------------- function GetResult(id, key) local mob = GetV(V_HOMUNTYPE, id) if result[mob] == nil then calculate(id) end return result[mob][key] end ------------------------------------------- -- 与ダメ計算 ------------------------------------------- function CalDamage(atk -- 自ATK ,defsub -- 敵減算DEF ,defdiv) -- 敵乗算DEF local dmg = atk * (100 - defdiv) / 100 - defsub if dmg <= 0 then dmg = 1 end return dmg end ------------------------------------------- -- 命中率計算(対MOB) ------------------------------------------- function CalHitMob(hit -- 自HIT ,needhit) -- 必中HIT local tmphit = needhit - hit if (tmphit <= 5) then tmphit = 5 end return (100 - tmphit) / 100 end ------------------------------------------- -- 命中率計算(対ホム) ------------------------------------------- function CalHitHom(flee -- 自FLEE ,needflee) -- 要FLEE local tmpflee = needflee - flee if tmpflee >= 90 then tmpflee = 90 elseif tmpflee <= 0 then tmpflee = 0 end return 0.95 - tmpflee / 100 end ------------------------------------------- -- 秒間攻撃回数 ------------------------------------------- function CalAtkPerSec(aspd) -- 自ASPD return 50 / (200 - aspd) end end