Commit 1d05db4889d437b7e24446bd0390d15597419844

Authored by 熊润斐
2 parents 648d9726 d93ec42c

Merge branch 'develop' into bugfix

@@ -126,6 +126,7 @@ ItemId = { @@ -126,6 +126,7 @@ ItemId = {
126 HeroFC = {700, 701, 702, 703}, --通用角色碎片 126 HeroFC = {700, 701, 702, 703}, --通用角色碎片
127 AdvKey = 80, -- 冒险钥匙 127 AdvKey = 80, -- 冒险钥匙
128 BoxKey = 60, -- 拆解工具 128 BoxKey = 60, -- 拆解工具
  129 + AdvPower = 4701, -- 拾荒体力
129 } 130 }
130 131
131 TimeReset = { 132 TimeReset = {
@@ -322,4 +323,13 @@ DrawCardType = { @@ -322,4 +323,13 @@ DrawCardType = {
322 SpecifyDraw = 1, 323 SpecifyDraw = 1,
323 NormalDraw = 2, 324 NormalDraw = 2,
324 FriendDraw = 3 325 FriendDraw = 3
  326 +}
  327 +
  328 +-- 阵容系统类型
  329 +TeamSystemType = {
  330 + Hang = 1,
  331 + BonusBattle = 2,
  332 + Tower = 3,
  333 + Dinner = 4,
  334 + FriendBattle = 5,
325 } 335 }
326 \ No newline at end of file 336 \ No newline at end of file
src/ProtocolCode.lua
@@ -49,6 +49,7 @@ actionCodes = { @@ -49,6 +49,7 @@ actionCodes = {
49 Role_updateFeedbackInfoRpc = 133, 49 Role_updateFeedbackInfoRpc = 133,
50 Role_useSelectItemRpc = 134, -- 使用多选一礼包 50 Role_useSelectItemRpc = 134, -- 使用多选一礼包
51 Role_broadGetSSR = 135, -- 全服广播 获得ssr英雄 51 Role_broadGetSSR = 135, -- 全服广播 获得ssr英雄
  52 + Role_renameTeamRpc = 136, -- 编队改名
52 53
53 Adv_startAdvRpc = 151, 54 Adv_startAdvRpc = 151,
54 Adv_startHangRpc = 152, 55 Adv_startHangRpc = 152,
@@ -71,6 +72,8 @@ actionCodes = { @@ -71,6 +72,8 @@ actionCodes = {
71 Adv_rankRpc = 169, 72 Adv_rankRpc = 169,
72 Adv_quickHangRpc = 170, 73 Adv_quickHangRpc = 170,
73 Adv_refreshSupportRpc = 171, 74 Adv_refreshSupportRpc = 171,
  75 + Adv_selectTeamRpc = 172,
  76 + Adv_roleFormatRpc = 173,
74 77
75 Hero_loadInfos = 201, 78 Hero_loadInfos = 201,
76 Hero_updateProperty = 202, 79 Hero_updateProperty = 202,
@@ -96,6 +99,7 @@ actionCodes = { @@ -96,6 +99,7 @@ actionCodes = {
96 Hero_unlockPoolRpc = 222, 99 Hero_unlockPoolRpc = 222,
97 Hero_changeCrown = 223, 100 Hero_changeCrown = 223,
98 Hero_drawHeroExtraRewardNtf = 224, 101 Hero_drawHeroExtraRewardNtf = 224,
  102 + Hero_itemComposeRpc = 225,
99 103
100 Hang_startRpc = 251, 104 Hang_startRpc = 251,
101 Hang_checkRpc = 252, 105 Hang_checkRpc = 252,
@@ -111,6 +115,7 @@ actionCodes = { @@ -111,6 +115,7 @@ actionCodes = {
111 Hang_hangGiftRpc = 262, 115 Hang_hangGiftRpc = 262,
112 Hang_bagFieldRpc = 263, 116 Hang_bagFieldRpc = 263,
113 Hang_chatLineRpc = 264, 117 Hang_chatLineRpc = 264,
  118 + Hang_selectTeamRpc = 265,
114 119
115 Diner_updateProperty = 300, 120 Diner_updateProperty = 300,
116 Diner_addSellRpc = 301, 121 Diner_addSellRpc = 301,
@@ -212,6 +217,9 @@ actionCodes = { @@ -212,6 +217,9 @@ actionCodes = {
212 Activity_actPaySignRewardNtf = 654, 217 Activity_actPaySignRewardNtf = 654,
213 Activity_actCalendaTaskRpc = 655, 218 Activity_actCalendaTaskRpc = 655,
214 Activity_actPaySignRpc = 656, 219 Activity_actPaySignRpc = 656,
  220 +
  221 + Radio_startQuestRpc = 700,
  222 + Radio_finishQuestRpc = 701,
215 } 223 }
216 224
217 rpcResponseBegin = 10000 225 rpcResponseBegin = 10000
src/actions/AdvAction.lua
@@ -47,6 +47,10 @@ local function checkFormat(role, format, checkAdvTeam) @@ -47,6 +47,10 @@ local function checkFormat(role, format, checkAdvTeam)
47 end 47 end
48 end 48 end
49 49
  50 + if not format then
  51 + format = role:getProperty("advTeam")
  52 + end
  53 +
50 if checkAdvTeam then 54 if checkAdvTeam then
51 for _, heroId in pairs(role:getProperty("advTeam").heros or {}) do 55 for _, heroId in pairs(role:getProperty("advTeam").heros or {}) do
52 hadHero[heroId] = true 56 hadHero[heroId] = true
@@ -83,7 +87,7 @@ function _M.startAdvRpc( agent, data ) @@ -83,7 +87,7 @@ function _M.startAdvRpc( agent, data )
83 local msg = MsgPack.unpack(data) 87 local msg = MsgPack.unpack(data)
84 local chapterId = msg.chapterId --关卡id 88 local chapterId = msg.chapterId --关卡id
85 local layer = msg.layer or 1 --选择层数 89 local layer = msg.layer or 1 --选择层数
86 - local format = msg.format --编队 90 + --local format = msg.format --编队
87 local supportIdx = msg.supportIdx --选择的支援效果 91 local supportIdx = msg.supportIdx --选择的支援效果
88 if not role:isFuncUnlock(FuncUnlock.Adv) then return end 92 if not role:isFuncUnlock(FuncUnlock.Adv) then return end
89 93
@@ -127,18 +131,18 @@ function _M.startAdvRpc( agent, data ) @@ -127,18 +131,18 @@ function _M.startAdvRpc( agent, data )
127 end 131 end
128 end 132 end
129 133
130 - if not checkFormat(role, format) then return 7 end  
131 -  
132 - local advTeam = role:getProperty("advTeam")  
133 - table.clear(advTeam)  
134 -  
135 - advTeam.heros = {}  
136 - for slot, heroId in pairs(format.heros) do  
137 - advTeam.heros[slot] = heroId  
138 - end  
139 - advTeam.leader = format.leader  
140 - advTeam.leader2 = format.leader2  
141 - role:updateProperty({field = "advTeam", value = advTeam}) 134 + if not checkFormat(role) then return 7 end
  135 +
  136 + --local advTeam = role:getProperty("advTeam")
  137 + --table.clear(advTeam)
  138 +
  139 + --advTeam.heros = {}
  140 + --for slot, heroId in pairs(format.heros) do
  141 + -- advTeam.heros[slot] = heroId
  142 + --end
  143 + --advTeam.leader = format.leader
  144 + --advTeam.leader2 = format.leader2
  145 + --role:updateProperty({field = "advTeam", value = advTeam})
142 if AdvCommon.isEndless(chapterId) then 146 if AdvCommon.isEndless(chapterId) then
143 role.dailyData:updateProperty({field = "advElC", delta = 1}) 147 role.dailyData:updateProperty({field = "advElC", delta = 1})
144 else 148 else
@@ -243,13 +247,14 @@ function _M.startHangRpc(agent, data) @@ -243,13 +247,14 @@ function _M.startHangRpc(agent, data)
243 info.format.heros[slot] = heroId 247 info.format.heros[slot] = heroId
244 end 248 end
245 info.time = skynet.timex() + adv_idle_time --挂机时间 249 info.time = skynet.timex() + adv_idle_time --挂机时间
  250 + info.duration = adv_idle_time
246 info.campId = campId 251 info.campId = campId
247 info.index = index 252 info.index = index
248 253
249 -- 没有在战斗 用team来挂机了 把team清掉 254 -- 没有在战斗 用team来挂机了 把team清掉
250 - if not role:getAdvData():isRunning() then  
251 - role:updateProperty({field = "advTeam", value = {}})  
252 - end 255 + --if not role:getAdvData():isRunning() then
  256 + -- role:updateProperty({field = "advTeam", value = {}})
  257 + --end
253 role:pushMsg({type = "adv", slot = chapterId, time = adv_idle_time}) 258 role:pushMsg({type = "adv", slot = chapterId, time = adv_idle_time})
254 role:changeUpdates({{type = "advHang", field = chapterId, value = info}}) 259 role:changeUpdates({{type = "advHang", field = chapterId, value = info}})
255 260
@@ -261,6 +266,16 @@ function _M.startHangRpc(agent, data) @@ -261,6 +266,16 @@ function _M.startHangRpc(agent, data)
261 return true 266 return true
262 end 267 end
263 268
  269 +local function addHeroFaith(role, heroId, exp)
  270 + local hero = role.heros[heroId]
  271 + if not hero then
  272 + return
  273 + end
  274 +
  275 + hero:addHeroFaith(exp)
  276 + return hero:getProperty("faith")
  277 +end
  278 +
264 function _M.quickHangRpc(agent, data) 279 function _M.quickHangRpc(agent, data)
265 local role = agent.role 280 local role = agent.role
266 local msg = MsgPack.unpack(data) 281 local msg = MsgPack.unpack(data)
@@ -328,7 +343,7 @@ function _M.endHangRpc(agent, data) @@ -328,7 +343,7 @@ function _M.endHangRpc(agent, data)
328 end 343 end
329 adv_idle_time = adv_idle_time * 60 344 adv_idle_time = adv_idle_time * 60
330 345
331 - local reward, isFull, change 346 + local reward, isFull, change, heroFaithMap
332 if skynet.timex() >= info.time then 347 if skynet.timex() >= info.time then
333 -- 最新需求加成取消 348 -- 最新需求加成取消
334 --[[ 349 --[[
@@ -357,6 +372,14 @@ function _M.endHangRpc(agent, data) @@ -357,6 +372,14 @@ function _M.endHangRpc(agent, data)
357 372
358 if not maxCampsite then return end 373 if not maxCampsite then return end
359 ]] 374 ]]
  375 + -- 增加英雄信赖
  376 + local exp = info.duration / 60
  377 + heroFaithMap = {}
  378 + for _, heroId in pairs(info.format.heros) do
  379 + local curFaith = addHeroFaith(role, heroId, exp)
  380 + heroFaithMap[heroId] = curFaith
  381 + end
  382 +
360 local totalReward = campSiteData.idleReward_1 .. " " .. campSiteData.idleReward_2 383 local totalReward = campSiteData.idleReward_1 .. " " .. campSiteData.idleReward_2
361 384
362 local idleReward = totalReward:toNumMap() 385 local idleReward = totalReward:toNumMap()
@@ -384,7 +407,7 @@ function _M.endHangRpc(agent, data) @@ -384,7 +407,7 @@ function _M.endHangRpc(agent, data)
384 407
385 role:checkTaskEnter("AdvHang", {}) 408 role:checkTaskEnter("AdvHang", {})
386 409
387 - SendPacket(actionCodes.Adv_endHangRpc, MsgPack.pack({reward = reward, change = change, isFull = isFull})) 410 + SendPacket(actionCodes.Adv_endHangRpc, MsgPack.pack({reward = reward, change = change, isFull = isFull, heroFaith = heroFaithMap}))
388 return true 411 return true
389 end 412 end
390 413
@@ -504,25 +527,8 @@ function _M.useItemRpc(agent, data) @@ -504,25 +527,8 @@ function _M.useItemRpc(agent, data)
504 adv:cost({[itemId] = count}, {log = {desc = "useItem", int1 = itemId, int2 = count}}) 527 adv:cost({[itemId] = count}, {log = {desc = "useItem", int1 = itemId, int2 = count}})
505 adv:backUse({[itemId] = count}) 528 adv:backUse({[itemId] = count})
506 end 529 end
507 -  
508 - if itemId == 5020 then  
509 - role:finishGuide(53)  
510 - end  
511 - adv:checkAchievement(adv.AchievType.UseItem, count, itemId)  
512 - adv:mylog({desc = "useItem", int1 = itemId, int2 = count})  
513 -  
514 - role:log("mission_pick_use", {  
515 - mission_threadid = adv.chapterId, -- 大地图ID  
516 - mission_threadname = (csvdb["adv_chapterCsv"][adv.chapterId] or {})["chapter"] or "auto", -- 大地图名称  
517 - mission_id = adv.level, -- 关卡ID  
518 - item_id = itemId, -- 道具ID  
519 - mission_pick_use_num = count, -- 道具使用量  
520 - mission_sequenceid = adv.logid, -- 本次拾荒ID,用于关联一次拾荒产生多条不同类型的日志  
521 - })  
522 -  
523 - for i = 1, count do  
524 - adv:doActive(itemData.effect, target) -- target  
525 - end 530 +
  531 + adv:useItem(itemId, count, target)
526 532
527 adv:afterRound() 533 adv:afterRound()
528 adv:saveDB() 534 adv:saveDB()
@@ -950,4 +956,61 @@ function _M.refreshSupportRpc(agent, data) @@ -950,4 +956,61 @@ function _M.refreshSupportRpc(agent, data)
950 return true 956 return true
951 end 957 end
952 958
  959 +function _M.roleFormatRpc(agent , data)
  960 + local role = agent.role
  961 + local msg = MsgPack.unpack(data)
  962 + local index = msg.index -- 阵容索引
  963 + local title = msg.title -- 阵容名称
  964 + local team = {}
  965 + for slot, heroId in pairs(msg.heros) do
  966 + if not role.heros[heroId] then
  967 + return 1
  968 + end
  969 + end
  970 +
  971 + if index > 10 then
  972 + return 2
  973 + end
  974 +
  975 + team.heros = {}
  976 + for slot, heroId in pairs(msg.heros) do
  977 + team.heros[slot] = heroId
  978 + end
  979 + team.leader = msg.leader
  980 + team.leader2 = msg.leader2
  981 + team.title = title
  982 + role:setAdvTeamFormat(index, team)
  983 +
  984 + local advTeam = role:getProperty("advTeam")
  985 + local curIndex = advTeam.index
  986 + if curIndex == index then
  987 + table.clear(advTeam)
  988 +
  989 + advTeam.heros = {}
  990 + for slot, heroId in pairs(msg.heros) do
  991 + advTeam.heros[slot] = heroId
  992 + end
  993 + advTeam.leader = msg.leader
  994 + advTeam.leader2 = msg.leader2
  995 + advTeam.index = index
  996 + role:updateProperty({field = "advTeam", value = advTeam})
  997 + end
  998 +
  999 + SendPacket(actionCodes.Adv_roleFormatRpc, '')
  1000 + return true
  1001 +end
  1002 +
  1003 +function _M.selectTeamRpc(agent, data)
  1004 + local role = agent.role
  1005 + local msg = MsgPack.unpack(data)
  1006 + local index = msg.index -- 阵容索引
  1007 + local team = role:getAdvTeamFormat(index)
  1008 + if not next(team) then return end
  1009 + team["index"] = index
  1010 + role:updateProperty({field = "advTeam", value = team})
  1011 +
  1012 + SendPacket(actionCodes.Adv_selectTeamRpc, '')
  1013 + return true
  1014 +end
  1015 +
953 return _M 1016 return _M
954 \ No newline at end of file 1017 \ No newline at end of file
src/actions/DinerAction.lua
@@ -609,10 +609,10 @@ function _M.refreshTaskRpc( agent, data ) @@ -609,10 +609,10 @@ function _M.refreshTaskRpc( agent, data )
609 local role = agent.role 609 local role = agent.role
610 local msg = MsgPack.unpack(data) 610 local msg = MsgPack.unpack(data)
611 611
612 - local cost = {[ItemId.Diamond] = 40}  
613 - if not role:checkItemEnough(cost) then  
614 - return 1  
615 - end 612 + --local cost = {[ItemId.Diamond] = 40}
  613 + --if not role:checkItemEnough(cost) then
  614 + -- return 1
  615 + --end
616 616
617 local orders = json.decode(role.dinerData:getProperty("order")) 617 local orders = json.decode(role.dinerData:getProperty("order"))
618 618
src/actions/GmAction.lua
@@ -402,24 +402,23 @@ function _M.advl(role, pms) @@ -402,24 +402,23 @@ function _M.advl(role, pms)
402 return "成功" 402 return "成功"
403 end 403 end
404 404
405 -table.insert(helpDes, {"冒险内等级增加", "advcl", "经验值"})  
406 -function _M.advcl(role, pms)  
407 - local exp = tonum(pms.pm1)  
408 - local advData = role:getAdvData() 405 +-- table.insert(helpDes, {"冒险内等级增加", "advcl", "经验值"})
  406 +-- function _M.advcl(role, pms)
  407 +-- local exp = tonum(pms.pm1)
  408 +-- local advData = role:getAdvData()
409 409
410 - if not advData.chapterId then  
411 - return "先随便开启一关"  
412 - end  
413 - advData.battle.player:addExp(exp)  
414 - advData:saveDB()  
415 - role:mylog("gm_action", {desc = "advcl", int1 = exp, key1 = pms.sender}) 410 +-- if not advData.chapterId then
  411 +-- return "先随便开启一关"
  412 +-- end
  413 +-- advData.battle.player:addExp(exp)
  414 +-- advData:saveDB()
  415 +-- role:mylog("gm_action", {desc = "advcl", int1 = exp, key1 = pms.sender})
416 416
417 - return "成功"  
418 -end 417 +-- return "成功"
  418 +-- end
419 419
420 table.insert(helpDes, {"挂机清除" , "idlec"}) 420 table.insert(helpDes, {"挂机清除" , "idlec"})
421 function _M.idlec(role, pms) 421 function _M.idlec(role, pms)
422 - role:updateProperty({field = "hangTeam", value = {}})  
423 role:updateProperty({field = "hangInfo", value = {}}) 422 role:updateProperty({field = "hangInfo", value = {}})
424 role:updateProperty({field = "hangBag", value = {}}) 423 role:updateProperty({field = "hangBag", value = {}})
425 role:mylog("gm_action", {desc = "idlec", key1 = pms.sender}) 424 role:mylog("gm_action", {desc = "idlec", key1 = pms.sender})
src/actions/HangAction.lua
@@ -269,7 +269,15 @@ function _M.endBattleRpc(agent, data) @@ -269,7 +269,15 @@ function _M.endBattleRpc(agent, data)
269 local nextCarbonId = role:getNextCarbonId(carbonId) 269 local nextCarbonId = role:getNextCarbonId(carbonId)
270 -- 设置挂机关卡 270 -- 设置挂机关卡
271 if isWin then --and (hangInfo.carbonId or 0) < nextCarbonId then 271 if isWin then --and (hangInfo.carbonId or 0) < nextCarbonId then
272 - hangInfo.expCarbonId = carbonId 272 + if not hangInfo.expCarbonId then
  273 + hangInfo.expCarbonId = carbonId
  274 + else
  275 + local oldCarbonData = csvdb["idle_battleCsv"][hangInfo.expCarbonId]
  276 + local newCarbonData = csvdb["idle_battleCsv"][carbonId]
  277 + if oldCarbonData.money < newCarbonData.money then
  278 + hangInfo.expCarbonId = carbonId
  279 + end
  280 + end
273 --local cfg = csvdb["idle_battleCsv"][nextCarbonId] 281 --local cfg = csvdb["idle_battleCsv"][nextCarbonId]
274 --if cfg then 282 --if cfg then
275 -- hangInfo.bossTime = skynet.timex() + cfg.idle_time 283 -- hangInfo.bossTime = skynet.timex() + cfg.idle_time
@@ -305,7 +313,10 @@ end @@ -305,7 +313,10 @@ end
305 function _M.roleFormatRpc(agent , data) 313 function _M.roleFormatRpc(agent , data)
306 local role = agent.role 314 local role = agent.role
307 local msg = MsgPack.unpack(data) 315 local msg = MsgPack.unpack(data)
308 - local hangTeam = role:getProperty("hangTeam") 316 + local index = msg.index -- 阵容索引
  317 + local title = msg.title -- 阵容名称
  318 + local tactics = msg.tactics -- 战术
  319 + local team = {}
309 for slot, heroId in pairs(msg.heros) do 320 for slot, heroId in pairs(msg.heros) do
310 if not role.heros[heroId] then 321 if not role.heros[heroId] then
311 return 1 322 return 1
@@ -321,15 +332,27 @@ function _M.roleFormatRpc(agent , data) @@ -321,15 +332,27 @@ function _M.roleFormatRpc(agent , data)
321 end 332 end
322 if not checkLeader(msg.heros, msg.leader) then return 4 end 333 if not checkLeader(msg.heros, msg.leader) then return 4 end
323 334
324 - table.clear(hangTeam)  
325 - hangTeam.heros = {} 335 + if index > 10 then
  336 + return 5
  337 + end
  338 +
  339 + if #title > 100 then
  340 + return 6
  341 + end
  342 +
  343 + team.heros = {}
326 for slot, heroId in pairs(msg.heros) do 344 for slot, heroId in pairs(msg.heros) do
327 - hangTeam.heros[slot] = heroId 345 + team.heros[slot] = heroId
328 end 346 end
329 - hangTeam.leader = msg.leader  
330 - hangTeam.supports = supports  
331 - role:saveHangTeam(hangTeam)  
332 - role:finishGuide(5) 347 + team.leader = msg.leader
  348 + team.supports = supports
  349 + team.title = title
  350 + if msg.tactics and globalCsv.tactics_skill_passive_cell[msg.tactics] then
  351 + team.tactics = msg.tactics
  352 + end
  353 +
  354 + role:setTeamFormat(index, team)
  355 +
333 SendPacket(actionCodes.Hang_roleFormatRpc, '') 356 SendPacket(actionCodes.Hang_roleFormatRpc, '')
334 return true 357 return true
335 end 358 end
@@ -440,36 +463,6 @@ function _M.quickRpc(agent , data) @@ -440,36 +463,6 @@ function _M.quickRpc(agent , data)
440 return true 463 return true
441 end 464 end
442 465
443 -function _M.bonusFormatRpc(agent , data)  
444 - local role = agent.role  
445 - local msg = MsgPack.unpack(data)  
446 - local bTeam = role:getProperty("bTeam")  
447 - for slot, heroId in pairs(msg.heros) do  
448 - if not role.heros[heroId] then  
449 - return  
450 - end  
451 - end  
452 - local supports = {}  
453 - for slot, support in pairs(msg.supports) do  
454 - if slot ~= 1 and slot ~= 2 then return end  
455 - local level = role.dinerData:getProperty("dishTree"):getv(support, 0)  
456 - if level <= 0 then return end  
457 - supports[slot] = support  
458 - end  
459 - if not checkLeader(msg.heros, msg.leader) then return end  
460 -  
461 - table.clear(bTeam)  
462 - bTeam.heros = {}  
463 - for slot, heroId in pairs(msg.heros) do  
464 - bTeam.heros[slot] = heroId  
465 - end  
466 - bTeam.leader = msg.leader  
467 - bTeam.supports = supports  
468 -  
469 - role:updateProperty({field = "bTeam", value = bTeam})  
470 - SendPacket(actionCodes.Hang_bonusFormatRpc, '')  
471 - return true  
472 -end  
473 466
474 function _M.buyBonusCountRpc(agent, data) 467 function _M.buyBonusCountRpc(agent, data)
475 local role = agent.role 468 local role = agent.role
@@ -505,10 +498,53 @@ function _M.buyBonusCountRpc(agent, data) @@ -505,10 +498,53 @@ function _M.buyBonusCountRpc(agent, data)
505 return true 498 return true
506 end 499 end
507 500
  501 +local function bonusWinReward(role, bonusData, bwin, count)
  502 + count = count or 1
  503 + local open, actId = role.activity:isOpen("BonusDouble")
  504 + local actData = csvdb["activity_ctrlCsv"][actId]
  505 + local extraCnt = role.storeData:getBonusExtraFightCount()
  506 +
  507 + local coef = 1
  508 + if open and actData then
  509 + coef = tonumber(actData.condition2)
  510 + end
  511 + local bonusC = role.dailyData:getProperty("bonusC")
  512 + bonusC[bonusData.type] = bonusC[bonusData.type] or {c = 0, b = 0}
  513 + if globalCsv.bonus_daily_count * coef + extraCnt - bonusC[bonusData.type]["c"] < count then return false, 1 end
  514 + bonusC[bonusData.type]["c"] = bonusC[bonusData.type]["c"] + count
  515 + role.dailyData:updateProperty({field = "bonusC", value = bonusC})
  516 +
  517 + local reward, change
  518 + reward = bonusData.reward:toNumMap()
  519 + for itemId, c in pairs(reward) do
  520 + reward[itemId] = c * count
  521 + end
  522 + for i = 1, count do
  523 + local chance = bonusData.chance:randWeight(true)
  524 + if chance[1] ~= 0 then
  525 + reward[chance[1]] = (reward[chance[1]] or 0) + chance[2]
  526 + end
  527 + end
  528 +
  529 + for k, v in pairs(reward) do
  530 + reward[k] = v * (coef > 1 and actData.condition or 1)
  531 + end
  532 +
  533 + if bwin then -- 满星 额外奖励
  534 + for k, v in pairs(bonusData.perfect_reward:toNumMap()) do
  535 + reward[k] = (reward[k] or 0) + v
  536 + end
  537 + end
  538 + reward, change = role:award(reward, {log = {desc = "bonusBattle", int1 = id}})
  539 + role:checkTaskEnter("BonusPass", {id = id, count = count})
  540 + return true, reward, change
  541 +end
  542 +
508 function _M.startBonusBattleRpc(agent, data) 543 function _M.startBonusBattleRpc(agent, data)
509 local role = agent.role 544 local role = agent.role
510 local msg = MsgPack.unpack(data) 545 local msg = MsgPack.unpack(data)
511 local id = msg.id 546 local id = msg.id
  547 + local count = msg.count or 1
512 548
513 local open, actId = role.activity:isOpen("BonusDouble") 549 local open, actId = role.activity:isOpen("BonusDouble")
514 550
@@ -523,8 +559,6 @@ function _M.startBonusBattleRpc(agent, data) @@ -523,8 +559,6 @@ function _M.startBonusBattleRpc(agent, data)
523 if not bonusData then return 3 end 559 if not bonusData then return 3 end
524 if not role:checkHangPass(bonusData.unlock) then return 4 end 560 if not role:checkHangPass(bonusData.unlock) then return 4 end
525 561
526 - if not next(role:getProperty("bTeam")) then return 5 end  
527 -  
528 local bonusC = role.dailyData:getProperty("bonusC") 562 local bonusC = role.dailyData:getProperty("bonusC")
529 bonusC[bonusData.type] = bonusC[bonusData.type] or {c = 0, b = 0} 563 bonusC[bonusData.type] = bonusC[bonusData.type] or {c = 0, b = 0}
530 564
@@ -535,15 +569,24 @@ function _M.startBonusBattleRpc(agent, data) @@ -535,15 +569,24 @@ function _M.startBonusBattleRpc(agent, data)
535 if open and actData then 569 if open and actData then
536 coef = tonumber(actData.condition2) 570 coef = tonumber(actData.condition2)
537 end 571 end
  572 +
  573 + if math.illegalNum(count, 1, globalCsv.bonus_daily_count * coef + extraCnt - bonusC[bonusData.type]["c"]) then return 7 end
538 574
539 - if globalCsv.bonus_daily_count * coef + extraCnt - bonusC[bonusData.type]["c"] <= 0 then return 7 end  
540 - 575 + local bonusStar = role:getProperty("bonusStar")
  576 + if bonusStar[id] and bonusStar[id] >= (1 << #bonusData.sweep_condition:toTableArray(true)) - 1 then
  577 + local status, reward, change = bonusWinReward(role, bonusData, nil, count)
  578 + if not status then return 10 * (reward or 0) end
  579 + SendPacket(actionCodes.Hang_startBonusBattleRpc, MsgPack.pack({reward = reward, change = change}))
  580 + else
  581 + local bTeam = role:getTeamFormatByType(TeamSystemType.BonusBattle)
  582 + if not next(bTeam) then return 5 end
  583 + role.__bonusBattleCache = {
  584 + key = tostring(math.random()),
  585 + id = id,
  586 + }
  587 + SendPacket(actionCodes.Hang_startBonusBattleRpc, MsgPack.pack({key = role.__bonusBattleCache.key}))
  588 + end
541 589
542 - role.__bonusBattleCache = {  
543 - key = tostring(math.random()),  
544 - id = id,  
545 - }  
546 - SendPacket(actionCodes.Hang_startBonusBattleRpc, MsgPack.pack({key = role.__bonusBattleCache.key}))  
547 return true 590 return true
548 end 591 end
549 592
@@ -554,14 +597,7 @@ function _M.endBonusBattleRpc(agent, data) @@ -554,14 +597,7 @@ function _M.endBonusBattleRpc(agent, data)
554 local key = msg.key 597 local key = msg.key
555 local starNum = msg.starNum 598 local starNum = msg.starNum
556 if not role.__bonusBattleCache then return 1 end 599 if not role.__bonusBattleCache then return 1 end
557 - local open, actId = role.activity:isOpen("BonusDouble")  
558 - local actData = csvdb["activity_ctrlCsv"][actId]  
559 - local extraCnt = role.storeData:getBonusExtraFightCount()  
560 -  
561 - local coef = 1  
562 - if open and actData then  
563 - coef = tonumber(actData.condition2)  
564 - end 600 +
565 601
566 if role.__bonusBattleCache.id ~= id or role.__bonusBattleCache.key ~= key then 602 if role.__bonusBattleCache.id ~= id or role.__bonusBattleCache.key ~= key then
567 SendPacket(actionCodes.Hang_endBonusBattleRpc, MsgPack.pack({errorCode = 1})) 603 SendPacket(actionCodes.Hang_endBonusBattleRpc, MsgPack.pack({errorCode = 1}))
@@ -570,24 +606,79 @@ function _M.endBonusBattleRpc(agent, data) @@ -570,24 +606,79 @@ function _M.endBonusBattleRpc(agent, data)
570 local bonusData = csvdb["bonus_battleCsv"][id] 606 local bonusData = csvdb["bonus_battleCsv"][id]
571 607
572 local reward, change 608 local reward, change
  609 +
  610 + local bonusStar = role:getProperty("bonusStar")
  611 + local curStar = 0
573 if starNum and starNum > 0 then 612 if starNum and starNum > 0 then
574 -- 胜利扣除次数 613 -- 胜利扣除次数
575 - local bonusC = role.dailyData:getProperty("bonusC")  
576 - bonusC[bonusData.type] = bonusC[bonusData.type] or {c = 0, b = 0}  
577 - if globalCsv.bonus_daily_count * coef + extraCnt - bonusC[bonusData.type]["c"] <= 0 then return 3 end  
578 - bonusC[bonusData.type]["c"] = bonusC[bonusData.type]["c"] + 1  
579 - role.dailyData:updateProperty({field = "bonusC", value = bonusC})  
580 -  
581 - reward = bonusData.reward:toNumMap()  
582 - local chance = bonusData.chance:randWeight(true)  
583 - if chance[1] ~= 0 then  
584 - reward[chance[1]] = (reward[chance[1]] or 0) + chance[2] 614 +
  615 + local bTeam = role:getTeamFormatByType(TeamSystemType.BonusBattle)
  616 + local herosInfo = role:getTeamHerosInfo(bTeam.heros)
  617 +
  618 + local check = {}
  619 + -- 1 通关
  620 + check[1] = function(_)
  621 + return true
585 end 622 end
586 - for k, v in pairs(reward) do  
587 - reward[k] = v * (coef > 1 and actData.condition or 1) 623 + -- 2 阵亡人数 <= N
  624 + check[2] = function(_, cond)
  625 + return msg.info.dead and msg.info.dead <= cond
588 end 626 end
589 - reward, change = role:award(reward, {log = {desc = "bonusBattle", int1 = id}})  
590 - role:checkTaskEnter("BonusPass", {id = id}) 627 + -- 3 全员存活
  628 + check[3] = function(_)
  629 + return msg.info.dead and msg.info.dead == 0
  630 + end
  631 + -- 4 指定种族 >= N
  632 + check[4] = function(_, cond)
  633 + local count = 0
  634 + for _, one in pairs(herosInfo) do
  635 + local heroData = csv["unitCsv"][one.type]
  636 + if heroData.camp == cond then
  637 + count = count + 1
  638 + end
  639 + end
  640 + return count >= cond
  641 + end
  642 + -- 5 指定职业 >= N
  643 + check[5] = function(_, cond)
  644 + local count = 0
  645 + for _, one in pairs(herosInfo) do
  646 + local heroData = csv["unitCsv"][one.type]
  647 + if heroData.job == cond then
  648 + count = count + 1
  649 + end
  650 + end
  651 + return count >= cond
  652 + end
  653 + -- 6 含有指定角色
  654 + check[6] = function(_, cond)
  655 + for _, one in pairs(herosInfo) do
  656 + if one.type == cond then
  657 + return true
  658 + end
  659 + end
  660 + return false
  661 + end
  662 + -- 7 通关耗时 <= X 秒 msg.info.atime
  663 + check[7] = function(_, cond)
  664 + return msg.info.atime and msg.info.atime <= cond
  665 + end
  666 + curStar = 0
  667 + local sweepConds = bonusData.sweep_condition:toTableArray(true)
  668 + for i, cond in ipairs(sweepConds) do
  669 + if check[cond[1]] and check[cond[1]](table.unpack(cond)) then
  670 + curStar = curStar + (1 << (i - 1))
  671 + end
  672 + end
  673 + local status
  674 + status, reward, change = bonusWinReward(role, bonusData, curStar >= (1 << #sweepConds) - 1)
  675 + if not status then return 10 + (reward or 0) end
  676 + else
  677 + curStar = 0
  678 + end
  679 + if curStar ~= bonusStar[id] then
  680 + bonusStar[id] = curStar
  681 + role:updateProperty({field = "bonusStar", value = bonusStar})
591 end 682 end
592 683
593 role:checkBattle("bonus", { 684 role:checkBattle("bonus", {
@@ -666,4 +757,29 @@ function _M.chatLineRpc(agent, data) @@ -666,4 +757,29 @@ function _M.chatLineRpc(agent, data)
666 return true 757 return true
667 end 758 end
668 759
669 -return _M  
670 \ No newline at end of file 760 \ No newline at end of file
  761 +function _M.selectTeamRpc(agent, data)
  762 + local role = agent.role
  763 + local msg = MsgPack.unpack(data)
  764 + local index = msg.index -- 阵容索引
  765 + local type = msg.type -- 系统类型
  766 +
  767 + if index > 10 then
  768 + return 1
  769 + end
  770 + local team = role:getTeamFormat(index)
  771 + if not next(team) then return 2 end
  772 +
  773 + local teamIndex = role:getProperty("teamIndex") or {}
  774 + teamIndex[type] = index
  775 + role:updateProperty({field = "teamIndex", value = teamIndex})
  776 +
  777 + if type == TeamSystemType.Hang then
  778 + role:finishGuide(5)
  779 + role:updateHangTeamInfo()
  780 + end
  781 +
  782 + SendPacket(actionCodes.Hang_selectTeamRpc, '')
  783 + return true
  784 +end
  785 +
  786 +return _M
src/actions/HeroAction.lua
@@ -143,74 +143,45 @@ function _M.talentRpc(agent, data) @@ -143,74 +143,45 @@ function _M.talentRpc(agent, data)
143 local hero = role.heros[msg.id] 143 local hero = role.heros[msg.id]
144 if not hero then return 1 end 144 if not hero then return 1 end
145 145
146 - local index = msg.index -- 第几个天赋  
147 - local need = {[0] = 1, [1] = 1, [2] = 1, [3] = 1, [4] = 1}  
148 - if not need[index] then return 2 end  
149 -  
150 local talent = hero:getProperty("talent") 146 local talent = hero:getProperty("talent")
  147 + local heroCfgId = hero:getProperty("type")
151 local curStage = talent:getv(0, 1) 148 local curStage = talent:getv(0, 1)
152 - local curData = csvdb["unit_talentCsv"][curStage]  
153 - if not curData then return 4 end 149 + local curLevel = talent:getv(1, 1)
  150 + local curData = csvdb["unit_talent_"..heroCfgId.."Csv"][curStage]
  151 + if not curData then return 1 end
154 local oldSkillLv = hero:getSkillLevel(1) 152 local oldSkillLv = hero:getSkillLevel(1)
155 153
156 154
157 local cost = {} 155 local cost = {}
158 - if index == 0 then  
159 - --是否进阶  
160 - local max = true  
161 - for i = 1, 4 do  
162 - if talent:getv(i, 0) < #curData then  
163 - max = false  
164 - break  
165 - end  
166 - end  
167 - if max then  
168 - talent = talent:setv(0, curStage + 1)  
169 - for i = 1, 4 do  
170 - talent = talent:setv(i, 0)  
171 - end  
172 - else  
173 - return 12  
174 - end 156 + if curLevel == #curData then
  157 + talent = talent:setv(0, curStage + 1)
  158 + talent = talent:setv(1, 1)
175 else 159 else
176 -  
177 - local level = talent:getv(index, 0)  
178 - if level >= #curData then return 5 end 160 + if curLevel > #curData then return 2 end
179 161
180 - local talentData = curData[level]  
181 - if not talentData then return end 162 + local talentData = curData[curLevel]
  163 + if not talentData then return 3 end
182 164
183 - if talentData.lvRequire > hero:getProperty("level") then return 6 end 165 + if talentData.lvRequire > hero:getProperty("level") then return 4 end
184 166
185 cost = talentData.money:toNumMap() 167 cost = talentData.money:toNumMap()
186 - local cost2 = talentData.cost:toNumMap()  
187 - for k,v in pairs(cost2) do  
188 - cost[globalCsv.unit_talent_cost[csvdb["unitCsv"][hero:getProperty("type")].camp][k]] = v  
189 - end  
190 - if not role:checkItemEnough(cost) then return 6 end 168 + if not role:checkItemEnough(cost) then return 5 end
191 role:costItems(cost, {log = {desc = "heroTalent", int1 = msg.id, int2 = hero:getProperty("type")}}) 169 role:costItems(cost, {log = {desc = "heroTalent", int1 = msg.id, int2 = hero:getProperty("type")}})
192 - talent = talent:incrv(index, 1)  
193 -  
194 -  
195 - local aheadLevel = 0  
196 - for i = 1, talent:getv(0, 1) - 1 do  
197 - aheadLevel = aheadLevel + #csvdb["unit_talentCsv"][i]  
198 - end  
199 - aheadLevel = aheadLevel + talent:getv(index, 0)  
200 -  
201 - role:checkTaskEnter("HeroTalent", {heroType = hero:getProperty("type"), alv = aheadLevel}) 170 + talent = talent:setv(1, curLevel + 1)
202 end 171 end
  172 + curStage = talent:getv(0, 1)
  173 + role:checkTaskEnter("HeroTalent", {heroType = hero:getProperty("type"), alv = curStage})
203 174
204 hero:updateProperty({field = "talent", value = talent}) 175 hero:updateProperty({field = "talent", value = talent})
205 176
206 role:log("hero_talent", { 177 role:log("hero_talent", {
207 hero_id = hero:getProperty("type"), --英雄ID 178 hero_id = hero:getProperty("type"), --英雄ID
208 - hero_talent_id = index, --天赋ID 179 + hero_talent_id = curStage, --天赋ID
209 hero_talent_cost = cost, -- 英雄天赋升级消耗,json格式记录,{道具ID1:消耗数量1,道具ID2:消耗数量2,………...} 180 hero_talent_cost = cost, -- 英雄天赋升级消耗,json格式记录,{道具ID1:消耗数量1,道具ID2:消耗数量2,………...}
210 hero_talent_levelbef = oldSkillLv, -- 英雄技能升级前等级 181 hero_talent_levelbef = oldSkillLv, -- 英雄技能升级前等级
211 hero_talent_level = hero:getSkillLevel(1), -- 英雄技能升级后等级 182 hero_talent_level = hero:getSkillLevel(1), -- 英雄技能升级后等级
212 }) 183 })
213 - hero:mylog({desc = "talent", int1 = index, int2 = talent:getv(index, 0)}) 184 + hero:mylog({desc = "talent", int1 = talent:getv(0, 1), int2 = talent:getv(1, 1)})
214 185
215 SendPacket(actionCodes.Hero_talentRpc, '') 186 SendPacket(actionCodes.Hero_talentRpc, '')
216 return true 187 return true
@@ -633,6 +604,7 @@ end @@ -633,6 +604,7 @@ end
633 function _M.getResetRewardRpc(agent, data) 604 function _M.getResetRewardRpc(agent, data)
634 local role = agent.role 605 local role = agent.role
635 local msg = MsgPack.unpack(data) 606 local msg = MsgPack.unpack(data)
  607 + local pay = msg.pay
636 608
637 local hero = role.heros[msg.id] 609 local hero = role.heros[msg.id]
638 if not hero then return end 610 if not hero then return end
@@ -640,9 +612,19 @@ function _M.getResetRewardRpc(agent, data) @@ -640,9 +612,19 @@ function _M.getResetRewardRpc(agent, data)
640 local level = hero:getProperty("level") 612 local level = hero:getProperty("level")
641 local breakL = hero:getProperty("breakL") 613 local breakL = hero:getProperty("breakL")
642 local talent = hero:getProperty("talent") 614 local talent = hero:getProperty("talent")
  615 + local heroCfgId = hero:getProperty("type")
643 616
  617 + local tmpLevel = level
644 if level <= 1 and talent == "" then return end 618 if level <= 1 and talent == "" then return end
645 619
  620 + if level <= 60 then
  621 + pay = false
  622 + end
  623 +
  624 + if pay and not role:costDiamond({count = globalCsv.unit_heroBack_cost or 200, log = {desc = "resetHero", int1 = msg.id}}) then
  625 + return 1
  626 + end
  627 +
646 local reward = {} 628 local reward = {}
647 while level > 1 do 629 while level > 1 do
648 local curData = csvdb["unit_expCsv"][level - 1] 630 local curData = csvdb["unit_expCsv"][level - 1]
@@ -659,32 +641,18 @@ function _M.getResetRewardRpc(agent, data) @@ -659,32 +641,18 @@ function _M.getResetRewardRpc(agent, data)
659 end 641 end
660 642
661 local stage = talent:getv(0, 1) 643 local stage = talent:getv(0, 1)
662 - local tlevel = {talent:getv(1, 0), talent:getv(2, 0), talent:getv(3, 0), talent:getv(4, 0)} 644 + local curTalentLvl = talent:getv(1, 1)
  645 + --local tlevel = {talent:getv(1, 0), talent:getv(2, 0), talent:getv(3, 0), talent:getv(4, 0)}
663 646
664 - local talentCostIds = globalCsv.unit_talent_cost[csvdb["unitCsv"][hero:getProperty("type")].camp]  
665 while stage > 0 do 647 while stage > 0 do
666 - local curData = csvdb["unit_talentCsv"][stage]  
667 - for level = math.max(table.unpack(tlevel)), 1, -1 do  
668 - local add = 0  
669 - for i = 1, 4 do  
670 - if tlevel[i] == level then  
671 - add = add + 1  
672 - tlevel[i] = tlevel[i] - 1  
673 - end  
674 - end  
675 - local talentData = curData[level - 1] 648 + local curData = csvdb["unit_talent_"..heroCfgId.."Csv"][stage]
  649 + for lvl = 1, curTalentLvl - 1 do
  650 + local talentData = curData[lvl]
676 for itemId, count in pairs(talentData.money:toNumMap()) do 651 for itemId, count in pairs(talentData.money:toNumMap()) do
677 - reward[itemId] = (reward[itemId] or 0) + count * add  
678 - end  
679 - for idx , count in pairs(talentData.cost:toNumMap()) do  
680 - reward[talentCostIds[idx]] = (reward[talentCostIds[idx]] or 0) + count * add 652 + reward[itemId] = (reward[itemId] or 0) + count
681 end 653 end
682 end 654 end
683 stage = stage - 1 655 stage = stage - 1
684 - curData = csvdb["unit_talentCsv"][stage]  
685 - if curData then  
686 - tlevel = {#curData, #curData, #curData, #curData}  
687 - end  
688 end 656 end
689 657
690 local equip = hero:getProperty("equip") 658 local equip = hero:getProperty("equip")
@@ -708,9 +676,11 @@ function _M.getResetRewardRpc(agent, data) @@ -708,9 +676,11 @@ function _M.getResetRewardRpc(agent, data)
708 rune = "", 676 rune = "",
709 }) 677 })
710 hero:mylog({desc = "resetHero"}) 678 hero:mylog({desc = "resetHero"})
711 - 679 +
  680 + local coef = globalCsv.unit_back_discount
  681 + coef = (pay or tmpLevel <= 60) and 1 or coef
712 for itemId, count in pairs(reward) do 682 for itemId, count in pairs(reward) do
713 - reward[itemId] = math.floor(count * globalCsv.unit_back_discount) 683 + reward[itemId] = math.floor(count * coef)
714 end 684 end
715 local change 685 local change
716 reward, change = role:award(reward, {log = {desc = "resetHero", int1 = msg.id, int2 = hero:getProperty("type")}}) 686 reward, change = role:award(reward, {log = {desc = "resetHero", int1 = msg.id, int2 = hero:getProperty("type")}})
@@ -1068,4 +1038,23 @@ function _M.changeCrown(agent, data) @@ -1068,4 +1038,23 @@ function _M.changeCrown(agent, data)
1068 return true 1038 return true
1069 end 1039 end
1070 1040
  1041 +function _M.itemComposeRpc(agent, data)
  1042 + local role = agent.role
  1043 + local msg = MsgPack.unpack(data)
  1044 +
  1045 + local itemId = msg.id
  1046 + local count = msg.count
  1047 + if not csvdb["itemCsv"][itemId] then return 1 end
  1048 + local config = csvdb["item_processCsv"][itemId]
  1049 + if not config then return 2 end
  1050 +
  1051 + local cost = config.cost:toNumMap()
  1052 + if not role:checkItemEnough(cost) then return 2 end
  1053 + role:costItems(cost, {log = {desc = "itemCompose", int1 = itemId, int2 = count}})
  1054 + role:award({[itemId] = count}, {log = {desc = "itemCompose"}})
  1055 +
  1056 + SendPacket(actionCodes.Hero_itemComposeRpc, "")
  1057 + return true
  1058 +end
  1059 +
1071 return _M 1060 return _M
src/actions/PvpAction.lua
@@ -50,6 +50,9 @@ function _M.formatCommonRpc(agent , data) @@ -50,6 +50,9 @@ function _M.formatCommonRpc(agent , data)
50 end 50 end
51 pvpTC.leader = msg.leader 51 pvpTC.leader = msg.leader
52 pvpTC.supports = supports 52 pvpTC.supports = supports
  53 + if msg.tactics and globalCsv.tactics_skill_passive_cell[msg.tactics] then
  54 + pvpTC.tactics = msg.tactics
  55 + end
53 56
54 role:savePvpCTeam(pvpTC) 57 role:savePvpCTeam(pvpTC)
55 SendPacket(actionCodes.Pvp_formatCommonRpc, '') 58 SendPacket(actionCodes.Pvp_formatCommonRpc, '')
@@ -92,6 +95,9 @@ function _M.formatHighRpc(agent , data) @@ -92,6 +95,9 @@ function _M.formatHighRpc(agent , data)
92 curTeam.heros = team.heros 95 curTeam.heros = team.heros
93 curTeam.leader = team.leader 96 curTeam.leader = team.leader
94 curTeam.supports = supports 97 curTeam.supports = supports
  98 + if team.tactics and globalCsv.tactics_skill_passive_cell[team.tactics] then
  99 + curTeam.tactics = team.tactics
  100 + end
95 101
96 table.insert(pvpTH, curTeam) 102 table.insert(pvpTH, curTeam)
97 end 103 end
@@ -462,6 +468,10 @@ function _M.startBattleHRpc(agent, data) @@ -462,6 +468,10 @@ function _M.startBattleHRpc(agent, data)
462 curTeam.heros = team.heros 468 curTeam.heros = team.heros
463 curTeam.leader = team.leader 469 curTeam.leader = team.leader
464 curTeam.supports = supports 470 curTeam.supports = supports
  471 + if team.tactics and globalCsv.tactics_skill_passive_cell[team.tactics] then
  472 + curTeam.tactics = team.tactics
  473 + end
  474 +
465 475
466 table.insert(pvpTH, curTeam) 476 table.insert(pvpTH, curTeam)
467 end 477 end
src/actions/RadioAction.lua 0 → 100644
@@ -0,0 +1,165 @@ @@ -0,0 +1,165 @@
  1 +local _M = {}
  2 +
  3 +-- 获取英雄大成功率
  4 +local function getHeroCoef(hero, condition)
  5 + -- 基础概率
  6 + local rareMap = {[HeroQuality.N] = 10, [HeroQuality.R] = 10, [HeroQuality.SR] = 15, [HeroQuality.SSR] = 20}
  7 + local rare = hero:getRare()
  8 + local result = 0
  9 + for _, it in ipairs(condition:toTableArray(true)) do
  10 + local type = it[1]
  11 + local value = it[2]
  12 + local add = it[3]
  13 + if type == 1 then -- 种族加成
  14 + if hero:getCamp() == value then
  15 + result = result + add
  16 + end
  17 + elseif type == 2 then -- 定位加成
  18 + if hero:getPosition() == value then
  19 + result = result + add
  20 + end
  21 + end
  22 + end
  23 +
  24 + return result + (rareMap[rare] or 0)
  25 +end
  26 +
  27 +local function getQuestMax(role)
  28 + local count = 0
  29 + for _, carbonId in ipairs(globalCsv.crusade_team_unlock or {}) do
  30 + if role:checkHangPass(carbonId) then
  31 + count = count + 1
  32 + end
  33 + end
  34 +
  35 + return count + (globalCsv.cursade_team_count_initial or 0)
  36 +end
  37 +
  38 +function _M.startQuestRpc(agent, data)
  39 + local role = agent.role
  40 + local msg = MsgPack.unpack(data)
  41 + local id = msg.id
  42 + local heros = msg.heros
  43 + local result = {}
  44 + local radioTask = role:getProperty("radioTask")
  45 + if table.numbers(radioTask) >= getQuestMax(role) then
  46 + return 1
  47 + end
  48 + -- check id
  49 + local config = csvdb["crusadeCsv"][id]
  50 + if not config then return 2 end
  51 + if not role:checkHangPass(config.unlock) then return 3 end
  52 + if radioTask[id] then return 4 end
  53 + -- check hero
  54 + --1=指定等级=人数
  55 + --2=指定稀有度=人数
  56 + --3=人数
  57 + local needHeroCnt = 0
  58 + local lvlMap = {}
  59 + local rareMap = {}
  60 + for _, it in ipairs(config.condition:toTableArray(true)) do
  61 + local type = it[1]
  62 + if type == 1 then
  63 + lvlMap[1] = it[2]
  64 + lvlMap[2] = it[3]
  65 + elseif type == 2 then
  66 + rareMap[1] = it[2]
  67 + rareMap[2] = it[3]
  68 + elseif type == 3 then
  69 + needHeroCnt = it[2]
  70 + end
  71 + end
  72 + for _, heroId in ipairs(heros) do
  73 + local hero = role.heros[heroId]
  74 + if hero then
  75 + needHeroCnt = needHeroCnt - 1
  76 + if next(lvlMap) then
  77 + if hero:getProperty("level") >= lvlMap[1] then
  78 + lvlMap[2] = lvlMap[2] - 1
  79 + if lvlMap[2] <= 0 then
  80 + lvlMap = {}
  81 + end
  82 + end
  83 + end
  84 + if next(rareMap) then
  85 + if hero:getRare() >= rareMap[1] then
  86 + rareMap[2] = rareMap[2] - 1
  87 + end
  88 + if rareMap[2] <= 0 then
  89 + rareMap = {}
  90 + end
  91 + end
  92 + end
  93 + end
  94 + if needHeroCnt > 0 or next(rareMap) or next(lvlMap) then
  95 + return 5
  96 + end
  97 + -- start quest, set finish time
  98 + local taskData = {}
  99 + taskData["time"] = skynet.timex() + config.time
  100 + taskData["heros"] = heros
  101 + radioTask[id] = taskData
  102 + role:updateProperty({field="radioTask", value=radioTask, notNotify=true})
  103 +
  104 + SendPacket(actionCodes.Radio_startQuestRpc, MsgPack.pack({id=id, task=taskData}))
  105 + return true
  106 +end
  107 +
  108 +function _M.finishQuestRpc(agent, data)
  109 + local role = agent.role
  110 + local msg = MsgPack.unpack(data)
  111 + local id = msg.id
  112 + -- check finish time
  113 + local radioTask = role:getProperty("radioTask")
  114 + local task = radioTask[id]
  115 + if not task then return 1 end
  116 + if skynet.timex() < task.time then return 2 end
  117 + -- check id
  118 + local config = csvdb["crusadeCsv"][id]
  119 + if not config then return 3 end
  120 + local carbonData = csvdb["idle_battleCsv"][config.unlock]
  121 + if not carbonData then return 4 end
  122 + -- get heros
  123 + local totalCoef = 0
  124 + local exp = config.time / 60
  125 + heroFaithMap = {}
  126 + for _, heroId in ipairs(task.heros) do
  127 + local hero = role.heros[heroId]
  128 + if hero then
  129 + totalCoef = totalCoef + getHeroCoef(hero, config.success)
  130 + -- 增加英雄信赖
  131 + hero:addHeroFaith(exp)
  132 + heroFaithMap[heroId] = hero:getProperty("faith")
  133 + end
  134 + end
  135 + -- send award
  136 + local bigSuccess = false
  137 + local result = math.randomInt(0, 100)
  138 + if result < totalCoef then
  139 + bigSuccess = true
  140 + end
  141 + local money = math.ceil(carbonData.money / 5) * config.time * config.money_clear
  142 + local exp = math.ceil(carbonData.exp / 5) * config.time * config.exp_clear
  143 + local itemReward = config.item_clear_special:toNumMap()
  144 + itemReward[ItemId.Gold] = (itemReward[ItemId.Gold] or 0) + money
  145 + itemReward[ItemId.Exp] = (itemReward[ItemId.Exp] or 0) + exp
  146 + if bigSuccess then
  147 + for key, value in pairs(itemReward) do
  148 + itemReward[key] = math.ceil(1.5 * value)
  149 + end
  150 + end
  151 +
  152 + local r, change = role:award(itemReward, {log = {desc = "radioQuest", int1 = id}})
  153 +
  154 + radioTask[id] = nil
  155 + role:updateProperty({field="radioTask", value=radioTask, notNotify = true})
  156 +
  157 + local msg = role:packReward(r, change)
  158 + msg["big"] = bigSuccess
  159 + msg["id"] = id
  160 + msg["heroFaith"] = heroFaithMap
  161 + SendPacket(actionCodes.Radio_finishQuestRpc, MsgPack.pack(msg))
  162 + return true
  163 +end
  164 +
  165 +return _M
0 \ No newline at end of file 166 \ No newline at end of file
src/actions/RoleAction.lua
@@ -291,7 +291,7 @@ function _M.loginRpc( agent, data ) @@ -291,7 +291,7 @@ function _M.loginRpc( agent, data )
291 291
292 292
293 -- 玩家登陆做的一些操作 293 -- 玩家登陆做的一些操作
294 - role:saveHangTeam() 294 + role:updateHangTeamInfo()
295 role:savePvpCTeam() 295 role:savePvpCTeam()
296 role:savePvpHTeam() 296 role:savePvpHTeam()
297 297
@@ -1255,4 +1255,28 @@ function _M.useSelectItemRpc(agent, data) @@ -1255,4 +1255,28 @@ function _M.useSelectItemRpc(agent, data)
1255 return true 1255 return true
1256 end 1256 end
1257 1257
  1258 +function _M.renameTeamRpc(agent, data)
  1259 + local role = agent.role
  1260 + local msg = MsgPack.unpack(data)
  1261 + local title = msg.title
  1262 + local index = msg.index
  1263 + local ispve = msg.ispve
  1264 + if ispve then
  1265 + local teams = role:getProperty("hangTeams")
  1266 + local team = role:getTeamFormat(index)
  1267 + team.title = title
  1268 + teams[index] = team
  1269 + role:updateProperty({field = "hangTeams", value = teams, notNotify = false})
  1270 + else
  1271 + local teams = role:getProperty("advTeams")
  1272 + local team = role:getAdvTeamFormat(index)
  1273 + team.title = title
  1274 + teams[index] = team
  1275 + role:updateProperty({field = "advTeams", value = teams, notNotify = false})
  1276 + end
  1277 +
  1278 + SendPacket(actionCodes.Role_renameTeamRpc, "")
  1279 + return true
  1280 +end
  1281 +
1258 return _M 1282 return _M
1259 \ No newline at end of file 1283 \ No newline at end of file
src/actions/TowerAction.lua
@@ -8,36 +8,6 @@ local MsgPack = MsgPack @@ -8,36 +8,6 @@ local MsgPack = MsgPack
8 local _M = {} 8 local _M = {}
9 9
10 10
11 -function _M.roleFormatRpc(agent , data)  
12 - local role = agent.role  
13 - local msg = MsgPack.unpack(data)  
14 - local towerTeam = role:getProperty("towerF")  
15 - for slot, heroId in pairs(msg.heros) do  
16 - if not role.heros[heroId] then  
17 - return  
18 - end  
19 - end  
20 - local supports = {}  
21 - for slot, support in pairs(msg.supports) do  
22 - if slot ~= 1 and slot ~= 2 then return end  
23 - local level = role.dinerData:getProperty("dishTree"):getv(support, 0)  
24 - if level <= 0 then return end  
25 - supports[slot] = support  
26 - end  
27 - table.clear(towerTeam)  
28 - towerTeam.heros = {}  
29 - for slot, heroId in pairs(msg.heros) do  
30 - towerTeam.heros[slot] = heroId  
31 - end  
32 - towerTeam.leader = msg.leader  
33 - towerTeam.supports = supports  
34 -  
35 -  
36 - role:updateProperty({field = "towerF", value = towerTeam})  
37 - SendPacket(actionCodes.Tower_roleFormatRpc, '')  
38 - return true  
39 -end  
40 -  
41 11
42 local function getUpdateTime(lastCount, lastTime) 12 local function getUpdateTime(lastCount, lastTime)
43 local nextCount, nextTime = lastCount, skynet.timex() 13 local nextCount, nextTime = lastCount, skynet.timex()
@@ -102,6 +102,9 @@ function Adv:initByChapter(params) @@ -102,6 +102,9 @@ function Adv:initByChapter(params)
102 self.cacheUnlock = self.cacheUnlock or {} 102 self.cacheUnlock = self.cacheUnlock or {}
103 self.shopStatus = self.shopStatus or {} 103 self.shopStatus = self.shopStatus or {}
104 self.support = self.support or {} 104 self.support = self.support or {}
  105 + if self.battle then
  106 + self.battle:overBattle()
  107 + end
105 self.battle = nil -- 清掉 老的 battle 108 self.battle = nil -- 清掉 老的 battle
106 self.logid = self.owner:getActionUcode() 109 self.logid = self.owner:getActionUcode()
107 110
@@ -211,7 +214,7 @@ function Adv:saveDB(notNotify) @@ -211,7 +214,7 @@ function Adv:saveDB(notNotify)
211 advInfo.logid = self.logid 214 advInfo.logid = self.logid
212 advInfo.maps = {} 215 advInfo.maps = {}
213 216
214 - self.battle:saveDB() 217 + self.battle:saveDB(advInfo)
215 218
216 for id , map in ipairs(self.maps) do 219 for id , map in ipairs(self.maps) do
217 advInfo.maps[id] = map:getDB() 220 advInfo.maps[id] = map:getDB()
@@ -468,6 +471,11 @@ function Adv:initBattle(notDb) @@ -468,6 +471,11 @@ function Adv:initBattle(notDb)
468 if notDb and self.level ~= 1 then 471 if notDb and self.level ~= 1 then
469 self.battle.player:attrChangeCondBuffCheck(1) 472 self.battle.player:attrChangeCondBuffCheck(1)
470 end 473 end
  474 +
  475 + -- 初始化
  476 + if notDb then
  477 + self.battle:newBattle()
  478 + end
471 end 479 end
472 480
473 function Adv:triggerPassive(condType, params) 481 function Adv:triggerPassive(condType, params)
@@ -936,7 +944,7 @@ end @@ -936,7 +944,7 @@ end
936 944
937 -- log long1 字段被征用!!! 945 -- log long1 字段被征用!!!
938 -- 在冒险中获得的物品都发放在冒险背包内 946 -- 在冒险中获得的物品都发放在冒险背包内
939 -function Adv:award(gift, params) 947 +function Adv:award(gift, params, backRewardParams)
940 params = params or {} 948 params = params or {}
941 local tgift = {} 949 local tgift = {}
942 if type(gift) == "string" then 950 if type(gift) == "string" then
@@ -948,6 +956,8 @@ function Adv:award(gift, params) @@ -948,6 +956,8 @@ function Adv:award(gift, params)
948 end 956 end
949 local items = self.owner:getProperty("advItems") 957 local items = self.owner:getProperty("advItems")
950 local oldItems = items 958 local oldItems = items
  959 +
  960 + local autoUse = {}
951 for itemId, count in pairs(tgift) do 961 for itemId, count in pairs(tgift) do
952 if count > 0 then 962 if count > 0 then
953 local buffAdd = self.battle.player:getRewardChange(itemId) 963 local buffAdd = self.battle.player:getRewardChange(itemId)
@@ -956,41 +966,45 @@ function Adv:award(gift, params) @@ -956,41 +966,45 @@ function Adv:award(gift, params)
956 self:checkAchievement(Adv.AchievType.GetItem, count, itemId) 966 self:checkAchievement(Adv.AchievType.GetItem, count, itemId)
957 end 967 end
958 tgift[itemId] = count 968 tgift[itemId] = count
959 - local origin = items:getv(itemId, 0)  
960 - local nums = origin + count  
961 -  
962 - if csvdb["adv_artifactCsv"][itemId] then -- 获得神器  
963 - self:awardArtifact(itemId, params)  
964 - if not self.owner:checkOverGuide(55) then  
965 - self.owner:saveGuide(55,1,true)  
966 - end 969 + if globalCsv.adv_auto_useItem[itemId] and count > 0 then
  970 + autoUse[itemId] = count
967 else 971 else
968 - if nums <= 0 then  
969 - items = items:delk(itemId)  
970 - nums = 0 972 + local origin = items:getv(itemId, 0)
  973 + local nums = origin + count
  974 +
  975 + if csvdb["adv_artifactCsv"][itemId] then -- 获得神器
  976 + self:awardArtifact(itemId, params)
  977 + if not self.owner:checkOverGuide(55) then
  978 + self.owner:saveGuide(55,1,true)
  979 + end
971 else 980 else
972 - items = items:setv(itemId, nums)  
973 - end 981 + if nums <= 0 then
  982 + items = items:delk(itemId)
  983 + nums = 0
  984 + else
  985 + items = items:setv(itemId, nums)
  986 + end
974 987
975 - if itemId == 16 and not self.owner:checkOverGuide(51,4) then  
976 - self.owner:saveGuide(51,4)  
977 - end  
978 - if params.log then  
979 - local log = clone(params.log)  
980 - if log["cint1"] or log["cint2"] or log["cint3"] or log["long1"] then  
981 - print("addAdvItem error log have cint1 or cint2 or cint3 ", debug.traceback()) 988 + if itemId == 16 and not self.owner:checkOverGuide(51,4) then
  989 + self.owner:saveGuide(51,4)
982 end 990 end
983 - log["cint1"] = itemId  
984 - log["cint2"] = math.abs(count)  
985 - log["cint3"] = self.chapterId  
986 - log["long1"] = self.level  
987 - if count >= 0 then  
988 - self.owner:mylog("in_adv", log) 991 + if params.log then
  992 + local log = clone(params.log)
  993 + if log["cint1"] or log["cint2"] or log["cint3"] or log["long1"] then
  994 + print("addAdvItem error log have cint1 or cint2 or cint3 ", debug.traceback())
  995 + end
  996 + log["cint1"] = itemId
  997 + log["cint2"] = math.abs(count)
  998 + log["cint3"] = self.chapterId
  999 + log["long1"] = self.level
  1000 + if count >= 0 then
  1001 + self.owner:mylog("in_adv", log)
  1002 + else
  1003 + self.owner:mylog("out_adv", log)
  1004 + end
989 else 1005 else
990 - self.owner:mylog("out_adv", log) 1006 + print("addAdvItem no log ", debug.traceback())
991 end 1007 end
992 - else  
993 - print("addAdvItem no log ", debug.traceback())  
994 end 1008 end
995 end 1009 end
996 end 1010 end
@@ -1001,10 +1015,48 @@ function Adv:award(gift, params) @@ -1001,10 +1015,48 @@ function Adv:award(gift, params)
1001 if tgift[ItemId.OldCoin] then 1015 if tgift[ItemId.OldCoin] then
1002 self.battle.player:attrChangeCondBuffCheck(0) 1016 self.battle.player:attrChangeCondBuffCheck(0)
1003 end 1017 end
  1018 +
  1019 + if backRewardParams then
  1020 + self:backReward(tgift, backRewardParams)
  1021 + end
  1022 +
  1023 + if next(autoUse) then
  1024 + for itemId, count in pairs(autoUse) do
  1025 + self:useItem(itemId, count)
  1026 + end
  1027 + self:backUse(autoUse, 1)
  1028 + end
1004 return tgift 1029 return tgift
1005 end 1030 end
1006 1031
1007 1032
  1033 +function Adv:useItem(itemId, count, target)
  1034 + local itemData = csvdb["adv_itemCsv"][itemId]
  1035 + if not itemData then return end
  1036 +
  1037 + if itemData["function"] == 0 or itemData["function"] == 2 then count = 1 end
  1038 +
  1039 + if itemId == 5020 then
  1040 + self.owner:finishGuide(53)
  1041 + end
  1042 +
  1043 + self:checkAchievement(self.AchievType.UseItem, count, itemId)
  1044 + self:mylog({desc = "useItem", int1 = itemId, int2 = count})
  1045 +
  1046 + self.owner:log("mission_pick_use", {
  1047 + mission_threadid = self.chapterId, -- 大地图ID
  1048 + mission_threadname = (csvdb["adv_chapterCsv"][self.chapterId] or {})["chapter"] or "auto", -- 大地图名称
  1049 + mission_id = self.level, -- 关卡ID
  1050 + item_id = itemId, -- 道具ID
  1051 + mission_pick_use_num = count, -- 道具使用量
  1052 + mission_sequenceid = self.logid, -- 本次拾荒ID,用于关联一次拾荒产生多条不同类型的日志
  1053 + })
  1054 +
  1055 + for i = 1, count do
  1056 + self:doActive(itemData.effect, target) -- target
  1057 + end
  1058 +end
  1059 +
1008 -- 消耗物品 优先冒险背包 --check 只是检查够不够 1060 -- 消耗物品 优先冒险背包 --check 只是检查够不够
1009 function Adv:cost(item, params, check) 1061 function Adv:cost(item, params, check)
1010 local items = self.owner:getProperty("advItems") 1062 local items = self.owner:getProperty("advItems")
@@ -1040,7 +1092,9 @@ local function clickOut(self, room, block, params, isExit) @@ -1040,7 +1092,9 @@ local function clickOut(self, room, block, params, isExit)
1040 end 1092 end
1041 1093
1042 if #self.mapStack > 1 then -- 处于夹层中 1094 if #self.mapStack > 1 then -- 处于夹层中
  1095 + local oldMapIdx = self:getCurMapIdx()
1043 table.remove(self.mapStack) --退出夹层 1096 table.remove(self.mapStack) --退出夹层
  1097 + self.battle:iLayerChange(oldMapIdx)
1044 self:backLayer(-1) 1098 self:backLayer(-1)
1045 else --处于底层 1099 else --处于底层
1046 1100
@@ -1071,11 +1125,10 @@ local function clickOut(self, room, block, params, isExit) @@ -1071,11 +1125,10 @@ local function clickOut(self, room, block, params, isExit)
1071 self.battle.player:triggerPassive(Passive.DOWN_LAYER) 1125 self.battle.player:triggerPassive(Passive.DOWN_LAYER)
1072 1126
1073 if curFloorData then 1127 if curFloorData then
1074 - self:backReward(self:award({[ItemId.AdvPoint] = curFloorData.exp}, {log = {desc = "passReward", int1 = self.chapterId, int2 = self.level}})) 1128 + self:award({[ItemId.AdvPoint] = curFloorData.exp}, {log = {desc = "passReward", int1 = self.chapterId, int2 = self.level}}, {})
1075 end 1129 end
1076 local isHaveRelay = self:isHaveRelay(self.level) 1130 local isHaveRelay = self:isHaveRelay(self.level)
1077 1131
1078 - self.owner:getProperty("advTeam").player = self.battle.player:getDB() -- 临时缓存住 battle 的player  
1079 if isHaveRelay and not self.isRelay then 1132 if isHaveRelay and not self.isRelay then
1080 self:initByChapter({ 1133 self:initByChapter({
1081 chapterId = self.chapterId, 1134 chapterId = self.chapterId,
@@ -1255,7 +1308,7 @@ local function chooseCommon(self, room, block, chooseData, choose, tag) @@ -1255,7 +1308,7 @@ local function chooseCommon(self, room, block, chooseData, choose, tag)
1255 skynet.error(string.format("[ERROR]: event_dropCsv no id %s in %s id: %s", effect[2], tag, chooseData.id)) 1308 skynet.error(string.format("[ERROR]: event_dropCsv no id %s in %s id: %s", effect[2], tag, chooseData.id))
1256 end 1309 end
1257 end 1310 end
1258 - self:backReward(self:award(reward, {log = {desc = "chooseEvent", key1 = tag, int1 = chooseData.id}}), {roomId = room.roomId, blockId = block.blockId}) 1311 + self:award(reward, {log = {desc = "chooseEvent", key1 = tag, int1 = chooseData.id}}, {roomId = room.roomId, blockId = block.blockId})
1259 end, 1312 end,
1260 [2] = function() --获得冒险buff 1313 [2] = function() --获得冒险buff
1261 local layer = effect[3] or 1 1314 local layer = effect[3] or 1
@@ -1419,14 +1472,12 @@ local function clickDrop(self, room, block, params) @@ -1419,14 +1472,12 @@ local function clickDrop(self, room, block, params)
1419 if not self.battle or not self.battle.player then return end 1472 if not self.battle or not self.battle.player then return end
1420 self.battle.player:triggerPassive(Passive.CLICK_DROP) 1473 self.battle.player:triggerPassive(Passive.CLICK_DROP)
1421 1474
1422 - local reward = self:award({[block.event.item[1]] = block.event.item[2]}, {log = {desc = "clickDrop"}})  
1423 - -- local reward = self:award({[5801] = 1})  
1424 - -- 获取绷带的引导 1475 + local reward = self:award({[block.event.item[1]] = block.event.item[2]}, {log = {desc = "clickDrop"}}, {roomId = room.roomId, blockId = block.blockId})
  1476 +
1425 if block.event.item[1] == 5020 and not self.owner:checkOverGuide(53,2) then 1477 if block.event.item[1] == 5020 and not self.owner:checkOverGuide(53,2) then
1426 self.owner:saveGuide(53,2) 1478 self.owner:saveGuide(53,2)
1427 end 1479 end
1428 block:clear() 1480 block:clear()
1429 - self:backReward(reward, {roomId = room.roomId, blockId = block.blockId})  
1430 return true 1481 return true
1431 end 1482 end
1432 1483
@@ -1447,7 +1498,7 @@ local function clickTrader(self, room, block, params) @@ -1447,7 +1498,7 @@ local function clickTrader(self, room, block, params)
1447 local costCount = math.ceil(goodsData.price * (block.event.shop[buyId][2] or 100) / 100) 1498 local costCount = math.ceil(goodsData.price * (block.event.shop[buyId][2] or 100) / 100)
1448 if not self:cost({[goodsData.currency] = costCount}, {log = {desc = "clickTrader", int1 = block.event.id}}) then return false, 6 end --不够 1499 if not self:cost({[goodsData.currency] = costCount}, {log = {desc = "clickTrader", int1 = block.event.id}}) then return false, 6 end --不够
1449 self:backCost({[goodsData.currency] = costCount}) 1500 self:backCost({[goodsData.currency] = costCount})
1450 - local reward = self:award({[goodsData.item] = goodsData.num}, {log = {desc = "clickTrader", int1 = block.event.id}}) 1501 + self:award({[goodsData.item] = goodsData.num}, {log = {desc = "clickTrader", int1 = block.event.id}}, {})
1451 if goodsData.restrict == 1 then 1502 if goodsData.restrict == 1 then
1452 self.shopStatus[goodsData.goods] = (self.shopStatus[goodsData.goods] or 0) + 1 1503 self.shopStatus[goodsData.goods] = (self.shopStatus[goodsData.goods] or 0) + 1
1453 elseif goodsData.restrict == 2 then 1504 elseif goodsData.restrict == 2 then
@@ -1459,7 +1510,6 @@ local function clickTrader(self, room, block, params) @@ -1459,7 +1510,6 @@ local function clickTrader(self, room, block, params)
1459 buyCount = buyCount + 1 1510 buyCount = buyCount + 1
1460 self:checkTask(Adv.TaskType.Shop, 1, block.event.id) 1511 self:checkTask(Adv.TaskType.Shop, 1, block.event.id)
1461 self:checkAchievement(Adv.AchievType.Shop, 1, block.event.id) 1512 self:checkAchievement(Adv.AchievType.Shop, 1, block.event.id)
1462 - self:backReward(reward)  
1463 1513
1464 if (traderData.purchasetime ~= 0 and traderData.purchasetime <= buyCount) or #block.event.shop <= buyCount then 1514 if (traderData.purchasetime ~= 0 and traderData.purchasetime <= buyCount) or #block.event.shop <= buyCount then
1465 block:clear() 1515 block:clear()
@@ -1501,7 +1551,7 @@ local function clickClick(self, room, block, params) @@ -1501,7 +1551,7 @@ local function clickClick(self, room, block, params)
1501 local item = csvdb["event_dropCsv"][dropId]["range"]:randWeight(true) 1551 local item = csvdb["event_dropCsv"][dropId]["range"]:randWeight(true)
1502 reward[item[1]] = (reward[item[1]] or 0) + item[2] 1552 reward[item[1]] = (reward[item[1]] or 0) + item[2]
1503 end 1553 end
1504 - self:backReward(self:award(reward, {log = {desc = "clickClick", int1 = block.event.id}}), {roomId = room.roomId, blockId = block.blockId}) 1554 + self:award(reward, {log = {desc = "clickClick", int1 = block.event.id}}, {roomId = room.roomId, blockId = block.blockId})
1505 end, 1555 end,
1506 [3] = function() 1556 [3] = function()
1507 for _, buffId in ipairs(clickData.effect:toArray(true, "=")) do 1557 for _, buffId in ipairs(clickData.effect:toArray(true, "=")) do
@@ -1521,6 +1571,7 @@ local function clickClick(self, room, block, params) @@ -1521,6 +1571,7 @@ local function clickClick(self, room, block, params)
1521 end 1571 end
1522 1572
1523 local function clickLayer(self, room, block, params) 1573 local function clickLayer(self, room, block, params)
  1574 + local oldMapIdx = self:getCurMapIdx()
1524 if block.event.mapIdx then 1575 if block.event.mapIdx then
1525 table.insert(self.mapStack, block.event.mapIdx) --进入夹层 1576 table.insert(self.mapStack, block.event.mapIdx) --进入夹层
1526 else 1577 else
@@ -1536,6 +1587,7 @@ local function clickLayer(self, room, block, params) @@ -1536,6 +1587,7 @@ local function clickLayer(self, room, block, params)
1536 self.maps[mapIdx]:initBattleAfter() 1587 self.maps[mapIdx]:initBattleAfter()
1537 self:checkAchievement(Adv.AchievType.EnterILayer, 1, mapId) 1588 self:checkAchievement(Adv.AchievType.EnterILayer, 1, mapId)
1538 end 1589 end
  1590 + self.battle:iLayerChange(oldMapIdx)
1539 self:backLayer(1) 1591 self:backLayer(1)
1540 return true 1592 return true
1541 end 1593 end
@@ -1842,23 +1894,31 @@ end @@ -1842,23 +1894,31 @@ end
1842 1894
1843 -- 地图上物品变化 1895 -- 地图上物品变化
1844 function Adv:mapItemChange(ctype) 1896 function Adv:mapItemChange(ctype)
  1897 + local blocks = {}
  1898 + for roomId, room in pairs(self:getCurMap().rooms) do
  1899 + for blockId, block in pairs(room.blocks) do
  1900 + table.insert(blocks, block)
  1901 + end
  1902 + end
  1903 + self:blockDropChange(ctype, blocks)
  1904 +end
  1905 +
  1906 +function Adv:blockDropChange(ctype, blocks)
1845 local clist = csvdb["transform_itemCsv"][ctype] 1907 local clist = csvdb["transform_itemCsv"][ctype]
1846 if clist then 1908 if clist then
1847 - for roomId, room in pairs(self:getCurMap().rooms) do  
1848 - for blockId, block in pairs(room.blocks) do  
1849 - if block:getEventType() == AdvEventType.Drop and block.event.item then  
1850 - local id = block.event.item[1]  
1851 - local count = block.event.item[2]  
1852 - local changeTo = nil  
1853 - if clist[id] then  
1854 - changeTo = {clist[id].toId, math.ceil(count * clist[id].num)}  
1855 - elseif clist[-1] then  
1856 - changeTo = {clist[-1].toId, math.ceil(count * clist[-1].num)}  
1857 - end  
1858 - if changeTo and changeTo[1] ~= 0 and changeTo[2] ~= 0 then  
1859 - block.event.item = changeTo  
1860 - self:backBlockChange(roomId, blockId, ctype)  
1861 - end 1909 + for _, block in ipairs(blocks) do
  1910 + if block:getEventType() == AdvEventType.Drop and block.event.item then
  1911 + local id = block.event.item[1]
  1912 + local count = block.event.item[2]
  1913 + local changeTo = nil
  1914 + if clist[id] then
  1915 + changeTo = {clist[id].toId, math.ceil(count * clist[id].num)}
  1916 + elseif clist[-1] then
  1917 + changeTo = {clist[-1].toId, math.ceil(count * clist[-1].num)}
  1918 + end
  1919 + if changeTo and changeTo[1] ~= 0 and changeTo[2] ~= 0 then
  1920 + block.event.item = changeTo
  1921 + self:backBlockChange(block.room.roomId, block.blockId, ctype)
1862 end 1922 end
1863 end 1923 end
1864 end 1924 end
@@ -1887,8 +1947,9 @@ function Adv:enemyDead(enemy, escape) @@ -1887,8 +1947,9 @@ function Adv:enemyDead(enemy, escape)
1887 else 1947 else
1888 self:scoreChange(AdvScoreType.Kill, monsterData.advScore) 1948 self:scoreChange(AdvScoreType.Kill, monsterData.advScore)
1889 end 1949 end
1890 - local changeV = self.battle.player:addExp(monsterData.exp)  
1891 - self:backDead(enemyId, changeV) 1950 + -- local changeV = self.battle.player:addExp(monsterData.exp)
  1951 + -- self:backDead(enemyId, changeV)
  1952 + self:backDead(enemyId)
1892 1953
1893 local toClick = enemy:hadBuff(Buff.CHANGE_DROP_TO_CLICK) 1954 local toClick = enemy:hadBuff(Buff.CHANGE_DROP_TO_CLICK)
1894 if toClick then 1955 if toClick then
@@ -1989,10 +2050,13 @@ end @@ -1989,10 +2050,13 @@ end
1989 function Adv:pushBackEvent(btype, params) 2050 function Adv:pushBackEvent(btype, params)
1990 table.insert(self.backEvents, {btype = btype, params = params}) 2051 table.insert(self.backEvents, {btype = btype, params = params})
1991 end 2052 end
1992 - 2053 +--[=[
  2054 +tag
  2055 +1 自动拾取
  2056 +--]=]
1993 function Adv:backReward(items, params) 2057 function Adv:backReward(items, params)
1994 params = params or {} 2058 params = params or {}
1995 - self:pushBackEvent(AdvBackEventType.Reward, {items = items, roomId = params.roomId, blockId = params.blockId}) 2059 + self:pushBackEvent(AdvBackEventType.Reward, {items = items, roomId = params.roomId, blockId = params.blockId, tag = params.tag})
1996 end 2060 end
1997 2061
1998 -- if is player enemyId is nil 2062 -- if is player enemyId is nil
@@ -2009,8 +2073,8 @@ function Adv:backBlockChange(roomId, blockId, itemChangeType) @@ -2009,8 +2073,8 @@ function Adv:backBlockChange(roomId, blockId, itemChangeType)
2009 self:pushBackEvent(AdvBackEventType.BlockChange, {roomId = roomId, blockId = blockId, itemChangeType = itemChangeType}) 2073 self:pushBackEvent(AdvBackEventType.BlockChange, {roomId = roomId, blockId = blockId, itemChangeType = itemChangeType})
2010 end 2074 end
2011 2075
2012 -function Adv:backDead(enemyId, exp)  
2013 - self:pushBackEvent(AdvBackEventType.Dead, {enemyId = enemyId, exp = exp}) 2076 +function Adv:backDead(enemyId)
  2077 + self:pushBackEvent(AdvBackEventType.Dead, {enemyId = enemyId})
2014 end 2078 end
2015 2079
2016 function Adv:backTrap() 2080 function Adv:backTrap()
@@ -2033,8 +2097,12 @@ function Adv:backCost(items) @@ -2033,8 +2097,12 @@ function Adv:backCost(items)
2033 self:pushBackEvent(AdvBackEventType.Cost, {items = items}) 2097 self:pushBackEvent(AdvBackEventType.Cost, {items = items})
2034 end 2098 end
2035 2099
2036 -function Adv:backUse(items)  
2037 - self:pushBackEvent(AdvBackEventType.Use, {items = items}) 2100 +--[=[
  2101 +tag
  2102 +1 自动使用
  2103 +--]=]
  2104 +function Adv:backUse(items, tag)
  2105 + self:pushBackEvent(AdvBackEventType.Use, {items = items, tag = tag})
2038 end 2106 end
2039 2107
2040 2108
@@ -2044,21 +2112,11 @@ function Adv:scoreChange(scoreType, score) @@ -2044,21 +2112,11 @@ function Adv:scoreChange(scoreType, score)
2044 end 2112 end
2045 2113
2046 function Adv:getScore() 2114 function Adv:getScore()
2047 - self.score[AdvScoreType.Level] = math.floor(self.score[AdvScoreType.Level] or 0)  
2048 - self.score[AdvScoreType.Task] = math.floor(self.score[AdvScoreType.Task] or 0)  
2049 - self.score[AdvScoreType.Kill] = math.floor(self.score[AdvScoreType.Kill] or 0)  
2050 - self.score[AdvScoreType.KillBoss] = math.floor(self.score[AdvScoreType.KillBoss] or 0)  
2051 - self.score[AdvScoreType.ItemBack] = math.floor(self.score[AdvScoreType.ItemBack] or 0)  
2052 - self.score[AdvScoreType.Event] = math.floor(self.score[AdvScoreType.Event] or 0)  
2053 - self.score[AdvScoreType.Story] = math.floor(self.score[AdvScoreType.Story] or 0)  
2054 -  
2055 - return self.score[AdvScoreType.Level]  
2056 - + self.score[AdvScoreType.Task]  
2057 - + self.score[AdvScoreType.Kill]  
2058 - + self.score[AdvScoreType.KillBoss]  
2059 - + self.score[AdvScoreType.ItemBack]  
2060 - + self.score[AdvScoreType.Event]  
2061 - + self.score[AdvScoreType.Story] 2115 + local allScore = 0
  2116 + for _, score in pairs(self.score) do
  2117 + allScore = allScore + math.floor(score)
  2118 + end
  2119 + return allScore
2062 end 2120 end
2063 2121
2064 function Adv:popBackEvents() 2122 function Adv:popBackEvents()
src/adv/AdvBattle.lua
@@ -8,6 +8,7 @@ function Battle:ctor(adv) @@ -8,6 +8,7 @@ function Battle:ctor(adv)
8 self.isNewPlayer = false 8 self.isNewPlayer = false
9 self.enemys = {} --怪 9 self.enemys = {} --怪
10 self.builds = {} -- 建筑 10 self.builds = {} -- 建筑
  11 + self.auras = {} -- 光环
11 self.cachePassiveEvent = {} 12 self.cachePassiveEvent = {}
12 self:initPlayer() 13 self:initPlayer()
13 self:initEnemys() 14 self:initEnemys()
@@ -67,17 +68,17 @@ function Battle:initPlayer() @@ -67,17 +68,17 @@ function Battle:initPlayer()
67 local advAddAttrs = self.adv.owner:getAdvLvAddAttrs() 68 local advAddAttrs = self.adv.owner:getAdvLvAddAttrs()
68 69
69 player = {} 70 player = {}
70 - player.level = 1  
71 - if self.adv.level ~= 1 then  
72 - local relayData = self.adv:isHaveRelay()  
73 - if relayData then  
74 - player.level = relayData.level  
75 - end  
76 - end  
77 - player.exp = 0 71 + -- player.level = 1
  72 + -- if self.adv.level ~= 1 then
  73 + -- local relayData = self.adv:isHaveRelay()
  74 + -- if relayData then
  75 + -- player.level = relayData.level
  76 + -- end
  77 + -- end
  78 + -- player.exp = 0
78 player.sp = getAdvLvAttrUp(advAddAttrs, "sp", 100) 79 player.sp = getAdvLvAttrUp(advAddAttrs, "sp", 100)
79 player.spMax = player.sp 80 player.spMax = player.sp
80 - player.growth = {} 81 + -- player.growth = {}
81 player.passives = {} 82 player.passives = {}
82 83
83 for slot, heroId in pairs(advTeam.heros) do 84 for slot, heroId in pairs(advTeam.heros) do
@@ -100,8 +101,8 @@ function Battle:initPlayer() @@ -100,8 +101,8 @@ function Battle:initPlayer()
100 player[attrName] = (player[attrName] or 0) + hero[attrName] 101 player[attrName] = (player[attrName] or 0) + hero[attrName]
101 end 102 end
102 player[attrName] = getAdvLvAttrUp(advAddAttrs, attrName, player[attrName]) * (globalCsv.adv_battle_attr_ratio[attrName] or 1) 103 player[attrName] = getAdvLvAttrUp(advAddAttrs, attrName, player[attrName]) * (globalCsv.adv_battle_attr_ratio[attrName] or 1)
103 - player.growth[attrName] = player[attrName] * (globalCsv.adv_battle_attr_growth_ratio[attrName] or 1)  
104 - player[attrName] = player[attrName] + player.growth[attrName] * (player.level - 1) 104 + -- player.growth[attrName] = player[attrName] * (globalCsv.adv_battle_attr_growth_ratio[attrName] or 1)
  105 + -- player[attrName] = player[attrName] + player.growth[attrName] * (player.level - 1)
105 end 106 end
106 107
107 player.hpMax = player.hp or 0 108 player.hpMax = player.hp or 0
@@ -198,8 +199,10 @@ function Battle:addEnemy(room, block, mapIdx, init) @@ -198,8 +199,10 @@ function Battle:addEnemy(room, block, mapIdx, init)
198 end 199 end
199 200
200 for _, buff in ipairs(buffs) do 201 for _, buff in ipairs(buffs) do
201 - enemy:addBuff(buff) 202 + player:addBuff(buff)
202 end 203 end
  204 + -- 新生成的怪 加上 已有的光环buff
  205 + player:checkAuraBuff(self:checkDiffAuraBuff({}, self:getAurasByMap()))
203 end 206 end
204 end 207 end
205 return player 208 return player
@@ -347,6 +350,8 @@ function Battle:afterRound() @@ -347,6 +350,8 @@ function Battle:afterRound()
347 350
348 self.player:triggerPassive(Passive.AFTER_ROUND) 351 self.player:triggerPassive(Passive.AFTER_ROUND)
349 352
  353 + self:checkAura()
  354 +
350 if self.player.isDead then 355 if self.player.isDead then
351 self.adv:over(false, nil, -2) 356 self.adv:over(false, nil, -2)
352 end 357 end
@@ -435,8 +440,116 @@ function Battle:initMapEffect(ilayer) @@ -435,8 +440,116 @@ function Battle:initMapEffect(ilayer)
435 end 440 end
436 441
437 442
  443 +-- 夹层 进入退出 接口 清理玩家身上的老光环 添加新的光环
  444 +function Battle:iLayerChange(oldMapIdx)
  445 + local auras = self:getActiveAuras()
  446 + local playerBuffs = self:checkDiffAuraBuff(self:getAurasByMap(oldMapIdx), auras)
  447 + local enemyBuffs = self:checkDiffAuraBuff(self:getAurasByMap(), auras)
  448 + self.player:checkAuraBuff(playerBuffs)
  449 + for _, enemy in pairs(self.player:getTeam(2)) do
  450 + enemy:checkAuraBuff(enemyBuffs)
  451 + end
  452 + self:setMapAuras(auras)
  453 +end
  454 +
  455 +-- 新的 关卡 关闭旧的战斗模块 清理 玩家身上的光环效果
  456 +function Battle:overBattle()
  457 + local buffs = self:checkDiffAuraBuff(self:getAurasByMap(), {})
  458 + self.player:checkAuraBuff(buffs)
  459 + self.adv.owner:getProperty("advTeam").player = self.player:getDB() -- 临时缓存住 battle 的player
  460 +end
  461 +
  462 +-- 初始化 新的 关卡
  463 +function Battle:newBattle()
  464 + local auras = self:getActiveAuras()
  465 + local buffs = self:checkDiffAuraBuff({}, auras)
  466 + self:setMapAuras(auras)
  467 +end
  468 +
  469 +-- 过了回合 检查光环
  470 +function Battle:checkAura()
  471 + local auras = self:getActiveAuras()
  472 + local buffs = self:checkDiffAuraBuff(self:getAurasByMap(), auras)
  473 + self.player:checkAuraBuff(buffs)
  474 + for _, enemy in pairs(self.player:getTeam(2)) do
  475 + enemy:checkAuraBuff(buffs)
  476 + end
  477 + self:setMapAuras(auras)
  478 +end
  479 +
  480 +-- 查找差异buff
  481 +function Battle:checkDiffAuraBuff(oldAuras, newAuras)
  482 + local auras = {}
  483 + for aurasId , count in pairs(oldAuras) do
  484 + auras[aurasId] = -count
  485 + end
  486 + for aurasId , count in pairs(newAuras) do
  487 + auras[aurasId] = (auras[aurasId] or 0) + count
  488 + end
  489 +
  490 + local buffs = {}
  491 + for aurasId , count in pairs(auras) do
  492 + local auraData = csvdb["adv_map_haloCsv"][aurasId]
  493 + if auraData then
  494 + for _, effect in ipairs(auraData.effect:toTableArray(true)) do
  495 + temp = buffs
  496 + for i = 1, #effect do
  497 + temp[effect[i]] = temp[effect[i]] or {}
  498 + temp = temp[effect[i]]
  499 + end
  500 + temp.count = (temp.count or 0) + count
  501 + if newAuras[aurasId] then
  502 + -- 加上 未消失标记
  503 + temp.exist = true
  504 + end
  505 + end
  506 + end
  507 + end
  508 + return buffs
  509 +end
  510 +
  511 +-- 获取所有生效的 光环
  512 +function Battle:getActiveAuras()
  513 + local auras = {}
  514 + for _, one in pairs(self.player:getAuras()) do
  515 + auras[one] = (auras[one] or 0) + 1
  516 + end
  517 + for _, enemy in pairs(self.player:getTeam(2)) do
  518 + for _, one in pairs(enemy:getAuras()) do
  519 + auras[one] = (auras[one] or 0) + 1
  520 + end
  521 + end
  522 + for _, build in pairs(self:getBuilds()) do
  523 + for _, one in pairs(build:getAuras()) do
  524 + auras[one] = (auras[one] or 0) + 1
  525 + end
  526 + end
  527 + return auras
  528 +end
  529 +
  530 +function Battle:setMapAuras(auras)
  531 + self.auras[self.adv:getCurMapIdx()] = auras
  532 +end
  533 +
  534 +function Battle:getAurasByMap(mapIdx)
  535 + mapIdx = mapIdx or self.adv:getCurMapIdx()
  536 + local auras = self.auras[mapIdx] or {}
  537 + return auras
  538 +end
  539 +
  540 +function Battle:getBuilds()
  541 + local team = {}
  542 + for _, build in pairs(self.builds[self.adv:getCurMapIdx()]) do
  543 + if not build.isDead and not build.lock then -- 已经翻开的
  544 + table.insert(team, build)
  545 + end
  546 + end
  547 + return team
  548 +end
  549 +
  550 +
438 --写入数据 551 --写入数据
439 -function Battle:saveDB() 552 +function Battle:saveDB(advInfo)
440 for idx, mapEnemys in pairs(self.enemys) do 553 for idx, mapEnemys in pairs(self.enemys) do
441 for _, enemy in ipairs(mapEnemys) do 554 for _, enemy in ipairs(mapEnemys) do
442 local block = self.adv:getBlock(enemy.roomId, enemy.blockId, idx) 555 local block = self.adv:getBlock(enemy.roomId, enemy.blockId, idx)
@@ -453,6 +566,7 @@ function Battle:saveDB() @@ -453,6 +566,7 @@ function Battle:saveDB()
453 end 566 end
454 end 567 end
455 end 568 end
  569 + advInfo.auras = self.auras
456 end 570 end
457 571
458 return Battle 572 return Battle
459 \ No newline at end of file 573 \ No newline at end of file
src/adv/AdvBlock.lua
@@ -48,6 +48,8 @@ function Block:updateEvent(event, isInit) @@ -48,6 +48,8 @@ function Block:updateEvent(event, isInit)
48 end 48 end
49 end 49 end
50 end 50 end
  51 + local oldet = self:getEventType()
  52 +
51 self.event = event 53 self.event = event
52 if not isInit and self.event then 54 if not isInit and self.event then
53 -- 判断下类型是不是错的 55 -- 判断下类型是不是错的
@@ -58,18 +60,49 @@ function Block:updateEvent(event, isInit) @@ -58,18 +60,49 @@ function Block:updateEvent(event, isInit)
58 end 60 end
59 self:randomEvent() 61 self:randomEvent()
60 end 62 end
  63 + self:quickDrop()
  64 +
  65 + if not isInit and self.isOpen then
  66 + local newet = self:getEventType()
  67 + if oldet ~= newet then
  68 + local em = {}
  69 + if oldet then
  70 + em[oldet] =1
  71 + end
  72 + if newet then
  73 + em[newet] =1
  74 + end
  75 +
  76 + local player = self.room.map.adv.battle.player
  77 + player:attrChangeCondBuffCheck(4, em)
  78 + for _, monster in pairs(player:getTeam(2)) do
  79 + monster:attrChangeCondBuffCheck(4, em)
  80 + end
  81 + end
  82 + end
61 end 83 end
62 84
63 function Block:clear() 85 function Block:clear()
64 - if self:getEventType() == AdvEventType.Trap then 86 + local et = self:getEventType()
  87 + if et == AdvEventType.Trap then
65 self.trapId = self.event.id 88 self.trapId = self.event.id
66 - elseif self:getEventType() == AdvEventType.Build then 89 + elseif et == AdvEventType.Build then
67 local build = self.room.map.adv.battle:getBuild(self.room.roomId, self.blockId, self.room.map.mapIdx) 90 local build = self.room.map.adv.battle:getBuild(self.room.roomId, self.blockId, self.room.map.mapIdx)
68 if build then 91 if build then
69 build.isDead = true 92 build.isDead = true
70 end 93 end
71 end 94 end
72 self.event = nil 95 self.event = nil
  96 +
  97 +
  98 + if et then
  99 + local em = {[et] = 1}
  100 + local player = self.room.map.adv.battle.player
  101 + player:attrChangeCondBuffCheck(4, em)
  102 + for _, monster in pairs(player:getTeam(2)) do
  103 + monster:attrChangeCondBuffCheck(4, em)
  104 + end
  105 + end
73 end 106 end
74 107
75 108
@@ -90,8 +123,10 @@ function Block:randomEvent() @@ -90,8 +123,10 @@ function Block:randomEvent()
90 enemy:triggerPassive(Passive.BORN_ONCE) 123 enemy:triggerPassive(Passive.BORN_ONCE)
91 124
92 adv.battle.player:triggerPassive(Passive.OPEN_MONSTER, {trigger = enemy}) 125 adv.battle.player:triggerPassive(Passive.OPEN_MONSTER, {trigger = enemy})
  126 + adv.battle.player:attrChangeCondBuffCheck(3, enemy:getClassify())
93 for _, monster in pairs(adv.battle.player:getTeam(2)) do 127 for _, monster in pairs(adv.battle.player:getTeam(2)) do
94 - adv.battle.player:triggerPassive(Passive.OPEN_MONSTER, {trigger = enemy}) 128 + monster:triggerPassive(Passive.OPEN_MONSTER, {trigger = enemy})
  129 + monster:attrChangeCondBuffCheck(3, enemy:getClassify())
95 end 130 end
96 end 131 end
97 randomFunc[AdvEventType.BOSS] = randomFunc[AdvEventType.Monster] 132 randomFunc[AdvEventType.BOSS] = randomFunc[AdvEventType.Monster]
@@ -208,6 +243,13 @@ function Block:randomEvent() @@ -208,6 +243,13 @@ function Block:randomEvent()
208 e:addBuff(buffId) 243 e:addBuff(buffId)
209 end 244 end
210 end 245 end
  246 + elseif data.target == 4 then
  247 + local enemys = self.room.map.adv:getCurMap():openBlocksIsMonsterByRoom(self.room.roomId)
  248 + for _, e in ipairs(enemys) do
  249 + for _, buffId in ipairs(buffs) do
  250 + e:addBuff(buffId)
  251 + end
  252 + end
211 end 253 end
212 254
213 if data.specialEff ~= "" then 255 if data.specialEff ~= "" then
@@ -263,10 +305,35 @@ function Block:open() @@ -263,10 +305,35 @@ function Block:open()
263 local adv = map.adv 305 local adv = map.adv
264 self.isOpen = true 306 self.isOpen = true
265 self:randomEvent() 307 self:randomEvent()
  308 + self:quickDrop()
  309 +
  310 + local et = self:getEventType()
  311 + if et then
  312 + local em = {[et] = 1}
  313 + local player = self.room.map.adv.battle.player
  314 + player:attrChangeCondBuffCheck(4, em)
  315 + for _, monster in pairs(player:getTeam(2)) do
  316 + monster:attrChangeCondBuffCheck(4, em)
  317 + end
  318 + end
266 return true 319 return true
267 end 320 end
268 321
  322 +function Block:quickDrop()
  323 + if self:getEventType() == AdvEventType.Drop and self.event.item then
  324 + local itemId, count = table.unpack(self.event.item)
  325 + if globalCsv.adv_auto_collect[itemId] then
  326 + self.room.map.adv:award({[itemId] = count}, {log = {desc = "clickDrop"}}, {roomId = self.room.roomId, blockId = self.blockId, tag = 1})
  327 + self:clear()
  328 + end
  329 + end
  330 +end
  331 +
269 function Block:getObstacle() 332 function Block:getObstacle()
  333 + if self:isMonster() then
  334 + local enemy = self.room.map.adv.battle:getEnemy(self.room.roomId, self.blockId)
  335 + return enemy:getObstacle()
  336 + end
270 local data = self:getEventData() 337 local data = self:getEventData()
271 if not data then return 0 end 338 if not data then return 0 end
272 return data.obstacle or 0 339 return data.obstacle or 0
src/adv/AdvBuff.lua
@@ -20,7 +20,7 @@ Buff.HP_CHANGE_NOW = 16 -- 生命变化(每回合生效,立刻生效) @@ -20,7 +20,7 @@ Buff.HP_CHANGE_NOW = 16 -- 生命变化(每回合生效,立刻生效)
20 Buff.BATTLE_BUFF = 17 -- 切换为战斗中的buff 20 Buff.BATTLE_BUFF = 17 -- 切换为战斗中的buff
21 Buff.CHANGE_DROP = 18 -- 转换掉落 21 Buff.CHANGE_DROP = 18 -- 转换掉落
22 Buff.BATTLE_PASSIVE = 19 -- 切换为战斗中的被动技 22 Buff.BATTLE_PASSIVE = 19 -- 切换为战斗中的被动技
23 -Buff.EXP_ADD = 20 -- 增加exp(每回合) 23 +-- Buff.EXP_ADD = 20 -- 增加exp(每回合)
24 Buff.DONT_DEFEND = 21 -- 不看守地板 -- 怪周围点半可点击 24 Buff.DONT_DEFEND = 21 -- 不看守地板 -- 怪周围点半可点击
25 Buff.SHOW_DANGER = 22 -- 扫雷 展示地上怪物和陷阱数量的标记 25 Buff.SHOW_DANGER = 22 -- 扫雷 展示地上怪物和陷阱数量的标记
26 Buff.SHOW_MONSTER_POS = 23 -- 蓝臂章训练场 感知 26 Buff.SHOW_MONSTER_POS = 23 -- 蓝臂章训练场 感知
@@ -34,6 +34,10 @@ Buff.Buff_EFFECT_CHANGE = 30 -- 改变 buff 效果 @@ -34,6 +34,10 @@ Buff.Buff_EFFECT_CHANGE = 30 -- 改变 buff 效果
34 Buff.Buff_NO_PASSIVE_MONSTER = 31 -- 地图被动刷新不出来怪物 34 Buff.Buff_NO_PASSIVE_MONSTER = 31 -- 地图被动刷新不出来怪物
35 Buff.SNEAK = 32 --潜行 35 Buff.SNEAK = 32 --潜行
36 Buff.DROP_BUFF_BY_ENEMY = 33 -- 怪物掉落加成 -- 怪物使用 36 Buff.DROP_BUFF_BY_ENEMY = 33 -- 怪物掉落加成 -- 怪物使用
  37 +Buff.GET_PASSIVE = 34 -- 获得 passive -- 结束失效
  38 +Buff.OBSTACLE_CHANGE = 35 -- 看守类型改变 -- 怪物使用 0 - 1
  39 +Buff.DISABLE_AURA = 36 -- 禁用光环
  40 +Buff.GET_AURA = 37 -- 获得光环
37 41
38 42
39 --角色一些属性的变化 43 --角色一些属性的变化
@@ -87,13 +91,24 @@ local function commonAttCond(_Buff, attrName) @@ -87,13 +91,24 @@ local function commonAttCond(_Buff, attrName)
87 if buff then 91 if buff then
88 effectCount = buff.layer 92 effectCount = buff.layer
89 end 93 end
  94 + elseif self.buffData.effectValue4 == 3 then
  95 + local classify = tonumber(self.buffData.effectValue5) -- 怪标签
  96 + local enemy = self.owner.battle.player:getTeam(2)
  97 + for _, one in pairs(enemy) do
  98 + if one.isClassify and one:isClassify(classify) then
  99 + effectCount = effectCount + 1
  100 + end
  101 + end
  102 + elseif self.buffData.effectValue4 == 4 then
  103 + local eventType = tonumber(self.buffData.effectValue5) -- event 类型
  104 + effectCount = #self.owner.battle.adv:getCurMap():getEventTypeAllMap(eventType)
90 end 105 end
91 return self.buffData.effectValue2 * effectCount 106 return self.buffData.effectValue2 * effectCount
92 end 107 end
93 108
94 _Buff.getEffectBy = function(self) 109 _Buff.getEffectBy = function(self)
95 local cond = nil 110 local cond = nil
96 - if self.buffData.effectValue4 == 2 then 111 + if self.buffData.effectValue4 == 2 or self.buffData.effectValue4 == 3 or self.buffData.effectValue4 == 4 then
97 cond = tonumber(self.buffData.effectValue5) 112 cond = tonumber(self.buffData.effectValue5)
98 end 113 end
99 return self.buffData.effectValue4, attrName, cond 114 return self.buffData.effectValue4, attrName, cond
@@ -302,18 +317,30 @@ local BuffFactory = { @@ -302,18 +317,30 @@ local BuffFactory = {
302 end 317 end
303 end, 318 end,
304 319
305 - [Buff.EXP_ADD] = function(_Buff)  
306 - _Buff._afterRound = function(self)  
307 - local value = self:effect()  
308 - self.owner.battle.player:addExp(value) 320 + -- [Buff.EXP_ADD] = function(_Buff)
  321 + -- _Buff._afterRound = function(self)
  322 + -- local value = self:effect()
  323 + -- self.owner.battle.player:addExp(value)
  324 + -- end
  325 + -- _Buff._effectValue = function(self)
  326 + -- -- 经验值
  327 + -- return self.buffData.effectValue1 * self.layer
  328 + -- end
  329 + -- end,
  330 +
  331 + [Buff.DISABLE_BUFF] = function(_Buff)
  332 + _Buff._effectValue = function(self)
  333 + return self.buffData.effectValue1
309 end 334 end
  335 + end,
  336 +
  337 + [Buff.DISABLE_AURA] = function(_Buff)
310 _Buff._effectValue = function(self) 338 _Buff._effectValue = function(self)
311 - -- 经验值  
312 - return self.buffData.effectValue1 * self.layer 339 + return self.buffData.effectValue1
313 end 340 end
314 end, 341 end,
315 342
316 - [Buff.DISABLE_BUFF] = function(_Buff) 343 + [Buff.GET_AURA] = function(_Buff)
317 _Buff._effectValue = function(self) 344 _Buff._effectValue = function(self)
318 return self.buffData.effectValue1 345 return self.buffData.effectValue1
319 end 346 end
@@ -378,6 +405,14 @@ local BuffFactory = { @@ -378,6 +405,14 @@ local BuffFactory = {
378 self.layer = self.buffData.effectValue1 405 self.layer = self.buffData.effectValue1
379 end 406 end
380 end, 407 end,
  408 + [Buff.GET_PASSIVE] = function( _Buff )
  409 + _Buff._init = function(self)
  410 + self.owner:addPassive({id = self.buffData.effectValue1})
  411 + end
  412 + _Buff._endBuff = function(self)
  413 + self.owner:delPassiveById(self.buffData.effectValue1)
  414 + end
  415 + end
381 } 416 }
382 417
383 -- 同样的返回 effectValue1, effectValue2 * self.layer 类型的buff 418 -- 同样的返回 effectValue1, effectValue2 * self.layer 类型的buff
@@ -439,7 +474,18 @@ function Buff:initNew(release, data) @@ -439,7 +474,18 @@ function Buff:initNew(release, data)
439 end 474 end
440 end 475 end
441 476
442 -function Buff:createAfter() 477 +function Buff:createAfter(layer)
  478 + layer = layer or 1
  479 + local otype, maxLayer = self:getOverlay()
  480 + if otype then
  481 + self.layer = layer
  482 + if maxLayer ~= 0 then
  483 + self.layer = math.min(maxLayer, self.layer)
  484 + end
  485 + else
  486 + self.layer = 1
  487 + end
  488 +
443 if self._init then 489 if self._init then
444 self:_init() 490 self:_init()
445 end 491 end
@@ -626,12 +672,13 @@ function Buff:getOverlay() @@ -626,12 +672,13 @@ function Buff:getOverlay()
626 end 672 end
627 673
628 -- 叠加 674 -- 叠加
629 -function Buff:overlay(releaser, data) 675 +function Buff:overlay(releaser, data, layer)
630 local otype, maxLayer = self:getOverlay() 676 local otype, maxLayer = self:getOverlay()
631 if self.isDel or not otype then -- 新获得的 (不可叠加相当于新获得的) 677 if self.isDel or not otype then -- 新获得的 (不可叠加相当于新获得的)
632 - self.isDel = false  
633 self:endBuff() 678 self:endBuff()
  679 + self.isDel = false
634 self:initNew(releaser, data) 680 self:initNew(releaser, data)
  681 + self:createAfter(layer)
635 else 682 else
636 -- 重置回合 次数 683 -- 重置回合 次数
637 self.roundSpace = 0 684 self.roundSpace = 0
@@ -644,7 +691,7 @@ function Buff:overlay(releaser, data) @@ -644,7 +691,7 @@ function Buff:overlay(releaser, data)
644 691
645 self.release = releaser or self.release 692 self.release = releaser or self.release
646 -- 叠加层数 693 -- 叠加层数
647 - self.layer = self.layer + 1 694 + self.layer = self.layer + layer
648 if maxLayer ~= 0 then 695 if maxLayer ~= 0 then
649 self.layer = math.min(maxLayer, self.layer) 696 self.layer = math.min(maxLayer, self.layer)
650 end 697 end
@@ -655,14 +702,32 @@ function Buff:overlay(releaser, data) @@ -655,14 +702,32 @@ function Buff:overlay(releaser, data)
655 end 702 end
656 703
657 -- 扣减层数 704 -- 扣减层数
658 -function Buff:uncover()  
659 - if self.layer <= 1 then 705 +function Buff:uncover(layer, isAura)
  706 + layer = layer or 1
  707 + local oldLayer = self.layer
  708 +
  709 + self.layer = self.layer - layer
  710 +
  711 + if self.layer <= 0 then
660 self.isDel = true 712 self.isDel = true
661 end 713 end
662 714
663 - self.layer = self.layer - 1  
664 - if self._uncover then  
665 - self:_uncover() 715 + if isAura then
  716 + if layer == -1 then
  717 + self.layer = 0
  718 + self.isDel = true
  719 + else
  720 + self.layer = math.max(1, self.layer)
  721 + self.isDel = false
  722 + end
  723 + end
  724 +
  725 + if self.isDel then return end
  726 +
  727 + if oldLayer ~= self.layer then
  728 + if self._uncover then
  729 + self:_uncover()
  730 + end
666 end 731 end
667 end 732 end
668 733
src/adv/AdvMap.lua
@@ -256,7 +256,7 @@ function Map:openBlock(roomId, blockId, isPlayer, ignoreBack) @@ -256,7 +256,7 @@ function Map:openBlock(roomId, blockId, isPlayer, ignoreBack)
256 256
257 if status then 257 if status then
258 if isPlayer then 258 if isPlayer then
259 - self.adv.battle:triggerPassive(Passive.OPEN_BLOCK) 259 + self.adv.battle:triggerPassive(Passive.OPEN_BLOCK, {roomId = roomId, blockId = blockId})
260 self.adv.owner:checkTaskEnter("AdvOpenBlock") 260 self.adv.owner:checkTaskEnter("AdvOpenBlock")
261 261
262 -- 潜行检查 262 -- 潜行检查
@@ -272,8 +272,8 @@ function Map:openBlock(roomId, blockId, isPlayer, ignoreBack) @@ -272,8 +272,8 @@ function Map:openBlock(roomId, blockId, isPlayer, ignoreBack)
272 if not ignoreBack then 272 if not ignoreBack then
273 self.adv:backBlockChange(roomId, blockId) 273 self.adv:backBlockChange(roomId, blockId)
274 end 274 end
275 -  
276 end 275 end
  276 + return status
277 end 277 end
278 278
279 function Map:openBlocksBySize(roomId, blockId, size, isPlayer, ignoreBack) 279 function Map:openBlocksBySize(roomId, blockId, size, isPlayer, ignoreBack)
@@ -292,6 +292,41 @@ function Map:openBlocksByRoom(roomId, isPlayer, ignoreBack) @@ -292,6 +292,41 @@ function Map:openBlocksByRoom(roomId, isPlayer, ignoreBack)
292 end 292 end
293 end 293 end
294 294
  295 +function Map:openBlocksIsMonsterByRoom(roomId, count, isPlayer, ignoreBack)
  296 + local room = self.rooms[roomId]
  297 + if not room then return end
  298 +
  299 + local allBlock = {}
  300 + for blockId, block in pairs(room.blocks) do
  301 + if block:isMonster() and not block.isOpen then
  302 + table.insert(allBlock, blockId)
  303 + end
  304 + end
  305 +
  306 + local enemys = {}
  307 + local openBlock = function(blockId)
  308 + if self:openBlock(roomId, blockId, isPlayer, ignoreBack) then
  309 + local e = self.adv.battle:getEnemy(roomId, blockId)
  310 + if e then
  311 + table.insert(enemys, e)
  312 + end
  313 + end
  314 + end
  315 +
  316 + if not count or count == -1 or count >= len(allBlock) then
  317 + for _, blockId in ipairs(allBlock) do
  318 + openBlock(blockId)
  319 + end
  320 + else
  321 + for i = 1, count do
  322 + local idx = math.randomInt(1, len(allBlock))
  323 + openBlock(allBlock[idx])
  324 + table.remove(allBlock, idx)
  325 + end
  326 + end
  327 + return enemys
  328 +end
  329 +
295 function Map:openAllBlocks(isPlayer, ignoreBack) 330 function Map:openAllBlocks(isPlayer, ignoreBack)
296 for roomId, room in pairs(self.rooms) do 331 for roomId, room in pairs(self.rooms) do
297 self:openBlocksByRoom(room.roomId, isPlayer, ignoreBack) 332 self:openBlocksByRoom(room.roomId, isPlayer, ignoreBack)
@@ -309,6 +344,22 @@ function Map:getRBByPos(c, r) @@ -309,6 +344,22 @@ function Map:getRBByPos(c, r)
309 end 344 end
310 end 345 end
311 346
  347 +function Map:getDistance(froomId, fblockId, troomId, tblockId)
  348 + local distance = -1
  349 + local room1 = self.rooms[froomId]
  350 + local room2 = self.rooms[troomId]
  351 + if room1 and room2 then
  352 + local block1 = room1[fblockId]
  353 + local block2 = room2[tblockId]
  354 + if block1 and block2 then
  355 + local c1, r1 = room1:tranLtoG(block1.col, block1.row)
  356 + local c2, r2 = room2:tranLtoG(block2.col, block2.row)
  357 + distance = math.max(math.abs(c1 - c2), math.abs(r1 - r2))
  358 + end
  359 + end
  360 + return distance
  361 +end
  362 +
312 function Map:getAroundBlocks(room, block) 363 function Map:getAroundBlocks(room, block)
313 local blocks = {} 364 local blocks = {}
314 local range = {1, -1} 365 local range = {1, -1}
@@ -412,6 +463,18 @@ function Map:getEnemysBySize(roomId, blockId, size) @@ -412,6 +463,18 @@ function Map:getEnemysBySize(roomId, blockId, size)
412 return enemys 463 return enemys
413 end 464 end
414 465
  466 +function Map:getEventTypeAllMap(eventType)
  467 + local blocks = {}
  468 + if not eventType then return blocks end
  469 + for roomId, room in pairs(self.rooms) do
  470 + for blockId, block in pairs(room.blocks) do
  471 + if block.isOpen and block:getEventType() == eventType then
  472 + table.insert(blocks, block)
  473 + end
  474 + end
  475 + end
  476 + return blocks
  477 +end
415 -----------------------------随机地图----------------------------- 478 -----------------------------随机地图-----------------------------
416 479
417 -- isEnter isNewRelay 区分中继层的类型 --是否是开始进入 是否是第一次进入 480 -- isEnter isNewRelay 区分中继层的类型 --是否是开始进入 是否是第一次进入
src/adv/AdvPassive.lua
@@ -7,6 +7,8 @@ Filter.HP_LOW = 4 -- 血量&lt;value% @@ -7,6 +7,8 @@ Filter.HP_LOW = 4 -- 血量&lt;value%
7 Filter.BUFF_BY_TYPE = 5 -- 指定类型buff 7 Filter.BUFF_BY_TYPE = 5 -- 指定类型buff
8 Filter.BUFF_BY_ID = 6 -- 指定id的buff 8 Filter.BUFF_BY_ID = 6 -- 指定id的buff
9 Filter.CAMP = 7 -- 玩家是指定阵营 9 Filter.CAMP = 7 -- 玩家是指定阵营
  10 +Filter.RANGE = 8 -- 筛选范围 (触发是地块)
  11 +Filter.CLASSIFY = 9 -- 标签
10 12
11 local FilterFactory = {} 13 local FilterFactory = {}
12 FilterFactory[Filter.HP_UP_WITH_EQUAL] = function (_Filter) 14 FilterFactory[Filter.HP_UP_WITH_EQUAL] = function (_Filter)
@@ -46,6 +48,21 @@ FilterFactory[Filter.CAMP] = function (_Filter) @@ -46,6 +48,21 @@ FilterFactory[Filter.CAMP] = function (_Filter)
46 end 48 end
47 end 49 end
48 50
  51 +FilterFactory[Filter.RANGE] = function (_Filter)
  52 + _Filter._execute = function (self, target, params)
  53 + if self.owner.blockId and self.owner.roomId and params.blockId and params.roomId then
  54 + local distance = self.owner.battle.adv:getCurMap():getDistance(self.owner.roomId, self.owner.blockId, params.roomId, params.blockId)
  55 + return distance ~= -1 and distance <= self.value
  56 + end
  57 + return false
  58 + end
  59 +end
  60 +
  61 +FilterFactory[Filter.CLASSIFY] = function (_Filter)
  62 + _Filter._execute = function (self, target)
  63 + return target.isClassify and target:isClassify(self.value)
  64 + end
  65 +end
49 66
50 function Filter:ctor(params) 67 function Filter:ctor(params)
51 self.owner = params.owner 68 self.owner = params.owner
@@ -79,7 +96,7 @@ function Filter:execute(params) @@ -79,7 +96,7 @@ function Filter:execute(params)
79 return 96 return
80 end 97 end
81 if self:_execute(target) then 98 if self:_execute(target) then
82 - return self:_execute(target) 99 + return self:_execute(target, params)
83 end 100 end
84 end 101 end
85 102
@@ -120,6 +137,7 @@ Passive.GET_BUFF = 28 --获得指定buff @@ -120,6 +137,7 @@ Passive.GET_BUFF = 28 --获得指定buff
120 Passive.OPEN_BLOCK = 29 --翻开格子 137 Passive.OPEN_BLOCK = 29 --翻开格子
121 Passive.OPEN_MONSTER = 30 --翻开怪物 138 Passive.OPEN_MONSTER = 30 --翻开怪物
122 Passive.PLAYER_BUFF = 31 --玩家获得buff 139 Passive.PLAYER_BUFF = 31 --玩家获得buff
  140 +
123 Passive.PLAYER_BUFF_CLASSIFY = 35 -- 获得指定标签的buff 141 Passive.PLAYER_BUFF_CLASSIFY = 35 -- 获得指定标签的buff
124 142
125 -- 不同的开启条件 143 -- 不同的开启条件
@@ -442,6 +460,7 @@ end @@ -442,6 +460,7 @@ end
442 460
443 --3=翻开自己所在格子 461 --3=翻开自己所在格子
444 function Passive:effect3(value) 462 function Passive:effect3(value)
  463 + if not self.owner.roomId or not self.owner.blockId then return end
445 if value == 0 then 464 if value == 0 then
446 self.owner.battle.adv:getCurMap():openBlock(self.owner.roomId, self.owner.blockId) 465 self.owner.battle.adv:getCurMap():openBlock(self.owner.roomId, self.owner.blockId)
447 elseif value > 0 then 466 elseif value > 0 then
@@ -494,7 +513,7 @@ function Passive:effect8(dropId) @@ -494,7 +513,7 @@ function Passive:effect8(dropId)
494 skynet.error(string.format("CSVDATA Error adv_map_passive %s effect 8 not id %s in event_drop", self.id, dropId)) 513 skynet.error(string.format("CSVDATA Error adv_map_passive %s effect 8 not id %s in event_drop", self.id, dropId))
495 end 514 end
496 local item = dropData["range"]:randWeight(true) 515 local item = dropData["range"]:randWeight(true)
497 - self.owner.battle.adv:backReward(self.owner.battle.adv:award({[item[1]] = item[2]}, {log = {desc = "passive", int1 = self.id}}), {roomId = self.owner.roomId, blockId = self.owner.blockId}) 516 + self.owner.battle.adv:award({[item[1]] = item[2]}, {log = {desc = "passive", int1 = self.id}}, {roomId = self.owner.roomId, blockId = self.owner.blockId})
498 517
499 end 518 end
500 519
@@ -509,7 +528,7 @@ function Passive:effect9(itemId, triggerPms, ratio, max) @@ -509,7 +528,7 @@ function Passive:effect9(itemId, triggerPms, ratio, max)
509 return 528 return
510 end 529 end
511 if not cond then return end 530 if not cond then return end
512 - self.owner.battle.adv:backReward(self.owner.battle.adv:award({[itemId] = math.floor(math.max(0, math.min(max, cond / ratio)))}, {log = {desc = "passive", int1 = self.id}}), {roomId = self.owner.roomId, blockId = self.owner.blockId}) 531 + self.owner.battle.adv:award({[itemId] = math.floor(math.max(0, math.min(max, cond / ratio)))}, {log = {desc = "passive", int1 = self.id}}, {roomId = self.owner.roomId, blockId = self.owner.blockId})
513 end 532 end
514 533
515 --10=战斗额外掉落次数 534 --10=战斗额外掉落次数
@@ -561,5 +580,22 @@ function Passive:effect14(value, triggerPms, enemyId) @@ -561,5 +580,22 @@ function Passive:effect14(value, triggerPms, enemyId)
561 end 580 end
562 end 581 end
563 582
  583 +--15=翻开房间内的count 个怪 并且增加一个buff
  584 +function Passive:effect15(count, triggerPms, buffId)
  585 + local roomId = self.owner.roomId
  586 + if not roomId then return end
  587 + local enemys = self.owner.battle.adv:getCurMap():openBlocksIsMonsterByRoom(roomId, count)
  588 + for _, e in ipairs(enemys) do
  589 + e:addBuff(buffId)
  590 + end
  591 +end
  592 +
  593 +--16=转变 value 范围内的掉落物 为 id count
  594 +function Passive:effect16(value, triggerPms, changeType)
  595 + if not self.owner.roomId or not self.owner.blockId then return end
  596 + local blocks = self.owner.battle.adv:getCurMap():getBlocksBySize(self.owner.roomId, self.owner.blockId, value)
  597 + self.owner.battle.adv:blockDropChange(changeType, blocks)
  598 +end
  599 +
564 600
565 return Passive 601 return Passive
566 \ No newline at end of file 602 \ No newline at end of file
src/adv/AdvPlayer.lua
@@ -90,6 +90,12 @@ end @@ -90,6 +90,12 @@ end
90 function BaseObject:clear() 90 function BaseObject:clear()
91 self.buffs = {} 91 self.buffs = {}
92 self.passives = {} 92 self.passives = {}
  93 + if self:is("Enemy") then
  94 + self.battle.player:attrChangeCondBuffCheck(3, self:getClassify())
  95 + for _, monster in pairs(self.battle.player:getTeam(2)) do
  96 + monster:attrChangeCondBuffCheck(3, self:getClassify())
  97 + end
  98 + end
93 end 99 end
94 100
95 function BaseObject:addPassive(params) 101 function BaseObject:addPassive(params)
@@ -137,7 +143,21 @@ function BaseObject:getDisablePassiveCount() @@ -137,7 +143,21 @@ function BaseObject:getDisablePassiveCount()
137 return count 143 return count
138 end 144 end
139 145
140 -function BaseObject:addBuff(buffId, releaser) 146 +function BaseObject:getDisableAuraCount()
  147 + local count
  148 + for _, buff in ipairs(self.buffs) do
  149 + if not buff:isHide() and buff:getType() == Buff.DISABLE_AURA then
  150 + if buff:effect() == 0 then
  151 + return 0
  152 + end
  153 + count = (count or 0) + buff:effect()
  154 + end
  155 + end
  156 + return count
  157 +end
  158 +
  159 +function BaseObject:addBuff(buffId, releaser, layer)
  160 + layer = layer or 1
141 local buffData = csvdb["adv_map_buffCsv"][buffId] 161 local buffData = csvdb["adv_map_buffCsv"][buffId]
142 if not buffData then return end 162 if not buffData then return end
143 for _, buff in ipairs(self.buffs) do 163 for _, buff in ipairs(self.buffs) do
@@ -151,7 +171,7 @@ function BaseObject:addBuff(buffId, releaser) @@ -151,7 +171,7 @@ function BaseObject:addBuff(buffId, releaser)
151 local oldBuff = self:getBuffById(buffId) 171 local oldBuff = self:getBuffById(buffId)
152 if oldBuff then 172 if oldBuff then
153 if not oldBuff:checkKeep() then return end 173 if not oldBuff:checkKeep() then return end
154 - oldBuff:overlay(releaser, {}) -- 叠加 174 + oldBuff:overlay(releaser, {}, layer) -- 叠加
155 else 175 else
156 -- 不能保持的buff 也加不上去 176 -- 不能保持的buff 也加不上去
157 if not Buff.checkKeep({ 177 if not Buff.checkKeep({
@@ -161,10 +181,11 @@ function BaseObject:addBuff(buffId, releaser) @@ -161,10 +181,11 @@ function BaseObject:addBuff(buffId, releaser)
161 }) then return end 181 }) then return end
162 local buff = Buff.create(self, releaser, {id = buffId}) 182 local buff = Buff.create(self, releaser, {id = buffId})
163 table.insert(self.buffs, buff) 183 table.insert(self.buffs, buff)
164 - buff:createAfter() 184 + buff:createAfter(layer)
165 end 185 end
166 self:triggerPassive(Passive.GET_BUFF, {trigger = releaser, buffId = buffId}) 186 self:triggerPassive(Passive.GET_BUFF, {trigger = releaser, buffId = buffId})
167 self:triggerPassive(Passive.PLAYER_BUFF_CLASSIFY, {trigger = releaser, classify = buffData.classify}) 187 self:triggerPassive(Passive.PLAYER_BUFF_CLASSIFY, {trigger = releaser, classify = buffData.classify})
  188 + self:attrChangeCondBuffCheck(2, buffId)
168 return true 189 return true
169 end 190 end
170 191
@@ -217,6 +238,44 @@ end @@ -217,6 +238,44 @@ end
217 function BaseObject:reSetSpMax() 238 function BaseObject:reSetSpMax()
218 end 239 end
219 240
  241 +function BaseObject:checkAuraBuff(buffs)
  242 +end
  243 +
  244 +function BaseObject:getAuras()
  245 + local disable = self:getDisableAuraCount()
  246 + local auras = {}
  247 + local function addAura(one)
  248 + if disable > 0 then
  249 + disable = disable - 1
  250 + else
  251 + table.insert(auras, one)
  252 + end
  253 + end
  254 + if self:is("Enemy") then
  255 + local halo = csvdb["event_monsterCsv"][self.monsterId].halo
  256 + if halo then
  257 + for _, one in ipairs(halo:toArray(true, "=")) do
  258 + addAura(one)
  259 + end
  260 + end
  261 + elseif self:is("Build") then
  262 + local halo = csvdb["event_buildingCsv"][self.id].halo
  263 + if halo then
  264 + for _, one in ipairs(halo:toArray(true, "=")) do
  265 + addAura(one)
  266 + end
  267 + end
  268 + end
  269 +
  270 + for _, buff in ipairs(self.buffs) do
  271 + if not buff:isHide() and buff:getType() == Buff.GET_AURA then
  272 + addAura(buff:effect())
  273 + end
  274 + end
  275 +
  276 + return auras
  277 +end
  278 +
220 279
221 -- 通用的buff 效果汇总 -- 0 固定 1百分比 两种分类 280 -- 通用的buff 效果汇总 -- 0 固定 1百分比 两种分类
222 function BaseObject:getCommonBuffEffect(bType, otherCond) 281 function BaseObject:getCommonBuffEffect(bType, otherCond)
@@ -417,7 +476,7 @@ function BaseObject:hurt(value, releaser, params) @@ -417,7 +476,7 @@ function BaseObject:hurt(value, releaser, params)
417 if self.hp == 0 then 476 if self.hp == 0 then
418 self:triggerPassive(Passive.SELF_DEAD) 477 self:triggerPassive(Passive.SELF_DEAD)
419 for _, team in ipairs(self:getTeam(1, true)) do 478 for _, team in ipairs(self:getTeam(1, true)) do
420 - team:triggerPassive(Passive.TEAM_DEAD) 479 + team:triggerPassive(Passive.TEAM_DEAD, {trigger = self})
421 end 480 end
422 481
423 if (params.hurtType == 6 or params.hurtType == 2) and self ~= self.battle.player then 482 if (params.hurtType == 6 or params.hurtType == 2) and self ~= self.battle.player then
@@ -505,6 +564,50 @@ function BaseObject:getTeam(nType, noSelf, mapIdx, includeLock) @@ -505,6 +564,50 @@ function BaseObject:getTeam(nType, noSelf, mapIdx, includeLock)
505 return team 564 return team
506 end 565 end
507 566
  567 +function BaseObject:attrChangeCondBuffCheck(etype, cond)
  568 + local effect = {}
  569 + if etype == 3 then
  570 + if type(cond) ~= "string" then
  571 + return
  572 + end
  573 + local temp = cond:toArray(true, " ")
  574 + cond = {}
  575 + for _, one in pairs(temp) do
  576 + cond[one] = 1
  577 + end
  578 + elseif etype == 4 then
  579 + if not cond then
  580 + cond = {}
  581 + end
  582 + if type(cond) == "number" then
  583 + cond = {[cond] = 1}
  584 + end
  585 + end
  586 + for _, buff in ipairs(self.buffs) do
  587 + if not buff:isHide() and (buff:getType() == Buff.ATTR_CHANGE_COND) then
  588 + local _et, _attr, _co = buff:getEffectBy()
  589 + if etype == _et then
  590 + if etype == 3 or etype == 4 then
  591 + if cond[_co] then
  592 + effect[_attr] = 1
  593 + end
  594 + else
  595 + if (not _co or _co == cond) then
  596 + effect[_attr] = 1
  597 + end
  598 + end
  599 + end
  600 + end
  601 + end
  602 + for attrName, _ in pairs(effect) do
  603 + if attrName == "hp" then
  604 + self:reSetHpMax()
  605 + else
  606 + self:reSetAttr(attrName)
  607 + end
  608 + end
  609 +end
  610 +
508 function BaseObject:getDB() 611 function BaseObject:getDB()
509 local db = {} 612 local db = {}
510 db.hp = self.hp 613 db.hp = self.hp
@@ -557,6 +660,51 @@ function Enemy:isEnemy() @@ -557,6 +660,51 @@ function Enemy:isEnemy()
557 return true 660 return true
558 end 661 end
559 662
  663 +function Enemy:getObstacle()
  664 + local obstacle = csvdb["event_monsterCsv"][self.monsterId].obstacle
  665 + if obstacle == 0 and self:hadBuff(Buff.OBSTACLE_CHANGE) then
  666 + obstacle = 1
  667 + end
  668 + return obstacle
  669 +end
  670 +
  671 +function Enemy:isClassify(check)
  672 + local classify = self:getClassify()
  673 + return classify and classify:sismember(check, " ")
  674 +end
  675 +
  676 +function Enemy:getClassify()
  677 + return csvdb["event_monsterCsv"][self.monsterId].classify
  678 +end
  679 +
  680 +-- 0=所有 1=怪物 2=玩家
  681 +function Enemy:checkAuraBuff(buffs)
  682 + local needBuffs = {}
  683 +
  684 + for buffId, info in pairs(buffs[0] or {}) do
  685 + needBuffs[buffId] = needBuffs[buffId] or {}
  686 + needBuffs[buffId].count = (needBuffs[buffId].count or 0) + info.count
  687 + needBuffs[buffId].exist = info.exist
  688 + end
  689 +
  690 + for buffId, info in pairs(buffs[1] or {}) do
  691 + needBuffs[buffId] = needBuffs[buffId] or {}
  692 + needBuffs[buffId].count = (needBuffs[buffId].count or 0) + info.count
  693 + needBuffs[buffId].exist = info.exist
  694 + end
  695 +
  696 + for buffId, info in pairs(needBuffs) do
  697 + if info.count < 0 then
  698 + local buff = self:getBuffById(buffId)
  699 + if buff then
  700 + buff:uncover(info.exist and -info.count or -1, true)
  701 + end
  702 + elseif count > 0 then
  703 + self:addBuff(buffId, nil, info.count)
  704 + end
  705 + end
  706 +end
  707 +
560 function Enemy:kill() 708 function Enemy:kill()
561 self:hurt(self.hp, self.battle.player, {hurtType = 5}) 709 self:hurt(self.hp, self.battle.player, {hurtType = 5})
562 end 710 end
@@ -569,44 +717,44 @@ end @@ -569,44 +717,44 @@ end
569 717
570 function Player:initData(data) 718 function Player:initData(data)
571 Player.super.initData(self, data) 719 Player.super.initData(self, data)
572 - self.level = data.level or 1 --level 每增加1级 属性增长 growth * baseAttr 720 + -- self.level = data.level or 1 --level 每增加1级 属性增长 growth * baseAttr
573 self.growth = data.growth 721 self.growth = data.growth
574 - self.exp = data.exp or 0 722 + -- self.exp = data.exp or 0
575 self.sp = data.sp or 100 723 self.sp = data.sp or 100
576 self.spMax = data.spMax or 100 724 self.spMax = data.spMax or 100
577 self._spMax = data._spMax or 100 725 self._spMax = data._spMax or 100
578 end 726 end
579 727
580 -function Player:addExp(value)  
581 - -- buff 经验加成  
582 - local up = self:getCommonBuffEffect(Buff.EXP_UP)  
583 - value = math.ceil((value + up[0]) * (1 + up[1]))  
584 -  
585 - if value <= 0 then return end  
586 - local newExp = self.exp + value  
587 - local level = self.level  
588 - if level >= #csvdb["adv_levelCsv"] then return end  
589 - while true do  
590 - local curData = csvdb["adv_levelCsv"][level]  
591 - if newExp < curData.exp then break end  
592 - level = level + 1  
593 - newExp = newExp - curData.exp  
594 - if level >= #csvdb["adv_levelCsv"] then break end  
595 - end  
596 - local delta = level - self.level  
597 -  
598 - self.battle.adv:pushBackEvent(AdvBackEventType.Exp, {delta = value})  
599 -  
600 - if delta > 0 then  
601 - for attr, _ in pairs(AdvAttsEnum) do  
602 - self:addBaseAttr(attr, self.growth[attr] * delta, 0, true)  
603 - end  
604 - self.battle.adv:pushBackEvent(AdvBackEventType.Level, {level = level, delta = delta})  
605 - end  
606 - self.level = level  
607 - self.exp = newExp  
608 - return value  
609 -end 728 +-- function Player:addExp(value)
  729 +-- -- buff 经验加成
  730 +-- local up = self:getCommonBuffEffect(Buff.EXP_UP)
  731 +-- value = math.ceil((value + up[0]) * (1 + up[1]))
  732 +
  733 +-- if value <= 0 then return end
  734 +-- local newExp = self.exp + value
  735 +-- local level = self.level
  736 +-- if level >= #csvdb["adv_levelCsv"] then return end
  737 +-- while true do
  738 +-- local curData = csvdb["adv_levelCsv"][level]
  739 +-- if newExp < curData.exp then break end
  740 +-- level = level + 1
  741 +-- newExp = newExp - curData.exp
  742 +-- if level >= #csvdb["adv_levelCsv"] then break end
  743 +-- end
  744 +-- local delta = level - self.level
  745 +
  746 +-- self.battle.adv:pushBackEvent(AdvBackEventType.Exp, {delta = value})
  747 +
  748 +-- if delta > 0 then
  749 +-- for attr, _ in pairs(AdvAttsEnum) do
  750 +-- self:addBaseAttr(attr, self.growth[attr] * delta, 0, true)
  751 +-- end
  752 +-- self.battle.adv:pushBackEvent(AdvBackEventType.Level, {level = level, delta = delta})
  753 +-- end
  754 +-- self.level = level
  755 +-- self.exp = newExp
  756 +-- return value
  757 +-- end
610 --vtype 0/1 值/% 758 --vtype 0/1 值/%
611 function Player:addBaseAttr(attr, value, vtype, ignoreBack) 759 function Player:addBaseAttr(attr, value, vtype, ignoreBack)
612 local attrName = attr 760 local attrName = attr
@@ -696,7 +844,6 @@ end @@ -696,7 +844,6 @@ end
696 function Player:addBuff(buffId, releaser) 844 function Player:addBuff(buffId, releaser)
697 local status = Player.super.addBuff(self, buffId, releaser) 845 local status = Player.super.addBuff(self, buffId, releaser)
698 if status then 846 if status then
699 - self.battle.player:attrChangeCondBuffCheck(2, buffId)  
700 self.battle.adv:checkAchievement(self.battle.adv.AchievType.GetBuff, 1, buffId) 847 self.battle.adv:checkAchievement(self.battle.adv.AchievType.GetBuff, 1, buffId)
701 self.battle.adv:pushBackEvent(AdvBackEventType.Buff, {buffId = buffId}) 848 self.battle.adv:pushBackEvent(AdvBackEventType.Buff, {buffId = buffId})
702 self.battle:triggerPassive(Passive.PLAYER_BUFF, {buffId = buffId}) 849 self.battle:triggerPassive(Passive.PLAYER_BUFF, {buffId = buffId})
@@ -707,23 +854,30 @@ function Player:addBuff(buffId, releaser) @@ -707,23 +854,30 @@ function Player:addBuff(buffId, releaser)
707 end 854 end
708 return status 855 return status
709 end 856 end
  857 +-- 0=所有 1=怪物 2=玩家
  858 +function Player:checkAuraBuff(buffs)
  859 + local needBuffs = {}
710 860
711 -function Player:attrChangeCondBuffCheck(etype, cond)  
712 - local effect = {}  
713 - for _, buff in ipairs(self.buffs) do  
714 - if not buff:isHide() and (buff:getType() == Buff.ATTR_CHANGE_COND) then  
715 - local _et, _attr, _co = buff:getEffectBy()  
716 - if etype == _et and (not _co or _co == cond) then  
717 - effect[_attr] = 1  
718 - end  
719 -  
720 - end 861 + for buffId, info in pairs(buffs[0] or {}) do
  862 + needBuffs[buffId] = needBuffs[buffId] or {}
  863 + needBuffs[buffId].count = (needBuffs[buffId].count or 0) + info.count
  864 + needBuffs[buffId].exist = info.exist
721 end 865 end
722 - for attrName, _ in pairs(effect) do  
723 - if attrName == "hp" then  
724 - self:reSetHpMax()  
725 - else  
726 - self:reSetAttr(attrName) 866 +
  867 + for buffId, info in pairs(buffs[2] or {}) do
  868 + needBuffs[buffId] = needBuffs[buffId] or {}
  869 + needBuffs[buffId].count = (needBuffs[buffId].count or 0) + info.count
  870 + needBuffs[buffId].exist = info.exist
  871 + end
  872 +
  873 + for buffId, info in pairs(needBuffs) do
  874 + if info.count < 0 then
  875 + local buff = self:getBuffById(buffId)
  876 + if buff then
  877 + buff:uncover(info.exist and -info.count or -1, true)
  878 + end
  879 + elseif info.count > 0 then
  880 + self:addBuff(buffId, nil, info.count)
727 end 881 end
728 end 882 end
729 end 883 end
@@ -734,7 +888,8 @@ end @@ -734,7 +888,8 @@ end
734 888
735 function Player:getDB() 889 function Player:getDB()
736 local db = Player.super.getDB(self) 890 local db = Player.super.getDB(self)
737 - for _ , field in pairs({"level", "exp", "growth", "sp", "spMax"}) do 891 + -- for _ , field in pairs({"level", "exp", "growth", "sp", "spMax"}) do
  892 + for _ , field in pairs({"level", "growth", "sp", "spMax"}) do
738 db[field] = self[field] 893 db[field] = self[field]
739 end 894 end
740 db["_spMax"] = self._spMax 895 db["_spMax"] = self._spMax
1 -Subproject commit 02a9bbbb10bb99a91cc5d67f62dc7e5b49d8cb46 1 +Subproject commit a2598231ccc5e16da1a27f976602871f30fcd035
src/models/Hero.lua
@@ -15,6 +15,7 @@ Hero.schema = { @@ -15,6 +15,7 @@ Hero.schema = {
15 -- loveL = {"number", 0}, --好感度等级 15 -- loveL = {"number", 0}, --好感度等级
16 equip = {"string",""}, --装备 type=level 16 equip = {"string",""}, --装备 type=level
17 rune = {"string",""}, --零件 type=id 17 rune = {"string",""}, --零件 type=id
  18 + faith = {"number", 0}, -- 信赖
18 } 19 }
19 20
20 function Hero:ctor( properties ) 21 function Hero:ctor( properties )
@@ -102,6 +103,7 @@ function Hero:data() @@ -102,6 +103,7 @@ function Hero:data()
102 -- loveL = self:getProperty("loveL"), 103 -- loveL = self:getProperty("loveL"),
103 equip = self:getProperty("equip"), 104 equip = self:getProperty("equip"),
104 rune = self:getProperty("rune"), 105 rune = self:getProperty("rune"),
  106 + faith = self:getProperty("faith")
105 } 107 }
106 end 108 end
107 109
@@ -113,4 +115,8 @@ function Hero:getRare() @@ -113,4 +115,8 @@ function Hero:getRare()
113 return csvdb["unitCsv"][self:getProperty("type")].rare 115 return csvdb["unitCsv"][self:getProperty("type")].rare
114 end 116 end
115 117
  118 +function Hero:getPosition()
  119 + return csvdb["unitCsv"][self:getProperty("type")].position
  120 +end
  121 +
116 return Hero 122 return Hero
117 \ No newline at end of file 123 \ No newline at end of file
src/models/HeroPlugin.lua
@@ -48,30 +48,29 @@ function HeroPlugin.bind(Hero) @@ -48,30 +48,29 @@ function HeroPlugin.bind(Hero)
48 local breakL = params.breakL or self:getProperty("breakL") 48 local breakL = params.breakL or self:getProperty("breakL")
49 local wakeL = params.wakeL or self:getProperty("wakeL") 49 local wakeL = params.wakeL or self:getProperty("wakeL")
50 local talent = params.talent or self:getProperty("talent") 50 local talent = params.talent or self:getProperty("talent")
51 - 51 + local heroCfgId = self:getProperty("type")
52 --天赋 52 --天赋
53 local talentAttrS = {} 53 local talentAttrS = {}
54 54
55 -- 四个基础属性 55 -- 四个基础属性
56 local curData = csvdb["unit_talentCsv"][talent:getv(0, 1)] 56 local curData = csvdb["unit_talentCsv"][talent:getv(0, 1)]
  57 + local curTalentLvl = 0
57 if not curData then -- 已经满阶段了 58 if not curData then -- 已经满阶段了
58 - curData = csvdb["unit_talentCsv"][#csvdb["unit_talentCsv"]]  
59 - local strength = curData[#curData].strength  
60 - for i = 1, 4 do  
61 - talentAttrS[TalentAttsEnumEx[i]] = (talentAttrS[TalentAttsEnumEx[i]] or 0) + strength  
62 - end 59 + local cfgName = "unit_talent_"..heroCfgId.."Csv"
  60 + curData = csvdb[cfgName][#csvdb[cfgName]]
63 else 61 else
64 - for i = 1, 4 do --4个天赋  
65 - talentAttrS[TalentAttsEnumEx[i]] = (talentAttrS[TalentAttsEnumEx[i]] or 0) + curData[talent:getv(i, 0)].strength  
66 - end 62 + curTalentLvl = talent:getv(1, 1)
67 end 63 end
68 - --阶段属性  
69 - for i = 1, (talent:getv(0, 1) - 1) do  
70 - local curData = csvdb["unit_talentCsv"][i]  
71 - local effect = curData[#curData].effect:toArray(true, "=")  
72 - talentAttrS[AttsEnumEx[effect[1]]] = (talentAttrS[AttsEnumEx[effect[1]]] or 0) + effect[2] 64 + for lvl, cfg in pairs(curData) do
  65 + if lvl < curTalentLvl or curTalentLvl == 0 then
  66 + if cfg.effect ~= 99 then
  67 + local curVal = talentAttrS[cfg.effect] or 0
  68 + if curVal < cfg.strength then
  69 + talentAttrS[cfg.effect] = cfg.strength
  70 + end
  71 + end
  72 + end
73 end 73 end
74 -  
75 74
76 for _, attrName in pairs(AttsEnumEx) do 75 for _, attrName in pairs(AttsEnumEx) do
77 if talentAttrS[attrName] then 76 if talentAttrS[attrName] then
@@ -79,6 +78,22 @@ function HeroPlugin.bind(Hero) @@ -79,6 +78,22 @@ function HeroPlugin.bind(Hero)
79 end 78 end
80 end 79 end
81 80
  81 + -- 信赖属性
  82 + local faithAttr = {}
  83 + local faith = self:getProperty("faith")
  84 + local faithConfig = csvdb["unit_trustCsv"]
  85 + for lvl = 1, #faithConfig do
  86 + if faith >= faithConfig[lvl].exp then
  87 + local add = faithConfig[lvl]["position_"..unitData.position]:toArray(true, "=")
  88 + faithAttr[add[1]] = (faithAttr[add[1]] or 0) + add[2]
  89 + end
  90 + end
  91 + for _, attrName in pairs(AttsEnumEx) do
  92 + if faithAttr[attrName] then
  93 + faithAttr[attrName] = addAttr(unitData[attrName], faithAttr[attrName], 1, attrName)
  94 + end
  95 + end
  96 +
82 local attrs = {} 97 local attrs = {}
83 for _, attName in pairs(AttsEnumEx) do 98 for _, attName in pairs(AttsEnumEx) do
84 attrs[attName] = unitData[attName] or 0 99 attrs[attName] = unitData[attName] or 0
@@ -90,7 +105,7 @@ function HeroPlugin.bind(Hero) @@ -90,7 +105,7 @@ function HeroPlugin.bind(Hero)
90 for attr, value in pairs(attrs) do 105 for attr, value in pairs(attrs) do
91 attrs[attr] = attrs[attr] + addAttr(attrs[attr], lData[attr .. "Level"], 1, attr) 106 attrs[attr] = attrs[attr] + addAttr(attrs[attr], lData[attr .. "Level"], 1, attr)
92 attrs[attr] = attrs[attr] + addAttr(attrs[attr], blData[attr .. "Level"], 1, attr) 107 attrs[attr] = attrs[attr] + addAttr(attrs[attr], blData[attr .. "Level"], 1, attr)
93 - attrs[attr] = attrs[attr] + addAttr(attrs[attr], wData[attr .. "Level"], 1, attr) + (talentAttrS[attr] or 0) 108 + attrs[attr] = attrs[attr] + addAttr(attrs[attr], wData[attr .. "Level"], 1, attr) + (talentAttrS[attr] or 0) + (faithAttr[attr] or 0)
94 end 109 end
95 110
96 return attrs 111 return attrs
@@ -237,6 +252,37 @@ function HeroPlugin.bind(Hero) @@ -237,6 +252,37 @@ function HeroPlugin.bind(Hero)
237 return level 252 return level
238 end 253 end
239 254
  255 + -- 天赋获得的技能
  256 + function Hero:getTalentSkill()
  257 + local TalentEnum = {
  258 + [1] = 1, -- 血量
  259 + [2] = 2, -- 攻击
  260 + [3] = 3, -- 物理防御
  261 + [4] = 4, -- 命中
  262 + [5] = 5, -- 闪避
  263 + }
  264 + local talentCsv = csvdb["unit_talent_" .. self:getProperty("type") .. "Csv"]
  265 + local curLv = self:getProperty("talent"):getv(1,1) - 1
  266 + local curRan = self:getProperty("talent"):getv(0,1)
  267 + local skills = {}
  268 + for ran, data in ipairs(talentCsv) do
  269 + if ran <= curRan then
  270 + for lv, value in ipairs(data) do
  271 + if ran < curRan or lv <= curLv then
  272 + if not TalentEnum[value.effect] then
  273 + skills[value.strength] = true
  274 + end
  275 + else
  276 + break
  277 + end
  278 + end
  279 + else
  280 + break
  281 + end
  282 + end
  283 + return skills
  284 + end
  285 +
240 function Hero:getSkillData(idx) 286 function Hero:getSkillData(idx)
241 local unitData = csvdb["unitCsv"][self:getProperty("type")] 287 local unitData = csvdb["unitCsv"][self:getProperty("type")]
242 if idx == 1 then 288 if idx == 1 then
@@ -296,6 +342,27 @@ function HeroPlugin.bind(Hero) @@ -296,6 +342,27 @@ function HeroPlugin.bind(Hero)
296 end 342 end
297 return 343 return
298 end 344 end
  345 +
  346 + -- 添加英雄信赖
  347 + function Hero:addHeroFaith(exp)
  348 + local faith = self:getProperty("faith")
  349 + local config = csvdb["unit_trustCsv"]
  350 + local star = self:getProperty("wakeL")
  351 + local tmpExp = faith + exp
  352 + for lvl = 1, #config do
  353 + if star < config[lvl].star then
  354 + break
  355 + end
  356 + if tmpExp < config[lvl].exp then
  357 + faith = tmpExp
  358 + break
  359 + else
  360 + faith = config[lvl].exp
  361 + end
  362 + end
  363 + self:setProperty("faith", faith)
  364 + end
  365 +
299 end 366 end
300 367
301 368
src/models/Role.lua
@@ -103,7 +103,6 @@ Role.schema = { @@ -103,7 +103,6 @@ Role.schema = {
103 --挂机相关 103 --挂机相关
104 hangPass = {"table", {}}, -- 挂机通过的最大关卡 104 hangPass = {"table", {}}, -- 挂机通过的最大关卡
105 hangGift = {"table", {}}, -- 挂机奖励 {id = 1} 105 hangGift = {"table", {}}, -- 挂机奖励 {id = 1}
106 - hangTeam = {"table", {}}, -- 挂机队伍  
107 hangTS = {"table", {}}, -- 挂机队伍他人可读的队伍信息 106 hangTS = {"table", {}}, -- 挂机队伍他人可读的队伍信息
108 hangTB = {"table", {}}, -- 挂机队伍他人可用的战斗信息mao 107 hangTB = {"table", {}}, -- 挂机队伍他人可用的战斗信息mao
109 hangTBV = {"number", 0}, -- 挂机队伍他人可用的战斗力 108 hangTBV = {"number", 0}, -- 挂机队伍他人可用的战斗力
@@ -111,8 +110,11 @@ Role.schema = { @@ -111,8 +110,11 @@ Role.schema = {
111 hangInfo = {"table", {}}, -- 当前挂机信息 110 hangInfo = {"table", {}}, -- 当前挂机信息
112 hangBag = {"table", {}}, -- 背包 111 hangBag = {"table", {}}, -- 背包
113 hangBagLimit = {"number", globalCsv.idle_field_origin}, --背包上限 112 hangBagLimit = {"number", globalCsv.idle_field_origin}, --背包上限
114 - bTeam = {"table", {}}, -- 奖励副本队伍  
115 - heroFormate = {"table", {}}, -- 自选编队 {adv={}, hang={}} 113 + hangTeams = {"table", {}}, -- pve自选编队
  114 + teamIndex = {"table", {}}, -- 各个系统使用的编队索引 type->index 见TeamSystemType
  115 + advTeams = {"table", {}}, -- 拾荒自选编队
  116 +
  117 + bonusStar = {"table", {}}, -- 奖励关卡 通关星星 {[id] = 1} 三个二进制位 表示三个星 从低到高 (1 << 0) (1 << 1) (1 << 2) 满星 (1 << 3) - 1
116 118
117 --引导相关 119 --引导相关
118 newerGuide = {"string","1=1"}, -- 新手引导 master=slave 120 newerGuide = {"string","1=1"}, -- 新手引导 master=slave
@@ -143,7 +145,6 @@ Role.schema = { @@ -143,7 +145,6 @@ Role.schema = {
143 boxL = {"table", {}}, -- boxList 正开启的箱子 -- {[1] = {id = 1010, gem = 101, time = 1313}} 145 boxL = {"table", {}}, -- boxList 正开启的箱子 -- {[1] = {id = 1010, gem = 101, time = 1313}}
144 146
145 towerInfo = {"table", {c = globalCsv.tower_count_limit, l = 1}}, -- 当天爬塔消耗的次数 -- {t = time, c = count, l = layer, k = battleKey} 147 towerInfo = {"table", {c = globalCsv.tower_count_limit, l = 1}}, -- 当天爬塔消耗的次数 -- {t = time, c = count, l = layer, k = battleKey}
146 - towerF = {"table", {}}, -- 爬塔阵容  
147 148
148 spTask = {"table", {}}, -- 特殊任务 -- {id = status} 149 spTask = {"table", {}}, -- 特殊任务 -- {id = status}
149 150
@@ -179,6 +180,7 @@ Role.schema = { @@ -179,6 +180,7 @@ Role.schema = {
179 feedback = {"table", {}}, -- 反馈相关信息 {flag = false, count = 0} flag是否评论过,count 提示次数 180 feedback = {"table", {}}, -- 反馈相关信息 {flag = false, count = 0} flag是否评论过,count 提示次数
180 181
181 calTask = {"table", {}}, -- 英雄令活动 日历任务活动 182 calTask = {"table", {}}, -- 英雄令活动 日历任务活动
  183 + radioTask = {"table", {}}, -- 电台任务 {id = {time=end_ts,heros=heros}} 表crusadeCsv
182 } 184 }
183 185
184 186
@@ -354,11 +356,14 @@ function Role:data() @@ -354,11 +356,14 @@ function Role:data()
354 356
355 hangPass = self:getProperty("hangPass"), 357 hangPass = self:getProperty("hangPass"),
356 hangGift = self:getProperty("hangGift"), 358 hangGift = self:getProperty("hangGift"),
357 - hangTeam = self:getProperty("hangTeam"),  
358 hangInfo = self:getProperty("hangInfo"), 359 hangInfo = self:getProperty("hangInfo"),
359 hangBag = self:getProperty("hangBag"), 360 hangBag = self:getProperty("hangBag"),
360 hangBagLimit = self:getProperty("hangBagLimit"), 361 hangBagLimit = self:getProperty("hangBagLimit"),
361 - bTeam = self:getProperty("bTeam"), 362 + hangTeams = self:getProperty("hangTeams"),
  363 + teamIndex = self:getProperty("teamIndex"),
  364 + advTeams = self:getProperty("advTeams"),
  365 +
  366 + bonusStar = self:getProperty("bonusStar"),
362 367
363 newerGuide = self:getProperty("newerGuide"), 368 newerGuide = self:getProperty("newerGuide"),
364 funcGuide = self:getProperty("funcGuide"), 369 funcGuide = self:getProperty("funcGuide"),
@@ -374,7 +379,6 @@ function Role:data() @@ -374,7 +379,6 @@ function Role:data()
374 equips = self:getProperty("equips"), 379 equips = self:getProperty("equips"),
375 boxL = self:getProperty("boxL"), 380 boxL = self:getProperty("boxL"),
376 towerInfo = self:getProperty("towerInfo"), 381 towerInfo = self:getProperty("towerInfo"),
377 - towerF = self:getProperty("towerF"),  
378 spTask = self:getProperty("spTask"), 382 spTask = self:getProperty("spTask"),
379 dTask = self:getProperty("dTask"), 383 dTask = self:getProperty("dTask"),
380 wTask = self:getProperty("wTask"), 384 wTask = self:getProperty("wTask"),
@@ -401,6 +405,7 @@ function Role:data() @@ -401,6 +405,7 @@ function Role:data()
401 feedback = self:getProperty("feedback"), 405 feedback = self:getProperty("feedback"),
402 ctime = self:getProperty("ctime"), 406 ctime = self:getProperty("ctime"),
403 calTask = self:getProperty("calTask"), 407 calTask = self:getProperty("calTask"),
  408 + radioTask = self:getProperty("radioTask"),
404 } 409 }
405 end 410 end
406 411
src/models/RoleBattle.lua
@@ -57,7 +57,7 @@ function Role:checkBattle(battleType, params) @@ -57,7 +57,7 @@ function Role:checkBattle(battleType, params)
57 end 57 end
58 end, 58 end,
59 tower = function() 59 tower = function()
60 - local towerF = self:getProperty("towerF") 60 + local towerF = self:getTeamFormatByType(TeamSystemType.Tower)
61 for slot, hero in pairs(self:getTeamHerosInfo(towerF.heros)) do 61 for slot, hero in pairs(self:getTeamHerosInfo(towerF.heros)) do
62 selflist[slot] = hero.type 62 selflist[slot] = hero.type
63 end 63 end
@@ -72,7 +72,7 @@ function Role:checkBattle(battleType, params) @@ -72,7 +72,7 @@ function Role:checkBattle(battleType, params)
72 end 72 end
73 end, 73 end,
74 bonus = function() 74 bonus = function()
75 - local bTeam = self:getProperty("bTeam") 75 + local bTeam = self:getTeamFormatByType(TeamSystemType.BonusBattle)
76 for slot, hero in pairs(self:getTeamHerosInfo(bTeam.heros)) do 76 for slot, hero in pairs(self:getTeamHerosInfo(bTeam.heros)) do
77 selflist[slot] = hero.type 77 selflist[slot] = hero.type
78 end 78 end
src/models/RoleLog.lua
@@ -107,6 +107,8 @@ local ItemReason = { @@ -107,6 +107,8 @@ local ItemReason = {
107 unlockPool = 1208, -- 解锁英雄定向抽卡池 107 unlockPool = 1208, -- 解锁英雄定向抽卡池
108 downloadCv = 1209, -- 下载 cv包奖励 108 downloadCv = 1209, -- 下载 cv包奖励
109 refer = 1210, -- 穿戴 109 refer = 1210, -- 穿戴
  110 + itemCompose = 1211, -- 天赋道具合成
  111 + radioQuest = 1212, -- 电台任务奖励
110 112
111 -- pvp 113 -- pvp
112 pvpCHead = 1301, -- pvp 跨服竞技场头像 114 pvpCHead = 1301, -- pvp 跨服竞技场头像
src/models/RolePlugin.lua
@@ -64,6 +64,9 @@ function RolePlugin.bind(Role) @@ -64,6 +64,9 @@ function RolePlugin.bind(Role)
64 [ItemId.PlayerExp] = function() 64 [ItemId.PlayerExp] = function()
65 self:addPlayExp(count, pms) 65 self:addPlayExp(count, pms)
66 end, 66 end,
  67 + [ItemId.AdvPower] = function()
  68 + self:changeAdvCount(-count)
  69 + end,
67 } 70 }
68 71
69 local itemTypeAward = { 72 local itemTypeAward = {
@@ -1132,7 +1135,7 @@ function RolePlugin.bind(Role) @@ -1132,7 +1135,7 @@ function RolePlugin.bind(Role)
1132 local now = skynet.timex() 1135 local now = skynet.timex()
1133 local ct = math.ceil((now - StdTowerRankTime) / 86400) --按天计算 365 * 27 < 10000 可以维持 27 年 1136 local ct = math.ceil((now - StdTowerRankTime) / 86400) --按天计算 365 * 27 < 10000 可以维持 27 年
1134 local ct = 10000 - ct -- 越早的排名越靠前 1137 local ct = 10000 - ct -- 越早的排名越靠前
1135 - local towerTeam = self:getProperty("towerF") 1138 + local towerTeam = self:getTeamFormatByType(TeamSystemType.Tower)
1136 local battleV = self:getTeamBattleValue(towerTeam.heros) 1139 local battleV = self:getTeamBattleValue(towerTeam.heros)
1137 local score = (level * 10000 + ct) * 10000000 + battleV 1140 local score = (level * 10000 + ct) * 10000000 + battleV
1138 1141
@@ -1279,11 +1282,13 @@ function RolePlugin.bind(Role) @@ -1279,11 +1282,13 @@ function RolePlugin.bind(Role)
1279 info.specialLevel = hero:getSkillLevel(1) 1282 info.specialLevel = hero:getSkillLevel(1)
1280 info.passiveLevel = hero:getSkillLevel(3) 1283 info.passiveLevel = hero:getSkillLevel(3)
1281 info.runeSkill = hero:getRuneSkill(102) 1284 info.runeSkill = hero:getRuneSkill(102)
  1285 + info.talentSkills = hero:getTalentSkill()
1282 teamInfo.heros[slot] = info 1286 teamInfo.heros[slot] = info
1283 end 1287 end
1284 for slot, id in pairs(team.supports or {}) do 1288 for slot, id in pairs(team.supports or {}) do
1285 teamInfo.supports[slot] = {id, self.dinerData:getProperty("dishTree"):getv(id, 0)} 1289 teamInfo.supports[slot] = {id, self.dinerData:getProperty("dishTree"):getv(id, 0)}
1286 end 1290 end
  1291 + teamInfo.tactics = globalCsv.tactics_skill_passive_cell[team.tactics] and team.tactics or nil
1287 return teamInfo 1292 return teamInfo
1288 end 1293 end
1289 1294
@@ -1310,13 +1315,10 @@ function RolePlugin.bind(Role) @@ -1310,13 +1315,10 @@ function RolePlugin.bind(Role)
1310 return self:getRealBattleValue(heros) 1315 return self:getRealBattleValue(heros)
1311 end 1316 end
1312 1317
1313 - -- 不传参数 只修改保存的阵容信息  
1314 - function Role:saveHangTeam(team)  
1315 - if not team then  
1316 - team = self:getProperty("hangTeam")  
1317 - else  
1318 - self:updateProperty({field = "hangTeam", value = team})  
1319 - end 1318 + function Role:updateHangTeamInfo()
  1319 + local team = self:getTeamFormatByType(TeamSystemType.Hang)
  1320 + if not team then return end
  1321 +
1320 self:setProperties({ 1322 self:setProperties({
1321 hangTS = self:getTeamHerosInfo(team.heros), 1323 hangTS = self:getTeamHerosInfo(team.heros),
1322 hangTB = self:getTeamBattleInfo(team), 1324 hangTB = self:getTeamBattleInfo(team),
@@ -1324,6 +1326,41 @@ function RolePlugin.bind(Role) @@ -1324,6 +1326,41 @@ function RolePlugin.bind(Role)
1324 }) 1326 })
1325 end 1327 end
1326 1328
  1329 + -- 设置pve阵容
  1330 + function Role:getTeamFormat(index)
  1331 + local teams = self:getProperty("hangTeams") or {}
  1332 + local team = teams[index] or {}
  1333 + return team
  1334 + end
  1335 +
  1336 + function Role:getTeamFormatByType(type)
  1337 + local teamIndex = self:getProperty("teamIndex") or {}
  1338 + local index = teamIndex[type]
  1339 + if not index then return {} end
  1340 +
  1341 + return self:getTeamFormat(index)
  1342 + end
  1343 +
  1344 + function Role:setTeamFormat(index, team)
  1345 + local teams = self:getProperty("hangTeams") or {}
  1346 + teams[index] = team
  1347 + self:updateProperty({field = "hangTeams", value = teams, notNotify = false})
  1348 + end
  1349 +
  1350 + -- 设置拾荒编队阵容
  1351 + function Role:getAdvTeamFormat(index)
  1352 + local teams = self:getProperty("advTeams") or {}
  1353 + local team = teams[index] or {}
  1354 + return team
  1355 + end
  1356 +
  1357 + function Role:setAdvTeamFormat(index, team)
  1358 + local teams = self:getProperty("advTeams") or {}
  1359 + teams[index] = team
  1360 + self:updateProperty({field = "advTeams", value = teams, notNotify = false})
  1361 + end
  1362 +
  1363 +
1327 function Role:savePvpCTeam(team) 1364 function Role:savePvpCTeam(team)
1328 if not team then 1365 if not team then
1329 team = self:getProperty("pvpTC") 1366 team = self:getProperty("pvpTC")
src/models/RoleTask.lua
@@ -33,7 +33,7 @@ local TaskType = { @@ -33,7 +33,7 @@ local TaskType = {
33 HangQuick = 303, -- 快速挂机 33 HangQuick = 303, -- 快速挂机
34 HangBattle = 304, -- 挂机战斗 - id 34 HangBattle = 304, -- 挂机战斗 - id
35 HangGetGold = 305, -- 挂机获得齿轮 - count 35 HangGetGold = 305, -- 挂机获得齿轮 - count
36 - BonusPass = 306, -- 奖励副本通关 - id 36 + BonusPass = 306, -- 奖励副本通关 - id count
37 37
38 -- 冒险相关 38 -- 冒险相关
39 AdvPass = 401, -- 冒险通过关 - id level score 39 AdvPass = 401, -- 冒险通过关 - id level score
@@ -142,7 +142,7 @@ local CommonListener = { @@ -142,7 +142,7 @@ local CommonListener = {
142 [TaskType.GiveFriendP] = {{20, f("count")}}, 142 [TaskType.GiveFriendP] = {{20, f("count")}},
143 [TaskType.UnionBoss] = {{21}}, 143 [TaskType.UnionBoss] = {{21}},
144 [TaskType.GetFriendP] = {{22, f("count")}}, 144 [TaskType.GetFriendP] = {{22, f("count")}},
145 - [TaskType.BonusPass] = {{23}}, 145 + [TaskType.BonusPass] = {{23, f("count")}},
146 [TaskType.AdvStartSelf] = {{24}}, 146 [TaskType.AdvStartSelf] = {{24}},
147 [TaskType.ShopAll] = {{25, f("count")}}, 147 [TaskType.ShopAll] = {{25, f("count")}},
148 [TaskType.RuneUp] = {{26}}, 148 [TaskType.RuneUp] = {{26}},
@@ -244,7 +244,7 @@ local CalendaTaskListener = { @@ -244,7 +244,7 @@ local CalendaTaskListener = {
244 func = "checkCalendaTask", 244 func = "checkCalendaTask",
245 listen = { 245 listen = {
246 [TaskType.DrawHero] = {{1, 1, f("count")}}, 246 [TaskType.DrawHero] = {{1, 1, f("count")}},
247 - [TaskType.BonusPass]= {{2, 1}}, 247 + [TaskType.BonusPass]= {{2, 1, f("count")}},
248 [TaskType.AdvStart]= {{3, 1}}, 248 [TaskType.AdvStart]= {{3, 1}},
249 [TaskType.DinerLevelUp]= {{4, 2, f("level")}}, 249 [TaskType.DinerLevelUp]= {{4, 2, f("level")}},
250 [TaskType.HeroLvlCollect]= {{5, 3}}, -- x名y级英雄 250 [TaskType.HeroLvlCollect]= {{5, 3}}, -- x名y级英雄