Commit 7c55db1f30c88e6393b799a121199f43c773c6df
1 parent
69d686f8
Buff逻辑完善,buff生效次数和争斗内buff生命周期逻辑新增
Showing
3 changed files
with
171 additions
and
59 deletions
Show diff stats
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 | ... | ... |