Commit 6826fdf62f261659fe2120ca0ebe8ee80e08a83b
1 parent
b6a2b78b
被动触发
Showing
4 changed files
with
105 additions
and
26 deletions
Show diff stats
src/adv/Adv.lua
@@ -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 |