Commit 078bdb2fca0739af145cd47af2257ec40d93e93e
1 parent
f66891be
fix: 一番赏 特殊赏的抽奖记录的数据结构修改
1. 修改特殊赏抽奖记录的数据结构 {1={},2={}} key=触发特殊赏的 抽奖次数, v=特殊赏商品 table 方便客户端把特殊赏的抽奖记录给加入到普通商品的抽奖记录里 2. 修复reset_capsule指令无效的bug
Showing
2 changed files
with
59 additions
and
79 deletions
Show diff stats
src/models/Capsule.lua
... | ... | @@ -44,8 +44,8 @@ Capsule.schema = { |
44 | 44 | goods = {"table", {}}, --奖励池 |
45 | 45 | specials = {"table", {}}, --特殊赏 |
46 | 46 | incentive = {"table", {}}, --激励奖 |
47 | - incentiveRecord = {"table", {}}, --激励奖记录 | |
48 | - specialsRecord= {"table", {}}, --特殊赏领取记录 | |
47 | + incentiveRecord = {"table", {}}, --激励奖记录 {roleId = {}, roleId={}} | |
48 | + specialsRecord= {"table", {}}, --特殊赏领取记录 {1={},2={}} key=触发特殊赏的 抽奖次数, v=特殊赏商品 table | |
49 | 49 | resetTimes = {"number", 0}, --每日一次手动重置的机会 |
50 | 50 | hideTime = {"number", 0} , --隐藏时间 |
51 | 51 | drawEndTime = {"number", 0}, --抽完时间 |
... | ... | @@ -323,7 +323,7 @@ function Capsule:checkSpecialFlag(typ) |
323 | 323 | return spKey, special |
324 | 324 | end |
325 | 325 | |
326 | -local function getSpecialRoleNotify(rewardRecord, count, award, spKey, typ, now) | |
326 | +local function getSpecialReward(rewardRecord, count, award, spKey, typ, now) | |
327 | 327 | local rewardByRole = {} |
328 | 328 | while(count > 0 and next(rewardRecord)) do |
329 | 329 | local roleId = math.randWeight(rewardRecord, "amount") |
... | ... | @@ -334,19 +334,9 @@ local function getSpecialRoleNotify(rewardRecord, count, award, spKey, typ, now) |
334 | 334 | |
335 | 335 | if tmp["amount"] <= 0 then rewardRecord[roleId] = nil end |
336 | 336 | |
337 | - tmp = rewardByRole[roleId] or {} | |
338 | - if not next(tmp) then | |
339 | - local name = getNameByRoleId(roleId) | |
340 | - tmp[spKey] = {name = name, good_id = spKey, typ = RewardType.SPECIAL, award = award, amount = 1, quality = typ, create_time= now} | |
341 | - else | |
342 | - if not tmp[spKey] then | |
343 | - local name = getNameByRoleId(roleId) | |
344 | - tmp[spKey] = {name = name, good_id = spKey, typ = RewardType.SPECIAL, award = award, amount = 1, quality = typ, create_time= now} | |
345 | - else | |
346 | - tmp[spKey].amount = tmp[spKey].amount + 1 | |
347 | - end | |
348 | - end | |
349 | - rewardByRole[roleId] = tmp | |
337 | + local name = getNameByRoleId(roleId) | |
338 | + tmp = {name = name, good_id = spKey, typ = RewardType.SPECIAL, award = award, amount = 1, quality = typ, create_time= now} | |
339 | + table.insert(rewardByRole, tmp) | |
350 | 340 | |
351 | 341 | count = count - 1 |
352 | 342 | end |
... | ... | @@ -355,20 +345,11 @@ local function getSpecialRoleNotify(rewardRecord, count, award, spKey, typ, now) |
355 | 345 | end |
356 | 346 | |
357 | 347 | |
358 | -local rewardToNtyFunc = function(notify, tmpReward) | |
359 | - for key, val in pairs(tmpReward or {}) do | |
360 | - if not notify[key] then | |
361 | - notify[key] = clone(val) | |
362 | - else | |
363 | - for k, v in pairs(val) do | |
364 | - if not notify[key][k] then | |
365 | - notify[key][k] = v | |
366 | - else | |
367 | - notify[key][k] = notify[key][k].amount + v.amount | |
368 | - end | |
369 | - end | |
370 | - | |
371 | - end | |
348 | +local rewardToRecordFunc = function(specialsRecord, recordAmount, rewardByRole) | |
349 | + if not specialsRecord[recordAmount] then | |
350 | + specialsRecord[recordAmount] = rewardByRole | |
351 | + else | |
352 | + table.insert(specialsRecord[recordAmount], rewardByRole) | |
372 | 353 | end |
373 | 354 | end |
374 | 355 | |
... | ... | @@ -406,12 +387,12 @@ function Capsule:getTop(record, recordAmount,now) |
406 | 387 | end |
407 | 388 | end |
408 | 389 | |
409 | - local rewardByRole, count = getSpecialRoleNotify(topRecord, special["amount"], special["award"], spKey, SpecialType.TOP,now) | |
390 | + local rewardByRole, count = getSpecialReward(topRecord, special["amount"], special["award"], spKey, SpecialType.TOP,now) | |
410 | 391 | |
411 | 392 | special["amount"] = count |
412 | 393 | specials[spKey] = special |
413 | 394 | |
414 | - rewardToNtyFunc(specialsRecord, rewardByRole) | |
395 | + rewardToRecordFunc(specialsRecord, recordAmount, rewardByRole) | |
415 | 396 | |
416 | 397 | self:setProperties({specialsRecord = specialsRecord, specials = specials}) |
417 | 398 | return rewardByRole |
... | ... | @@ -455,17 +436,17 @@ function Capsule:getCore(record, recordAmount,now) |
455 | 436 | |
456 | 437 | end |
457 | 438 | |
458 | - local rewardByRole, count = getSpecialRoleNotify(roleRecord, special["amount"], special["award"], spKey, SpecialType.CORE,now) | |
439 | + local rewardByRole, count = getSpecialReward(roleRecord, special["amount"], special["award"], spKey, SpecialType.CORE,now) | |
459 | 440 | |
460 | 441 | special["amount"] = count |
461 | 442 | specials[spKey] = special |
462 | 443 | |
463 | - rewardToNtyFunc(specialsRecord, rewardByRole) | |
444 | + rewardToRecordFunc(specialsRecord, recordAmount, rewardByRole) | |
464 | 445 | self:setProperties({specialsRecord = specialsRecord, specials = specials}) |
465 | 446 | return rewardByRole |
466 | 447 | end |
467 | 448 | |
468 | -function Capsule:getLast(record,now) | |
449 | +function Capsule:getLast(record, recordAmount, now) | |
469 | 450 | local spKey, special = self:checkSpecialFlag(SpecialType.LAST) |
470 | 451 | if not special then return nil end |
471 | 452 | |
... | ... | @@ -495,17 +476,17 @@ function Capsule:getLast(record,now) |
495 | 476 | end |
496 | 477 | end |
497 | 478 | |
498 | - local rewardByRole, count = getSpecialRoleNotify(roleRecord, special["amount"], special["award"], spKey, SpecialType.LAST,now) | |
479 | + local rewardByRole, count = getSpecialReward(roleRecord, special["amount"], special["award"], spKey, SpecialType.LAST,now) | |
499 | 480 | |
500 | 481 | special["amount"] = count |
501 | 482 | specials[spKey] = special |
502 | 483 | |
503 | - rewardToNtyFunc(specialsRecord, rewardByRole) | |
484 | + rewardToRecordFunc(specialsRecord, recordAmount, rewardByRole) | |
504 | 485 | self:setProperties({specialsRecord = specialsRecord, specials = specials}) |
505 | 486 | return rewardByRole |
506 | 487 | end |
507 | 488 | |
508 | -function Capsule:getJoker(record,now) | |
489 | +function Capsule:getJoker(record, recordAmount, now) | |
509 | 490 | local spKey, special = self:checkSpecialFlag(SpecialType.JOKER) |
510 | 491 | if not special then return nil end |
511 | 492 | |
... | ... | @@ -521,17 +502,17 @@ function Capsule:getJoker(record,now) |
521 | 502 | end |
522 | 503 | end |
523 | 504 | |
524 | - local rewardByRole, count = getSpecialRoleNotify(roleRecord, special["amount"], special["award"], spKey, SpecialType.JOKER,now) | |
505 | + local rewardByRole, count = getSpecialReward(roleRecord, special["amount"], special["award"], spKey, SpecialType.JOKER,now) | |
525 | 506 | |
526 | 507 | special["amount"] = count |
527 | 508 | specials[spKey] = special |
528 | 509 | |
529 | - rewardToNtyFunc(specialsRecord, rewardByRole) | |
510 | + rewardToRecordFunc(specialsRecord, recordAmount, rewardByRole) | |
530 | 511 | self:setProperties({specialsRecord = specialsRecord, specials = specials}) |
531 | 512 | return rewardByRole |
532 | 513 | end |
533 | 514 | |
534 | -function Capsule:getKing(record,now) | |
515 | +function Capsule:getKing(record, recordAmount, now) | |
535 | 516 | local spKey, special = self:checkSpecialFlag(SpecialType.KING) |
536 | 517 | if not special then return nil end |
537 | 518 | |
... | ... | @@ -566,7 +547,7 @@ function Capsule:getKing(record,now) |
566 | 547 | special["amount"] = count |
567 | 548 | specials[spKey] = special |
568 | 549 | |
569 | - rewardToNtyFunc(specialsRecord, rewardByRole) | |
550 | + rewardToRecordFunc(specialsRecord, recordAmount, rewardByRole) | |
570 | 551 | self:setProperties({specialsRecord = specialsRecord, specials = specials}) |
571 | 552 | return rewardByRole |
572 | 553 | end |
... | ... | @@ -585,16 +566,16 @@ function Capsule:checkSpecialReward(now, goodsAmount) |
585 | 566 | |
586 | 567 | if goodsAmount == 0 then |
587 | 568 | local coreReward = self:getCore(record, recordAmount, now) |
588 | - rewardToNtyFunc(notify, coreReward) | |
569 | + rewardToRecordFunc(notify, recordAmount, coreReward) | |
589 | 570 | |
590 | - local lastReward = self:getLast(record, now) | |
591 | - rewardToNtyFunc(notify, lastReward) | |
571 | + local lastReward = self:getLast(record, recordAmount, now) | |
572 | + rewardToRecordFunc(notify, recordAmount, lastReward) | |
592 | 573 | |
593 | - local jokerReward = self:getJoker(record, now) | |
594 | - rewardToNtyFunc(notify, jokerReward) | |
574 | + local jokerReward = self:getJoker(record, recordAmount, now) | |
575 | + rewardToRecordFunc(notify, recordAmount, jokerReward) | |
595 | 576 | |
596 | - local kingReward = self:getKing(record, now) | |
597 | - rewardToNtyFunc(notify, kingReward) | |
577 | + local kingReward = self:getKing(record, recordAmount, now) | |
578 | + rewardToRecordFunc(notify, recordAmount, kingReward) | |
598 | 579 | end |
599 | 580 | |
600 | 581 | return notify |
... | ... | @@ -679,22 +660,25 @@ end |
679 | 660 | local rewardCollect = function(reward, goods) |
680 | 661 | for _, v in pairs(goods) do |
681 | 662 | for id, count in pairs(v.award:toNumMap()) do |
682 | - reward[id] = (reward[id] or 0) + count | |
663 | + reward[id] = (reward[id] or 0) + count * v.amount | |
683 | 664 | end |
684 | 665 | end |
685 | 666 | end |
686 | 667 | |
687 | 668 | local rewardCollectByRoleId = function(roleId, reward, goods) |
688 | 669 | local tmp = {} |
689 | - for key, val in pairs(goods) do | |
690 | - if roleId == key then | |
691 | - for k, v in pairs(val) do | |
670 | + for _, val in pairs(goods) do | |
671 | + for _, v in ipairs(val) do | |
672 | + if v.roleId == roleId then | |
692 | 673 | for id, count in pairs(v.award:toNumMap()) do |
693 | - reward[id] = (reward[id] or 0) + count | |
674 | + reward[id] = (reward[id] or 0) + count * v.amount | |
675 | + end | |
676 | + if not tmp[v.good_id] then | |
677 | + tmp[v.good_id] = v | |
678 | + else | |
679 | + tmp[v.good_id].amount = tmp[v.good_id].amount + v.amount | |
694 | 680 | end |
695 | - | |
696 | 681 | end |
697 | - tmp = val | |
698 | 682 | end |
699 | 683 | end |
700 | 684 | return tmp |
... | ... | @@ -898,17 +882,16 @@ end |
898 | 882 | --检查是否有未领取奖励的通知 |
899 | 883 | function Capsule:getSpecialNotify(roleId) |
900 | 884 | local specialsRecord = self:getProperty("specialsRecord") or {} |
901 | - local specialsRecordByRole = specialsRecord[roleId] | |
902 | - if not specialsRecordByRole then return nil end | |
903 | - | |
904 | 885 | local tmp = {} |
905 | - for good_id, good in pairs(specialsRecordByRole) do | |
906 | - if not good.nty or good.nty == 0 then | |
907 | - tmp[good_id] = good | |
886 | + for _, goods in pairs(specialsRecord) do | |
887 | + for _, good in ipairs(goods) do | |
888 | + if good.roleId == roleId then | |
889 | + if not good.nty or good.nty == 0 then | |
890 | + tmp[good.good_id] = good | |
891 | + end | |
892 | + end | |
908 | 893 | end |
909 | 894 | end |
910 | - | |
911 | - specialsRecord[roleId] = specialsRecordByRole | |
912 | 895 | self:setProperty("specialsRecord", specialsRecord) |
913 | 896 | |
914 | 897 | return tmp |
... | ... | @@ -916,16 +899,15 @@ end |
916 | 899 | |
917 | 900 | function Capsule:clearSpecialNty(roleId, good_ids) |
918 | 901 | local specialsRecord = self:getProperty("specialsRecord") or {} |
919 | - local specialsRecordByRole = specialsRecord[roleId] | |
920 | - if not specialsRecordByRole then return nil end | |
921 | - | |
922 | - for _, good_id in ipairs(good_ids) do | |
923 | - if specialsRecordByRole[good_id] then | |
924 | - specialsRecordByRole[good_id].nty = 1 | |
902 | + for _, goods in pairs(specialsRecord) do | |
903 | + for _, good in ipairs(goods) do | |
904 | + for _, good_id in ipairs(good_ids) do | |
905 | + if good_id == good.good_id and good.roleId == roleId then | |
906 | + good.nty = 1 | |
907 | + end | |
908 | + end | |
925 | 909 | end |
926 | 910 | end |
927 | - | |
928 | - specialsRecord[roleId] = specialsRecordByRole | |
929 | 911 | self:setProperty("specialsRecord", specialsRecord) |
930 | 912 | end |
931 | 913 | ... | ... |
src/services/capsuled.lua
... | ... | @@ -118,13 +118,11 @@ function CMD.reset() |
118 | 118 | for _, val in ipairs(data) do |
119 | 119 | if val.type == 1 then |
120 | 120 | local key = val.id..val.room |
121 | - if not capsules[key] then | |
122 | - local capsule = require("models.Capsule").new({ key = CAPSULE_PUBLIC:format(key), id= val.id, room = val.room, typ = 1, name=val.name}) | |
123 | - capsule:init() | |
124 | - capsule:create() | |
125 | - capsules[key] = capsule | |
126 | - redisproxy:sadd(CAPSULE_INFO, key) | |
127 | - end | |
121 | + local capsule = require("models.Capsule").new({ key = CAPSULE_PUBLIC:format(key), id= val.id, room = val.room, typ = 1, name=val.name}) | |
122 | + capsule:init() | |
123 | + capsule:create() | |
124 | + capsules[key] = capsule | |
125 | + redisproxy:sadd(CAPSULE_INFO, key) | |
128 | 126 | end |
129 | 127 | end |
130 | 128 | end | ... | ... |