Commit 9104a922a7fc39f1a9660fcae0a5eb1c27cd4f59

Authored by zhouhaihai
1 parent 6133e29f

多重掉落

@@ -8,6 +8,7 @@ local Adv = class("Adv") @@ -8,6 +8,7 @@ local Adv = class("Adv")
8 local AdvTask = import(".AdvTask") --任务相关数据搞出去 8 local AdvTask = import(".AdvTask") --任务相关数据搞出去
9 AdvTask.bind(Adv) 9 AdvTask.bind(Adv)
10 10
  11 +
11 function Adv:ctor(owner) 12 function Adv:ctor(owner)
12 assert(owner, "Adv instance must have owner(role)") 13 assert(owner, "Adv instance must have owner(role)")
13 self.owner = owner 14 self.owner = owner
@@ -1805,45 +1806,77 @@ function Adv:enemyDead(enemy, escape) @@ -1805,45 +1806,77 @@ function Adv:enemyDead(enemy, escape)
1805 end 1806 end
1806 local changeV = self.battle.player:addExp(monsterData.exp) 1807 local changeV = self.battle.player:addExp(monsterData.exp)
1807 self:backDead(enemyId, changeV) 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 else 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 end 1841 end
1828 end 1842 end
1829 -  
1830 end 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 end 1877 end
1846 end 1878 end
  1879 +
1847 self:checkTask(Adv.TaskType.Kill, 1, enemyId) 1880 self:checkTask(Adv.TaskType.Kill, 1, enemyId)
1848 self:checkTask(Adv.TaskType.KillAll) 1881 self:checkTask(Adv.TaskType.KillAll)
1849 self:checkAchievement(Adv.AchievType.Kill, 1, enemyId) 1882 self:checkAchievement(Adv.AchievType.Kill, 1, enemyId)
src/adv/AdvMap.lua
@@ -349,6 +349,55 @@ function Map:getBlocksBySize(roomId, blockId, size) @@ -349,6 +349,55 @@ function Map:getBlocksBySize(roomId, blockId, size)
349 return blocks 349 return blocks
350 end 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 function Map:getEnemysBySize(roomId, blockId, size) 401 function Map:getEnemysBySize(roomId, blockId, size)
353 local blocks = self:getBlocksBySize(roomId, blockId, size) 402 local blocks = self:getBlocksBySize(roomId, blockId, size)
354 local enemys = {} 403 local enemys = {}
@@ -514,7 +563,6 @@ createMap = function(self, mapId, isEnter, isNewRelay) @@ -514,7 +563,6 @@ createMap = function(self, mapId, isEnter, isNewRelay)
514 --交易所 563 --交易所
515 randomFunc[AdvEventType.Trader] = function() 564 randomFunc[AdvEventType.Trader] = function()
516 -- if self.adv.isRelay and isNewRelay then return false end 565 -- if self.adv.isRelay and isNewRelay then return false end
517 - if self.adv.isRelay then return false end  
518 return randomCommon() 566 return randomCommon()
519 end 567 end
520 --建筑 568 --建筑
src/adv/AdvPassive.lua
@@ -485,8 +485,10 @@ end @@ -485,8 +485,10 @@ end
485 485
486 --10=战斗额外掉落次数 486 --10=战斗额外掉落次数
487 function Passive:effect10(count, triggerPms) 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 end 492 end
491 end 493 end
492 494