diff --git a/src/adv/Adv.lua b/src/adv/Adv.lua index c2fc2b1..f649b25 100644 --- a/src/adv/Adv.lua +++ b/src/adv/Adv.lua @@ -273,8 +273,9 @@ function Block:open(adv, room) if enemy then enemy:unlock(self.event.mId) else - adv.battle:addEnemy(room, self) + enemy = adv.battle:addEnemy(room, self) end + enemy:triggerPassive(Passive.BORN_ONCE) end randomFunc[AdvEventType.BOSS] = randomFunc[AdvEventType.Monster] --掉落 @@ -525,30 +526,37 @@ function Adv:getAroundBlocks(room, block) end --随机一个空的位置生成怪, 如果没有就没有 -function Adv:addNewMonsterRand(monsterId) - local pool = {} - for _, room in pairs(self.rooms) do - for _, block in pairs(room.blocks) do - if block.isOpen and not block.event then - table.insert(pool, {room, block}) +function Adv:addNewMonsterRand(monsterId, where) + local room, block + if where then + room, block = where[1], where[2] + else + local pool = {} + for _, room_ in pairs(self.rooms) do + for _, block_ in pairs(room_.blocks) do + if block_.isOpen and not block_.event then + table.insert(pool, {room_, block_}) + end end end + if not next(pool) then return end + local idx = math.randomInt(1, #pool) + room, block = pool[idx][1], pool[idx][2] end - if not next(pool) then return end - local idx = math.randomInt(1, #pool) - local room, block = pool[idx][1], pool[idx][2] - - local event = {etype = AdvEventType.Monster, mId = self.advInfo.enemyId} - self.advInfo.enemyId = self.advInfo.enemyId + 1 + if not monsterId then local eventLib = getEventLib(self.advInfo.chapter, self.advInfo.level, AdvEventType.Monster) if not next(eventLib[AdvEventType.Monster]) then return false end monsterId = math.randWeight(eventLib[AdvEventType.Monster], "showup") end + + local event = {etype = AdvEventType.Monster, mId = self.advInfo.enemyId} + self.advInfo.enemyId = self.advInfo.enemyId + 1 event.id = monsterId block.event = event room.info.event[block.blockId] = event - self.battle:addEnemy(room, block) + self.battle:addEnemy(room, block):triggerPassive(Passive.BORN_ONCE) + return room, block end @@ -579,7 +587,9 @@ end -- 打开一个地块 function Adv:openBlock(roomId, blockId) local room = self.rooms[roomId] + if not room then return end local block = room.blocks[blockId] + if not block then return end room:openBlock(block, self) self:backBlockChange(roomId, blockId) end @@ -696,7 +706,7 @@ local function clickChoose(self, room, block, params) } assert(not cond[1] or checkCond[cond[1]], "error cond, event_chooseCsv id :" .. block.event.id) if cond[1] and not checkCond[cond[1]]() then return end - + local clearBlock = true local effect = block.event.effect[choose] local doEffect = { [1] = function() -- 获得某道具N个 @@ -706,17 +716,17 @@ local function clickChoose(self, room, block, params) self.battle.player:addBuff(effect[2]) end, [3] = function() --发现怪物 - local r, b = self:addNewMonsterRand(effect[2]) - if r then - self:backBlockChange(r.roomId, b.blockId) - end + self:addNewMonsterRand(effect[2], {room, block}) + clearBlock = false end, [4] = function() --无事发生 end } assert(doEffect[effect[1]], "error effect, event_chooseCsv id :" .. block.event.id) doEffect[effect[1]]() - room:clearBEvent(block) + if clearBlock then + room:clearBEvent(block) + end return true end @@ -749,6 +759,7 @@ local function clickBuild(self, room, block, params) local buildData = csvdb["event_buildingCsv"][block.event.id] if not buildData then return end-- 偷偷改表了 if not block.event.effect then return end -- 没有效果 气人不 + local clearBlock = true local effect = block.event.effect --todo 效果生效 local doEffect = { @@ -759,8 +770,8 @@ local function clickBuild(self, room, block, params) self.battle.player:addBuff(effect[2]) end, [3] = function() --发现怪物 - local r, b = self:addNewMonsterRand(effect[2]) - if r then self:backBlockChange(r.roomId, b.blockId) end + self:addNewMonsterRand(effect[2], {room, block}) + clearBlock = false end, [4] = function() --无事发生 end @@ -768,7 +779,9 @@ local function clickBuild(self, room, block, params) assert(doEffect[effect[1]], "error effect, event_buildingCsv id :" .. block.event.id) if not self:cost({[buildData.type] = 1}, {}) then return end doEffect[effect[1]]() - room:clearBEvent(block) + if clearBlock then + room:clearBEvent(block) + end return true end @@ -884,7 +897,7 @@ function Adv:useSkill(skillId, target) end --敌人死亡 -function Adv:enemyDead(roomId, blockId) +function Adv:enemyDead(roomId, blockId, escape) local room = self.rooms[roomId] local block = room.blocks[blockId] --死了以后掉东西 @@ -892,19 +905,23 @@ function Adv:enemyDead(roomId, blockId) if block.event.etype == AdvEventType.BOSS then room.isBossRoom = false end - local item = block.event.item - if not item then - if block.event.etype == AdvEventType.BOSS then - item = {ItemId.AdvKey, 1} - else - local monsterData = csvdb["event_monsterCsv"][block.event.id] - local dropData = csvdb["event_dropCsv"][monsterData.dropid] - item = dropData["range"]:randWeight(true) + if escape then + room:clearBEvent(block) + else + local item = block.event.item + if not item then + if block.event.etype == AdvEventType.BOSS then + item = {ItemId.AdvKey, 1} + else + local monsterData = csvdb["event_monsterCsv"][block.event.id] + local dropData = csvdb["event_dropCsv"][monsterData.dropid] + item = dropData["range"]:randWeight(true) + end end + table.clear(block.event) + block.event.etype = AdvEventType.Drop + block.event.item = item end - table.clear(block.event) - block.event.etype = AdvEventType.Drop - block.event.item = item end self:backBlockChange(roomId, blockId) end diff --git a/src/adv/AdvBattle.lua b/src/adv/AdvBattle.lua index 63d5cb3..6157883 100644 --- a/src/adv/AdvBattle.lua +++ b/src/adv/AdvBattle.lua @@ -4,10 +4,14 @@ local Battle = class("Battle") function Battle:ctor(adv) self.adv = adv self.player = nil --玩家 + self.isNewPlayer = false self.enemys = {} --怪 self:initPlayer() self:initEnemys() self:initAfter() + if self.isNewPlayer then + self.player:triggerPassive(Passive.BORN_ONCE) + end end function Battle:initAfter() @@ -37,6 +41,7 @@ function Battle:initPlayer() player.miss = 0 player.hit = 100 self.adv.advTeam.player = player + self.isNewPlayer = true end self.player = Player.new(self, self.adv.advTeam.player) end @@ -64,7 +69,9 @@ function Battle:addEnemy(room, block) end block.event.enemy = enemy end - table.insert(self.enemys, Enemy.new(self, block.event.mId or 999, block.event.id, room.roomId, block.blockId, not block.isOpen, block.event.enemy)) + local player = Enemy.new(self, block.event.mId or 999, block.event.id, room.roomId, block.blockId, not block.isOpen, block.event.enemy) + table.insert(self.enemys, player) + return player end end @@ -98,7 +105,10 @@ function Battle:playerAtk(roomId, blockId) end --触发全员被动技能 function Battle:triggerPassive(condType, params) - + self.player:triggerPassive(condType, params) + for _, enemy in ipairs(self.enemys) do + enemy:triggerPassive(condType, params) + end end --回合 diff --git a/src/adv/AdvBuff.lua b/src/adv/AdvBuff.lua index 6362811..7d9dc85 100644 --- a/src/adv/AdvBuff.lua +++ b/src/adv/AdvBuff.lua @@ -232,7 +232,6 @@ end function Buff:afterRound() if self.isDel or self.owner.isDead then return end - if self._afterRount then self:_afterRount() end diff --git a/src/adv/AdvPassive.lua b/src/adv/AdvPassive.lua index 0911090..5f64feb 100644 --- a/src/adv/AdvPassive.lua +++ b/src/adv/AdvPassive.lua @@ -3,8 +3,8 @@ local Passive = class("Passive") -- 每回合触发的使用 afterRound -- 其他触发的使用 triggerPassive -Passive.BORN_ONCE = 1 -- 自身出生(翻开所在格子)后M回合触发(1次) -Passive.BORN_PRE = 2 --自身出生(翻开所在格子)后每N回合触发1次 +Passive.BORN_ONCE = 1 -- 自身出生(翻开所在格子)触发 +Passive.ROOM_SHOW = 2 --自身所在房间被展示时,触发1次 Passive.HURT_PERCENT_SELF = 3 --自身,每损失N%生命值,触发1次 Passive.HURT_PERCENT_TEAM = 4 --队友,每损失N%生命值,触发1次 Passive.HP_LOW_SELF = 5 --自身生命值= self.passiveData.value then + self.rv = self.rv % self.passiveData.value -- 取余 + return true + end + end + _Passive._initDB = function(self, data) + self.rv = data.rv or 0 + end + _Passive._getDB = function(self) + return {rv = self.rv} + end +end + +PassiveCondFactory[Passive.HURT_PERCENT_TEAM] = PassiveCondFactory[Passive.HURT_PERCENT_SELF] --逻辑相同 +PassiveCondFactory[Passive.SELF_ATK] = PassiveCondFactory[Passive.HURT_PERCENT_SELF] --逻辑相同 +PassiveCondFactory[Passive.SELF_HURT] = PassiveCondFactory[Passive.HURT_PERCENT_SELF] --逻辑相同 +PassiveCondFactory[Passive.TEAM_ATK] = PassiveCondFactory[Passive.HURT_PERCENT_SELF] --逻辑相同 +PassiveCondFactory[Passive.TEAM_HURT] = PassiveCondFactory[Passive.HURT_PERCENT_SELF] --逻辑相同 +PassiveCondFactory[Passive.TARGET_SKILL] = PassiveCondFactory[Passive.HURT_PERCENT_SELF] --逻辑相同 +PassiveCondFactory[Passive.TEAM_SKILL] = PassiveCondFactory[Passive.HURT_PERCENT_SELF] --逻辑相同 + +PassiveCondFactory[Passive.ROOM_SHOW] = function(_Passive) + _Passive._trigger = function(self, params) + local roomId = params.roomId + if self.roomId == roomId then + return true + end + end +end + +PassiveCondFactory[Passive.HP_LOW_SELF] = function(_Passive) + _Passive._afterRound = function(self) + if self.owner.hp / self.owner.hpMax * 100 < self.passiveData.value then + self:trigger(Passive.HP_LOW_SELF) + end + end +end + +PassiveCondFactory[Passive.HP_LOW_TEAM] = function(_Passive) + _Passive._afterRound = function(self) + for _, player in ipairs(self.owner:getTeam(2)) do + if player.hp / player.hpMax * 100 < self.passiveData.value then + self:trigger(Passive.HP_LOW_TEAM, {trigger = player}) + end + end + end +end + +PassiveCondFactory[Passive.HP_UP_SELF] = function(_Passive) + _Passive._afterRound = function(self) + if self.owner.hp / self.owner.hpMax * 100 > self.passiveData.value then + self:trigger(Passive.HP_UP_SELF) + end + end +end + +PassiveCondFactory[Passive.HP_UP_TEAM] = function(_Passive) + _Passive._afterRound = function(self) + for _, player in ipairs(self.owner:getTeam(2)) do + if player.hp / player.hpMax * 100 > self.passiveData.value then + self:trigger(Passive.HP_UP_TEAM, {trigger = player}) + end + end + end +end + +PassiveCondFactory[Passive.MONSTER_COUNT_UP] = function(_Passive) + _Passive._afterRound = function(self) + local monsters = self.owner.battle.player:getTeam(2) + if #monsters > self.passiveData.value then + self:trigger(Passive.MONSTER_COUNT_UP) + end + end +end + +PassiveCondFactory[Passive.MONSTER_COUNT_LOW] = function(_Passive) + _Passive._afterRound = function(self) + local monsters = self.owner.battle.player:getTeam(2) + if #monsters < self.passiveData.value then + self:trigger(Passive.MONSTER_COUNT_LOW) + end + end +end + function Passive:ctor(owner, data) self.owner = owner @@ -36,8 +122,11 @@ function Passive:ctor(owner, data) self.isDel = false self.round = data.round or 0 --触发剩余回合数 self.count = data.count or 0 --触发剩余次数 - if PassiveFactory[self.passiveData.condition] then - PassiveFactory[self.passiveData.condition](self) + if PassiveCondFactory[self.passiveData.condition] then + PassiveCondFactory[self.passiveData.condition](self) + end + if self._initDB then + self:_initDB(data) end end @@ -46,8 +135,8 @@ function Passive:getCondType() end function Passive:effect() - if self._effect then - self:_effect() + if math.randomInt(1, 100) <= self.passiveData.chance and self["effect" .. self.passiveData.effect] then + self["effect" .. self.passiveData.effect](self) end --次数为 -1 一局只能触发一次,触发过后删掉就可以 if self.count == -1 then @@ -78,16 +167,19 @@ function Passive:isActive( ) end function Passive:trigger(condType, params) --触发检查 + params = params or {} + if self.isDel or self.owner.isDead then return end if self:getCondType() ~= condType then return end + if self.owner.lock and self.passiveData.effect ~= 3 then return end -- 锁定的只能触发翻开自己格子的固有技 if self:isActive() then return end if self._trigger then - if not self._trigger(params) then return end --检查 + if not self:_trigger(params) then return end --检查 end self.round = self.passiveData.delay --首次 self.count = self.passiveData.count --次数 -- 没有延迟就直接触发 if self.round == 0 then - self:effect() + self:effect(params.trigger) end end @@ -102,4 +194,30 @@ function Passive:getDB() db.count = self.count return db end + +--默认=0=使用技能, +function Passive:effect0() + self.owner:releaseSkill(self.passiveData.effectValue) +end +--1=自身获得buff +function Passive:effect1() + self.owner:addBuff(self.passiveData.effectValue) +end +--2=触发目标获得buff +function Passive:effect2(trigger) + if trigger then + trigger:addBuff(self.passiveData.effectValue) + end +end +--3=翻开自己所在格子, +function Passive:effect3() + self.owner.battle.adv:openBlock(self.owner.roomId, self.owner.blockId) +end +--4=逃跑 +function Passive:effect4() + self.owner.isDead = true --跑了 + self.owner.battle.adv:enemyDead(self.owner.roomId,self.owner.blockId, true) +end + + return Passive \ No newline at end of file diff --git a/src/adv/AdvPlayer.lua b/src/adv/AdvPlayer.lua index 5f36060..7ebf71b 100644 --- a/src/adv/AdvPlayer.lua +++ b/src/adv/AdvPlayer.lua @@ -165,12 +165,20 @@ end function BaseObject:hurt(value, releaser, params) params = params or {} if params.hurtType and params.hurtType == 1 then + releaser:triggerPassive(Passive.SELF_ATK) + for _, team in ipairs(releaser:getTeam(1, true)) do + team:triggerPassive(Passive.TEAM_ATK) + end if self:hadBuff(Buff.IMMNUE_ATK) then return end --无视普通攻击 local hit = releaser.hit - self.miss --命中率 if hit < math.randomInt(1, 100) then --miss return end + self:triggerPassive(Passive.SELF_HURT, {trigger = releaser}) + for _, team in ipairs(self:getTeam(1, true)) do + team:triggerPassive(Passive.TEAM_HURT, {trigger = releaser}) + end end value = self:getInjuredValue(value) --减伤计算 @@ -222,8 +230,17 @@ function BaseObject:hurt(value, releaser, params) self.battle.adv:backHpChange(self.id, -value) self.hp = math.max(0, self.hp - value) if self.hp == 0 then + self:triggerPassive(Passive.SELF_DEAD) + for _, team in ipairs(self:getTeam(1, true)) do + team:triggerPassive(Passive.TEAM_DEAD) + end + self.isDead = true end + self:triggerPassive(Passive.HURT_PERCENT_SELF, {value = value / self.hpMax}) + for _, team in ipairs(self:getTeam(1, true)) do + team:triggerPassive(Passive.HURT_PERCENT_TEAM, {value = value / self.hpMax}) + end end --恢复 function BaseObject:recover(value, releaser, params) @@ -317,6 +334,13 @@ function BaseObject:releaseSkill(skillId, skillLevel, target) target_:addBuff(buffId, self) end end + + for _, team in ipairs(self:getTeam(2)) do + team:triggerPassive(Passive.TARGET_SKILL) + end + for _, team in ipairs(self:getTeam(1, true)) do + team:triggerPassive(Passive.TEAM_SKILL) + end end --0 全部 1 我方 2 敌方 @@ -379,7 +403,10 @@ function BaseObject:getDB() end function BaseObject:triggerPassive(condType, params) - + if self.isDead then return end + for _, passive in ipairs(self.passives) do + passive:trigger(condType, params) --检查触发 + end end local Enemy = class("Enemy", BaseObject) -- libgit2 0.21.2