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