Commit d3da3368ff132964721b07865ae706319111d6e7

Authored by zhouhaihai
1 parent 98761edc

冒险地图被动技, buff 神器

src/actions/AdvAction.lua
... ... @@ -366,12 +366,12 @@ function _M.wearArtifactRpc(agent, data)
366 366  
367 367 local adv = role:getAdvData()
368 368  
369   - if math.illegalNum(slot, 1, 5) then return end
370   - if not adv:isHaveArtifact(id) then return end
371   - if not adv:isWaitChooseArtifact() then return end
  369 + if math.illegalNum(slot, 1, 5) then return 1 end
  370 + if not adv:isHaveArtifact(id) then return 2 end
  371 + if adv:isWaitChooseArtifact() then return 3 end
372 372  
373 373 local status = adv:wearArtifact(slot, id)
374   - if not status then return end
  374 + if not status then return 4 end
375 375 adv:saveDB()
376 376  
377 377 SendPacket(actionCodes.Adv_wearArtifactRpc, '')
... ... @@ -385,14 +385,15 @@ function _M.upArtifactRpc(agent, data)
385 385 local id = msg.id
386 386  
387 387 local adv = role:getAdvData()
  388 + if adv:isWaitChooseArtifact() then return 1 end
388 389 local curLevel = adv:isHaveArtifact(id)
389   - if not curLevel then return end
390   - if not role:isArtifactOpen(id, adv:isEndless(), curLevel + 1) then return end
391   - local cost = csvdb["adv_artifactCsv"][curLevel].exp:toNumMap()
392   - if not adv:cost(cost, {}, true) then return end
  390 + if not curLevel then return 2 end
  391 + if not role:isArtifactOpen(id, adv:isEndless(), curLevel + 1) then return 3 end
  392 + local cost = csvdb["adv_artifactCsv"][id][curLevel].exp:toNumMap()
  393 + if not adv:cost(cost, {}, true) then return 4 end
393 394  
394 395 local status = adv:artifactLevelUp(id)
395   - if not status then return end
  396 + if not status then return 5 end
396 397 adv:cost(cost, {})
397 398  
398 399 if status == 1 then -- 现在穿着呢。更新下
... ... @@ -449,6 +450,7 @@ function _M.endBattleRpc(agent, data)
449 450 local enemyId = msg.enemyId
450 451 local key = msg.key
451 452 local player = msg.player
  453 + local bySkill = msg.bySkill --死于 技能
452 454  
453 455 if not player or not player.hp or not player.sp or not enemyId or not key then return end
454 456 local adv = role:getAdvData()
... ... @@ -461,7 +463,7 @@ function _M.endBattleRpc(agent, data)
461 463 adv.__battleCache = nil
462 464  
463 465  
464   - local status = adv:clickBlock(roomId, blockId, {player = player})
  466 + local status = adv:clickBlock(roomId, blockId, {player = player, bySkill = bySkill})
465 467 if not status then return end
466 468 SendPacket(actionCodes.Adv_endBattleRpc, MsgPack.pack({events = adv:popBackEvents()}))
467 469 return true
... ...
src/actions/GmAction.lua
... ... @@ -290,17 +290,28 @@ function _M.idlec(role, pms)
290 290 return "成功"
291 291 end
292 292  
293   -table.insert(helpDes, {"获取冒险内道具", "advit"})
  293 +table.insert(helpDes, {"冒险内可使用道具", "advit", "ALL"})
  294 +table.insert(helpDes, {"冒险内消耗道具", "advit", "itemId", "count"})
294 295 function _M.advit(role, pms)
295 296 local reward = {}
296   - for k, v in pairs(csvdb["adv_itemCsv"]) do
297   - if csvdb["itemCsv"][k] and v.effect ~= 0 then
298   - reward[k] = 1
  297 + if pms.pm1 == "ALL" then
  298 + for k, v in pairs(csvdb["adv_itemCsv"]) do
  299 + if csvdb["itemCsv"][k] and v.effect ~= 0 then
  300 + reward[k] = 1
  301 + end
299 302 end
  303 + for k , v in pairs(csvdb["adv_artifactCsv"]) do
  304 + if v.unlock == 0 then
  305 + reward[k] = 1
  306 + end
  307 + end
  308 + else
  309 + local itemId = tonum(pms.pm1)
  310 + local count = tonum(pms.pm2)
  311 + reward[itemId] = count
300 312 end
301   - for k , v in pairs(csvdb["adv_artifactCsv"]) do
302   - reward[k] = 1
303   - end
  313 +
  314 +
304 315 local adv = role:getAdvData()
305 316 adv:award(reward)
306 317 return "成功"
... ...
src/adv/Adv.lua
... ... @@ -273,18 +273,17 @@ function Adv:waitChooseArtifact()
273 273 table.insert(pool, id)
274 274 end
275 275 end
276   -
277   - for i = 1, count do
278   - if len(pool) <= 0 then
279   - table.insert(chooses, {ItemId.AdvPoint, 48})
280   - else
  276 + if #pool == 0 then
  277 + self:award({[ItemId.AdvPoint] = 48})
  278 + else
  279 + for i = 1, math.min(count, #pool) do
281 280 local idx = math.randomInt(1, #pool)
282 281 table.insert(chooses, pool[idx])
283 282 table.remove(pool, idx)
284 283 end
  284 + self.waitArtifact = chooses
  285 + self:backChooseArtifact()
285 286 end
286   - self.waitArtifact = chooses
287   - self:backChooseArtifact()
288 287 end
289 288  
290 289 function Adv:isWaitChooseArtifact()
... ... @@ -293,9 +292,8 @@ end
293 292  
294 293 function Adv:chooseArtifact(index)
295 294 if not self.waitArtifact or not self.waitArtifact[index] then return end
296   - local itemId = type(self.waitArtifact[index]) == "table" and self.waitArtifact[index][1] or self.waitArtifact[index]
297   - local count = type(self.waitArtifact[index]) == "table" and self.waitArtifact[index][2] or 1
298   - self:award({[itemId] = count})
  295 + self:award({[self.waitArtifact[index]] = 1})
  296 + self.waitArtifact = nil
299 297 return true
300 298 end
301 299  
... ... @@ -308,6 +306,7 @@ function Adv:over(success, isAllPass)
308 306 local score = self:getScore()
309 307 local scoreInfo = self.score
310 308 local reward
  309 + self.battle.player:triggerPassive(Passive.ADV_OVER, {score = score, level = self.level})
311 310 if success then
312 311 reward = self.owner:award(self.owner:getProperty("advItems"):toNumMap())
313 312 self.owner:checkTaskEnter("AdvPass", {id = self.chapterId, level = self.level, score = score})
... ... @@ -391,7 +390,7 @@ function Adv:award(gift, params)
391 390 for itemId, count in pairs(tgift) do
392 391 if count > 0 then
393 392 local buffAdd = self.battle.player:getRewardChange(itemId)
394   - count = math.max(0, (count + buffAdd[0]) * (1 + buffAdd[1])) --附加 buff 的影响
  393 + count = math.floor(math.max(0, (count + buffAdd[0]) * (1 + buffAdd[1]))) --附加 buff 的影响
395 394 self:scoreChange(AdvScoreType.Item, {itemId, count})
396 395 self:checkTask(Adv.TaskType.Item, count, itemId)
397 396 self:checkAchievement(Adv.AchievType.GetItem, count, itemId)
... ... @@ -473,6 +472,7 @@ local function clickOut(self, room, block, params)
473 472 if params.relay or (not self:isEndless() and (self.level >= levellimit or not self.owner:advChapterIsOpen(self.chapterId, self.level + 1))) then --关卡结束
474 473 self:over(true, not self:isEndless() and self.level >= levellimit)
475 474 else
  475 + self.battle.player:triggerPassive(Passive.DOWN_LAYER)
476 476 self:initByChapter(self.chapterId, self.level + 1, true, true)
477 477 self:backNext() --下一关
478 478 end
... ... @@ -616,6 +616,7 @@ end
616 616 local function clickDrop(self, room, block, params)
617 617 local reward = {}
618 618 if not block.event.item then return end
  619 + self.battle.player:triggerPassive(Passive.CLICK_DROP)
619 620 local reward = self:award({[block.event.item[1]] = block.event.item[2]})
620 621 -- local reward = self:award({[5801] = 1})
621 622 block:clear()
... ... @@ -763,7 +764,7 @@ function Adv:clickBlock(roomId, blockId, params)
763 764 end
764 765 end
765 766 if canOpen and not hadMonster then --开放
766   - room:openBlock(block)
  767 + self:getCurMap():openBlock(roomId, blockId, true)
767 768 status = true
768 769 end
769 770 else
... ... @@ -1022,6 +1023,7 @@ function Adv:enemyDead(enemy, escape)
1022 1023 etype = AdvEventType.Click,
1023 1024 id = clickId
1024 1025 })
  1026 + self.battle.player:triggerPassive(Passive.BATTLE_WIN)
1025 1027 else
1026 1028 local item = block.event.item
1027 1029 if not item then
... ... @@ -1036,11 +1038,13 @@ function Adv:enemyDead(enemy, escape)
1036 1038 end
1037 1039 if item[1] == 0 then
1038 1040 block:clear()
  1041 + self.battle.player:triggerPassive(Passive.BATTLE_WIN)
1039 1042 else
1040 1043 block:updateEvent({
1041 1044 etype = AdvEventType.Drop,
1042 1045 item = item
1043 1046 })
  1047 + self.battle.player:triggerPassive(Passive.BATTLE_WIN, {count = item[2]})
1044 1048 end
1045 1049 end
1046 1050 self:checkTask(Adv.TaskType.Kill, 1, enemyId)
... ...
src/adv/AdvBattle.lua
... ... @@ -196,6 +196,8 @@ function Battle:afterRound()
196 196 end
197 197 end
198 198  
  199 + self.player:triggerPassive(Passive.AFTER_ROUND)
  200 +
199 201 if self.player.isDead then
200 202 self.adv:over(false)
201 203 end
... ... @@ -212,6 +214,9 @@ function Battle:battleBegin(roomId, blockId, params)
212 214 self.player:effectBattleBuff()
213 215  
214 216 self.adv.owner:checkTaskEnter("AdvBattleWin", {id = self.adv.chapterId})
  217 + if params.bySkill then
  218 + self.player:triggerPassive(Passive.SKILL_KILL)
  219 + end
215 220 end
216 221 if player.hp > self.player.hp then
217 222 self.player:recover(player.hp - self.player.hp, player)
... ...
src/adv/AdvBlock.lua
... ... @@ -54,6 +54,11 @@ function Block:randomEvent()
54 54 enemy = adv.battle:addEnemy(room, self, map.mapIdx)
55 55 end
56 56 enemy:triggerPassive(Passive.BORN_ONCE)
  57 +
  58 + adv.battle.player:triggerPassive(Passive.OPEN_MONSTER, {trigger = enemy})
  59 + for _, monster in pairs(adv.battle.player:getTeam(2)) do
  60 + adv.battle.player:triggerPassive(Passive.OPEN_MONSTER, {trigger = enemy})
  61 + end
57 62 end
58 63 randomFunc[AdvEventType.BOSS] = randomFunc[AdvEventType.Monster]
59 64 --掉落
... ... @@ -107,6 +112,7 @@ function Block:randomEvent()
107 112 self.room.map.adv:mapItemChange(effect[2])
108 113 end
109 114 end
  115 + adv.battle.player:triggerPassive(Passive.CLICK_TRAP)
110 116 adv:checkAchievement(adv.AchievType.Trap, 1, self.event.id)
111 117 adv:backTrap()
112 118 self:clear()
... ... @@ -130,6 +136,7 @@ function Block:open()
130 136 self:randomEvent()
131 137 adv.owner:checkTaskEnter("AdvOpenBlock")
132 138 self.isOpen = true
  139 + return true
133 140 end
134 141  
135 142 return Block
136 143 \ No newline at end of file
... ...
src/adv/AdvBuff.lua
... ... @@ -65,7 +65,7 @@ local function commonAttCond(_Buff, attrName)
65 65 self._changeV = self._changeV - self._changeV / (self.layer + 1)
66 66 self:_reSetAttr()
67 67 end
68   -
  68 +
69 69 _Buff._hpChange = function(self)
70 70 local oldHpMax = self.owner.hpMax
71 71 self.owner:reSetHpMax()
... ... @@ -268,7 +268,7 @@ local BuffFactory = {
268 268 [Buff.OPEN_BLOCK] = function(_Buff)
269 269 _Buff._afterRound = function(self)
270 270 local roomNum = self:effect()
271   - self.owner.battle.adv:openBlockRand(roomNum)
  271 + self.owner.battle.adv:getCurMap():openBlockRand(roomNum, not self.owner.monsterId)
272 272 end
273 273 _Buff._effectValue = function(self)
274 274 -- 数量
... ... @@ -345,7 +345,7 @@ local BuffFactory = {
345 345 _Buff._init = function(self)
346 346 -- 先给自己的buff 搞一下子
347 347 for _, buff in ipairs(self.owner.buffs) do
348   - if not buff.isDel and buff.classify == self.buffData.effectValue1 then
  348 + if not buff.isDel and (buff.buffData.classify:find(" " .. self.buffData.effectValue1) or buff.buffData.classify:find(self.buffData.effectValue1 .. " ")) then
349 349 buff:effectChange()
350 350 end
351 351 end
... ... @@ -388,6 +388,7 @@ function Buff:ctor(owner, id)
388 388 self.round = 0 --剩余的回合
389 389 self.count = -1 -- 可生效的次数 -1 无次数限制
390 390 self.layer = 1 -- 当前buff 层数
  391 + self.releaseId = nil -- 释放的怪物Id
391 392  
392 393 if BuffFactory[self.buffData.type] then
393 394 BuffFactory[self.buffData.type](self)
... ... @@ -408,6 +409,7 @@ end
408 409  
409 410 function Buff:initNew(release, data)
410 411 self.release = release or self.owner
  412 + self.releaseId = self.release.monsterId or 0
411 413 self.round = self.buffData.round
412 414 self.roundSpace = 0 --生效间隔
413 415 self.layer = 1
... ... @@ -427,6 +429,7 @@ function Buff:initByDB(data)
427 429 self.release = self.owner.battle:getEnemyById(data.rele)
428 430 end
429 431 end
  432 + self.releaseId = data.releId
430 433 self.round = data.round
431 434 self.roundSpace = data.roundSp
432 435 if data.count then
... ... @@ -462,7 +465,7 @@ function Buff:afterRound()
462 465 self:decRound()
463 466 end
464 467  
465   --- 只使用owner 和 buffData
  468 +-- 只使用owner 和 buffData 和 releaseId
466 469 function Buff:checkKeep()
467 470 if self.buffData.keepTerm == "" then return true end
468 471 --[[
... ... @@ -473,10 +476,10 @@ function Buff:checkKeep()
473 476 --]]
474 477  
475 478 local checkFunc = {}
476   - checkFunc[1] = function(_, enemyId)
  479 + checkFunc[1] = function(_)
477 480 local enemys = self.owner.battle.player:getTeam(2)
478 481 for _, enemy in pairs(enemys) do
479   - if enemy.monsterId == enemyId then
  482 + if enemy.monsterId == self.releaseId then
480 483 return true
481 484 end
482 485 end
... ... @@ -621,7 +624,7 @@ function Buff:effectChange()
621 624 end
622 625  
623 626 function Buff:doEffectChange(effect)
624   - if not self.buffData.classify then return effect end
  627 + if self.buffData.classify == "" then return effect end
625 628 local change = self.owner:getBuffEffectChange(self.buffData.classify)
626 629 return effect * (1 + change)
627 630 end
... ... @@ -643,6 +646,9 @@ function Buff:getDB()
643 646 db.count = self.count
644 647 end
645 648 db.layer = self.layer
  649 + if self.buffData.keepTerm:toArray(true, "=")[1] == 1 then
  650 + db.releId = self.releaseId
  651 + end
646 652 return db
647 653 end
648 654  
... ...
src/adv/AdvMap.lua
... ... @@ -100,7 +100,7 @@ function Map:addNewMonsterRand(monsterId, where)
100 100 end
101 101  
102 102 -- 随机翻开 num 个 以开放的房间的 地块
103   -function Map:openBlockRand(num)
  103 +function Map:openBlockRand(num, isPlayer)
104 104 local pool = {}
105 105 for _, room in pairs(self.rooms) do
106 106 if room.isShow and not room.isPath then
... ... @@ -113,12 +113,12 @@ function Map:openBlockRand(num)
113 113 end
114 114 if #pool <= num then
115 115 for _, temp in ipairs(pool) do
116   - self:openBlock(temp[1], temp[2])
  116 + self:openBlock(temp[1], temp[2], isPlayer)
117 117 end
118 118 else
119 119 for i = 1, num do
120 120 local idx = math.randomInt(1, #pool)
121   - self:openBlock(pool[idx][1], pool[idx][2])
  121 + self:openBlock(pool[idx][1], pool[idx][2], isPlayer)
122 122 table.remove(pool, idx)
123 123 end
124 124 end
... ... @@ -126,15 +126,40 @@ end
126 126  
127 127  
128 128 -- 打开一个地块
129   -function Map:openBlock(roomId, blockId)
  129 +function Map:openBlock(roomId, blockId, isPlayer)
130 130 local room = self.rooms[roomId]
131 131 if not room then return end
132 132 local block = room.blocks[blockId]
133 133 if not block then return end
134   - room:openBlock(block, self)
  134 + room:openBlock(block)
  135 + if isPlayer then
  136 + self.adv.player:triggerPassive(Passive.OPEN_BLOCK)
  137 + end
135 138 self:backBlockChange(roomId, blockId)
136 139 end
137 140  
  141 +function Map:openBlockBySize(roomId, blockId, size, isPlayer)
  142 + local blocks = self:getBlocksBySize(roomId, blockId, size)
  143 + for _, block in pairs(blocks) do
  144 + self:openBlock(block.room.roomId, block.blockId, isPlayer)
  145 + end
  146 +end
  147 +
  148 +function Map:openBlocksByRoom(roomId, isPlayer)
  149 + local room = self.rooms[roomId]
  150 + if not room then return end
  151 +
  152 + for blockId, block in pairs(room.blocks) do
  153 + self:openBlock(roomId, blockId, isPlayer)
  154 + end
  155 +end
  156 +
  157 +function Map:openAllBlocks(isPlayer)
  158 + for roomId, room in pairs(self.rooms) do
  159 + self:openBlocksByRoom(room.roomId, isPlayer)
  160 + end
  161 +end
  162 +
138 163  
139 164 --获取,某个位置上的 room 和 block
140 165 function Map:getRBByPos(c, r)
... ...
src/adv/AdvPassive.lua
... ... @@ -89,10 +89,10 @@ Passive.HP_LOW_SELF = 5 --自身生命值&lt;N%时,每回合触发
89 89 Passive.HP_LOW_TEAM = 6 --敌人生命值<N%时,每回合触发
90 90 Passive.HP_UP_SELF = 7 --自身生命值>N%时,每回合触发
91 91 Passive.HP_UP_TEAM = 8 --敌人生命值>N%时,每回合触发
92   -Passive.SELF_ATK = 9 --自身攻击N次后,触发1次
93   -Passive.SELF_HURT = 10 --自身受击N次后,触发1次
94   -Passive.TEAM_ATK = 11 --队友攻击N次后,触发1次
95   -Passive.TEAM_HURT = 12 --队友受击N次后,触发1次
  92 +Passive.SELF_ATK = 9 --自身攻击N次后,触发1次 < discard >
  93 +Passive.SELF_HURT = 10 --自身受击buff后,触发1次
  94 +Passive.TEAM_ATK = 11 --队友攻击N次后,触发1次 < discard >
  95 +Passive.TEAM_HURT = 12 --队友受击buff后,触发1次
96 96 Passive.MONSTER_COUNT_UP = 13 --场上存在N个以上怪物,每回合触发
97 97 Passive.MONSTER_COUNT_LOW = 14 --场上存在N个以下怪物,每回合触发
98 98 Passive.SELF_DEAD = 15 --自身死亡后,触发1次
... ... @@ -100,6 +100,18 @@ Passive.TEAM_DEAD = 16 --队友死亡后,触发1次
100 100 Passive.TARGET_SKILL = 17 --目标每使用N次技能,触发1次
101 101 Passive.TEAM_SKILL = 18 --队友每使用N次技能,触发1次
102 102  
  103 +Passive.HAVE_MONSTER = 20 --场上拥有指定怪时 回合触发
  104 +Passive.SKILL_KILL = 21 --技能击杀怪物时 触发1次
  105 +Passive.CLICK_TRAP = 22 --触发陷阱时 触发1次
  106 +Passive.DOWN_LAYER = 23 --下层时 触发1次
  107 +Passive.ADV_OVER = 24 --结算时 触发1次
  108 +Passive.BATTLE_WIN = 25 --战斗胜利x次时
  109 +Passive.CLICK_DROP = 26 --拾取drop x次时
  110 +Passive.AFTER_ROUND = 27 --经过 x回合时
  111 +Passive.GET_BUFF = 28 --获得指定buff
  112 +Passive.OPEN_BLOCK = 29 --翻开格子
  113 +Passive.OPEN_MONSTER = 30 --翻开怪物
  114 +
103 115  
104 116 -- 不同的开启条件
105 117 local PassiveCondFactory = {}
... ... @@ -122,21 +134,63 @@ end
122 134  
123 135 PassiveCondFactory[Passive.HURT_PERCENT_TEAM] = PassiveCondFactory[Passive.HURT_PERCENT_SELF] --逻辑相同
124 136 PassiveCondFactory[Passive.SELF_ATK] = PassiveCondFactory[Passive.HURT_PERCENT_SELF] --逻辑相同
125   -PassiveCondFactory[Passive.SELF_HURT] = PassiveCondFactory[Passive.HURT_PERCENT_SELF] --逻辑相同
126 137 PassiveCondFactory[Passive.TEAM_ATK] = PassiveCondFactory[Passive.HURT_PERCENT_SELF] --逻辑相同
127   -PassiveCondFactory[Passive.TEAM_HURT] = PassiveCondFactory[Passive.HURT_PERCENT_SELF] --逻辑相同
128 138 PassiveCondFactory[Passive.TARGET_SKILL] = PassiveCondFactory[Passive.HURT_PERCENT_SELF] --逻辑相同
129 139 PassiveCondFactory[Passive.TEAM_SKILL] = PassiveCondFactory[Passive.HURT_PERCENT_SELF] --逻辑相同
  140 +PassiveCondFactory[Passive.BATTLE_WIN] = PassiveCondFactory[Passive.HURT_PERCENT_SELF] --逻辑相同
  141 +PassiveCondFactory[Passive.CLICK_DROP] = PassiveCondFactory[Passive.HURT_PERCENT_SELF] --逻辑相同
  142 +PassiveCondFactory[Passive.AFTER_ROUND] = PassiveCondFactory[Passive.HURT_PERCENT_SELF] --逻辑相同
  143 +PassiveCondFactory[Passive.OPEN_BLOCK] = PassiveCondFactory[Passive.HURT_PERCENT_SELF] --逻辑相同
  144 +
  145 +PassiveCondFactory[Passive.SELF_HURT] = function(_Passive)
  146 + _Passive._trigger = function(self, params)
  147 + local buffId = params.buffId
  148 + local data = csvdb["adv_map_buffCsv"][buffId]
  149 + if data.classify:find(" " .. self.passiveData.value) or data.classify:find(self.passiveData.value .. " ") then
  150 + return true
  151 + end
  152 + end
  153 +end
  154 +PassiveCondFactory[Passive.TEAM_HURT] = PassiveCondFactory[Passive.SELF_HURT] --逻辑相同
  155 +
130 156  
131 157 PassiveCondFactory[Passive.ROOM_SHOW] = function(_Passive)
132 158 _Passive._trigger = function(self, params)
133 159 local roomId = params.roomId
134   - if self.roomId == roomId then
  160 + if self.owner.roomId == roomId then
135 161 return true
136 162 end
137 163 end
138 164 end
139 165  
  166 +PassiveCondFactory[Passive.GET_BUFF] = function(_Passive)
  167 + _Passive._trigger = function(self, params)
  168 + if self.passiveData.value == params.buffId then
  169 + return true
  170 + end
  171 + end
  172 +end
  173 +
  174 +
  175 +PassiveCondFactory[Passive.BORN_ONCE] = function(_Passive)
  176 + _Passive._afterRound = function(self)
  177 + if not self.owner.lock then
  178 + self:trigger(Passive.BORN_ONCE)
  179 + end
  180 + end
  181 +end
  182 +
  183 +PassiveCondFactory[Passive.HAVE_MONSTER] = function(_Passive)
  184 + _Passive._afterRound = function(self)
  185 + for _, player in ipairs(self.owner.battle.player:getTeam(2)) do
  186 + if player.monsterId == self.passiveData.value then
  187 + self:trigger(Passive.HAVE_MONSTER)
  188 + break
  189 + end
  190 + end
  191 + end
  192 +end
  193 +
140 194 PassiveCondFactory[Passive.HP_LOW_SELF] = function(_Passive)
141 195 _Passive._afterRound = function(self)
142 196 if self.owner.hp / self.owner.hpMax * 100 < self.passiveData.value then
... ... @@ -242,12 +296,16 @@ function Passive:canEffect(effType, effValue)
242 296 return true
243 297 end
244 298  
245   -function Passive:effect(trigger)
  299 +function Passive:effect(triggerPms)
246 300 for _, effect in pairs(self.effects) do
247 301 local effType = effect[1]
248 302 local effValue = effect[2]
  303 + local otherPms = {}
  304 + for i = 3, #effect do
  305 + table.insert(otherPms, effect[i])
  306 + end
249 307 if self:canEffect(effType, effValue) then
250   - self["effect" .. effType](self, effValue, trigger)
  308 + self["effect" .. effType](self, effValue, triggerPms, table.unpack(otherPms))
251 309 end
252 310 end
253 311  
... ... @@ -296,7 +354,7 @@ function Passive:trigger(condType, params) --触发检查
296 354 if self.round > 0 and self.turn > 0 then -- cd
297 355 return
298 356 end
299   - self:effect(params.trigger)
  357 + self:effect(params)
300 358 end
301 359  
302 360 function Passive:filter(params)
... ... @@ -330,25 +388,39 @@ function Passive:effect1(value)
330 388 self.owner:addBuff(value, self.owner)
331 389 end
332 390 --2=触发目标获得buff
333   -function Passive:effect2(value, trigger)
334   - if trigger then
335   - trigger:addBuff(value, self.owner)
  391 +function Passive:effect2(value, triggerPms)
  392 + if triggerPms.trigger then
  393 + triggerPms.trigger:addBuff(value, self.owner)
336 394 end
337 395 end
338 396 --3=翻开自己所在格子
339   -function Passive:effect3()
340   - self.owner.battle.adv:openBlock(self.owner.roomId, self.owner.blockId)
  397 +function Passive:effect3(value)
  398 + if value == 0 then
  399 + self.owner.battle.adv:getCurMap():openBlock(self.owner.roomId, self.owner.blockId)
  400 + elseif value > 0 then
  401 + self.owner.battle.adv:getCurMap():openBlocksBySize(self.owner.roomId, self.owner.blockId, value)
  402 + elseif value == -1 then -- 当前房间
  403 + self.owner.battle.adv:getCurMap():openBlocksByRoom(self.owner.roomId)
  404 + elseif value == -2 then -- 当前层
  405 + self.owner.battle.adv:getCurMap():openAllBlocks(not self.owner.monsterId)
  406 + end
341 407 end
342 408 --4=逃跑
343 409 function Passive:effect4()
344 410 self.owner.isDead = 1 --跑了
345   - -- self.owner.battle.adv:enemyDead(self.owner, true)
346 411 end
347   ---5=给随机一个敌方增加一个buff
348   -function Passive:effect5(value)
  412 +
  413 +--5=召唤怪物
  414 +function Passive:effect5(monsterId)
  415 + self.owner.battle.adv:getCurMap():addNewMonsterRand(monsterId)
  416 +end
  417 +
  418 +--6=给所有敌方增加一个buff
  419 +function Passive:effect6(value)
349 420 local monsters = self.owner.battle.player:getTeam(2)
350   - local randomId = math.random( 1, #monsters )
351   - monsters[randomId]:addBuff(value, self.owner)
  421 + for _, enemy in ipairs(monsters) do
  422 + enemy:addBuff(value, self.owner)
  423 + end
352 424 end
353 425 --6=给自己加一個被動技能
354 426 function Passive:effect6(value)
... ... @@ -362,4 +434,31 @@ function Passive:effect7(value)
362 434 end
363 435 end
364 436  
  437 +--8=获得drop,直接进入背包
  438 +function Passive:effect8(dropId)
  439 + local item = csvdb["event_dropCsv"][dropId]["range"]:randWeight(true)
  440 + self.owner.battle.adv:award({[item[1]] = item[2]})
  441 +end
  442 +
  443 +--9=直接获得item(可在结算触发时使用)
  444 +function Passive:effect9(itemId, triggerPms, ratio, max)
  445 + local cond = nil
  446 + if self.passiveData.value == 0 then
  447 + cond = triggerPms.score
  448 + elseif self.passiveData.value == 1 then
  449 + cond = triggerPms.level
  450 + else
  451 + return
  452 + end
  453 + if not cond then return end
  454 + self.owner.battle.adv:award({[itemId] = math.floor(math.max(0, math.min(max, cond / ratio)))})
  455 +end
  456 +
  457 +--10=战斗额外掉落次数
  458 +function Passive:effect10(itemId, triggerPms, count)
  459 + if triggerPms.count then
  460 + self.owner.battle.adv:award({[triggerPms.itemId] = triggerPms.count * count})
  461 + end
  462 +end
  463 +
365 464 return Passive
366 465 \ No newline at end of file
... ...
src/adv/AdvPlayer.lua
... ... @@ -140,9 +140,11 @@ function BaseObject:addBuff(buffId, releaser)
140 140 if not Buff.checkKeep({
141 141 owner = self,
142 142 buffData = buffData,
  143 + releaseId = releaser.monsterId
143 144 }) then return end
144 145 table.insert(self.buffs, Buff.create(self, releaser, {id = buffId}))
145 146 end
  147 + self:triggerPassive(Passive.GET_BUFF, {buffId = buffId})
146 148 self.battle.adv:backBuff(self.id, buffId)
147 149 end
148 150  
... ... @@ -168,7 +170,6 @@ end
168 170 function BaseObject:delPassiveById(pId)
169 171 for idx, passive in ipairs(self.passives) do
170 172 if passive.id == pId then
171   - passive:endPassive()
172 173 table.remove(self.passives, idx)
173 174 return passive
174 175 end
... ... @@ -239,11 +240,16 @@ end
239 240  
240 241 -- buff 增益 检疫
241 242 function BaseObject:getBuffEffectChange(classify)
  243 + local classifys = classify:toArray(true, " ")
  244 + local had = {}
  245 + for _, one in pairs(classifys) do
  246 + had[one] = 1
  247 + end
242 248 local effect = 0
243 249 for _, buff in ipairs(self.buffs) do
244 250 if not buff.isDel and buff:getType() == Buff_EFFECT_CHANGE then
245 251 local cType, value = buff:effect()
246   - if cType and cType == classify then
  252 + if cType and had[cType] then
247 253 effect = effect + value
248 254 end
249 255 end
... ... @@ -298,7 +304,7 @@ function BaseObject:reSetHpMax()
298 304 end
299 305 end
300 306 local effect = self:getAttrBuffChange("hp")
301   - self.hpMax = (self.hpMax + effect[0]) * (1 + effect[1]))
  307 + self.hpMax = (self.hpMax + effect[0]) * (1 + effect[1])
302 308 self.hpMax = math.ceil(math.max(1, self.hpMax))
303 309 self.hp = math.min(self.hpMax, self.hp)
304 310 end
... ... @@ -321,22 +327,26 @@ end
321 327 function BaseObject:hurt(value, releaser, params)
322 328 params = params or {}
323 329 if params.hurtType and params.hurtType == 1 then
324   - releaser:triggerPassive(Passive.SELF_ATK)
325   - for _, team in ipairs(releaser:getTeam(1, true)) do
326   - team:triggerPassive(Passive.TEAM_ATK)
327   - end
328   - if self:hadBuff(Buff.IMMNUE_ATK) then return end --无视普通攻击
  330 + -- releaser:triggerPassive(Passive.SELF_ATK)
  331 + -- for _, team in ipairs(releaser:getTeam(1, true)) do
  332 + -- team:triggerPassive(Passive.TEAM_ATK)
  333 + -- end
  334 + -- if self:hadBuff(Buff.IMMNUE_ATK) then return end --无视普通攻击
329 335  
330   - local hit = releaser.hit - self.miss --命中率
331   - if hit < math.randomInt(1, 100) then --miss
332   - self.battle.adv:backMiss(self.id)
333   - return
334   - end
335   - self:triggerPassive(Passive.SELF_HURT, {trigger = releaser})
  336 + -- local hit = releaser.hit - self.miss --命中率
  337 + -- if hit < math.randomInt(1, 100) then --miss
  338 + -- self.battle.adv:backMiss(self.id)
  339 + -- return
  340 + -- end
  341 + end
  342 +
  343 + if params.hurtType and (params.hurtType == 2 or params.hurtType == 6) then
  344 + self:triggerPassive(Passive.SELF_HURT, {trigger = releaser, buffId = params.buffId})
336 345 for _, team in ipairs(self:getTeam(1, true)) do
337   - team:triggerPassive(Passive.TEAM_HURT, {trigger = releaser})
  346 + team:triggerPassive(Passive.TEAM_HURT, {trigger = releaser, buffId = params.buffId})
338 347 end
339 348 end
  349 +
340 350 if params.hurtType ~= 5 and params.hurtType ~= 6 then
341 351 if not params.hurtType or params.hurtType ~= 4 then
342 352 value = self:getInjuredValue(value) --减伤计算
... ...
src/models/RolePlugin.lua
... ... @@ -701,9 +701,9 @@ function RolePlugin.bind(Role)
701 701  
702 702 if curData.unlock == 1 then -- 获得解锁
703 703 return self:getProperty("advAFOpen")[id] and true or false
704   - elseif temp[1].unlock == 2 then -- 特殊神器 不可解锁
  704 + elseif curData.unlock == 2 then -- 特殊神器 不可解锁
705 705 return isCheckLevel
706   - elseif temp[1].unlock == 3 then
  706 + elseif curData.unlock == 3 then
707 707 return isEndless
708 708 end
709 709 return true
... ...