From 36c30c5c9892f0aa4b299c080f1913a650d2213e Mon Sep 17 00:00:00 2001 From: zhouahaihai Date: Fri, 18 Jan 2019 14:43:17 +0800 Subject: [PATCH] 冒险 --- src/GlobalVar.lua | 20 ++++++++++---------- src/adv/Adv.lua | 87 +++++++++++++++++++++++++++++++++++++++++++++++++++------------------------------------ src/adv/AdvBattle.lua | 14 ++++++++------ src/adv/AdvPassive.lua | 7 +++++-- src/adv/AdvPlayer.lua | 29 +++++++++++++++++++++++------ src/models/Role.lua | 1 + src/models/RolePlugin.lua | 1 + 7 files changed, 99 insertions(+), 60 deletions(-) diff --git a/src/GlobalVar.lua b/src/GlobalVar.lua index 4958f20..67065f3 100644 --- a/src/GlobalVar.lua +++ b/src/GlobalVar.lua @@ -55,6 +55,7 @@ ItemId = { Diamond = 3, -- 钻石 BreakCost = 4, -- 突破材料 HeroFC = {700, 701, 702, 703}, -- 通用角色碎片 + AdvKey = 80, -- 冒险钥匙 } --客户端不需要知道这个 @@ -78,14 +79,13 @@ AdvEventType = { } AdvBackEventType = { - Reward = 1 --奖励 - HpChange = 2 --血量改变 - AtkChange = 3 --攻击改变 - Buff = 4 --buff 改变 - Skill = 5 --释放技能 - Atk = 6 --攻击动作 - Next = 7 --进入下一层 - End = 8 -- 结束 - BlockChange = 9 -- 块改变 - + Reward = 1, --奖励 + HpChange = 2, --血量改变 + AtkChange = 3, --攻击改变 + Buff = 4, --buff 改变 + Skill = 5, --释放技能 + Atk = 6, --攻击动作 + Next = 7, --进入下一层 + End = 8, -- 结束 + BlockChange = 9, -- 块改变 } \ No newline at end of file diff --git a/src/adv/Adv.lua b/src/adv/Adv.lua index 9e68115..f2b9ede 100644 --- a/src/adv/Adv.lua +++ b/src/adv/Adv.lua @@ -243,7 +243,7 @@ local function randomAdvMap(role, chapterId, level, notNotify) print("这个地图没有钥匙!!! mapId : " .. mapId) else local event = monsterEvents[math.randomInt(1, #monsterEvents)] - event.item = {1, 1} --掉落钥匙 --todo + event.item = {ItemId.AdvKey, 1} --掉落钥匙 --todo end end end @@ -269,11 +269,11 @@ function Block:open(adv, room) randomFunc[AdvEventType.Monster] = function() self.event.mId = adv.advInfo.enemyId --给怪一个有序id 回合逻辑时使用 adv.advInfo.enemyId = adv.advInfo.enemyId + 1 - local enemy = self.battle:getEnemy(room.roomId, self.blockId) + local enemy = adv.battle:getEnemy(room.roomId, self.blockId) if enemy then enemy:unlock(self.event.mId) else - self.battle:addEnemy(room, self) + adv.battle:addEnemy(room, self) end end randomFunc[AdvEventType.BOSS] = randomFunc[AdvEventType.Monster] @@ -298,7 +298,7 @@ function Block:open(adv, room) end end --建筑 - [AdvEventType.Build] = function() + randomFunc[AdvEventType.Build] = function() local data = csvdb["event_buildingCsv"][self.event.id] self.event.effect = data["range"]:randWeight(true) --随出建筑效果 if self.event.effect[1] == 1 then --获得某道具 @@ -308,7 +308,7 @@ function Block:open(adv, room) end end --抉择点 - [AdvEventType.Choose] = function() + randomFunc[AdvEventType.Choose] = function() local data = csvdb["event_chooseCsv"][self.event.id] self.event.effect = {} for i = 1, 2 do @@ -325,7 +325,7 @@ function Block:open(adv, room) randomFunc[self.event.etype]() end end - self.isOpne = true + self.isOpen = true end local Room = class("Room") @@ -374,14 +374,18 @@ end function Room:openBlock(block, adv) if self.blocks[block.blockId] ~= block then return end if block.isOpen == true then return end - block:open(adv, self) - local allOpen = true - if not self.isBossRoom then + if self.isBossRoom then for _, _block in pairs(self.blocks) do - if not _block.isOpen then - allOpen = false - break - end + _block:open(adv, self) + end + else + block:open(adv, self) + end + local allOpen = true + for _, _block in pairs(self.blocks) do + if not _block.isOpen then + allOpen = false + break end end @@ -413,7 +417,7 @@ function Adv:ctor(owner) self.advInfo = self.owner:getProperty("advInfo") --这个变量置空使用 table.clear self.advTeam = self.owner:getProperty("advTeam") --这个变量置空使用 table.clear self:clear() - self.events = {} --发给客户端的事件组 + self.backEvents = {} --发给客户端的事件组 end -- 清空自己组织的数据 @@ -485,9 +489,10 @@ end -- 随机地图 function Adv:initByChapter(chapterId, level, notNotify) + level = level or 1 randomAdvMap(self.owner, chapterId, level, notNotify) self:initByInfo() --初始化 - role:updateProperties({advInfo = self.advInfo, advTeam = self.advTeam}, notNotify) + self.owner:updateProperties({advInfo = self.advInfo, advTeam = self.advTeam}, notNotify) end --获取,某个位置上的 room 和 block @@ -629,7 +634,7 @@ end --事件点击处理 local function clickOut(self, room, block, params) - if self:cost({[1] = 1}, {}) then --todo 钥匙id + if self:cost({[ItemId.AdvKey] = 1}, {}) then if self.advInfo.level >= csvdb["adv_chapterCsv"][self.advInfo.chapter].limitlevel then --关卡结束 self:over(true) else @@ -781,39 +786,40 @@ function Adv:clickBlock(roomId, blockId, params) local block = room.blocks[blockId] if not block then return end - local canOpen = false --如果未开放是否可以开放 - local hadMonster = false -- 周围是否有解锁的怪未击败 - for _, one in ipairs(self:getAroundBlocks(room, block)) do - local _room, _block = one[1], one[2] - if _block.isOpen then canOpen = true end - if _block.isOpen and _block.event and (_block.event.etype == AdvEventType.BOSS or _block.event.etype == AdvEventType.Monster) then - hadMonster = true - end - end local status = false + local clickEvent = false if not block.isOpen then + local canOpen = false --如果未开放是否可以开放 + local hadMonster = false -- 周围是否有解锁的怪未击败 + for _, one in ipairs(self:getAroundBlocks(room, block)) do + local _room, _block = one[1], one[2] + if _block.isOpen then canOpen = true end + if _block.isOpen and _block.event and (_block.event.etype == AdvEventType.BOSS or _block.event.etype == AdvEventType.Monster) then + hadMonster = true + end + end if canOpen and not hadMonster then --开放 room:openBlock(block, self) status = true end else + clickEvent = true --点了空地 if not block.event then return end --可点击的事件 - if not hadMonster and not room.isBossRoom then + if not room.isBossRoom or block.event.etype == AdvEventType.BOSS then if eventCallFunc[block.event.etype] then status = eventCallFunc[block.event.etype](self, room, block, params) end end end - if status and block.event.etype ~= AdvEventType.Out then --出去了就不计算回合了 + if status and (not clickEvent or (not block.event or block.event.etype ~= AdvEventType.Out)) then --出去了就不计算回合了 self:backBlockChange(roomId, blockId) self:afterRound() end - self.battle:getDB() - role:updateProperties({advInfo = self.advInfo, advTeam = self.advTeam}) + self:saveDB() return status end @@ -840,8 +846,7 @@ function Adv:useItem(itemId, count, target) end self:afterRound() - self.battle:getDB() - role:updateProperties({advInfo = self.advInfo, advTeam = self.advTeam}) + self:saveDB() return true end @@ -870,20 +875,23 @@ function Adv:useSkill(skillId, target) end self:afterRound() - self.battle:getDB() - role:updateProperties({advInfo = self.advInfo, advTeam = self.advTeam}) + self:saveDB() return true end --敌人死亡 function Adv:enemyDead(roomId, blockId) - local block = self.rooms[roomId].blocks[blockId] + local room = self.rooms[roomId] + local block = room.blocks[blockId] --死了以后掉东西 if block.event and (block.event.etype == AdvEventType.BOSS or block.event.etype == AdvEventType.Monster) then --处理死亡 + 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 = {1, 1} --todo 钥匙 + item = {ItemId.AdvKey, 1} else local monsterData = csvdb["event_monsterCsv"][block.event.id] local dropData = csvdb["event_dropCsv"][monsterData.dropid] @@ -930,7 +938,7 @@ function Adv:backBuff(enemyId, buffId, isDel) end -- if is player enemyId is nil function Adv:backSkill(enemyId, skillId, receiver) - self:pushBackEvent(AdvBackEventType.Skill, {enemyId = enemyId, buffId = skillId, receiver = receiver}) + self:pushBackEvent(AdvBackEventType.Skill, {enemyId = enemyId, skillId = skillId, receiver = receiver}) end function Adv:backNext() @@ -962,4 +970,11 @@ function Adv:afterRound() end end +function Adv:saveDB() + if self.battle then + self.battle:getDB() + end + self.owner:updateProperties({advInfo = self.advInfo, advTeam = self.advTeam}) +end + return Adv \ No newline at end of file diff --git a/src/adv/AdvBattle.lua b/src/adv/AdvBattle.lua index c37b6d7..63d5cb3 100644 --- a/src/adv/AdvBattle.lua +++ b/src/adv/AdvBattle.lua @@ -1,6 +1,6 @@ -local Player, Enemy = require "adv.advPlayer" +local Player, Enemy = table.unpack(require "adv.advPlayer") local Buff = require "adv.AdvBuff" -local AdvBattle = class("Battle") +local Battle = class("Battle") function Battle:ctor(adv) self.adv = adv self.player = nil --玩家 @@ -63,14 +63,14 @@ function Battle:addEnemy(room, block) table.insert(enemy.passives, {id = id}) end block.event.enemy = enemy - 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)) 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)) end end function Battle:getEnemy(roomId, blockId) for _, enemy in ipairs(self.enemys) do - if enemy.roomId == roomId and enemy.blockId = blockId then + if enemy.roomId == roomId and enemy.blockId == blockId then return enemy end end @@ -87,16 +87,18 @@ end function Battle:playerAtk(roomId, blockId) local enemy = self:getEnemy(roomId, blockId) if enemy then + self.adv:backAtk(nil, enemy.id) enemy:hurt(self.player:getHurtValue(), self.player, {hurtType = 1}) --是否无法反击 if not enemy:hadBuff(Buff.CANT_BACK_ATK) then + self.adv:backAtk(enemy.id, nil) self.player:hurt(enemy:getHurtValue(), enemy, {hurtType = 1}) end end end --触发全员被动技能 function Battle:triggerPassive(condType, params) - + end --回合 @@ -133,4 +135,4 @@ function Battle:getDB() end end -return AdvBattle \ No newline at end of file +return Battle \ No newline at end of file diff --git a/src/adv/AdvPassive.lua b/src/adv/AdvPassive.lua index 7cef59a..0911090 100644 --- a/src/adv/AdvPassive.lua +++ b/src/adv/AdvPassive.lua @@ -25,7 +25,7 @@ Passive.ROOM_SHOW = 19 --自身所在房间被展示时,触发1次 -- 不同的开启条件 local PassiveFactory = { - [] + } function Passive:ctor(owner, data) @@ -80,7 +80,9 @@ end function Passive:trigger(condType, params) --触发检查 if self:getCondType() ~= condType then return end if self:isActive() then return end - + if self._trigger then + if not self._trigger(params) then return end --检查 + end self.round = self.passiveData.delay --首次 self.count = self.passiveData.count --次数 -- 没有延迟就直接触发 @@ -98,5 +100,6 @@ function Passive:getDB() db.level = self.level db.round = self.round db.count = self.count + return db end return Passive \ No newline at end of file diff --git a/src/adv/AdvPlayer.lua b/src/adv/AdvPlayer.lua index 1f54c3a..364911d 100644 --- a/src/adv/AdvPlayer.lua +++ b/src/adv/AdvPlayer.lua @@ -30,7 +30,7 @@ end -- 角色初始化完以后才是 技能和被动技能 方便初始化 buff 的 释放对象 function BaseObject:initAfter(data) for _, passive in ipairs(data.passives or {}) do - table.insert(self.passives, Passive.load(self, passive)) + table.insert(self.passives, Passive.new(self, passive)) end for _, buff in ipairs(data.buffs or {}) do table.insert(self.buffs, Buff.load(self, buff)) @@ -55,6 +55,7 @@ function BaseObject:clearRound() end for i = #self.buffs, 1, -1 do if self.buffs[i].isDel then + self.battle.adv:backBuff(self.id, self.buffs[i].id, true) self.buffs[i]:endBuff() table.remove(self.buffs, i) end @@ -78,6 +79,8 @@ function BaseObject:addBuff(buffId, releaser) end end table.insert(self.buffs, Buff.create(self, releaser, {id = buffId})) + + self.battle.adv:backBuff(self.id, buffId) end function BaseObject:hadBuff(bType) @@ -130,10 +133,17 @@ function BaseObject:getInjuredChange() end --重新计算属性 function BaseObject:reSetAttr(field) + local old = self[field] self[field] = self["_" .. field] --重置一下 local fieldToBuff = {atk = Buff.IMMNUE_ATK, hit = Buff.HIT_CHANGE, miss = Buff.MISS_CHANGE} local effect = self:getCommonBuffEffect(fieldToBuff[field]) self[field] = (self[field] + effect[0]) * (1 + effect[1]) + local delta = self[field] - old + if delta ~= 0 then + if field == "atk" then + self.battle.adv:backAtkChange(self.id, delta) + end + end end --计算打出伤害加成后的值 @@ -208,6 +218,7 @@ function BaseObject:hurt(value, releaser, params) end --受伤了~ + self.battle.adv:backHpChange(self.id, -value) self.hp = math.max(0, self.hp - value) if self.hp == 0 then self.isDead = true @@ -218,9 +229,11 @@ function BaseObject:recover(value, releaser, params) params = params or {} value = math.max(0, value) self.hp = math.min(self.hpMax, self.hp + value) + self.battle.adv:backHpChange(self.id, value) end function BaseObject:releaseSkill(skillId, skillLevel, target) + if self:hadBuff(Buff.CANT_SKILL) then return end -- 针对 怪物 skillLevel = skillLevel or 1 local skillData = csvdb["adv_skillCsv"][skillId][skillLevel or 1] local targetChoose = skillData.target:toArray(true, "=") @@ -289,6 +302,10 @@ function BaseObject:releaseSkill(skillId, skillLevel, target) targets = tempT --all end end + --返回客户端 + for _, target in ipairs(targets) do + self.battle.adv:backSkill(self.id, skillId, target.id) + end -- 增加buff for _, buffId in ipairs(skillData.selfbuff:toArray(true, "=")) do self:addBuff(buffId, self) @@ -361,14 +378,14 @@ function BaseObject:getDB() end function BaseObject:triggerPassive(condType, params) - + end local Enemy = class("Enemy", BaseObject) -function Enemy:ctor(battle, monsterId, id, roomId, blockId, lock, enemy) +function Enemy:ctor(battle, mId, monsterId, roomId, blockId, lock, enemy) Enemy.super.ctor(self, battle) - self.id = id - self.monsterId = monsterId + self.id = mId + self.monsterId = monsterId --数据id self.roomId = roomId self.blockId = blockId self.lock = lock @@ -385,4 +402,4 @@ function Player:ctor(battle, data) self:initData(data) end -return Player, Enemy \ No newline at end of file +return table.pack(Player, Enemy) \ No newline at end of file diff --git a/src/models/Role.lua b/src/models/Role.lua index fc82133..03975b0 100644 --- a/src/models/Role.lua +++ b/src/models/Role.lua @@ -147,6 +147,7 @@ function Role:data() advPass = self:getProperty("advPass"), advInfo = self:getProperty("advInfo"), advItems = self:getProperty("advItems"):toNumMap(), + advTeam = self:getProperty("advTeam"), } end diff --git a/src/models/RolePlugin.lua b/src/models/RolePlugin.lua index d5592a3..7be86d4 100644 --- a/src/models/RolePlugin.lua +++ b/src/models/RolePlugin.lua @@ -205,6 +205,7 @@ function RolePlugin.bind(Role) function Role:getAdvData() if not self.advData then self.advData = require("adv.Adv").new(self) + self.advData:initByInfo() end return self.advData end -- libgit2 0.21.2