Formula
CommonFun.calcUserAttrValue
function CommonFun.calcUserAttrValue(attr, lv, profession, type, map)
local result = {}
local extra = {}
if profession == 0 then
return result, extra
end
if 0 > attr[CommonFun.RoleData.EATTRTYPE_DEX] then
attr[CommonFun.RoleData.EATTRTYPE_DEX] = 0
result[CommonFun.RoleData.EATTRTYPE_DEX] = 0
end
if 0 > attr[CommonFun.RoleData.EATTRTYPE_STR] then
attr[CommonFun.RoleData.EATTRTYPE_STR] = 0
result[CommonFun.RoleData.EATTRTYPE_STR] = 0
end
if 0 > attr[CommonFun.RoleData.EATTRTYPE_VIT] then
attr[CommonFun.RoleData.EATTRTYPE_VIT] = 0
result[CommonFun.RoleData.EATTRTYPE_VIT] = 0
end
if 0 > attr[CommonFun.RoleData.EATTRTYPE_INT] then
attr[CommonFun.RoleData.EATTRTYPE_INT] = 0
result[CommonFun.RoleData.EATTRTYPE_INT] = 0
end
if 0 > attr[CommonFun.RoleData.EATTRTYPE_AGI] then
attr[CommonFun.RoleData.EATTRTYPE_AGI] = 0
result[CommonFun.RoleData.EATTRTYPE_AGI] = 0
end
if 0 > attr[CommonFun.RoleData.EATTRTYPE_LUK] then
attr[CommonFun.RoleData.EATTRTYPE_LUK] = 0
result[CommonFun.RoleData.EATTRTYPE_LUK] = 0
end
if CommonFun.checkRemoteAtk(profession, type) then
extra[CommonFun.RoleData.EATTRTYPE_ATK] = attr[CommonFun.RoleData.EATTRTYPE_DEX] * 2 + math.floor(attr[CommonFun.RoleData.EATTRTYPE_DEX] * attr[CommonFun.RoleData.EATTRTYPE_DEX] / 100) + math.floor(attr[CommonFun.RoleData.EATTRTYPE_STR] / 5) + math.floor(attr[CommonFun.RoleData.EATTRTYPE_LUK] / 5) + BaseLvAtkRate1[profession] * lv
else
extra[CommonFun.RoleData.EATTRTYPE_ATK] = attr[CommonFun.RoleData.EATTRTYPE_STR] * 2 + math.floor(attr[CommonFun.RoleData.EATTRTYPE_STR] * attr[CommonFun.RoleData.EATTRTYPE_STR] / 100) + math.floor(attr[CommonFun.RoleData.EATTRTYPE_DEX] / 5) + math.floor(attr[CommonFun.RoleData.EATTRTYPE_LUK] / 5) + BaseLvAtkRate1[profession] * lv
end
extra[CommonFun.RoleData.EATTRTYPE_DEF] = attr[CommonFun.RoleData.EATTRTYPE_VIT]
extra[CommonFun.RoleData.EATTRTYPE_MATK] = attr[CommonFun.RoleData.EATTRTYPE_INT] * 2 + math.floor(attr[CommonFun.RoleData.EATTRTYPE_INT] * attr[CommonFun.RoleData.EATTRTYPE_INT] / 100)
extra[CommonFun.RoleData.EATTRTYPE_MDEF] = attr[CommonFun.RoleData.EATTRTYPE_INT]
extra[CommonFun.RoleData.EATTRTYPE_MAXHP] = (100 + lv * BaseLvRate[profession] + CommonFun.CalcSum(lv) * HpRate[profession] + BaseHp[profession]) * (1 + attr[CommonFun.RoleData.EATTRTYPE_VIT] / 100)
extra[CommonFun.RoleData.EATTRTYPE_MAXSP] = (20 + lv * GameConfig.NewRole.recover[profession].sp) * (1 + attr[CommonFun.RoleData.EATTRTYPE_INT] / 100)
extra[CommonFun.RoleData.EATTRTYPE_HIT] = lv + attr[CommonFun.RoleData.EATTRTYPE_DEX]
extra[CommonFun.RoleData.EATTRTYPE_FLEE] = lv + attr[CommonFun.RoleData.EATTRTYPE_AGI]
extra[CommonFun.RoleData.EATTRTYPE_CRI] = 1 + math.floor(attr[CommonFun.RoleData.EATTRTYPE_LUK] / 3)
extra[CommonFun.RoleData.EATTRTYPE_CRIRES] = 1 + math.floor(attr[CommonFun.RoleData.EATTRTYPE_LUK] / 5)
extra[CommonFun.RoleData.EATTRTYPE_CRIDAMPER] = 0
extra[CommonFun.RoleData.EATTRTYPE_CRIDEFPER] = 0
extra[CommonFun.RoleData.EATTRTYPE_MOVESPD] = 1
extra[CommonFun.RoleData.EATTRTYPE_CASTSPD] = attr[CommonFun.RoleData.EATTRTYPE_DEX] / 30
extra[CommonFun.RoleData.EATTRTYPE_ATKPER] = 0
extra[CommonFun.RoleData.EATTRTYPE_DEFPER] = 0
extra[CommonFun.RoleData.EATTRTYPE_MATKPER] = 0
extra[CommonFun.RoleData.EATTRTYPE_MDEFPER] = 0
extra[CommonFun.RoleData.EATTRTYPE_MAXHPPER] = 0
extra[CommonFun.RoleData.EATTRTYPE_MAXSPPER] = 0
extra[CommonFun.RoleData.EATTRTYPE_REFINE] = 0
extra[CommonFun.RoleData.EATTRTYPE_MREFINE] = 0
extra[CommonFun.RoleData.EATTRTYPE_RESTORESPD] = math.floor(attr[CommonFun.RoleData.EATTRTYPE_VIT] / 5)
extra[CommonFun.RoleData.EATTRTYPE_SPRESTORESPD] = 1 + math.floor(attr[CommonFun.RoleData.EATTRTYPE_INT] / 6)
extra[CommonFun.RoleData.EATTRTYPE_EQUIPASPD] = 0
extra[CommonFun.RoleData.EATTRTYPE_SKILLASPD] = 0
result[CommonFun.RoleData.EATTRTYPE_EQUIPASPD] = extra[CommonFun.RoleData.EATTRTYPE_EQUIPASPD] + attr[CommonFun.RoleData.EATTRTYPE_EQUIPASPD]
result[CommonFun.RoleData.EATTRTYPE_SKILLASPD] = extra[CommonFun.RoleData.EATTRTYPE_SKILLASPD] + attr[CommonFun.RoleData.EATTRTYPE_SKILLASPD]
local ASPD_CHCEKVALUE = 0
if attr[CommonFun.RoleData.EATTRTYPE_AGI] < 205 then
ASPD_CHCEKVALUE = math.floor((math.sqrt(205) - math.sqrt(attr[CommonFun.RoleData.EATTRTYPE_AGI])) * 1000 / 7.15) / 1000
else
ASPD_CHCEKVALUE = 0
end
local BaseJobASPD = BaseJobAtkSpd[profession] + CommonFun.WeaponAtkSpd(type, profession)
local ASPD_PANISHVALUE = 0
if 145 < BaseJobASPD then
ASPD_PANISHVALUE = 1 - (BaseJobASPD - 144) / 50
else
ASPD_PANISHVALUE = 0.96
end
extra[CommonFun.RoleData.EATTRTYPE_ATKSPD] = math.floor((200 - (200 - (BaseJobASPD - ASPD_CHCEKVALUE + math.sqrt(attr[CommonFun.RoleData.EATTRTYPE_AGI] * 9.999) * ASPD_PANISHVALUE)) * (1 - result[CommonFun.RoleData.EATTRTYPE_SKILLASPD])) * 1000) / 1000
local EquipASPD = math.floor((195 - extra[CommonFun.RoleData.EATTRTYPE_ATKSPD]) * result[CommonFun.RoleData.EATTRTYPE_EQUIPASPD] * 100) / 100
local BaseASPD = extra[CommonFun.RoleData.EATTRTYPE_ATKSPD] + EquipASPD
if 189.58333333333334 <= BaseASPD then
BaseASPD = 189.58333333333334
end
if BaseASPD <= 50 then
BaseASPD = 50
end
result[CommonFun.RoleData.EATTRTYPE_ATKSPD] = 50 / (200 - BaseASPD)
if 0 >= result[CommonFun.RoleData.EATTRTYPE_ATKSPD] then
result[CommonFun.RoleData.EATTRTYPE_ATKSPD] = 0
end
result[CommonFun.RoleData.EATTRTYPE_ATK] = extra[CommonFun.RoleData.EATTRTYPE_ATK] + attr[CommonFun.RoleData.EATTRTYPE_ATK]
if 0 >= result[CommonFun.RoleData.EATTRTYPE_ATK] then
result[CommonFun.RoleData.EATTRTYPE_ATK] = 0
end
result[CommonFun.RoleData.EATTRTYPE_MATK] = extra[CommonFun.RoleData.EATTRTYPE_MATK] + attr[CommonFun.RoleData.EATTRTYPE_MATK]
if 0 >= result[CommonFun.RoleData.EATTRTYPE_MATK] then
result[CommonFun.RoleData.EATTRTYPE_MATK] = 0
end
result[CommonFun.RoleData.EATTRTYPE_DEF] = extra[CommonFun.RoleData.EATTRTYPE_DEF] + attr[CommonFun.RoleData.EATTRTYPE_DEF]
if 0 >= result[CommonFun.RoleData.EATTRTYPE_DEF] then
result[CommonFun.RoleData.EATTRTYPE_DEF] = 0
end
result[CommonFun.RoleData.EATTRTYPE_MDEF] = extra[CommonFun.RoleData.EATTRTYPE_MDEF] + attr[CommonFun.RoleData.EATTRTYPE_MDEF]
if 0 >= result[CommonFun.RoleData.EATTRTYPE_MDEF] then
result[CommonFun.RoleData.EATTRTYPE_MDEF] = 0
end
result[CommonFun.RoleData.EATTRTYPE_HIT] = (extra[CommonFun.RoleData.EATTRTYPE_HIT] + attr[CommonFun.RoleData.EATTRTYPE_HIT]) * (1 + attr[CommonFun.RoleData.EATTRTYPE_HITPER])
if 0 >= result[CommonFun.RoleData.EATTRTYPE_HIT] then
result[CommonFun.RoleData.EATTRTYPE_HIT] = 0
end
result[CommonFun.RoleData.EATTRTYPE_FLEE] = (extra[CommonFun.RoleData.EATTRTYPE_FLEE] + attr[CommonFun.RoleData.EATTRTYPE_FLEE]) * (1 + attr[CommonFun.RoleData.EATTRTYPE_FLEEPER])
if 0 >= result[CommonFun.RoleData.EATTRTYPE_FLEE] then
result[CommonFun.RoleData.EATTRTYPE_FLEE] = 0
end
result[CommonFun.RoleData.EATTRTYPE_CRIPER] = attr[CommonFun.RoleData.EATTRTYPE_CRIPER]
if 0 >= result[CommonFun.RoleData.EATTRTYPE_CRIPER] then
result[CommonFun.RoleData.EATTRTYPE_CRIPER] = 0
end
result[CommonFun.RoleData.EATTRTYPE_CRI] = (extra[CommonFun.RoleData.EATTRTYPE_CRI] + attr[CommonFun.RoleData.EATTRTYPE_CRI]) * (1 + attr[CommonFun.RoleData.EATTRTYPE_CRIPER])
if 0 >= result[CommonFun.RoleData.EATTRTYPE_CRI] then
result[CommonFun.RoleData.EATTRTYPE_CRI] = 0
end
result[CommonFun.RoleData.EATTRTYPE_CRIRES] = extra[CommonFun.RoleData.EATTRTYPE_CRIRES] + attr[CommonFun.RoleData.EATTRTYPE_CRIRES]
if 0 >= result[CommonFun.RoleData.EATTRTYPE_CRIRES] then
result[CommonFun.RoleData.EATTRTYPE_CRIRES] = 0
end
result[CommonFun.RoleData.EATTRTYPE_CRIDAMPER] = extra[CommonFun.RoleData.EATTRTYPE_CRIDAMPER] + attr[CommonFun.RoleData.EATTRTYPE_CRIDAMPER]
if 0 >= result[CommonFun.RoleData.EATTRTYPE_CRIDAMPER] then
result[CommonFun.RoleData.EATTRTYPE_CRIDAMPER] = 0
end
result[CommonFun.RoleData.EATTRTYPE_CRIDEFPER] = extra[CommonFun.RoleData.EATTRTYPE_CRIDEFPER] + attr[CommonFun.RoleData.EATTRTYPE_CRIDEFPER]
if 0 >= result[CommonFun.RoleData.EATTRTYPE_CRIDEFPER] then
result[CommonFun.RoleData.EATTRTYPE_CRIDEFPER] = 0
end
result[CommonFun.RoleData.EATTRTYPE_MOVESPD] = (extra[CommonFun.RoleData.EATTRTYPE_MOVESPD] + attr[CommonFun.RoleData.EATTRTYPE_MOVESPD]) * (1 + attr[CommonFun.RoleData.EATTRTYPE_MOVESPDPER])
if 0 >= result[CommonFun.RoleData.EATTRTYPE_MOVESPD] then
result[CommonFun.RoleData.EATTRTYPE_MOVESPD] = 0
end
result[CommonFun.RoleData.EATTRTYPE_CASTSPD] = extra[CommonFun.RoleData.EATTRTYPE_CASTSPD] + attr[CommonFun.RoleData.EATTRTYPE_CASTSPD]
if 0 >= result[CommonFun.RoleData.EATTRTYPE_CASTSPD] then
result[CommonFun.RoleData.EATTRTYPE_CASTSPD] = 0
end
result[CommonFun.RoleData.EATTRTYPE_ATKPER] = extra[CommonFun.RoleData.EATTRTYPE_ATKPER] + attr[CommonFun.RoleData.EATTRTYPE_ATKPER]
if result[CommonFun.RoleData.EATTRTYPE_ATKPER] <= -1 then
result[CommonFun.RoleData.EATTRTYPE_ATKPER] = -1
end
result[CommonFun.RoleData.EATTRTYPE_DEFPER] = extra[CommonFun.RoleData.EATTRTYPE_DEFPER] + attr[CommonFun.RoleData.EATTRTYPE_DEFPER]
if result[CommonFun.RoleData.EATTRTYPE_DEFPER] <= -1 then
result[CommonFun.RoleData.EATTRTYPE_DEFPER] = -1
end
result[CommonFun.RoleData.EATTRTYPE_MATKPER] = extra[CommonFun.RoleData.EATTRTYPE_MATKPER] + attr[CommonFun.RoleData.EATTRTYPE_MATKPER]
if result[CommonFun.RoleData.EATTRTYPE_MATKPER] <= -1 then
result[CommonFun.RoleData.EATTRTYPE_MATKPER] = -1
end
result[CommonFun.RoleData.EATTRTYPE_MDEFPER] = extra[CommonFun.RoleData.EATTRTYPE_MDEFPER] + attr[CommonFun.RoleData.EATTRTYPE_MDEFPER]
if result[CommonFun.RoleData.EATTRTYPE_MDEFPER] <= -1 then
result[CommonFun.RoleData.EATTRTYPE_MDEFPER] = -1
end
result[CommonFun.RoleData.EATTRTYPE_MAXHPPER] = extra[CommonFun.RoleData.EATTRTYPE_MAXHPPER] + attr[CommonFun.RoleData.EATTRTYPE_MAXHPPER]
if result[CommonFun.RoleData.EATTRTYPE_MAXHPPER] <= -1 then
result[CommonFun.RoleData.EATTRTYPE_MAXHPPER] = -1
end
result[CommonFun.RoleData.EATTRTYPE_MAXHP] = (extra[CommonFun.RoleData.EATTRTYPE_MAXHP] + attr[CommonFun.RoleData.EATTRTYPE_MAXHP]) * (1 + result[CommonFun.RoleData.EATTRTYPE_MAXHPPER])
if map == 1 or map == 2 then
result[CommonFun.RoleData.EATTRTYPE_MAXHP] = 4 * (extra[CommonFun.RoleData.EATTRTYPE_MAXHP] + attr[CommonFun.RoleData.EATTRTYPE_MAXHP]) * (1 + result[CommonFun.RoleData.EATTRTYPE_MAXHPPER])
end
result[CommonFun.RoleData.EATTRTYPE_MAXSPPER] = extra[CommonFun.RoleData.EATTRTYPE_MAXSPPER] + attr[CommonFun.RoleData.EATTRTYPE_MAXSPPER]
if result[CommonFun.RoleData.EATTRTYPE_MAXSPPER] <= -1 then
result[CommonFun.RoleData.EATTRTYPE_MAXSPPER] = -1
end
result[CommonFun.RoleData.EATTRTYPE_MAXSP] = (extra[CommonFun.RoleData.EATTRTYPE_MAXSP] + attr[CommonFun.RoleData.EATTRTYPE_MAXSP]) * (1 + result[CommonFun.RoleData.EATTRTYPE_MAXSPPER])
result[CommonFun.RoleData.EATTRTYPE_REFINE] = extra[CommonFun.RoleData.EATTRTYPE_REFINE] + attr[CommonFun.RoleData.EATTRTYPE_REFINE]
result[CommonFun.RoleData.EATTRTYPE_MREFINE] = extra[CommonFun.RoleData.EATTRTYPE_MREFINE] + attr[CommonFun.RoleData.EATTRTYPE_MREFINE]
result[CommonFun.RoleData.EATTRTYPE_DAMREDUC] = attr[CommonFun.RoleData.EATTRTYPE_DAMREDUC]
if 1 <= result[CommonFun.RoleData.EATTRTYPE_DAMREDUC] then
result[CommonFun.RoleData.EATTRTYPE_DAMREDUC] = 1
end
result[CommonFun.RoleData.EATTRTYPE_MDAMREDUC] = attr[CommonFun.RoleData.EATTRTYPE_MDAMREDUC]
if 1 <= result[CommonFun.RoleData.EATTRTYPE_MDAMREDUC] then
result[CommonFun.RoleData.EATTRTYPE_MDAMREDUC] = 1
end
result[CommonFun.RoleData.EATTRTYPE_RESTORESPD] = (extra[CommonFun.RoleData.EATTRTYPE_RESTORESPD] + attr[CommonFun.RoleData.EATTRTYPE_RESTORESPD] + math.floor(result[CommonFun.RoleData.EATTRTYPE_MAXHP] / 200)) * (1 + attr[CommonFun.RoleData.EATTRTYPE_RESTORESPDPER])
result[CommonFun.RoleData.EATTRTYPE_SPRESTORESPD] = (extra[CommonFun.RoleData.EATTRTYPE_SPRESTORESPD] + attr[CommonFun.RoleData.EATTRTYPE_SPRESTORESPD] + math.floor(result[CommonFun.RoleData.EATTRTYPE_MAXSP] / 100)) * (1 + attr[CommonFun.RoleData.EATTRTYPE_SPRESTORESPDPER])
result[CommonFun.RoleData.EATTRTYPE_SHOWATK] = result[CommonFun.RoleData.EATTRTYPE_ATK] * (1 + result[CommonFun.RoleData.EATTRTYPE_ATKPER])
result[CommonFun.RoleData.EATTRTYPE_SHOWMATK] = result[CommonFun.RoleData.EATTRTYPE_MATK] * (1 + result[CommonFun.RoleData.EATTRTYPE_MATKPER])
result[CommonFun.RoleData.EATTRTYPE_SHOWMAXHP] = result[CommonFun.RoleData.EATTRTYPE_MAXHP]
result[CommonFun.RoleData.EATTRTYPE_SHOWMAXSP] = result[CommonFun.RoleData.EATTRTYPE_MAXSP]
result[CommonFun.RoleData.EATTRTYPE_SHOWDEF] = extra[CommonFun.RoleData.EATTRTYPE_DEF] + attr[CommonFun.RoleData.EATTRTYPE_DEF] * (1 + result[CommonFun.RoleData.EATTRTYPE_DEFPER])
result[CommonFun.RoleData.EATTRTYPE_SHOWMDEF] = extra[CommonFun.RoleData.EATTRTYPE_MDEF] + attr[CommonFun.RoleData.EATTRTYPE_MDEF] * (1 + result[CommonFun.RoleData.EATTRTYPE_MDEFPER])
result[CommonFun.RoleData.EATTRTYPE_SHOWHIT] = result[CommonFun.RoleData.EATTRTYPE_HIT]
result[CommonFun.RoleData.EATTRTYPE_SHOWFLEE] = result[CommonFun.RoleData.EATTRTYPE_FLEE]
result[CommonFun.RoleData.EATTRTYPE_SHOWCRI] = result[CommonFun.RoleData.EATTRTYPE_CRI]
result[CommonFun.RoleData.EATTRTYPE_SHOWCRIRES] = result[CommonFun.RoleData.EATTRTYPE_CRIRES]
result[CommonFun.RoleData.EATTRTYPE_SHOWATKSPD] = result[CommonFun.RoleData.EATTRTYPE_ATKSPD]
result[CommonFun.RoleData.EATTRTYPE_SHOWMOVESPD] = result[CommonFun.RoleData.EATTRTYPE_MOVESPD]
result[CommonFun.RoleData.EATTRTYPE_SHOWCASTSPD] = result[CommonFun.RoleData.EATTRTYPE_CASTSPD]
result[CommonFun.RoleData.EATTRTYPE_SHOWRESTORESPD] = result[CommonFun.RoleData.EATTRTYPE_RESTORESPD]
for k, v in pairs(result) do
if v ~= 0 then
result[k] = math.floor(v * 1000 + 0.5) / 1000
else
result[k] = v
end
end
for k, v in pairs(extra) do
if v ~= 0 then
extra[k] = math.floor(v * 1000 + 0.5) / 1000
else
extra[k] = 0
end
end
return result, extra
end