Commit 9104a922a7fc39f1a9660fcae0a5eb1c27cd4f59
1 parent
6133e29f
多重掉落
Showing
3 changed files
with
119 additions
and
36 deletions
Show diff stats
src/adv/Adv.lua
... | ... | @@ -8,6 +8,7 @@ local Adv = class("Adv") |
8 | 8 | local AdvTask = import(".AdvTask") --任务相关数据搞出去 |
9 | 9 | AdvTask.bind(Adv) |
10 | 10 | |
11 | + | |
11 | 12 | function Adv:ctor(owner) |
12 | 13 | assert(owner, "Adv instance must have owner(role)") |
13 | 14 | self.owner = owner |
... | ... | @@ -1805,45 +1806,77 @@ function Adv:enemyDead(enemy, escape) |
1805 | 1806 | end |
1806 | 1807 | local changeV = self.battle.player:addExp(monsterData.exp) |
1807 | 1808 | self:backDead(enemyId, changeV) |
1808 | - if enemy:hadBuff(Buff.CHANGE_DROP_TO_CLICK) then -- 掉落转为 click | |
1809 | - local clickId = buff:effect() | |
1810 | - block:updateEvent({ | |
1811 | - etype = AdvEventType.Click, | |
1812 | - id = clickId | |
1813 | - }) | |
1814 | - self.battle.player:triggerPassive(Passive.BATTLE_WIN) | |
1815 | - else | |
1816 | - local item = block.event.item | |
1817 | - if not item then | |
1818 | - local buff = enemy:hadBuff(Buff.CHANGE_DROP) | |
1819 | - if buff then | |
1820 | - item = table.pack(buff:effect()) | |
1821 | - else | |
1822 | - if monsterData.dropid == 0 then | |
1823 | - item = {0, 0} | |
1809 | + | |
1810 | + local toClick = enemy:hadBuff(Buff.CHANGE_DROP_TO_CLICK) | |
1811 | + if toClick then | |
1812 | + toClick = toClick:effect() | |
1813 | + end | |
1814 | + | |
1815 | + local changItem = enemy:hadBuff(Buff.CHANGE_DROP) | |
1816 | + if changItem then | |
1817 | + changItem = table.pack(changItem:effect()) | |
1818 | + end | |
1819 | + | |
1820 | + local addMult = 0 | |
1821 | + local dropBuff = enemy:hadBuff(Buff.DROP_BUFF_BY_ENEMY) -- 根据敌人数量变化个数 | |
1822 | + if dropBuff then | |
1823 | + local team = enemy:getTeam(1, true) | |
1824 | + addMult = addMult + 0.2 * #team | |
1825 | + end | |
1826 | + | |
1827 | + local dropIds = monsterData.dropid:toArray(true, "=") | |
1828 | + local drops = {} | |
1829 | + local cCcount = 0 -- 需要改变为click 的个数 | |
1830 | + for _, dropId in ipairs(dropIds) do | |
1831 | + local dropData = csvdb["event_dropCsv"][dropId] | |
1832 | + if dropData then | |
1833 | + local cur = dropData["range"]:randWeight(true) | |
1834 | + if cur and cur[1] ~= 0 then | |
1835 | + if toClick then | |
1836 | + cCcount = cCcount + 1 | |
1824 | 1837 | else |
1825 | - local dropData = csvdb["event_dropCsv"][monsterData.dropid] | |
1826 | - item = dropData["range"]:randWeight(true) | |
1838 | + local item = changItem and changItem or cur | |
1839 | + item[2] = math.floor(item[2] * (1 + addMult)) | |
1840 | + drops[#drops + 1] = item | |
1827 | 1841 | end |
1828 | 1842 | end |
1829 | - | |
1830 | 1843 | end |
1831 | - if item[1] == 0 then | |
1832 | - block:clear() | |
1833 | - self.battle.player:triggerPassive(Passive.BATTLE_WIN) | |
1834 | - else | |
1835 | - local buff = enemy:hadBuff(Buff.DROP_BUFF_BY_ENEMY) -- 根据敌人数量变化个数 | |
1836 | - if buff then | |
1837 | - local team = enemy:getTeam(1, true) | |
1838 | - item[2] = math.floor(item[2] * (1 + 0.2 * #team)) | |
1839 | - end | |
1840 | - block:updateEvent({ | |
1841 | - etype = AdvEventType.Drop, | |
1842 | - item = item | |
1843 | - }) | |
1844 | - self.battle.player:triggerPassive(Passive.BATTLE_WIN, {itemId = item[1], count = item[2]}) | |
1844 | + end | |
1845 | + -- 这些奖励可能会有被动加成 | |
1846 | + self.battle.player:triggerPassive(Passive.BATTLE_WIN, {drops = drops}) | |
1847 | + | |
1848 | + -- 自身带的掉落是不会被改变的 也不会被加成 | |
1849 | + if block.event.item and block.event.item[1] ~= 0 then | |
1850 | + drops[#drops + 1] = block.event.item | |
1851 | + end | |
1852 | + | |
1853 | + -- 清空当前的格子 | |
1854 | + block:clear() | |
1855 | + | |
1856 | + -- 掉落走一波 | |
1857 | + local blocks = self:getCurMap():getEmptyBlocks(roomId, blockId, #drops) | |
1858 | + for _i, cblock in ipairs(blocks) do | |
1859 | + cblock:updateEvent({ | |
1860 | + etype = AdvEventType.Drop, | |
1861 | + item = drops[_i] | |
1862 | + }) | |
1863 | + if cblock ~= block then | |
1864 | + self:backBlockChange(cblock.room.roomId, cblock.blockId) | |
1865 | + end | |
1866 | + end | |
1867 | + | |
1868 | + -- 转换的click走一波 | |
1869 | + local blocks = self:getCurMap():getEmptyBlocks(roomId, blockId, cCcount) | |
1870 | + for _i, cblock in ipairs(blocks) do | |
1871 | + cblock:updateEvent({ | |
1872 | + etype = AdvEventType.Click, | |
1873 | + id = clickId | |
1874 | + }) | |
1875 | + if cblock ~= block then | |
1876 | + self:backBlockChange(cblock.room.roomId, cblock.blockId) | |
1845 | 1877 | end |
1846 | 1878 | end |
1879 | + | |
1847 | 1880 | self:checkTask(Adv.TaskType.Kill, 1, enemyId) |
1848 | 1881 | self:checkTask(Adv.TaskType.KillAll) |
1849 | 1882 | self:checkAchievement(Adv.AchievType.Kill, 1, enemyId) | ... | ... |
src/adv/AdvMap.lua
... | ... | @@ -349,6 +349,55 @@ function Map:getBlocksBySize(roomId, blockId, size) |
349 | 349 | return blocks |
350 | 350 | end |
351 | 351 | |
352 | +-- 找周围的空格子 最多 49 个 | |
353 | +function Map:getEmptyBlocks(roomId, blockId, count) | |
354 | + local blocks = {} | |
355 | + if count == 0 then return blocks end | |
356 | + local room = self.rooms[roomId] | |
357 | + if not room then return end | |
358 | + local block = room.blocks[blockId] | |
359 | + if not block then return end | |
360 | + | |
361 | + local col, row = room:tranLtoG(block.col, block.row) | |
362 | + | |
363 | + -- 找周围49个格子 | |
364 | + for range = 0, 3 do | |
365 | + if range == 0 then | |
366 | + if block.isOpen and not block:getEventType() then | |
367 | + blocks[#blocks + 1] = block | |
368 | + if #blocks >= count then | |
369 | + return blocks | |
370 | + end | |
371 | + end | |
372 | + else | |
373 | + for _, c in ipairs({col - range , col + range}) do | |
374 | + for r = row - range, row + range do | |
375 | + local rroom, rblock = self:getRBByPos(c, r) | |
376 | + if rroom and rblock.isOpen and not rblock:getEventType() then | |
377 | + blocks[#blocks + 1] = rblock | |
378 | + if #blocks >= count then | |
379 | + return blocks | |
380 | + end | |
381 | + end | |
382 | + end | |
383 | + end | |
384 | + | |
385 | + for _, r in ipairs({row - range , row + range}) do | |
386 | + for c = col - range + 1, col + range - 1 do | |
387 | + local rroom, rblock = self:getRBByPos(c, r) | |
388 | + if rroom and rblock.isOpen and not rblock:getEventType() then | |
389 | + blocks[#blocks + 1] = rblock | |
390 | + if #blocks >= count then | |
391 | + return blocks | |
392 | + end | |
393 | + end | |
394 | + end | |
395 | + end | |
396 | + end | |
397 | + end | |
398 | + return blocks | |
399 | +end | |
400 | + | |
352 | 401 | function Map:getEnemysBySize(roomId, blockId, size) |
353 | 402 | local blocks = self:getBlocksBySize(roomId, blockId, size) |
354 | 403 | local enemys = {} |
... | ... | @@ -514,7 +563,6 @@ createMap = function(self, mapId, isEnter, isNewRelay) |
514 | 563 | --交易所 |
515 | 564 | randomFunc[AdvEventType.Trader] = function() |
516 | 565 | -- if self.adv.isRelay and isNewRelay then return false end |
517 | - if self.adv.isRelay then return false end | |
518 | 566 | return randomCommon() |
519 | 567 | end |
520 | 568 | --建筑 | ... | ... |
src/adv/AdvPassive.lua
... | ... | @@ -485,8 +485,10 @@ end |
485 | 485 | |
486 | 486 | --10=战斗额外掉落次数 |
487 | 487 | function Passive:effect10(count, triggerPms) |
488 | - if triggerPms.count then | |
489 | - self.owner.battle.adv:award({[triggerPms.itemId] = triggerPms.count * count}, {log = {desc = "passive", int1 = self.id}}) | |
488 | + if triggerPms.drops then | |
489 | + for _, drop in pairs(triggerPms.drops) do | |
490 | + drop[2] = drop[2] + math.floor(drop[2] * count) | |
491 | + end | |
490 | 492 | end |
491 | 493 | end |
492 | 494 | ... | ... |