Commit 7c55db1f30c88e6393b799a121199f43c773c6df

Authored by suhongyang
1 parent 69d686f8

Buff逻辑完善,buff生效次数和争斗内buff生命周期逻辑新增

src/adv/AdvBattle.lua
... ... @@ -102,17 +102,22 @@ function Battle:playerAtk(roomId, blockId)
102 102 while not enemy.isDead and not self.player.isDead do
103 103 -- 玩家先出手
104 104 self.adv:backAtk(nil, enemy.id)
105   - enemy:hurt(self.player:getHurtValue(), self.player, {hurtType = 1})
106   - self.player:afterTurn()
  105 + self:doBattleTurn(self.player, enemy)
107 106 --是否无法反击
108 107 if not enemy.isDead and not enemy:hadBuff(Buff.CANT_BACK_ATK) then
109 108 self.adv:backAtk(enemy.id, nil)
110   - self.player:hurt(enemy:getHurtValue(), enemy, {hurtType = 1})
111   - enemy:afterTurn()
  109 + self:doBattleTurn(enemy, self.player)
112 110 end
113 111 end
114 112 end
115 113 end
  114 +--战斗内回合逻辑
  115 +function Battle:doBattleTurn(atkPlayer, hurtPlayer)
  116 + atkPlayer:beforeTurn()
  117 + hurtPlayer:hurt(atkPlayer:getHurtValue(), atkPlayer, {hurtType = 1})
  118 + atkPlayer:afterTurn()
  119 + atkPlayer:clearTurn()
  120 +end
116 121 --触发全员被动技能
117 122 function Battle:triggerPassive(condType, params)
118 123 self.player:triggerPassive(condType, params)
... ...
src/adv/AdvBuff.lua
... ... @@ -51,13 +51,17 @@ local BuffFactory = {
51 51 _Buff._initDB = function(self, data)
52 52 self._changeV = data.cv
53 53 end
54   - _Buff._afterRount = function(self)
55   - if self._changeV > 0 then
56   - self.owner:recover(self._changeV, self.release)
57   - elseif self._changeV < 0 then
58   - self.owner:hurt(-self._changeV, self.release, {hurtType = 2})
  54 + _Buff._afterRound = function(self)
  55 + local value = self:effect()
  56 + if value > 0 then
  57 + self.owner:recover(value, self.release)
  58 + elseif value < 0 then
  59 + self.owner:hurt(-value, self.release, {hurtType = 2})
59 60 end
60 61 end
  62 + _Buff._effectValue = function(self)
  63 + return self._changeV
  64 + end
61 65 _Buff._getDB = function(self)
62 66 return {cv = self._changeV}
63 67 end
... ... @@ -146,43 +150,73 @@ local BuffFactory = {
146 150 _Buff._init = function(self, data)
147 151 self.count = self.buffData.effectValue3
148 152 end
149   - _Buff._effectValue = function(self)
150   - return self.buffData.effectValue1, self.buffData.effectValue2
  153 + _Buff._canEffect = function(self, buffId, buffGroup)
  154 + local cType, aim = self.buffData.effectValue1, self.buffData.effectValue2
  155 + if (cType == 0 and buffId == aim) or (cType == 1 and buffGroup == aim) then
  156 + return true
  157 + end
151 158 end
152 159 end,
153 160  
154 161 [Buff.CLEAR_BUFF] = function(_Buff)
155 162 _Buff._init = function(self, data)
156 163 self.count = self.buffData.effectValue3
157   - self:_afterRount() -- 挂上就清除一下子
  164 + self:_afterRound() -- 挂上就清除一下子
158 165 end
159   - _Buff._afterRount = function(self)
160   - local cType, aim = self:effectValue()
  166 + _Buff._afterRound = function(self)
161 167 for _, buff in ipairs(self.buffs) do
162   - if not buff.isDel and ((cType == 0 and buff.id == aim) or (cType == 1 and buff:getGroup() == aim)) then
  168 + if not buff.isDel and self:canEffect(buff.id, buff:getGroup()) then
163 169 buff.isDel = true
164   - self:decCount()
  170 + self:effect()
165 171 end
166 172 end
167 173 end
168   - _Buff._effectValue = function(self)
169   - return self.buffData.effectValue1, self.buffData.effectValue2
  174 + _Buff._canEffect = function(self, buffId, buffGroup)
  175 + local cType, aim = self.buffData.effectValue1, self.buffData.effectValue2
  176 + if (cType == 0 and buffId == aim) or (cType == 1 and buffGroup == aim) then
  177 + return true
  178 + end
170 179 end
171 180 end,
172 181  
173 182 [Buff.OPEN_BLOCK] = function(_Buff)
174   - _Buff._afterRount = function(self)
175   - self.owner.battle.adv:openBlockRand(self.buffData.effectValue1)
  183 + _Buff._afterRound = function(self)
  184 + local roomNum = self:effect()
  185 + self.owner.battle.adv:openBlockRand(roomNum)
  186 + end
  187 + _Buff._effectValue = function(self)
  188 + return self.buffData.effectValue1
176 189 end
177 190 end,
178 191  
179 192 [Buff.POWER_CHANGE] = function(_Buff)
180   - _Buff._afterRount = function(self)
181   - self.owner.battle.adv:changePower(self.buffData.effectValue2, self.buffData.effectValue1)
  193 + --cType 0 or nil 值 1 百分比
  194 + _Buff._afterRound = function(self)
  195 + local value, cType = self:effect()
  196 + self.owner.battle.adv:changePower(value, cType)
  197 + end
  198 + _Buff._effectValue = function(self)
  199 + return self.buffData.effectValue1, self.buffData.effectValue2
182 200 end
183 201 end
184 202 }
185 203  
  204 +function Buff:ctor(owner, id)
  205 + self.owner = owner
  206 + self.id = id
  207 + self.buffData = csvdb["adv_buffCsv"][self.id]
  208 + self.isDel = false
  209 + self.ifRoundEnd = false
  210 + self.roundSpace = 0 --生效间隔
  211 + self.turnSpace = 0 --生效间隔
  212 + self.round = 0 --剩余的回合
  213 + self.turn = 0 --剩余战斗内回合
  214 + self.count = -1 -- 可生效的次数 -1 无次数限制
  215 +
  216 + if BuffFactory[self.buffData.type] then
  217 + BuffFactory[self.buffData.type](self)
  218 + end
  219 +end
186 220  
187 221 function Buff.create(owner, release, data)
188 222 local buff = Buff.new(owner, data.id)
... ... @@ -196,16 +230,15 @@ function Buff.load(owner, data)
196 230 return buff
197 231 end
198 232  
199   -function Buff:ctor(owner, id)
200   - self.owner = owner
201   - self.id = id
202   - self.buffData = csvdb["adv_buffCsv"][self.id]
203   - self.isDel = false
204   - self.round = 0 --剩余的回合
205   - self.count = -1 -- 可生效的次数 -1 无次数限制
206   -
207   - if BuffFactory[self.buffData.type] then
208   - BuffFactory[self.buffData.type](self)
  233 +function Buff:initNew(release, data)
  234 + self.release = release
  235 + self.round = self.buffData.round
  236 + self.turn = self.buffData.turn
  237 + if self.buffData.effectTime > 0 then
  238 + self.count = self.buffData.effectTime
  239 + end
  240 + if self._init then
  241 + self:_init(data)
209 242 end
210 243 end
211 244  
... ... @@ -218,6 +251,7 @@ function Buff:initByDB(data)
218 251 end
219 252 end
220 253 self.round = data.round
  254 + self.roundSpace = data.roundSp -- 可以优化为0的时候不记录
221 255 if data.count then
222 256 self.count = data.count
223 257 end
... ... @@ -227,32 +261,89 @@ function Buff:initByDB(data)
227 261 end
228 262 end
229 263  
230   -function Buff:initNew(release, data)
231   - self.release = release
232   - self.round = self.buffData.round
233   - if self._init then
234   - self:_init(data)
  264 +function Buff:battleBegin()
  265 + self.turn = self.buffData.turn
  266 + self.ifRoundEnd = self.buffData.turn ~= 0 -- turn类型buff战斗结束后移除
  267 +end
  268 +
  269 +function Buff:beforeTurn()
  270 + if self.isDel or self.owner.isDead then return end
  271 + if self.turnSpace > 0 then
  272 + return
  273 + end
  274 + if self._beforeTurn then
  275 + self:_beforeTurn()
  276 + end
  277 +end
  278 +
  279 +function Buff:afterTurn()
  280 + if self.isDel or self.owner.isDead then return end
  281 + if self.turnSpace > 0 then
  282 + self.turnSpace = self.turnSpace - 1
  283 + self:decTurn()
  284 + return
  285 + end
  286 + if self._afterTurn then
  287 + self:_afterTurn()
  288 + end
  289 + if self.buffData.turnTime > 0 then
  290 + self.turnSpace = self.buffData.turnTime
  291 + end
  292 + self:decTurn()
  293 +end
  294 +
  295 +function Buff:decTurn()
  296 + if self.buffData.turn == 0 then
  297 + return
  298 + end
  299 + self.turn = self.turn - 1
  300 + if self.turn <= 0 then
  301 + self.isDel = true
235 302 end
236 303 end
237 304  
238 305 function Buff:afterRound()
239   - if self.isDel or self.owner.isDead then return end
240   - if self._afterRount then
241   - self:_afterRount()
  306 + if self.isDel or self.owner.isDead then return end
  307 + if self.roundSpace > 0 then
  308 + self.roundSpace = self.turnSpace - 1
  309 + self:decRound()
  310 + return
  311 + end
  312 + if self._afterRound then
  313 + self:_afterRound()
  314 + end
  315 + if self.ifRoundEnd then -- turn类型buff战斗结束后移除
  316 + self.isDel = true
  317 + return
242 318 end
  319 + if self.buffData.roundTime > 0 then
  320 + self.turnSpace = self.buffData.roundTime
  321 + end
  322 + self:decRound()
  323 +end
243 324  
244   - if self.buffData.round ~= 0 then
245   - self.round = self.round - 1
246   - if self.round <= 0 then
247   - self.isDel = true
248   - end
  325 +function Buff:decRound()
  326 + if self.buffData.round == 0 then
  327 + return
  328 + end
  329 + self.round = self.round - 1
  330 + if self.round <= 0 then
  331 + self.isDel = true
  332 + end
  333 +end
  334 +
  335 +function Buff:canEffect(...)
  336 + if not self._canEffect then
  337 + return true
249 338 end
  339 + return self:_canEffect(...)
250 340 end
251 341  
252   -function Buff:effectValue()
  342 +function Buff:effect()
253 343 if self._effectValue then
254 344 return self:_effectValue()
255 345 end
  346 + self:decCount()
256 347 end
257 348 --删除buff 时调用
258 349 function Buff:endBuff()
... ... @@ -289,6 +380,7 @@ function Buff:getDB()
289 380 if self.buffData.round ~= 0 then
290 381 db.round = self.round
291 382 end
  383 + db.roundSp = self.roundSpace
292 384 if self.count ~= -1 then
293 385 db.count = self.count
294 386 end
... ...
src/adv/AdvPlayer.lua
... ... @@ -40,13 +40,19 @@ function BaseObject:initAfter(data)
40 40 end
41 41 end
42 42  
  43 +function BaseObject:beforeTurn()
  44 + for _, buff in ipairs(self.buffs) do
  45 + buff:beforeTurn()
  46 + end
  47 +end
  48 +
43 49 function BaseObject:afterTurn()
44 50 for _, passive in ipairs(self.passives) do
45 51 passive:afterTurn()
46 52 end
47   - -- for _, buff in ipairs(self.buffs) do
48   - -- buff:afterTurn(self)
49   - -- end
  53 + for _, buff in ipairs(self.buffs) do
  54 + buff:afterTurn()
  55 + end
50 56 end
51 57  
52 58 function BaseObject:afterRound()
... ... @@ -58,6 +64,16 @@ function BaseObject:afterRound()
58 64 end
59 65 end
60 66  
  67 +function BaseObject:clearTurn()
  68 + for i = #self.buffs, 1, -1 do
  69 + if self.buffs[i].isDel then
  70 + self.battle.adv:backBuff(self.id, self.buffs[i].id, true)
  71 + self.buffs[i]:endBuff()
  72 + table.remove(self.buffs, i)
  73 + end
  74 + end
  75 +end
  76 +
61 77 function BaseObject:clearRound()
62 78 for i = #self.passives, 1, -1 do
63 79 if self.passives[i].isDel then
... ... @@ -82,9 +98,9 @@ function BaseObject:battleBegin()
82 98 for _, passive in ipairs(self.passives) do
83 99 passive:battleBegin()
84 100 end
85   - -- for _, buff in ipairs(self.buffs) do
86   - -- buff:afterRound(self)
87   - -- end
  101 + for _, buff in ipairs(self.buffs) do
  102 + buff:battleBegin()
  103 + end
88 104 end
89 105  
90 106 function BaseObject:addPassive(params)
... ... @@ -102,10 +118,9 @@ function BaseObject:addBuff(buffId, releaser)
102 118 local buffData = csvdb["adv_buffCsv"][buffId]
103 119 if not buffData then return end
104 120 for _, buff in ipairs(self.buffs) do
105   - if not buff.isDel and (buff:getType() == CLEAR_BUFF or buff:getType() == IMMNUE_BUFF) then
106   - local cType, aim = buff:effectValue() -- 0=buffid 1=buff组
107   - if (cType == 0 and buffId == aim) or (cType == 1 and buffData.group == aim) then -- buff 剔除
108   - buff:decCount() --减少次数
  121 + if not buff.isDel and (buff:getType() == Buff.CLEAR_BUFF or buff:getType() == Buff.IMMNUE_BUFF) then
  122 + if buff:canEffect(buffId, buffData.group) then
  123 + buff:effect()
109 124 return
110 125 end
111 126 end
... ... @@ -136,7 +151,7 @@ function BaseObject:getCommonBuffEffect(bType)
136 151 local effect, count = {[0] = 0, [1] = 0}, 0
137 152 for _, buff in ipairs(self.buffs) do
138 153 if not buff.isDel and buff:getType() == bType then
139   - local cType, value = buff:effectValue()
  154 + local cType, value = buff:effect()
140 155 if cType then
141 156 effect[cType] = effect[cType] + value
142 157 count = count + 1
... ... @@ -151,7 +166,7 @@ function BaseObject:getBackHurtBuff(isAtk)
151 166 local effect = {[0] = 0, [1] = 0}
152 167 for _, buff in ipairs(self.buffs) do
153 168 if not buff.isDel and buff:getType() == Buff.BACK_HURT then
154   - local cType, value, aType = buff:effectValue() -- aType 0 全部 1 普通攻击
  169 + local cType, value, aType = buff:effect() -- aType 0 全部 1 普通攻击
155 170 if cType then
156 171 if aType == 0 or isAtk then
157 172 effect[cType] = effect[cType] + value
... ... @@ -176,7 +191,7 @@ end
176 191 function BaseObject:reSetAttr(field)
177 192 local old = self[field]
178 193 self[field] = self["_" .. field] --重置一下
179   - local fieldToBuff = {atk = Buff.IMMNUE_ATK, hit = Buff.HIT_CHANGE, miss = Buff.MISS_CHANGE, def = Buff.DEF_CHANGE}
  194 + local fieldToBuff = {atk = Buff.ATK_CHANGE, hit = Buff.HIT_CHANGE, miss = Buff.MISS_CHANGE, def = Buff.DEF_CHANGE}
180 195 local effect = self:getCommonBuffEffect(fieldToBuff[field])
181 196 self[field] = math.ceil((self[field] + effect[0]) * (1 + effect[1]))
182 197 local delta = self[field] - old
... ...