CombatObj.lua 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683
  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] + val
  230. end
  231. for k ,v in pairs(bufferAttr2) do
  232. for key,val in pairs(v) do
  233. attr[key] = attr[key] + val
  234. end
  235. end
  236. for key ,val in pairs(sysAttr) do
  237. attr[key] = attr[key] + 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. CombatBuff.onExtraCombatRecord(attackPos,1,"kill")
  266. else
  267. BeSkill.onHp(obj, d, attackPos)
  268. end
  269. if d < 0 then
  270. updateValue(obj, RoleDefine.RATE_COMBAT_NOW, -d)
  271. end
  272. end
  273. --获取伤害抵减
  274. local function getDijianHurtRate(obj)
  275. local rate = 0
  276. rate = rate + getValue(obj,RoleDefine.FANSHE_ZHUANGJIA)
  277. return rate
  278. end
  279. local function beforeUpdateHp(obj,sum)
  280. if BeSkill.beforeUpdateHp(obj,sum) then
  281. return
  282. end
  283. if CombatBuff.beforeUpdateHp(obj,sum) then
  284. return
  285. end
  286. --世界boss模式 不掉血量
  287. if CombatImpl.fightMode[1] == CombatDefine.FIGHT_MODE3 and obj.type == CombatDefine.COMBAT_OBJ_TYPE3 then
  288. return
  289. end
  290. return true
  291. end
  292. --血量改变类型
  293. SKILL_HP_TYPE = 1
  294. EXTRA_HP_TYPE = 2
  295. BUFFER_HP_TYPE = 3
  296. function updateHp(obj, value,isRevive,delayCB, attackPos,type)
  297. if obj.helpType ~= CombatDefine.HELP_TYPE0 then
  298. return 0
  299. end
  300. if obj.hp <= 0 and not isRevive then
  301. return 0
  302. end
  303. -- 加血变成减血
  304. if value > 0 then
  305. value = BeSkill.beforeMinusHp(obj, value)
  306. end
  307. --反射装甲buff对技能,额外伤害的抵减
  308. local dijianHurt = 0
  309. local dijianHurtRate = getDijianHurtRate(obj)
  310. if value < 0 and dijianHurtRate > 0 then
  311. if type == SKILL_HP_TYPE or type == EXTRA_HP_TYPE then
  312. dijianHurt = value * dijianHurtRate/10000
  313. value = value - dijianHurt
  314. end
  315. end
  316. if value == 0 then
  317. value = 1
  318. elseif value < 0 then
  319. value = math.floor(value)
  320. else
  321. value = math.ceil(value )
  322. end
  323. if type == SKILL_HP_TYPE then
  324. value = CombatBuff.checkBaohu(obj,value)
  325. end
  326. local sum = obj.hp + value
  327. -- 护盾值检测
  328. if value < 0 then
  329. local huDunValue = CombatBuff.getBuffHuDun(obj)
  330. if huDunValue > 0 then
  331. if huDunValue >= (-value) then
  332. sum = sum + (-value)
  333. CombatBuff.updateHuDun(obj, value)
  334. else
  335. sum = sum + huDunValue
  336. CombatBuff.updateHuDun(obj, -huDunValue)
  337. end
  338. end
  339. end
  340. local hpMax = getHpMax(obj)
  341. if sum > hpMax then
  342. sum = hpMax
  343. end
  344. local d = sum - obj.hp
  345. if d < 0 then
  346. local hurt = -d
  347. if hurt > obj.hp then
  348. hurt = obj.hp
  349. end
  350. d = -hurt
  351. end
  352. if sum < 0 then
  353. sum = 0
  354. end
  355. local ret = beforeUpdateHp(obj,sum)
  356. if ret then
  357. obj.hp = sum
  358. end
  359. if not delayCB then
  360. onHpCB(obj,d, attackPos)
  361. end
  362. --[[ if attackPos > 12 or obj.pos > 12 then
  363. print(" moshou hurt ", d , obj.pos ,attackPos)
  364. end
  365. ]]--
  366. if attackPos and d < 0 then
  367. CombatImpl.setObjBearResult(obj, d)
  368. end
  369. if isRevive == true and d > 0 then
  370. CombatImpl.setObjResult(obj.pos, d)
  371. elseif attackPos then
  372. CombatImpl.setObjResult(attackPos, d)
  373. end
  374. if d > 0 then
  375. obj.combatResult[2] = obj.combatResult[2] + d
  376. else
  377. obj.combatResult[1] = obj.combatResult[1] + d
  378. end
  379. if attackPos then
  380. obj.combatResult[3][attackPos] = obj.combatResult[3][attackPos] or {}
  381. if dijianHurt > 0 then
  382. obj.combatResult[3][attackPos][2] = obj.combatResult[3][attackPos][2] or 0
  383. obj.combatResult[3][attackPos][2] = obj.combatResult[3][attackPos][2] + dijianHurt
  384. elseif dijianHurt < 0 then
  385. obj.combatResult[3][attackPos][1] = obj.combatResult[3][attackPos][1] or 0
  386. obj.combatResult[3][attackPos][1] = obj.combatResult[3][attackPos][1] + dijianHurt
  387. end
  388. local attacker = CombatImpl.objList[attackPos]
  389. if attacker and d < 0 then
  390. attacker.combatResult[4] = attacker.combatResult[4] + d
  391. attacker.combatResult[5] = attacker.combatResult[5] or {}
  392. attacker.combatResult[5][obj.pos] = d
  393. if type == EXTRA_HP_TYPE then
  394. updateValue(attacker, RoleDefine.HURT_COMBAT_NOW, -d)
  395. end
  396. end
  397. end
  398. return d,value
  399. end
  400. function updateMp(obj, value)
  401. value = math.floor(value + 0.5)
  402. local sum = obj.mp + value
  403. sum = sum < 0 and 0 or sum
  404. local d = sum - obj.mp
  405. obj.mp = sum
  406. return d
  407. end
  408. function getValue(obj,key)
  409. if obj.isPet then
  410. return 0
  411. end
  412. if key == RoleDefine.SUB_HP_COMBAT then
  413. local hpNow = obj.hp or 0
  414. local hpMax = getHpMax(obj) or 0
  415. if hpMax <= 0 then
  416. -- print(string.format("战斗数据错误, obj.id: %d, obj.pos: %d", obj.id, obj.pos))
  417. return 0
  418. end
  419. local res = hpNow / hpMax
  420. res = math.floor(res * 10000) --取到小数点后四位,再转成整数
  421. return res
  422. else
  423. return obj.attr[key] or 0
  424. end
  425. end
  426. function setValue(obj,key,value)
  427. obj.attr[key] = value
  428. end
  429. function updateValue(obj,key,value)
  430. obj.attr[key] = obj.attr[key] or 0
  431. obj.attr[key] = obj.attr[key] + value
  432. end
  433. function getJobHurtRate(attacker,defender)
  434. local attr = attacker.attr
  435. --职业相关伤害加成
  436. local extraHurtRate = 0
  437. if defender.job == CombatDefine.JOB_TYPE1 then
  438. extraHurtRate = extraHurtRate + attr[RoleDefine.JOB_HURT_RATE1]
  439. elseif defender.job == CombatDefine.JOB_TYPE2 then
  440. extraHurtRate = extraHurtRate + attr[RoleDefine.JOB_HURT_RATE2]
  441. elseif defender.job == CombatDefine.JOB_TYPE3 then
  442. extraHurtRate = extraHurtRate + attr[RoleDefine.JOB_HURT_RATE3]
  443. elseif defender.job == CombatDefine.JOB_TYPE4 then
  444. extraHurtRate = extraHurtRate + attr[RoleDefine.JOB_HURT_RATE4]
  445. elseif defender.job == CombatDefine.JOB_TYPE5 then
  446. extraHurtRate = extraHurtRate + attr[RoleDefine.JOB_HURT_RATE5]
  447. end
  448. -- 物理/魔法伤害加成
  449. if attacker.hurtType == CombatDefine.PHY_HURT_TYPE then
  450. extraHurtRate = extraHurtRate + (attr[RoleDefine.PHY_HURT_ADD_RATE] or 0)
  451. extraHurtRate = extraHurtRate + (defender.attr[RoleDefine.AT_PHY_HURT_ADD_RATE] or 0)
  452. elseif attacker.hurtType == CombatDefine.MAGIC_HURT_TYPE then
  453. extraHurtRate = extraHurtRate + (attr[RoleDefine.MAGIC_HURT_ADD_RATE] or 0)
  454. extraHurtRate = extraHurtRate + (defender.attr[RoleDefine.AT_MAGIC_HURT_ADD_RATE] or 0)
  455. end
  456. return extraHurtRate
  457. end
  458. function getStatusHurtRate(attacker,defender)
  459. local status = CombatBuff.getStatus(defender)
  460. local attr = attacker.attr
  461. --状态相关伤害加成
  462. local extraHurtRate = 0
  463. if status["xuanyun"] then
  464. extraHurtRate = extraHurtRate + attr[RoleDefine.STATUS_HURT_RATE1]
  465. end
  466. if status["shihua"] then
  467. extraHurtRate = extraHurtRate + attr[RoleDefine.STATUS_HURT_RATE2]
  468. end
  469. if status["bingdong"] then
  470. extraHurtRate = extraHurtRate + attr[RoleDefine.STATUS_HURT_RATE3]
  471. end
  472. if status["jinmo"] then
  473. extraHurtRate = extraHurtRate + attr[RoleDefine.STATUS_HURT_RATE4]
  474. end
  475. if status["ranshao"] then
  476. extraHurtRate = extraHurtRate + attr[RoleDefine.STATUS_HURT_RATE5]
  477. end
  478. if status["liuxue"] then
  479. extraHurtRate = extraHurtRate + attr[RoleDefine.STATUS_HURT_RATE6]
  480. end
  481. if status["liuxue2"] then
  482. extraHurtRate = extraHurtRate + attr[RoleDefine.STATUS_HURT_RATE6]
  483. end
  484. if status["zhongdu"] then
  485. extraHurtRate = extraHurtRate + attr[RoleDefine.STATUS_HURT_RATE7]
  486. end
  487. return extraHurtRate
  488. end
  489. function getStatusBaoji(attacker,defender)
  490. local status = CombatBuff.getStatus(defender)
  491. local attr = attacker.attr
  492. --状态相关暴击率增加
  493. local baoji = 0
  494. if status["xuanyun"] then
  495. baoji = baoji + attr[RoleDefine.STATUS_BAOJI_RATE1]
  496. end
  497. if status["shihua"] then
  498. baoji = baoji + attr[RoleDefine.STATUS_BAOJI_RATE2]
  499. end
  500. if status["bingdong"] then
  501. baoji = baoji + attr[RoleDefine.STATUS_BAOJI_RATE3]
  502. end
  503. if status["jinmo"] then
  504. baoji = baoji + attr[RoleDefine.STATUS_BAOJI_RATE4]
  505. end
  506. if status["ranshao"] then
  507. baoji = baoji + attr[RoleDefine.STATUS_BAOJI_RATE5]
  508. end
  509. if status["ranshao1"] then
  510. baoji = baoji + attr[RoleDefine.STATUS_BAOJI_RATE5]
  511. end
  512. if status["liuxue"] then
  513. baoji = baoji + attr[RoleDefine.STATUS_BAOJI_RATE6]
  514. end
  515. if status["liuxue2"] then
  516. baoji = baoji + attr[RoleDefine.STATUS_BAOJI_RATE6]
  517. end
  518. if status["zhongdu"] then
  519. baoji = baoji + attr[RoleDefine.STATUS_BAOJI_RATE7]
  520. end
  521. if status["jiansu"] then
  522. baoji = baoji + attr[RoleDefine.STATUS_BAOJI_RATE8]
  523. end
  524. return baoji
  525. end
  526. function getStatusBaojiHurtRate(attacker,defender)
  527. local status = CombatBuff.getStatus(defender)
  528. local attr = attacker.attr
  529. --状态相关暴击率增加
  530. local baoji = 0
  531. if status["xuanyun"] then
  532. baoji = baoji + attr[RoleDefine.STATUS_BAOJI_HURT_RATE1]
  533. elseif status["shihua"] then
  534. baoji = baoji + attr[RoleDefine.STATUS_BAOJI_HURT_RATE2]
  535. elseif status["bingdong"] then
  536. baoji = baoji + attr[RoleDefine.STATUS_BAOJI_HURT_RATE3]
  537. elseif status["jinmo"] then
  538. baoji = baoji + attr[RoleDefine.STATUS_BAOJI_HURT_RATE4]
  539. elseif status["ranshao"] then
  540. baoji = baoji + attr[RoleDefine.STATUS_BAOJI_HURT_RATE5]
  541. elseif status["ranshao1"] then
  542. baoji = baoji + attr[RoleDefine.STATUS_BAOJI_HURT_RATE5]
  543. elseif status["liuxue"] then
  544. baoji = baoji + attr[RoleDefine.STATUS_BAOJI_HURT_RATE6]
  545. elseif status["liuxue2"] then
  546. baoji = baoji + attr[RoleDefine.STATUS_BAOJI_HURT_RATE6]
  547. elseif status["zhongdu"] then
  548. baoji = baoji + attr[RoleDefine.STATUS_BAOJI_HURT_RATE7]
  549. elseif status["jiansu"] then
  550. baoji = baoji + attr[RoleDefine.STATUS_BAOJI_HURT_RATE8]
  551. end
  552. return baoji
  553. end
  554. function getJobJianshangRate(attacker,defender)
  555. local job = attacker.job
  556. local attr = defender.attr
  557. local jianshangRate = 0
  558. --职业相关伤害加成
  559. if job == CombatDefine.JOB_TYPE1 then
  560. jianshangRate = jianshangRate + attr[RoleDefine.JOB_JIANSHANG_RATE1]
  561. elseif job == CombatDefine.JOB_TYPE2 then
  562. jianshangRate = jianshangRate + attr[RoleDefine.JOB_JIANSHANG_RATE2]
  563. elseif job == CombatDefine.JOB_TYPE3 then
  564. jianshangRate = jianshangRate + attr[RoleDefine.JOB_JIANSHANG_RATE3]
  565. elseif job == CombatDefine.JOB_TYPE4 then
  566. jianshangRate = jianshangRate + attr[RoleDefine.JOB_JIANSHANG_RATE4]
  567. elseif job == CombatDefine.JOB_TYPE5 then
  568. jianshangRate = jianshangRate + attr[RoleDefine.JOB_JIANSHANG_RATE5]
  569. end
  570. return jianshangRate
  571. end
  572. function getCampJianshangRate(attacker,defender)
  573. local camp = attacker.camp
  574. local attr = defender.attr
  575. local jianshangRate = 0
  576. --阵营相关减伤
  577. if camp == CombatDefine.CAMP_TYPE1 then
  578. jianshangRate = jianshangRate + attr[RoleDefine.CAMP_JIANSHANG_RATE1]
  579. elseif camp == CombatDefine.CAMP_TYPE2 then
  580. jianshangRate = jianshangRate + attr[RoleDefine.CAMP_JIANSHANG_RATE2]
  581. elseif camp == CombatDefine.CAMP_TYPE3 then
  582. jianshangRate = jianshangRate + attr[RoleDefine.CAMP_JIANSHANG_RATE3]
  583. elseif camp == CombatDefine.CAMP_TYPE4 then
  584. jianshangRate = jianshangRate + attr[RoleDefine.CAMP_JIANSHANG_RATE4]
  585. elseif camp == CombatDefine.CAMP_TYPE5 then
  586. jianshangRate = jianshangRate + attr[RoleDefine.CAMP_JIANSHANG_RATE5]
  587. end
  588. return jianshangRate
  589. end
  590. function getCampHurtRate(attacker,defender)
  591. local attr = attacker.attr
  592. --阵营相关伤害加成
  593. local extraHurtRate = 0
  594. if defender.camp == CombatDefine.CAMP_TYPE1 then
  595. extraHurtRate = extraHurtRate + attr[RoleDefine.CAMP_HURT_RATE1]
  596. elseif defender.camp == CombatDefine.CAMP_TYPE2 then
  597. extraHurtRate = extraHurtRate + attr[RoleDefine.CAMP_HURT_RATE2]
  598. elseif defender.camp == CombatDefine.CAMP_TYPE3 then
  599. extraHurtRate = extraHurtRate + attr[RoleDefine.CAMP_HURT_RATE3]
  600. elseif defender.camp == CombatDefine.CAMP_TYPE4 then
  601. extraHurtRate = extraHurtRate + attr[RoleDefine.CAMP_HURT_RATE4]
  602. elseif defender.camp == CombatDefine.CAMP_TYPE5 then
  603. extraHurtRate = extraHurtRate + attr[RoleDefine.CAMP_HURT_RATE5]
  604. end
  605. return extraHurtRate
  606. end