diff --git a/src/adv/Adv.lua b/src/adv/Adv.lua index b59bf33..86c7f47 100644 --- a/src/adv/Adv.lua +++ b/src/adv/Adv.lua @@ -1436,7 +1436,7 @@ function Adv:clickBlock(roomId, blockId, params) if not ignoreGuard and _block:isGuard() then if _block:isMonster() then local enemy = self.battle:getEnemy(_room.roomId, _block.blockId) - if not enemy:hadBuff(Buff.DONT_DEFEND) then + if not enemy:hadBuff(Buff.DONT_DEFEND) and not self.battle.player:hadBuff(Buff.SNEAK) then return false end else diff --git a/src/adv/AdvBattle.lua b/src/adv/AdvBattle.lua index baa8056..ff7fe10 100644 --- a/src/adv/AdvBattle.lua +++ b/src/adv/AdvBattle.lua @@ -163,7 +163,11 @@ function Battle:addEnemy(room, block, mapIdx) end block.event.enemy = enemy end - local player = Enemy.new(self, block.event.mId or 999, block.event.id, room.roomId, block.blockId, not block.isOpen, block.event.enemy, mapIdx) + if not block.event.mId then + block.event.mId = self.adv.lastEnemyId + self.adv.lastEnemyId = self.adv.lastEnemyId + 1 + end + local player = Enemy.new(self, block.event.mId, block.event.id, room.roomId, block.blockId, not block.isOpen, block.event.enemy, mapIdx) table.insert(self.enemys[mapIdx], player) return player elseif block:isBuild() then diff --git a/src/adv/AdvBlock.lua b/src/adv/AdvBlock.lua index bd40823..b6f75fa 100644 --- a/src/adv/AdvBlock.lua +++ b/src/adv/AdvBlock.lua @@ -54,11 +54,9 @@ function Block:randomEvent() local randomFunc = {} --怪 randomFunc[AdvEventType.Monster] = function() - self.event.mId = adv.lastEnemyId --给怪一个有序id 回合逻辑时使用 - adv.lastEnemyId = adv.lastEnemyId + 1 local enemy = adv.battle:getEnemy(room.roomId, self.blockId, map.mapIdx) if enemy then - enemy:unlock(self.event.mId) + enemy:unlock() else enemy = adv.battle:addEnemy(room, self, map.mapIdx) enemy:initAfter(self.event.enemy) @@ -177,18 +175,14 @@ function Block:randomEvent() backTrap = false elseif data.target == 3 then -- 翻开周围8格,并给怪物附带buff(不伤害玩家) self.room.map.adv:getCurMap():openBlocksBySize(self.room.roomId, self.blockId, 2) - local blocks = self.room.map.adv:getCurMap():getBlocksBySize(self.room.roomId, self.blockId, 2) - for _, block in pairs(blocks) do - if block:isMonster() then - local e = adv.battle:getEnemy(block.room.roomId, block.blockId) - for _, buffId in ipairs(buffs) do - e:addBuff(buffId) - end + local enemys = self.room.map.adv:getCurMap():getEnemysBySize(self.room.roomId, self.blockId, 2) + for _, e in ipairs(enemys) do + for _, buffId in ipairs(buffs) do + e:addBuff(buffId) end end end - if data.specialEff ~= "" then local effect = data.specialEff:toArray(true, "=") if effect[1] == 1 then diff --git a/src/adv/AdvBuff.lua b/src/adv/AdvBuff.lua index 565ebac..4295f13 100644 --- a/src/adv/AdvBuff.lua +++ b/src/adv/AdvBuff.lua @@ -32,6 +32,7 @@ Buff.SP_MAX_CHANGE = 28 -- 魔法上限 Buff.ITEM_GET_UP = 29 -- 获得道具数量增加 Buff.Buff_EFFECT_CHANGE = 30 -- 改变 buff 效果 Buff.Buff_NO_PASSIVE_MONSTER = 31 -- 地图被动刷新不出来怪物 +Buff.SNEAK = 32 --潜行 --角色一些属性的变化 @@ -371,7 +372,26 @@ local BuffFactory = { return self.buffData.effectValue1 end end, + [Buff.SNEAK] = function(_Buff) + _Buff._initDB = function(self, data) + self.sneak = data.sneak + end + _Buff._getDB = function(self) + return {sneak = self.sneak} + end + -- 翻开怪 周围的格子 + _Buff.sneakBreak = function(self, enemyIds) + if self.isDel then return end + for _, enemyId in ipairs(enemyIds) do + self.sneak[enemyId] = (self.sneak[enemyId] or 0) + 1 + if self.sneak[enemyId] >= 4 then -- 4格 就删掉玩家的buff + self.isDel = true + break + end + end + end + end, } -- 同样的返回 effectValue1, effectValue2 * self.layer 类型的buff @@ -488,6 +508,7 @@ function Buff:checkKeep() 2=建筑id; 3=事件id 4=队伍为特定属性时 + 5=拥有指定buff --]] local checkFunc = {} @@ -524,6 +545,13 @@ function Buff:checkKeep() local role = self.owner.battle.adv.owner return role:getHerosCamp(role:getProperty("advTeam").heros) == teamAttr end + checkFunc[5] = function(_, buffId) + local buff = self.owner:getBuffById(buffId) + if buff and not buff.isDel then + return true + end + return false + end local keepTerm = self.buffData.keepTerm:toArray(true, "=") if not checkFunc[keepTerm[1]] then return true end diff --git a/src/adv/AdvMap.lua b/src/adv/AdvMap.lua index b31ef73..b88a419 100644 --- a/src/adv/AdvMap.lua +++ b/src/adv/AdvMap.lua @@ -2,6 +2,8 @@ local Room = require "adv.AdvRoom" local Passive = require "adv.AdvPassive" local AdvCommon = require "adv.AdvCommon" + +local Buff = require "adv.AdvBuff" -- 一层地图 local Map = class("AdvMap") -- 内部方法声明 @@ -115,12 +117,15 @@ function Map:addNewMonsterRand(monsterId, where) monsterId = math.randWeight(eventLib[AdvEventType.Monster][0], "showup") end - local event = {etype = AdvEventType.Monster, mId = self.adv.lastEnemyId} - self.adv.lastEnemyId = self.adv.lastEnemyId + 1 - event.id = monsterId + local event = { + type = AdvEventType.Monster, + id = monsterId, + } block:updateEvent(event) - self.adv.battle:addEnemy(room, block):triggerPassive(Passive.BORN_ONCE) + local enemy = self.adv.battle:addEnemy(room, block) + enemy:initAfter(event.enemy) + enemy:triggerPassive(Passive.BORN_ONCE) return room, block end @@ -168,6 +173,17 @@ function Map:openBlock(roomId, blockId, isPlayer, ignoreBack) if not ignoreBack then self.adv:backBlockChange(roomId, blockId) end + + -- 潜行检查 + local sneakBuff = self.adv.battle.player:hadBuff(Buff.SNEAK) + if sneakBuff then + local enemys = self:getEnemysBySize(roomId, blockId, 2) + local ids = {} + for _, e in ipairs(enemys) do + table.insert(ids, e.id) + end + sneakBuff:sneakBreak(ids) + end end end @@ -244,6 +260,20 @@ function Map:getBlocksBySize(roomId, blockId, size) return blocks end +function Map:getEnemysBySize(roomId, blockId, size) + local blocks = self:getBlocksBySize(roomId, blockId, size) + local enemys = {} + for _, block in ipairs(blocks) do + if block:isMonster() then + local e = self.adv.battle:getEnemy(block.room.roomId, block.blockId) + if e then + table.insert(enemys, e) + end + end + end + return enemys +end + -----------------------------随机地图----------------------------- -- isEnter isNewRelay 区分中继层的类型 --是否是开始进入 是否是第一次进入 diff --git a/src/adv/AdvPlayer.lua b/src/adv/AdvPlayer.lua index c1f4525..5bac324 100644 --- a/src/adv/AdvPlayer.lua +++ b/src/adv/AdvPlayer.lua @@ -527,8 +527,7 @@ function Enemy:ctor(battle, mId, monsterId, roomId, blockId, lock, enemy, mapIdx self.mapIdx = mapIdx self:initData(enemy) end -function Enemy:unlock(id) - self.id = id +function Enemy:unlock() self.lock = nil end -- libgit2 0.21.2