CombatObj.lua 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689
  1. --战斗对象相关
  2. -- init 初始化对象
  3. -- setInitAttr 设置默认属性
  4. local RoleDefine = require("role.RoleDefine")
  5. local RoleAttr = require("role.RoleAttr")
  6. local CombatDefine = require("combat.CombatDefine")
  7. local CombatBuff = require("combat.CombatBuff")
  8. local BeSkill = require("combat.BeSkill")
  9. local CombatImpl = require("combat.CombatImpl")
  10. objs = objs or {} -- [pos]->obj
  11. helps = helps or {}
  12. side2AddTimes = {}
  13. -- 初始化
  14. function initAfterStart()
  15. for pos = 1, CombatDefine.COMBAT_HERO_ALL_CNT do
  16. local attr = {} -- 最终属性
  17. RoleAttr.initCombatAttr(attr)
  18. local initAttr = {} -- 默认属性
  19. RoleAttr.initCombatAttr(initAttr)
  20. local sysAttr = {} -- 战前附加系统属性(比如地牢,被动技能)
  21. RoleAttr.initCombatAttr(sysAttr)
  22. local bufferAttr = {}
  23. RoleAttr.initCombatAttr(bufferAttr)
  24. -- 遗物属性
  25. local relicAttr = {
  26. FixedAttr = {}, -- 固定属性
  27. ProAttr = {}, -- 百分比属性
  28. bSpecialDef = nil, -- 防御为0特殊标识
  29. }
  30. local bufferAttr2 = {}
  31. local obj = {}
  32. objs[pos] = obj
  33. obj.pos = pos -- 站位位置
  34. obj.helpType = CombatDefine.HELP_TYPE0 -- 辅助对象类型 武将/魔兽
  35. obj.side = pos > CombatDefine.COMBAT_HERO_CNT and CombatDefine.DEFEND_SIDE or CombatDefine.ATTACK_SIDE -- 进攻方/防守方
  36. obj.backupPos = nil --
  37. obj.beBackup = nil --
  38. obj.id = nil -- 对象ID
  39. obj.type = nil -- 对象类型
  40. obj.quality = nil -- 品质
  41. obj.hp = nil -- 当前HP
  42. obj.mp = nil -- 当前MP
  43. obj.initHp = nil
  44. obj.initMp = nil
  45. obj.job = nil -- 职业类型
  46. obj.body = nil -- 模型
  47. obj.dietime = nil -- 死亡时间
  48. obj.dieSkill = nil
  49. obj.dieAtkCnt = nil
  50. obj.camp = nil
  51. obj.sex = nil
  52. obj.attr = attr
  53. obj.initAttr = initAttr
  54. obj.sysAttr = sysAttr
  55. obj.bufferAttr = bufferAttr
  56. obj.bufferAttr2 = bufferAttr2
  57. obj.relicAttr = relicAttr
  58. obj.buffer = {[0] = 0} -- obj身上的buff集合,buff[0]表示buff数量
  59. obj.bufferCmd = {} --控制类buffer
  60. obj.skillList = nil
  61. obj.beSkillList = nil
  62. obj.paramData = {}
  63. obj.result = {0,0,0,0} --战斗中输出和治疗 承受伤害 出手回合数 汇总
  64. obj.combatResult = {0,0,{},0,{}} --每次攻击造成的伤害和治疗
  65. obj.extraCombatRecord = nil --战斗中额外统计的数据
  66. obj.delayAddBuffer = nil
  67. obj.normalTarget = nil
  68. end
  69. for pos = 1,CombatDefine.COMBAT_HELP_ALL_CNT do
  70. local help = {}
  71. local attr = {} -- 最终属性
  72. RoleAttr.initCombatAttr(attr)
  73. help.attr = attr
  74. helps[pos + CombatDefine.COMBAT_HERO_ALL_CNT] = help
  75. help.pos = pos + CombatDefine.COMBAT_HERO_ALL_CNT
  76. help.helpType = pos%CombatDefine.COMBAT_HELP_CNT
  77. help.id = nil
  78. help.side = pos > CombatDefine.COMBAT_HELP_CNT and CombatDefine.DEFEND_SIDE or CombatDefine.ATTACK_SIDE
  79. help.skillList = nil
  80. help.beSkillList = nil
  81. help.lv = 0
  82. help.head = 0
  83. help.body = 0
  84. help.quality = 0
  85. help.result = {0,0,0,0} --战斗中输出和治疗 承受伤害 出手回合数 汇总
  86. help.combatResult = {0,0,{},0,{}} --每次攻击受到的伤害和治疗
  87. help.extraCombatRecord = nil --战斗中额外统计的数据
  88. help.isPet = help.helpType == 1
  89. end
  90. end
  91. function getObjByPos(pos)
  92. if pos <= CombatDefine.COMBAT_HERO_ALL_CNT then
  93. return objs[pos]
  94. else
  95. return helps[pos]
  96. end
  97. end
  98. function init(obj)
  99. obj.id = nil
  100. obj.type = nil
  101. obj.quality = nil
  102. obj.hp = nil
  103. obj.initHp = nil
  104. obj.initMp = nil
  105. obj.job = nil
  106. obj.body = nil
  107. obj.beSkillList = nil
  108. obj.skillList = nil
  109. obj.delayAddBuffer = nil
  110. obj.backupPos = nil
  111. obj.beBackup = nil
  112. obj.dietime = nil
  113. obj.dieSkill = nil
  114. obj.dieAtkCnt = nil
  115. obj.camp = nil
  116. obj.sex = nil
  117. obj.normalTarget = nil
  118. obj.notSkillBaoJi = nil
  119. obj.notBaoJi = nil
  120. for k in pairs(obj.buffer) do
  121. obj.buffer[k] = nil
  122. end
  123. obj.buffer[0] = 0
  124. for k,v in pairs(obj.bufferCmd) do
  125. obj.bufferCmd[k] = nil
  126. end
  127. for k,v in pairs(obj.paramData) do
  128. obj.paramData[k] = nil
  129. end
  130. for k in pairs(obj.bufferAttr2) do
  131. obj.bufferAttr2[k] = nil
  132. end
  133. obj.result[1] = 0
  134. obj.result[2] = 0
  135. obj.result[3] = 0
  136. obj.result[4] = 0
  137. obj.combatResult[1] = 0
  138. obj.combatResult[2] = 0
  139. for k in pairs(obj.combatResult[3]) do
  140. obj.combatResult[3][k] = nil
  141. end
  142. for k in pairs(obj.combatResult[5]) do
  143. obj.combatResult[5][k] = nil
  144. end
  145. obj.extraCombatRecord = nil
  146. RoleAttr.initCombatAttr(obj.attr)
  147. RoleAttr.initCombatAttr(obj.initAttr)
  148. RoleAttr.initCombatAttr(obj.sysAttr)
  149. RoleAttr.initCombatAttr(obj.bufferAttr)
  150. obj.relicAttr = {
  151. FixedAttr = {}, -- 固定属性
  152. ProAttr = {}, -- 百分比属性
  153. bSpecialDef = nil, -- 防御为0特殊标识
  154. }
  155. end
  156. --辅助对象相关
  157. function initHelp(help)
  158. help.id = nil
  159. help.skillList = nil
  160. help.beSkillList = nil
  161. help.lv = 0
  162. help.quality = 0
  163. help.head = 0
  164. help.body = 0
  165. help.icon = 0
  166. help.result[1] = 0
  167. help.result[2] = 0
  168. help.result[3] = 0
  169. help.result[4] = 0
  170. help.combatResult[1] = 0
  171. help.combatResult[2] = 0
  172. for k in pairs(help.combatResult[3]) do
  173. help.combatResult[3][k] = nil
  174. end
  175. for k in pairs(help.combatResult[5]) do
  176. help.combatResult[5][k] = nil
  177. end
  178. help.extraCombatRecord = nil
  179. RoleAttr.initCombatAttr(help.attr)
  180. end
  181. function setInitAttr(obj, attr)
  182. local initAttr = obj.initAttr
  183. for key in pairs(initAttr) do
  184. initAttr[key] = attr[key] or 0
  185. end
  186. calcAttr(obj)
  187. end
  188. NO_LIMIT_KEY = {
  189. [RoleDefine.ATK_RATE] = 1,
  190. [RoleDefine.DEF_RATE] = 1,
  191. [RoleDefine.HP_ADD_RATE] = 1,
  192. [RoleDefine.ZAOCHENG_HP_ADD_RATE] = 1,
  193. }
  194. local function checkLimit(attr)
  195. for k in pairs(attr) do
  196. if not NO_LIMIT_KEY[k] then
  197. attr[k] = attr[k] < 0 and 0 or attr[k]
  198. end
  199. end
  200. end
  201. local function calcFinalAttr(attr)
  202. attr[RoleDefine.ATK] = attr[RoleDefine.ATK] * (1 + attr[RoleDefine.ATK_RATE]/10000)
  203. attr[RoleDefine.SPEED] = attr[RoleDefine.SPEED] * (1 + attr[RoleDefine.SPEED_RATE]/10000)
  204. end
  205. function calcAttr(obj)
  206. RoleAttr.initCombatAttr(obj.attr)
  207. -- print("[calcAttr] 进入计算 id = ", obj.id)
  208. local attr = obj.attr
  209. local initAttr = obj.initAttr
  210. local sysAttr = obj.sysAttr
  211. local bufferAttr= obj.bufferAttr
  212. local bufferAttr2 = obj.bufferAttr2
  213. local relicAttr = obj.relicAttr
  214. for key, val in pairs(initAttr) do
  215. attr[key] = val
  216. end
  217. -- 加遗物固定属性
  218. for key, val in pairs(relicAttr.FixedAttr) do
  219. attr[key] = attr[key] + val
  220. -- print("[calcAttr] 英雄加遗物固定属性值 id = "..obj.id.." key = "..key.." addval = "..val.." newVal = "..attr[key])
  221. end
  222. -- 加遗物百分比属性
  223. for key, val in pairs(relicAttr.ProAttr) do
  224. -- attr[key] = attr[key] * (1 + (val / 100))
  225. attr[key] = attr[key]+ val
  226. -- print("[calcAttr] 英雄加遗物百分比属性值 id = "..obj.id.." key = "..key.." 百分比val = "..val.." newVal = "..attr[key])
  227. end
  228. for key ,val in pairs(bufferAttr) do
  229. attr[key] = (attr[key] or 0) + val
  230. end
  231. for k ,v in pairs(bufferAttr2) do
  232. for key,val in pairs(v) do
  233. attr[key] = (attr[key] or 0) + val
  234. end
  235. end
  236. for key ,val in pairs(sysAttr) do
  237. attr[key] = (attr[key] or 0) + val
  238. end
  239. calcFinalAttr(attr)
  240. checkLimit(attr)
  241. if attr[RoleDefine.HP_RATE] > 0 and not side2AddTimes[obj.pos] then
  242. obj.hp = getHpMax(obj)
  243. side2AddTimes[obj.pos] = true
  244. end
  245. -- 特殊判断存在防御为0标识
  246. if relicAttr.bSpecialDef == true then
  247. attr[RoleDefine.DEF] = 0
  248. -- print("[calcAttr] 将英雄防御变为0 id = "..obj.id.." 当前防御 = "..attr[RoleDefine.DEF] )
  249. end
  250. end
  251. function getHpMax(obj)
  252. if not obj then return end
  253. if not obj.attr then return end
  254. local hpMax = obj.attr[RoleDefine.HP]
  255. hpMax = math.ceil(hpMax * (1 + obj.attr[RoleDefine.HP_RATE]/10000))
  256. return hpMax
  257. end
  258. function onHpCB(obj,d, attackPos,skillID)
  259. if d == 0 then return end
  260. if obj.hp <= 0 then
  261. -- BeSkill.onDie(obj, d, attackPos)
  262. obj.dietime = os.time()
  263. obj.dieSkill = skillID
  264. obj.dieAtkCnt = CombatImpl.totalAtkCnt
  265. BeSkill.onDie(obj, d, attackPos)
  266. CombatBuff.onExtraCombatRecord(attackPos,1,"kill")
  267. else
  268. BeSkill.onHp(obj, d, attackPos)
  269. end
  270. if d < 0 then
  271. updateValue(obj, RoleDefine.RATE_COMBAT_NOW, -d)
  272. end
  273. end
  274. --获取伤害抵减
  275. local function getDijianHurtRate(obj)
  276. local rate = 0
  277. rate = rate + getValue(obj,RoleDefine.FANSHE_ZHUANGJIA)
  278. return rate
  279. end
  280. local function beforeUpdateHp(obj,sum)
  281. if BeSkill.beforeUpdateHp(obj,sum) then
  282. return
  283. end
  284. if CombatBuff.beforeUpdateHp(obj,sum) then
  285. return
  286. end
  287. --世界boss模式 不掉血量
  288. if CombatImpl.fightMode[1] == CombatDefine.FIGHT_MODE3 and obj.type == CombatDefine.COMBAT_OBJ_TYPE3 then
  289. return
  290. end
  291. return true
  292. end
  293. --血量改变类型
  294. SKILL_HP_TYPE = 1
  295. EXTRA_HP_TYPE = 2
  296. BUFFER_HP_TYPE = 3
  297. function updateHp(obj, value,isRevive,delayCB, attackPos,type)
  298. if obj.helpType ~= CombatDefine.HELP_TYPE0 then
  299. return 0
  300. end
  301. if obj.hp <= 0 and not isRevive then
  302. return 0
  303. end
  304. -- 加血变成减血
  305. if value > 0 then
  306. value = BeSkill.beforeMinusHp(obj, value)
  307. end
  308. --反射装甲buff对技能,额外伤害的抵减
  309. local dijianHurt = 0
  310. local dijianHurtRate = getDijianHurtRate(obj)
  311. if value < 0 and dijianHurtRate > 0 then
  312. if type == SKILL_HP_TYPE or type == EXTRA_HP_TYPE then
  313. dijianHurt = value * dijianHurtRate/10000
  314. value = value - dijianHurt
  315. end
  316. end
  317. if value == 0 then
  318. value = 1
  319. elseif value < 0 then
  320. value = math.floor(value)
  321. else
  322. value = math.ceil(value )
  323. end
  324. if type == SKILL_HP_TYPE then
  325. value = CombatBuff.checkBaohu(obj,value)
  326. end
  327. local sum = obj.hp + value
  328. -- 护盾值检测
  329. if value < 0 then
  330. local huDunValue = CombatBuff.getBuffHuDun(obj)
  331. if huDunValue > 0 then
  332. if huDunValue >= (-value) then
  333. sum = sum + (-value)
  334. CombatBuff.updateHuDun(obj, value)
  335. else
  336. sum = sum + huDunValue
  337. CombatBuff.updateHuDun(obj, -huDunValue)
  338. end
  339. end
  340. end
  341. local hpMax = getHpMax(obj)
  342. if sum > hpMax then
  343. sum = hpMax
  344. end
  345. local d = sum - obj.hp
  346. if d < 0 then
  347. local hurt = -d
  348. if hurt > obj.hp then
  349. hurt = obj.hp
  350. end
  351. d = -hurt
  352. end
  353. if sum < 0 then
  354. sum = 0
  355. end
  356. local ret = beforeUpdateHp(obj,sum)
  357. if ret then
  358. obj.hp = sum
  359. end
  360. if not delayCB then
  361. onHpCB(obj,d, attackPos)
  362. end
  363. --[[ if attackPos > 12 or obj.pos > 12 then
  364. print(" moshou hurt ", d , obj.pos ,attackPos)
  365. end
  366. ]]--
  367. if attackPos and d < 0 then
  368. CombatImpl.setObjBearResult(obj, d)
  369. end
  370. if isRevive == true and d > 0 then
  371. CombatImpl.setObjResult(obj.pos, d)
  372. elseif attackPos then
  373. CombatImpl.setObjResult(attackPos, d)
  374. end
  375. if d > 0 then
  376. obj.combatResult[2] = obj.combatResult[2] + d
  377. else
  378. obj.combatResult[1] = obj.combatResult[1] + d
  379. end
  380. if attackPos then
  381. obj.combatResult[3][attackPos] = obj.combatResult[3][attackPos] or {}
  382. if dijianHurt > 0 then
  383. obj.combatResult[3][attackPos][2] = obj.combatResult[3][attackPos][2] or 0
  384. obj.combatResult[3][attackPos][2] = obj.combatResult[3][attackPos][2] + dijianHurt
  385. elseif dijianHurt < 0 then
  386. obj.combatResult[3][attackPos][1] = obj.combatResult[3][attackPos][1] or 0
  387. obj.combatResult[3][attackPos][1] = obj.combatResult[3][attackPos][1] + dijianHurt
  388. end
  389. local attacker = CombatImpl.objList[attackPos]
  390. if attacker and d < 0 then
  391. attacker.combatResult[4] = attacker.combatResult[4] + d
  392. attacker.combatResult[5] = attacker.combatResult[5] or {}
  393. attacker.combatResult[5][obj.pos] = d
  394. if type == EXTRA_HP_TYPE then
  395. updateValue(attacker, RoleDefine.HURT_COMBAT_NOW, -d)
  396. end
  397. end
  398. end
  399. -- if d == 0 then
  400. -- value = 0
  401. -- end
  402. return d,value
  403. end
  404. function updateMp(obj, value)
  405. value = math.floor(value + 0.5)
  406. local sum = obj.mp + value
  407. sum = sum < 0 and 0 or sum
  408. local d = sum - obj.mp
  409. obj.mp = sum
  410. return d
  411. end
  412. function getValue(obj,key)
  413. if obj.isPet then
  414. return 0
  415. end
  416. if key == RoleDefine.SUB_HP_COMBAT then
  417. local hpNow = obj.hp or 0
  418. local hpMax = getHpMax(obj) or 0
  419. if hpMax <= 0 then
  420. -- print(string.format("战斗数据错误, obj.id: %d, obj.pos: %d", obj.id, obj.pos))
  421. return 0
  422. end
  423. local res = hpNow / hpMax
  424. res = math.floor(res * 10000) --取到小数点后四位,再转成整数
  425. return res
  426. else
  427. return obj.attr[key] or 0
  428. end
  429. end
  430. function setValue(obj,key,value)
  431. obj.attr[key] = value
  432. end
  433. function updateValue(obj,key,value)
  434. obj.attr[key] = obj.attr[key] or 0
  435. obj.attr[key] = obj.attr[key] + value
  436. end
  437. function getJobHurtRate(attacker,defender)
  438. local attr = attacker.attr
  439. --职业相关伤害加成
  440. local extraHurtRate = 0
  441. if defender.job == CombatDefine.JOB_TYPE1 then
  442. extraHurtRate = extraHurtRate + attr[RoleDefine.JOB_HURT_RATE1]
  443. elseif defender.job == CombatDefine.JOB_TYPE2 then
  444. extraHurtRate = extraHurtRate + attr[RoleDefine.JOB_HURT_RATE2]
  445. elseif defender.job == CombatDefine.JOB_TYPE3 then
  446. extraHurtRate = extraHurtRate + attr[RoleDefine.JOB_HURT_RATE3]
  447. elseif defender.job == CombatDefine.JOB_TYPE4 then
  448. extraHurtRate = extraHurtRate + attr[RoleDefine.JOB_HURT_RATE4]
  449. elseif defender.job == CombatDefine.JOB_TYPE5 then
  450. extraHurtRate = extraHurtRate + attr[RoleDefine.JOB_HURT_RATE5]
  451. end
  452. -- 物理/魔法伤害加成
  453. if attacker.hurtType == CombatDefine.PHY_HURT_TYPE then
  454. extraHurtRate = extraHurtRate + (attr[RoleDefine.PHY_HURT_ADD_RATE] or 0)
  455. extraHurtRate = extraHurtRate + (defender.attr[RoleDefine.AT_PHY_HURT_ADD_RATE] or 0)
  456. elseif attacker.hurtType == CombatDefine.MAGIC_HURT_TYPE then
  457. extraHurtRate = extraHurtRate + (attr[RoleDefine.MAGIC_HURT_ADD_RATE] or 0)
  458. extraHurtRate = extraHurtRate + (defender.attr[RoleDefine.AT_MAGIC_HURT_ADD_RATE] or 0)
  459. end
  460. return extraHurtRate
  461. end
  462. function getStatusHurtRate(attacker,defender)
  463. local status = CombatBuff.getStatus(defender)
  464. local attr = attacker.attr
  465. --状态相关伤害加成
  466. local extraHurtRate = 0
  467. if status["xuanyun"] or status["xuanyun2"] then
  468. extraHurtRate = extraHurtRate + attr[RoleDefine.STATUS_HURT_RATE1]
  469. end
  470. if status["shihua"] then
  471. extraHurtRate = extraHurtRate + attr[RoleDefine.STATUS_HURT_RATE2]
  472. end
  473. if status["bingdong"] then
  474. extraHurtRate = extraHurtRate + attr[RoleDefine.STATUS_HURT_RATE3]
  475. end
  476. if status["jinmo"] then
  477. extraHurtRate = extraHurtRate + attr[RoleDefine.STATUS_HURT_RATE4]
  478. end
  479. if status["ranshao"] then
  480. extraHurtRate = extraHurtRate + attr[RoleDefine.STATUS_HURT_RATE5]
  481. end
  482. if status["liuxue"] then
  483. extraHurtRate = extraHurtRate + attr[RoleDefine.STATUS_HURT_RATE6]
  484. end
  485. if status["liuxue2"] then
  486. extraHurtRate = extraHurtRate + attr[RoleDefine.STATUS_HURT_RATE6]
  487. end
  488. if status["zhongdu"] then
  489. extraHurtRate = extraHurtRate + attr[RoleDefine.STATUS_HURT_RATE7]
  490. end
  491. return extraHurtRate
  492. end
  493. function getStatusBaoji(attacker,defender)
  494. local status = CombatBuff.getStatus(defender)
  495. local attr = attacker.attr
  496. --状态相关暴击率增加
  497. local baoji = 0
  498. if status["xuanyun"] or status["xuanyun2"] then
  499. baoji = baoji + attr[RoleDefine.STATUS_BAOJI_RATE1]
  500. end
  501. if status["shihua"] then
  502. baoji = baoji + attr[RoleDefine.STATUS_BAOJI_RATE2]
  503. end
  504. if status["bingdong"] then
  505. baoji = baoji + attr[RoleDefine.STATUS_BAOJI_RATE3]
  506. end
  507. if status["jinmo"] then
  508. baoji = baoji + attr[RoleDefine.STATUS_BAOJI_RATE4]
  509. end
  510. if status["ranshao"] then
  511. baoji = baoji + attr[RoleDefine.STATUS_BAOJI_RATE5]
  512. end
  513. if status["ranshao1"] then
  514. baoji = baoji + attr[RoleDefine.STATUS_BAOJI_RATE5]
  515. end
  516. if status["liuxue"] then
  517. baoji = baoji + attr[RoleDefine.STATUS_BAOJI_RATE6]
  518. end
  519. if status["liuxue2"] then
  520. baoji = baoji + attr[RoleDefine.STATUS_BAOJI_RATE6]
  521. end
  522. if status["zhongdu"] then
  523. baoji = baoji + attr[RoleDefine.STATUS_BAOJI_RATE7]
  524. end
  525. if status["jiansu"] then
  526. baoji = baoji + attr[RoleDefine.STATUS_BAOJI_RATE8]
  527. end
  528. return baoji
  529. end
  530. function getStatusBaojiHurtRate(attacker,defender)
  531. local status = CombatBuff.getStatus(defender)
  532. local attr = attacker.attr
  533. --状态相关暴击率增加
  534. local baoji = 0
  535. if status["xuanyun"] or status["xuanyun2"] then
  536. baoji = baoji + attr[RoleDefine.STATUS_BAOJI_HURT_RATE1]
  537. elseif status["shihua"] then
  538. baoji = baoji + attr[RoleDefine.STATUS_BAOJI_HURT_RATE2]
  539. elseif status["bingdong"] then
  540. baoji = baoji + attr[RoleDefine.STATUS_BAOJI_HURT_RATE3]
  541. elseif status["jinmo"] then
  542. baoji = baoji + attr[RoleDefine.STATUS_BAOJI_HURT_RATE4]
  543. elseif status["ranshao"] then
  544. baoji = baoji + attr[RoleDefine.STATUS_BAOJI_HURT_RATE5]
  545. elseif status["ranshao1"] then
  546. baoji = baoji + attr[RoleDefine.STATUS_BAOJI_HURT_RATE5]
  547. elseif status["liuxue"] then
  548. baoji = baoji + attr[RoleDefine.STATUS_BAOJI_HURT_RATE6]
  549. elseif status["liuxue2"] then
  550. baoji = baoji + attr[RoleDefine.STATUS_BAOJI_HURT_RATE6]
  551. elseif status["zhongdu"] then
  552. baoji = baoji + attr[RoleDefine.STATUS_BAOJI_HURT_RATE7]
  553. elseif status["jiansu"] then
  554. baoji = baoji + attr[RoleDefine.STATUS_BAOJI_HURT_RATE8]
  555. end
  556. return baoji
  557. end
  558. function getJobJianshangRate(attacker,defender)
  559. local job = attacker.job
  560. local attr = defender.attr
  561. local jianshangRate = 0
  562. --职业相关伤害加成
  563. if job == CombatDefine.JOB_TYPE1 then
  564. jianshangRate = jianshangRate + attr[RoleDefine.JOB_JIANSHANG_RATE1]
  565. elseif job == CombatDefine.JOB_TYPE2 then
  566. jianshangRate = jianshangRate + attr[RoleDefine.JOB_JIANSHANG_RATE2]
  567. elseif job == CombatDefine.JOB_TYPE3 then
  568. jianshangRate = jianshangRate + attr[RoleDefine.JOB_JIANSHANG_RATE3]
  569. elseif job == CombatDefine.JOB_TYPE4 then
  570. jianshangRate = jianshangRate + attr[RoleDefine.JOB_JIANSHANG_RATE4]
  571. elseif job == CombatDefine.JOB_TYPE5 then
  572. jianshangRate = jianshangRate + attr[RoleDefine.JOB_JIANSHANG_RATE5]
  573. end
  574. return jianshangRate
  575. end
  576. function getCampJianshangRate(attacker,defender)
  577. local camp = attacker.camp
  578. local attr = defender.attr
  579. local jianshangRate = 0
  580. --阵营相关减伤
  581. if camp == CombatDefine.CAMP_TYPE1 then
  582. jianshangRate = jianshangRate + attr[RoleDefine.CAMP_JIANSHANG_RATE1]
  583. elseif camp == CombatDefine.CAMP_TYPE2 then
  584. jianshangRate = jianshangRate + attr[RoleDefine.CAMP_JIANSHANG_RATE2]
  585. elseif camp == CombatDefine.CAMP_TYPE3 then
  586. jianshangRate = jianshangRate + attr[RoleDefine.CAMP_JIANSHANG_RATE3]
  587. elseif camp == CombatDefine.CAMP_TYPE4 then
  588. jianshangRate = jianshangRate + attr[RoleDefine.CAMP_JIANSHANG_RATE4]
  589. elseif camp == CombatDefine.CAMP_TYPE5 then
  590. jianshangRate = jianshangRate + attr[RoleDefine.CAMP_JIANSHANG_RATE5]
  591. end
  592. return jianshangRate
  593. end
  594. function getCampHurtRate(attacker,defender)
  595. local attr = attacker.attr
  596. --阵营相关伤害加成
  597. local extraHurtRate = 0
  598. if defender.camp == CombatDefine.CAMP_TYPE1 then
  599. extraHurtRate = extraHurtRate + attr[RoleDefine.CAMP_HURT_RATE1]
  600. elseif defender.camp == CombatDefine.CAMP_TYPE2 then
  601. extraHurtRate = extraHurtRate + attr[RoleDefine.CAMP_HURT_RATE2]
  602. elseif defender.camp == CombatDefine.CAMP_TYPE3 then
  603. extraHurtRate = extraHurtRate + attr[RoleDefine.CAMP_HURT_RATE3]
  604. elseif defender.camp == CombatDefine.CAMP_TYPE4 then
  605. extraHurtRate = extraHurtRate + attr[RoleDefine.CAMP_HURT_RATE4]
  606. elseif defender.camp == CombatDefine.CAMP_TYPE5 then
  607. extraHurtRate = extraHurtRate + attr[RoleDefine.CAMP_HURT_RATE5]
  608. end
  609. return extraHurtRate
  610. end