Formula

CommonFun.calcRoguelikeMonsterNpcAttrValue

function CommonFun.calcRoguelikeMonsterNpcAttrValue(attr, Type, classtype, Layer)
  local result = {}
  if Layer <= 10 then
    result[CommonFun.RoleData.EATTRTYPE_ATK] = math.floor(200 * Layer) + attr[CommonFun.RoleData.EATTRTYPE_ATK]
    result[CommonFun.RoleData.EATTRTYPE_MATK] = math.floor(200 * Layer) + attr[CommonFun.RoleData.EATTRTYPE_MATK]
    result[CommonFun.RoleData.EATTRTYPE_DEF] = math.floor(200 * Layer) / 4 + attr[CommonFun.RoleData.EATTRTYPE_DEF]
    result[CommonFun.RoleData.EATTRTYPE_MDEF] = math.floor(200 * Layer) / 8 + attr[CommonFun.RoleData.EATTRTYPE_MDEF]
    result[CommonFun.RoleData.EATTRTYPE_MAXHP] = math.floor(-5.4277 * Layer ^ 4 + 578.96 * Layer ^ 3 - 8741.5 * Layer ^ 2 + 239231 * Layer - 42844) * 0.9 + attr[CommonFun.RoleData.EATTRTYPE_MAXHP]
    result[CommonFun.RoleData.EATTRTYPE_HIT] = Layer * 5 + 500 + attr[CommonFun.RoleData.EATTRTYPE_HIT]
    result[CommonFun.RoleData.EATTRTYPE_FLEE] = Layer * 2 + 100 + attr[CommonFun.RoleData.EATTRTYPE_FLEE]
    result[CommonFun.RoleData.EATTRTYPE_CRI] = Layer + 20 + attr[CommonFun.RoleData.EATTRTYPE_CRI]
    result[CommonFun.RoleData.EATTRTYPE_CRIRES] = Layer * 0.5 + 10 + attr[CommonFun.RoleData.EATTRTYPE_CRIRES]
    result[CommonFun.RoleData.EATTRTYPE_CRIDAMPER] = Layer * 0.01 + 0.5 + attr[CommonFun.RoleData.EATTRTYPE_CRIDAMPER]
    result[CommonFun.RoleData.EATTRTYPE_REFINE] = math.floor(200 * Layer) / 10 + attr[CommonFun.RoleData.EATTRTYPE_REFINE]
    result[CommonFun.RoleData.EATTRTYPE_MREFINE] = math.floor(200 * Layer) / 10 + attr[CommonFun.RoleData.EATTRTYPE_MREFINE]
    result[CommonFun.RoleData.EATTRTYPE_DAMREDUC] = Layer * 0.01 + attr[CommonFun.RoleData.EATTRTYPE_DAMREDUC]
    result[CommonFun.RoleData.EATTRTYPE_MDAMREDUC] = Layer * 0.01 + attr[CommonFun.RoleData.EATTRTYPE_MDAMREDUC]
    result[CommonFun.RoleData.EATTRTYPE_DAMSPIKE] = Layer * 0.01 + attr[CommonFun.RoleData.EATTRTYPE_DAMSPIKE]
    result[CommonFun.RoleData.EATTRTYPE_MDAMSPIKE] = Layer * 0.01 + attr[CommonFun.RoleData.EATTRTYPE_MDAMSPIKE]
    result[CommonFun.RoleData.EATTRTYPE_REFINEDAMREDUC] = Layer * 0.01 + attr[CommonFun.RoleData.EATTRTYPE_REFINEDAMREDUC]
    result[CommonFun.RoleData.EATTRTYPE_REFINEMDAMREDUC] = Layer * 0.01 + attr[CommonFun.RoleData.EATTRTYPE_REFINEMDAMREDUC]
    result[CommonFun.RoleData.EATTRTYPE_IgnoreDef] = Layer * 0.02 + attr[CommonFun.RoleData.EATTRTYPE_IgnoreDef]
    result[CommonFun.RoleData.EATTRTYPE_IGNOREMDEF] = Layer * 0.02 + attr[CommonFun.RoleData.EATTRTYPE_IGNOREMDEF]
    result[CommonFun.RoleData.EATTRTYPE_STATEDEF] = 0.25 + attr[CommonFun.RoleData.EATTRTYPE_STATEDEF]
  elseif 10 < Layer and Layer <= 20 then
    result[CommonFun.RoleData.EATTRTYPE_ATK] = math.floor(25.806 * (Layer - 10) ^ 2 + 541.94 * (Layer - 10) + 2000) + attr[CommonFun.RoleData.EATTRTYPE_ATK]
    result[CommonFun.RoleData.EATTRTYPE_MATK] = math.floor(25.806 * (Layer - 10) ^ 2 + 541.94 * (Layer - 10) + 2000) + attr[CommonFun.RoleData.EATTRTYPE_MATK]
    result[CommonFun.RoleData.EATTRTYPE_DEF] = math.floor(25.806 * (Layer - 10) ^ 2 + 541.94 * (Layer - 10) + 2000) / 4 + attr[CommonFun.RoleData.EATTRTYPE_DEF]
    result[CommonFun.RoleData.EATTRTYPE_MDEF] = math.floor(25.806 * (Layer - 10) ^ 2 + 541.94 * (Layer - 10) + 2000) / 8 + attr[CommonFun.RoleData.EATTRTYPE_MDEF]
    result[CommonFun.RoleData.EATTRTYPE_MAXHP] = math.floor(-5.4277 * Layer ^ 4 + 578.96 * Layer ^ 3 - 8741.5 * Layer ^ 2 + 239231 * Layer - 42844) * 0.9 + attr[CommonFun.RoleData.EATTRTYPE_MAXHP]
    result[CommonFun.RoleData.EATTRTYPE_HIT] = Layer * 5 + 500 + attr[CommonFun.RoleData.EATTRTYPE_HIT]
    result[CommonFun.RoleData.EATTRTYPE_FLEE] = Layer * 2 + 120 + attr[CommonFun.RoleData.EATTRTYPE_FLEE]
    result[CommonFun.RoleData.EATTRTYPE_CRI] = Layer + 20 + attr[CommonFun.RoleData.EATTRTYPE_CRI]
    result[CommonFun.RoleData.EATTRTYPE_CRIRES] = Layer * 0.5 + 10 + attr[CommonFun.RoleData.EATTRTYPE_CRIRES]
    result[CommonFun.RoleData.EATTRTYPE_CRIDAMPER] = Layer * 0.01 + 0.5 + attr[CommonFun.RoleData.EATTRTYPE_CRIDAMPER]
    result[CommonFun.RoleData.EATTRTYPE_REFINE] = math.floor(500 * Layer - 5000) / 10 + attr[CommonFun.RoleData.EATTRTYPE_REFINE]
    result[CommonFun.RoleData.EATTRTYPE_MREFINE] = math.floor(500 * Layer - 5000) / 10 + attr[CommonFun.RoleData.EATTRTYPE_MREFINE]
    result[CommonFun.RoleData.EATTRTYPE_DAMREDUC] = (Layer - 10) * 0.02 + 0.1 + attr[CommonFun.RoleData.EATTRTYPE_DAMREDUC]
    result[CommonFun.RoleData.EATTRTYPE_MDAMREDUC] = (Layer - 10) * 0.02 + 0.1 + attr[CommonFun.RoleData.EATTRTYPE_MDAMREDUC]
    result[CommonFun.RoleData.EATTRTYPE_DAMSPIKE] = (Layer - 10) * 0.05 + 0.1 + attr[CommonFun.RoleData.EATTRTYPE_DAMSPIKE]
    result[CommonFun.RoleData.EATTRTYPE_MDAMSPIKE] = (Layer - 10) * 0.05 + 0.1 + attr[CommonFun.RoleData.EATTRTYPE_MDAMSPIKE]
    result[CommonFun.RoleData.EATTRTYPE_REFINEDAMREDUC] = (Layer - 10) * 0.02 + 0.1 + attr[CommonFun.RoleData.EATTRTYPE_REFINEDAMREDUC]
    result[CommonFun.RoleData.EATTRTYPE_REFINEMDAMREDUC] = (Layer - 10) * 0.02 + 0.1 + attr[CommonFun.RoleData.EATTRTYPE_REFINEMDAMREDUC]
    result[CommonFun.RoleData.EATTRTYPE_IgnoreDef] = (Layer - 10) * 0.04 + 0.2 + attr[CommonFun.RoleData.EATTRTYPE_IgnoreDef]
    result[CommonFun.RoleData.EATTRTYPE_IGNOREMDEF] = (Layer - 10) * 0.04 + 0.2 + attr[CommonFun.RoleData.EATTRTYPE_IGNOREMDEF]
    result[CommonFun.RoleData.EATTRTYPE_STATEDEF] = 0.5 + attr[CommonFun.RoleData.EATTRTYPE_STATEDEF]
  elseif 20 < Layer and Layer <= 40 then
    result[CommonFun.RoleData.EATTRTYPE_ATK] = math.floor(33.208 * (Layer - 20) ^ 4 - 1626.3 * (Layer - 20) ^ 3 + 30670 * (Layer - 20) ^ 2 + 183476 * (Layer - 20) + 4280000) / 500 + attr[CommonFun.RoleData.EATTRTYPE_ATK]
    result[CommonFun.RoleData.EATTRTYPE_MATK] = math.floor(33.208 * (Layer - 20) ^ 4 - 1626.3 * (Layer - 20) ^ 3 + 30670 * (Layer - 20) ^ 2 + 183476 * (Layer - 20) + 4280000) / 500 + attr[CommonFun.RoleData.EATTRTYPE_MATK]
    result[CommonFun.RoleData.EATTRTYPE_DEF] = math.floor(33.208 * (Layer - 20) ^ 4 - 1626.3 * (Layer - 20) ^ 3 + 30670 * (Layer - 20) ^ 2 + 183476 * (Layer - 20) + 4280000) / 2000 + attr[CommonFun.RoleData.EATTRTYPE_DEF]
    result[CommonFun.RoleData.EATTRTYPE_MDEF] = math.floor(33.208 * (Layer - 20) ^ 4 - 1626.3 * (Layer - 20) ^ 3 + 30670 * (Layer - 20) ^ 2 + 183476 * (Layer - 20) + 4280000) / 4000 + attr[CommonFun.RoleData.EATTRTYPE_MDEF]
    result[CommonFun.RoleData.EATTRTYPE_MAXHP] = math.floor(33.208 * (Layer - 20) ^ 4 - 1626.3 * (Layer - 20) ^ 3 + 30670 * (Layer - 20) ^ 2 + 183476 * (Layer - 20) + 4280000) * 0.9 + attr[CommonFun.RoleData.EATTRTYPE_MAXHP]
    result[CommonFun.RoleData.EATTRTYPE_HIT] = Layer * 5 + 500 + attr[CommonFun.RoleData.EATTRTYPE_HIT]
    result[CommonFun.RoleData.EATTRTYPE_FLEE] = Layer * 2 + 200 + attr[CommonFun.RoleData.EATTRTYPE_FLEE]
    result[CommonFun.RoleData.EATTRTYPE_CRI] = Layer + 20 + attr[CommonFun.RoleData.EATTRTYPE_CRI]
    result[CommonFun.RoleData.EATTRTYPE_CRIRES] = Layer * 0.5 + 20 + attr[CommonFun.RoleData.EATTRTYPE_CRIRES]
    result[CommonFun.RoleData.EATTRTYPE_CRIDAMPER] = Layer * 0.01 + 1 + attr[CommonFun.RoleData.EATTRTYPE_CRIDAMPER]
    result[CommonFun.RoleData.EATTRTYPE_REFINE] = math.floor(33.208 * (Layer - 20) ^ 4 - 1626.3 * (Layer - 20) ^ 3 + 30670 * (Layer - 20) ^ 2 + 183476 * (Layer - 20) + 4280000) / 1000 + attr[CommonFun.RoleData.EATTRTYPE_REFINE]
    result[CommonFun.RoleData.EATTRTYPE_MREFINE] = math.floor(33.208 * (Layer - 20) ^ 4 - 1626.3 * (Layer - 20) ^ 3 + 30670 * (Layer - 20) ^ 2 + 183476 * (Layer - 20) + 4280000) / 1000 + attr[CommonFun.RoleData.EATTRTYPE_MREFINE]
    result[CommonFun.RoleData.EATTRTYPE_DAMREDUC] = Layer * 0.005 + 0.195 + attr[CommonFun.RoleData.EATTRTYPE_DAMREDUC]
    result[CommonFun.RoleData.EATTRTYPE_MDAMREDUC] = Layer * 0.005 + 0.195 + attr[CommonFun.RoleData.EATTRTYPE_MDAMREDUC]
    result[CommonFun.RoleData.EATTRTYPE_DAMSPIKE] = Layer * 0.01 + 0.4 + attr[CommonFun.RoleData.EATTRTYPE_DAMSPIKE]
    result[CommonFun.RoleData.EATTRTYPE_MDAMSPIKE] = Layer * 0.01 + 0.4 + attr[CommonFun.RoleData.EATTRTYPE_MDAMSPIKE]
    result[CommonFun.RoleData.EATTRTYPE_REFINEDAMREDUC] = Layer * 0.005 + 0.195 + attr[CommonFun.RoleData.EATTRTYPE_REFINEDAMREDUC]
    result[CommonFun.RoleData.EATTRTYPE_REFINEMDAMREDUC] = Layer * 0.005 + 0.195 + attr[CommonFun.RoleData.EATTRTYPE_REFINEMDAMREDUC]
    result[CommonFun.RoleData.EATTRTYPE_IgnoreDef] = Layer * 0.01 + 0.4 + attr[CommonFun.RoleData.EATTRTYPE_IgnoreDef]
    result[CommonFun.RoleData.EATTRTYPE_IGNOREMDEF] = Layer * 0.01 + 0.4 + attr[CommonFun.RoleData.EATTRTYPE_IGNOREMDEF]
    result[CommonFun.RoleData.EATTRTYPE_STATEDEF] = 0.75 + attr[CommonFun.RoleData.EATTRTYPE_STATEDEF]
  elseif 40 < Layer and Layer <= 60 then
    result[CommonFun.RoleData.EATTRTYPE_ATK] = math.floor(26.53 * (Layer - 40) ^ 4 - 1286.3 * (Layer - 40) ^ 3 + 21682 * (Layer - 40) ^ 2 + 588287 * (Layer - 40) + 10620000) / 500 + attr[CommonFun.RoleData.EATTRTYPE_ATK]
    result[CommonFun.RoleData.EATTRTYPE_MATK] = math.floor(26.53 * (Layer - 40) ^ 4 - 1286.3 * (Layer - 40) ^ 3 + 21682 * (Layer - 40) ^ 2 + 588287 * (Layer - 40) + 10620000) / 500 + attr[CommonFun.RoleData.EATTRTYPE_MATK]
    result[CommonFun.RoleData.EATTRTYPE_DEF] = math.floor(26.53 * (Layer - 40) ^ 4 - 1286.3 * (Layer - 40) ^ 3 + 21682 * (Layer - 40) ^ 2 + 588287 * (Layer - 40) + 10620000) / 2000 + attr[CommonFun.RoleData.EATTRTYPE_DEF]
    result[CommonFun.RoleData.EATTRTYPE_MDEF] = math.floor(26.53 * (Layer - 40) ^ 4 - 1286.3 * (Layer - 40) ^ 3 + 21682 * (Layer - 40) ^ 2 + 588287 * (Layer - 40) + 10620000) / 4000 + attr[CommonFun.RoleData.EATTRTYPE_MDEF]
    result[CommonFun.RoleData.EATTRTYPE_MAXHP] = math.floor(26.53 * (Layer - 40) ^ 4 - 1286.3 * (Layer - 40) ^ 3 + 21682 * (Layer - 40) ^ 2 + 588287 * (Layer - 40) + 10620000) * 0.9 + attr[CommonFun.RoleData.EATTRTYPE_MAXHP]
    result[CommonFun.RoleData.EATTRTYPE_HIT] = Layer * 5 + 500 + attr[CommonFun.RoleData.EATTRTYPE_HIT]
    result[CommonFun.RoleData.EATTRTYPE_FLEE] = Layer * 2 + 200 + attr[CommonFun.RoleData.EATTRTYPE_FLEE]
    result[CommonFun.RoleData.EATTRTYPE_CRI] = Layer + 20 + attr[CommonFun.RoleData.EATTRTYPE_CRI]
    result[CommonFun.RoleData.EATTRTYPE_CRIRES] = Layer * 0.5 + 20 + attr[CommonFun.RoleData.EATTRTYPE_CRIRES]
    result[CommonFun.RoleData.EATTRTYPE_CRIDAMPER] = Layer * 0.01 + 1 + attr[CommonFun.RoleData.EATTRTYPE_CRIDAMPER]
    result[CommonFun.RoleData.EATTRTYPE_REFINE] = math.floor(26.53 * (Layer - 40) ^ 4 - 1286.3 * (Layer - 40) ^ 3 + 21682 * (Layer - 40) ^ 2 + 588287 * (Layer - 40) + 10620000) / 1000 + attr[CommonFun.RoleData.EATTRTYPE_REFINE]
    result[CommonFun.RoleData.EATTRTYPE_MREFINE] = math.floor(26.53 * (Layer - 40) ^ 4 - 1286.3 * (Layer - 40) ^ 3 + 21682 * (Layer - 40) ^ 2 + 588287 * (Layer - 40) + 10620000) / 1000 + attr[CommonFun.RoleData.EATTRTYPE_MREFINE]
    result[CommonFun.RoleData.EATTRTYPE_DAMREDUC] = Layer * 0.005 + 0.195 + attr[CommonFun.RoleData.EATTRTYPE_DAMREDUC]
    result[CommonFun.RoleData.EATTRTYPE_MDAMREDUC] = Layer * 0.005 + 0.195 + attr[CommonFun.RoleData.EATTRTYPE_MDAMREDUC]
    result[CommonFun.RoleData.EATTRTYPE_DAMSPIKE] = Layer * 0.01 + 0.4 + attr[CommonFun.RoleData.EATTRTYPE_DAMSPIKE]
    result[CommonFun.RoleData.EATTRTYPE_MDAMSPIKE] = Layer * 0.01 + 0.4 + attr[CommonFun.RoleData.EATTRTYPE_MDAMSPIKE]
    result[CommonFun.RoleData.EATTRTYPE_REFINEDAMREDUC] = Layer * 0.005 + 0.195 + attr[CommonFun.RoleData.EATTRTYPE_REFINEDAMREDUC]
    result[CommonFun.RoleData.EATTRTYPE_REFINEMDAMREDUC] = Layer * 0.005 + 0.195 + attr[CommonFun.RoleData.EATTRTYPE_REFINEMDAMREDUC]
    result[CommonFun.RoleData.EATTRTYPE_IgnoreDef] = Layer * 0.01 + 0.4 + attr[CommonFun.RoleData.EATTRTYPE_IgnoreDef]
    result[CommonFun.RoleData.EATTRTYPE_IGNOREMDEF] = Layer * 0.01 + 0.4 + attr[CommonFun.RoleData.EATTRTYPE_IGNOREMDEF]
    result[CommonFun.RoleData.EATTRTYPE_STATEDEF] = 0.75 + attr[CommonFun.RoleData.EATTRTYPE_STATEDEF]
  end
  return result
end