Commit 6826fdf62f261659fe2120ca0ebe8ee80e08a83b

Authored by zhouhaihai
1 parent b6a2b78b

被动触发

@@ -1883,23 +1883,31 @@ end @@ -1883,23 +1883,31 @@ end
1883 1883
1884 -- 地图上物品变化 1884 -- 地图上物品变化
1885 function Adv:mapItemChange(ctype) 1885 function Adv:mapItemChange(ctype)
  1886 + local blocks = {}
  1887 + for roomId, room in pairs(self:getCurMap().rooms) do
  1888 + for blockId, block in pairs(room.blocks) do
  1889 + table.insert(blocks, block)
  1890 + end
  1891 + end
  1892 + self:blockDropChange(ctype, blocks)
  1893 +end
  1894 +
  1895 +function Adv:blockDropChange(ctype, blocks)
1886 local clist = csvdb["transform_itemCsv"][ctype] 1896 local clist = csvdb["transform_itemCsv"][ctype]
1887 if clist then 1897 if clist then
1888 - for roomId, room in pairs(self:getCurMap().rooms) do  
1889 - for blockId, block in pairs(room.blocks) do  
1890 - if block:getEventType() == AdvEventType.Drop and block.event.item then  
1891 - local id = block.event.item[1]  
1892 - local count = block.event.item[2]  
1893 - local changeTo = nil  
1894 - if clist[id] then  
1895 - changeTo = {clist[id].toId, math.ceil(count * clist[id].num)}  
1896 - elseif clist[-1] then  
1897 - changeTo = {clist[-1].toId, math.ceil(count * clist[-1].num)}  
1898 - end  
1899 - if changeTo and changeTo[1] ~= 0 and changeTo[2] ~= 0 then  
1900 - block.event.item = changeTo  
1901 - self:backBlockChange(roomId, blockId, ctype)  
1902 - end 1898 + for _, block in ipairs(blocks) do
  1899 + if block:getEventType() == AdvEventType.Drop and block.event.item then
  1900 + local id = block.event.item[1]
  1901 + local count = block.event.item[2]
  1902 + local changeTo = nil
  1903 + if clist[id] then
  1904 + changeTo = {clist[id].toId, math.ceil(count * clist[id].num)}
  1905 + elseif clist[-1] then
  1906 + changeTo = {clist[-1].toId, math.ceil(count * clist[-1].num)}
  1907 + end
  1908 + if changeTo and changeTo[1] ~= 0 and changeTo[2] ~= 0 then
  1909 + block.event.item = changeTo
  1910 + self:backBlockChange(block.room.roomId, block.blockId, ctype)
1903 end 1911 end
1904 end 1912 end
1905 end 1913 end
src/adv/AdvMap.lua
@@ -256,7 +256,7 @@ function Map:openBlock(roomId, blockId, isPlayer, ignoreBack) @@ -256,7 +256,7 @@ function Map:openBlock(roomId, blockId, isPlayer, ignoreBack)
256 256
257 if status then 257 if status then
258 if isPlayer then 258 if isPlayer then
259 - self.adv.battle:triggerPassive(Passive.OPEN_BLOCK) 259 + self.adv.battle:triggerPassive(Passive.OPEN_BLOCK, {roomId = roomId, blockId = blockId})
260 self.adv.owner:checkTaskEnter("AdvOpenBlock") 260 self.adv.owner:checkTaskEnter("AdvOpenBlock")
261 261
262 -- 潜行检查 262 -- 潜行检查
@@ -292,21 +292,38 @@ function Map:openBlocksByRoom(roomId, isPlayer, ignoreBack) @@ -292,21 +292,38 @@ function Map:openBlocksByRoom(roomId, isPlayer, ignoreBack)
292 end 292 end
293 end 293 end
294 294
295 -function Map:openBlocksIsMonsterByRoom(roomId, isPlayer, ignoreBack) 295 +function Map:openBlocksIsMonsterByRoom(roomId, count, isPlayer, ignoreBack)
296 local room = self.rooms[roomId] 296 local room = self.rooms[roomId]
297 if not room then return end 297 if not room then return end
298 298
299 - local enemys = {} 299 + local allBlock = {}
300 for blockId, block in pairs(room.blocks) do 300 for blockId, block in pairs(room.blocks) do
301 - if block:isMonster() then  
302 - if self:openBlock(roomId, blockId, isPlayer, ignoreBack) then  
303 - local e = self.adv.battle:getEnemy(block.room.roomId, block.blockId)  
304 - if e then  
305 - table.insert(enemys, e)  
306 - end 301 + if block:isMonster() and not block.isOpen then
  302 + table.insert(allBlock, blockId)
  303 + end
  304 + end
  305 +
  306 + local enemys = {}
  307 + local openBlock = function(blockId)
  308 + if self:openBlock(roomId, blockId, isPlayer, ignoreBack) then
  309 + local e = self.adv.battle:getEnemy(roomId, blockId)
  310 + if e then
  311 + table.insert(enemys, e)
307 end 312 end
308 end 313 end
309 end 314 end
  315 +
  316 + if not count or count == -1 or count >= len(allBlock) then
  317 + for _, blockId in ipairs(allBlock) do
  318 + openBlock(blockId)
  319 + end
  320 + else
  321 + for i = 1, count do
  322 + local idx = math.randomInt(1, len(allBlock))
  323 + openBlock(allBlock[idx])
  324 + table.remove(allBlock, idx)
  325 + end
  326 + end
310 return enemys 327 return enemys
311 end 328 end
312 329
@@ -327,6 +344,22 @@ function Map:getRBByPos(c, r) @@ -327,6 +344,22 @@ function Map:getRBByPos(c, r)
327 end 344 end
328 end 345 end
329 346
  347 +function Map:getDistance(froomId, fblockId, troomId, tblockId)
  348 + local distance = -1
  349 + local room1 = self.rooms[froomId]
  350 + local room2 = self.rooms[troomId]
  351 + if room1 and room2 then
  352 + local block1 = room1[fblockId]
  353 + local block2 = room2[tblockId]
  354 + if block1 and block2 then
  355 + local c1, r1 = room1:tranLtoG(block1.col, block1.row)
  356 + local c2, r2 = room2:tranLtoG(block2.col, block2.row)
  357 + distance = math.max(math.abs(c1 - c2), math.abs(r1 - r2))
  358 + end
  359 + end
  360 + return distance
  361 +end
  362 +
330 function Map:getAroundBlocks(room, block) 363 function Map:getAroundBlocks(room, block)
331 local blocks = {} 364 local blocks = {}
332 local range = {1, -1} 365 local range = {1, -1}
src/adv/AdvPassive.lua
@@ -7,6 +7,8 @@ Filter.HP_LOW = 4 -- 血量<value% @@ -7,6 +7,8 @@ Filter.HP_LOW = 4 -- 血量<value%
7 Filter.BUFF_BY_TYPE = 5 -- 指定类型buff 7 Filter.BUFF_BY_TYPE = 5 -- 指定类型buff
8 Filter.BUFF_BY_ID = 6 -- 指定id的buff 8 Filter.BUFF_BY_ID = 6 -- 指定id的buff
9 Filter.CAMP = 7 -- 玩家是指定阵营 9 Filter.CAMP = 7 -- 玩家是指定阵营
  10 +Filter.RANGE = 8 -- 筛选范围 (触发是地块)
  11 +Filter.CLASSIFY = 9 -- 标签
10 12
11 local FilterFactory = {} 13 local FilterFactory = {}
12 FilterFactory[Filter.HP_UP_WITH_EQUAL] = function (_Filter) 14 FilterFactory[Filter.HP_UP_WITH_EQUAL] = function (_Filter)
@@ -46,6 +48,23 @@ FilterFactory[Filter.CAMP] = function (_Filter) @@ -46,6 +48,23 @@ FilterFactory[Filter.CAMP] = function (_Filter)
46 end 48 end
47 end 49 end
48 50
  51 +FilterFactory[Filter.RANGE] = function (_Filter)
  52 + _Filter._execute = function (self, target, params)
  53 + if self.owner.blockId and self.owner.roomId and params.blockId and params.roomId then
  54 + local distance = self.owner.battle.adv:getCurMap():getDistance(self.owner.roomId, self.owner.blockId, params.roomId, params.blockId)
  55 + return distance ~= -1 and distance <= self.value
  56 + end
  57 + return false
  58 + end
  59 +end
  60 +
  61 +FilterFactory[Filter.CLASSIFY] = function (_Filter)
  62 + _Filter._execute = function (self, target)
  63 + if not target.monsterId then return end
  64 + local classify = csvdb["event_monsterCsv"][target.monsterId].classify
  65 + return classify and classify:sismember(self.value, " ")
  66 + end
  67 +end
49 68
50 function Filter:ctor(params) 69 function Filter:ctor(params)
51 self.owner = params.owner 70 self.owner = params.owner
@@ -79,7 +98,7 @@ function Filter:execute(params) @@ -79,7 +98,7 @@ function Filter:execute(params)
79 return 98 return
80 end 99 end
81 if self:_execute(target) then 100 if self:_execute(target) then
82 - return self:_execute(target) 101 + return self:_execute(target, params)
83 end 102 end
84 end 103 end
85 104
@@ -120,6 +139,7 @@ Passive.GET_BUFF = 28 --获得指定buff @@ -120,6 +139,7 @@ Passive.GET_BUFF = 28 --获得指定buff
120 Passive.OPEN_BLOCK = 29 --翻开格子 139 Passive.OPEN_BLOCK = 29 --翻开格子
121 Passive.OPEN_MONSTER = 30 --翻开怪物 140 Passive.OPEN_MONSTER = 30 --翻开怪物
122 Passive.PLAYER_BUFF = 31 --玩家获得buff 141 Passive.PLAYER_BUFF = 31 --玩家获得buff
  142 +
123 Passive.PLAYER_BUFF_CLASSIFY = 35 -- 获得指定标签的buff 143 Passive.PLAYER_BUFF_CLASSIFY = 35 -- 获得指定标签的buff
124 144
125 -- 不同的开启条件 145 -- 不同的开启条件
@@ -442,6 +462,7 @@ end @@ -442,6 +462,7 @@ end
442 462
443 --3=翻开自己所在格子 463 --3=翻开自己所在格子
444 function Passive:effect3(value) 464 function Passive:effect3(value)
  465 + if not self.owner.roomId or not self.owner.blockId then return end
445 if value == 0 then 466 if value == 0 then
446 self.owner.battle.adv:getCurMap():openBlock(self.owner.roomId, self.owner.blockId) 467 self.owner.battle.adv:getCurMap():openBlock(self.owner.roomId, self.owner.blockId)
447 elseif value > 0 then 468 elseif value > 0 then
@@ -561,5 +582,22 @@ function Passive:effect14(value, triggerPms, enemyId) @@ -561,5 +582,22 @@ function Passive:effect14(value, triggerPms, enemyId)
561 end 582 end
562 end 583 end
563 584
  585 +--15=翻开房间内的count 个怪 并且增加一个buff
  586 +function Passive:effect15(count, triggerPms, buffId)
  587 + local roomId = self.owner.roomId
  588 + if not roomId then return end
  589 + local enemys = self.owner.battle.adv:getCurMap():openBlocksIsMonsterByRoom(roomId, count)
  590 + for _, e in ipairs(enemys) do
  591 + e:addBuff(buffId)
  592 + end
  593 +end
  594 +
  595 +--16=转变 value 范围内的掉落物 为 id count
  596 +function Passive:effect16(value, triggerPms, changeType)
  597 + if not self.owner.roomId or not self.owner.blockId then return end
  598 + local blocks = self.owner.battle.adv:getCurMap():getBlocksBySize(self.owner.roomId, self.owner.blockId, value)
  599 + self.owner.battle.adv:blockDropChange(changeType, blocks)
  600 +end
  601 +
564 602
565 return Passive 603 return Passive
566 \ No newline at end of file 604 \ No newline at end of file
src/adv/AdvPlayer.lua
@@ -417,7 +417,7 @@ function BaseObject:hurt(value, releaser, params) @@ -417,7 +417,7 @@ function BaseObject:hurt(value, releaser, params)
417 if self.hp == 0 then 417 if self.hp == 0 then
418 self:triggerPassive(Passive.SELF_DEAD) 418 self:triggerPassive(Passive.SELF_DEAD)
419 for _, team in ipairs(self:getTeam(1, true)) do 419 for _, team in ipairs(self:getTeam(1, true)) do
420 - team:triggerPassive(Passive.TEAM_DEAD) 420 + team:triggerPassive(Passive.TEAM_DEAD, {trigger = self})
421 end 421 end
422 422
423 if (params.hurtType == 6 or params.hurtType == 2) and self ~= self.battle.player then 423 if (params.hurtType == 6 or params.hurtType == 2) and self ~= self.battle.player then