Commit 9104a922a7fc39f1a9660fcae0a5eb1c27cd4f59

Authored by zhouhaihai
1 parent 6133e29f

多重掉落

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  
... ...