BeSkill.lua 77 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420
  1. local Util = require("common.Util")
  2. local CombatBuff = require("combat.CombatBuff")
  3. local CombatDefine = require("combat.CombatDefine")
  4. local CombatImpl = require("combat.CombatImpl")
  5. local Skill = require("combat.Skill")
  6. local CombatObj = require("combat.CombatObj")
  7. local RoleAttr = require("role.RoleAttr")
  8. local RoleDefine = require("role.RoleDefine")
  9. local HeroExcel = require("excel.hero").hero
  10. local SkillExcel = require("excel.skill").skill
  11. -- local BufferExcel = require("excel.buffer").buffer
  12. local FuwenExcel = require("excel.fuwen")
  13. local SkinSkillExcel = require("excel.skin").skill
  14. local BingshuLogic = require("fuwen.BingshuLogic")
  15. local ProjectLogic = require("platform.ProjectLogic")
  16. local HeroDefine = require("hero.HeroDefine")
  17. local WinnerRelicLogic = require("winnerRelic.WinnerRelicLogic")
  18. local TargetMode = require("combat.TargetMode")
  19. local HeroExclusiveWeapon = require("hero.HeroExclusiveWeapon")
  20. local tbFuwenSkillGroupID = {}
  21. local posSortBySpeed = posSortBySpeed or {}
  22. function initBeSkill(obj)
  23. obj.beSkillList = {}
  24. obj.beSkillListTemp = {}
  25. end
  26. function setBeSkillID(obj, skillID, isFuWenSkill, isRelicSkill)
  27. local skillConfig = Skill.GetFinalSkillConfig(obj, skillID)
  28. skillID = skillConfig.id
  29. if obj.beSkillListTemp[skillID] then return end
  30. --local skillConfig = SkillExcel[skillID]
  31. if skillConfig.need > obj.quality then return end
  32. if skillConfig.beSkillType == 0 then return end
  33. if skillConfig.beSkillType == BESKILL_TYPE24 then
  34. obj.beSkillListTemp[BESKILL_TYPE24] = obj.beSkillListTemp[BESKILL_TYPE24] or {}
  35. obj.beSkillListTemp[BESKILL_TYPE24][#obj.beSkillListTemp[BESKILL_TYPE24] + 1] = {
  36. skillID,
  37. skillConfig.beSkillLimit > 0 and skillConfig.beSkillLimit,skillConfig.cd[1] or 0,
  38. skillConfig.cd[2] or 0,
  39. isFuWenSkill or 0, isRelicSkill or 0}
  40. for _,skillID in ipairs(skillConfig.args) do
  41. --local skillConfig = SkillExcel[skillID]
  42. local skillConfig = Skill.GetFinalSkillConfig(obj, skillID)
  43. if not obj.beSkillListTemp[skillID] and skillConfig.need <= obj.quality then
  44. obj.beSkillList[skillConfig.beSkillType] = obj.beSkillList[skillConfig.beSkillType] or {}
  45. obj.beSkillList[skillConfig.beSkillType][#obj.beSkillList[skillConfig.beSkillType] + 1] = {
  46. skillID,
  47. skillConfig.beSkillLimit > 0 and skillConfig.beSkillLimit,skillConfig.cd[1] or 0,
  48. skillConfig.cd[2] or 0,
  49. isFuWenSkill or 0, isRelicSkill or 0}
  50. obj.beSkillListTemp[skillID] = 1
  51. end
  52. end
  53. else
  54. obj.beSkillList[skillConfig.beSkillType] = obj.beSkillList[skillConfig.beSkillType] or {}
  55. obj.beSkillList[skillConfig.beSkillType][#obj.beSkillList[skillConfig.beSkillType] + 1] = {
  56. skillID,
  57. skillConfig.beSkillLimit > 0 and skillConfig.beSkillLimit,skillConfig.cd[1] or 0,
  58. skillConfig.cd[2] or 0,
  59. isFuWenSkill or 0, isRelicSkill or 0}
  60. obj.beSkillListTemp[skillID] = 1
  61. end
  62. end
  63. function setBeSkill(obj, config, skinConf, monsterOutConfig)
  64. local temp = {}
  65. local confBeskillID = skinConf and skinConf.beSkillList or config.beSkillList
  66. for _,skillID in ipairs(confBeskillID) do
  67. setBeSkillID(obj,skillID)
  68. end
  69. -- 加载 赋能技能 这个策划说放到最后
  70. if config.bePvPSkillList and CombatImpl.isPVP == 1 then
  71. for _,skillID in ipairs(config.bePvPSkillList) do
  72. setBeSkillID(obj, skillID)
  73. end
  74. end
  75. -- 怪物组附加的被动技能
  76. if monsterOutConfig then
  77. for _, skillID in ipairs(monsterOutConfig) do
  78. setBeSkillID(obj,skillID)
  79. end
  80. end
  81. -- 符文被动技能
  82. -- 符文技能效果这里 如果有多个同类型的技能 效果不叠加 只取最高等级的那个技能的效果
  83. if obj.fuwen or obj.bingshu then
  84. local hasFuwenBeSkill = nil
  85. Util.initTable(tbFuwenSkillGroupID)
  86. if obj.fuwen then
  87. for i = 1, 2 do
  88. local fuwenGrid = obj.fuwen[i]
  89. if fuwenGrid and fuwenGrid.skill then
  90. for j = 1, #fuwenGrid.skill do
  91. local fuwenSkillID = fuwenGrid.skill[j]
  92. local fuwenSkillConfig = FuwenExcel.skill[fuwenSkillID]
  93. local fuwenGroupID = fuwenSkillConfig.groupID
  94. if fuwenSkillConfig.fuwenBeSkill ~= 0 then
  95. hasFuwenBeSkill = true
  96. if tbFuwenSkillGroupID[fuwenGroupID] then
  97. if tbFuwenSkillGroupID[fuwenGroupID] < fuwenSkillID then
  98. tbFuwenSkillGroupID[fuwenGroupID] = fuwenSkillID
  99. end
  100. else
  101. tbFuwenSkillGroupID[fuwenGroupID] = fuwenSkillID
  102. end
  103. end
  104. end
  105. end
  106. end
  107. end
  108. if obj.bingshu then
  109. for i = 1, BingshuLogic.BINGSHU_MAXCNT do
  110. local bingshuGrid = obj.bingshu[i]
  111. if bingshuGrid then
  112. local skillID = bingshuGrid.skillID
  113. local skillConfig = FuwenExcel.skill[skillID]
  114. local groupID = skillConfig.groupID
  115. hasFuwenBeSkill = true
  116. if (tbFuwenSkillGroupID[groupID] or 0) < skillID then
  117. tbFuwenSkillGroupID[groupID] = skillID
  118. end
  119. end
  120. end
  121. end
  122. if hasFuwenBeSkill == true then
  123. for groupID, skillIDTemp in pairs(tbFuwenSkillGroupID) do
  124. local fuwenSkillConfig = FuwenExcel.skill[skillIDTemp]
  125. local fuwenBeSkillID = fuwenSkillConfig.fuwenBeSkill
  126. fuwenBeSkillID = obj.fuwenStrengthenSkillList and obj.fuwenStrengthenSkillList[fuwenBeSkillID] or fuwenBeSkillID
  127. setBeSkillID(obj,fuwenBeSkillID, 1)
  128. end
  129. end
  130. end
  131. --遗物被动技能
  132. if obj.relic and nil ~= _G.next(obj.relic) then
  133. local nRelicID = obj.relic.relicID
  134. local star = obj.relic.star
  135. local nSkillID = WinnerRelicLogic.WinnerRelic_GetSkillID(nRelicID, star)
  136. if 0 < nSkillID then
  137. setBeSkillID(obj, nSkillID, 0, 1)
  138. local tSkilConfig = SkillExcel and SkillExcel[nSkillID]
  139. if tSkilConfig and tSkilConfig.otherArgs and tSkilConfig.otherArgs.skillList then
  140. for k,v in ipairs(tSkilConfig.otherArgs.skillList) do
  141. local config = SkillExcel[v]
  142. if config and config.id then
  143. setBeSkillID(obj, config.id, 0, 1)
  144. end
  145. end
  146. end
  147. end
  148. end
  149. -- 神威灵装被动技能
  150. if obj.artifactsBeSkillList then
  151. for _, skillId in ipairs(obj.artifactsBeSkillList) do
  152. setBeSkillID(obj, skillId)
  153. end
  154. end
  155. end
  156. function setPetBeSkill(obj)
  157. --if obj
  158. --local skillConfig = SkillExcel[1999]
  159. local skillConfig = Skill.GetSkillConfig(1999)
  160. if skillConfig then
  161. obj.beSkillList = obj.beSkillList or {}
  162. obj.beSkillList[skillConfig.beSkillType] = obj.beSkillList[skillConfig.beSkillType] or {}
  163. obj.beSkillList[skillConfig.beSkillType][#obj.beSkillList[skillConfig.beSkillType] + 1] = {1999,skillConfig.beSkillLimit > 0 and skillConfig.beSkillLimit,skillConfig.cd[1] or 0,skillConfig.cd[2] or 0}
  164. end
  165. end
  166. --被动技能类型
  167. BESKILL_TYPE1 = 1 --普攻附带
  168. BESKILL_TYPE2 = 2 --被击触发
  169. BESKILL_TYPE3 = 3 --自身生命低于参数
  170. BESKILL_TYPE4 = 4 --自己暴击触发
  171. BESKILL_TYPE5 = 5 --受到技能伤害
  172. BESKILL_TYPE6 = 6 --自己攻击被格挡
  173. BESKILL_TYPE7 = 7 --受到暴击触发
  174. BESKILL_TYPE8 = 8 --自己格挡触发(其他单位对自己发动攻击,自己触发格挡)
  175. BESKILL_TYPE9 = 9 --敌方英雄触发格挡
  176. BESKILL_TYPE10 = 10 --自己受持续状态伤害
  177. BESKILL_TYPE11 = 11 --自己受控制类状态
  178. BESKILL_TYPE12 = 12 --场上有英雄被添加燃烧状态
  179. BESKILL_TYPE13 = 13 -- 我方英雄施放主动技能
  180. BESKILL_TYPE14 = 14 -- 我方英雄暴击
  181. BESKILL_TYPE15 = 15 -- 自己死亡
  182. BESKILL_TYPE16 = 16 --我方英雄死亡
  183. BESKILL_TYPE17 = 17 --敌方英雄死亡
  184. BESKILL_TYPE18 = 18 --有英雄死亡
  185. BESKILL_TYPE19 = 19 --回合开始
  186. BESKILL_TYPE20 = 20 --回合结束
  187. BESKILL_TYPE23 = 23 --激活就生效(计入面板属性)
  188. BESKILL_TYPE24 = 24 --技能包
  189. BESKILL_TYPE25 = 25 --替换初始普攻
  190. BESKILL_TYPE26 = 26 --激活就生效(进入战斗前算。不计入面板属性)
  191. BESKILL_TYPE27 = 27 --魔兽回能量被动
  192. BESKILL_TYPE28 = 28 --自身触发格挡次数
  193. BESKILL_TYPE29 = 29 --有人受到缠绕时
  194. BESKILL_TYPE30 = 30 --使生命低于x时
  195. BESKILL_TYPE31 = 31 --任意英雄释放主动技能
  196. BESKILL_TYPE32 = 32 --战斗开始时触发
  197. BESKILL_TYPE33 = 33 --复活时触发
  198. BESKILL_TYPE34 = 34 --使用主动技能时
  199. BESKILL_TYPE35 = 35 --自身击杀敌人时
  200. BESKILL_TYPE36 = 36 --攻击回合结束时触发
  201. BESKILL_TYPE37 = 37 --物攻后触发
  202. BESKILL_TYPE38 = 38 --法攻后触发
  203. BESKILL_TYPE39 = 39 --攻击附带 (普攻 主动 都算)
  204. BESKILL_TYPE40 = 40 --攻击前根据条件判断是否触发(小战斗回合,针对每个对象单独判断)
  205. BESKILL_TYPE41 = 41 --实际扣血前触发
  206. BESKILL_TYPE42 = 42 --由其他英雄的buff触发
  207. BESKILL_TYPE43 = 43 --被某个技能打死
  208. BESKILL_TYPE44 = 44 --自己暴击+反击触发
  209. BESKILL_TYPE45 = 45 --计算伤害时触发
  210. BESKILL_TYPE46 = 46 --攻击附带 (普攻 主动 连击 反击都算)
  211. BESKILL_TYPE47 = 47 --每回合叠加属性
  212. BESKILL_TYPE48 = 48 --死亡英雄伤害率
  213. BESKILL_TYPE49 = 49 --加血变成减血
  214. BESKILL_TYPE50 = 50 --每回合触发 降低对方首次攻击目标伤害率
  215. BESKILL_TYPE51 = 51 --场上有英雄被添加诅咒状态
  216. BESKILL_TYPE52 = 52 --场上有英雄被攻击
  217. BESKILL_TYPE53 = 53 --场上有英雄有特定被动技能 友军普攻触发
  218. BESKILL_TYPE54 = 54 --场上有英雄特定buff 伤害加成
  219. BESKILL_TYPE55 = 55 --场上有英雄指定buff层数 额外伤害加成
  220. BESKILL_TYPE56 = 56 --场上有英雄特定bufer且概率产生
  221. BESKILL_TYPE57 = 57 --特定buff被引爆消除时 触发的效果
  222. BESKILL_TYPE58 = 58 --指定技能暴击
  223. BESKILL_TYPE59 = 59 --没有暴击触发一个效果
  224. BESKILL_TYPE60 = 60 --暴击加成
  225. BESKILL_TYPE61 = 61 --技能未击杀目标时触发
  226. BESKILL_TYPE62 = 62 --回合开始生命值触发
  227. BESKILL_TYPE63 = 63 --回合开始生命值触发
  228. BESKILL_TYPE64 = 64 --冰冻buffer被击碎
  229. BESKILL_TYPE65 = 65 --场上有英雄有特定被动技能 友军普攻暴击触发
  230. BESKILL_TYPE66 = 66 --敌方死亡特定buff触发
  231. BESKILL_TYPE67 = 67 --血量低于多少跟受控制触发
  232. BESKILL_TYPE68 = 68 --血族英雄特殊处理
  233. BESKILL_TYPE69 = 69 --血族英雄特殊处理
  234. BESKILL_TYPE70 = 70 --增加的属性激活就生效(计入面板属性)并且概率连击
  235. BESKILL_TYPE71 = 71 --回合开始 在其他buff添加结束
  236. BESKILL_TYPE72 = 72 -- 不施放技能,只用来做其他效果的判断条件
  237. NO_CHECK_FANJI_LIST = {
  238. [BESKILL_TYPE3] = 1,
  239. [BESKILL_TYPE15] = 1,
  240. [BESKILL_TYPE16] = 1,
  241. [BESKILL_TYPE17] = 1,
  242. [BESKILL_TYPE18] = 1,
  243. [BESKILL_TYPE35] = 1,
  244. [BESKILL_TYPE36] = 1,
  245. [BESKILL_TYPE37] = 1,
  246. [BESKILL_TYPE38] = 1,
  247. [BESKILL_TYPE44] = 1,
  248. [BESKILL_TYPE46] = 1,
  249. }
  250. NO_CHECK_COMBO_LIST = {
  251. [BESKILL_TYPE1] = 1,
  252. [BESKILL_TYPE3] = 1,
  253. [BESKILL_TYPE14] = 1,
  254. [BESKILL_TYPE16] = 1,
  255. [BESKILL_TYPE17] = 1,
  256. [BESKILL_TYPE18] = 1,
  257. [BESKILL_TYPE35] = 1,
  258. [BESKILL_TYPE34] = 1,
  259. [BESKILL_TYPE25] = 1,
  260. [BESKILL_TYPE46] = 1,
  261. [BESKILL_TYPE37] = 1,
  262. [BESKILL_TYPE38] = 1,
  263. [BESKILL_TYPE43] = 1,
  264. [BESKILL_TYPE15] = 1,
  265. }
  266. local function checkLimit(data)
  267. if data[2] and data[2] <= 0 then
  268. return
  269. end
  270. if data[4] > 0 and data[3] > CombatImpl.round then
  271. return
  272. end
  273. return true
  274. end
  275. local function canUse(obj,data)
  276. if obj.isPet then
  277. return true
  278. end
  279. --被动技能次数限制判断
  280. if not checkLimit(data) then
  281. return
  282. end
  283. --local skillConfig = SkillExcel[data[1]]
  284. local skillConfig = Skill.GetSkillConfig(data[1])
  285. if not NO_CHECK_FANJI_LIST[skillConfig.beSkillType] and CombatImpl.isFanji then
  286. return
  287. end
  288. if not NO_CHECK_COMBO_LIST[skillConfig.beSkillType] and CombatImpl.comboType > 0 then
  289. return
  290. end
  291. local bNotFeng = nil
  292. -- boss 被动不能被封印
  293. -- 世界boss模式下 boss不受feng状态影响
  294. if CombatImpl.fightMode[1] == CombatDefine.FIGHT_MODE3 then
  295. if obj.type == CombatDefine.COMBAT_OBJ_TYPE3 then
  296. bNotFeng = true
  297. end
  298. end
  299. if not bNotFeng and CombatBuff.isStatus(obj,{"banBeSkill","feng"}) then
  300. return
  301. end
  302. data[3] = data[3] + data[4]
  303. local beSkillArgs = skillConfig.beSkillArgs
  304. local ret = true
  305. --被动技能触发条件判断
  306. if beSkillArgs[1] then
  307. if beSkillArgs[1] == "hp" then
  308. local hp = obj.hp
  309. local hpMax = CombatObj.getHpMax(obj)
  310. if hp > hpMax * beSkillArgs[2]/10000 then
  311. ret = false
  312. end
  313. elseif beSkillArgs[1] == "hpOrControl" then
  314. ret = false
  315. local hp = obj.hp
  316. local hpMax = CombatObj.getHpMax(obj)
  317. if hp <= hpMax * beSkillArgs[2]/10000 then
  318. ret = true
  319. end
  320. if CombatBuff.isAtControl(obj) then
  321. ret = true
  322. end
  323. elseif beSkillArgs[1] == "fanji" then
  324. local r = math.random(0,10000)
  325. if r > beSkillArgs[2] then
  326. return
  327. end
  328. elseif beSkillArgs[1] == "pos" then
  329. local pos = obj.pos
  330. ret = false
  331. if beSkillArgs[2] then
  332. for i = 1,#beSkillArgs[2] do
  333. if pos == beSkillArgs[2][i] then
  334. ret = true
  335. break
  336. end
  337. end
  338. end
  339. elseif beSkillArgs[1] == "noBuffCmd" then
  340. return not CombatBuff.isStatus(obj,beSkillArgs[2])
  341. elseif beSkillArgs[1] == "attackerBuffCmd" then
  342. local isStatus,cmd = CombatBuff.isStatus(obj,beSkillArgs[2])
  343. return isStatus
  344. elseif beSkillArgs[1] == "myjob" then
  345. ret = false
  346. for k,v in ipairs(beSkillArgs[2]) do
  347. if v == obj.job then
  348. ret = true
  349. break
  350. end
  351. end
  352. elseif beSkillArgs[1] == "sideLimit" then
  353. for k,v in ipairs(beSkillArgs[2]) do
  354. local useCnt = CombatImpl.getBeSkillSideUse(obj.pos,v[1])
  355. if useCnt >= v[2] then
  356. return
  357. end
  358. end
  359. elseif beSkillArgs[1] == "firstAttackOrder" then
  360. local side = obj.side
  361. if side then
  362. local isFirstAttack = CombatImpl.firstAttack[side]
  363. if beSkillArgs[2] == 1 then
  364. return isFirstAttack
  365. else
  366. return not isFirstAttack
  367. end
  368. end
  369. end
  370. end
  371. if ret and data[2] then
  372. data[2] = data[2] - 1
  373. end
  374. if skillConfig.cmd == "hp" then
  375. local hp = obj.hp
  376. local targetMode = skillConfig.args[3]
  377. --英雄血量为0时不能加血
  378. if (hp <= 0 or CombatBuff.isStatus(obj,{"revive"})) and targetMode and targetMode[1] == 10 then
  379. ret = false
  380. end
  381. end
  382. return ret
  383. end
  384. --被攻击触发,需要判断攻击者状态的被动技能
  385. local function canUseOnHit(obj,data)
  386. if not obj then
  387. return true
  388. end
  389. --local skillConfig = SkillExcel[data[1]]
  390. local skillConfig = Skill.GetSkillConfig(data[1])
  391. local beSkillArgs = skillConfig.beSkillArgs
  392. local condCmd = beSkillArgs[1]
  393. if condCmd == "job" then
  394. for _,job in ipairs(beSkillArgs[2]) do
  395. if obj.job == job then
  396. return true
  397. end
  398. end
  399. return false
  400. elseif condCmd == "buffCmd" then
  401. return CombatBuff.isStatus(obj,beSkillArgs[2])
  402. elseif condCmd == "targetHp" then
  403. local hp = obj.hp
  404. local checkHp = CombatObj.getHpMax(obj) * beSkillArgs[3] / 10000
  405. if beSkillArgs[2] == 1 and hp > checkHp then
  406. return true
  407. elseif beSkillArgs[2] == 2 and hp < checkHp then
  408. return true
  409. end
  410. else
  411. return true
  412. end
  413. end
  414. local function isCanRevive(obj, attacker , data)
  415. -- local skillConfig = SkillExcel[data[1]]
  416. local skillConfig = Skill.GetSkillConfig(data[1])
  417. if skillConfig.cmd == "shengling" or
  418. skillConfig.cmd == "revive" then
  419. if skillConfig.cmd == "shengling" and CombatImpl.checkSideResult(obj.pos) == true then -- 如果是队伍最后一个死亡的不释放 圣灵复活
  420. return false
  421. end
  422. if CombatBuff.canRevive(obj) ~= true then
  423. return false
  424. end
  425. if skillConfig.cmd == "shengling" then
  426. if CombatBuff.isStatus(obj,{"revive"}) then
  427. return false
  428. end
  429. end
  430. if attacker and attacker.beSkillList then
  431. for k,skillList in pairs(attacker.beSkillList) do
  432. for j,v in pairs(skillList) do
  433. --local config = SkillExcel[v[1]]
  434. local config = Skill.GetSkillConfig(data[1])
  435. if config and skillConfig.cmd == "shengling" and config.cmd == "noShengling" then --击杀方有 不准圣灵复活被动
  436. return false
  437. elseif config and config.cmd == "noRevive" then -- 击杀方 有不准复活的
  438. if #config.args > 0 then
  439. local canNum = config.args[1]
  440. local random = math.random(1, 10000)
  441. if random > canNum then -- noRevive 概率不生效
  442. return true
  443. else
  444. return false
  445. end
  446. end
  447. return true
  448. end
  449. end
  450. end
  451. end
  452. end
  453. return true
  454. end
  455. function onSkillID(obj,skillID)
  456. --local skillConfig = SkillExcel[skillID]
  457. local skillConfig = Skill.GetSkillConfig(skillID)
  458. if skillConfig.type == CombatDefine.SKILL_TYPE1 and obj.beSkillList[BESKILL_TYPE25] then
  459. for _,v in ipairs(obj.beSkillList[BESKILL_TYPE25]) do
  460. if canUse(obj,v) then
  461. --local conf = SkillExcel[v[1]]
  462. local conf = Skill.GetSkillConfig(v[1])
  463. return conf.args[1]
  464. end
  465. end
  466. end
  467. return skillID
  468. end
  469. local function use(attacker,targets,data,newFrame, packBuff, hitObj)
  470. if canUse(attacker,data) and canUseOnHit(targets and targets[1],data) then
  471. --print("beskill realuse:",attacker.pos,data[1])
  472. --local skillConfig = SkillExcel[data[1]]
  473. local skillConfig = Skill.GetSkillConfig(data[1])
  474. local ret, arg2
  475. -- 二次元连击触发帧不新加帧
  476. if ProjectLogic.isSsecy() and skillConfig.cmd == "combo" then
  477. newFrame = false
  478. end
  479. if packBuff then
  480. CombatImpl.afterBuff()
  481. end
  482. if Skill.CMD[skillConfig.cmd] then
  483. if newFrame or CombatImpl.isSkillFrameEmpty() then
  484. --进入战斗时,未加入任何战斗帧触发被动技能时,先添加被动技能的战斗帧,可以在这个战斗帧上挂被动技能引发的额外作用
  485. CombatImpl.addFrame()
  486. CombatImpl.setSkillID(attacker, data[1])
  487. end
  488. ret, arg2 = Skill.CMD[skillConfig.cmd](attacker,skillConfig,targets, hitObj)
  489. end
  490. --判断是否加喊话
  491. local isAddSkillFrame = CombatBuff.onUseBeSkill(attacker, skillConfig, targets, ret, nil, arg2)
  492. if skillConfig.contentType > 0 then
  493. if isAddSkillFrame then
  494. CombatImpl.addSaySkill(attacker,skillConfig)
  495. elseif ret or skillConfig.beSkillType == BESKILL_TYPE26 or
  496. skillConfig.beSkillType == BESKILL_TYPE23 or
  497. skillConfig.beSkillType == BESKILL_TYPE4 or
  498. skillConfig.beSkillType == BESKILL_TYPE44 then
  499. if CombatImpl.isSkillFrameEmpty() then
  500. CombatImpl.addFrame()
  501. CombatImpl.setSkillID(attacker, data[1])
  502. end
  503. CombatImpl.setSaySkill(attacker.pos,skillConfig.id,skillConfig.contentType)
  504. end
  505. end
  506. CombatImpl.addBeSkillPosUse(attacker.pos,data[1])
  507. else
  508. -- print("[beskill - use] 直接返回了1 id = "..data[1])
  509. end
  510. end
  511. function onHit(attacker,targets,skillID)
  512. if attacker.isPet or attacker.isElf then
  513. return
  514. end
  515. --local useSkillConfig = SkillExcel[skillID]
  516. local useSkillConfig = Skill.GetSkillConfig(skillID)
  517. if useSkillConfig.type == CombatDefine.SKILL_TYPE2 then
  518. --[[for _,pos in ipairs(CombatDefine.SIDE2POS[side]) do
  519. local obj = CombatImpl.objList[pos]
  520. if obj and obj.hp > 0 and obj.beSkillList[BESKILL_TYPE13] then
  521. for _,v in ipairs(obj.beSkillList[BESKILL_TYPE13]) do
  522. use(obj,targets,v)
  523. end
  524. end
  525. end]]
  526. if attacker.beSkillList[BESKILL_TYPE34] then
  527. for _,v in ipairs(attacker.beSkillList[BESKILL_TYPE34]) do
  528. --local skillConfig = SkillExcel[v[1]]
  529. local skillConfig = Skill.GetSkillConfig(v[1])
  530. local beSkillArgs = skillConfig.beSkillArgs
  531. if beSkillArgs[1] == "attackerBuffCmd" and beSkillArgs[2][1] == "shayi" then
  532. local shayiCnt = CombatBuff.getBuffCnt(attacker,"shayi")
  533. if shayiCnt > 0 then
  534. for i = 1,shayiCnt do
  535. use(attacker,targets,v,true)
  536. CombatImpl.instantFrameBuffer(attacker,v[1])
  537. end
  538. end
  539. CombatBuff.delShayi(attacker)
  540. elseif beSkillArgs[1] == "qusanNeedCmd" then
  541. local canUse = false
  542. for h,need in ipairs(beSkillArgs[2]) do
  543. if need == useSkillConfig.cmd then
  544. canUse = true
  545. break
  546. end
  547. end
  548. if canUse == true then
  549. use(attacker,targets,v,true)
  550. end
  551. elseif beSkillArgs[1] == "jiekongNeedCmd" then
  552. local canUse = false
  553. for h,need in ipairs(beSkillArgs[2]) do
  554. if need == useSkillConfig.cmd then
  555. canUse = true
  556. break
  557. end
  558. end
  559. if canUse == true then
  560. use(attacker,targets,v,true)
  561. end
  562. elseif beSkillArgs[1] == "skillID" then
  563. local canUse = false
  564. for _, targetSkill in ipairs(beSkillArgs[2]) do
  565. if skillID == targetSkill then
  566. canUse = true
  567. break
  568. end
  569. end
  570. if canUse == true then
  571. use(attacker,targets,v,true)
  572. end
  573. else
  574. use(attacker,targets,v)
  575. end
  576. end
  577. end
  578. end
  579. --非攻击性主动技能不处理被击被动技能
  580. if CombatObj.getValue(attacker,RoleDefine.HURT_COMBAT_NOW) <= 0 then
  581. if (useSkillConfig.type == CombatDefine.SKILL_TYPE1 or useSkillConfig.type == CombatDefine.SKILL_TYPE2) then
  582. if attacker.beSkillList[BESKILL_TYPE39] then
  583. for _,v in ipairs(attacker.beSkillList[BESKILL_TYPE39]) do
  584. use(attacker,targets,v)
  585. end
  586. end
  587. if attacker.beSkillList[BESKILL_TYPE70] then
  588. for _,v in ipairs(attacker.beSkillList[BESKILL_TYPE70]) do
  589. use(attacker,targets,v)
  590. end
  591. end
  592. end
  593. return
  594. end
  595. if useSkillConfig.type == CombatDefine.SKILL_TYPE1 and attacker.beSkillList[BESKILL_TYPE1] then
  596. for _,v in ipairs(attacker.beSkillList[BESKILL_TYPE1]) do
  597. use(attacker,targets,v)
  598. end
  599. end
  600. if useSkillConfig.type == CombatDefine.SKILL_TYPE2 and attacker.beSkillList[BESKILL_TYPE61] then
  601. local canUseSkill = true
  602. for index = 1, #targets do
  603. local target = targets[index]
  604. if target.hp <=0 then
  605. canUseSkill = false
  606. end
  607. end
  608. if canUseSkill then
  609. for _,v in ipairs(attacker.beSkillList[BESKILL_TYPE61]) do
  610. --local skillConfig = SkillExcel[v[1]]
  611. local skillConfig = Skill.GetSkillConfig(v[1])
  612. local beSkillArgs = skillConfig.beSkillArgs
  613. if beSkillArgs[1] == "skillID" then
  614. local canUse = false
  615. for _,v in ipairs(beSkillArgs[2]) do
  616. if skillID == v then
  617. canUse = true
  618. break
  619. end
  620. end
  621. if canUse then
  622. use(attacker,{},v)
  623. end
  624. end
  625. end
  626. end
  627. end
  628. if (useSkillConfig.type == CombatDefine.SKILL_TYPE1 or useSkillConfig.type == CombatDefine.SKILL_TYPE2 or useSkillConfig.type == CombatDefine.SKILL_TYPE3) then
  629. if attacker.beSkillList[BESKILL_TYPE39] then
  630. for _,v in ipairs(attacker.beSkillList[BESKILL_TYPE39]) do
  631. use(attacker,targets,v)
  632. end
  633. end
  634. if attacker.beSkillList[BESKILL_TYPE46] then
  635. for _,v in ipairs(attacker.beSkillList[BESKILL_TYPE46]) do
  636. use(attacker,targets,v)
  637. end
  638. end
  639. if attacker.beSkillList[BESKILL_TYPE70] then
  640. for _,v in ipairs(attacker.beSkillList[BESKILL_TYPE70]) do
  641. use(attacker,targets,v)
  642. end
  643. end
  644. end
  645. local isDefendSideGedang = false
  646. local baojiDefender = {}
  647. for _,target in ipairs(targets) do
  648. if target.beSkillList[BESKILL_TYPE2] then
  649. for _,v in ipairs(target.beSkillList[BESKILL_TYPE2]) do
  650. use(target,{attacker},v)
  651. -- print("當前受到攻擊,觸發被動技能11111111111111ssssssssss1111111111111111",skillID)
  652. --table.print_lua_table(v)
  653. end
  654. end
  655. -- 友军受击
  656. for _,pos in ipairs(CombatDefine.SIDE2POS[target.side]) do
  657. local obj = CombatImpl.objList[pos]
  658. if obj and obj.pos ~= target.pos and obj.beSkillList[BESKILL_TYPE52] then
  659. for _,v in ipairs(obj.beSkillList[BESKILL_TYPE52]) do
  660. use(target,{attacker},v)
  661. end
  662. end
  663. end
  664. if useSkillConfig.type == CombatDefine.SKILL_TYPE2 and target.beSkillList[BESKILL_TYPE5] then
  665. for _,v in ipairs(target.beSkillList[BESKILL_TYPE5]) do
  666. use(target,{attacker},v)
  667. end
  668. end
  669. if target.isGedang then
  670. isDefendSideGedang = true
  671. if target.beSkillList[BESKILL_TYPE8] then
  672. for _,v in ipairs(target.beSkillList[BESKILL_TYPE8]) do
  673. use(target,{attacker},v)
  674. end
  675. end
  676. if attacker.beSkillList[BESKILL_TYPE6] then
  677. for _,v in ipairs(attacker.beSkillList[BESKILL_TYPE6]) do
  678. use(attacker,{target},v)
  679. end
  680. end
  681. --目标触发格挡次数
  682. if target.beSkillList[BESKILL_TYPE28] then
  683. for _, v in ipairs(target.beSkillList[BESKILL_TYPE28]) do
  684. --local skillConfig = SkillExcel[v[1]]
  685. local skillConfig = Skill.GetSkillConfig(v[1])
  686. local beSkillArgs = skillConfig.beSkillArgs
  687. if beSkillArgs[1] == "gedang" then
  688. target.isGedangCnt = target.isGedangCnt or 0
  689. local geDangLimit = beSkillArgs[2]
  690. if target.isGedangCnt >= geDangLimit then
  691. target.isGedangCnt = 0
  692. use(target,{attacker},v)
  693. end
  694. end
  695. end
  696. end
  697. end
  698. local chanRao = CombatBuff.isChanRao(target)
  699. if chanRao then
  700. if target.beSkillList[BESKILL_TYPE29] then
  701. for _,v in ipairs(target.beSkillList[BESKILL_TYPE29]) do
  702. use(target,{attacker},v)
  703. end
  704. end
  705. end
  706. if target.isBaoji then
  707. if target.beSkillList[BESKILL_TYPE7] then
  708. for _,v in ipairs(target.beSkillList[BESKILL_TYPE7]) do
  709. use(target,{attacker},v)
  710. end
  711. end
  712. baojiDefender[#baojiDefender+1] = target
  713. end
  714. -- if target.buffCmd["winner_nuhuo"] then
  715. -- local nIndex = target.buffCmd["winner_nuhuo"][1]
  716. -- local tBuffData = target.buffer[nIndex]
  717. -- if tBuffData.cnt < 10 then
  718. -- tBuffData.cnt = tBuffData.cnt + 1
  719. -- end
  720. -- end
  721. end
  722. local side = attacker.side
  723. local defendSide = side == CombatDefine.ATTACK_SIDE and CombatDefine.DEFEND_SIDE or CombatDefine.ATTACK_SIDE
  724. --普通技能触发
  725. if useSkillConfig.type == CombatDefine.SKILL_TYPE1 then
  726. for _,pos in ipairs(CombatDefine.SIDE2POS[side]) do
  727. local obj = CombatImpl.objList[pos]
  728. if obj and obj.hp > 0 and obj.beSkillList[BESKILL_TYPE53] then
  729. for _,v in ipairs(obj.beSkillList[BESKILL_TYPE53]) do
  730. use(attacker,targets,v)
  731. end
  732. end
  733. end
  734. end
  735. --主动技能触发
  736. if useSkillConfig.type == CombatDefine.SKILL_TYPE2 then
  737. for _,pos in ipairs(CombatDefine.SIDE2POS[0]) do
  738. local obj = CombatImpl.objList[pos]
  739. local objSide = pos <= 6 and CombatDefine.ATTACK_SIDE or CombatDefine.DEFEND_SIDE
  740. --触发自己这方的
  741. if side == objSide then
  742. if obj and obj.hp > 0 and obj.beSkillList[BESKILL_TYPE13] then
  743. for _,v in ipairs(obj.beSkillList[BESKILL_TYPE13]) do
  744. use(obj,targets,v)
  745. end
  746. end
  747. end
  748. --触发任意一方
  749. if obj and obj.hp > 0 and obj.beSkillList[BESKILL_TYPE31] then
  750. for _,v in ipairs(obj.beSkillList[BESKILL_TYPE31]) do
  751. use(obj,targets,v)
  752. end
  753. end
  754. end
  755. end
  756. if not attacker.isBaoji then
  757. --指定技能没有暴击
  758. if attacker.beSkillList[BESKILL_TYPE59] then
  759. for _,v in ipairs(attacker.beSkillList[BESKILL_TYPE59]) do
  760. --local skillConfig = SkillExcel[v[1]]
  761. local skillConfig = Skill.GetSkillConfig(v[1])
  762. local beSkillArgs = skillConfig.beSkillArgs
  763. if beSkillArgs[1] == "skillID" then
  764. local canUse = false
  765. for _,v in ipairs(beSkillArgs[2]) do
  766. if skillID == v then
  767. canUse = true
  768. break
  769. end
  770. end
  771. if canUse then
  772. use(attacker,{},v)
  773. end
  774. end
  775. end
  776. end
  777. end
  778. if attacker.isBaoji then
  779. --普通暴击技能触发
  780. if useSkillConfig.type == CombatDefine.SKILL_TYPE1 then
  781. for _,pos in ipairs(CombatDefine.SIDE2POS[side]) do
  782. local obj = CombatImpl.objList[pos]
  783. if obj and obj.hp > 0 and obj.beSkillList[BESKILL_TYPE65] then
  784. for _,v in ipairs(obj.beSkillList[BESKILL_TYPE65]) do
  785. use(attacker,targets,v)
  786. end
  787. end
  788. end
  789. end
  790. if attacker.beSkillList[BESKILL_TYPE4] then
  791. for _,v in ipairs(attacker.beSkillList[BESKILL_TYPE4]) do
  792. use(attacker,baojiDefender,v)
  793. end
  794. end
  795. if attacker.beSkillList[BESKILL_TYPE44] and CombatImpl.isFanji then
  796. for _,v in ipairs(attacker.beSkillList[BESKILL_TYPE44]) do
  797. use(attacker,baojiDefender,v)
  798. end
  799. end
  800. --指定技能暴击
  801. if attacker.beSkillList[BESKILL_TYPE58] then
  802. for _,v in ipairs(attacker.beSkillList[BESKILL_TYPE58]) do
  803. --local skillConfig = SkillExcel[v[1]]
  804. local skillConfig = Skill.GetSkillConfig(v[1])
  805. local beSkillArgs = skillConfig.beSkillArgs
  806. if beSkillArgs[1] == "skillID" then
  807. local canUse = false
  808. for _,v in ipairs(beSkillArgs[2]) do
  809. if skillID == v then
  810. canUse = true
  811. break
  812. end
  813. end
  814. if canUse then
  815. use(attacker,baojiDefender,v)
  816. end
  817. end
  818. end
  819. end
  820. for _,pos in ipairs(CombatDefine.SIDE2POS[side]) do
  821. local obj = CombatImpl.objList[pos]
  822. if obj and obj.hp > 0 and obj.beSkillList[BESKILL_TYPE14] then
  823. for _,v in ipairs(obj.beSkillList[BESKILL_TYPE14]) do
  824. use(obj,targets,v)
  825. end
  826. end
  827. end
  828. end
  829. if isDefendSideGedang then
  830. for _,pos in ipairs(CombatDefine.SIDE2POS[side]) do
  831. local obj = CombatImpl.objList[pos]
  832. if obj and obj.hp > 0 and obj.beSkillList[BESKILL_TYPE9] then
  833. for _,v in ipairs(obj.beSkillList[BESKILL_TYPE9]) do
  834. use(obj,targets,v)
  835. end
  836. end
  837. end
  838. end
  839. end
  840. function onHp(obj, hurt, attackPos)
  841. if obj.beSkillList[BESKILL_TYPE3] then
  842. for _,v in ipairs(obj.beSkillList[BESKILL_TYPE3]) do
  843. use(obj,{},v)
  844. end
  845. end
  846. if obj.beSkillList[BESKILL_TYPE67] then
  847. for _,v in ipairs(obj.beSkillList[BESKILL_TYPE67]) do
  848. use(obj,{},v)
  849. end
  850. end
  851. local attacker = CombatImpl.objList[attackPos]
  852. if attacker and attacker.beSkillList[BESKILL_TYPE30] and obj.pos ~= attackPos then
  853. for _,v in ipairs(attacker.beSkillList[BESKILL_TYPE30]) do
  854. --local skillConfig = SkillExcel[v[1]]
  855. local skillConfig = Skill.GetSkillConfig(v[1])
  856. local beSkillArgs = skillConfig.beSkillArgs
  857. obj.paramData.isbeSkillByHp = obj.paramData.isbeSkillByHp or 0
  858. if beSkillArgs[1] then
  859. if beSkillArgs[1] == "tohp" then
  860. local hp = obj.hp
  861. local hpMax = CombatObj.getHpMax(obj)
  862. if hp > hpMax * beSkillArgs[2]/10000 then
  863. obj.paramData.isbeSkillByHp = 0 --恢复到上限
  864. else
  865. if obj.isbeSkillByHp == 0 then
  866. obj.paramData.isbeSkillByHp = 1 --达到下限
  867. end
  868. end
  869. elseif beSkillArgs[1] == "hurthpper" then
  870. local hpMax = CombatObj.getHpMax(obj)
  871. local percent = -hurt/hpMax
  872. if percent > beSkillArgs[2]/10000 then -- 伤害超过目标生命值上限X%时
  873. use(attacker,{obj},v)
  874. end
  875. elseif beSkillArgs[1] == "speed" then
  876. local atkSpeed = CombatImpl.getValue(attacker,RoleDefine.SPEED)
  877. local defSpeed = CombatImpl.getValue(obj,RoleDefine.SPEED)
  878. if atkSpeed > defSpeed then
  879. use(attacker,{obj},v)
  880. end
  881. end
  882. end
  883. --使用技能
  884. if obj.paramData.isbeSkillByHp == 1 then
  885. use(attacker,{obj},v)
  886. obj.paramData.isbeSkillByHp = 2
  887. end
  888. end
  889. end
  890. end
  891. -- 选择合适的复活技能
  892. function selectReviceSkill(obj, attacker)
  893. local reviveSkillList = {}
  894. local len = 0
  895. for k, v in ipairs(obj.beSkillList[BESKILL_TYPE15]) do
  896. local skillID = v[1]
  897. local isFuwenSkill = v[5]
  898. --local skillConfig = SkillExcel[skillID]
  899. local skillConfig = Skill.GetSkillConfig(skillID)
  900. if skillConfig.cmd == "revive" then
  901. --有可使用的主动复活技能
  902. local state = isCanRevive(obj, attacker, v)
  903. if state and isFuwenSkill == 0 then
  904. if checkLimit(v) then
  905. len = len + 1
  906. reviveSkillList[k] = 1
  907. break
  908. end
  909. end
  910. end
  911. end
  912. -- 没有再取符文技能的复活
  913. if len == 0 then
  914. for k, v in ipairs(obj.beSkillList[BESKILL_TYPE15]) do
  915. local skillID = v[1]
  916. local isFuwenSkill = v[5]
  917. --local skillConfig = SkillExcel[skillID]
  918. local skillConfig = Skill.GetSkillConfig(skillID)
  919. if skillConfig.cmd == "revive" then
  920. local state = isCanRevive(obj, attacker, v)
  921. if state and isFuwenSkill == 1 then
  922. --被动技能次数限制判断
  923. if checkLimit(v) then
  924. reviveSkillList[k] = 1
  925. break
  926. end
  927. end
  928. end
  929. end
  930. end
  931. return reviveSkillList
  932. end
  933. function onDie(obj, hurt, attackPos)
  934. if obj.hp > 0 then
  935. return
  936. end
  937. local side = obj.side
  938. local attacker = CombatImpl.objList[attackPos]
  939. if obj.dieSkill then
  940. if attacker and attacker.beSkillList[BESKILL_TYPE43] then
  941. for _,v in ipairs(attacker.beSkillList[BESKILL_TYPE43]) do
  942. --local skillConfig = SkillExcel[v[1]]
  943. local skillConfig = Skill.GetSkillConfig(v[1])
  944. for _,v1 in ipairs(skillConfig.beSkillArgs) do
  945. if v1 == obj.dieSkill then
  946. use(attacker,{obj},v)
  947. break
  948. end
  949. end
  950. end
  951. end
  952. end
  953. local defendSide = side == CombatDefine.ATTACK_SIDE and CombatDefine.DEFEND_SIDE or CombatDefine.ATTACK_SIDE
  954. for _,posData in ipairs(posSortBySpeed[side]) do
  955. local pos = posData[1]
  956. local target = CombatImpl.objList[pos]
  957. if target and target.hp > 0 then
  958. if target.beSkillList[BESKILL_TYPE16] then
  959. for _,v in ipairs(target.beSkillList[BESKILL_TYPE16]) do
  960. use(target,{obj},v)
  961. end
  962. end
  963. if target.beSkillList[BESKILL_TYPE18] then
  964. for _,v in ipairs(target.beSkillList[BESKILL_TYPE18]) do
  965. use(target,{obj},v)
  966. end
  967. end
  968. end
  969. end
  970. for _,posData in ipairs(posSortBySpeed[defendSide]) do
  971. local pos = posData[1]
  972. local target = CombatImpl.objList[pos]
  973. if target and target.hp > 0 then
  974. if target.beSkillList[BESKILL_TYPE17] then
  975. for _,v in ipairs(target.beSkillList[BESKILL_TYPE17]) do
  976. use(target,{obj},v)
  977. end
  978. end
  979. if target.beSkillList[BESKILL_TYPE18] then
  980. for _,v in ipairs(target.beSkillList[BESKILL_TYPE18]) do
  981. use(target,{obj},v)
  982. end
  983. end
  984. end
  985. end
  986. if attacker and attacker.beSkillList and attacker.beSkillList[BESKILL_TYPE30] and obj.pos ~= attackPos then
  987. for _,v in ipairs(attacker.beSkillList[BESKILL_TYPE30]) do
  988. if obj.isbeSkillByHp == nil or
  989. obj.isbeSkillByHp == 0 then
  990. use(attacker,{},v)
  991. end
  992. end
  993. end
  994. if attacker and attacker.beSkillList and attacker.beSkillList[BESKILL_TYPE35] then
  995. for _,v in ipairs(attacker.beSkillList[BESKILL_TYPE35]) do
  996. use(attacker,{obj},v)
  997. end
  998. end
  999. if obj.beSkillList[BESKILL_TYPE15] then
  1000. -- 选择其中一个使用
  1001. local reviceSkillList = selectReviceSkill(obj, attacker)
  1002. for k, v in ipairs(obj.beSkillList[BESKILL_TYPE15]) do
  1003. local skillID = v[1]
  1004. --local skillConfig = SkillExcel[skillID]
  1005. local skillConfig = Skill.GetSkillConfig(skillID)
  1006. if skillConfig.cmd == "revive" then
  1007. if reviceSkillList[k] then
  1008. use(obj,{},v)
  1009. -- break
  1010. end
  1011. else
  1012. use(obj,{},v)
  1013. end
  1014. end
  1015. end
  1016. for _,pos in ipairs(CombatDefine.SIDE2POS[defendSide]) do
  1017. local defendobj = CombatImpl.objList[pos]
  1018. if defendobj and defendobj.hp > 0 and defendobj.beSkillList[BESKILL_TYPE66] then
  1019. for _,v in ipairs(defendobj.beSkillList[BESKILL_TYPE66]) do
  1020. --local skillConfig = SkillExcel[v[1]]
  1021. local skillConfig = Skill.GetSkillConfig(v[1])
  1022. if skillConfig and skillConfig.otherArgs.tdBuffCmd then
  1023. if obj.bufferCmd[skillConfig.otherArgs.tdBuffCmd] then
  1024. use(defendobj,{},v)
  1025. end
  1026. end
  1027. end
  1028. end
  1029. end
  1030. end
  1031. function onAddBuffer(obj,buffer)
  1032. --local conf = BufferExcel[buffer.id]
  1033. local conf = CombatBuff.GetBuffConfig(buffer.id)
  1034. local attacker = CombatImpl.objList[buffer.attackPos]
  1035. local cmd = conf.cmd
  1036. if cmd == "hurt" or cmd == "liuxue"or cmd == "liuxue2" or cmd == "zhongdu" or cmd == "ranshao" then
  1037. if obj.beSkillList[BESKILL_TYPE10] then
  1038. for _,v in ipairs(obj.beSkillList[BESKILL_TYPE10]) do
  1039. use(obj,{attacker},v)
  1040. end
  1041. end
  1042. end
  1043. if cmd == "bingdong" or cmd == "jiansu" then
  1044. for _,pos in ipairs(CombatDefine.SIDE2POS[attacker.side]) do
  1045. local target = CombatImpl.objList[pos]
  1046. if target and target.hp > 0 and target.beSkillList[BESKILL_TYPE63] then
  1047. for _,v in ipairs(target.beSkillList[BESKILL_TYPE63]) do
  1048. use(target,{obj},v)
  1049. end
  1050. end
  1051. end
  1052. end
  1053. if CombatBuff.isControlCmd(cmd) then
  1054. if obj.beSkillList[BESKILL_TYPE11] then
  1055. for _,v in ipairs(obj.beSkillList[BESKILL_TYPE11]) do
  1056. use(obj,{attacker},v)
  1057. end
  1058. end
  1059. if obj.beSkillList[BESKILL_TYPE67] then
  1060. for _,v in ipairs(obj.beSkillList[BESKILL_TYPE67]) do
  1061. use(obj,{attacker},v, true, true)
  1062. end
  1063. end
  1064. end
  1065. if cmd == "ranshao" then
  1066. for pos = 1,CombatDefine.COMBAT_HERO_ALL_CNT do
  1067. local target = CombatImpl.objList[pos]
  1068. if target and target.hp > 0 and target.beSkillList[BESKILL_TYPE12] then
  1069. for _,v in ipairs(target.beSkillList[BESKILL_TYPE12]) do
  1070. local beSkillUseCnt = CombatImpl.getBeSkillUse(target,obj.pos,v[1])--特殊条件特殊处理:同一英雄在同一时间被施加多次燃烧状态时只触发一次
  1071. if beSkillUseCnt == 0 then
  1072. use(target,{obj},v)
  1073. CombatImpl.addBeSkillUse(target,obj.pos,v[1])
  1074. end
  1075. end
  1076. end
  1077. end
  1078. end
  1079. if cmd == "zuzhou" then
  1080. for _,pos in ipairs(CombatDefine.SIDE2POS[attacker.side]) do
  1081. local target = CombatImpl.objList[pos]
  1082. if target and target.hp > 0 and target.beSkillList[BESKILL_TYPE51] then
  1083. for _,v in ipairs(target.beSkillList[BESKILL_TYPE51]) do
  1084. use(target,{obj},v)
  1085. end
  1086. end
  1087. end
  1088. end
  1089. if cmd == "revive" then
  1090. if obj.beSkillList[BESKILL_TYPE33] then
  1091. for _,v in ipairs(obj.beSkillList[BESKILL_TYPE33]) do
  1092. use(obj,{attacker},v)
  1093. end
  1094. end
  1095. end
  1096. end
  1097. function onDelBingDongBuffer(obj, buffer)
  1098. --local conf = BufferExcel[buffer.id]
  1099. local conf = CombatBuff.GetBuffConfig(buffer.id)
  1100. local attacker = CombatImpl.objList[buffer.attackPos]
  1101. if conf.cmd == "bingdong" then
  1102. for _, pos in ipairs(CombatDefine.SIDE2POS[attacker.side]) do
  1103. local target = CombatImpl.objList[pos]
  1104. if target and target.hp > 0 and target.beSkillList[BESKILL_TYPE64] then
  1105. for _,v in ipairs(target.beSkillList[BESKILL_TYPE64]) do
  1106. use(target,{obj},v)
  1107. end
  1108. end
  1109. end
  1110. end
  1111. end
  1112. --援军上阵触发
  1113. function onBackupBegin(obj)
  1114. if not obj then return end
  1115. if CombatDefine.isBackup(obj) ~= CombatDefine.BACKUP_TYPE2 then return end
  1116. -- 备份的被动技能上阵
  1117. if obj.backUpSkillList then
  1118. obj.beSkillList = obj.backUpSkillList
  1119. obj.backUpSkillList = nil
  1120. end
  1121. -- 出站计算属性
  1122. if obj.beSkillList[BESKILL_TYPE26] then
  1123. for _,v in ipairs(obj.beSkillList[BESKILL_TYPE26]) do
  1124. if canUse(obj,v) then
  1125. --local skillConfig = SkillExcel[v[1]]
  1126. local skillConfig = Skill.GetSkillConfig(v[1])
  1127. if skillConfig.cmd == "attr" then
  1128. for _,v1 in ipairs(skillConfig.args) do
  1129. obj.sysAttr[v1[1]] = obj.sysAttr[v1[1]] +v1[2]
  1130. end
  1131. obj.isSysAttrChange = true
  1132. elseif skillConfig.cmd == "normalTarget" then
  1133. use(obj,{},v)
  1134. end
  1135. end
  1136. end
  1137. end
  1138. table.sort(posSortBySpeed[CombatDefine.ATTACK_SIDE],posSpeedCmp)
  1139. table.sort(posSortBySpeed[CombatDefine.DEFEND_SIDE],posSpeedCmp)
  1140. --援军出战触发
  1141. if obj and obj.beSkillList[BESKILL_TYPE32] then
  1142. for k,v in ipairs(obj.beSkillList[BESKILL_TYPE32]) do
  1143. use(obj,{},v)
  1144. end
  1145. end
  1146. --上场技能
  1147. CombatDefine.BACKUP_BUFF_SKILL[2] = 1
  1148. use(obj,{}, CombatDefine.BACKUP_BUFF_SKILL)
  1149. end
  1150. function onRoundBegin(round)
  1151. for pos = 1,CombatDefine.COMBAT_HERO_ALL_CNT do
  1152. local target = CombatImpl.objList[pos]
  1153. if target and target.hp > 0 and target.beSkillList[BESKILL_TYPE19] then
  1154. for _,v in ipairs(target.beSkillList[BESKILL_TYPE19]) do
  1155. --table.print_lua_table(v)
  1156. -- print("beskill = onRoundBegin 开始使用技能 ID = "..v[1])
  1157. use(target,{},v)
  1158. end
  1159. end
  1160. -- 生命值触发
  1161. if target and target.hp > 0 and target.beSkillList[BESKILL_TYPE62] then
  1162. for _,v in ipairs(target.beSkillList[BESKILL_TYPE62]) do
  1163. --local skillConfig = SkillExcel[v[1]]
  1164. local skillConfig = Skill.GetSkillConfig(v[1])
  1165. local beSkillArgs = skillConfig.beSkillArgs
  1166. if beSkillArgs[1] == 1 then
  1167. local hpMax = CombatObj.getHpMax(target)
  1168. local percent = target.hp/hpMax
  1169. if percent > beSkillArgs[2]/10000 then
  1170. use(target,{},v)
  1171. end
  1172. end
  1173. if beSkillArgs[1] == 2 then
  1174. local hpMax = CombatObj.getHpMax(target)
  1175. local percent = target.hp/hpMax
  1176. if percent < beSkillArgs[2]/10000 then
  1177. use(target,{},v)
  1178. end
  1179. end
  1180. end
  1181. end
  1182. end
  1183. for pos = 1,CombatDefine.COMBAT_HERO_ALL_CNT do
  1184. local target = CombatImpl.objList[pos]
  1185. if target and target.hp > 0 and target.beSkillList[BESKILL_TYPE47] then
  1186. for _,v in ipairs(target.beSkillList[BESKILL_TYPE47]) do
  1187. --local skillConfig = SkillExcel[v[1]]
  1188. local skillConfig = Skill.GetSkillConfig(v[1])
  1189. if skillConfig.cmd == "attr" then
  1190. for _,v1 in ipairs(skillConfig.args) do
  1191. target.sysAttr[v1[1]] = target.sysAttr[v1[1]] +v1[2]
  1192. end
  1193. CombatObj.calcAttr(target)
  1194. CombatImpl.addFrame()
  1195. CombatImpl.setSkillID(target, v[1])
  1196. CombatImpl.setSaySkill(target.pos,skillConfig.id,skillConfig.contentType)
  1197. end
  1198. end
  1199. end
  1200. end
  1201. if round and round == 1 then
  1202. for pos = 1,CombatDefine.COMBAT_HERO_ALL_CNT do
  1203. local obj = CombatImpl.objList[pos]
  1204. if obj and obj.beSkillList[BESKILL_TYPE32] then
  1205. for k,v in ipairs(obj.beSkillList[BESKILL_TYPE32]) do
  1206. use(obj,{},v)
  1207. end
  1208. end
  1209. end
  1210. end
  1211. -- 在最后加
  1212. for pos = 1,CombatDefine.COMBAT_HERO_ALL_CNT do
  1213. local target = CombatImpl.objList[pos]
  1214. if target and target.hp > 0 and target.beSkillList[BESKILL_TYPE71] then
  1215. for _,v in ipairs(target.beSkillList[BESKILL_TYPE71]) do
  1216. -- print("[onRoundBegin] 开始加类型71的被动技能 pos = "..pos)
  1217. local skillConfig = Skill.GetSkillConfig(v[1])
  1218. if skillConfig and skillConfig.args then
  1219. -- local nLen = skillConfig.args[1]
  1220. -- for i = 1, nLen, 1 do
  1221. use(target,{},v)
  1222. -- end
  1223. end
  1224. end
  1225. end
  1226. end
  1227. end
  1228. function beforeFanji(obj, hitObj, isEnd)
  1229. if not obj or obj.isPet or obj.isElf then
  1230. return
  1231. end
  1232. if obj and obj.hurtType == CombatDefine.PHY_HURT_TYPE then
  1233. if obj and obj.beSkillList and obj.beSkillList[BESKILL_TYPE37] then
  1234. for _,v in ipairs(obj.beSkillList[BESKILL_TYPE37]) do
  1235. -- use(obj,{},v)
  1236. use(obj, {}, v, nil, nil, hitObj)
  1237. end
  1238. end
  1239. else
  1240. if obj and obj.beSkillList and obj.beSkillList[BESKILL_TYPE38] then
  1241. for _,v in ipairs(obj.beSkillList[BESKILL_TYPE38]) do
  1242. use(obj,{},v)
  1243. end
  1244. end
  1245. end
  1246. end
  1247. function onRoundEnd(isRoundEnd)
  1248. for pos = 1,CombatDefine.COMBAT_HERO_ALL_CNT do
  1249. local obj = CombatImpl.objList[pos]
  1250. if obj and obj.beSkillList[BESKILL_TYPE36] then
  1251. if pos == 1 then
  1252. end
  1253. for _,v in ipairs(obj.beSkillList[BESKILL_TYPE36]) do
  1254. use(obj,{},v)
  1255. end
  1256. end
  1257. end
  1258. if isRoundEnd then
  1259. for pos = 1,CombatDefine.COMBAT_HERO_ALL_CNT do
  1260. local target = CombatImpl.objList[pos]
  1261. if target and target.hp > 0 and target.beSkillList[BESKILL_TYPE20] then
  1262. for _,v in ipairs(target.beSkillList[BESKILL_TYPE20]) do
  1263. use(target,{},v)
  1264. end
  1265. end
  1266. end
  1267. end
  1268. end
  1269. function posSpeedCmp(a,b)
  1270. if a[2] > b[2] then
  1271. return true
  1272. elseif a[2] < b[2] then
  1273. return false
  1274. else
  1275. return a[1] < b[1]
  1276. end
  1277. end
  1278. -- 计算遗物特殊属性部分
  1279. local function BeSkill_RelicAttribute(ReleaserObj, tSkillInfo)
  1280. local nSkillID = tSkillInfo[1]
  1281. local tSkilConfig = Skill.GetSkillConfig(nSkillID)
  1282. if not tSkilConfig then
  1283. -- print("[BeSkill_RelicAttribute] 不存在技能配置 nSkillID = "..nSkillID)
  1284. return
  1285. end
  1286. local winnerID = ReleaserObj and ReleaserObj.relic and ReleaserObj.relic.relicID or 0
  1287. local winnerStar = ReleaserObj and ReleaserObj.relic and ReleaserObj.relic.star or 0
  1288. if 0 >= winnerID or 0 >= winnerStar then
  1289. return
  1290. end
  1291. -- 特殊处理防御为0, 加标识
  1292. if tSkilConfig.otherArgs.selefDefense then
  1293. ReleaserObj.relicAttr.bSpecialDef = true
  1294. end
  1295. -- 是否增加args属性
  1296. local bAddArgs = true
  1297. if tSkilConfig.otherArgs.winnerfiveraces then
  1298. bAddArgs = false
  1299. end
  1300. local targets = TargetMode.getTargets(ReleaserObj, tSkilConfig.targetMode)
  1301. if #targets > 0 and true == bAddArgs then
  1302. for _, obj in ipairs(targets) do
  1303. -- 加固定值属性
  1304. for _, v in ipairs(tSkilConfig.args) do
  1305. if not obj.relicAttr.FixedAttr[v[1]] then
  1306. obj.relicAttr.FixedAttr[v[1]] = 0
  1307. end
  1308. obj.relicAttr.FixedAttr[v[1]] = obj.relicAttr.FixedAttr[v[1]] + v[2]
  1309. end
  1310. end
  1311. else
  1312. -- print("[BeSkill_RelicAttribute] 获取不到对应的技能目标对象")
  1313. end
  1314. local nSide = ReleaserObj.side
  1315. local tCamp = {}
  1316. -- 检查
  1317. for pos = 1,CombatDefine.COMBAT_HERO_ALL_CNT do
  1318. local obj = CombatImpl.objList[pos]
  1319. if obj and obj.side and nSide == obj.side then
  1320. local nCamp = obj.camp
  1321. if nCamp then
  1322. tCamp[nCamp] = 1
  1323. end
  1324. end
  1325. end
  1326. local bAllCamp = true
  1327. for i = CombatDefine.CAMP_TYPE1, CombatDefine.CAMP_TYPE5, 1 do
  1328. if not tCamp[i] then
  1329. bAllCamp = false
  1330. break
  1331. end
  1332. end
  1333. for pos = 1,CombatDefine.COMBAT_HERO_ALL_CNT do
  1334. local obj = CombatImpl.objList[pos]
  1335. if obj and obj.side and nSide == obj.side then
  1336. -- 处理百分比值
  1337. -- 治疗
  1338. if tSkilConfig.otherArgs.jobZhiliao then
  1339. --table.print_lua_table(tSkilConfig.otherArgs.jobZhiliao)
  1340. if CombatBuff.isJob(obj, {CombatDefine.JOB_TYPE4}) then
  1341. -- local extraRate = WinnerRelicLogic.WinnerRelic_GetRateAttack(winnerID, winnerStar)
  1342. if not obj.relicAttr.ProAttr[RoleDefine.ZAOCHENG_HP_ADD_RATE] then
  1343. obj.relicAttr.ProAttr[RoleDefine.ZAOCHENG_HP_ADD_RATE] = 0
  1344. end
  1345. local nValue = tSkilConfig.otherArgs.jobZhiliao[2]
  1346. -- print("BeSkill_RelicAttribute 治療 nValue = ".. nValue)
  1347. obj.relicAttr.ProAttr[RoleDefine.ZAOCHENG_HP_ADD_RATE] = obj.relicAttr.ProAttr[RoleDefine.ZAOCHENG_HP_ADD_RATE] + nValue
  1348. if obj.relicAttr.ProAttr[RoleDefine.ZAOCHENG_HP_ADD_RATE] then
  1349. -- print("[BeSkill_RelicAttribute] 治療加成 為 nNewValue = "..obj.relicAttr.ProAttr[RoleDefine.ZAOCHENG_HP_ADD_RATE] )
  1350. else
  1351. -- print("[BeSkill_RelicAttribute] 不存在 nNewValue" )
  1352. end
  1353. end
  1354. end
  1355. -- 免伤 百分比
  1356. if tSkilConfig.otherArgs.jobMianshang then
  1357. if CombatBuff.isJob(obj, {CombatDefine.JOB_TYPE1}) then
  1358. --local extraRate = WinnerRelicLogic.WinnerRelic_GetRateDef(winnerID, winnerStar)
  1359. if not obj.relicAttr.ProAttr[RoleDefine.JIANSHANG_RATE] then
  1360. obj.relicAttr.ProAttr[RoleDefine.JIANSHANG_RATE] = 0
  1361. end
  1362. local nValue = tSkilConfig.otherArgs.jobMianshang[2]
  1363. -- print("BeSkill_RelicAttribute 免伤 nValue = ".. nValue)
  1364. obj.relicAttr.ProAttr[RoleDefine.JIANSHANG_RATE] = obj.relicAttr.ProAttr[RoleDefine.JIANSHANG_RATE] + nValue
  1365. -- print("[BeSkill_RelicAttribute] 免傷加成 為 nValue = "..nValue.." nNewValue = "..obj.relicAttr.ProAttr[RoleDefine.JIANSHANG_RATE])
  1366. end
  1367. end
  1368. -- 防御增加固定值
  1369. if tSkilConfig.otherArgs.jobDefense then
  1370. if CombatBuff.isJob(obj, {CombatDefine.JOB_TYPE4, CombatDefine.JOB_TYPE1}) then
  1371. if winnerID > 0 and winnerStar > 0 then
  1372. local extraRate = WinnerRelicLogic.WinnerRelic_GetRateAttack(winnerID, winnerStar)
  1373. if not obj.relicAttr.FixedAttr[RoleDefine.DEF] then
  1374. obj.relicAttr.FixedAttr[RoleDefine.DEF] = 0
  1375. end
  1376. obj.relicAttr.FixedAttr[RoleDefine.DEF] = obj.relicAttr.FixedAttr[RoleDefine.DEF] + extraRate
  1377. end
  1378. end
  1379. end
  1380. -- 攻击 百分比
  1381. if tSkilConfig.otherArgs.racialAtk then
  1382. if CombatBuff.isCamp(obj, {CombatDefine.COMBAT_TYPE27}) then
  1383. local extraRate = WinnerRelicLogic.WinnerRelic_GetRateAttack(winnerID, winnerStar)
  1384. if not obj.relicAttr.ProAttr[RoleDefine.ATK] then
  1385. obj.relicAttr.ProAttr[RoleDefine.ATK] = 0
  1386. end
  1387. obj.relicAttr.ProAttr[RoleDefine.ATK] = obj.relicAttr.ProAttr[RoleDefine.ATK] + extraRate
  1388. end
  1389. end
  1390. -- 上阵阵容为全职业,加固定值
  1391. if tSkilConfig.otherArgs.winnerfiveraces and bAllCamp == true then
  1392. for _, v in ipairs(tSkilConfig.args) do
  1393. if not obj.relicAttr.FixedAttr[v[1]] then
  1394. obj.relicAttr.FixedAttr[v[1]] = 0
  1395. end
  1396. obj.relicAttr.FixedAttr[v[1]] = obj.relicAttr.FixedAttr[v[1]] + v[2]
  1397. end
  1398. end
  1399. end
  1400. end
  1401. end
  1402. function onFightBegin()
  1403. posSortBySpeed[CombatDefine.ATTACK_SIDE] = {}
  1404. posSortBySpeed[CombatDefine.DEFEND_SIDE] = {}
  1405. for pos = 1,CombatDefine.COMBAT_HERO_ALL_CNT do
  1406. local obj = CombatImpl.objList[pos]
  1407. if obj then
  1408. obj.hp = obj.hp and obj.hp or 1
  1409. end
  1410. end
  1411. for pos = 1,CombatDefine.COMBAT_HERO_ALL_CNT do
  1412. local obj = CombatImpl.objList[pos]
  1413. if obj then
  1414. if obj.beSkillList[BESKILL_TYPE26] then
  1415. for _,v in ipairs(obj.beSkillList[BESKILL_TYPE26]) do
  1416. if canUse(obj,v) then
  1417. --local skillConfig = SkillExcel[v[1]]
  1418. local skillConfig = Skill.GetSkillConfig(v[1])
  1419. if skillConfig.cmd == "attr" then
  1420. for _,v1 in ipairs(skillConfig.args) do
  1421. obj.sysAttr[v1[1]] = obj.sysAttr[v1[1]] +v1[2]
  1422. end
  1423. obj.isSysAttrChange = true
  1424. elseif skillConfig.cmd == "normalTarget" then
  1425. use(obj,{},v)
  1426. elseif skillConfig.cmd == "winnerRelicSkill" then
  1427. use(obj,{},v)
  1428. BeSkill_RelicAttribute(obj, v)
  1429. end
  1430. end
  1431. end
  1432. end
  1433. if pos <= CombatDefine.COMBAT_HERO_CNT then
  1434. posSortBySpeed[CombatDefine.ATTACK_SIDE][#posSortBySpeed[CombatDefine.ATTACK_SIDE]+1] = {pos,obj.attr and obj.attr[RoleDefine.SPEED] or 0}
  1435. elseif pos <= CombatDefine.COMBAT_HERO_CNT * 2 then
  1436. posSortBySpeed[CombatDefine.DEFEND_SIDE][#posSortBySpeed[CombatDefine.DEFEND_SIDE]+1] = {pos,obj.attr and obj.attr[RoleDefine.SPEED] or 0}
  1437. end
  1438. end
  1439. end
  1440. for pos = 1,CombatDefine.COMBAT_HERO_ALL_CNT do
  1441. local obj = CombatImpl.objList[pos]
  1442. if obj then
  1443. obj.hp = nil
  1444. end
  1445. end
  1446. table.sort(posSortBySpeed[CombatDefine.ATTACK_SIDE],posSpeedCmp)
  1447. table.sort(posSortBySpeed[CombatDefine.DEFEND_SIDE],posSpeedCmp)
  1448. end
  1449. function onCombatPetBe(round)
  1450. if round <= 1 then
  1451. return
  1452. end
  1453. for side = 1,CombatDefine.DEFEND_SIDE do
  1454. local pet = CombatImpl.petList[side]
  1455. if pet and pet.petID and pet.beSkillList[BESKILL_TYPE27] then
  1456. for _,v in ipairs(pet.beSkillList[BESKILL_TYPE27]) do
  1457. --local skillConfig = SkillExcel[v[1]]
  1458. local skillConfig = Skill.GetSkillConfig(v[1])
  1459. if skillConfig.cmd == "mp" then
  1460. use(pet,{},v)
  1461. end
  1462. end
  1463. end
  1464. end
  1465. end
  1466. -- 计算被动技能属性
  1467. local beSkillIDList = {}
  1468. function doCalcHero(obj, attrs, skinSkillID, heroConf)
  1469. for i = 1, #beSkillIDList do
  1470. beSkillIDList[i] = nil
  1471. end
  1472. heroConf = heroConf or HeroDefine.getAttrConfig(obj.id, obj.star)
  1473. local beSkillIDs = heroConf.beSkillList
  1474. local skinSkillConf = skinSkillID and SkinSkillExcel[skinSkillID]
  1475. if skinSkillConf then
  1476. beSkillIDs = skinSkillConf.beSkillList
  1477. end
  1478. local weapSkillList = HeroExclusiveWeapon.GetweaponEffectIdList(obj)
  1479. for _, skillID in ipairs(beSkillIDs) do
  1480. --local skillConfig = SkillExcel[skillID]
  1481. skillID = weapSkillList and weapSkillList[skillID] or skillID
  1482. local skillConfig = Skill.GetSkillConfig(skillID)
  1483. if skillConfig.beSkillType == BESKILL_TYPE24 and
  1484. ((not obj) or (obj.quality >= skillConfig.need)) then
  1485. for _,v in ipairs(skillConfig.args) do
  1486. beSkillIDList[#beSkillIDList + 1] = v
  1487. end
  1488. else
  1489. beSkillIDList[#beSkillIDList + 1] = skillID
  1490. end
  1491. end
  1492. for _, skillID in ipairs(beSkillIDList) do
  1493. --local skillConfig = SkillExcel[skillID]
  1494. local skillConfig = Skill.GetSkillConfig(skillID)
  1495. if skillConfig and skillConfig.cmd == "attr" and
  1496. skillConfig.beSkillType == BESKILL_TYPE23 and
  1497. ((not obj) or (obj.quality >= skillConfig.need)) then
  1498. for _, v in ipairs(skillConfig.args) do
  1499. RoleAttr.updateValue(v[1], v[2], attrs)
  1500. end
  1501. elseif skillConfig and skillConfig.cmd == "attrcomboAgain" and
  1502. skillConfig.beSkillType == BESKILL_TYPE70 and
  1503. ((not obj) or (obj.quality >= skillConfig.need)) then
  1504. for i, v in ipairs(skillConfig.args) do
  1505. if v[1] == 1 then
  1506. RoleAttr.updateValue(v[2], v[3], attrs)
  1507. end
  1508. end
  1509. end
  1510. end
  1511. end
  1512. function beforeHit(attacker,defender)
  1513. attacker.beforeHitCheck = false
  1514. if attacker.beSkillList[BESKILL_TYPE40] then
  1515. local hpMax = CombatObj.getHpMax(defender)
  1516. local hp = defender.hp
  1517. local defendHpRate = hp*10000/hpMax
  1518. for _,v in ipairs(attacker.beSkillList[BESKILL_TYPE40]) do
  1519. --local skillConfig = SkillExcel[v[1]]
  1520. local skillConfig = Skill.GetSkillConfig(v[1])
  1521. if skillConfig.cmd == "lowerLimit" then
  1522. local args = skillConfig.args
  1523. if defendHpRate < args[1] then
  1524. attacker.beforeHitCheck = true
  1525. attacker.beskill40 = attacker.beskill40 or {}
  1526. attacker.beskill40[defender.pos] = 1
  1527. end
  1528. end
  1529. end
  1530. end
  1531. end
  1532. function afterHit(attacker,target, isEnd)
  1533. if attacker.beforeHitCheck then
  1534. for _,v in ipairs(attacker.beSkillList[BESKILL_TYPE40]) do
  1535. use(attacker,{target},v)
  1536. end
  1537. end
  1538. -- beforeFanji(attacker, isEnd)
  1539. beforeFanji(attacker, target, isEnd)
  1540. end
  1541. function getOutAtkRate(attacker, defender)
  1542. local outAtkRate = 0
  1543. -- 首次攻击
  1544. local isFirstAttack = CombatImpl.firstAttack[attacker.side]
  1545. if isFirstAttack then
  1546. for _,pos in ipairs(CombatDefine.SIDE2POS[defender.side]) do
  1547. local objM = CombatImpl.objList[pos]
  1548. if objM and objM.beSkillList[BESKILL_TYPE50] then
  1549. for _,v in ipairs(objM.beSkillList[BESKILL_TYPE50]) do
  1550. --local skillConfig = SkillExcel[v[1]]
  1551. local skillConfig = Skill.GetSkillConfig(v[1])
  1552. if skillConfig and skillConfig.otherArgs.outAtkRate then
  1553. if skillConfig.otherArgs.outAtkRate >= outAtkRate then
  1554. outAtkRate = skillConfig.otherArgs.outAtkRate
  1555. end
  1556. end
  1557. end
  1558. end
  1559. end
  1560. end
  1561. return outAtkRate
  1562. end
  1563. function getOutAtkRate2(attacker, skillConfig)
  1564. local outAtkRate = 0
  1565. for _, v in ipairs(attacker.beSkillList[BESKILL_TYPE72] or {}) do
  1566. local config = Skill.GetSkillConfig(v[1])
  1567. if config.cmd == "addHurtRateByRand" then
  1568. local addHurtRate = 0
  1569. for _, skillInfo in ipairs(config.beSkillArgs[2]) do
  1570. if table.find(skillInfo[1], skillConfig.id) then
  1571. addHurtRate = skillInfo[2]
  1572. break
  1573. end
  1574. end
  1575. local randVal = math.random(0, 10000)
  1576. if randVal <= config.beSkillArgs[1] then
  1577. outAtkRate = outAtkRate + addHurtRate
  1578. end
  1579. end
  1580. end
  1581. return outAtkRate
  1582. end
  1583. function getExtraHurtRate(attacker,defender,skillConfig)
  1584. if not attacker or attacker.isPet then
  1585. return 0
  1586. end
  1587. local zhanyiRet = 0
  1588. local bodongHurtRet = 0
  1589. local zhenduiHurtRate = 0
  1590. local zhenduiLen = 0
  1591. local zhenduiList = {}
  1592. local bezhenduiList = {}
  1593. local hpHurtRate = 0
  1594. local extraSpeedHurt = 0
  1595. local firstHurt = 0
  1596. local sexHurt = 0
  1597. local campHurt = 0
  1598. local reJobHurt = 0
  1599. local buffAndHPSubHurt = 0
  1600. for k,skillList in pairs(attacker.beSkillList) do
  1601. for j,v in pairs(skillList) do
  1602. --local config = SkillExcel[v[1]]
  1603. local config = Skill.GetSkillConfig(v[1])
  1604. if config.cmd == "zhanyi" then --战意 伤害加成
  1605. local nowHp = attacker.hp
  1606. local hpMax = CombatObj.getHpMax(attacker)
  1607. local percent = math.floor( (hpMax - nowHp )/hpMax * 100)
  1608. if percent >= 1 then
  1609. zhanyiRet = zhanyiRet + (percent * config.args[2])
  1610. end
  1611. elseif config.cmd == "fuwenAKH" then
  1612. for i = 1,#config.otherArgs do
  1613. zhenduiLen = zhenduiLen + 1
  1614. zhenduiList[config.otherArgs[i][1]] = zhenduiList[config.otherArgs[i][1]] or 0
  1615. zhenduiList[config.otherArgs[i][1]] = zhenduiList[config.otherArgs[i][1]] + config.otherArgs[i][2]
  1616. end
  1617. elseif config.cmd == "hurtBodong" then
  1618. if canUse(attacker, v) then
  1619. local minRet = config.args[1]
  1620. local maxRet = config.args[2]
  1621. local randomRet = math.random(minRet, maxRet)
  1622. bodongHurtRet = bodongHurtRet + randomRet - 10000
  1623. end
  1624. elseif config.cmd == "hpExtraHurt" then
  1625. local hp = defender.hp
  1626. local beSkillArgs = config.beSkillArgs
  1627. local checkHp = CombatObj.getHpMax(defender) * beSkillArgs[3] / 10000
  1628. if beSkillArgs[2] == 1 and hp > checkHp then
  1629. hpHurtRate = beSkillArgs[4]
  1630. elseif beSkillArgs[2] == 2 and hp < checkHp then
  1631. hpHurtRate = beSkillArgs[4]
  1632. end
  1633. elseif config.cmd == "extraSpeedHurt" then
  1634. extraSpeedHurt = config.args[1]
  1635. elseif config.cmd == "firstAttackHurt" then
  1636. if canUse(attacker, v) then
  1637. firstHurt = config.args[1]
  1638. end
  1639. elseif config.cmd == "buffAndHPSub" then
  1640. local nowHp = defender.hp
  1641. local hpMax = CombatObj.getHpMax(defender)
  1642. local percent = math.floor((hpMax - nowHp )/hpMax * 100) --已损失血量百分比
  1643. local condCfg = config.args
  1644. local condRate = condCfg[1]
  1645. if percent >= condRate then
  1646. local condStatusList = condCfg[2] or {}
  1647. local objNowSatus = CombatBuff.getStatus(defender)
  1648. for _, buffCmd in pairs(condStatusList) do
  1649. if objNowSatus[buffCmd] then
  1650. buffAndHPSubHurt = condCfg[3] or 0
  1651. break
  1652. end
  1653. end
  1654. end
  1655. elseif config.cmd == "hpSubHurtAdd" then
  1656. local nowHp = attacker.hp
  1657. local hpMax = CombatObj.getHpMax(attacker)
  1658. local percent = math.floor((hpMax - nowHp )/hpMax * 100) --已损失血量百分比
  1659. local condCfg = config.beSkillArgs
  1660. local condRate = condCfg[1]
  1661. if percent >= condRate then
  1662. hpHurtRate = hpHurtRate + condCfg[2]
  1663. end
  1664. end
  1665. end
  1666. end
  1667. for k,skillList in pairs(defender.beSkillList) do
  1668. for j,v in pairs(skillList) do
  1669. --local conf = SkillExcel[v[1]]
  1670. local conf = Skill.GetSkillConfig(v[1])
  1671. if conf then
  1672. if conf.cmd == "befuwenAKH" then
  1673. for i = 1,#conf.otherArgs do
  1674. zhenduiLen = zhenduiLen + 1
  1675. bezhenduiList[conf.otherArgs[i][1]] = bezhenduiList[conf.otherArgs[i][1]] or 0
  1676. bezhenduiList[conf.otherArgs[i][1]] = bezhenduiList[conf.otherArgs[i][1]] + conf.otherArgs[i][2]
  1677. end
  1678. -- 受性别增伤
  1679. elseif conf.cmd == "sexHurt" then
  1680. if attacker.sex == conf.args[1] then
  1681. sexHurt = sexHurt + conf.args[2]
  1682. end
  1683. -- 受阵营增伤
  1684. elseif conf.cmd == "campHurt" then
  1685. if attacker.camp == conf.args[1] then
  1686. campHurt = campHurt + conf.args[2]
  1687. end
  1688. -- 受职业增伤
  1689. elseif conf.cmd == "reJobHurt" then
  1690. if attacker.job == conf.args[1] then
  1691. reJobHurt = reJobHurt + conf.args[2]
  1692. end
  1693. end
  1694. end
  1695. end
  1696. end
  1697. if zhenduiLen > 0 then
  1698. local bAdd = 0
  1699. for k,skillList in pairs(defender.beSkillList) do
  1700. for j,v in pairs(skillList) do
  1701. --local conf = SkillExcel[v[1]]
  1702. local conf = Skill.GetSkillConfig(v[1])
  1703. local isFuWenSkill = v[5]
  1704. if conf.cmd and conf.cmd ~= "" and zhenduiList[conf.cmd] then
  1705. -- 符文技能只生效一个
  1706. if isFuWenSkill == 1 then
  1707. if bAdd == 0 then
  1708. zhenduiHurtRate = zhenduiHurtRate + zhenduiList[conf.cmd]
  1709. bAdd = 1
  1710. end
  1711. else
  1712. zhenduiHurtRate = zhenduiHurtRate + zhenduiList[conf.cmd]
  1713. end
  1714. end
  1715. end
  1716. end
  1717. bAdd = 0
  1718. for k,skillList in pairs(attacker.beSkillList) do
  1719. for j,v in pairs(skillList) do
  1720. --local conf = SkillExcel[v[1]]
  1721. local conf = Skill.GetSkillConfig(v[1])
  1722. local isFuWenSkill = v[5]
  1723. if conf.cmd and conf.cmd ~= "" and bezhenduiList[conf.cmd] then
  1724. if isFuWenSkill == 1 then
  1725. if bAdd == 0 then
  1726. zhenduiHurtRate = zhenduiHurtRate + bezhenduiList[conf.cmd]
  1727. bAdd = 1
  1728. end
  1729. else
  1730. zhenduiHurtRate = zhenduiHurtRate + bezhenduiList[conf.cmd]
  1731. end
  1732. end
  1733. end
  1734. end
  1735. end
  1736. --特殊buff 对血族的加成
  1737. local campHurtRate = 0
  1738. local campRate = nil
  1739. local buffCmd = nil
  1740. local camp = nil
  1741. for _,pos in ipairs(CombatDefine.SIDE2POS[attacker.side]) do
  1742. obj = CombatImpl.objList[pos]
  1743. if obj and obj.hp > 0 then
  1744. if obj.beSkillList[BESKILL_TYPE68] then
  1745. local beSkillList = obj.beSkillList[BESKILL_TYPE68][1]
  1746. --local skillConfig = SkillExcel[beSkillList[1]]
  1747. local skillConfig = Skill.GetSkillConfig(beSkillList[1])
  1748. if skillConfig then
  1749. camp = skillConfig.otherArgs.calcCamp[1]
  1750. buffCmd = skillConfig.otherArgs.calcCamp[2]
  1751. campRate = skillConfig.otherArgs.calcCamp[3]
  1752. break
  1753. end
  1754. end
  1755. end
  1756. end
  1757. if buffCmd and campRate and attacker.camp == camp then
  1758. local campHurtCnt = 0
  1759. for _,pos in ipairs(CombatDefine.SIDE2POS[defender.side]) do
  1760. obj = CombatImpl.objList[pos]
  1761. if obj and obj.hp > 0 then
  1762. local isStatus1, cmd1, ind1 = CombatBuff.isStatus(obj, buffCmd)
  1763. if isStatus1 then
  1764. campHurtCnt = campHurtCnt + 1
  1765. end
  1766. end
  1767. end
  1768. if campHurtCnt > 0 then
  1769. campHurtRate = campHurtCnt * campRate
  1770. end
  1771. end
  1772. local extraHurtRate = zhanyiRet + zhenduiHurtRate + bodongHurtRet + hpHurtRate + extraSpeedHurt + firstHurt + sexHurt + campHurt + reJobHurt + campHurtRate + buffAndHPSubHurt
  1773. if attacker.beSkillList[BESKILL_TYPE40] and attacker.beforeHitCheck then
  1774. for _,v in ipairs(attacker.beSkillList[BESKILL_TYPE40]) do
  1775. --local skillConfig = SkillExcel[v[1]]
  1776. local skillConfig = Skill.GetSkillConfig(v[1])
  1777. if skillConfig.cmd == "extraHurt" then
  1778. local args = skillConfig.args
  1779. extraHurtRate = extraHurtRate + args[1]
  1780. end
  1781. end
  1782. end
  1783. return extraHurtRate
  1784. end
  1785. --
  1786. function getExtraHurt(attacker, target, tUseskillConfig)
  1787. local extraHurt = 0
  1788. if attacker.beSkillList[BESKILL_TYPE55] then
  1789. local beSkillList = attacker.beSkillList[BESKILL_TYPE55][1]
  1790. --local skillConfig = SkillExcel[beSkillList[1]]
  1791. local skillConfig = Skill.GetSkillConfig(beSkillList[1])
  1792. local buffCmd = target.bufferCmd[skillConfig.otherArgs.buffCmdHurtRate[1]]
  1793. local rate = skillConfig.otherArgs.buffCmdHurtRate[2] / 10000
  1794. if buffCmd then
  1795. local buffCnt = #buffCmd
  1796. local buffIndex = buffCmd[buffCnt]
  1797. local buffer = target.buffer[buffIndex]
  1798. --local conf = BufferExcel[buffer.id]
  1799. local conf = CombatBuff.GetBuffConfig(buffer.id)
  1800. local hurt = buffer.arg[1]
  1801. extraHurt = extraHurt + hurt * rate * buffCnt
  1802. end
  1803. end
  1804. return extraHurt
  1805. end
  1806. -- 根据杀气buff获得额外属性加成
  1807. function GetExtraAttrByShaQi(attacker, targetAttrId)
  1808. local attrVal = 0
  1809. if not attacker then
  1810. return attrVal
  1811. end
  1812. -- for _, skillList in pairs(attacker.beSkillList) do
  1813. -- for _, v in pairs(skillList) do
  1814. -- local config = Skill.GetSkillConfig(v[1])
  1815. -- if config.cmd == "shaqi" then
  1816. -- local buffNum = CombatBuff.getBuffCnt(attacker, config.cmd)
  1817. -- if buffNum <= 0 then
  1818. -- return attrVal
  1819. -- end
  1820. -- for _, attrTb in ipairs(config.args) do
  1821. -- if attrTb[1] == targetAttrId then
  1822. -- attrVal = (attrTb[2] or 0) * buffNum
  1823. -- break
  1824. -- end
  1825. -- end
  1826. -- end
  1827. -- end
  1828. -- end
  1829. local buffNum = CombatBuff.getBuffCnt(attacker, "shaqi")
  1830. if buffNum <= 0 then
  1831. return attrVal
  1832. end
  1833. local attrArr
  1834. for i=1, attacker.buffer[0] do
  1835. local buffer = attacker.buffer[i]
  1836. local conf = CombatBuff.GetBuffConfig(buffer.id)
  1837. if conf.cmd == "shaqi" then
  1838. attrArr = conf.args
  1839. break
  1840. end
  1841. end
  1842. if not attrArr then
  1843. return attrVal
  1844. end
  1845. for _, attrTb in ipairs(attrArr) do
  1846. if attrTb[1] == targetAttrId then
  1847. attrVal = (attrTb[2] or 0) * buffNum
  1848. break
  1849. end
  1850. end
  1851. return attrVal
  1852. end
  1853. --
  1854. function getRandomBuffCmd(attacker, target, cmd)
  1855. local side = attacker.side
  1856. local mathRandom = math.random
  1857. for _,pos in ipairs(CombatDefine.SIDE2POS[side]) do
  1858. local obj = CombatImpl.objList[pos]
  1859. if obj and obj.hp > 0 and obj.beSkillList[BESKILL_TYPE56] then
  1860. local beSkillList = obj.beSkillList[BESKILL_TYPE56][1]
  1861. --local skillConfig = SkillExcel[beSkillList[1]]
  1862. local skillConfig = Skill.GetSkillConfig(beSkillList[1])
  1863. local buffCmdRand = skillConfig.otherArgs.buffCmdRand
  1864. if buffCmdRand and cmd == buffCmdRand[1] then
  1865. local random = mathRandom(1, 10000)
  1866. if random <= buffCmdRand[2] then
  1867. return true
  1868. end
  1869. end
  1870. end
  1871. end
  1872. end
  1873. function getHurtPercentRate(attacker, defender, hurt, tUseskillConfig)
  1874. local rate = 0
  1875. for k,skillList in pairs(defender.beSkillList) do
  1876. for j,v in pairs(skillList) do
  1877. --local conf = SkillExcel[v[1]]
  1878. local conf = Skill.GetSkillConfig(v[1])
  1879. if conf and conf.cmd == "behurtRet" then
  1880. local canUse = true
  1881. if conf.beSkillArgs and #conf.beSkillArgs > 0 then
  1882. if conf.beSkillArgs[1] == "hurthpper" then
  1883. local hpMax = CombatObj.getHpMax(defender)
  1884. local percent = hurt/hpMax
  1885. if percent < conf.beSkillArgs[2]/10000 then -- 伤害超过目标生命值上限X%时
  1886. canUse = false
  1887. end
  1888. end
  1889. end
  1890. if canUse == true then
  1891. local random = math.random(1, 10000)
  1892. if random <= conf.args[2] then
  1893. rate = rate + conf.args[1]
  1894. end
  1895. end
  1896. end
  1897. end
  1898. end
  1899. if tUseskillConfig.type == CombatDefine.SKILL_TYPE1 then
  1900. if attacker.beSkillList[BESKILL_TYPE1] then
  1901. for _, v in pairs(attacker.beSkillList[BESKILL_TYPE1]) do
  1902. local nSkillID = v[1]
  1903. --local skillConfig = SkillExcel[nSkillID]
  1904. local skillConfig = Skill.GetSkillConfig(nSkillID)
  1905. if skillConfig and skillConfig.hurtRate and skillConfig.hurtRate[1] then
  1906. local fRate = skillConfig.hurtRate[1]
  1907. rate = rate + fRate
  1908. --print("[getExtraHurt] 获取到的普工伤害加成概率 fRate = "..fRate.." 总加成 rate = "..rate)
  1909. end
  1910. end
  1911. end
  1912. end
  1913. return rate
  1914. end
  1915. function getBufferExtraHurt(attacker,bufferID,cmd)
  1916. local rate = 0
  1917. for _,skillList in pairs(attacker.beSkillList) do
  1918. for k,v in pairs(skillList) do
  1919. --local conf = SkillExcel[v[1]]
  1920. local conf = Skill.GetSkillConfig(v[1])
  1921. local otherArgs = conf.otherArgs
  1922. if bufferID and otherArgs.bufferExtraHurt then
  1923. for k1,v1 in ipairs(otherArgs.bufferExtraHurt[1]) do
  1924. if bufferID == v1 then
  1925. rate = rate + otherArgs.bufferExtraHurt[2]
  1926. end
  1927. end
  1928. end
  1929. if cmd and otherArgs.bufferCmdExtraHurt then
  1930. for k1,v1 in ipairs(otherArgs.bufferCmdExtraHurt[1]) do
  1931. if cmd == v1 then
  1932. rate = rate + otherArgs.bufferCmdExtraHurt[2]
  1933. end
  1934. end
  1935. end
  1936. end
  1937. end
  1938. return rate
  1939. end
  1940. function getExtraHurtRateEx(attacker, defender)
  1941. local rate = 0
  1942. -- 死亡数伤害率
  1943. if attacker.beSkillList[BESKILL_TYPE48] then
  1944. for _,v in ipairs(attacker.beSkillList[BESKILL_TYPE48]) do
  1945. --local skillConfig = SkillExcel[v[1]]
  1946. local skillConfig = Skill.GetSkillConfig(v[1])
  1947. if skillConfig and skillConfig.otherArgs.deathHurt then
  1948. local side = defender.side
  1949. for _,pos in ipairs(CombatDefine.SIDE2POS[side]) do
  1950. local obj = CombatImpl.objList[pos]
  1951. if obj and obj.hp <=0 then
  1952. if rate == 0 then
  1953. rate = skillConfig.otherArgs.deathHurt
  1954. else
  1955. rate = rate + 10000
  1956. end
  1957. end
  1958. end
  1959. end
  1960. end
  1961. end
  1962. return rate
  1963. end
  1964. --
  1965. function getBuffChixuHurt(attacker, cmd)
  1966. if not attacker then return 0 end
  1967. local hurt = 0
  1968. local side = attacker.side
  1969. for _,pos in ipairs(CombatDefine.SIDE2POS[side]) do
  1970. local objM = CombatImpl.objList[pos]
  1971. if objM and objM.hp > 0 and objM.beSkillList[BESKILL_TYPE54] then
  1972. for _,v in ipairs(objM.beSkillList[BESKILL_TYPE54]) do
  1973. --local skillConfig = SkillExcel[v[1]]
  1974. local skillConfig = Skill.GetSkillConfig(v[1])
  1975. if skillConfig and skillConfig.otherArgs[cmd] then
  1976. hurt = hurt + skillConfig.otherArgs[cmd]
  1977. end
  1978. end
  1979. end
  1980. end
  1981. return hurt / 10000
  1982. end
  1983. --
  1984. function handlerBuff(attacker, target, arg, cmd)
  1985. if not attacker then return end
  1986. for _,pos in ipairs(CombatDefine.SIDE2POS[attacker.side]) do
  1987. local obj = CombatImpl.objList[pos]
  1988. if obj and obj.hp > 0 and obj.beSkillList[BESKILL_TYPE57] then
  1989. for _,v in ipairs(obj.beSkillList[BESKILL_TYPE57]) do
  1990. attacker.args = arg
  1991. use(attacker, {target}, v, false)
  1992. end
  1993. end
  1994. end
  1995. end
  1996. function beforeMinusHp(obj, value)
  1997. if value <= 0 then return end
  1998. --敌对阵营 有对象有 49号被动技能 加血变成减血
  1999. local side = obj.side == CombatDefine.ATTACK_SIDE and CombatDefine.DEFEND_SIDE or CombatDefine.ATTACK_SIDE
  2000. for _,pos in ipairs(CombatDefine.SIDE2POS[side]) do
  2001. local objM = CombatImpl.objList[pos]
  2002. if objM and objM.hp > 0 and objM.beSkillList[BESKILL_TYPE49] then
  2003. value = value * (-1)
  2004. break
  2005. end
  2006. end
  2007. return value
  2008. end
  2009. function beforeUpdateHp(obj,sum)
  2010. if sum <= 0 and obj.beSkillList[BESKILL_TYPE41] then
  2011. for _,v in ipairs(obj.beSkillList[BESKILL_TYPE41]) do
  2012. --local skillConfig = SkillExcel[v[1]]
  2013. local skillConfig = Skill.GetSkillConfig(v[1])
  2014. if skillConfig.cmd == "miansi" and canUse(obj,v) then
  2015. use(obj,{},v)
  2016. return true
  2017. end
  2018. end
  2019. end
  2020. end
  2021. function onCheckBuffer(obj,attacker,value)
  2022. local ret = value
  2023. if obj.beSkillList[BESKILL_TYPE42] then
  2024. for _,v in ipairs(obj.beSkillList[BESKILL_TYPE42]) do
  2025. --local skillConfig = SkillExcel[v[1]]
  2026. local skillConfig = Skill.GetSkillConfig(v[1])
  2027. if canUse(obj,v) then
  2028. local newFrame = true
  2029. if skillConfig.cmd == "baohu" then
  2030. obj.baohuHurt = value * skillConfig.args[1] / 10000
  2031. if obj.hp < -obj.baohuHurt then
  2032. obj.baohuHurt = -obj.hp
  2033. end
  2034. ret = value - obj.baohuHurt
  2035. newFrame = false
  2036. end
  2037. use(obj,{attacker},v, newFrame)
  2038. break
  2039. end
  2040. end
  2041. end
  2042. return ret
  2043. end
  2044. function getStatusBaoji(attacker, defender)
  2045. local baoji = 0
  2046. local firstBaoji = 0
  2047. for k, skillList in pairs(attacker.beSkillList) do
  2048. for j, v in pairs(skillList) do
  2049. --local config = SkillExcel[v[1]]
  2050. local config = Skill.GetSkillConfig(v[1])
  2051. if config.cmd == "firstAttackHurt" then
  2052. if canUse(attacker, v) then
  2053. firstBaoji = config.args[2] or 0
  2054. end
  2055. end
  2056. end
  2057. end
  2058. if attacker.beSkillList[BESKILL_TYPE60] then
  2059. for _, v in ipairs(attacker.beSkillList[BESKILL_TYPE60]) do
  2060. --local skillConfig = SkillExcel[v[1]]
  2061. local skillConfig = Skill.GetSkillConfig(v[1])
  2062. if skillConfig and skillConfig.otherArgs.addStatusBaoji then
  2063. local status = CombatBuff.getStatus(defender)
  2064. local isStatus = false
  2065. for k, v in ipairs(skillConfig.otherArgs.addStatusBaoji[1]) do
  2066. if status[v] then
  2067. isStatus = true
  2068. break
  2069. end
  2070. end
  2071. if isStatus then
  2072. baoji = baoji + skillConfig.otherArgs.addStatusBaoji[2]
  2073. end
  2074. end
  2075. end
  2076. end
  2077. if attacker.beSkillList[BESKILL_TYPE69] and attacker.notBaoJi then
  2078. for _, v in ipairs(attacker.beSkillList[BESKILL_TYPE69]) do
  2079. --local skillConfig = SkillExcel[v[1]]
  2080. local skillConfig = Skill.GetSkillConfig(v[1])
  2081. if skillConfig and skillConfig.otherArgs.addNotBaoji then
  2082. baoji = baoji + skillConfig.otherArgs.addNotBaoji
  2083. end
  2084. end
  2085. end
  2086. return baoji + firstBaoji
  2087. end
  2088. function getStatusPojia(attacker, defender)
  2089. local poJia = 0
  2090. -- 对指定状态破甲加成 走的技能状态属性
  2091. if attacker.beSkillList[BESKILL_TYPE60] then
  2092. for _, v in ipairs(attacker.beSkillList[BESKILL_TYPE60]) do
  2093. --local skillConfig = SkillExcel[v[1]]
  2094. local skillConfig = Skill.GetSkillConfig(v[1])
  2095. if skillConfig.otherArgs.addStatusPoJia then
  2096. local status = CombatBuff.getStatus(defender)
  2097. local isStatus = false
  2098. for k, v in ipairs(skillConfig.otherArgs.addStatusPoJia[1]) do
  2099. if status[v] then
  2100. isStatus = true
  2101. break
  2102. end
  2103. end
  2104. if isStatus then
  2105. poJia = poJia + skillConfig.otherArgs.addStatusPoJia[2]
  2106. end
  2107. end
  2108. end
  2109. end
  2110. return poJia
  2111. end
  2112. -- 是否不会被反击
  2113. function isNoFanji(obj)
  2114. if obj.beSkillList[BESKILL_TYPE72] then
  2115. for _, v in ipairs(obj.beSkillList[BESKILL_TYPE72]) do
  2116. local skillConfig = Skill.GetSkillConfig(v[1])
  2117. if skillConfig.cmd == "noFanji" then
  2118. return true
  2119. end
  2120. end
  2121. end
  2122. return false
  2123. end
  2124. -- 获取与神威灵装"真伤附加"效果相对的"真伤减免"
  2125. function GetTrueDamegeOffset(obj)
  2126. if obj.beSkillList[BESKILL_TYPE72] then
  2127. for _, v in ipairs(obj.beSkillList[BESKILL_TYPE72]) do
  2128. local skillConfig = Skill.GetSkillConfig(v[1])
  2129. if skillConfig.cmd == "trueDamegeOffset" then
  2130. local offsetInfo = {}
  2131. offsetInfo[1] = skillConfig.beSkillArgs[1]
  2132. offsetInfo[2] = skillConfig.beSkillArgs[2]
  2133. return offsetInfo
  2134. end
  2135. end
  2136. end
  2137. end
  2138. -- 触发格挡后额外减伤
  2139. function GetGeDangExtraDef(obj)
  2140. if obj.beSkillList[BESKILL_TYPE72] then
  2141. for _, v in ipairs(obj.beSkillList[BESKILL_TYPE72]) do
  2142. local skillConfig = Skill.GetSkillConfig(v[1])
  2143. if skillConfig.cmd == "gedangExtraDef" then
  2144. return skillConfig.beSkillArgs[1]
  2145. end
  2146. end
  2147. end
  2148. return 0
  2149. end
  2150. -- 伤害翻倍
  2151. function GetBeSkillHurtMul(obj)
  2152. if obj.beSkillList[BESKILL_TYPE72] then
  2153. for _, v in ipairs(obj.beSkillList[BESKILL_TYPE72]) do
  2154. local skillConfig = Skill.GetSkillConfig(v[1])
  2155. if skillConfig.cmd == "physicalDamageMul" and obj.hurtType == CombatDefine.PHY_HURT_TYPE then
  2156. return math.random(skillConfig.beSkillArgs[1], skillConfig.beSkillArgs[2])
  2157. end
  2158. if skillConfig.cmd == "magicDamageMul" and obj.hurtType == CombatDefine.MAGIC_HURT_TYPE then
  2159. return math.random(skillConfig.beSkillArgs[1], skillConfig.beSkillArgs[2])
  2160. end
  2161. end
  2162. end
  2163. end
  2164. -- 回血翻倍
  2165. function GetBeSkillRestoretHPMul(obj)
  2166. local mul = 1
  2167. if obj.beSkillList[BESKILL_TYPE72] then
  2168. for _, v in ipairs(obj.beSkillList[BESKILL_TYPE72]) do
  2169. local skillConfig = Skill.GetSkillConfig(v[1])
  2170. if skillConfig.cmd == "restoreHPMul" then
  2171. local r = math.random(1,10000)
  2172. if r <= (skillConfig.beSkillArgs[2] or 0) then
  2173. mul = skillConfig.beSkillArgs[1] or 1
  2174. end
  2175. return mul
  2176. end
  2177. end
  2178. end
  2179. return mul
  2180. end