Commit 4f0a5faeacb8e70e036011cc850f53debe3d9aa5

Authored by zhouhaihai
1 parent faabdf3c

营养剂

src/GlobalVar.lua
... ... @@ -78,6 +78,7 @@ ItemId = {
78 78 EquipUp = 11, -- 装备升级材料
79 79 DinerCoin = 12, --后勤物资
80 80 LoveUp = 14, --好感度提升道具
  81 + OldCoin = 15, --古代金币
81 82 DinerSpTask = 20, -- 餐厅任务采购券
82 83 LoveBreak = 21, --好感度突破道具
83 84 PvpKey = 22, -- pvp钥匙
... ... @@ -130,6 +131,7 @@ AdvBackEventType = {
130 131 BattleBegin = 16, -- 战斗开始
131 132 Trap = 17, --陷阱
132 133 Layer = 18, --切换层
  134 + MapShow = 19, -- 展示地图
133 135 }
134 136  
135 137 AdvScoreType = {
... ...
src/actions/AdvAction.lua
... ... @@ -281,13 +281,32 @@ end
281 281 function _M.usePotionRpc(agent, data)
282 282 local role = agent.role
283 283 local msg = MsgPack.unpack(data)
284   - local dishLevel = role.dinerData:getProperty("dishTree"):getv(msg.potionId, 0)
285   - if dishLevel == 0 then
286   - return
287   - end
  284 + local potionId = msg.potionId -- 营养剂Id
  285 + local target = msg.target -- {roomId = 1, blockId = 1} 选择的目标
  286 + local potionLv = role.dinerData:getProperty("dishTree"):getv(potionId, 0)
  287 + if potionLv == 0 then return 1 end
  288 +
  289 + local potionSet = csvdb["adv_potionCsv"][potionId]
  290 + if not potionSet then return 2 end
  291 +
  292 + local potionData = potionSet[potionLv]
  293 + if not potionData then return 3 end
  294 +
  295 + local potionBag = role:getProperty("potionBag")
  296 + local own = potionBag[potionId] or 0
  297 + if own <= 0 then return 4 end
  298 +
288 299 local adv = role:getAdvData()
289   - local status = adv:usePotion(msg.potionId, dishLevel, msg.target) -- target {roomId = 1, blockId = 1} 选择的目标
  300 +
  301 + local status = adv:doActive(potionData.effect, target) -- target
290 302 if not status then return end
  303 +
  304 + potionBag[potionId] = own - 1
  305 + role:updateProperty({field = "potionBag", value = potionBag})
  306 + adv:afterRound()
  307 + adv:saveDB()
  308 + role:checkTaskEnter("AdvUsePotion")
  309 +
291 310 SendPacket(actionCodes.Adv_usePotionRpc, MsgPack.pack({events = adv:popBackEvents()}))
292 311 return true
293 312 end
... ...
src/adv/Adv.lua
... ... @@ -710,7 +710,10 @@ function Adv:clickBlock(roomId, blockId, params)
710 710 local _room, _block = one[1], one[2]
711 711 if _block.isOpen then canOpen = true end
712 712 if _block.isOpen and _block:isMonster() then
713   - hadMonster = true
  713 + local enemy = self.battle:getEnemy(_room.roomId, _block.blockId)
  714 + if not enemy:hadBuff(Buff.DONT_DEFEND) then
  715 + hadMonster = true
  716 + end
714 717 end
715 718 end
716 719 if canOpen and not hadMonster then --开放
... ... @@ -773,10 +776,172 @@ function Adv:useItem(itemId, count, target)
773 776 return true
774 777 end
775 778  
  779 +function Adv:doActive(activeId, target)
  780 + local activeData = csvdb["adv_activeCsv"][activeId]
  781 + if not activeData then return end
  782 +
  783 + local targers = {}
  784 +
  785 + -- 筛选对象
  786 + if activeData.usetype == 1 then -- 自己
  787 + elseif activeData.usetype == 2 then -- 敌人
  788 + if not target or not target.roomId or not target.blockId then return end
  789 + local block = self:getBlock(target.roomId, target.blockId)
  790 + if block:isBoss() then return end
  791 + local enemy = self.battle:getEnemy(target.roomId, target.blockId)
  792 + if not enemy then return end
  793 + local blocks = self:getCurMap():getBlocksBySize(target.roomId, target.blockId, activeData.scope)
  794 + for _, block in pairs(blocks) do
  795 + if block:isMonster() and not block:isBoss() then
  796 + local e = self.battle:getEnemy(block.room.roomId, block.blockId)
  797 + if e then
  798 + table.insert(targers, e)
  799 + end
  800 + end
  801 + end
  802 + elseif activeData.usetype == 3 then -- 地板
  803 + if not target or not target.roomId or not target.blockId then return end
  804 + local block = self:getBlock(target.roomId, target.blockId)
  805 + if block:isBoss() then return end
  806 + local blocks = self:getCurMap():getBlocksBySize(target.roomId, target.blockId, activeData.scope)
  807 + for _, block in pairs(blocks) do
  808 + if not block:isBoss() then
  809 + table.insert(targers, block)
  810 + end
  811 + end
  812 + elseif activeData.usetype == 4 then -- 自己或者没有目标
  813 + elseif activeData.usetype == 5 then -- 空地板
  814 + if not target or not target.roomId or not target.blockId then return end
  815 + local block = self:getBlock(target.roomId, target.blockId)
  816 + if not block.isOpen or block:getEventType() then return end
  817 + local blocks = self:getCurMap():getBlocksBySize(target.roomId, target.blockId, activeData.scope)
  818 + for _, block in pairs(blocks) do
  819 + if not block:isBoss() then
  820 + table.insert(targers, block)
  821 + end
  822 + end
  823 + end
  824 +
  825 + local doActiveEffect = {}
  826 +
  827 + -- 1=map_buff_id:为范围内所有目标附加mapbuff
  828 + doActiveEffect[1] = function(_, buffId)
  829 + if not next(targers) and (activeData.usetype == 1 or activeData.usetype == 4)then
  830 + table.insert(targers, self.battle.player)
  831 + end
  832 +
  833 + for _, target in ipairs(targers) do
  834 + target:addBuff(buffId, self.battle.player)
  835 + end
  836 +
  837 + return true
  838 + end
  839 + -- 2=trader_id:召唤商人
  840 + doActiveEffect[2] = function(_, traderId)
  841 + for _, target in ipairs(targers) do
  842 + if target.isOpen and not target:getEventType() then
  843 + target:updateEvent({
  844 + etype = AdvEventType.Trader,
  845 + id = traderId,
  846 + })
  847 + target:randomEvent()
  848 + self:backBlockChange(target.room.roomId, target.blockId)
  849 + end
  850 + end
  851 + return true
  852 + end
  853 +
  854 + -- 3=monster_id:替换怪物,仅使用方式为2时生效
  855 + doActiveEffect[3] = function(_, monsterId)
  856 + for _, target in ipairs(targers) do
  857 + if not target.lock and not target.isDead then
  858 + self.battle:removeEnemyById(target.id)
  859 + self:getCurMap():addNewMonsterRand(monsterId, {target.roomId, target.blockId})
  860 + self:backBlockChange(target.roomId, target.blockId)
  861 + end
  862 + end
  863 + return true
  864 + end
  865 + -- 4:显示本层
  866 + doActiveEffect[4] = function(_)
  867 + self:getCurMap():showMap()
  868 + self:backMapShow()
  869 + return true
  870 + end
  871 + -- 5:放逐目标
  872 + doActiveEffect[5] = function(_)
  873 + for _, target in ipairs(targers) do
  874 + if not target.lock and not target.isDead then
  875 + self.battle:removeEnemyById(target.id)
  876 + local block = self:getBlock(target.roomId, target.blockId)
  877 + block:clear()
  878 + self:backBlockChange(target.roomId, target.blockId)
  879 + end
  880 + end
  881 + return true
  882 + end
  883 + -- 6=陷阱id:移除陷阱,不填写id则移除所有陷阱
  884 + doActiveEffect[6] = function(_, trapId)
  885 + if not next(targers) and activeData.usetype == 4 then
  886 + -- 全屏
  887 + for _, room in pairs(self:getCurMap().rooms) do
  888 + for _, block in pairs(room.blocks) do
  889 + if block:getEventType() == AdvEventType.Trap then
  890 + block:updateEvent(nil)
  891 + self:backBlockChange(block.room.roomId, block.blockId)
  892 + end
  893 + end
  894 + end
  895 + else
  896 + for _ , target in ipairs(targers) do
  897 + if target:getEventType() == AdvEventType.Trap then
  898 + target:updateEvent(nil)
  899 + self:backBlockChange(target.room.roomId, target.blockId)
  900 + end
  901 + end
  902 + end
  903 + return true
  904 + end
  905 +
  906 + -- 7=道具燃烧效果
  907 + doActiveEffect[7] = function(_)
  908 + for _ , target in ipairs(targers) do
  909 + if target:getEventType() == AdvEventType.Drop then
  910 + target:updateEvent(nil)
  911 + self:backBlockChange(target.room.roomId, target.blockId)
  912 + end
  913 + end
  914 + return true
  915 + end
  916 +
  917 + -- 8:翻开范围内的方格
  918 + doActiveEffect[8] = function(_)
  919 + for _ , target in ipairs(targers) do
  920 + if not target.isOpen then
  921 + target:open()
  922 + self:backBlockChange(target.room.roomId, target.blockId)
  923 + end
  924 + end
  925 + return true
  926 + end
  927 +
  928 + for _, effect in ipairs(activeData.effect:toArray()) do
  929 + local cur = effect:toArray(true, "=")
  930 + if doActiveEffect[cur[1]] then
  931 + if not doActiveEffect[cur[1]](table.unpack(cur)) then
  932 + return
  933 + end
  934 + end
  935 + end
  936 +
  937 + return true
  938 +end
  939 +
776 940 --使用技能
777 941 function Adv:usePotion(potionId, potionLevel, target)
778 942 -- cost
779 943 local potionData = csvdb["adv_potionCsv"][potionId][potionLevel]
  944 +
780 945 local enemy = self.battle:getEnemy(target.roomId, target.blockId)
781 946 if not enemy then return end
782 947 --生效
... ... @@ -788,9 +953,7 @@ function Adv:usePotion(potionId, potionLevel, target)
788 953 else
789 954 return
790 955 end
791   - self:afterRound()
792   - self:saveDB()
793   - self.owner:checkTaskEnter("AdvUsePotion")
  956 +
794 957 return true
795 958 end
796 959  
... ... @@ -934,6 +1097,10 @@ function Adv:backLayer()
934 1097 self:pushBackEvent(AdvBackEventType.Layer, {})
935 1098 end
936 1099  
  1100 +function Adv:backMapShow()
  1101 + self:pushBackEvent(AdvBackEventType.MapShow, {})
  1102 +end
  1103 +
937 1104 function Adv:scoreChange(scoreType, pms)
938 1105 local cutTypes = {}
939 1106 local score = 0
... ...
src/adv/AdvBattle.lua
... ... @@ -161,6 +161,18 @@ function Battle:triggerPassive(condType, params, mapIdx)
161 161 end
162 162 end
163 163  
  164 +-- 只是从战斗中移除 从地图中移除 在外面操作
  165 +function Battle:removeEnemyById(id)
  166 + local mapIdx = self.adv:getCurMapIdx()
  167 + for i = #self.enemys[mapIdx], 1, -1 do
  168 + if self.enemys[mapIdx][i].id == id then
  169 + local enemy = table.remove(self.enemys[mapIdx], i)
  170 + enemy:clear()
  171 + break
  172 + end
  173 + end
  174 +end
  175 +
164 176 --回合
165 177 function Battle:afterRound()
166 178 local mapIdx = self.adv:getCurMapIdx()
... ...
src/adv/AdvBlock.lua
... ... @@ -36,8 +36,8 @@ function Block:clear()
36 36 self.event = nil
37 37 end
38 38  
39   ---事件有需要额外处理的部分
40   -function Block:open()
  39 +
  40 +function Block:randomEvent()
41 41 local room = self.room
42 42 local map = room.map
43 43 local adv = map.adv
... ... @@ -118,6 +118,16 @@ function Block:open()
118 118 randomFunc[self:getEventType()]()
119 119 end
120 120 end
  121 +end
  122 +
  123 +
  124 +--事件有需要额外处理的部分
  125 +function Block:open()
  126 + if self.isOpen then return end
  127 + local room = self.room
  128 + local map = room.map
  129 + local adv = map.adv
  130 + self:randomEvent()
121 131 adv.owner:checkTaskEnter("AdvOpenBlock")
122 132 self.isOpen = true
123 133 end
... ...
src/adv/AdvBuff.lua
... ... @@ -21,6 +21,11 @@ Buff.BATTLE_BUFF = 17 -- 切换为战斗中的buff
21 21 Buff.CHANGE_DROP = 18 -- 转换掉落
22 22 Buff.BATTLE_PASSIVE = 19 -- 切换为战斗中的被动技
23 23 Buff.EXP_ADD = 20 -- 增加exp(每回合)
  24 +Buff.DONT_DEFEND = 21 -- 不看守地板 -- 怪周围点半可点击
  25 +
  26 +Buff.EXP_UP = 24 -- 杀敌经验提高
  27 +Buff.DISABLE_BUFF = 25 -- 禁用固有技
  28 +Buff.ATTR_CHANGE_COND = 26 --属性变化(状态)有条件
24 29  
25 30 --角色一些属性的变化
26 31 local function commonAttr(_Buff, attrName)
... ... @@ -34,6 +39,28 @@ local function commonAttr(_Buff, attrName)
34 39 self.owner:reSetAttr(attrName)
35 40 end
36 41 end
  42 +local function commonAttCond(_Buff, attrName)
  43 + _Buff._init = function(self, data) --初始化变化值
  44 + local effectCount = 0
  45 + if self.buffData.effectValue4 == 0 then
  46 + effectCount = self.owner.battle.adv.owner:getProperty("advItems"):getv(ItemId.OldCoin, 0)
  47 + end
  48 + self._changeV = self.buffData.effectValue2 * effectCount / self.buffData.effectValue5
  49 + self.owner:reSetAttr(attrName)
  50 + end
  51 + _Buff._initDB = function(self, data)
  52 + self._changeV = data.cv
  53 + end
  54 + _Buff._effectValue = function(self)
  55 + return self.buffData.effectValue1, self._changeV
  56 + end
  57 + _Buff._endBuff = function(self, data)
  58 + self.owner:reSetAttr(attrName)
  59 + end
  60 + _Buff._getDB = function(self)
  61 + return {cv = self._changeV}
  62 + end
  63 +end
37 64  
38 65 local BuffFactory = {
39 66 [Buff.HP_CHANGE] = function(_Buff)
... ... @@ -108,6 +135,13 @@ local BuffFactory = {
108 135 local attrName = AttsEnumEx[_Buff.buffData.effectValue3]
109 136 commonAttr(_Buff, attrName)
110 137 end,
  138 +
  139 + [Buff.ATTR_CHANGE] = function(_Buff)
  140 + local attrName = AttsEnumEx[_Buff.buffData.effectValue3]
  141 + commonAttCond(_Buff, attrName)
  142 + end,
  143 +
  144 +
111 145 [Buff.BACK_HURT] = function(_Buff)
112 146 _Buff._effectValue = function(self)
113 147 return self.buffData.effectValue1, self.buffData.effectValue2, self.buffData.effectValue3
... ... @@ -122,7 +156,7 @@ local BuffFactory = {
122 156  
123 157 [Buff.INJURED_CHANGE] = function(_Buff)
124 158 _Buff._effectValue = function(self)
125   - return self.buffData.effectValue1, self.buffData.effectValue2
  159 + return self.buffData.effectValue1, self.buffData.effectValue2, self.buffData.effectValue3
126 160 end
127 161 end,
128 162  
... ... @@ -238,6 +272,18 @@ local BuffFactory = {
238 272 return self.buffData.effectValue1
239 273 end
240 274 end,
  275 +
  276 + [Buff.EXP_UP] = function(_Buff)
  277 + --cType 0 or nil 值 1 百分比
  278 + _Buff._effectValue = function(self)
  279 + return self.buffData.effectValue1, self.buffData.effectValue2
  280 + end
  281 + end,
  282 + [Buff.DISABLE_BUFF] = function(_Buff)
  283 + _Buff._effectValue = function(self)
  284 + return self.buffData.effectValue1
  285 + end
  286 + end,
241 287 }
242 288  
243 289 function Buff:ctor(owner, id)
... ... @@ -314,7 +360,7 @@ function Buff:afterRound()
314 360 end
315 361  
316 362 function Buff:decRound()
317   - if self.buffData.round == 0 then
  363 + if self.buffData.round <= 0 then
318 364 return
319 365 end
320 366 self.round = self.round - 1
... ...
src/adv/AdvMap.lua
... ... @@ -17,6 +17,7 @@ function Map:ctor(adv, mapIdx, mapInfo)
17 17  
18 18 self.mapIdx = mapIdx
19 19 self.mapId = mapInfo.mapId
  20 + self.isShow = mapInfo.isShow -- 是否全部展示 -- 客户端用
20 21 self.rooms = {}
21 22 self:loadRooms(mapInfo.rooms)
22 23 end
... ... @@ -36,6 +37,7 @@ end
36 37 function Map:getDB()
37 38 local map = {}
38 39 map.mapId = self.mapId
  40 + map.isShow = self.isShow
39 41 map.rooms = {}
40 42 for roomId, room in pairs(self.rooms) do
41 43 map.rooms[roomId] = room:getDB()
... ... @@ -43,6 +45,10 @@ function Map:getDB()
43 45 return map
44 46 end
45 47  
  48 +function Map:showMap()
  49 + self.isShow = true
  50 +end
  51 +
46 52 --结束本层的时候调用
47 53 function Map:checkOver()
48 54 local mapCsv = csvdb["mapCsv"][self.mapId]
... ... @@ -159,6 +165,29 @@ function Map:getAroundBlocks(room, block)
159 165 return blocks
160 166 end
161 167  
  168 +function Map:getBlocksBySize(roomId, blockId, size)
  169 + local blocks = {}
  170 + local room = self.rooms[roomId]
  171 + if not room then return end
  172 + local block = room.blocks[blockId]
  173 + if not block then return end
  174 +
  175 + local col, row = room:tranLtoG(block.col, block.row)
  176 +
  177 + size = math.floor(size / 2)
  178 + for c = col - size, col + size do
  179 + for r = row - size, row + size do
  180 + local rroom, rblock = self:getRBByPos(c, r)
  181 + if rroom then
  182 + table.insert(blocks, rblock)
  183 + end
  184 + end
  185 + end
  186 + return blocks
  187 +end
  188 +
  189 +
  190 +
162 191 -----------------------------随机地图-----------------------------
163 192  
164 193 createMap = function(self, mapId)
... ...
src/adv/AdvPassive.lua
... ... @@ -235,6 +235,10 @@ function Passive:canEffect(effType, effValue)
235 235 if self.owner.lock and effType ~= 3 then -- 锁定的只能触发翻开自己格子的固有技
236 236 return
237 237 end
  238 + --禁用被动技
  239 + if self.owner:getPassiveIdx(self) <= self.owner:getDisablePassiveCount() then
  240 + return
  241 + end
238 242 return true
239 243 end
240 244  
... ...
src/adv/AdvPlayer.lua
... ... @@ -58,7 +58,6 @@ function BaseObject:afterRound()
58 58 end
59 59 end
60 60  
61   -
62 61 function BaseObject:clearRound()
63 62 for i = #self.passives, 1, -1 do
64 63 if self.passives[i].isDel then
... ... @@ -102,6 +101,24 @@ function BaseObject:addPassive(params)
102 101 self.battle.adv:backPassive(self.id, skillId)
103 102 end
104 103  
  104 +function BaseObject:getPassiveIdx(passive)
  105 + for idx, passive_ in ipairs(self.passives) do
  106 + if passive_ == passive then
  107 + return idx
  108 + end
  109 + end
  110 +end
  111 +
  112 +function BaseObject:getDisablePassiveCount()
  113 + local count = 0
  114 + for _, buff in ipairs(self.buffs) do
  115 + if not buff.isDel and buff:getType() == Buff.DISABLE_BUFF then
  116 + count = count + buff:effect()
  117 + end
  118 + end
  119 + return count
  120 +end
  121 +
105 122 function BaseObject:addBuff(buffId, releaser)
106 123 local buffData = csvdb["adv_map_buffCsv"][buffId]
107 124 if not buffData then return end
... ... @@ -454,6 +471,10 @@ function Player:initData(data)
454 471 end
455 472  
456 473 function Player:addExp(value)
  474 + -- buff 经验加成
  475 + local up = self:getCommonBuffEffect(Buff.EXP_UP)
  476 + value = math.ceil((value + up[0]) * (1 + up[1]))
  477 +
457 478 if value <= 0 then return end
458 479 local newExp = self.exp + value
459 480 local level = self.level
... ...