CombatObj.lua 23 KB

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