RoleAttr.lua 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436
  1. ----------------------------------
  2. -- 人物属性
  3. -- doCalc 重算人物属性
  4. -- doCalcHero 重算英雄属性 并赋值到human缓存中
  5. -- calcMonsterConf 重算怪物属性 返回属性列表attrs
  6. -- calcHeroGrid 根据英雄grid重算英雄属性 返回属性列表attrs
  7. -- updateValue 更新属性
  8. -- calcZhandouli 根据属性计算战力
  9. -- calcPingFen 计算评分
  10. ----------------------------------
  11. local RoleExcel = require("excel.role")
  12. local HeroExcel = require("excel.hero").hero
  13. local skillExcel = require("excel.skill").skill
  14. local MonsterExcel = require("excel.monster").monster
  15. local MonsterAttrExcel = require("excel.monster").monsterAttr
  16. local Util = require("common.Util")
  17. local BeSkill = require("combat.BeSkill")
  18. local RoleHeadLogic = require("role.RoleHeadLogic")
  19. local FuwenLogic = require("fuwen.FuwenLogic")
  20. local HeroLogic = require("hero.HeroLogic")
  21. local HeroEquip = require("hero.HeroEquip")
  22. local RoleDefine = require("role.RoleDefine")
  23. local SkinLogic = require("skin.SkinLogic")
  24. local TheStarsLogic = require("theStars.TheStarsLogic")
  25. local UnionTecLogic = require("union.UnionTecLogic")
  26. local MoshouLogic = require("moshou.MoshouLogic")
  27. local UnionLivenessLogic = require("union.UnionLivenessLogic")
  28. local ChengjiuLogic = require("chengjiu.ChengjiuLogic")
  29. local AssessExcel = require("excel.assess")
  30. local EquipExcel = require("excel.equip")
  31. local FuwenExcel = require("excel.fuwen")
  32. local RoleStrongLogic = require("role.RoleStrongLogic")
  33. local ItemDefine = require("bag.ItemDefine")
  34. local EquipLogic = require("equip.EquipLogic")
  35. local CombatPosLogic = require("combat.CombatPosLogic")
  36. local CombatDefine = require("combat.CombatDefine")
  37. -- 计算人数属性
  38. function doCalc(human)
  39. human.attr = human.attr or {}
  40. human.heroAttrs = human.heroAttrs or {}
  41. Util.cleanTable(human.attr)
  42. local attr = human.attr
  43. -- 取个人前六英雄的战斗力
  44. local zhandouli = CombatPosLogic.getCombatHeroZDL(human, CombatDefine.COMBAT_TYPE1)
  45. local lvConfig = RoleExcel.exp[human.db.lv+1]
  46. -- 人物属性
  47. attr[RoleDefine.LEVEL] = human.db.lv
  48. attr[RoleDefine.EXP] = human.db.exp
  49. attr[RoleDefine.EXP_MAX] = lvConfig and lvConfig.exp or 0
  50. attr[RoleDefine.ZUANSHI] = human.db.zuanshi
  51. attr[RoleDefine.JINBI] = human.db.jinbi
  52. attr[RoleDefine.FRIENDHEART] = human.db.friendHeart
  53. attr[RoleDefine.ZHANDOULI] = zhandouli
  54. human.db.zhandouli = zhandouli
  55. RoleStrongLogic.doCalcMoShouPingFen(human, attr)
  56. end
  57. function cleanHeroAttrCache(human)
  58. human.heroAttrs = {}
  59. end
  60. -- 重算英雄属性
  61. function doCalcHero(human, index)
  62. local heroGrid = human.db.heroBag[index]
  63. local attrs = calcHeroGrid(heroGrid, index, human)
  64. if not attrs then return end
  65. RoleStrongLogic.doCalcMoShouPingFen(human, attrs)
  66. human.heroAttrs = human.heroAttrs or {}
  67. human.heroAttrs[index] = human.heroAttrs[index] or {}
  68. Util.copyTableSimple(attrs, human.heroAttrs[index])
  69. end
  70. -- 获取怪物属性 用的地方有点多,不一定改
  71. function calcMonsterConf(monsterID, attrID, attrInput)
  72. local monsterConfig = MonsterExcel[monsterID]
  73. local attrsConfig = attrID and MonsterAttrExcel[attrID]
  74. if not attrsConfig then
  75. attrID = 1
  76. attrsConfig = MonsterAttrExcel[attrID]
  77. end
  78. local attrs = {}
  79. initCombatAttr(attrs)
  80. attrs[RoleDefine.INIT_MP] = 50
  81. attrs[RoleDefine.JINGZHUN] = RoleDefine.DEFAUT_MINGZHONG
  82. attrs[RoleDefine.BAOJI_HURT_RATE] = RoleDefine.DEFAUT_BAOJI_HURT_RATE
  83. -- 怪物基础属性
  84. if attrInput then
  85. for _, attr in ipairs(attrInput) do
  86. local key = attr[1]
  87. local value = attr[2]
  88. attrs[key] = (attrs[key] or 0) + value
  89. end
  90. else
  91. for _, attr in ipairs(attrsConfig.attrs) do
  92. local key = attr[1]
  93. local value = attr[2]
  94. attrs[key] = (attrs[key] or 0) + value
  95. end
  96. end
  97. -- 怪物被动技能属性
  98. BeSkill.doCalcHero(nil, attrs, nil, monsterConfig)
  99. checkLimit(attrs)
  100. attrs[RoleDefine.ZHANDOULI] = calcZhandouli(attrs)
  101. return attrs
  102. end
  103. -- 根据英雄grid重算英雄属性
  104. local TEMP_HERO_ATTRS = {}
  105. local HERO_BASE_ATTRS = {}
  106. local HERO_OTHER_ATTRS = {}
  107. function calcHeroGrid(heroGrid, index, human)
  108. if type(heroGrid) ~= "table" then
  109. return
  110. end
  111. initCombatAttr(TEMP_HERO_ATTRS)
  112. initCombatAttr(HERO_BASE_ATTRS)
  113. initCombatAttr(HERO_OTHER_ATTRS)
  114. HERO_BASE_ATTRS[RoleDefine.INIT_MP] = 50
  115. -- 默认命中100% 暴击伤害
  116. HERO_BASE_ATTRS[RoleDefine.JINGZHUN] = RoleDefine.DEFAUT_MINGZHONG
  117. HERO_BASE_ATTRS[RoleDefine.BAOJI_HURT_RATE] = RoleDefine.DEFAUT_BAOJI_HURT_RATE
  118. --不同模块在英雄属性计算 begin
  119. HeroLogic.doCalcHero(heroGrid, HERO_BASE_ATTRS) -- 基础属性
  120. local heroSkinID, heroSkinSkill = SkinLogic.checkHeroSkin(human, index)
  121. if heroSkinID and heroSkinSkill then -- 皮肤属性
  122. HeroLogic.doCalcHeroSkin(heroSkinID, HERO_OTHER_ATTRS)
  123. end
  124. BeSkill.doCalcHero(heroGrid, HERO_BASE_ATTRS, heroSkinSkill) -- 被动技能属性
  125. HeroEquip.doCalcHero(heroGrid, HERO_OTHER_ATTRS) -- 装备
  126. FuwenLogic.doCalcHero(heroGrid, HERO_OTHER_ATTRS) -- 符文
  127. UnionTecLogic.doCalcHero(human, heroGrid, HERO_OTHER_ATTRS) -- 公会科技
  128. RoleHeadLogic.doCalcHero(human, HERO_OTHER_ATTRS) --称号
  129. UnionLivenessLogic.doCalcHero(human, HERO_OTHER_ATTRS) --公会活跃等级
  130. ChengjiuLogic.doCalcHero(human, HERO_OTHER_ATTRS) --成就属性加成
  131. MoshouLogic.doCalcHero(human, heroGrid, HERO_OTHER_ATTRS) -- 魔兽
  132. --不同模块在英雄属性计算 end
  133. -- 计算评分
  134. calcPingFen(human, heroGrid, HERO_OTHER_ATTRS)
  135. -- 最终计算
  136. calcFinalValue(HERO_BASE_ATTRS, HERO_OTHER_ATTRS, TEMP_HERO_ATTRS)
  137. heroGrid.zhandouli = TEMP_HERO_ATTRS[RoleDefine.ZHANDOULI] or 0
  138. return TEMP_HERO_ATTRS
  139. end
  140. -- 更新属性
  141. function updateValue(k, v, attrs, isBuff)
  142. if k == RoleDefine.FANSHE_ZHUANGJIA then
  143. attrs[k] = v --反射装甲直接取值
  144. elseif isBuff then
  145. attrs[k] = attrs[k] + v --战斗中添加buff属性叠加全按累加方式计算
  146. else
  147. --if RoleDefine.isBasicRate(k) then
  148. -- attrs[k] = (10000 + attrs[k])*(10000 + v)/10000 - 10000 --几何计算
  149. --else
  150. attrs[k] = attrs[k] + v --累加计算
  151. --end
  152. end
  153. end
  154. -- 计算战力
  155. function calcZhandouli(attrs)
  156. local zhandouli = 0
  157. for key, zdlcf in pairs(RoleExcel.zdlPoint) do
  158. local value = zdlcf.point
  159. if attrs[key] and attrs[key] > 0 then
  160. -- 减去默认命中
  161. local attr = attrs[key]
  162. if key == RoleDefine.JINGZHUN then
  163. attr = attr - RoleDefine.DEFAUT_MINGZHONG
  164. attr = attr < 0 and 0 or attr
  165. end
  166. -- 减去默认爆伤
  167. if key == RoleDefine.BAOJI_HURT_RATE then
  168. attr = attr - RoleDefine.DEFAUT_BAOJI_HURT_RATE
  169. attr = attr < 0 and 0 or attr
  170. end
  171. zhandouli = zhandouli + attr * value
  172. end
  173. end
  174. return math.ceil(zhandouli)
  175. end
  176. -- 计算英雄评分
  177. function calcPingFen(human, heroGrid, attr)
  178. local heroConfig = HeroExcel[heroGrid.id]
  179. if not heroConfig then return end
  180. local totalPingFen = 0
  181. -- 英雄等级评分
  182. local lv = heroGrid.lv
  183. local lvPingFen = AssessExcel.lv[lv].grade
  184. -- 英雄星级评分
  185. local star = heroGrid.star
  186. local starPingFen = AssessExcel.star[star].grade
  187. -- 英雄进阶评分
  188. local quality = heroGrid.quality
  189. local qualityPingFen = AssessExcel.quality[quality] and AssessExcel.quality[quality].grade or 0
  190. -- 英雄装备评分
  191. local equipPingFen = 0
  192. if heroGrid.equip then
  193. local mathFloor = math.floor
  194. for i = 1, ItemDefine.EQUIP_MAX_CNT do
  195. local equipGrid = heroGrid.equip[i]
  196. if equipGrid then
  197. local baseRate = EquipLogic.getEquipBaseRate(equipGrid.quality)
  198. local equipConfig = EquipExcel.equip[equipGrid.id]
  199. if equipConfig then
  200. local score = equipConfig.score
  201. score = mathFloor(score * baseRate)
  202. equipPingFen = equipPingFen + score
  203. end
  204. end
  205. end
  206. end
  207. -- 英雄符文评分
  208. local fuWenPingFen = 0
  209. for i = 1, 2 do
  210. if heroGrid.fuwen and
  211. heroGrid.fuwen[i] and
  212. heroGrid.fuwen[i].id ~= nil then
  213. local fuwenId = heroGrid.fuwen[i].id
  214. local skillLen = heroGrid.fuwen[i].skill and #heroGrid.fuwen[i].skill or 0
  215. for k = 1,skillLen do
  216. local skillID = heroGrid.fuwen[i].skill[k]
  217. local skillConfig = FuwenExcel.skill[skillID]
  218. fuWenPingFen = fuWenPingFen + AssessExcel.fuWen[skillConfig.lv].grade
  219. end
  220. end
  221. end
  222. -- 公会技能评分
  223. local unionTecPingFen = 0
  224. if human then
  225. if human.db.unionUuid and human.db.unionUuid ~= "" and
  226. human.db.technology and human.db.technology[heroConfig.job] then
  227. local technology = human.db.technology[heroConfig.job]
  228. local techCfg = nil
  229. for i = 1, UnionTecLogic.TEC_TIER_CNT do
  230. local tech = technology[i]
  231. local assessCfg = AssessExcel.union[i]
  232. if tech ~= nil and tech.lv ~= nil and tech.lv > 0 and assessCfg then
  233. unionTecPingFen = unionTecPingFen + assessCfg.grade * tech.lv
  234. end
  235. end
  236. end
  237. end
  238. attr[RoleDefine.PINGFEN_LV] = lvPingFen
  239. attr[RoleDefine.PINGFEN_STAR] = starPingFen
  240. attr[RoleDefine.PINGFEN_JINJIE] = qualityPingFen
  241. attr[RoleDefine.PINGFEN_EQUIP] = equipPingFen
  242. attr[RoleDefine.PINGFEN_FUWEN] = fuWenPingFen
  243. attr[RoleDefine.PINGFEN_UNION] = unionTecPingFen
  244. end
  245. function getPointByKey(key)
  246. local cf = RoleExcel.zdlPoint[key]
  247. if not cf then return 0 end
  248. return cf.point
  249. end
  250. -- 某些属性是有上下限的
  251. function checkLimit(attrs)
  252. attrs[RoleDefine.BAOJI] = math.max(attrs[RoleDefine.BAOJI], 0)
  253. end
  254. -- 计算最终属性
  255. local CHECKNEGATIVE = {}
  256. CHECKNEGATIVE[RoleDefine.STEAL_ATK] = 1
  257. CHECKNEGATIVE[RoleDefine.STEAL_DEF] = 1
  258. function calcFinalValue(heroAttrs, otherAttrs, attrs)
  259. heroAttrs[RoleDefine.ATK] = heroAttrs[RoleDefine.ATK] * (1 + heroAttrs[RoleDefine.ATK_RATE]/10000) * (1 + otherAttrs[RoleDefine.ATK_RATE]/10000)
  260. heroAttrs[RoleDefine.DEF] = heroAttrs[RoleDefine.DEF] * (1 + heroAttrs[RoleDefine.DEF_RATE]/10000) * (1 + otherAttrs[RoleDefine.DEF_RATE]/10000)
  261. heroAttrs[RoleDefine.HP] = heroAttrs[RoleDefine.HP] * (1 + heroAttrs[RoleDefine.HP_RATE]/10000) * (1 + otherAttrs[RoleDefine.HP_RATE]/10000)
  262. heroAttrs[RoleDefine.SPEED] = heroAttrs[RoleDefine.SPEED] * (1 + heroAttrs[RoleDefine.SPEED_RATE]/10000) * (1 + otherAttrs[RoleDefine.SPEED_RATE]/10000)
  263. otherAttrs[RoleDefine.ATK] = otherAttrs[RoleDefine.ATK] * (1 + otherAttrs[RoleDefine.ATK_RATE]/10000)
  264. otherAttrs[RoleDefine.DEF] = otherAttrs[RoleDefine.DEF] * (1 + otherAttrs[RoleDefine.DEF_RATE]/10000)
  265. otherAttrs[RoleDefine.HP] = otherAttrs[RoleDefine.HP] * (1 + otherAttrs[RoleDefine.HP_RATE]/10000)
  266. otherAttrs[RoleDefine.SPEED] = otherAttrs[RoleDefine.SPEED] * (1 + otherAttrs[RoleDefine.SPEED_RATE]/10000)
  267. for k,v in pairs(attrs) do
  268. attrs[k] = heroAttrs[k] + otherAttrs[k]
  269. if not CHECKNEGATIVE[k] then
  270. attrs[k] = math.max(attrs[k], 0)
  271. end
  272. attrs[k] = math.floor(attrs[k])
  273. end
  274. attrs[RoleDefine.ATK_RATE] = 0
  275. attrs[RoleDefine.DEF_RATE] = 0
  276. attrs[RoleDefine.HP_RATE] = 0
  277. attrs[RoleDefine.SPEED_RATE] = 0
  278. checkLimit(attrs)
  279. attrs[RoleDefine.ZHANDOULI] = calcZhandouli(attrs)
  280. end
  281. -- 初始化属性
  282. function initCombatAttr(attr)
  283. attr[RoleDefine.ZHANDOULI] = 0
  284. attr[RoleDefine.PINGFEN_LV] = 0
  285. attr[RoleDefine.PINGFEN_STAR] = 0
  286. attr[RoleDefine.PINGFEN_JINJIE] = 0
  287. attr[RoleDefine.PINGFEN_EQUIP] = 0
  288. attr[RoleDefine.PINGFEN_UNION] = 0
  289. attr[RoleDefine.PINGFEN_FUWEN] = 0
  290. attr[RoleDefine.PINGFEN_MOSHOU] = 0
  291. attr[RoleDefine.ATK] = 0
  292. attr[RoleDefine.DEF] = 0
  293. attr[RoleDefine.HP] = 0
  294. attr[RoleDefine.SPEED] = 0
  295. attr[RoleDefine.SKILL_HURT_RATE] = 0
  296. attr[RoleDefine.JINGZHUN] = 0
  297. attr[RoleDefine.GEDANG] = 0
  298. attr[RoleDefine.BAOJI] = 0
  299. attr[RoleDefine.BAOJI_HURT_RATE] = 0
  300. attr[RoleDefine.POJIA] = 0
  301. attr[RoleDefine.MIANKONG_RATE] = 0
  302. attr[RoleDefine.JIANSHANG_RATE] = 0
  303. attr[RoleDefine.SHENSHENG_HURT_RATE] = 0
  304. attr[RoleDefine.INIT_MP] = 0
  305. attr[RoleDefine.SHANBI] = 0
  306. attr[RoleDefine.KONG_RATE] = 0
  307. attr[RoleDefine.ATK_RATE] = 0
  308. attr[RoleDefine.DEF_RATE] = 0
  309. attr[RoleDefine.HP_RATE] = 0
  310. attr[RoleDefine.SPEED_RATE] = 0
  311. attr[RoleDefine.XURUO] = 0
  312. attr[RoleDefine.JOB_HURT_RATE1] = 0
  313. attr[RoleDefine.JOB_HURT_RATE2] = 0
  314. attr[RoleDefine.JOB_HURT_RATE3] = 0
  315. attr[RoleDefine.JOB_HURT_RATE4] = 0
  316. attr[RoleDefine.JOB_HURT_RATE5] = 0
  317. attr[RoleDefine.STATUS_HURT_RATE1] = 0
  318. attr[RoleDefine.STATUS_HURT_RATE2] = 0
  319. attr[RoleDefine.STATUS_HURT_RATE3] = 0
  320. attr[RoleDefine.STATUS_HURT_RATE4] = 0
  321. attr[RoleDefine.STATUS_HURT_RATE5] = 0
  322. attr[RoleDefine.STATUS_HURT_RATE6] = 0
  323. attr[RoleDefine.STATUS_HURT_RATE7] = 0
  324. attr[RoleDefine.STATUS_BAOJI_RATE1] = 0
  325. attr[RoleDefine.STATUS_BAOJI_RATE2] = 0
  326. attr[RoleDefine.STATUS_BAOJI_RATE3] = 0
  327. attr[RoleDefine.STATUS_BAOJI_RATE4] = 0
  328. attr[RoleDefine.STATUS_BAOJI_RATE5] = 0
  329. attr[RoleDefine.STATUS_BAOJI_RATE6] = 0
  330. attr[RoleDefine.STATUS_BAOJI_RATE7] = 0
  331. attr[RoleDefine.STATUS_BAOJI_RATE8] = 0
  332. attr[RoleDefine.STATUS_MIANYI_RATE1] = 0
  333. attr[RoleDefine.STATUS_MIANYI_RATE2] = 0
  334. attr[RoleDefine.STATUS_MIANYI_RATE3] = 0
  335. attr[RoleDefine.STATUS_MIANYI_RATE4] = 0
  336. attr[RoleDefine.STATUS_MIANYI_RATE5] = 0
  337. attr[RoleDefine.STATUS_MIANYI_RATE6] = 0
  338. attr[RoleDefine.STATUS_MIANYI_RATE7] = 0
  339. attr[RoleDefine.STATUS_MIANYI_RATE8] = 0
  340. attr[RoleDefine.HP_ADD_RATE] = 0
  341. attr[RoleDefine.CHIXU_HURT_DEL_RATE] = 0
  342. attr[RoleDefine.ZAOCHENG_HP_ADD_RATE] = 0
  343. attr[RoleDefine.PHY_HURT_ADD_RATE] = 0
  344. attr[RoleDefine.MAGIC_HURT_ADD_RATE] = 0
  345. attr[RoleDefine.ANTI_BAOJI] = 0
  346. attr[RoleDefine.JIANSHANG_PHY_RATE] = 0
  347. attr[RoleDefine.JIANSHANG_MAGIC_RATE] = 0
  348. attr[RoleDefine.STEAL_ATK] = 0
  349. attr[RoleDefine.STEAL_DEF] = 0
  350. attr[RoleDefine.HURT_RATE] = 0
  351. attr[RoleDefine.BAOJI_HURT_RATE_EXTRA] = 0
  352. attr[RoleDefine.FANSHE_ZHUANGJIA] = 0
  353. attr[RoleDefine.HUDUN_COMBAT] = 0
  354. attr[RoleDefine.HURT_RATE_MAX] = 0
  355. attr[RoleDefine.STATUS_BAOJI_HURT_RATE1] = 0
  356. attr[RoleDefine.STATUS_BAOJI_HURT_RATE2] = 0
  357. attr[RoleDefine.STATUS_BAOJI_HURT_RATE3] = 0
  358. attr[RoleDefine.STATUS_BAOJI_HURT_RATE4] = 0
  359. attr[RoleDefine.STATUS_BAOJI_HURT_RATE5] = 0
  360. attr[RoleDefine.STATUS_BAOJI_HURT_RATE6] = 0
  361. attr[RoleDefine.STATUS_BAOJI_HURT_RATE7] = 0
  362. attr[RoleDefine.STATUS_BAOJI_HURT_RATE8] = 0
  363. attr[RoleDefine.ANTI_BAOJI_HURT_RATE] = 0
  364. attr[RoleDefine.JOB_JIANSHANG_RATE1] = 0
  365. attr[RoleDefine.JOB_JIANSHANG_RATE2] = 0
  366. attr[RoleDefine.JOB_JIANSHANG_RATE3] = 0
  367. attr[RoleDefine.JOB_JIANSHANG_RATE4] = 0
  368. attr[RoleDefine.JOB_JIANSHANG_RATE5] = 0
  369. attr[RoleDefine.ATK_JIANSHANG_RATE] = 0
  370. attr[RoleDefine.CAMP_JIANSHANG_RATE1] = 0
  371. attr[RoleDefine.CAMP_JIANSHANG_RATE2] = 0
  372. attr[RoleDefine.CAMP_JIANSHANG_RATE3] = 0
  373. attr[RoleDefine.CAMP_JIANSHANG_RATE4] = 0
  374. attr[RoleDefine.CAMP_JIANSHANG_RATE5] = 0
  375. attr[RoleDefine.CAMP_HURT_RATE1] = 0
  376. attr[RoleDefine.CAMP_HURT_RATE2] = 0
  377. attr[RoleDefine.CAMP_HURT_RATE3] = 0
  378. attr[RoleDefine.CAMP_HURT_RATE4] = 0
  379. attr[RoleDefine.CAMP_HURT_RATE5] = 0
  380. attr[RoleDefine.STATUS_DIKANG_RATE9] = 0
  381. attr[RoleDefine.AT_PHY_HURT_ADD_RATE] = 0
  382. attr[RoleDefine.AT_MAGIC_HURT_ADD_RATE] = 0
  383. end