Shield.lua 5.5 KB

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