CombatCalc.lua 43 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249
  1. ----------------------------------
  2. -- 战斗计算
  3. -- calcHurt 计算伤害
  4. ----------------------------------
  5. local CombatDefine = require("combat.CombatDefine")
  6. local CombatObj = require("combat.CombatObj")
  7. local RoleDefine = require("role.RoleDefine")
  8. local Util = require("common.Util")
  9. local CombatBuff = require("combat.CombatBuff")
  10. local CombatImpl = require("combat.CombatImpl")
  11. -- local SkillExcel = require("excel.skill").skill
  12. local Gm = require("chat.Gm")
  13. -- local BufferExcel = require("excel.buffer").buffer
  14. local BeSkill = require("combat.BeSkill")
  15. local CombatPosLogic = require("combat.CombatPosLogic")
  16. local CmdTypeExcel = require("excel.buffer").cmdType
  17. local WinnerRelicLogic = require("winnerRelic.WinnerRelicLogic")
  18. -- 基础攻击
  19. local function getBaseAtk(attacker)
  20. local baseAtk = attacker.attr[RoleDefine.ATK]
  21. return baseAtk
  22. end
  23. -- 攻击加成
  24. local function getAtkRate(attacker)
  25. local atkRate = attacker.attr[RoleDefine.ATK_RATE] or 0
  26. return atkRate / 10000
  27. end
  28. function getOutAtk(attacker)
  29. --local baseAtk = getBaseAtk(attacker)
  30. --local atkRate = getAtkRate(attacker)
  31. --local outAtk = baseAtk *(1 + atkRate)
  32. local outAtk = getBaseAtk(attacker)
  33. outAtk = outAtk + attacker.attr[RoleDefine.STEAL_ATK]
  34. local extraAtkVal = BeSkill.GetExtraAttrByShaQi(attacker, RoleDefine.ATK)
  35. outAtk = outAtk + extraAtkVal
  36. outAtk = outAtk > 0 and outAtk or 0
  37. return outAtk
  38. end
  39. -- 护甲
  40. function getDef(defender, skillConfig)
  41. local def = defender.attr[RoleDefine.DEF]
  42. local rate = defender.attr[RoleDefine.DEF_RATE]
  43. def = def *(10000 + rate) / 10000
  44. def = def + defender.attr[RoleDefine.STEAL_DEF]
  45. def = def > 0 and def or 0
  46. return def
  47. end
  48. -- 破甲率
  49. local function getPojia(attacker, defender, skillConfig)
  50. local hushiHujia = skillConfig and skillConfig.otherArgs.hushiHujia or 0
  51. -- 职业忽视护甲
  52. local jobhushiHujia = skillConfig.otherArgs.jobhushiHujia
  53. if jobhushiHujia then
  54. for k, v in ipairs(jobhushiHujia[1]) do
  55. if defender.job == v then
  56. hushiHujia = hushiHujia + jobhushiHujia[2]
  57. break
  58. end
  59. end
  60. end
  61. -- 本阵容职业数破甲率提升
  62. local jobCamphushiHujia = skillConfig.otherArgs.jobCamphushiHujia
  63. if jobCamphushiHujia then
  64. for _,pos in ipairs(CombatDefine.SIDE2POS[attacker.side]) do
  65. local obj = CombatImpl.objList[pos]
  66. if obj and obj.job == jobCamphushiHujia[1] then
  67. hushiHujia = hushiHujia + jobCamphushiHujia[2]
  68. end
  69. end
  70. end
  71. local statusPoJia = BeSkill.getStatusPojia(attacker, defender)
  72. local pojia = attacker.attr[RoleDefine.POJIA] or 0
  73. local extraPoJiaVal = BeSkill.GetExtraAttrByShaQi(attacker, RoleDefine.POJIA)
  74. pojia = pojia + extraPoJiaVal
  75. local pojia_dk = defender.attr[RoleDefine.POJIA_DK] or 0
  76. local total = hushiHujia + pojia + statusPoJia - pojia_dk
  77. total = total < 0 and 0 or total
  78. return total/10000
  79. end
  80. -- 神圣伤害
  81. local function getShenshengHurtRate(attacker)
  82. local shenshengHurtRate = attacker.attr[RoleDefine.SHENSHENG_HURT_RATE] or 0
  83. return shenshengHurtRate / 10000
  84. end
  85. -- 是否格挡
  86. local function isGedang(defender)
  87. -- return false
  88. local geDangRate = CombatObj.getValue(defender, RoleDefine.GEDANG)
  89. if geDangRate <= 0 then
  90. return false
  91. end
  92. local randValue = math.random(0, 10000)
  93. if geDangRate > randValue then
  94. return true
  95. end
  96. return false
  97. end
  98. -- 减伤率proel
  99. local function getJianshangRate(attacker, defender)
  100. local jianshangRate = defender.attr[RoleDefine.JIANSHANG_RATE] or 0
  101. jianshangRate = jianshangRate + attacker.attr[RoleDefine.ATK_JIANSHANG_RATE] or 0
  102. if attacker.hurtType == CombatDefine.PHY_HURT_TYPE then
  103. jianshangRate = jianshangRate +(defender.attr[RoleDefine.JIANSHANG_PHY_RATE] or 0)
  104. elseif attacker.hurtType == CombatDefine.MAGIC_HURT_TYPE then
  105. jianshangRate = jianshangRate +(defender.attr[RoleDefine.JIANSHANG_MAGIC_RATE] or 0)
  106. end
  107. jianshangRate = jianshangRate + CombatObj.getJobJianshangRate(attacker, defender)
  108. jianshangRate = jianshangRate + CombatObj.getCampJianshangRate(attacker,defender)
  109. return jianshangRate/10000
  110. end
  111. -- 是否暴击
  112. local function isBaoji(attacker, defender, skillConfig)
  113. --if CombatImpl.isFanji or CombatImpl.comboType > 0 then
  114. -- return false
  115. --end
  116. if skillConfig.otherArgs and skillConfig.otherArgs.noBaoji == 1 then
  117. return false
  118. end
  119. if CombatBuff.isStatus(attacker, { "feng" }) then
  120. return false
  121. end
  122. local baoji = attacker.attr[RoleDefine.BAOJI] or 0
  123. baoji = baoji + CombatObj.getStatusBaoji(attacker, defender)
  124. -- 被动技能暴击加成
  125. baoji = baoji + BeSkill.getStatusBaoji(attacker, defender, skillConfig)
  126. local antiBaoji = defender.attr[RoleDefine.ANTI_BAOJI] or 0
  127. baoji = baoji - antiBaoji
  128. if skillConfig.otherArgs.addBaoji then
  129. baoji = baoji + skillConfig.otherArgs.addBaoji
  130. end
  131. if skillConfig.otherArgs.selfHpBaoJi then
  132. local cmpValue =(attacker.hp * 10000) / CombatObj.getHpMax(attacker) - skillConfig.otherArgs.selfHpBaoJi[2]
  133. if skillConfig.otherArgs.selfHpBaoJi[1] == 1 then
  134. if cmpValue >= 0 then
  135. baoji = baoji + skillConfig.otherArgs.selfHpBaoJi[3]
  136. end
  137. else
  138. if cmpValue <= 0 then
  139. baoji = baoji + skillConfig.otherArgs.selfHpBaoJi[3]
  140. end
  141. end
  142. end
  143. if skillConfig.otherArgs.addStatusBaoji then
  144. local status = CombatBuff.getStatus(defender)
  145. local isStatus = false
  146. for k, v in ipairs(skillConfig.otherArgs.addStatusBaoji[1]) do
  147. if status[v] then
  148. isStatus = true
  149. break
  150. end
  151. end
  152. if isStatus then
  153. baoji = baoji + skillConfig.otherArgs.addStatusBaoji[2]
  154. end
  155. end
  156. if skillConfig.otherArgs.addNotBaoji then
  157. if attacker.notSkillBaoJi and attacker.notSkillBaoJi[skillConfig.id] then
  158. baoji = baoji + skillConfig.otherArgs.addNotBaoji
  159. end
  160. end
  161. local r = math.random(0, 10000)
  162. if r <= baoji then
  163. attacker.notBaoJi = nil
  164. if attacker.notSkillBaoJi and attacker.notSkillBaoJi[skillConfig.id] then
  165. attacker.notSkillBaoJi[skillConfig.id] = nil
  166. end
  167. return true
  168. end
  169. attacker.notBaoJi = true
  170. if skillConfig.otherArgs.addNotBaoji then
  171. attacker.notSkillBaoJi = attacker.notSkillBaoJi or {}
  172. attacker.notSkillBaoJi[skillConfig.id] = true
  173. end
  174. end
  175. local function getBaojiHurtRate(attacker, defender, skillConfig)
  176. local baojiRate = 10000
  177. local isBaoji = isBaoji(attacker, defender, skillConfig)
  178. if isBaoji then
  179. baojiRate = attacker.attr[RoleDefine.BAOJI_HURT_RATE]
  180. if skillConfig.otherArgs and skillConfig.otherArgs.baojiHurtRate then
  181. baojiRate = baojiRate + skillConfig.otherArgs.baojiHurtRate
  182. end
  183. -- 对指定控制状态暴击加成 走的角色属性
  184. baojiRate = baojiRate + CombatObj.getStatusBaojiHurtRate(attacker, defender)
  185. -- 对指定状态暴击加成 走的技能状态属性
  186. if skillConfig.otherArgs.addStatusBaoji and skillConfig.otherArgs.addStatusBaoji[3] then
  187. local status = CombatBuff.getStatus(defender)
  188. local isStatus = false
  189. for k, v in ipairs(skillConfig.otherArgs.addStatusBaoji[1]) do
  190. if status[v] then
  191. isStatus = true
  192. break
  193. end
  194. end
  195. if isStatus then
  196. baojiRate = baojiRate + skillConfig.otherArgs.addStatusBaoji[3]
  197. end
  198. end
  199. baojiRate = baojiRate - defender.attr[RoleDefine.ANTI_BAOJI_HURT_RATE]
  200. baojiRate = baojiRate < 0 and 10000 or baojiRate
  201. end
  202. return isBaoji, baojiRate / 10000
  203. end
  204. -- 分摊比率
  205. FENTAN_TYPE1 = 1 -- 对所有攻击对象进行平摊
  206. local function getFentanRate(skillConfig, targets)
  207. local fentanParam = skillConfig.otherArgs and skillConfig.otherArgs.fentan
  208. if fentanParam then
  209. if fentanParam.type == 1 then
  210. return 1 / #targets
  211. end
  212. end
  213. return 1
  214. end
  215. --计算怒火层数
  216. local function getnuohuorate(attacker)
  217. local relicid = attacker.relic.relicID or 0
  218. local star = attacker.relic.star or 0
  219. local cengshu = 0
  220. if attacker.buffcmd["winner_nuhuo"] then
  221. local nIndex = attacker.buffcmd["winner_nuhuo"][1]
  222. local tBuffData = attacker.buffer[nIndex]
  223. if tBuffData.cnt < 10 then
  224. cengshu = tBuffData.cnt
  225. end
  226. end
  227. local addrate = 1
  228. if cengshu >= 0 then
  229. addrate = WinnerRelicLogic.WinnerRelic_GetRateLife(relicid,star)
  230. addrate = addrate * cengshu
  231. end
  232. -- print("getnuohuorate addrate = "..addrate.." cengshu = "..cengshu)
  233. return addrate
  234. end
  235. -- 被动技能影响的输出率
  236. local function getBeSkillOutRate(attacker, defender, skillConfig, index, targets)
  237. -- 被动技能影响的输出率
  238. local outBeSkillRate = BeSkill.getOutAtkRate(attacker, defender)
  239. outBeSkillRate = 10000 - outBeSkillRate
  240. outBeSkillRate = outBeSkillRate < 0 and 0 or outBeSkillRate
  241. return outBeSkillRate / 10000
  242. end
  243. -- 输出率(英雄技能伤害率+所有技能伤害率)
  244. local function getOutRate(attacker, defender, skillConfig, index, targets)
  245. -- 普攻技能伤害率
  246. -- if skillConfig.type == CombatDefine.SKILL_TYPE1 then
  247. -- return 10000
  248. -- en
  249. local hurtRate = index and skillConfig.hurtRate[index] or skillConfig.hurtRate[1]
  250. if not hurtRate or hurtRate == 0 then
  251. if CombatImpl.fightMode[1] == CombatDefine.FIGHT_MODE1 then
  252. return 10000 + CombatImpl.fightMode[4]
  253. end
  254. return 10000
  255. end
  256. if CombatImpl.fightMode[1] == CombatDefine.FIGHT_MODE1 then
  257. hurtRate = hurtRate + CombatImpl.fightMode[4]
  258. end
  259. local outBeSkillRate = BeSkill.getOutAtkRate2(attacker, skillConfig)
  260. hurtRate = hurtRate + outBeSkillRate
  261. -- 战斗模式的伤害加成(死战)
  262. local fentanRate = getFentanRate(skillConfig, targets)
  263. --怒火对伤害的加成
  264. -- local nuhuo = getnuohuorate(attacker)
  265. hurtRate = hurtRate * fentanRate
  266. local confHurtRate = skillConfig.otherArgs.extraHurtRate
  267. if confHurtRate then
  268. local r = math.random(0, 10000)
  269. for k, v in ipairs(confHurtRate) do
  270. if r <= v[1] then
  271. hurtRate = hurtRate *(1 + v[2] / 10000)
  272. break
  273. else
  274. r = r - v[1]
  275. end
  276. end
  277. end
  278. confHurtRate = skillConfig.otherArgs.extraSpeedHurt
  279. if confHurtRate then
  280. local atkSpeed = CombatObj.getValue(attacker, RoleDefine.SPEED)
  281. local defSpeed = CombatObj.getValue(defender, RoleDefine.SPEED)
  282. if atkSpeed > defSpeed then
  283. hurtRate = hurtRate + confHurtRate
  284. end
  285. end
  286. if skillConfig.otherArgs.targetHp then
  287. local cmpValue =(defender.hp * 10000) / CombatObj.getHpMax(defender) - skillConfig.otherArgs.targetHp[2]
  288. if skillConfig.otherArgs.targetHp[1] == 1 then
  289. if cmpValue >= 0 then
  290. hurtRate = hurtRate + skillConfig.otherArgs.targetHp[3]
  291. end
  292. else
  293. if cmpValue <= 0 then
  294. hurtRate = hurtRate + skillConfig.otherArgs.targetHp[3]
  295. end
  296. end
  297. end
  298. if skillConfig.otherArgs.selfHpHurt then
  299. local cmpValue =(attacker.hp * 10000) / CombatObj.getHpMax(attacker) - skillConfig.otherArgs.selfHpHurt[2]
  300. if skillConfig.otherArgs.selfHpHurt[1] == 1 then
  301. if cmpValue >= 0 then
  302. hurtRate = hurtRate + skillConfig.otherArgs.selfHpHurt[3]
  303. end
  304. else
  305. if cmpValue <= 0 then
  306. hurtRate = hurtRate + skillConfig.otherArgs.selfHpHurt[3]
  307. end
  308. end
  309. end
  310. if skillConfig.otherArgs.buffHurt then
  311. local condData = skillConfig.otherArgs.buffHurt
  312. local targetObj = condData[1] == CombatDefine.ATTACK_SIDE and attacker or defender
  313. local condCmd = condData[2]
  314. local buffNum = CombatBuff.getBuffCnt(targetObj, condCmd)
  315. if buffNum > 0 then
  316. local baseVal = condData[3]
  317. local calcMode = condData[4]
  318. if calcMode == 1 then
  319. baseVal = baseVal + buffNum
  320. elseif calcMode == 2 then
  321. baseVal = baseVal - buffNum
  322. elseif calcMode == 3 then
  323. baseVal = baseVal * buffNum
  324. elseif calcMode == 4 then
  325. baseVal = baseVal / buffNum
  326. end
  327. hurtRate = hurtRate + baseVal
  328. end
  329. end
  330. if skillConfig.type == CombatDefine.SKILL_TYPE1 then
  331. return hurtRate
  332. end
  333. return hurtRate + attacker.attr[RoleDefine.SKILL_HURT_RATE]
  334. end
  335. -- 额外伤害加成百分比
  336. local function getExtraHurtRate(attacker, defender, skillConfig)
  337. local extraHurtRate = 0
  338. -- 虚弱
  339. extraHurtRate = extraHurtRate + defender.attr[RoleDefine.XURUO]
  340. -- 伤害加成
  341. extraHurtRate = extraHurtRate + attacker.attr[RoleDefine.HURT_RATE] + CombatPosLogic.getRestrict(attacker,defender,RoleDefine.HURT_RATE)
  342. -- buffer相关额外伤害加成
  343. extraHurtRate = extraHurtRate + CombatBuff.getExtraHurtRate(attacker, defender, skillConfig)
  344. -- 职业相关额外伤害加成
  345. extraHurtRate = extraHurtRate + CombatObj.getJobHurtRate(attacker, defender)
  346. -- 状态相关额外伤害加成
  347. extraHurtRate = extraHurtRate + CombatObj.getStatusHurtRate(attacker, defender)
  348. -- 被动技能伤害加成
  349. extraHurtRate = extraHurtRate + BeSkill.getExtraHurtRate(attacker, defender, skillConfig)
  350. -- 被动技能48伤害加成
  351. extraHurtRate = extraHurtRate + BeSkill.getExtraHurtRateEx(attacker, defender)
  352. -- 阵营相关额外伤害加成
  353. extraHurtRate = extraHurtRate + CombatObj.getCampHurtRate(attacker, defender)
  354. local jobHurt = skillConfig.otherArgs.jobHurt
  355. if jobHurt then
  356. for k, v in ipairs(jobHurt[1]) do
  357. if defender.job == v then
  358. extraHurtRate = extraHurtRate + jobHurt[2]
  359. break
  360. end
  361. end
  362. end
  363. if skillConfig.otherArgs.statusHurt then
  364. local status = CombatBuff.getStatus(defender)
  365. local isStatus = false
  366. for k, v in ipairs(skillConfig.otherArgs.statusHurt[1]) do
  367. if status[v] then
  368. isStatus = true
  369. break
  370. end
  371. end
  372. if isStatus then
  373. extraHurtRate = extraHurtRate + skillConfig.otherArgs.statusHurt[2]
  374. end
  375. end
  376. if skillConfig.otherArgs.statusHurt2 then
  377. local status = CombatBuff.getStatus(defender)
  378. local cmdList = CmdTypeExcel[skillConfig.otherArgs.statusHurt2[1]].cmd
  379. for k, v in ipairs(cmdList) do
  380. if status[v] then
  381. extraHurtRate = extraHurtRate + skillConfig.otherArgs.statusHurt2[2] * #status[v]
  382. end
  383. end
  384. end
  385. -- 负面状态 计算伤害率
  386. if skillConfig.otherArgs.statusHurt3 then
  387. local bufferCnt = CombatBuff.getCombatBufferCnt(defender, skillConfig.otherArgs.statusHurt3[1])
  388. if bufferCnt > 0 then
  389. extraHurtRate = extraHurtRate + skillConfig.otherArgs.statusHurt3[2] * bufferCnt
  390. end
  391. end
  392. return extraHurtRate / 10000
  393. end
  394. -- 额外伤害加成
  395. local function getExtraHurt(attacker, defender, skillConfig)
  396. local extraHurt = 0
  397. -- buffer相关额外伤害
  398. extraHurt = extraHurt + CombatBuff.getExtraHurt(attacker, defender, skillConfig)
  399. -- 被动技能额外伤害
  400. extraHurt = extraHurt + BeSkill.getExtraHurt(attacker, defender, skillConfig)
  401. return extraHurt
  402. end
  403. -- 伤害倍数
  404. local function getHurtMul(skillConfig)
  405. local mul = 1
  406. local hurtMul = skillConfig.otherArgs.hurtMul
  407. if hurtMul then
  408. local triggerRandVal = hurtMul[1] or 0
  409. local randVal = math.random(0,10000)
  410. if triggerRandVal >= randVal then
  411. mul = hurtMul[2] or 1
  412. end
  413. end
  414. return mul
  415. end
  416. -- 触发格挡后额外减伤
  417. local function triggerGeDangExtraDef(defender)
  418. local extraDefVal = BeSkill.GetGeDangExtraDef(defender) or 0
  419. extraDefVal = extraDefVal / 10000
  420. return extraDefVal
  421. end
  422. -- 被动技能的伤害倍数
  423. local function getBeSkillHurtMul(attacker)
  424. local hurtMul = BeSkill.GetBeSkillHurtMul(attacker) or 10000
  425. hurtMul = hurtMul / 10000
  426. return hurtMul
  427. end
  428. function initAttacker(attacker)
  429. if attacker.isPet or attacker.isElf then
  430. return
  431. end
  432. attacker.isBaoji = nil
  433. attacker.baojiHurtRate = nil
  434. attacker.handleAttr = nil
  435. CombatObj.setValue(attacker, RoleDefine.ATK_COMBAT_NOW, nil)
  436. CombatObj.setValue(attacker, RoleDefine.RATE_COMBAT_NOW, nil)
  437. CombatObj.setValue(attacker, RoleDefine.HURT_COMBAT_NOW, nil)
  438. attacker.beskill40 = nil
  439. end
  440. function calcPhyHurt(attacker, index, targets, skillConfig)
  441. local hurt = 0
  442. local flag = 0
  443. -- 技能是否无视护甲
  444. local noHuJia = false
  445. if skillConfig.otherArgs and skillConfig.otherArgs.noHuJia == 1 then
  446. noHuJia = true
  447. end
  448. local targetCnt = 1
  449. if skillConfig.otherArgs and skillConfig.otherArgs.hurtFenTan and skillConfig.otherArgs.hurtFenTan[1] == 1 then
  450. targetCnt = #targets
  451. end
  452. local defender = targets[index]
  453. local outRate = getOutRate(attacker, defender, skillConfig, index, targets)
  454. outRate = outRate / 10000
  455. local beSkillHurtRate = getBeSkillOutRate(attacker, defender, skillConfig)
  456. local pojia = getPojia(attacker, defender, skillConfig)
  457. local outAtk = attacker.attr[RoleDefine.ATK_COMBAT_NOW] or getOutAtk(attacker, skillConfig)
  458. local def = noHuJia == true and 0 or getDef(defender, skillConfig)
  459. local jianshangRate = getJianshangRate(attacker, defender)
  460. local extraHurtRate = getExtraHurtRate(attacker, defender, skillConfig)
  461. local extraHurt = getExtraHurt(attacker, defender, skillConfig)
  462. local isBaoji, baojiHurtRate = getBaojiHurtRate(attacker, defender, skillConfig)
  463. defender.isBaoji = isBaoji
  464. attacker.isBaoji = attacker.isBaoji or isBaoji
  465. if isBaoji then
  466. flag = Util.setBit(flag, CombatDefine.FLAG_BAOJI)
  467. end
  468. local shanghaiRate = 1 + extraHurtRate - jianshangRate
  469. shanghaiRate = shanghaiRate < 0 and 0 or shanghaiRate
  470. local coefDef = def * (1 - pojia)
  471. coefDef = coefDef < 0 and 0 or coefDef
  472. local rateCombatNow = (1 - coefDef / (coefDef + 600) ) * shanghaiRate
  473. hurt = outAtk * outRate * rateCombatNow * baojiHurtRate * beSkillHurtRate / targetCnt
  474. hurt = hurt + extraHurt
  475. CombatObj.setValue(attacker, RoleDefine.ATK_COMBAT_NOW, outAtk)
  476. -- 当伤害超过百分比 的 伤害 加深或者减免
  477. local parcentRate = BeSkill.getHurtPercentRate(attacker, defender, hurt, skillConfig)
  478. hurt = hurt *(1 + parcentRate / 10000)
  479. -- 测试用
  480. if Gm.wudi and attacker.pos <= 10 then
  481. hurt = 1000000000
  482. end
  483. -- 连击模式
  484. if CombatImpl.comboType > 0 then
  485. hurt = hurt * CombatImpl.comboHurtRate / 10000
  486. end
  487. if defender.fentq then
  488. hurt = math.ceil(hurt / defender.fentq)
  489. else
  490. --修正
  491. if hurt <= 10000 then
  492. hurt = hurt * math.random(100,500)/10000 + hurt
  493. else
  494. hurt = hurt * math.random(100,300)/10000 + hurt
  495. end
  496. end
  497. hurt = math.ceil(hurt)
  498. if defender.attr[RoleDefine.HURT_RATE_MAX] > 0 then
  499. local hurtMax = CombatObj.getHpMax(defender) * defender.attr[RoleDefine.HURT_RATE_MAX] / 10000
  500. if hurt > hurtMax then
  501. hurt = hurtMax
  502. end
  503. end
  504. -- 剧情模式
  505. if CombatImpl.fightMode[1] == CombatDefine.FIGHT_MODE2 then
  506. local skillList = CombatImpl.fightMode[2]
  507. for k, v in pairs(skillList) do
  508. if skillConfig.id == v then
  509. hurt = defender.hp * 0.9
  510. break
  511. end
  512. end
  513. end
  514. --是否触发格挡
  515. if isGedang(defender) then
  516. -- hurt = hurt * 0.5
  517. local extraDefVal = triggerGeDangExtraDef(defender)
  518. hurt = hurt * (1- (0.5 + extraDefVal))
  519. end
  520. local hurtMul = getHurtMul(skillConfig)
  521. hurt = hurt * hurtMul
  522. hurtMul = getBeSkillHurtMul(attacker)
  523. hurt = hurt * hurtMul
  524. hurt = math.ceil(hurt)
  525. hurt = math.max(hurt, 1)
  526. CombatObj.updateValue(attacker, RoleDefine.HURT_COMBAT_NOW, hurt)
  527. return hurt, flag
  528. end
  529. function calcMagicHurt(attacker, index, targets, skillConfig)
  530. local hurt = 0
  531. local flag = 0
  532. -- 技能是否无视护甲
  533. local noHuJia = false
  534. if skillConfig.otherArgs and skillConfig.otherArgs.noHuJia == 1 then
  535. noHuJia = true
  536. end
  537. local targetCnt = 1
  538. if skillConfig.otherArgs and skillConfig.otherArgs.hurtFenTan and skillConfig.otherArgs.hurtFenTan[1] == 1 then
  539. targetCnt = #targets
  540. end
  541. local defender = targets[index]
  542. local outRate = getOutRate(attacker, defender, skillConfig, index, targets)
  543. outRate = outRate / 10000
  544. local beSkillHurtRate = getBeSkillOutRate(attacker, defender, skillConfig)
  545. local pojia = getPojia(attacker, defender, skillConfig)
  546. local outAtk = attacker.attr[RoleDefine.ATK_COMBAT_NOW] or getOutAtk(attacker, skillConfig)
  547. local def = noHuJia == true and 0 or getDef(defender, skillConfig)
  548. local jianshangRate = getJianshangRate(attacker, defender)
  549. local extraHurtRate = getExtraHurtRate(attacker, defender, skillConfig)
  550. local extraHurt = getExtraHurt(attacker, defender, skillConfig)
  551. local isBaoji, baojiHurtRate = getBaojiHurtRate(attacker, defender, skillConfig)
  552. defender.isBaoji = isBaoji
  553. attacker.isBaoji = attacker.isBaoji or isBaoji
  554. if isBaoji then
  555. flag = Util.setBit(flag, CombatDefine.FLAG_BAOJI)
  556. end
  557. local shanghaiRate = 1 + extraHurtRate - jianshangRate
  558. shanghaiRate = shanghaiRate < 0 and 0 or shanghaiRate
  559. local coefDef = def * (1 - pojia)
  560. coefDef = coefDef < 0 and 0 or coefDef
  561. local rateCombatNow = (1 - coefDef / (coefDef + 600) ) * shanghaiRate
  562. hurt = outAtk * outRate * rateCombatNow * baojiHurtRate * beSkillHurtRate / targetCnt
  563. hurt = hurt + extraHurt
  564. CombatObj.setValue(attacker, RoleDefine.ATK_COMBAT_NOW, outAtk)
  565. -- 当伤害超过百分比 的 伤害 加深或者减免
  566. local parcentRate = BeSkill.getHurtPercentRate(attacker, defender, hurt, skillConfig)
  567. hurt = hurt *(1 + parcentRate / 10000)
  568. -- 测试用
  569. if Gm.wudi and attacker.pos <= 10 then
  570. hurt = 1000000000
  571. end
  572. -- 连击模式
  573. if CombatImpl.comboType > 0 then
  574. hurt = hurt * CombatImpl.comboHurtRate / 10000
  575. end
  576. if defender.fentq then
  577. hurt = math.ceil(hurt / defender.fentq)
  578. else
  579. --修正
  580. if hurt <= 10000 then
  581. hurt = hurt * math.random(100,500)/10000 + hurt
  582. else
  583. hurt = hurt * math.random(100,300)/10000 + hurt
  584. end
  585. end
  586. hurt = math.ceil(hurt)
  587. if defender.attr[RoleDefine.HURT_RATE_MAX] > 0 then
  588. local hurtMax = CombatObj.getHpMax(defender) * defender.attr[RoleDefine.HURT_RATE_MAX] / 10000
  589. if hurt > hurtMax then
  590. hurt = hurtMax
  591. end
  592. end
  593. -- 剧情模式
  594. if CombatImpl.fightMode[1] == CombatDefine.FIGHT_MODE2 then
  595. local skillList = CombatImpl.fightMode[2]
  596. for k, v in pairs(skillList) do
  597. if skillConfig.id == v then
  598. hurt = defender.hp * 0.9
  599. break
  600. end
  601. end
  602. end
  603. --是否触发格挡
  604. if isGedang(defender) then
  605. -- hurt = hurt * 0.5
  606. local extraDefVal = triggerGeDangExtraDef(defender)
  607. hurt = hurt * (1- (0.5 + extraDefVal))
  608. end
  609. local hurtMul = getHurtMul(skillConfig)
  610. hurt = hurt * hurtMul
  611. hurtMul = getBeSkillHurtMul(attacker)
  612. hurt = hurt * hurtMul
  613. hurt = math.ceil(hurt)
  614. hurt = math.max(hurt, 1)
  615. CombatObj.updateValue(attacker, RoleDefine.HURT_COMBAT_NOW, hurt)
  616. return hurt, flag
  617. end
  618. --[[
  619. 防守方最终闪避 =防守方闪避 * (1 - 攻击方额外命中)
  620. ]]
  621. local function isShanbi(attacker, index, targets)
  622. local defender = targets[index]
  623. local jingzhun = CombatObj.getValue(attacker, RoleDefine.JINGZHUN) + CombatPosLogic.getRestrict(attacker,defender,RoleDefine.JINGZHUN)
  624. local shanbi = CombatObj.getValue(defender, RoleDefine.SHANBI)
  625. -- if jingzhun >= 10000 then
  626. -- local mingZhong = jingzhun - 10000
  627. -- mingZhong = mingZhong < 0 and 0 or mingZhong
  628. -- -- 强制设定额外命中不超过 99%
  629. -- if mingZhong >= 9900 then
  630. -- mingZhong = 9900
  631. -- end
  632. -- local shanbiRatio = 10000 - mingZhong
  633. -- shanbiRatio = shanbiRatio < 0 and 0 or shanbiRatio
  634. -- shanbi = math.floor(shanbi *(shanbiRatio / 10000))
  635. -- else
  636. -- shanbi = 10000 - jingzhun + shanbi
  637. -- end
  638. -- local r = math.random(1, 10000)
  639. -- if r < shanbi then
  640. -- return true
  641. -- end
  642. -- return false
  643. -- 修改
  644. local hitVal = math.max(jingzhun - shanbi, 0)
  645. local r = math.random(1, 10000)
  646. if r <= hitVal then
  647. return false
  648. end
  649. return true
  650. end
  651. function calcHurt(attacker, index, targets, skillConfig)
  652. -- 魔兽主动攻击伤害值为战前算出来的固定值
  653. if skillConfig.type == CombatDefine.SKILL_TYPE4 then
  654. return attacker.hurt or skillConfig.hurtRate[1], 0
  655. end
  656. -- 精灵技能
  657. if skillConfig.type == CombatDefine.SKILL_TYPE77 then
  658. local atk = CombatObj.getValue(attacker, RoleDefine.ATK)
  659. return atk * (skillConfig.hurtRate[1] / 10000), 0
  660. end
  661. if not skillConfig.otherArgs.absoluteHit and isShanbi(attacker, index, targets) then
  662. local flag = 0
  663. flag = Util.setBit(flag, CombatDefine.FLAG_SHANBI)
  664. return 0, flag
  665. end
  666. if attacker.hurtType == CombatDefine.MAGIC_HURT_TYPE then
  667. return calcMagicHurt(attacker, index, targets, skillConfig)
  668. elseif attacker.hurtType == CombatDefine.PHY_HURT_TYPE then
  669. return calcPhyHurt(attacker, index, targets, skillConfig)
  670. else
  671. return calcPhyHurt(attacker, index, targets, skillConfig)
  672. end
  673. end
  674. -- 额外作用,buff的伤害加成
  675. local function getCmdBuffHurtRate(attacker, defender)
  676. local extraHurtRate = 0
  677. if attacker and defender.pos and attacker.pos ~= defender.pos then
  678. extraHurtRate = extraHurtRate + CombatObj.getJobHurtRate(attacker, defender)
  679. -- 职业相关额外伤害加成
  680. extraHurtRate = extraHurtRate + CombatObj.getStatusHurtRate(attacker, defender)
  681. -- 状态相关额外伤害加成
  682. extraHurtRate = extraHurtRate + BeSkill.getExtraHurtRateEx(attacker, defender)
  683. --
  684. end
  685. return extraHurtRate / 10000
  686. end
  687. NO_EXCALC_LIST = {
  688. [7] = 1,
  689. [8] = 1,
  690. [11] = 1,
  691. [13] = 1,
  692. [14] = 1,
  693. [15] = 1,
  694. [16] = 1,
  695. [17] = 1,
  696. [18] = 1,
  697. [19] = 1,
  698. }
  699. function calcHp(attacker, defender, calcType, rate, isAddHp, flag)
  700. local hp
  701. -- 魔兽技能是 具体值 不需要 除以一万
  702. if calcType ~= 8 then
  703. rate = rate / 10000
  704. end
  705. local isCmdBuffHurtRate = nil
  706. local baoJi = 1
  707. if calcType == 1 then
  708. -- 攻击百分比(技能释放者)
  709. -- local atk = CombatObj.getValue(attacker,RoleDefine.ATK_COMBAT_NOW)
  710. -- hp = atk * rate
  711. local atk = CombatObj.getValue(attacker, RoleDefine.ATK)
  712. local atkRate = CombatObj.getValue(attacker, RoleDefine.ATK_RATE) / 10000
  713. local extraHurtRate = 0
  714. if not isAddHp then
  715. extraHurtRate = defender.attr[RoleDefine.XURUO] / 10000
  716. end
  717. hp = atk *(1 + extraHurtRate) * rate
  718. elseif calcType == 2 then
  719. -- 生命上限百分比(技能释放者)
  720. hp = CombatObj.getHpMax(attacker) * rate
  721. elseif calcType == 3 then
  722. -- 当前生命百分比(技能释放者)
  723. hp = attacker.hp * rate
  724. elseif calcType == 4 then
  725. -- 损失生命百分比(技能释放者)
  726. hp =(CombatObj.getHpMax(attacker) - attacker.hp) * rate
  727. elseif calcType == 5 then
  728. -- 目标生命百分比(技能目标)
  729. hp = defender.hp * rate
  730. elseif calcType == 6 then
  731. -- 目标生命上限百分比(技能目标)
  732. hp = CombatObj.getHpMax(defender) * rate
  733. if flag ~= nil and flag > 0 then
  734. local atk = CombatObj.getValue(defender, RoleDefine.ATK)
  735. local atkMax = flag * atk / 10000
  736. if hp > atkMax then
  737. hp = atkMax
  738. end
  739. end
  740. elseif calcType == 7 then
  741. -- 伤害百分比
  742. local realAttacker = CombatImpl.nowAttacker or attacker
  743. hp = CombatObj.getValue(realAttacker, RoleDefine.HURT_COMBAT_NOW) * rate
  744. isCmdBuffHurtRate = true
  745. elseif calcType == 8 then
  746. -- 具体值(魔兽用)
  747. hp = rate
  748. elseif calcType == 9 then
  749. -- 当前攻击力百分比
  750. local atk = CombatObj.getValue(defender, RoleDefine.ATK)
  751. hp = atk * rate
  752. elseif calcType == 10 then
  753. -- 技能暴击时伤害的百分比
  754. hp = getOutAtk(attacker)
  755. local baojiRate = 10000
  756. baojiRate = attacker.attr[RoleDefine.BAOJI_HURT_RATE]
  757. baojiRate = baojiRate / 10000
  758. baoJi = baojiRate * rate
  759. elseif calcType == 11 then
  760. -- 生命上限百分比不走公式(技能释放者)
  761. hp = CombatObj.getHpMax(attacker) * rate
  762. elseif calcType == 12 then
  763. -- 当前战斗回合造成的总伤害
  764. if attacker.combatResult[4] then
  765. hp = - attacker.combatResult[4] * rate
  766. else
  767. hp = 1
  768. end
  769. elseif calcType == 13 then
  770. -- 当前生命百分比(技能释放者,不算减伤)
  771. hp = attacker.hp * rate
  772. elseif calcType == 14 then
  773. -- 损失生命百分比(技能释放者,不算减伤)
  774. hp =(CombatObj.getHpMax(attacker) - attacker.hp) * rate
  775. elseif calcType == 15 then
  776. -- 目标生命百分比(技能目标,不算减伤)
  777. hp = defender.hp * rate
  778. elseif calcType == 16 then
  779. -- 目标生命上限百分比(技能目标,不算减伤)
  780. hp = CombatObj.getHpMax(defender) * rate
  781. if flag ~= nil and flag > 0 then
  782. local atk = CombatObj.getValue(defender, RoleDefine.ATK)
  783. local atkMax = flag * atk / 10000
  784. if hp > atkMax then
  785. hp = atkMax
  786. end
  787. end
  788. elseif calcType == 17 then
  789. -- 回合内 目标上一次对我造成的伤害
  790. if defender.combatResult[5] and defender.combatResult[5][attacker.pos] then
  791. hp = - defender.combatResult[5][attacker.pos] * rate
  792. else
  793. hp = 1
  794. end
  795. elseif calcType == 18 then
  796. -- 当前攻击力百分比(不算减伤)
  797. local atk = CombatObj.getValue(defender, RoleDefine.ATK)
  798. hp = atk * rate
  799. elseif calcType == 19 then
  800. -- 攻击百分比(技能释放者,不算减伤)
  801. local atk = CombatObj.getValue(attacker, RoleDefine.ATK)
  802. local atkRate = CombatObj.getValue(attacker, RoleDefine.ATK_RATE) / 10000
  803. local extraHurtRate = 0
  804. if not isAddHp then
  805. extraHurtRate = defender.attr[RoleDefine.XURUO] / 10000
  806. end
  807. hp = atk *(1 + atkRate) *(1 + extraHurtRate) * rate
  808. elseif calcType == 20 then
  809. -- 触发了被动技能类型40的攻击对象的伤害加成
  810. hp = 0
  811. if attacker.beskill40 then
  812. for pos in pairs(attacker.beskill40) do
  813. local hpAdd = attacker.combatResult[5][pos] or 0
  814. hp = hp + hpAdd
  815. end
  816. end
  817. hp = - hp * rate
  818. elseif calcType == 21 then
  819. -- 回合内 我对目标造成造成的伤害
  820. if attacker.combatResult[5] and attacker.combatResult[5][defender.pos] then
  821. hp = - attacker.combatResult[5][defender.pos] * rate
  822. else
  823. hp = 1
  824. end
  825. elseif calcType == 22 then
  826. -- 目标生命上限百分比(上限是自己的攻击)
  827. hp = CombatObj.getHpMax(defender) * rate
  828. if flag ~= nil and flag > 0 then
  829. local atk = CombatObj.getValue(attacker, RoleDefine.ATK)
  830. local atkMax = flag * atk / 10000
  831. if hp > atkMax then
  832. hp = atkMax
  833. end
  834. end
  835. elseif calcType == 23 then
  836. -- 目标损失生命上限百分比 上限时攻击的4倍
  837. hp = (CombatObj.getHpMax(defender) - defender.hp) * rate
  838. elseif calcType == 24 then
  839. -- 目标损失生命上限百分比 上限时攻击的4倍
  840. hp = CombatObj.getValue(defender, RoleDefine.RATE_COMBAT_NOW) * rate
  841. elseif calcType == 25 then
  842. -- 目标当前生命百分比,不超过攻击者攻击力的10倍
  843. local atk = CombatObj.getValue(attacker, RoleDefine.ATK)
  844. local nMaxHp = atk * 10
  845. hp = defender.hp * rate
  846. if hp > nMaxHp then
  847. hp = nMaxHp
  848. end
  849. elseif calcType == 26 then
  850. -- 当前攻击者攻击力百分比
  851. local atk = CombatObj.getValue(attacker, RoleDefine.ATK)
  852. hp = atk * rate
  853. elseif calcType == 27 then
  854. -- 目标当前生命百分比,不超过攻击者攻击力的5倍
  855. local atk = CombatObj.getValue(attacker, RoleDefine.ATK)
  856. local nMaxHp = atk * 5
  857. hp = defender.hp * rate
  858. if hp > nMaxHp then
  859. hp = nMaxHp
  860. end
  861. end
  862. if not NO_EXCALC_LIST[calcType] then
  863. if isAddHp then
  864. if defender.type == CombatDefine.COMBAT_OBJ_TYPE3 then
  865. hp = 0
  866. else
  867. local hpAddRate = CombatObj.getValue(defender, RoleDefine.HP_ADD_RATE) / 10000
  868. hp = hp *(1 + hpAddRate)
  869. hp = hp < 0 and 1 or hp
  870. end
  871. --[[
  872. else
  873. local defRate = getDef(defender)
  874. local jianshangRate = getJianshangRate(attacker, defender)
  875. local rateCombatNow =(1 -(defRate /(defRate + 600))) *(1 - jianshangRate)
  876. hp = hp * rateCombatNow * baoJi
  877. ]]--
  878. end
  879. end
  880. if not isAddHp and not isCmdBuffHurtRate then
  881. -- hp = hp * (1 + getCmdBuffHurtRate(attacker, defender))
  882. end
  883. if isAddHp and CombatImpl.comboType > 0 then
  884. hp = math.ceil(hp * 0.5)
  885. end
  886. hp = hp > 0 and hp or 0
  887. return hp
  888. end
  889. -- 复制原 calcHp(), 用于兼容 combatBuff.lua 之前的逻辑, combatBuff.lua 中使用该函数
  890. function calcHpBuff(attacker, defender, calcType, rate, isAddHp, flag)
  891. local hp
  892. -- 魔兽技能是 具体值 不需要 除以一万
  893. if calcType ~= 8 then
  894. rate = rate / 10000
  895. end
  896. local isCmdBuffHurtRate = nil
  897. local baoJi = 1
  898. if calcType == 1 then
  899. -- 攻击百分比(技能释放者)
  900. -- local atk = CombatObj.getValue(attacker,RoleDefine.ATK_COMBAT_NOW)
  901. -- hp = atk * rate
  902. local atk = CombatObj.getValue(attacker, RoleDefine.ATK)
  903. local atkRate = CombatObj.getValue(attacker, RoleDefine.ATK_RATE) / 10000
  904. local extraHurtRate = 0
  905. if not isAddHp then
  906. extraHurtRate = defender.attr[RoleDefine.XURUO] / 10000
  907. end
  908. hp = atk *(1 + extraHurtRate) * rate
  909. elseif calcType == 2 then
  910. -- 生命上限百分比(技能释放者)
  911. hp = CombatObj.getHpMax(attacker) * rate
  912. elseif calcType == 3 then
  913. -- 当前生命百分比(技能释放者)
  914. hp = attacker.hp * rate
  915. elseif calcType == 4 then
  916. -- 损失生命百分比(技能释放者)
  917. hp =(CombatObj.getHpMax(attacker) - attacker.hp) * rate
  918. elseif calcType == 5 then
  919. -- 目标生命百分比(技能目标)
  920. hp = defender.hp * rate
  921. elseif calcType == 6 then
  922. -- 目标生命上限百分比(技能目标)
  923. hp = CombatObj.getHpMax(defender) * rate
  924. if flag ~= nil and flag > 0 then
  925. local atk = CombatObj.getValue(defender, RoleDefine.ATK)
  926. local atkMax = flag * atk / 10000
  927. if hp > atkMax then
  928. hp = atkMax
  929. end
  930. end
  931. elseif calcType == 7 then
  932. -- 伤害百分比
  933. local realAttacker = CombatImpl.nowAttacker or attacker
  934. hp = CombatObj.getValue(realAttacker, RoleDefine.HURT_COMBAT_NOW) * rate
  935. isCmdBuffHurtRate = true
  936. elseif calcType == 8 then
  937. -- 具体值(魔兽用)
  938. hp = rate
  939. elseif calcType == 9 then
  940. -- 当前攻击力百分比
  941. local atk = CombatObj.getValue(defender, RoleDefine.ATK)
  942. hp = atk * rate
  943. elseif calcType == 10 then
  944. -- 技能暴击时伤害的百分比
  945. hp = getOutAtk(attacker)
  946. local baojiRate = 10000
  947. baojiRate = attacker.attr[RoleDefine.BAOJI_HURT_RATE]
  948. baojiRate = baojiRate / 10000
  949. baoJi = baojiRate * rate
  950. elseif calcType == 11 then
  951. -- 生命上限百分比不走公式(技能释放者)
  952. hp = CombatObj.getHpMax(attacker) * rate
  953. elseif calcType == 12 then
  954. -- 当前战斗回合造成的总伤害
  955. if attacker.combatResult[4] then
  956. hp = - attacker.combatResult[4] * rate
  957. else
  958. hp = 1
  959. end
  960. elseif calcType == 13 then
  961. -- 当前生命百分比(技能释放者,不算减伤)
  962. hp = attacker.hp * rate
  963. elseif calcType == 14 then
  964. -- 损失生命百分比(技能释放者,不算减伤)
  965. hp =(CombatObj.getHpMax(attacker) - attacker.hp) * rate
  966. elseif calcType == 15 then
  967. -- 目标生命百分比(技能目标,不算减伤)
  968. hp = defender.hp * rate
  969. elseif calcType == 16 then
  970. -- 目标生命上限百分比(技能目标,不算减伤)
  971. hp = CombatObj.getHpMax(defender) * rate
  972. if flag ~= nil and flag > 0 then
  973. local atk = CombatObj.getValue(defender, RoleDefine.ATK)
  974. local atkMax = flag * atk / 10000
  975. if hp > atkMax then
  976. hp = atkMax
  977. end
  978. end
  979. elseif calcType == 17 then
  980. -- 回合内 目标上一次对我造成的伤害
  981. if defender.combatResult[5] and defender.combatResult[5][attacker.pos] then
  982. hp = - defender.combatResult[5][attacker.pos] * rate
  983. else
  984. hp = 1
  985. end
  986. elseif calcType == 18 then
  987. -- 当前攻击力百分比(不算减伤)
  988. local atk = CombatObj.getValue(defender, RoleDefine.ATK)
  989. hp = atk * rate
  990. elseif calcType == 19 then
  991. -- 攻击百分比(技能释放者,不算减伤)
  992. local atk = CombatObj.getValue(attacker, RoleDefine.ATK)
  993. local atkRate = CombatObj.getValue(attacker, RoleDefine.ATK_RATE) / 10000
  994. local extraHurtRate = 0
  995. if not isAddHp then
  996. extraHurtRate = defender.attr[RoleDefine.XURUO] / 10000
  997. end
  998. hp = atk *(1 + atkRate) *(1 + extraHurtRate) * rate
  999. elseif calcType == 20 then
  1000. -- 触发了被动技能类型40的攻击对象的伤害加成
  1001. hp = 0
  1002. if attacker.beskill40 then
  1003. for pos in pairs(attacker.beskill40) do
  1004. local hpAdd = attacker.combatResult[5][pos] or 0
  1005. hp = hp + hpAdd
  1006. end
  1007. end
  1008. hp = - hp * rate
  1009. elseif calcType == 21 then
  1010. -- 回合内 我对目标造成造成的伤害
  1011. if attacker.combatResult[5] and attacker.combatResult[5][defender.pos] then
  1012. hp = - attacker.combatResult[5][defender.pos] * rate
  1013. else
  1014. hp = 1
  1015. end
  1016. elseif calcType == 22 then
  1017. -- 目标生命上限百分比(上限是自己的攻击)
  1018. hp = CombatObj.getHpMax(defender) * rate
  1019. if flag ~= nil and flag > 0 then
  1020. local atk = CombatObj.getValue(attacker, RoleDefine.ATK)
  1021. local atkMax = flag * atk / 10000
  1022. if hp > atkMax then
  1023. hp = atkMax
  1024. end
  1025. end
  1026. elseif calcType == 23 then
  1027. -- 目标损失生命上限百分比 上限时攻击的4倍
  1028. hp = (CombatObj.getHpMax(defender) - defender.hp) * rate
  1029. elseif calcType == 24 then
  1030. -- 目标损失生命上限百分比 上限时攻击的4倍
  1031. hp = CombatObj.getValue(defender, RoleDefine.RATE_COMBAT_NOW) * rate
  1032. elseif calcType == 25 then
  1033. -- 目标当前生命百分比,不超过攻击者攻击力的10倍
  1034. local atk = CombatObj.getValue(attacker, RoleDefine.ATK)
  1035. local nMaxHp = atk * 10
  1036. hp = defender.hp * rate
  1037. if hp > nMaxHp then
  1038. hp = nMaxHp
  1039. end
  1040. elseif calcType == 26 then
  1041. -- 当前攻击者攻击力百分比
  1042. local atk = CombatObj.getValue(attacker, RoleDefine.ATK)
  1043. hp = atk * rate
  1044. end
  1045. if not NO_EXCALC_LIST[calcType] then
  1046. if isAddHp then
  1047. if defender.type == CombatDefine.COMBAT_OBJ_TYPE3 then
  1048. hp = 0
  1049. else
  1050. local hpAddRate = CombatObj.getValue(defender, RoleDefine.HP_ADD_RATE) / 10000
  1051. hp = hp *(1 + hpAddRate)
  1052. hp = hp < 0 and 1 or hp
  1053. end
  1054. --[[
  1055. else
  1056. local defRate = getDef(defender)
  1057. local jianshangRate = getJianshangRate(attacker, defender)
  1058. local rateCombatNow =(1 -(defRate /(defRate + 600))) *(1 - jianshangRate)
  1059. hp = hp * rateCombatNow * baoJi
  1060. ]]--
  1061. end
  1062. end
  1063. if not isAddHp and not isCmdBuffHurtRate then
  1064. hp = hp * (1 + getCmdBuffHurtRate(attacker, defender))
  1065. end
  1066. if isAddHp and CombatImpl.comboType > 0 then
  1067. hp = math.ceil(hp * 0.5)
  1068. end
  1069. hp = hp > 0 and hp or 0
  1070. return hp
  1071. end
  1072. function calcBufferHp(attacker, defender, bufferID, isAddHp)
  1073. --local conf = BufferExcel[bufferID]
  1074. local conf = CombatBuff.GetBuffConfig(bufferID)
  1075. local args
  1076. if attacker.isPet then
  1077. args = attacker.buffers[bufferID].args
  1078. else
  1079. args = conf.args
  1080. end
  1081. local hp = calcHp(attacker, defender, args[1], args[2], isAddHp)
  1082. if args[5] then
  1083. local limit = args[5] * CombatObj.getValue(attacker, RoleDefine.ATK_COMBAT_NOW) / 10000
  1084. if hp > limit then
  1085. hp = limit
  1086. end
  1087. end
  1088. return hp
  1089. end
  1090. function calcValue(attacker, defender, calcType, rate)
  1091. local value = 0
  1092. rate = rate / 10000
  1093. if calcType == 1 then
  1094. -- 攻击百分比(技能防守)
  1095. local atk = CombatObj.getValue(defender, RoleDefine.ATK)
  1096. local atkValue = atk * rate
  1097. if attacker.pos == defender.pos then
  1098. value = value + atkValue
  1099. else
  1100. value = value - atkValue
  1101. end
  1102. end
  1103. return value
  1104. end