CombatObj.lua 21 KB

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