Shield.lua 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. Shield = Buff:New()
  2. -- 无敌吸血盾的免疫状态
  3. local immune0 = function(buff)
  4. return buff.type == BuffName.Control or buff.isDeBuff or buff.type == BuffName.DOT
  5. end
  6. --初始化Buff,通过传入一些自定义参数控制成长相关的数值
  7. function Shield:SetData(...)
  8. self.shieldType, -- 护盾类型(1 固定减伤盾 2 百分比减伤盾 3 无敌盾)
  9. self.shieldValue, -- 护盾值(固定减伤盾:减伤值 百分比减伤盾:减伤百分比 无敌盾:吸血率)
  10. self.dmgReboundFactor = ... --伤害反弹系数
  11. self.damageSum = 0 --记录承受的伤害
  12. self.isBuff = true
  13. self.atk=nil --每次扣除护盾时,记录破盾的对象
  14. self.isValueCover = false --是否是护盾值对比覆盖
  15. self.cover = self.shieldType ~= ShieldTypeName.NormalReduce -- 除固定减伤盾外都不能叠加
  16. -- 刷新排序等级
  17. self.sort = 4
  18. end
  19. --初始化后调用一次
  20. function Shield:OnStart()
  21. self.target.shield:Add(self)
  22. if self.shieldType == ShieldTypeName.AllReduce then
  23. self.target.buffFilter:Add(immune0)
  24. -- 清除所有负面buff
  25. BattleLogic.BuffMgr:ClearBuff(self.target, function (buff)
  26. return buff.type == BuffName.Control or buff.type == BuffName.DOT
  27. end)
  28. end
  29. end
  30. --间隔N帧触发,返回true时表示继续触发,返回false立刻触发OnEnd
  31. function Shield:OnTrigger()
  32. return true
  33. end
  34. -- 计算护盾
  35. function Shield:CountShield(damage, atkRole)
  36. self.atk = atkRole
  37. local finalDamage = 0
  38. if self.shieldType == ShieldTypeName.NormalReduce then
  39. if damage < self.shieldValue then
  40. self.shieldValue = self.shieldValue - damage
  41. self.damageSum = self.damageSum + damage
  42. else
  43. self.damageSum = self.damageSum + self.shieldValue
  44. finalDamage = damage - self.shieldValue
  45. self.shieldValue = 0
  46. self.disperse = true
  47. end
  48. elseif self.shieldType == ShieldTypeName.RateReduce then
  49. local reduceDamage = math.floor(BattleUtil.ErrorCorrection(damage * self.shieldValue))
  50. finalDamage = damage - reduceDamage
  51. self.damageSum = self.damageSum + reduceDamage
  52. elseif self.shieldType == ShieldTypeName.AllReduce then
  53. finalDamage = 0
  54. --TODO 计算吸血
  55. if self.shieldValue ~= 0 then
  56. local treatValue = math.floor(BattleUtil.ErrorCorrection(damage * self.shieldValue))
  57. BattleUtil.ApplyTreat(self.target, self.target, treatValue)
  58. end
  59. end
  60. --
  61. -- self.caster.Event:DispatchEvent(BattleEventName.ShildTrigger, self)
  62. self.target.Event:DispatchEvent(BattleEventName.ShildTrigger, self)
  63. BattleLogic.Event:DispatchEvent(BattleEventName.ShildTrigger, self)
  64. return math.floor(finalDamage)
  65. end
  66. -- 提前计算护盾吸收伤害
  67. function Shield:PreCountShield(damage)
  68. local finalDamage = 0
  69. if self.shieldType == ShieldTypeName.NormalReduce then
  70. if damage > self.shieldValue then
  71. finalDamage = damage - self.shieldValue
  72. end
  73. elseif self.shieldType == ShieldTypeName.RateReduce then
  74. local reduceDamage = math.floor(BattleUtil.ErrorCorrection(damage * self.shieldValue))
  75. finalDamage = damage - reduceDamage
  76. elseif self.shieldType == ShieldTypeName.AllReduce then
  77. finalDamage = 0
  78. end
  79. return math.floor(finalDamage)
  80. end
  81. -- 改变护盾值(固定减伤盾:减伤值 百分比减伤盾:减伤百分比 无敌盾:吸血率)
  82. function Shield:ChangeShieldValue(type, value)
  83. -- 计算
  84. local finalValue = BattleUtil.ErrorCorrection(BattleUtil.CountValue(self.shieldValue, value, type))
  85. self.shieldValue = finalValue
  86. -- 发送事件
  87. self.caster.Event:DispatchEvent(BattleEventName.ShildValueChange, self)
  88. end
  89. --效果结束时调用一次
  90. function Shield:OnEnd()
  91. -- 计算反伤
  92. if self.shieldType == ShieldTypeName.NormalReduce then
  93. for i = 1, self.target.shield.size do
  94. if self.target.shield.buffer[i] == self then
  95. local dd = math.floor(self.dmgReboundFactor * self.damageSum)
  96. if dd > 0 and self.atk then
  97. BattleUtil.ApplyDamage(nil, self.target, self.atk, dd)
  98. end
  99. -- local arr = RoleManager.Query(function (r) return r.camp ~= self.target.camp end)
  100. -- for j = 1, #arr do
  101. -- end
  102. self.target.shield:Remove(i)
  103. break
  104. end
  105. end
  106. elseif self.shieldType == ShieldTypeName.RateReduce then
  107. for i = 1, self.target.shield.size do
  108. if self.target.shield.buffer[i] == self then
  109. self.target.shield:Remove(i)
  110. break
  111. end
  112. end
  113. elseif self.shieldType == ShieldTypeName.AllReduce then
  114. for i = 1, self.target.shield.size do
  115. if self.target.shield.buffer[i] == self then
  116. self.target.shield:Remove(i)
  117. break
  118. end
  119. end
  120. -- 移除免疫效果
  121. for i = 1, self.target.buffFilter.size do
  122. if self.target.buffFilter.buffer[i] == immune0 then
  123. self.target.buffFilter:Remove(i)
  124. break
  125. end
  126. end
  127. end
  128. end
  129. --比较护盾值
  130. function Shield:OnCompareShielValue(buff)
  131. return self.shieldValue < buff.shieldValue
  132. end
  133. --只有当cover字段为true时触发,返回true则被新效果覆盖
  134. function Shield:OnCover(newBuff)
  135. return true
  136. end
  137. -- 比较buff
  138. function Shield:OnCompare(buff)
  139. return self.shieldType == buff.shieldType
  140. end
  141. return Shield