CombatObj.lua 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775
  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. local extraHandle
  376. local targetBuffCMD
  377. local isAbsorb = false
  378. if value < 0 and (type == SKILL_HP_TYPE or type == EXTRA_HP_TYPE) then -- 是扣血, 并且来自技能本身或技能特殊效果
  379. local attacker = CombatImpl.objList[attackPos]
  380. if attacker and attacker.side ~= obj.side then -- 攻击方是英雄, 并且是敌方英雄
  381. local isHaveTargetBuff = false
  382. if attacker.hurtType and attacker.hurtType == CombatDefine.PHY_HURT_TYPE then
  383. isHaveTargetBuff = CombatBuff.isStatus(obj, {"xishouPhysical"})
  384. targetBuffCMD = "xishouPhysical"
  385. elseif attacker.hurtType and attacker.hurtType == CombatDefine.MAGIC_HURT_TYPE then
  386. isHaveTargetBuff = CombatBuff.isStatus(obj, {"xishouMagic"})
  387. targetBuffCMD = "xishouMagic"
  388. end
  389. if isHaveTargetBuff then -- 拥有指定buff
  390. isAbsorb = true
  391. extraHandle = extraHandle or {}
  392. extraHandle[1] = 1
  393. extraHandle[2] = targetBuffCMD
  394. end
  395. end
  396. end
  397. -- 护盾值检测
  398. if value < 0 and not isAbsorb then
  399. local huDunValue = CombatBuff.getBuffHuDun(obj)
  400. if huDunValue > 0 then
  401. print(string.format("========英雄 %d, 英雄当前血量:%s 受到伤害 %s,有护盾, 护盾值为: %s\n", obj.id, obj.hp, value, huDunValue))
  402. if huDunValue >= (-value) then
  403. sum = sum + (-value)
  404. CombatBuff.updateHuDun(obj, value)
  405. else
  406. sum = sum + huDunValue
  407. CombatBuff.updateHuDun(obj, -huDunValue)
  408. end
  409. print(string.format("========抵消伤害后护盾值为: %s\n", CombatBuff.getBuffHuDun(obj)))
  410. end
  411. end
  412. -- 加血上限判断
  413. local hpMax = getHpMax(obj)
  414. if sum > hpMax then
  415. sum = hpMax
  416. end
  417. local d = sum - obj.hp
  418. if d < 0 then
  419. local hurt = -d
  420. if hurt > obj.hp then
  421. hurt = obj.hp
  422. end
  423. d = -hurt
  424. end
  425. if isAbsorb then
  426. print("========有吸收buff=======", obj.id, obj.hp, -d)
  427. extraHandle[3] = d
  428. d = 0
  429. -- CombatBuff.AddHPByXishouBuff(obj, -d, targetBuffCMD)
  430. -- return 0, value
  431. end
  432. if sum < 0 then
  433. sum = 0
  434. end
  435. local ret = beforeUpdateHp(obj, sum, value, d)
  436. if ret and not isAbsorb then
  437. obj.hp = sum
  438. end
  439. if not delayCB then
  440. onHpCB(obj,d, attackPos)
  441. end
  442. --[[ if attackPos > 12 or obj.pos > 12 then
  443. print(" moshou hurt ", d , obj.pos ,attackPos)
  444. end
  445. ]]--
  446. if attackPos and d < 0 then
  447. CombatImpl.setObjBearResult(obj, d)
  448. end
  449. if isRevive == true and d > 0 then
  450. CombatImpl.setObjResult(obj.pos, d)
  451. elseif attackPos then
  452. CombatImpl.setObjResult(attackPos, d)
  453. end
  454. if d > 0 then
  455. obj.combatResult[2] = obj.combatResult[2] + d
  456. else
  457. obj.combatResult[1] = obj.combatResult[1] + d
  458. end
  459. if attackPos then
  460. obj.combatResult[3][attackPos] = obj.combatResult[3][attackPos] or {}
  461. if dijianHurt > 0 then
  462. obj.combatResult[3][attackPos][2] = obj.combatResult[3][attackPos][2] or 0
  463. obj.combatResult[3][attackPos][2] = obj.combatResult[3][attackPos][2] + dijianHurt
  464. elseif dijianHurt < 0 then
  465. obj.combatResult[3][attackPos][1] = obj.combatResult[3][attackPos][1] or 0
  466. obj.combatResult[3][attackPos][1] = obj.combatResult[3][attackPos][1] + dijianHurt
  467. end
  468. local attacker = CombatImpl.objList[attackPos]
  469. if attacker and d < 0 then
  470. attacker.combatResult[4] = attacker.combatResult[4] + d
  471. attacker.combatResult[5] = attacker.combatResult[5] or {}
  472. attacker.combatResult[5][obj.pos] = d
  473. if type == EXTRA_HP_TYPE then
  474. updateValue(attacker, RoleDefine.HURT_COMBAT_NOW, -d)
  475. end
  476. end
  477. end
  478. return d,value, extraHandle
  479. end
  480. function updateMp(obj, value)
  481. value = math.floor(value + 0.5)
  482. local sum = obj.mp + value
  483. sum = sum < 0 and 0 or sum
  484. local d = sum - obj.mp
  485. obj.mp = sum
  486. return d
  487. end
  488. function getValue(obj,key)
  489. if obj.isPet then
  490. return 0
  491. end
  492. if key == RoleDefine.SUB_HP_COMBAT then
  493. local hpNow = obj.hp or 0
  494. local hpMax = getHpMax(obj) or 0
  495. if hpMax <= 0 then
  496. -- print(string.format("战斗数据错误, obj.id: %d, obj.pos: %d", obj.id, obj.pos))
  497. return 0
  498. end
  499. local res = hpNow / hpMax
  500. res = math.floor(res * 10000) --取到小数点后四位,再转成整数
  501. return res
  502. else
  503. return obj.attr[key] or 0
  504. end
  505. end
  506. function setValue(obj,key,value)
  507. obj.attr[key] = value
  508. end
  509. function updateValue(obj,key,value)
  510. obj.attr[key] = obj.attr[key] or 0
  511. obj.attr[key] = obj.attr[key] + value
  512. end
  513. function getJobHurtRate(attacker,defender)
  514. local attr = attacker.attr
  515. --职业相关伤害加成
  516. local extraHurtRate = 0
  517. if defender.job == CombatDefine.JOB_TYPE1 then
  518. extraHurtRate = extraHurtRate + attr[RoleDefine.JOB_HURT_RATE1]
  519. elseif defender.job == CombatDefine.JOB_TYPE2 then
  520. extraHurtRate = extraHurtRate + attr[RoleDefine.JOB_HURT_RATE2]
  521. elseif defender.job == CombatDefine.JOB_TYPE3 then
  522. extraHurtRate = extraHurtRate + attr[RoleDefine.JOB_HURT_RATE3]
  523. elseif defender.job == CombatDefine.JOB_TYPE4 then
  524. extraHurtRate = extraHurtRate + attr[RoleDefine.JOB_HURT_RATE4]
  525. elseif defender.job == CombatDefine.JOB_TYPE5 then
  526. extraHurtRate = extraHurtRate + attr[RoleDefine.JOB_HURT_RATE5]
  527. end
  528. -- 物理/魔法伤害加成
  529. if attacker.hurtType == CombatDefine.PHY_HURT_TYPE then
  530. extraHurtRate = extraHurtRate + (attr[RoleDefine.PHY_HURT_ADD_RATE] or 0)
  531. extraHurtRate = extraHurtRate + (defender.attr[RoleDefine.AT_PHY_HURT_ADD_RATE] or 0)
  532. elseif attacker.hurtType == CombatDefine.MAGIC_HURT_TYPE then
  533. extraHurtRate = extraHurtRate + (attr[RoleDefine.MAGIC_HURT_ADD_RATE] or 0)
  534. extraHurtRate = extraHurtRate + (defender.attr[RoleDefine.AT_MAGIC_HURT_ADD_RATE] or 0)
  535. end
  536. return extraHurtRate
  537. end
  538. function getStatusHurtRate(attacker,defender)
  539. local status = CombatBuff.getStatus(defender)
  540. local attr = attacker.attr
  541. --状态相关伤害加成
  542. local extraHurtRate = 0
  543. if status["xuanyun"] or status["xuanyun2"] then
  544. extraHurtRate = extraHurtRate + attr[RoleDefine.STATUS_HURT_RATE1]
  545. end
  546. if status["shihua"] then
  547. extraHurtRate = extraHurtRate + attr[RoleDefine.STATUS_HURT_RATE2]
  548. end
  549. if status["bingdong"] then
  550. extraHurtRate = extraHurtRate + attr[RoleDefine.STATUS_HURT_RATE3]
  551. end
  552. if status["jinmo"] then
  553. extraHurtRate = extraHurtRate + attr[RoleDefine.STATUS_HURT_RATE4]
  554. end
  555. if status["ranshao"] then
  556. extraHurtRate = extraHurtRate + attr[RoleDefine.STATUS_HURT_RATE5]
  557. end
  558. if status["liuxue"] then
  559. extraHurtRate = extraHurtRate + attr[RoleDefine.STATUS_HURT_RATE6]
  560. end
  561. if status["liuxue2"] then
  562. extraHurtRate = extraHurtRate + attr[RoleDefine.STATUS_HURT_RATE6]
  563. end
  564. if status["zhongdu"] then
  565. extraHurtRate = extraHurtRate + attr[RoleDefine.STATUS_HURT_RATE7]
  566. end
  567. return extraHurtRate
  568. end
  569. function getStatusBaoji(attacker,defender)
  570. local status = CombatBuff.getStatus(defender)
  571. local attr = attacker.attr
  572. --状态相关暴击率增加
  573. local baoji = 0
  574. if status["xuanyun"] or status["xuanyun2"] then
  575. baoji = baoji + attr[RoleDefine.STATUS_BAOJI_RATE1]
  576. end
  577. if status["shihua"] then
  578. baoji = baoji + attr[RoleDefine.STATUS_BAOJI_RATE2]
  579. end
  580. if status["bingdong"] then
  581. baoji = baoji + attr[RoleDefine.STATUS_BAOJI_RATE3]
  582. end
  583. if status["jinmo"] then
  584. baoji = baoji + attr[RoleDefine.STATUS_BAOJI_RATE4]
  585. end
  586. if status["ranshao"] then
  587. baoji = baoji + attr[RoleDefine.STATUS_BAOJI_RATE5]
  588. end
  589. if status["ranshao1"] then
  590. baoji = baoji + attr[RoleDefine.STATUS_BAOJI_RATE5]
  591. end
  592. if status["liuxue"] then
  593. baoji = baoji + attr[RoleDefine.STATUS_BAOJI_RATE6]
  594. end
  595. if status["liuxue2"] then
  596. baoji = baoji + attr[RoleDefine.STATUS_BAOJI_RATE6]
  597. end
  598. if status["zhongdu"] then
  599. baoji = baoji + attr[RoleDefine.STATUS_BAOJI_RATE7]
  600. end
  601. if status["jiansu"] then
  602. baoji = baoji + attr[RoleDefine.STATUS_BAOJI_RATE8]
  603. end
  604. return baoji
  605. end
  606. function getStatusBaojiHurtRate(attacker,defender)
  607. local status = CombatBuff.getStatus(defender)
  608. local attr = attacker.attr
  609. --状态相关暴击率增加
  610. local baoji = 0
  611. if status["xuanyun"] or status["xuanyun2"] then
  612. baoji = baoji + attr[RoleDefine.STATUS_BAOJI_HURT_RATE1]
  613. elseif status["shihua"] then
  614. baoji = baoji + attr[RoleDefine.STATUS_BAOJI_HURT_RATE2]
  615. elseif status["bingdong"] then
  616. baoji = baoji + attr[RoleDefine.STATUS_BAOJI_HURT_RATE3]
  617. elseif status["jinmo"] then
  618. baoji = baoji + attr[RoleDefine.STATUS_BAOJI_HURT_RATE4]
  619. elseif status["ranshao"] then
  620. baoji = baoji + attr[RoleDefine.STATUS_BAOJI_HURT_RATE5]
  621. elseif status["ranshao1"] then
  622. baoji = baoji + attr[RoleDefine.STATUS_BAOJI_HURT_RATE5]
  623. elseif status["liuxue"] then
  624. baoji = baoji + attr[RoleDefine.STATUS_BAOJI_HURT_RATE6]
  625. elseif status["liuxue2"] then
  626. baoji = baoji + attr[RoleDefine.STATUS_BAOJI_HURT_RATE6]
  627. elseif status["zhongdu"] then
  628. baoji = baoji + attr[RoleDefine.STATUS_BAOJI_HURT_RATE7]
  629. elseif status["jiansu"] then
  630. baoji = baoji + attr[RoleDefine.STATUS_BAOJI_HURT_RATE8]
  631. end
  632. return baoji
  633. end
  634. function getJobJianshangRate(attacker,defender)
  635. local job = attacker.job
  636. local attr = defender.attr
  637. local jianshangRate = 0
  638. --职业相关伤害加成
  639. if job == CombatDefine.JOB_TYPE1 then
  640. jianshangRate = jianshangRate + attr[RoleDefine.JOB_JIANSHANG_RATE1]
  641. elseif job == CombatDefine.JOB_TYPE2 then
  642. jianshangRate = jianshangRate + attr[RoleDefine.JOB_JIANSHANG_RATE2]
  643. elseif job == CombatDefine.JOB_TYPE3 then
  644. jianshangRate = jianshangRate + attr[RoleDefine.JOB_JIANSHANG_RATE3]
  645. elseif job == CombatDefine.JOB_TYPE4 then
  646. jianshangRate = jianshangRate + attr[RoleDefine.JOB_JIANSHANG_RATE4]
  647. elseif job == CombatDefine.JOB_TYPE5 then
  648. jianshangRate = jianshangRate + attr[RoleDefine.JOB_JIANSHANG_RATE5]
  649. end
  650. return jianshangRate
  651. end
  652. function getCampJianshangRate(attacker,defender)
  653. local camp = attacker.camp
  654. local attr = defender.attr
  655. local jianshangRate = 0
  656. --阵营相关减伤
  657. if camp == CombatDefine.CAMP_TYPE1 then
  658. jianshangRate = jianshangRate + attr[RoleDefine.CAMP_JIANSHANG_RATE1]
  659. elseif camp == CombatDefine.CAMP_TYPE2 then
  660. jianshangRate = jianshangRate + attr[RoleDefine.CAMP_JIANSHANG_RATE2]
  661. elseif camp == CombatDefine.CAMP_TYPE3 then
  662. jianshangRate = jianshangRate + attr[RoleDefine.CAMP_JIANSHANG_RATE3]
  663. elseif camp == CombatDefine.CAMP_TYPE4 then
  664. jianshangRate = jianshangRate + attr[RoleDefine.CAMP_JIANSHANG_RATE4]
  665. elseif camp == CombatDefine.CAMP_TYPE5 then
  666. jianshangRate = jianshangRate + attr[RoleDefine.CAMP_JIANSHANG_RATE5]
  667. end
  668. return jianshangRate
  669. end
  670. function getCampHurtRate(attacker,defender)
  671. local attr = attacker.attr
  672. --阵营相关伤害加成
  673. local extraHurtRate = 0
  674. if defender.camp == CombatDefine.CAMP_TYPE1 then
  675. extraHurtRate = extraHurtRate + attr[RoleDefine.CAMP_HURT_RATE1]
  676. elseif defender.camp == CombatDefine.CAMP_TYPE2 then
  677. extraHurtRate = extraHurtRate + attr[RoleDefine.CAMP_HURT_RATE2]
  678. elseif defender.camp == CombatDefine.CAMP_TYPE3 then
  679. extraHurtRate = extraHurtRate + attr[RoleDefine.CAMP_HURT_RATE3]
  680. elseif defender.camp == CombatDefine.CAMP_TYPE4 then
  681. extraHurtRate = extraHurtRate + attr[RoleDefine.CAMP_HURT_RATE4]
  682. elseif defender.camp == CombatDefine.CAMP_TYPE5 then
  683. extraHurtRate = extraHurtRate + attr[RoleDefine.CAMP_HURT_RATE5]
  684. end
  685. return extraHurtRate
  686. end