Commit 4ae70ca271b5d0b5fa721ab523e6a8d14b1c83ec
Merge branch 'develop' into tr/publish
Showing
20 changed files
with
726 additions
and
297 deletions
Show diff stats
src/GlobalVar.lua
@@ -214,6 +214,7 @@ AdvBackEventType = { | @@ -214,6 +214,7 @@ AdvBackEventType = { | ||
214 | Level = 25, -- 升级 | 214 | Level = 25, -- 升级 |
215 | LinkChooseOver = 26, -- 连锁事件结束 | 215 | LinkChooseOver = 26, -- 连锁事件结束 |
216 | BuffEffect = 27, -- buff 效果 | 216 | BuffEffect = 27, -- buff 效果 |
217 | + PassiveEffect = 28, -- 被动 效果 | ||
217 | } | 218 | } |
218 | 219 | ||
219 | AdvScoreType = { | 220 | AdvScoreType = { |
src/ProtocolCode.lua
@@ -221,6 +221,8 @@ actionCodes = { | @@ -221,6 +221,8 @@ actionCodes = { | ||
221 | Activity_actCalendaTaskRpc = 655, | 221 | Activity_actCalendaTaskRpc = 655, |
222 | Activity_actPaySignRpc = 656, | 222 | Activity_actPaySignRpc = 656, |
223 | Activity_exchangeRpc = 657, | 223 | Activity_exchangeRpc = 657, |
224 | + Activity_gachakonRpc = 658, | ||
225 | + Activity_hangDropRpc = 659, | ||
224 | 226 | ||
225 | Radio_startQuestRpc = 700, | 227 | Radio_startQuestRpc = 700, |
226 | Radio_finishQuestRpc = 701, | 228 | Radio_finishQuestRpc = 701, |
src/actions/ActivityAction.lua
@@ -268,7 +268,7 @@ function _M.exchangeRpc(agent, data) | @@ -268,7 +268,7 @@ function _M.exchangeRpc(agent, data) | ||
268 | local msg = MsgPack.unpack(data) | 268 | local msg = MsgPack.unpack(data) |
269 | local actid = msg.actid | 269 | local actid = msg.actid |
270 | local id = msg.id | 270 | local id = msg.id |
271 | - if not role.activity:isOpen("Exchange") then return 1 end | 271 | + if not role.activity:isOpenById(actid) then return 1 end |
272 | 272 | ||
273 | local exchangeCfg = csvdb["activity_exchangeCsv"][actid] | 273 | local exchangeCfg = csvdb["activity_exchangeCsv"][actid] |
274 | if not exchangeCfg then return 2 end | 274 | if not exchangeCfg then return 2 end |
@@ -277,7 +277,8 @@ function _M.exchangeRpc(agent, data) | @@ -277,7 +277,8 @@ function _M.exchangeRpc(agent, data) | ||
277 | local exchangeData = curData[actid] or {} | 277 | local exchangeData = curData[actid] or {} |
278 | local curCount = exchangeData[id] or 0 | 278 | local curCount = exchangeData[id] or 0 |
279 | local actCfg = exchangeCfg[id] | 279 | local actCfg = exchangeCfg[id] |
280 | - if curCount >= actCfg then return 4 end | 280 | + local limitArr = actCfg.limit:toArray(true, "=") |
281 | + if curCount >= limitArr[2] then return 4 end | ||
281 | 282 | ||
282 | local costs = actCfg.goods:toNumMap() | 283 | local costs = actCfg.goods:toNumMap() |
283 | if not role:checkItemEnough(costs) then return 5 end | 284 | if not role:checkItemEnough(costs) then return 5 end |
@@ -295,4 +296,123 @@ function _M.exchangeRpc(agent, data) | @@ -295,4 +296,123 @@ function _M.exchangeRpc(agent, data) | ||
295 | return true | 296 | return true |
296 | end | 297 | end |
297 | 298 | ||
299 | +function _M.gachakonRpc(agent, data) | ||
300 | + local role = agent.role | ||
301 | + local msg = MsgPack.unpack(data) | ||
302 | + local actid = msg.actid | ||
303 | + local count = msg.count | ||
304 | + | ||
305 | + if count > 10 then return end | ||
306 | + | ||
307 | + if not role.activity:isOpenById(actid) then return 1 end | ||
308 | + | ||
309 | + local actCtrlData = csvdb["activity_ctrlCsv"][actid] | ||
310 | + if not actCtrlData then return 2 end | ||
311 | + local cost = actCtrlData.condition2:toNumMap() | ||
312 | + | ||
313 | + local actCfg = csvdb["activity_capsuleToysCsv"][actid] | ||
314 | + if not actCfg then return 3 end | ||
315 | + | ||
316 | + local gachakonInfo = role.activity:getActData("Gachakon") or {} | ||
317 | + local award = {} | ||
318 | + local remain = 0 | ||
319 | + for i = 1, count do | ||
320 | + local tmpCfg = clone(actCfg) | ||
321 | + remain = 0 | ||
322 | + print("-----------------, ", i) | ||
323 | + for id, cfg in pairs(tmpCfg) do | ||
324 | + local num = gachakonInfo[id] or 0 | ||
325 | + num = cfg.amount >= num and cfg.amount - num or 0 | ||
326 | + cfg.weight = cfg.weight * num | ||
327 | + if cfg.weight > 0 then | ||
328 | + remain = remain + num | ||
329 | + end | ||
330 | + print("num ".. num, id, cfg.weight, cfg.amount) | ||
331 | + end | ||
332 | + if remain == 0 then | ||
333 | + break | ||
334 | + end | ||
335 | + local id = math.randWeight(tmpCfg, "weight") | ||
336 | + if not id then return 4 end | ||
337 | + gachakonInfo[id] = (gachakonInfo[id] or 0) + 1 | ||
338 | + local curAward = tmpCfg[id].award:toNumMap() | ||
339 | + for k, v in pairs(curAward) do | ||
340 | + award[k] = (award[k] or 0) + v | ||
341 | + end | ||
342 | + end | ||
343 | + | ||
344 | + for k, v in pairs(cost) do | ||
345 | + cost[k] = v * count | ||
346 | + end | ||
347 | + | ||
348 | + if not role:checkItemEnough(cost) then return 5 end | ||
349 | + | ||
350 | + role:costItems(cost, {log = {desc = "actGachakon", int1 = actid, int2 = count}}) | ||
351 | + | ||
352 | + local reward, change = role:award(award, {log = {desc = "actGachakon", int1 = actid, int2 = count}}) | ||
353 | + if remain <= count then | ||
354 | + gachakonInfo = {} | ||
355 | + print("hahaha") | ||
356 | + end | ||
357 | + role.activity:updateActData("Gachakon", gachakonInfo) | ||
358 | + | ||
359 | + SendPacket(actionCodes.Activity_gachakonRpc, MsgPack.pack(role:packReward(reward, change))) | ||
360 | + return true | ||
361 | +end | ||
362 | + | ||
363 | +function _M.hangDropRpc(agent, data) | ||
364 | + local role = agent.role | ||
365 | + local msg = MsgPack.unpack(data) | ||
366 | + local actid = msg.actid | ||
367 | + if not role.activity:isOpenById(actid) then return 1 end | ||
368 | + | ||
369 | + local actCfg = csvdb["activity_putCsv"][actid] | ||
370 | + if not actCfg then return 2 end | ||
371 | + | ||
372 | + local award, period = "", 0 | ||
373 | + for i = 1, #actCfg do | ||
374 | + local cfg = actCfg[i] | ||
375 | + if not cfg then | ||
376 | + break | ||
377 | + end | ||
378 | + if cfg.condition ~= "" then | ||
379 | + local arr = cfg.condition:toArray(true, "=") | ||
380 | + local type = arr[1] | ||
381 | + if type == 1 then | ||
382 | + local actId = arr[2] | ||
383 | + local carbonId = arr[3] | ||
384 | + if not role.activity:isOpenById(actid) then return 3 end | ||
385 | + local clInfo = role.activity:getActData("ChallengeLevel") or {} | ||
386 | + if not clInfo[carbonId] then | ||
387 | + break | ||
388 | + end | ||
389 | + end | ||
390 | + end | ||
391 | + award = cfg.reward | ||
392 | + period = cfg.period * 60 | ||
393 | + end | ||
394 | + local actData = role.activity:getActData("HangDrop") or 0 | ||
395 | + local timeNow = skynet.timex() | ||
396 | + if period == 0 or award == "" then | ||
397 | + return 4 | ||
398 | + end | ||
399 | + local num = math.floor((timeNow - actData)/ period) | ||
400 | + num = num > 8 and 8 or num | ||
401 | + if num == 0 then | ||
402 | + return 5 | ||
403 | + end | ||
404 | + local reward, change = {}, nil | ||
405 | + for id, value in pairs(award:toNumMap()) do | ||
406 | + reward[id] = value * num | ||
407 | + end | ||
408 | + | ||
409 | + reward, change = role:award(reward, {log = {desc = "actHangDrop", int1 = actid, int2 = num}}) | ||
410 | + | ||
411 | + role.activity:updateActData("HangDrop", timeNow) | ||
412 | + | ||
413 | + SendPacket(actionCodes.Activity_hangDropRpc, MsgPack.pack(role:packReward(reward, change))) | ||
414 | + | ||
415 | + return true | ||
416 | +end | ||
417 | + | ||
298 | return _M | 418 | return _M |
299 | \ No newline at end of file | 419 | \ No newline at end of file |
src/actions/EmailAction.lua
@@ -121,7 +121,7 @@ function _M.drawAttachRpc(agent, data) | @@ -121,7 +121,7 @@ function _M.drawAttachRpc(agent, data) | ||
121 | local attachments = getEmailAttachments(email) | 121 | local attachments = getEmailAttachments(email) |
122 | if attachments == "" then return end | 122 | if attachments == "" then return end |
123 | 123 | ||
124 | - local reward, change = role:award(attachments, {log = {desc = "draw_attach", int1 = emailId}}) | 124 | + local reward, change = role:award(attachments, {log = {desc = "draw_attach", int1 = id}}) |
125 | email:setProperty("status", 2) | 125 | email:setProperty("status", 2) |
126 | email:log(role, 2) | 126 | email:log(role, 2) |
127 | SendPacket(actionCodes.Email_drawAttachRpc, MsgPack.pack({reward = reward, change = change})) | 127 | SendPacket(actionCodes.Email_drawAttachRpc, MsgPack.pack({reward = reward, change = change})) |
src/actions/GmAction.lua
@@ -534,7 +534,7 @@ function _M.test(role, pms) | @@ -534,7 +534,7 @@ function _M.test(role, pms) | ||
534 | --local hero = require ("actions.HeroAction") | 534 | --local hero = require ("actions.HeroAction") |
535 | --hero.unlockPoolRpc({role = role}, MsgPack.pack({type = id})) | 535 | --hero.unlockPoolRpc({role = role}, MsgPack.pack({type = id})) |
536 | 536 | ||
537 | - role:sendMail(13, nil, "1=2", {111}) | 537 | + --role:sendMail(13, nil, "1=2", {111}) |
538 | return "成功" | 538 | return "成功" |
539 | end | 539 | end |
540 | 540 |
src/actions/HeroAction.lua
@@ -585,16 +585,16 @@ function _M.createHeroRandomRpc(agent, data) | @@ -585,16 +585,16 @@ function _M.createHeroRandomRpc(agent, data) | ||
585 | local itemData = csvdb["itemCsv"][itemId] | 585 | local itemData = csvdb["itemCsv"][itemId] |
586 | if not itemData or itemData.type ~= ItemType.HeroFCommon then return end | 586 | if not itemData or itemData.type ~= ItemType.HeroFCommon then return end |
587 | local cost = globalCsv.unit_fragment_cost[itemData.quality] | 587 | local cost = globalCsv.unit_fragment_cost[itemData.quality] |
588 | - if not cost or role:getItemCount(itemId) < cost then return end | 588 | + if not cost or role:getItemCount(itemId) < cost then return 1 end |
589 | 589 | ||
590 | local randomData = csvdb["item_randomCsv"][tonumber(itemData.use_effect)] | 590 | local randomData = csvdb["item_randomCsv"][tonumber(itemData.use_effect)] |
591 | - if not randomData then return end | 591 | + if not randomData then return 2 end |
592 | 592 | ||
593 | local temp = randomData.gift1:randWeight(true) | 593 | local temp = randomData.gift1:randWeight(true) |
594 | - if not temp or not next(temp) then return end | 594 | + if not temp or not next(temp) then return 3 end |
595 | 595 | ||
596 | role:costItems({[itemId] = cost}, {log = {desc = "createHeroRandom"}}) | 596 | role:costItems({[itemId] = cost}, {log = {desc = "createHeroRandom"}}) |
597 | - local reward, change = role:award({[temp[1] + ItemStartId.Hero] = 1}, {log = {desc = "createHeroRandom"}}) | 597 | + local reward, change = role:award({[temp[1]] = 1}, {log = {desc = "createHeroRandom"}}) |
598 | 598 | ||
599 | 599 | ||
600 | SendPacket(actionCodes.Hero_createHeroRandomRpc, MsgPack.pack(role:packReward(reward, change))) | 600 | SendPacket(actionCodes.Hero_createHeroRandomRpc, MsgPack.pack(role:packReward(reward, change))) |
src/actions/PvpAction.lua
@@ -23,6 +23,7 @@ local _revengeRecord = {} -- 复仇对单人1分钟间隔 | @@ -23,6 +23,7 @@ local _revengeRecord = {} -- 复仇对单人1分钟间隔 | ||
23 | local RevengeWaitTime = 60 | 23 | local RevengeWaitTime = 60 |
24 | 24 | ||
25 | function _M.formatCommonRpc(agent , data) | 25 | function _M.formatCommonRpc(agent , data) |
26 | + if true then return end | ||
26 | local role = agent.role | 27 | local role = agent.role |
27 | local roleId = role:getProperty("id") | 28 | local roleId = role:getProperty("id") |
28 | local msg = MsgPack.unpack(data) | 29 | local msg = MsgPack.unpack(data) |
@@ -63,7 +64,8 @@ function _M.formatHighRpc(agent , data) | @@ -63,7 +64,8 @@ function _M.formatHighRpc(agent , data) | ||
63 | local role = agent.role | 64 | local role = agent.role |
64 | local roleId = role:getProperty("id") | 65 | local roleId = role:getProperty("id") |
65 | local msg = MsgPack.unpack(data) | 66 | local msg = MsgPack.unpack(data) |
66 | - | 67 | + |
68 | + if not role:isCrossServerPvpPlayer() then return end | ||
67 | local pvpTH = {} | 69 | local pvpTH = {} |
68 | local had = {} -- 上阵的角色 | 70 | local had = {} -- 上阵的角色 |
69 | local supportHad = {} | 71 | local supportHad = {} |
@@ -169,7 +171,7 @@ function _M.infoRpc(agent, data) | @@ -169,7 +171,7 @@ function _M.infoRpc(agent, data) | ||
169 | 171 | ||
170 | local pvpMC = role:getProperty("pvpMC") | 172 | local pvpMC = role:getProperty("pvpMC") |
171 | if not next(pvpMC) then --没有分配过对手 | 173 | if not next(pvpMC) then --没有分配过对手 |
172 | - role:refreshPvpMatchC(score) | 174 | + role:refreshPvpMatchC(score, -1) |
173 | pvpMC = role:getProperty("pvpMC") | 175 | pvpMC = role:getProperty("pvpMC") |
174 | end | 176 | end |
175 | if not next(pvpMC) then return end | 177 | if not next(pvpMC) then return end |
@@ -189,7 +191,7 @@ function _M.infoRpc(agent, data) | @@ -189,7 +191,7 @@ function _M.infoRpc(agent, data) | ||
189 | 191 | ||
190 | local pvpMH = role:getProperty("pvpMH") | 192 | local pvpMH = role:getProperty("pvpMH") |
191 | if not next(pvpMH) then --没有分配过对手 | 193 | if not next(pvpMH) then --没有分配过对手 |
192 | - role:refreshPvpMatchH(score) | 194 | + role:refreshPvpMatchH(score, -1) |
193 | pvpMH = role:getProperty("pvpMH") | 195 | pvpMH = role:getProperty("pvpMH") |
194 | end | 196 | end |
195 | if not next(pvpMH) then return end | 197 | if not next(pvpMH) then return end |
@@ -255,8 +257,38 @@ function _M.startBattleRpc(agent, data) | @@ -255,8 +257,38 @@ function _M.startBattleRpc(agent, data) | ||
255 | local idx = msg.idx | 257 | local idx = msg.idx |
256 | local revenge = msg.revenge | 258 | local revenge = msg.revenge |
257 | 259 | ||
258 | - local pvpTC = role:getProperty("pvpTC") | ||
259 | - if not pvpTC.heros or not next(pvpTC.heros) then return 1 end | 260 | + -- local pvpTC = role:getProperty("pvpTC") |
261 | + -- if not pvpTC.heros or not next(pvpTC.heros) then return 1 end | ||
262 | + | ||
263 | + local team = msg.team | ||
264 | + if not team then return end | ||
265 | + | ||
266 | + for slot, heroId in pairs(team.heros or {}) do | ||
267 | + if not role.heros[heroId] then | ||
268 | + return | ||
269 | + end | ||
270 | + end | ||
271 | + if not team.heros or not next(team.heros) then | ||
272 | + return | ||
273 | + end | ||
274 | + local supports = {} | ||
275 | + for slot, support in pairs(team.supports) do | ||
276 | + if slot ~= 1 and slot ~= 2 then return end | ||
277 | + local level = role.dinerData:getProperty("dishTree"):getv(support, 0) | ||
278 | + if level <= 0 then return end | ||
279 | + supports[slot] = support | ||
280 | + end | ||
281 | + | ||
282 | + local pvpTC = {} | ||
283 | + pvpTC.heros = {} | ||
284 | + for slot, heroId in pairs(team.heros) do | ||
285 | + pvpTC.heros[slot] = heroId | ||
286 | + end | ||
287 | + pvpTC.leader = team.leader | ||
288 | + pvpTC.supports = supports | ||
289 | + if team.tactics and globalCsv.tactics_skill_passive_cell[team.tactics] then | ||
290 | + pvpTC.tactics = team.tactics | ||
291 | + end | ||
260 | 292 | ||
261 | local matchInfo, result, key, wait | 293 | local matchInfo, result, key, wait |
262 | 294 | ||
@@ -299,7 +331,7 @@ function _M.startBattleRpc(agent, data) | @@ -299,7 +331,7 @@ function _M.startBattleRpc(agent, data) | ||
299 | end | 331 | end |
300 | 332 | ||
301 | key = tostring(math.random()) | 333 | key = tostring(math.random()) |
302 | - _pvpStartBattleCacheC = {idx = idx, key = key, revenge = revenge} | 334 | + _pvpStartBattleCacheC = {idx = idx, key = key, revenge = revenge, pvpTC = pvpTC} |
303 | 335 | ||
304 | role:checkTaskEnter("PvpBattle") | 336 | role:checkTaskEnter("PvpBattle") |
305 | 337 | ||
@@ -342,7 +374,15 @@ function _M.endBattleRpc(agent, data) | @@ -342,7 +374,15 @@ function _M.endBattleRpc(agent, data) | ||
342 | 374 | ||
343 | local temp = string.randWeight(csvdb["player_expCsv"][role:getProperty("level")].pvpBonus, true) | 375 | local temp = string.randWeight(csvdb["player_expCsv"][role:getProperty("level")].pvpBonus, true) |
344 | local reward, change = role:award({[temp[1]] = temp[2]}, {log = {desc = "pvpBattleC"}}) | 376 | local reward, change = role:award({[temp[1]] = temp[2]}, {log = {desc = "pvpBattleC"}}) |
345 | - local myScore, matchScore, oldmyScore, oldMatchScore, myRank, oldMyRank = role:changePvpScoreCommon(match.t == 1 and match.id or -1, isWin) | 377 | + local myScore, matchScore, oldmyScore, oldMatchScore, myRank, oldMyRank = 0, 0, 0, 0, -1, -1 |
378 | + -- 失败了没再排行榜 不计入 | ||
379 | + if isWin or (not isWin and role:isInPvpRank(RANK_PVP_COMMON)) then | ||
380 | + myScore, matchScore, oldmyScore, oldMatchScore, myRank, oldMyRank= role:changePvpScoreCommon(match.t == 1 and match.id or -1, isWin) | ||
381 | + end | ||
382 | + if isWin then | ||
383 | + -- 记录编队 | ||
384 | + role:savePvpCTeam(_pvpStartBattleCacheC.pvpTC) | ||
385 | + end | ||
346 | 386 | ||
347 | -- 请求上传录像 | 387 | -- 请求上传录像 |
348 | local params = { | 388 | local params = { |
@@ -433,8 +473,8 @@ function _M.startBattleHRpc(agent, data) | @@ -433,8 +473,8 @@ function _M.startBattleHRpc(agent, data) | ||
433 | local revenge = msg.revenge | 473 | local revenge = msg.revenge |
434 | if not role:isTimeResetOpen(TimeReset.PvpHight) then return end | 474 | if not role:isTimeResetOpen(TimeReset.PvpHight) then return end |
435 | 475 | ||
436 | - local pvpTH = role:getProperty("pvpTH") | ||
437 | - if not next(pvpTH) then return 1 end | 476 | + -- local pvpTH = role:getProperty("pvpTH") |
477 | + -- if not next(pvpTH) then return 1 end | ||
438 | 478 | ||
439 | -- 检查并记录玩家队伍 | 479 | -- 检查并记录玩家队伍 |
440 | local pvpTH = {} | 480 | local pvpTH = {} |
@@ -472,7 +512,6 @@ function _M.startBattleHRpc(agent, data) | @@ -472,7 +512,6 @@ function _M.startBattleHRpc(agent, data) | ||
472 | curTeam.tactics = team.tactics | 512 | curTeam.tactics = team.tactics |
473 | end | 513 | end |
474 | 514 | ||
475 | - | ||
476 | table.insert(pvpTH, curTeam) | 515 | table.insert(pvpTH, curTeam) |
477 | end | 516 | end |
478 | 517 | ||
@@ -644,9 +683,18 @@ function _M.endBattleHRpc(agent, data) | @@ -644,9 +683,18 @@ function _M.endBattleHRpc(agent, data) | ||
644 | -- 战斗结束了发奖 | 683 | -- 战斗结束了发奖 |
645 | local temp = string.randWeight(csvdb["player_expCsv"][role:getProperty("level")].pvpgroupBonus, true) | 684 | local temp = string.randWeight(csvdb["player_expCsv"][role:getProperty("level")].pvpgroupBonus, true) |
646 | local reward, change = role:award({[temp[1]] = temp[2]}, {log = {desc = "pvpBattleH"}}) | 685 | local reward, change = role:award({[temp[1]] = temp[2]}, {log = {desc = "pvpBattleH"}}) |
647 | - local myScore, matchScore, oldmyScore, oldMatchScore, myRank, oldMyRank = 0, 0, 0, 0, 0, 0 | ||
648 | - if role:isTimeResetOpen(TimeReset.PvpHight) then | ||
649 | - myScore, matchScore, oldmyScore, oldMatchScore, myRank, oldMyRank = role:changePvpScoreHigh(match.t == 1 and match.id or -1, isWin) | 686 | + |
687 | + | ||
688 | + local myScore, matchScore, oldmyScore, oldMatchScore, myRank, oldMyRank = 0, 0, 0, 0, -1, -1 | ||
689 | + -- 失败了没再排行榜 不计入 | ||
690 | + if role:isTimeResetOpen(TimeReset.PvpHight) then | ||
691 | + if isWin or (not isWin and role:isInPvpRank(RANK_PVP_HIGHT)) then | ||
692 | + myScore, matchScore, oldmyScore, oldMatchScore, myRank, oldMyRank = role:changePvpScoreHigh(match.t == 1 and match.id or -1, isWin) | ||
693 | + end | ||
694 | + -- 记录编队 | ||
695 | + if isWin then | ||
696 | + role:savePvpHTeam(_pvpStartBattleCacheH.pvpTH) | ||
697 | + end | ||
650 | end | 698 | end |
651 | 699 | ||
652 | -- 加入战斗记录 | 700 | -- 加入战斗记录 |
src/actions/StoreAction.lua
@@ -402,18 +402,24 @@ function _M.getTotalRechargeAwardRpc(agent, data) | @@ -402,18 +402,24 @@ function _M.getTotalRechargeAwardRpc(agent, data) | ||
402 | local role = agent.role | 402 | local role = agent.role |
403 | local msg = MsgPack.unpack(data) | 403 | local msg = MsgPack.unpack(data) |
404 | local index = msg.index -- 领取的索引id | 404 | local index = msg.index -- 领取的索引id |
405 | + local totalTwd = role:getProperty("twdC") | ||
405 | local totalRechargeRecord = role.storeData:getProperty("totalRR") | 406 | local totalRechargeRecord = role.storeData:getProperty("totalRR") |
406 | local flag = string.char(string.getbit(totalRechargeRecord, index)) | 407 | local flag = string.char(string.getbit(totalRechargeRecord, index)) |
407 | - if flag == "1" then | ||
408 | - return 1 | ||
409 | - end | 408 | + if flag == "1" then return 1 end |
409 | + local cfg = csvdb["activity_payRebateCsv"][index] | ||
410 | + if not cfg then return 2 end | ||
411 | + if cfg.twd > totalTwd then return 3 end | ||
412 | + | ||
410 | totalRechargeRecord = string.setbit(totalRechargeRecord, index) | 413 | totalRechargeRecord = string.setbit(totalRechargeRecord, index) |
411 | role.storeData:updateProperty({field = "totalRR", value = totalRechargeRecord}) | 414 | role.storeData:updateProperty({field = "totalRR", value = totalRechargeRecord}) |
412 | - local cfg = csvdb["Csv"][index] | ||
413 | - if not cfg then return 2 end | 415 | + local main = cfg.main_reward:toNumMap() |
416 | + local sub = cfg.sub_reward:toNumMap() | ||
417 | + for k, v in pairs(sub) do | ||
418 | + main[k] = (main[k] or 0) + v | ||
419 | + end | ||
414 | 420 | ||
415 | - local reward, _ = role:award(cfg.reward, {log = {desc = "totalRecharge", int1 = index}}) | ||
416 | - SendPacket(actionCodes.Store_getTotalRechargeAwardRpc, MsgPack.pack({reward = reward})) | 421 | + local reward, change = role:award(main, {log = {desc = "totalRecharge", int1 = index}}) |
422 | + SendPacket(actionCodes.Store_getTotalRechargeAwardRpc, MsgPack.pack(role:packReward(reward, change))) | ||
417 | return true | 423 | return true |
418 | end | 424 | end |
419 | 425 |
src/adv/Adv.lua
@@ -1388,19 +1388,31 @@ local function chooseCommon(self, room, block, chooseData, choose, tag) | @@ -1388,19 +1388,31 @@ local function chooseCommon(self, room, block, chooseData, choose, tag) | ||
1388 | [14] = function() -- 指定地块召唤 指定类型的id | 1388 | [14] = function() -- 指定地块召唤 指定类型的id |
1389 | local change = self:getCurMap():layEventToStage(effect[2], effect[3], effect[4], effect[5]) | 1389 | local change = self:getCurMap():layEventToStage(effect[2], effect[3], effect[4], effect[5]) |
1390 | for _, one in ipairs(change) do | 1390 | for _, one in ipairs(change) do |
1391 | - self:backBlockChange(one[1].roomId, one[2].blockId) | 1391 | + if one[1].roomId == room.roomId and one[2].blockId == block.blockId then |
1392 | + clearBlock = false | ||
1393 | + else | ||
1394 | + self:backBlockChange(one[1].roomId, one[2].blockId) | ||
1395 | + end | ||
1392 | end | 1396 | end |
1393 | end, | 1397 | end, |
1394 | [15] = function() -- 移除指定事件 | 1398 | [15] = function() -- 移除指定事件 |
1395 | local change = self:getCurMap():clearEventById(effect[2], effect[3], effect[4]) | 1399 | local change = self:getCurMap():clearEventById(effect[2], effect[3], effect[4]) |
1396 | for _, one in ipairs(change) do | 1400 | for _, one in ipairs(change) do |
1397 | - self:backBlockChange(one[1].roomId, one[2].blockId) | 1401 | + if one[1].roomId == room.roomId and one[2].blockId == block.blockId then |
1402 | + clearBlock = false | ||
1403 | + else | ||
1404 | + self:backBlockChange(one[1].roomId, one[2].blockId) | ||
1405 | + end | ||
1398 | end | 1406 | end |
1399 | end, | 1407 | end, |
1400 | [16] = function() -- 指定事件转移 | 1408 | [16] = function() -- 指定事件转移 |
1401 | local change = self:getCurMap():eventChangeToOther(effect[2], effect[3], effect[4], effect[5], effect[6]) | 1409 | local change = self:getCurMap():eventChangeToOther(effect[2], effect[3], effect[4], effect[5], effect[6]) |
1402 | for _, one in ipairs(change) do | 1410 | for _, one in ipairs(change) do |
1403 | - self:backBlockChange(one[1].roomId, one[2].blockId) | 1411 | + if one[1].roomId == room.roomId and one[2].blockId == block.blockId then |
1412 | + clearBlock = false | ||
1413 | + else | ||
1414 | + self:backBlockChange(one[1].roomId, one[2].blockId) | ||
1415 | + end | ||
1404 | end | 1416 | end |
1405 | end, | 1417 | end, |
1406 | } | 1418 | } |
@@ -1526,6 +1538,24 @@ local function clickBuild(self, room, block, params) | @@ -1526,6 +1538,24 @@ local function clickBuild(self, room, block, params) | ||
1526 | local status, clearBlock = chooseCommon(self, room, block, chooseData, choose, "build") | 1538 | local status, clearBlock = chooseCommon(self, room, block, chooseData, choose, "build") |
1527 | if not status then return end | 1539 | if not status then return end |
1528 | 1540 | ||
1541 | + local isMine = false -- 是不是宝藏怪 | ||
1542 | + for _, mid in ipairs(globalCsv.adv_egg_treasureLayer_id) do | ||
1543 | + if mid == oldId then | ||
1544 | + isMine = true | ||
1545 | + break | ||
1546 | + end | ||
1547 | + end | ||
1548 | + if isMine then | ||
1549 | + local advMine = self.owner:getProperty("advMine") | ||
1550 | + advMine[2] = advMine[2] or {} | ||
1551 | + local mineCo2 = advMine[2].co or {} | ||
1552 | + if chooseData.limit ~= 0 then | ||
1553 | + mineCo2[oldId] = (mineCo2[oldId] or 0) + 1 | ||
1554 | + end | ||
1555 | + advMine[2].co = mineCo2 | ||
1556 | + self.owner:setProperty("advMine", advMine) | ||
1557 | + end | ||
1558 | + | ||
1529 | self:checkTask(Adv.TaskType.Build, 1, oldId) | 1559 | self:checkTask(Adv.TaskType.Build, 1, oldId) |
1530 | self:checkAchievement(Adv.AchievType.Build, 1, oldId) | 1560 | self:checkAchievement(Adv.AchievType.Build, 1, oldId) |
1531 | self:checkAchievement(Adv.AchievType.BuildBySelect, 1, oldId, choose) | 1561 | self:checkAchievement(Adv.AchievType.BuildBySelect, 1, oldId, choose) |
@@ -1960,6 +1990,7 @@ function Adv:enemyDead(enemy, escape) | @@ -1960,6 +1990,7 @@ function Adv:enemyDead(enemy, escape) | ||
1960 | break | 1990 | break |
1961 | end | 1991 | end |
1962 | end | 1992 | end |
1993 | + | ||
1963 | if isMine then | 1994 | if isMine then |
1964 | local advMine = self.owner:getProperty("advMine") | 1995 | local advMine = self.owner:getProperty("advMine") |
1965 | advMine[1] = advMine[1] or {} | 1996 | advMine[1] = advMine[1] or {} |
@@ -1986,16 +2017,14 @@ function Adv:enemyDead(enemy, escape) | @@ -1986,16 +2017,14 @@ function Adv:enemyDead(enemy, escape) | ||
1986 | etype = AdvEventType.Build, | 2017 | etype = AdvEventType.Build, |
1987 | id = cId | 2018 | id = cId |
1988 | }) | 2019 | }) |
1989 | - if csvdb["event_buildingCsv"][cId].limit ~= 0 then | ||
1990 | - mineCo2[cId] = (mineCo2[cId] or 0) + 1 | ||
1991 | - end | ||
1992 | had = true | 2020 | had = true |
1993 | end | 2021 | end |
1994 | end | 2022 | end |
1995 | if had then | 2023 | if had then |
1996 | - mineCh = math.min(mineCh + globalCsv.adv_egg_treasureLayer_showup_add, 100) | ||
1997 | - else | ||
1998 | mineCh = nil | 2024 | mineCh = nil |
2025 | + else | ||
2026 | + block:clear() | ||
2027 | + mineCh = math.min(mineCh + globalCsv.adv_egg_treasureLayer_showup_add, 100) | ||
1999 | end | 2028 | end |
2000 | 2029 | ||
2001 | local drops = {} | 2030 | local drops = {} |
src/adv/AdvBattle.lua
@@ -463,7 +463,7 @@ function Battle:iLayerChange(oldMapIdx) | @@ -463,7 +463,7 @@ function Battle:iLayerChange(oldMapIdx) | ||
463 | local playerBuffs = self:checkDiffAuraBuff(self:getAurasByMap(oldMapIdx), auras) | 463 | local playerBuffs = self:checkDiffAuraBuff(self:getAurasByMap(oldMapIdx), auras) |
464 | local enemyBuffs = self:checkDiffAuraBuff(self:getAurasByMap(), auras) | 464 | local enemyBuffs = self:checkDiffAuraBuff(self:getAurasByMap(), auras) |
465 | self.player:checkAuraBuff(playerBuffs) | 465 | self.player:checkAuraBuff(playerBuffs) |
466 | - for _, enemy in pairs(self.player:getTeam(2)) do | 466 | + for _, enemy in ipairs(self.enemys[self.adv:getCurMapIdx()]) do |
467 | enemy:checkAuraBuff(enemyBuffs) | 467 | enemy:checkAuraBuff(enemyBuffs) |
468 | end | 468 | end |
469 | self:setMapAuras(auras) | 469 | self:setMapAuras(auras) |
@@ -483,7 +483,7 @@ function Battle:newBattle() | @@ -483,7 +483,7 @@ function Battle:newBattle() | ||
483 | local auras = self:getActiveAuras() | 483 | local auras = self:getActiveAuras() |
484 | local buffs = self:checkDiffAuraBuff({}, auras) | 484 | local buffs = self:checkDiffAuraBuff({}, auras) |
485 | self.player:checkAuraBuff(buffs) | 485 | self.player:checkAuraBuff(buffs) |
486 | - for _, enemy in pairs(self.player:getTeam(2)) do | 486 | + for _, enemy in ipairs(self.enemys[self.adv:getCurMapIdx()]) do |
487 | enemy:checkAuraBuff(buffs) | 487 | enemy:checkAuraBuff(buffs) |
488 | end | 488 | end |
489 | self:setMapAuras(auras) | 489 | self:setMapAuras(auras) |
src/adv/AdvBuff.lua
@@ -489,6 +489,7 @@ function Buff:createAfter(layer) | @@ -489,6 +489,7 @@ function Buff:createAfter(layer) | ||
489 | if self._init then | 489 | if self._init then |
490 | self:_init() | 490 | self:_init() |
491 | end | 491 | end |
492 | + self:pushBackEffect(1) | ||
492 | end | 493 | end |
493 | 494 | ||
494 | function Buff:initByDB(data) | 495 | function Buff:initByDB(data) |
@@ -620,11 +621,19 @@ function Buff:canEffect(...) | @@ -620,11 +621,19 @@ function Buff:canEffect(...) | ||
620 | return self:_canEffect(...) | 621 | return self:_canEffect(...) |
621 | end | 622 | end |
622 | 623 | ||
624 | +function Buff:pushBackEffect(etype) | ||
625 | + local shows = self.buffData.show:toTableArray(true) | ||
626 | + for _, one in ipairs(shows) do | ||
627 | + if one[1] == etype then | ||
628 | + self.owner.battle.adv:pushBackEvent(AdvBackEventType.BuffEffect, {etype = etype, id = self.id, blockId = self.owner.blockId, roomId = self.owner.roomId}) | ||
629 | + break | ||
630 | + end | ||
631 | + end | ||
632 | +end | ||
633 | + | ||
623 | function Buff:effect() | 634 | function Buff:effect() |
624 | self:decCount() | 635 | self:decCount() |
625 | - if self.buffData.show:sismember(2, " ") then | ||
626 | - self.owner.battle.adv:pushBackEvent(AdvBackEventType.BuffEffect, {etype = 2}) | ||
627 | - end | 636 | + self:pushBackEffect(2) |
628 | if self._effectValue then | 637 | if self._effectValue then |
629 | return self:_effectValue() | 638 | return self:_effectValue() |
630 | end | 639 | end |
@@ -698,6 +707,8 @@ function Buff:overlay(releaser, data, layer) | @@ -698,6 +707,8 @@ function Buff:overlay(releaser, data, layer) | ||
698 | if self._overlay then | 707 | if self._overlay then |
699 | self:_overlay() | 708 | self:_overlay() |
700 | end | 709 | end |
710 | + | ||
711 | + self:pushBackEffect(1) | ||
701 | end | 712 | end |
702 | end | 713 | end |
703 | 714 |
src/adv/AdvMap.lua
@@ -13,12 +13,12 @@ local createMap, getEventLib | @@ -13,12 +13,12 @@ local createMap, getEventLib | ||
13 | function Map:ctor(adv, mapIdx, mapInfo, isEnter, isNewRelay) | 13 | function Map:ctor(adv, mapIdx, mapInfo, isEnter, isNewRelay) |
14 | self.adv = adv | 14 | self.adv = adv |
15 | local isNew = type(mapInfo) == "number" | 15 | local isNew = type(mapInfo) == "number" |
16 | + self.mapIdx = mapIdx | ||
16 | if isNew then -- mapInfo 传入 id | 17 | if isNew then -- mapInfo 传入 id |
17 | mapInfo = createMap(self, mapInfo, isEnter, isNewRelay) -- 生成地图 | 18 | mapInfo = createMap(self, mapInfo, isEnter, isNewRelay) -- 生成地图 |
18 | end | 19 | end |
19 | if not mapInfo then return end | 20 | if not mapInfo then return end |
20 | 21 | ||
21 | - self.mapIdx = mapIdx | ||
22 | self.mapId = mapInfo.mapId | 22 | self.mapId = mapInfo.mapId |
23 | self.isShow = mapInfo.isShow -- 是否全部展示 -- 客户端用 | 23 | self.isShow = mapInfo.isShow -- 是否全部展示 -- 客户端用 |
24 | self.rooms = {} | 24 | self.rooms = {} |
@@ -258,7 +258,7 @@ function Map:openBlock(roomId, blockId, isPlayer, ignoreBack) | @@ -258,7 +258,7 @@ function Map:openBlock(roomId, blockId, isPlayer, ignoreBack) | ||
258 | if isPlayer then | 258 | if isPlayer then |
259 | self.adv.battle:triggerPassive(Passive.OPEN_BLOCK, {roomId = roomId, blockId = blockId}) | 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 | + self.adv.battle.player:changeSp(1) -- 翻开格子 sp 加1 |
262 | -- 潜行检查 | 262 | -- 潜行检查 |
263 | local sneakBuff = self.adv.battle.player:hadBuff(Buff.SNEAK) | 263 | local sneakBuff = self.adv.battle.player:hadBuff(Buff.SNEAK) |
264 | if sneakBuff then | 264 | if sneakBuff then |
@@ -349,8 +349,8 @@ function Map:getDistance(froomId, fblockId, troomId, tblockId) | @@ -349,8 +349,8 @@ function Map:getDistance(froomId, fblockId, troomId, tblockId) | ||
349 | local room1 = self.rooms[froomId] | 349 | local room1 = self.rooms[froomId] |
350 | local room2 = self.rooms[troomId] | 350 | local room2 = self.rooms[troomId] |
351 | if room1 and room2 then | 351 | if room1 and room2 then |
352 | - local block1 = room1[fblockId] | ||
353 | - local block2 = room2[tblockId] | 352 | + local block1 = room1.blocks[fblockId] |
353 | + local block2 = room2.blocks[tblockId] | ||
354 | if block1 and block2 then | 354 | if block1 and block2 then |
355 | local c1, r1 = room1:tranLtoG(block1.col, block1.row) | 355 | local c1, r1 = room1:tranLtoG(block1.col, block1.row) |
356 | local c2, r2 = room2:tranLtoG(block2.col, block2.row) | 356 | local c2, r2 = room2:tranLtoG(block2.col, block2.row) |
@@ -811,46 +811,47 @@ createMap = function(self, mapId, isEnter, isNewRelay) | @@ -811,46 +811,47 @@ createMap = function(self, mapId, isEnter, isNewRelay) | ||
811 | end | 811 | end |
812 | end | 812 | end |
813 | end | 813 | end |
814 | - | ||
815 | -- 宝藏怪刷新 | 814 | -- 宝藏怪刷新 |
816 | - for idx = #(stagePool["global"][AdvCodeRandomStage] or {}), 1, -1 do | ||
817 | - local c = stagePool["global"][AdvCodeRandomStage][idx] -- {room = roomId, block = blockId} | ||
818 | - if mapInfo.rooms[c["room"]]["event"][c["block"]] then -- 存在 | ||
819 | - table.remove(stagePool["global"][AdvCodeRandomStage], idx) | ||
820 | - end | ||
821 | - end | ||
822 | - local ln = #(stagePool["global"][AdvCodeRandomStage] or {}) | ||
823 | - local advMine = self.adv.owner:getProperty("advMine") | ||
824 | - advMine[1] = advMine[1] or {} | ||
825 | - local mineCh = advMine[1].ch or globalCsv.adv_egg_treasureMonster_showup | ||
826 | - local mineCo = advMine[1].co or {} | ||
827 | - local had = false | ||
828 | - if ln > 0 then | ||
829 | - if math.randomInt(1, 100) <= mineCh then -- 刷出来了 | ||
830 | - local mpool = {} | ||
831 | - for _, mid in ipairs(globalCsv.adv_egg_treasureMonster_id) do | ||
832 | - local monster = csvdb["event_monsterCsv"][mid] | ||
833 | - if (not mineCo[mid] or monster.limit == 0 or mineCo[mid] < monster.limit) and monster.showup > 0 then | ||
834 | - mpool[mid] = {monster.showup} | ||
835 | - end | ||
836 | - end | ||
837 | - if next(mpool) then | ||
838 | - local idx = math.randomInt(1, ln) | ||
839 | - local cur = stagePool["global"][AdvCodeRandomStage][idx] | ||
840 | - giveEvent(cur["room"], cur["block"], AdvEventType.Monster, math.randWeight(mpool, 1)) | 815 | + if self.mapIdx == 1 and not self.adv.isRelay then |
816 | + for idx = #(stagePool["global"][AdvCodeRandomStage] or {}), 1, -1 do | ||
817 | + local c = stagePool["global"][AdvCodeRandomStage][idx] -- {room = roomId, block = blockId} | ||
818 | + if mapInfo.rooms[c["room"]]["event"][c["block"]] then -- 存在 | ||
841 | table.remove(stagePool["global"][AdvCodeRandomStage], idx) | 819 | table.remove(stagePool["global"][AdvCodeRandomStage], idx) |
842 | - ln = ln - 1 | ||
843 | - had = true | ||
844 | end | 820 | end |
845 | end | 821 | end |
822 | + local ln = #(stagePool["global"][AdvCodeRandomStage] or {}) | ||
823 | + local advMine = self.adv.owner:getProperty("advMine") | ||
824 | + advMine[1] = advMine[1] or {} | ||
825 | + local mineCh = advMine[1].ch or globalCsv.adv_egg_treasureMonster_showup | ||
826 | + local mineCo = advMine[1].co or {} | ||
827 | + local had = false | ||
828 | + if ln > 0 then | ||
829 | + if math.randomInt(1, 100) <= mineCh then -- 刷出来了 | ||
830 | + local mpool = {} | ||
831 | + for _, mid in ipairs(globalCsv.adv_egg_treasureMonster_id) do | ||
832 | + local monster = csvdb["event_monsterCsv"][mid] | ||
833 | + if (not mineCo[mid] or monster.limit == 0 or mineCo[mid] < monster.limit) and monster.showup > 0 then | ||
834 | + mpool[mid] = {monster.showup} | ||
835 | + end | ||
836 | + end | ||
837 | + if next(mpool) then | ||
838 | + local idx = math.randomInt(1, ln) | ||
839 | + local cur = stagePool["global"][AdvCodeRandomStage][idx] | ||
840 | + giveEvent(cur["room"], cur["block"], AdvEventType.Monster, math.randWeight(mpool, 1)) | ||
841 | + table.remove(stagePool["global"][AdvCodeRandomStage], idx) | ||
842 | + ln = ln - 1 | ||
843 | + had = true | ||
844 | + end | ||
845 | + end | ||
846 | + end | ||
847 | + if had then | ||
848 | + mineCh = nil | ||
849 | + else | ||
850 | + mineCh = math.min(mineCh + globalCsv.adv_egg_treasureMonster_showup_add, 100) | ||
851 | + end | ||
852 | + advMine[1].ch = mineCh | ||
853 | + self.adv.owner:setProperty("advMine", advMine) | ||
846 | end | 854 | end |
847 | - if not had then | ||
848 | - mineCh = math.min(mineCh + globalCsv.adv_egg_treasureMonster_showup_add, 100) | ||
849 | - else | ||
850 | - mineCh = nil | ||
851 | - end | ||
852 | - advMine[1].ch = mineCh | ||
853 | - self.adv.owner:setProperty("advMine", advMine) | ||
854 | 855 | ||
855 | 856 | ||
856 | if mapCsvData.clearType == 1 and not haveBoss then | 857 | if mapCsvData.clearType == 1 and not haveBoss then |
src/adv/AdvPassive.lua
@@ -50,7 +50,7 @@ end | @@ -50,7 +50,7 @@ end | ||
50 | 50 | ||
51 | FilterFactory[Filter.RANGE] = function (_Filter) | 51 | FilterFactory[Filter.RANGE] = function (_Filter) |
52 | _Filter._execute = function (self, target, params) | 52 | _Filter._execute = function (self, target, params) |
53 | - if self.owner.blockId and self.owner.roomId and params.blockId and params.roomId then | 53 | + if params and 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) | 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 | 55 | return distance ~= -1 and distance <= self.value |
56 | end | 56 | end |
@@ -95,9 +95,8 @@ function Filter:execute(params) | @@ -95,9 +95,8 @@ function Filter:execute(params) | ||
95 | if not target then | 95 | if not target then |
96 | return | 96 | return |
97 | end | 97 | end |
98 | - if self:_execute(target) then | ||
99 | - return self:_execute(target, params) | ||
100 | - end | 98 | + |
99 | + return self:_execute(target, params) | ||
101 | end | 100 | end |
102 | 101 | ||
103 | -->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> | 102 | -->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> |
@@ -203,7 +202,7 @@ PassiveCondFactory[Passive.PLAYER_BUFF] = PassiveCondFactory[Passive.GET_BUFF] | @@ -203,7 +202,7 @@ PassiveCondFactory[Passive.PLAYER_BUFF] = PassiveCondFactory[Passive.GET_BUFF] | ||
203 | 202 | ||
204 | PassiveCondFactory[Passive.PLAYER_BUFF_CLASSIFY] = function(_Passive) | 203 | PassiveCondFactory[Passive.PLAYER_BUFF_CLASSIFY] = function(_Passive) |
205 | _Passive._trigger = function(self, params) | 204 | _Passive._trigger = function(self, params) |
206 | - if params.classify:sismember(self.passiveData.value) then | 205 | + if params.classify:sismember(self.passiveData.value, " ") then |
207 | return true | 206 | return true |
208 | end | 207 | end |
209 | end | 208 | end |
@@ -340,6 +339,7 @@ function Passive:canEffect(effType, effValue) | @@ -340,6 +339,7 @@ function Passive:canEffect(effType, effValue) | ||
340 | end | 339 | end |
341 | 340 | ||
342 | function Passive:effect(triggerPms) | 341 | function Passive:effect(triggerPms) |
342 | + local hadEffect = false | ||
343 | for _, effect in ipairs(self.effects) do | 343 | for _, effect in ipairs(self.effects) do |
344 | local effType = effect[1] | 344 | local effType = effect[1] |
345 | local effValue = effect[2] | 345 | local effValue = effect[2] |
@@ -348,10 +348,13 @@ function Passive:effect(triggerPms) | @@ -348,10 +348,13 @@ function Passive:effect(triggerPms) | ||
348 | table.insert(otherPms, effect[i]) | 348 | table.insert(otherPms, effect[i]) |
349 | end | 349 | end |
350 | if self:canEffect(effType, effValue) then | 350 | if self:canEffect(effType, effValue) then |
351 | + hadEffect = true | ||
351 | self["effect" .. effType](self, effValue, triggerPms, table.unpack(otherPms)) | 352 | self["effect" .. effType](self, effValue, triggerPms, table.unpack(otherPms)) |
352 | end | 353 | end |
353 | end | 354 | end |
354 | - | 355 | + if hadEffect then |
356 | + self.owner.battle.adv:pushBackEvent(AdvBackEventType.PassiveEffect, {id = self.id, level = self.level, roomId = self.owner.roomId, blockId = self.owner.blockId}) | ||
357 | + end | ||
355 | if self.count > 0 then | 358 | if self.count > 0 then |
356 | self.count = self.count < 999 and self.count - 1 or self.count | 359 | self.count = self.count < 999 and self.count - 1 or self.count |
357 | self.round = self.passiveData.round | 360 | self.round = self.passiveData.round |
src/adv/AdvPlayer.lua
@@ -847,10 +847,6 @@ function Player:addBuff(buffId, releaser) | @@ -847,10 +847,6 @@ function Player:addBuff(buffId, releaser) | ||
847 | self.battle.adv:checkAchievement(self.battle.adv.AchievType.GetBuff, 1, buffId) | 847 | self.battle.adv:checkAchievement(self.battle.adv.AchievType.GetBuff, 1, buffId) |
848 | self.battle.adv:pushBackEvent(AdvBackEventType.Buff, {buffId = buffId}) | 848 | self.battle.adv:pushBackEvent(AdvBackEventType.Buff, {buffId = buffId}) |
849 | self.battle:triggerPassive(Passive.PLAYER_BUFF, {buffId = buffId}) | 849 | self.battle:triggerPassive(Passive.PLAYER_BUFF, {buffId = buffId}) |
850 | - local buffData = csvdb["adv_map_buffCsv"][buffId] | ||
851 | - if buffData and buffData.show:sismember(1, " ") then | ||
852 | - self.battle.adv:pushBackEvent(AdvBackEventType.BuffEffect, {etype = 1}) | ||
853 | - end | ||
854 | end | 850 | end |
855 | return status | 851 | return status |
856 | end | 852 | end |
src/models/Activity.lua
@@ -54,10 +54,10 @@ Activity.schema = { | @@ -54,10 +54,10 @@ Activity.schema = { | ||
54 | act13 = {"table", {}}, -- {0 = 拾荒消耗远古金币数量, 1=1, 2=1} 拾荒周活动 1表示领取过该档位的奖励 | 54 | act13 = {"table", {}}, -- {0 = 拾荒消耗远古金币数量, 1=1, 2=1} 拾荒周活动 1表示领取过该档位的奖励 |
55 | act14 = {"table", {}}, -- {0 = 拆解数量, 1=1, 2=1} 拆解周活动 1表示领取过该档位的奖励 | 55 | act14 = {"table", {}}, -- {0 = 拆解数量, 1=1, 2=1} 拆解周活动 1表示领取过该档位的奖励 |
56 | 56 | ||
57 | - act20 = {"table", {}, true}, -- {id=兑换数量} | ||
58 | - act21 = {"table", {}}, -- {id=抽取的数量} | ||
59 | - act22 = {"table", {}}, -- {id=关卡星数, totalDmg=Boss总伤害} | ||
60 | - act23 = {"table", {}}, -- {挂机信息} | 57 | + act17 = {"table", {}}, -- {id=关卡星数, totalDmg=Boss总伤害} |
58 | + act18 = {"table", {}, true}, -- {id=兑换数量} | ||
59 | + act19 = {"number", 0}, -- {挂机信息} | ||
60 | + act20 = {"table", {}}, -- {id=扭蛋抽出数量} | ||
61 | } | 61 | } |
62 | 62 | ||
63 | function Activity:data() | 63 | function Activity:data() |
@@ -71,6 +71,11 @@ function Activity:data() | @@ -71,6 +71,11 @@ function Activity:data() | ||
71 | act12 = self:getProperty("act12"), | 71 | act12 = self:getProperty("act12"), |
72 | act13 = self:getProperty("act13"), | 72 | act13 = self:getProperty("act13"), |
73 | act14 = self:getProperty("act14"), | 73 | act14 = self:getProperty("act14"), |
74 | + | ||
75 | + act17 = self:getProperty("act17"), | ||
76 | + act18 = self:getProperty("act18"), | ||
77 | + act19 = self:getProperty("act19"), | ||
78 | + act20 = self:getProperty("act20"), | ||
74 | } | 79 | } |
75 | end | 80 | end |
76 | 81 | ||
@@ -148,6 +153,10 @@ function Activity:isOpen(activityType) | @@ -148,6 +153,10 @@ function Activity:isOpen(activityType) | ||
148 | return false | 153 | return false |
149 | end | 154 | end |
150 | 155 | ||
156 | +function Activity:isOpenById(id) | ||
157 | + return self._isOpen[id] | ||
158 | +end | ||
159 | + | ||
151 | function Activity:getActData(actType) | 160 | function Activity:getActData(actType) |
152 | actType = checkActivityType(actType) | 161 | actType = checkActivityType(actType) |
153 | return self:getProperty("act" .. actType) | 162 | return self:getProperty("act" .. actType) |
@@ -422,13 +431,34 @@ activityFunc[Activity.ActivityType.CalendaTask] = { | @@ -422,13 +431,34 @@ activityFunc[Activity.ActivityType.CalendaTask] = { | ||
422 | -- 兑换 | 431 | -- 兑换 |
423 | activityFunc[Activity.ActivityType.Exchange] = { | 432 | activityFunc[Activity.ActivityType.Exchange] = { |
424 | ["init"] = function(self, actType, isCrossDay, notify, actId) | 433 | ["init"] = function(self, actType, isCrossDay, notify, actId) |
425 | - local role = self.owner | ||
426 | local actData = self:getActData(actType) or {} | 434 | local actData = self:getActData(actType) or {} |
427 | actData[actId] = {} | 435 | actData[actId] = {} |
428 | self:updateActData(actType, actData, not notify) | 436 | self:updateActData(actType, actData, not notify) |
429 | end, | 437 | end, |
430 | - --["close"] = function(self, actType, notify, actId) | ||
431 | - --end, | 438 | + ["crossDay"] = function(self, actType, notify, actId) |
439 | + local actData = self:getActData(actType) or {} | ||
440 | + local lastTs = actData["ts"] or 0 | ||
441 | + local timeNow = skynet.timex() | ||
442 | + local cfg = csvdb["activity_ctrlCsv"][actId] | ||
443 | + if not cfg then return end | ||
444 | + local refreshTimes = cfg.condition2:toArray(false, "=") | ||
445 | + for i = 1, #refreshTimes do | ||
446 | + local rt = toUnixtime(refreshTimes[1]..string_format("%02x", RESET_TIME)) | ||
447 | + if timeNow >= rt and rt > lastTs then | ||
448 | + lastTs = rt | ||
449 | + actData = {} | ||
450 | + end | ||
451 | + end | ||
452 | + if next(actData) then | ||
453 | + actData["ts"] = lastTs | ||
454 | + self:updateActData(actType, actData, not notify) | ||
455 | + end | ||
456 | + end, | ||
457 | + ["close"] = function(self, actType, notify, actId) | ||
458 | + local actData = self:getActData(actType) or {} | ||
459 | + actData[actId] = nil | ||
460 | + self:updateActData(actType, actData, not notify) | ||
461 | + end, | ||
432 | } | 462 | } |
433 | 463 | ||
434 | -- 扭蛋机 | 464 | -- 扭蛋机 |
@@ -441,6 +471,19 @@ activityFunc[Activity.ActivityType.Gachakon] = { | @@ -441,6 +471,19 @@ activityFunc[Activity.ActivityType.Gachakon] = { | ||
441 | end, | 471 | end, |
442 | } | 472 | } |
443 | 473 | ||
474 | +-- 挂机掉落 | ||
475 | +activityFunc[Activity.ActivityType.HangDrop] = { | ||
476 | + ["init"] = function(self, actType, isCrossDay, notify, actId) | ||
477 | + local actime = self:getProperty("actime") | ||
478 | + local startTime = actime[actId] | ||
479 | + local actData = self:getActData(actType) or 0 | ||
480 | + local cfg = csvdb["activity_putCsv"][actId] | ||
481 | + if not cfg then return end | ||
482 | + actData = startTime | ||
483 | + self:updateActData(actType, actData, not notify) | ||
484 | + end | ||
485 | +} | ||
486 | + | ||
444 | function Activity:initActivity(actId, isCrossDay, notify) | 487 | function Activity:initActivity(actId, isCrossDay, notify) |
445 | local actData = csvdb["activity_ctrlCsv"][actId] | 488 | local actData = csvdb["activity_ctrlCsv"][actId] |
446 | if not actData then return end | 489 | if not actData then return end |
@@ -469,7 +512,7 @@ function Activity:refreshDailyData(notify) | @@ -469,7 +512,7 @@ function Activity:refreshDailyData(notify) | ||
469 | if status and actData then | 512 | if status and actData then |
470 | local actType = actData.showType | 513 | local actType = actData.showType |
471 | if activityFunc[actType] and activityFunc[actType]['crossDay'] then | 514 | if activityFunc[actType] and activityFunc[actType]['crossDay'] then |
472 | - activityFunc[actType]["crossDay"](self, actType, notify) | 515 | + activityFunc[actType]["crossDay"](self, actType, notify, actId) |
473 | end | 516 | end |
474 | end | 517 | end |
475 | end | 518 | end |
@@ -486,8 +529,8 @@ end | @@ -486,8 +529,8 @@ end | ||
486 | -- 获取此次挂机掉落翻倍时长 | 529 | -- 获取此次挂机掉落翻倍时长 |
487 | function Activity:getActHangDoubleTime(lastTs, nowTs) | 530 | function Activity:getActHangDoubleTime(lastTs, nowTs) |
488 | local type = "DoubleDrop" | 531 | local type = "DoubleDrop" |
489 | - local actId = checkActivityType(type) | ||
490 | - local isOpen = self:isOpen(type) | 532 | + --local actId = checkActivityType(type) |
533 | + local isOpen, actId = self:isOpen(type) | ||
491 | local openTs = self:getProperty("actime")[actId] or 0 | 534 | local openTs = self:getProperty("actime")[actId] or 0 |
492 | local timeNow = skynet.timex() | 535 | local timeNow = skynet.timex() |
493 | lastTs = math.max(lastTs, openTs) | 536 | lastTs = math.max(lastTs, openTs) |
@@ -569,7 +612,7 @@ function Activity:recycleActItem(actId) | @@ -569,7 +612,7 @@ function Activity:recycleActItem(actId) | ||
569 | if not actCfg then return end | 612 | if not actCfg then return end |
570 | local gift = {} | 613 | local gift = {} |
571 | local costs = {} | 614 | local costs = {} |
572 | - for _, arr in ipairs(role:getItemCount(actCfg.recycle):toTableArray(true)) do | 615 | + for _, arr in ipairs(actCfg.recycle:toTableArray(true)) do |
573 | local fromId, toId, toNum = arr[1], arr[2], arr[3] | 616 | local fromId, toId, toNum = arr[1], arr[2], arr[3] |
574 | local itemCount = role:getItemCount(fromId) | 617 | local itemCount = role:getItemCount(fromId) |
575 | if itemCount > 0 then | 618 | if itemCount > 0 then |
src/models/HeroPlugin.lua
@@ -126,11 +126,11 @@ function HeroPlugin.bind(Hero) | @@ -126,11 +126,11 @@ function HeroPlugin.bind(Hero) | ||
126 | end | 126 | end |
127 | 127 | ||
128 | -- 羁绊加成 | 128 | -- 羁绊加成 |
129 | - if params.activeRelation then | ||
130 | - for k, attName in pairs(AttsEnumEx) do | ||
131 | - attrs[attName] = attrs[attName] + addAttr(attrs[attName], params.activeRelation[attName], 1, attName) | ||
132 | - end | ||
133 | - end | 129 | + -- if params.activeRelation then |
130 | + -- for k, attName in pairs(AttsEnumEx) do | ||
131 | + -- attrs[attName] = attrs[attName] + addAttr(attrs[attName], params.activeRelation[attName], 1, attName) | ||
132 | + -- end | ||
133 | + -- end | ||
134 | return attrs | 134 | return attrs |
135 | end | 135 | end |
136 | 136 | ||
@@ -224,8 +224,10 @@ function HeroPlugin.bind(Hero) | @@ -224,8 +224,10 @@ function HeroPlugin.bind(Hero) | ||
224 | 224 | ||
225 | 225 | ||
226 | -- 战斗力(当前属性)= POWER[(生命 + 防御 * 7 + 闪避 * 4)*(攻击*4 + 命中 * 2)*(1 + 暴击几率/100 * 暴击伤害/100)* 攻击速度 / 60000 ,0.8 ] | 226 | -- 战斗力(当前属性)= POWER[(生命 + 防御 * 7 + 闪避 * 4)*(攻击*4 + 命中 * 2)*(1 + 暴击几率/100 * 暴击伤害/100)* 攻击速度 / 60000 ,0.8 ] |
227 | - function Hero:getBattleValue(activeRelation) -- isReal包括队伍加成 | ||
228 | - local attrs = self:getTotalAttrs({activeRelation = activeRelation}) | 227 | + -- function Hero:getBattleValue(activeRelation) -- isReal包括队伍加成 |
228 | + function Hero:getBattleValue() -- isReal包括队伍加成 | ||
229 | + -- local attrs = self:getTotalAttrs({activeRelation = activeRelation}) | ||
230 | + local attrs = self:getTotalAttrs() | ||
229 | local battleValue = ((attrs["hp"] + attrs["def"] * 7 + attrs["miss"] * 4) * (attrs["atk"] * 4 + attrs["hit"] * 2) * (1 + attrs["crit"]/100 * attrs["critHurt"]/100) * attrs["atkSpeed"] / 600000) ^ 0.8 | 231 | local battleValue = ((attrs["hp"] + attrs["def"] * 7 + attrs["miss"] * 4) * (attrs["atk"] * 4 + attrs["hit"] * 2) * (1 + attrs["crit"]/100 * attrs["critHurt"]/100) * attrs["atkSpeed"] / 600000) ^ 0.8 |
230 | return math.floor(battleValue) | 232 | return math.floor(battleValue) |
231 | end | 233 | end |
src/models/RoleLog.lua
@@ -46,6 +46,7 @@ local ItemReason = { | @@ -46,6 +46,7 @@ local ItemReason = { | ||
46 | actExchange = 131, -- 兑换活动 | 46 | actExchange = 131, -- 兑换活动 |
47 | actGachakon = 132, -- 扭蛋活动 | 47 | actGachakon = 132, -- 扭蛋活动 |
48 | totalRecharge = 133, -- 累计充值奖励 | 48 | totalRecharge = 133, -- 累计充值奖励 |
49 | + actHangDrop = 134, -- 掉落活动奖励 | ||
49 | 50 | ||
50 | 51 | ||
51 | advHang = 301, -- 拾荒挂机 | 52 | advHang = 301, -- 拾荒挂机 |
src/models/RolePlugin.lua
@@ -102,6 +102,35 @@ function RolePlugin.bind(Role) | @@ -102,6 +102,35 @@ function RolePlugin.bind(Role) | ||
102 | [ItemType.FuncOpen] = function() | 102 | [ItemType.FuncOpen] = function() |
103 | self:funcOpen(itemId, count, pms) | 103 | self:funcOpen(itemId, count, pms) |
104 | end, | 104 | end, |
105 | + [ItemType.HeroFCommon] = function() | ||
106 | + if itemData.use_type == 2 then | ||
107 | + local randomData = csvdb["item_randomCsv"][tonumber(itemData.use_effect)] | ||
108 | + for _i = 1, count do | ||
109 | + for i = 1, 10 do | ||
110 | + local num = randomData["num" .. i] | ||
111 | + local gift = randomData["gift" .. i] | ||
112 | + if num and gift and num > 0 and gift ~= "" then | ||
113 | + local pool = {} | ||
114 | + for _, temp in ipairs(gift:toArray()) do | ||
115 | + table.insert(pool, temp:toArray(true, "=")) | ||
116 | + end | ||
117 | + local needCount = math.min(#pool, num) | ||
118 | + for j = 1, needCount do | ||
119 | + local idx = math.randWeight(pool, 3) | ||
120 | + change[pool[idx][1]] = (change[pool[idx][1]] or 0) + pool[idx][2] | ||
121 | + table.remove(pool, idx) | ||
122 | + end | ||
123 | + end | ||
124 | + end | ||
125 | + end | ||
126 | + change[0] = nil | ||
127 | + count = 0 | ||
128 | + else | ||
129 | + pms.itemId = itemId | ||
130 | + pms.count = count | ||
131 | + self:addItem(pms) | ||
132 | + end | ||
133 | + end, | ||
105 | } | 134 | } |
106 | -- 对数量筛查 | 135 | -- 对数量筛查 |
107 | count = checkItemCount(self, itemId, count) | 136 | count = checkItemCount(self, itemId, count) |
@@ -806,50 +835,50 @@ function RolePlugin.bind(Role) | @@ -806,50 +835,50 @@ function RolePlugin.bind(Role) | ||
806 | SendPacket(actionCodes.Sys_maintainNotice, MsgPack.pack({ body = text, iskey = not isNotKey})) | 835 | SendPacket(actionCodes.Sys_maintainNotice, MsgPack.pack({ body = text, iskey = not isNotKey})) |
807 | end | 836 | end |
808 | 837 | ||
809 | - function Role:getHeroActiveRelationData(heros) | ||
810 | - local relations = {} | ||
811 | - for _, id in pairs(heros or {}) do | ||
812 | - local hero = self.heros[id] | ||
813 | - if hero then | ||
814 | - local camp = csvdb["unitCsv"][hero:getProperty("type")].camp | ||
815 | - relations[camp] = (relations[camp] or 0) + 1 | ||
816 | - end | ||
817 | - end | ||
818 | - local curData = csvdb["unit_relationCsv"][0] | ||
819 | - if not next(relations) then return curData end | 838 | + -- function Role:getHeroActiveRelationData(heros) |
839 | + -- local relations = {} | ||
840 | + -- for _, id in pairs(heros or {}) do | ||
841 | + -- local hero = self.heros[id] | ||
842 | + -- if hero then | ||
843 | + -- local camp = csvdb["unitCsv"][hero:getProperty("type")].camp | ||
844 | + -- relations[camp] = (relations[camp] or 0) + 1 | ||
845 | + -- end | ||
846 | + -- end | ||
847 | + -- local curData = csvdb["unit_relationCsv"][0] | ||
848 | + -- if not next(relations) then return curData end | ||
820 | 849 | ||
821 | - for _, data in ipairs(csvdb["unit_relationCsv"]) do | ||
822 | - local had = {} | ||
823 | - local isDone = true | ||
824 | - for _, count in pairs(data.relation:toArray(true, "=")) do | ||
825 | - local find = false | ||
826 | - for camp, _count in pairs(relations) do | ||
827 | - if count == _count and not had[camp] then | ||
828 | - had[camp] = true | ||
829 | - find = true | ||
830 | - break | ||
831 | - end | ||
832 | - end | ||
833 | - if not find then | ||
834 | - isDone = false | ||
835 | - break | ||
836 | - end | ||
837 | - end | ||
838 | - if isDone then | ||
839 | - curData = data | ||
840 | - end | ||
841 | - end | ||
842 | - return curData | ||
843 | - end | ||
844 | - | ||
845 | - function Role:getHeroActiveRelation(heros) | ||
846 | - local data = self:getHeroActiveRelationData(heros) | ||
847 | - local result = {} | ||
848 | - for attr, value in pairs(data.effect:toNumMap()) do | ||
849 | - result[AttsEnumEx[attr]] = (result[AttsEnumEx[attr]] or 0) + value | ||
850 | - end | ||
851 | - return result | ||
852 | - end | 850 | + -- for _, data in ipairs(csvdb["unit_relationCsv"]) do |
851 | + -- local had = {} | ||
852 | + -- local isDone = true | ||
853 | + -- for _, count in pairs(data.relation:toArray(true, "=")) do | ||
854 | + -- local find = false | ||
855 | + -- for camp, _count in pairs(relations) do | ||
856 | + -- if count == _count and not had[camp] then | ||
857 | + -- had[camp] = true | ||
858 | + -- find = true | ||
859 | + -- break | ||
860 | + -- end | ||
861 | + -- end | ||
862 | + -- if not find then | ||
863 | + -- isDone = false | ||
864 | + -- break | ||
865 | + -- end | ||
866 | + -- end | ||
867 | + -- if isDone then | ||
868 | + -- curData = data | ||
869 | + -- end | ||
870 | + -- end | ||
871 | + -- return curData | ||
872 | + -- end | ||
873 | + | ||
874 | + -- function Role:getHeroActiveRelation(heros) | ||
875 | + -- local data = self:getHeroActiveRelationData(heros) | ||
876 | + -- local result = {} | ||
877 | + -- for attr, value in pairs(data.effect:toNumMap()) do | ||
878 | + -- result[AttsEnumEx[attr]] = (result[AttsEnumEx[attr]] or 0) + value | ||
879 | + -- end | ||
880 | + -- return result | ||
881 | + -- end | ||
853 | 882 | ||
854 | function Role:getHerosCamp(heros) | 883 | function Role:getHerosCamp(heros) |
855 | local had = {} | 884 | local had = {} |
@@ -870,14 +899,16 @@ function RolePlugin.bind(Role) | @@ -870,14 +899,16 @@ function RolePlugin.bind(Role) | ||
870 | return curCamp | 899 | return curCamp |
871 | end | 900 | end |
872 | 901 | ||
873 | - function Role:getRealBattleValue(heros, activeRelation) -- 获取队伍战斗力 羁绊加成 | 902 | + -- function Role:getRealBattleValue(heros, activeRelation) -- 获取队伍战斗力 羁绊加成 |
903 | + function Role:getRealBattleValue(heros) -- 获取队伍战斗力 羁绊加成 | ||
874 | heros = heros or {} | 904 | heros = heros or {} |
875 | - local activeRelation = activeRelation or self:getHeroActiveRelation(heros) | 905 | + -- local activeRelation = activeRelation or self:getHeroActiveRelation(heros) |
876 | local battleValue = 0 | 906 | local battleValue = 0 |
877 | for _, id in pairs(heros) do | 907 | for _, id in pairs(heros) do |
878 | local hero = self.heros[id] | 908 | local hero = self.heros[id] |
879 | if hero then | 909 | if hero then |
880 | - battleValue = battleValue + hero:getBattleValue(activeRelation) | 910 | + -- battleValue = battleValue + hero:getBattleValue(activeRelation) |
911 | + battleValue = battleValue + hero:getBattleValue() | ||
881 | end | 912 | end |
882 | end | 913 | end |
883 | return battleValue | 914 | return battleValue |
@@ -1263,7 +1294,7 @@ function RolePlugin.bind(Role) | @@ -1263,7 +1294,7 @@ function RolePlugin.bind(Role) | ||
1263 | 1294 | ||
1264 | function Role:getTeamBattleInfo(team) | 1295 | function Role:getTeamBattleInfo(team) |
1265 | local teamInfo = {heros = {}, supports = {}} | 1296 | local teamInfo = {heros = {}, supports = {}} |
1266 | - local activeRelation = self:getHeroActiveRelation(team.heros) | 1297 | + -- local activeRelation = self:getHeroActiveRelation(team.heros) |
1267 | 1298 | ||
1268 | for slot, id in pairs(team.heros or {}) do | 1299 | for slot, id in pairs(team.heros or {}) do |
1269 | local info = {} | 1300 | local info = {} |
@@ -1271,7 +1302,8 @@ function RolePlugin.bind(Role) | @@ -1271,7 +1302,8 @@ function RolePlugin.bind(Role) | ||
1271 | if not hero then | 1302 | if not hero then |
1272 | print("error heroid " .. id) | 1303 | print("error heroid " .. id) |
1273 | end | 1304 | end |
1274 | - local attrs = hero:getTotalAttrs({activeRelation = activeRelation}) | 1305 | + -- local attrs = hero:getTotalAttrs({activeRelation = activeRelation}) |
1306 | + local attrs = hero:getTotalAttrs() | ||
1275 | for k, v in pairs(AttsEnumEx) do | 1307 | for k, v in pairs(AttsEnumEx) do |
1276 | info[v] = (attrs[v] or 0) | 1308 | info[v] = (attrs[v] or 0) |
1277 | end | 1309 | end |
src/models/RolePvp.lua
@@ -6,7 +6,12 @@ RolePvp.bind = function (Role) | @@ -6,7 +6,12 @@ RolePvp.bind = function (Role) | ||
6 | local PVP_RANK_TIME_SORT_STD = 1924876800 -- 2030-12-31 00:00:00 | 6 | local PVP_RANK_TIME_SORT_STD = 1924876800 -- 2030-12-31 00:00:00 |
7 | local PVP_RANK_TIME_SORT_PLACE = 1000000 -- 时间戳占据 6位数 | 7 | local PVP_RANK_TIME_SORT_PLACE = 1000000 -- 时间戳占据 6位数 |
8 | local PVP_RANK_TIME_SORT_PRECISION = 360 -- 时间精度 每6分钟忽略差异 | 8 | local PVP_RANK_TIME_SORT_PRECISION = 360 -- 时间精度 每6分钟忽略差异 |
9 | -local PVP_RANK_ROBOT_SCORE = globalCsv.pvp_base_score -- 机器人积分 | 9 | +local PVP_RANK_BASE_SCORE = globalCsv.pvp_base_score -- 初始积分 |
10 | + | ||
11 | +-- 匹配规则改为以排名来匹配 | ||
12 | +local PVP_GET_ROBOT_SCORE = 2400 -- 2400分以下低档位匹配机器人 | ||
13 | +local PRE_RANGE_COUNT = 20 -- 每个档位人数 | ||
14 | +local NEED_MATCH = 3 --匹配到多少人 | ||
10 | 15 | ||
11 | 16 | ||
12 | function Role:unpackPvpScore(score) | 17 | function Role:unpackPvpScore(score) |
@@ -34,7 +39,7 @@ function Role:changePvpScore(rankKey, changeScoreCallback, matchId) | @@ -34,7 +39,7 @@ function Role:changePvpScore(rankKey, changeScoreCallback, matchId) | ||
34 | end) | 39 | end) |
35 | local myScore = self:unpackPvpScore(redret[1]) | 40 | local myScore = self:unpackPvpScore(redret[1]) |
36 | local oldMyRank = tonumber(redret[2] or -2) + 1 | 41 | local oldMyRank = tonumber(redret[2] or -2) + 1 |
37 | - local matchScore = PVP_RANK_ROBOT_SCORE | 42 | + local matchScore = PVP_RANK_BASE_SCORE |
38 | if isPlayer then | 43 | if isPlayer then |
39 | matchScore = self:unpackPvpScore(redret[3]) | 44 | matchScore = self:unpackPvpScore(redret[3]) |
40 | end | 45 | end |
@@ -68,7 +73,7 @@ function Role:changePvpScoreCommon(matchId, isWin) | @@ -68,7 +73,7 @@ function Role:changePvpScoreCommon(matchId, isWin) | ||
68 | if isWin then | 73 | if isWin then |
69 | local scoreChange = math.ceil(60 / (1 + 10 ^ ((myScore - matchScore) / 400))) | 74 | local scoreChange = math.ceil(60 / (1 + 10 ^ ((myScore - matchScore) / 400))) |
70 | myScore = myScore + scoreChange | 75 | myScore = myScore + scoreChange |
71 | - matchScore = matchScore - scoreChange | 76 | + matchScore = matchScore - math.ceil(scoreChange / 3) -- 防守方失败时,扣分减为原来的1/3 |
72 | else | 77 | else |
73 | local scoreChange = math.ceil(60 / (1 + 10 ^ ((matchScore - myScore) / 400))) | 78 | local scoreChange = math.ceil(60 / (1 + 10 ^ ((matchScore - myScore) / 400))) |
74 | myScore = myScore - scoreChange | 79 | myScore = myScore - scoreChange |
@@ -78,7 +83,7 @@ function Role:changePvpScoreCommon(matchId, isWin) | @@ -78,7 +83,7 @@ function Role:changePvpScoreCommon(matchId, isWin) | ||
78 | end | 83 | end |
79 | 84 | ||
80 | local result = self:changePvpScore(RANK_PVP_COMMON, changeScoreCallback, matchId) | 85 | local result = self:changePvpScore(RANK_PVP_COMMON, changeScoreCallback, matchId) |
81 | - self:refreshPvpMatchC(result[1]) | 86 | + self:refreshPvpMatchC(result[1], result[5]) |
82 | return table.unpack(result) | 87 | return table.unpack(result) |
83 | end | 88 | end |
84 | 89 | ||
@@ -134,7 +139,7 @@ function Role:changePvpScoreHigh(matchId, isWin) | @@ -134,7 +139,7 @@ function Role:changePvpScoreHigh(matchId, isWin) | ||
134 | if isWin then | 139 | if isWin then |
135 | local scoreChange = math.ceil(50 / (1 + 10 ^ ((myScore - matchScore) / 1000))) | 140 | local scoreChange = math.ceil(50 / (1 + 10 ^ ((myScore - matchScore) / 1000))) |
136 | myScore = myScore + scoreChange | 141 | myScore = myScore + scoreChange |
137 | - matchScore = matchScore - scoreChange | 142 | + matchScore = matchScore - math.ceil(scoreChange / 3) -- 防守方失败时,扣分减为原来的1/3 |
138 | else | 143 | else |
139 | local scoreChange = math.ceil(50 / (1 + 10 ^ ((matchScore - myScore) / 1000))) | 144 | local scoreChange = math.ceil(50 / (1 + 10 ^ ((matchScore - myScore) / 1000))) |
140 | myScore = myScore - scoreChange | 145 | myScore = myScore - scoreChange |
@@ -162,85 +167,50 @@ function Role:changePvpScoreHigh(matchId, isWin) | @@ -162,85 +167,50 @@ function Role:changePvpScoreHigh(matchId, isWin) | ||
162 | }) | 167 | }) |
163 | end | 168 | end |
164 | 169 | ||
165 | - self:refreshPvpMatchH(result[1]) | 170 | + self:refreshPvpMatchH(result[1], result[5]) |
166 | return table.unpack(result) | 171 | return table.unpack(result) |
167 | end | 172 | end |
168 | 173 | ||
169 | -function Role:refreshPvpMatch(score, rankKey) | 174 | +function Role:isInPvpRank(rankKey) |
175 | + local Fields = { | ||
176 | + [RANK_PVP_COMMON] = "pvpMC", | ||
177 | + [RANK_PVP_HIGHT] = "pvpMH", | ||
178 | + } | ||
179 | + local dbKey = self:getPvpDBKey(rankKey) | ||
180 | + local roleId = self:getProperty("id") | ||
181 | + if redisproxy:zscore(dbKey, roleId) then | ||
182 | + return true | ||
183 | + end | ||
184 | + return false | ||
185 | +end | ||
170 | 186 | ||
187 | +-- 新的匹配规则 | ||
188 | +function Role:refreshPvpMatch(score, rank, rankKey) | ||
171 | local Fields = { | 189 | local Fields = { |
172 | [RANK_PVP_COMMON] = "pvpMC", | 190 | [RANK_PVP_COMMON] = "pvpMC", |
173 | [RANK_PVP_HIGHT] = "pvpMH", | 191 | [RANK_PVP_HIGHT] = "pvpMH", |
174 | } | 192 | } |
175 | local RobotCsvs = { | 193 | local RobotCsvs = { |
176 | [RANK_PVP_COMMON] = "pvp_robotCsv", | 194 | [RANK_PVP_COMMON] = "pvp_robotCsv", |
177 | - [RANK_PVP_HIGHT] = "pvp_robotCsv", | 195 | + [RANK_PVP_HIGHT] = "pvp_robot_groupCsv", |
178 | } | 196 | } |
197 | + | ||
179 | local mField = Fields[rankKey] | 198 | local mField = Fields[rankKey] |
180 | local robotCsv = RobotCsvs[rankKey] | 199 | local robotCsv = RobotCsvs[rankKey] |
181 | - local dbKey = self:getPvpDBKey(rankKey) | ||
182 | 200 | ||
201 | + local dbKey = self:getPvpDBKey(rankKey) | ||
183 | local roleId = self:getProperty("id") | 202 | local roleId = self:getProperty("id") |
184 | - score = score or self:unpackPvpScore(redisproxy:zscore(dbKey, roleId)) | ||
185 | - | ||
186 | - local function getPlayers(levels) | 203 | + if not score and not rank then |
187 | local redret = redisproxy:pipelining(function(red) | 204 | local redret = redisproxy:pipelining(function(red) |
188 | - for _, level in ipairs(levels) do | ||
189 | - local low, high = table.unpack(level) | ||
190 | - red:zadd(dbKey, low * PVP_RANK_TIME_SORT_PLACE, "std_temp1") | ||
191 | - red:zadd(dbKey, high * PVP_RANK_TIME_SORT_PLACE + PVP_RANK_TIME_SORT_PLACE - 1, "std_temp2") | ||
192 | - red:ZREVRANK(dbKey, "std_temp1") | ||
193 | - red:ZREVRANK(dbKey, "std_temp2") | ||
194 | - end | ||
195 | - red:zrem(dbKey, "std_temp1", "std_temp2") | 205 | + red:zscore(dbKey, roleId) |
206 | + red:zrevrank(dbKey, roleId) | ||
196 | end) | 207 | end) |
197 | - | ||
198 | - local PreGetCount = 7 | ||
199 | - local redret = redisproxy:pipelining(function(red) | ||
200 | - for idx, level in ipairs(levels) do | ||
201 | - local rank1 = tonumber(redret[(idx - 1) * 4 + 3]) | ||
202 | - local rank2 = tonumber(redret[(idx - 1) * 4 + 4]) | ||
203 | - if rank1 - rank2 > PreGetCount then | ||
204 | - rank2 = math.randomInt(rank2, rank1 - PreGetCount + 1) | ||
205 | - rank1 = rank2 + PreGetCount - 1 | ||
206 | - end | ||
207 | - red:ZREVRANGE(dbKey, rank2, rank1) | ||
208 | - end | ||
209 | - end) | ||
210 | - return redret | ||
211 | - end | ||
212 | - | ||
213 | - local findIdx = #globalCsv.pvp_division | ||
214 | - for idx, limit in ipairs(globalCsv.pvp_division) do | ||
215 | - if score < limit then | ||
216 | - findIdx = idx - 1 | ||
217 | - break | ||
218 | - end | 208 | + score = self:unpackPvpScore(redret[1]) |
209 | + rank = tonumber(redret[2] or -2) + 1 | ||
219 | end | 210 | end |
220 | - local levels = { | ||
221 | - {}, {}, {} | ||
222 | - } | ||
223 | - if globalCsv.pvp_division[findIdx + 1] then | ||
224 | - levels[1] = {globalCsv.pvp_division[findIdx + 1], (globalCsv.pvp_division[findIdx + 2] or 100000000) - 1} | ||
225 | - end | ||
226 | - levels[2] = {globalCsv.pvp_division[findIdx], (globalCsv.pvp_division[findIdx + 1] or 100000000) - 1} | ||
227 | - if globalCsv.pvp_division[findIdx - 1] then | ||
228 | - levels[3] = {globalCsv.pvp_division[findIdx - 1], globalCsv.pvp_division[findIdx] - 1} | ||
229 | - end | ||
230 | - local redirect = {} | ||
231 | - for i = #levels , 1, -1 do | ||
232 | - if not next(levels[i]) then | ||
233 | - table.remove(levels, i) | ||
234 | - redirect[i] = -1 | ||
235 | - for _, v in pairs(redirect) do | ||
236 | - redirect[_] = v - 1 | ||
237 | - end | ||
238 | - else | ||
239 | - redirect[i] = i | ||
240 | - end | ||
241 | - end | ||
242 | - | ||
243 | - local result = getPlayers(levels) | 211 | + score = score or self:unpackPvpScore(redisproxy:zscore(dbKey, roleId)) |
212 | + rank = rank or tonumber(redisproxy:zrevrank(dbKey, roleId) or -2) + 1 | ||
213 | + | ||
244 | local match = self:getProperty(mField) | 214 | local match = self:getProperty(mField) |
245 | local hadPlayer = {[roleId] = 1} | 215 | local hadPlayer = {[roleId] = 1} |
246 | local hadRobot = {} | 216 | local hadRobot = {} |
@@ -252,97 +222,261 @@ function Role:refreshPvpMatch(score, rankKey) | @@ -252,97 +222,261 @@ function Role:refreshPvpMatch(score, rankKey) | ||
252 | end | 222 | end |
253 | end | 223 | end |
254 | 224 | ||
255 | - for _, temp in pairs(result) do | ||
256 | - for i = #temp, 1, -1 do | ||
257 | - local id = tonumber(temp[i]) | ||
258 | - if hadPlayer[id] then | ||
259 | - table.remove(temp, i) | ||
260 | - else | ||
261 | - temp[i] = id | ||
262 | - hadPlayer[id] = 1 | ||
263 | - end | 225 | + local tempMatch = {} |
226 | + local needRobot = 0 | ||
227 | + -- -1 没有上榜 | ||
228 | + if rank == -1 then | ||
229 | + needRobot = NEED_MATCH | ||
230 | + else | ||
231 | + local need = PRE_RANGE_COUNT * NEED_MATCH | ||
232 | + local low, heigh = math.floor(rank - need / 2 - 1), math.floor(rank + need / 2 - 1) | ||
233 | + if low < 0 then | ||
234 | + low = 0 | ||
264 | end | 235 | end |
265 | - end | ||
266 | - -- 增加第几个 | ||
267 | - local function getPlayer(idx) | ||
268 | - for i = idx, 3 do | ||
269 | - if redirect[i] ~= -1 then | ||
270 | - local curR = result[redirect[i]] or {} | ||
271 | - if next(curR) then | ||
272 | - local curIdx = math.randomInt(1, #curR) | ||
273 | - local objId = curR[curIdx] | ||
274 | - table.remove(curR, curIdx) | ||
275 | - return objId | ||
276 | - end | 236 | + print(low, heigh) |
237 | + local rangeIds = redisproxy:ZREVRANGE(dbKey, low, heigh) | ||
238 | + local lastRangeIds = {} | ||
239 | + for idx, one in ipairs(rangeIds) do | ||
240 | + local cid = tonumber(one) | ||
241 | + if not hadPlayer[cid] then | ||
242 | + lastRangeIds[#lastRangeIds + 1] = cid | ||
277 | end | 243 | end |
278 | end | 244 | end |
279 | - end | ||
280 | - | ||
281 | - local tempMatch = {} | ||
282 | - local curCount = 0 | ||
283 | - for i = 1, 3 do | ||
284 | - local objId = getPlayer(i) | ||
285 | - if objId then | ||
286 | - tempMatch[i] = {t = 1, id = objId} | ||
287 | - curCount = curCount + 1 | 245 | + if score < PVP_GET_ROBOT_SCORE then |
246 | + needRobot = 1 | ||
288 | end | 247 | end |
289 | - end | ||
290 | - | ||
291 | - -- 正常的玩家不够了 低一档继续 | ||
292 | - if curCount < 3 then | ||
293 | - local level = nil | ||
294 | - if globalCsv.pvp_division[findIdx - 2] then | ||
295 | - level = {globalCsv.pvp_division[findIdx - 2], globalCsv.pvp_division[findIdx - 1] - 1} | 248 | + local len = #lastRangeIds |
249 | + if len < NEED_MATCH then | ||
250 | + needRobot = NEED_MATCH - len | ||
296 | end | 251 | end |
297 | - if level then | ||
298 | - local result = getPlayers({level})[1] or {} | ||
299 | - for i = #result, 1, -1 do | ||
300 | - local id = tonumber(result[i]) | ||
301 | - if hadPlayer[id] then | ||
302 | - table.remove(result, i) | ||
303 | - else | ||
304 | - result[i] = id | ||
305 | - hadPlayer[id] = 1 | ||
306 | - end | 252 | + local needPlayer = NEED_MATCH - needRobot |
253 | + if needPlayer > 0 then | ||
254 | + local pre = math.floor(len / needPlayer) | ||
255 | + for i = 1, needPlayer do | ||
256 | + local idx = math.randomInt((i - 1) * pre + 1, i * pre) | ||
257 | + tempMatch[#tempMatch + 1] = {t = 1, id = lastRangeIds[idx]} | ||
307 | end | 258 | end |
259 | + end | ||
308 | 260 | ||
309 | - if next(result) then | ||
310 | - for i = curCount + 1, 3 do | ||
311 | - local curIdx = math.randomInt(1, #result) | ||
312 | - local objId = result[curIdx] | ||
313 | - table.remove(result, curIdx) | ||
314 | - tempMatch[i] = {t = 1, id = objId} | ||
315 | - curCount = curCount + 1 | ||
316 | - if not next(result) then | ||
317 | - break | ||
318 | - end | ||
319 | - end | 261 | + end |
262 | + if needRobot > 0 then | ||
263 | + local RobotPoolCount = 20 | ||
264 | + local max = #csvdb[robotCsv] | ||
265 | + local min = 1 | ||
266 | + local mid | ||
267 | + while min <= max do | ||
268 | + mid = math.floor((min + max) / 2) | ||
269 | + local tempPt = csvdb[robotCsv][mid].pt | ||
270 | + if score == tempPt then | ||
271 | + break | ||
272 | + elseif score > tempPt then | ||
273 | + min = mid + 1 | ||
274 | + elseif score < tempPt then | ||
275 | + max = mid - 1 | ||
320 | end | 276 | end |
321 | end | 277 | end |
322 | - end | ||
323 | - | ||
324 | - -- 增加机器人 | ||
325 | - if curCount < 3 then | ||
326 | - for i = curCount + 1, 3 do | ||
327 | - while true do | ||
328 | - local id = math.randomInt(1, #csvdb[robotCsv]) | ||
329 | - if not hadRobot[id] then | ||
330 | - hadRobot[id] = 1 | ||
331 | - tempMatch[i] = {t = 2, id = id} | ||
332 | - break | ||
333 | - end | 278 | + assert(mid, "pvp no robot " .. robotCsv) |
279 | + local low = mid - RobotPoolCount / 2 | ||
280 | + local heigh = mid + RobotPoolCount / 2 | ||
281 | + if low < 1 then | ||
282 | + heigh = heigh + (1 - low) | ||
283 | + low = 1 | ||
284 | + end | ||
285 | + if heigh > #csvdb[robotCsv] then | ||
286 | + heigh = #csvdb[robotCsv] | ||
287 | + end | ||
288 | + local pools = {} | ||
289 | + for i = low, heigh do | ||
290 | + if not hadRobot[i] then | ||
291 | + pools[#pools + 1] = i | ||
334 | end | 292 | end |
335 | end | 293 | end |
294 | + local pre = math.floor(#pools / needRobot) | ||
295 | + for i = 1, needRobot do | ||
296 | + local idx = math.randomInt((i - 1) * pre + 1, i * pre) | ||
297 | + tempMatch[#tempMatch + 1] = {t = 2, id = pools[idx]} | ||
298 | + end | ||
336 | end | 299 | end |
337 | self:setProperty(mField, tempMatch) | 300 | self:setProperty(mField, tempMatch) |
338 | end | 301 | end |
339 | 302 | ||
340 | -function Role:refreshPvpMatchC(score) | ||
341 | - self:refreshPvpMatch(score, RANK_PVP_COMMON) | 303 | +-- function Role:refreshPvpMatch(score, rank, rankKey) |
304 | + | ||
305 | +-- local Fields = { | ||
306 | +-- [RANK_PVP_COMMON] = "pvpMC", | ||
307 | +-- [RANK_PVP_HIGHT] = "pvpMH", | ||
308 | +-- } | ||
309 | +-- local RobotCsvs = { | ||
310 | +-- [RANK_PVP_COMMON] = "pvp_robotCsv", | ||
311 | +-- [RANK_PVP_HIGHT] = "pvp_robotCsv", | ||
312 | +-- } | ||
313 | +-- local mField = Fields[rankKey] | ||
314 | +-- local robotCsv = RobotCsvs[rankKey] | ||
315 | +-- local dbKey = self:getPvpDBKey(rankKey) | ||
316 | + | ||
317 | +-- local roleId = self:getProperty("id") | ||
318 | +-- score = score or self:unpackPvpScore(redisproxy:zscore(dbKey, roleId)) | ||
319 | + | ||
320 | +-- local function getPlayers(levels) | ||
321 | +-- local redret = redisproxy:pipelining(function(red) | ||
322 | +-- for _, level in ipairs(levels) do | ||
323 | +-- local low, high = table.unpack(level) | ||
324 | +-- red:zadd(dbKey, low * PVP_RANK_TIME_SORT_PLACE, "std_temp1") | ||
325 | +-- red:zadd(dbKey, high * PVP_RANK_TIME_SORT_PLACE + PVP_RANK_TIME_SORT_PLACE - 1, "std_temp2") | ||
326 | +-- red:ZREVRANK(dbKey, "std_temp1") | ||
327 | +-- red:ZREVRANK(dbKey, "std_temp2") | ||
328 | +-- end | ||
329 | +-- red:zrem(dbKey, "std_temp1", "std_temp2") | ||
330 | +-- end) | ||
331 | + | ||
332 | +-- local PreGetCount = 7 | ||
333 | +-- local redret = redisproxy:pipelining(function(red) | ||
334 | +-- for idx, level in ipairs(levels) do | ||
335 | +-- local rank1 = tonumber(redret[(idx - 1) * 4 + 3]) | ||
336 | +-- local rank2 = tonumber(redret[(idx - 1) * 4 + 4]) | ||
337 | +-- if rank1 - rank2 > PreGetCount then | ||
338 | +-- rank2 = math.randomInt(rank2, rank1 - PreGetCount + 1) | ||
339 | +-- rank1 = rank2 + PreGetCount - 1 | ||
340 | +-- end | ||
341 | +-- red:ZREVRANGE(dbKey, rank2, rank1) | ||
342 | +-- end | ||
343 | +-- end) | ||
344 | +-- return redret | ||
345 | +-- end | ||
346 | + | ||
347 | +-- local findIdx = #globalCsv.pvp_division | ||
348 | +-- for idx, limit in ipairs(globalCsv.pvp_division) do | ||
349 | +-- if score < limit then | ||
350 | +-- findIdx = idx - 1 | ||
351 | +-- break | ||
352 | +-- end | ||
353 | +-- end | ||
354 | +-- local levels = { | ||
355 | +-- {}, {}, {} | ||
356 | +-- } | ||
357 | +-- if globalCsv.pvp_division[findIdx + 1] then | ||
358 | +-- levels[1] = {globalCsv.pvp_division[findIdx + 1], (globalCsv.pvp_division[findIdx + 2] or 100000000) - 1} | ||
359 | +-- end | ||
360 | +-- levels[2] = {globalCsv.pvp_division[findIdx], (globalCsv.pvp_division[findIdx + 1] or 100000000) - 1} | ||
361 | +-- if globalCsv.pvp_division[findIdx - 1] then | ||
362 | +-- levels[3] = {globalCsv.pvp_division[findIdx - 1], globalCsv.pvp_division[findIdx] - 1} | ||
363 | +-- end | ||
364 | +-- local redirect = {} | ||
365 | +-- for i = #levels , 1, -1 do | ||
366 | +-- if not next(levels[i]) then | ||
367 | +-- table.remove(levels, i) | ||
368 | +-- redirect[i] = -1 | ||
369 | +-- for _, v in pairs(redirect) do | ||
370 | +-- redirect[_] = v - 1 | ||
371 | +-- end | ||
372 | +-- else | ||
373 | +-- redirect[i] = i | ||
374 | +-- end | ||
375 | +-- end | ||
376 | + | ||
377 | +-- local result = getPlayers(levels) | ||
378 | +-- local match = self:getProperty(mField) | ||
379 | +-- local hadPlayer = {[roleId] = 1} | ||
380 | +-- local hadRobot = {} | ||
381 | +-- for _, one in pairs(match) do | ||
382 | +-- if one.t == 1 then | ||
383 | +-- hadPlayer[one.id] = 1 | ||
384 | +-- elseif one.t == 2 then | ||
385 | +-- hadRobot[one.id] = 1 | ||
386 | +-- end | ||
387 | +-- end | ||
388 | + | ||
389 | +-- for _, temp in pairs(result) do | ||
390 | +-- for i = #temp, 1, -1 do | ||
391 | +-- local id = tonumber(temp[i]) | ||
392 | +-- if hadPlayer[id] then | ||
393 | +-- table.remove(temp, i) | ||
394 | +-- else | ||
395 | +-- temp[i] = id | ||
396 | +-- hadPlayer[id] = 1 | ||
397 | +-- end | ||
398 | +-- end | ||
399 | +-- end | ||
400 | +-- -- 增加第几个 | ||
401 | +-- local function getPlayer(idx) | ||
402 | +-- for i = idx, 3 do | ||
403 | +-- if redirect[i] ~= -1 then | ||
404 | +-- local curR = result[redirect[i]] or {} | ||
405 | +-- if next(curR) then | ||
406 | +-- local curIdx = math.randomInt(1, #curR) | ||
407 | +-- local objId = curR[curIdx] | ||
408 | +-- table.remove(curR, curIdx) | ||
409 | +-- return objId | ||
410 | +-- end | ||
411 | +-- end | ||
412 | +-- end | ||
413 | +-- end | ||
414 | + | ||
415 | +-- local tempMatch = {} | ||
416 | +-- local curCount = 0 | ||
417 | +-- for i = 1, 3 do | ||
418 | +-- local objId = getPlayer(i) | ||
419 | +-- if objId then | ||
420 | +-- tempMatch[i] = {t = 1, id = objId} | ||
421 | +-- curCount = curCount + 1 | ||
422 | +-- end | ||
423 | +-- end | ||
424 | + | ||
425 | +-- -- 正常的玩家不够了 低一档继续 | ||
426 | +-- if curCount < 3 then | ||
427 | +-- local level = nil | ||
428 | +-- if globalCsv.pvp_division[findIdx - 2] then | ||
429 | +-- level = {globalCsv.pvp_division[findIdx - 2], globalCsv.pvp_division[findIdx - 1] - 1} | ||
430 | +-- end | ||
431 | +-- if level then | ||
432 | +-- local result = getPlayers({level})[1] or {} | ||
433 | +-- for i = #result, 1, -1 do | ||
434 | +-- local id = tonumber(result[i]) | ||
435 | +-- if hadPlayer[id] then | ||
436 | +-- table.remove(result, i) | ||
437 | +-- else | ||
438 | +-- result[i] = id | ||
439 | +-- hadPlayer[id] = 1 | ||
440 | +-- end | ||
441 | +-- end | ||
442 | + | ||
443 | +-- if next(result) then | ||
444 | +-- for i = curCount + 1, 3 do | ||
445 | +-- local curIdx = math.randomInt(1, #result) | ||
446 | +-- local objId = result[curIdx] | ||
447 | +-- table.remove(result, curIdx) | ||
448 | +-- tempMatch[i] = {t = 1, id = objId} | ||
449 | +-- curCount = curCount + 1 | ||
450 | +-- if not next(result) then | ||
451 | +-- break | ||
452 | +-- end | ||
453 | +-- end | ||
454 | +-- end | ||
455 | +-- end | ||
456 | +-- end | ||
457 | + | ||
458 | +-- -- 增加机器人 | ||
459 | +-- if curCount < 3 then | ||
460 | +-- for i = curCount + 1, 3 do | ||
461 | +-- while true do | ||
462 | +-- local id = math.randomInt(1, #csvdb[robotCsv]) | ||
463 | +-- if not hadRobot[id] then | ||
464 | +-- hadRobot[id] = 1 | ||
465 | +-- tempMatch[i] = {t = 2, id = id} | ||
466 | +-- break | ||
467 | +-- end | ||
468 | +-- end | ||
469 | +-- end | ||
470 | +-- end | ||
471 | +-- self:setProperty(mField, tempMatch) | ||
472 | +-- end | ||
473 | + | ||
474 | +function Role:refreshPvpMatchC(score, rank) | ||
475 | + self:refreshPvpMatch(score, rank, RANK_PVP_COMMON) | ||
342 | end | 476 | end |
343 | 477 | ||
344 | -function Role:refreshPvpMatchH(score) | ||
345 | - self:refreshPvpMatch(score, RANK_PVP_HIGHT) | 478 | +function Role:refreshPvpMatchH(score, rank) |
479 | + self:refreshPvpMatch(score, rank, RANK_PVP_HIGHT) | ||
346 | end | 480 | end |
347 | 481 | ||
348 | function Role:getPvpDBKey(ptype) | 482 | function Role:getPvpDBKey(ptype) |