Commit d10a9a364f5bc6b0ce50b8872a6de7e77fbe90df

Authored by zhangqijia
1 parent f382b4f2

fix: 一番赏增加通知信息的数据结构,掉线往capsule服务发送退出指令

1. 确定通知信息的数据结构
2. 奖励还是k=v形式
3. 掉线发送exit协议
src/actions/CapsuleAction.lua
... ... @@ -96,11 +96,11 @@ function _M.drawRpc(agent, data)
96 96 local full = msg.full -- 0=单次,1=十连抽 2=全收
97 97 local cares = msg.cares
98 98  
99   - local ret, reward, change
  99 + local ret, reward, change, capsule
100 100 if typ == 1 then
101   - ret, reward = skynet.call(agent.capsule_serv, "lua", "draw_capsule", roleId, capsuleId, full, cares)
  101 + ret, reward, capsule = skynet.call(agent.capsule_serv, "lua", "draw_capsule", roleId, capsuleId, full, cares)
102 102 else
103   - ret, reward = role:drawCapsule(capsuleId, full, cares)
  103 + ret, reward, capsule= role:drawCapsule(capsuleId, full, cares)
104 104 end
105 105 if ret < 4 then
106 106 return ret
... ... @@ -110,9 +110,9 @@ function _M.drawRpc(agent, data)
110 110 SendPacket(actionCodes.Capsule_drawRpc, MsgPack.pack(reward))
111 111 end
112 112  
113   - reward, change = role:award(reward, {log = {desc = "CapsuleReward", int1 = capsuleId, int2 = roleId}})
  113 + reward, change = role:award(reward, {log = {desc = "CapsuleReward", int1 = tonumber(capsuleId), int2 = roleId}})
114 114 dump(reward)
115   - SendPacket(actionCodes.Capsule_drawRpc, MsgPack.pack(role:packReward(reward, change)))
  115 + SendPacket(actionCodes.Capsule_drawRpc, MsgPack.pack({reward = reward, change= change, capsule = capsule}))
116 116 return true
117 117 end
118 118  
... ...
src/agent.lua
... ... @@ -283,6 +283,8 @@ function CMD.close()
283 283 mcast_util.usub_union()
284 284 local role = agentInfo.role
285 285 if not role then return end
  286 +
  287 + skynet.call(agent.capsule_serv, "lua", "exit", role:getProperty("id"))
286 288 role:log("onLogout", {logtime = skynet.timex()-role:getProperty("ltime")})
287 289 role:mylog("logout", {int1 = skynet.timex()-role:getProperty("ltime")})
288 290 role:onOfflineEvent()
... ...
src/models/Capsule.lua
... ... @@ -6,15 +6,18 @@ function Capsule:ctor(properties)
6 6 Capsule.super.ctor(self, properties)
7 7 end
8 8  
9   -RewardTYpe = {
10   - GOODS = 0,
  9 +RewardType = {
  10 + GOODS = 1,
  11 + SPECIAL = 2,
  12 + INCENTIVE = 3,
  13 +}
  14 +
  15 +SpecialType = {
11 16 TOP = 1,
12 17 CORE = 2,
13 18 LAST = 3,
14 19 JOKER = 4,
15 20 KING = 5,
16   - GOOD = 6,
17   - INCENTIVE = 7,
18 21 }
19 22  
20 23 CapsuleType = {
... ... @@ -22,10 +25,22 @@ CapsuleType = {
22 25 PUBLIC = 1,
23 26 }
24 27  
  28 +--[[
  29 +--通知数据结构
  30 +{
  31 +[roleId] = {
  32 + [good_id1] = {
  33 + },
  34 + [good_id2] = {
  35 + },
  36 +}
  37 +}
  38 +]]--
  39 +
25 40 Capsule.schema = {
26 41 id = {"number", 0}, --扭蛋机key,配置读取
27 42 room = {"number", 0}, --房间号, 配置读取
28   - name = {"string", 0},
  43 + name = {"string"},
29 44 typ = {"number", 1}, -- 1=共享,2=独享
30 45 coin = {"number", 0}, --货币代号
31 46 register = {"table", {}}, --人数 {["id"]=0}, 0 围观, 1 已报名
... ... @@ -35,8 +50,8 @@ Capsule.schema = {
35 50 goods = {"table", {}}, --奖励池
36 51 specials = {"table", {}}, --特殊赏
37 52 incentive = {"table", {}}, --激励奖
38   - specialsFlag= {"table", {}}, --特殊赏是否已经领取
39   - resetInfo = {"table", {}},
  53 + incentiveRecord = {"table", {}}, --激励奖记录
  54 + specialsRecord= {"table", {}}, --特殊赏领取记录
40 55 resetTimes = {"number", 0}, --每日一次手动重置的机会
41 56 hideTime = {"number", 0} , --隐藏时间
42 57 drawEndTime = {"number", 0}, --抽完时间
... ... @@ -100,8 +115,7 @@ function Capsule:getResetFields()
100 115 goods = {},
101 116 specials = {},
102 117 incentive = {},
103   - specialsFlag= {},
104   - resetInfo = {},
  118 + specialsRecord= {},
105 119 resetTimes = 0,
106 120 }
107 121 end
... ... @@ -123,7 +137,7 @@ function Capsule:init()
123 137 end
124 138 end
125 139 end
126   - for _, v in ipairs(goods) do
  140 + for _, v in pairs(goods) do
127 141 v.weight = (v.weight or 0) * v.amount
128 142 end
129 143  
... ... @@ -237,7 +251,7 @@ end
237 251 function Capsule:getGoodsAmount()
238 252 local goods = self:getProperty("goods") or {}
239 253 local amount = 0
240   - for _, v in ipairs(goods) do
  254 + for _, v in pairs(goods) do
241 255 amount = amount + v.amount
242 256 end
243 257 return amount
... ... @@ -253,74 +267,89 @@ function Capsule:getSpecialByType(typ)
253 267 return nil
254 268 end
255 269  
256   -function Capsule:getTop(record)
257   - local specialsFlag = self:getProperty("specialsFlag") or {}
258   - if specialsFlag[RewardTYpe.TOP] then return nil end
259   -
260   - local specials = self:getProperty("specials") or {}
261   - local spKey, special = self:getSpecialByType(RewardTYpe.TOP)
  270 +function Capsule:checkSpecialFlag(typ)
  271 + local spKey, special = self:getSpecialByType(typ)
262 272 if not special then return nil end
263 273  
264   - local np = special["np"]
265   - if #record >= special["np"] then
266   - local topRecord = {}
267   - local count = np
268   - for _, v in ipairs(record) do
269   - if count <= 0 then break end
  274 + if special["amount"] <= 0 then return nil end
  275 + return spKey, special
  276 +end
270 277  
271   - local tmpCount = 0
272   - if count >= v.amount then
273   - count = count - v.amount
274   - tmpCount = v.amount
275   - else
276   - tmpCount = count
277   - count = 0
278   - end
  278 +local function getSpecialRoleNotify(rewardRecord, count, award, spKey, typ, now)
  279 + local rewardByRole = {}
  280 + while(count > 0 and next(rewardRecord)) do
  281 + local roleId = math.randWeight(rewardRecord, "amount")
  282 + if roleId then
  283 + local tmp = rewardRecord[roleId]
  284 + tmp["amount"] = tmp["amount"] - 1
  285 +
  286 + if tmp["amount"] <= 0 then rewardRecord[roleId] = nil end
279 287  
280   - if not topRecord[v.role_id]then
281   - topRecord[v.role_id] = {amount = v.amount }
  288 + tmp = rewardByRole[roleId]
  289 + if not tmp then
  290 + tmp[spKey] = {good_id = spKey, typ = RewardType.SPECIAL, award = award, amount = 1, quality = typ, create_time= now}
282 291 else
283   - topRecord[v.role_id] = {amount = (topRecord[v.rol_id]["amount"] or 0) + tmpCount}
  292 + if not tmp[spKey] then
  293 + tmp[spKey] = {good_id = spKey, typ = RewardType.SPECIAL, award = award, amount = 1, quality = typ, create_time= now}
  294 + else
  295 + tmp[spKey].amount = tmp[spKey].amount + 1
  296 + end
284 297 end
285   - end
  298 + rewardByRole[roleId] = tmp
286 299  
287   - count = special["amount"]
288   - local topRoleIds = {}
289   - while(count > 0 and next(topRecord)) do
290   - local roleId = math.randWeight(topRecord, "amount")
291   - if roleId then
292   - table.insert(topRoleIds, roleId)
293   - local tmpTopRecord = topRecord[roleId]
294   - tmpTopRecord["amount"] = tmpTopRecord["amount"] - 1
  300 + count = count - 1
  301 + end
  302 + end
  303 + return rewardByRole, count
  304 +end
295 305  
296   - if tmpTopRecord["amount"] <= 0 then topRecord[roleId] = nil end
  306 +function Capsule:getTop(record)
  307 + local spKey, special = self:checkSpecialFlag(SpecialType.TOP)
  308 + if not special then return nil end
  309 + local specials = self:getProperty("specials") or {}
  310 + local specialsRecord = self:getProperty("specialsRecord") or {}
297 311  
298   - count = count - 1
299   - end
  312 + if #record < special["np"] then return nil end
  313 + local topRecord = {}
  314 + local count = special["np"]
  315 + for _, v in ipairs(record) do
  316 + if count <= 0 then break end
300 317  
  318 + local tmpCount = 0
  319 + if count >= v.amount then
  320 + count = count - v.amount
  321 + tmpCount = v.amount
  322 + else
  323 + tmpCount = count
  324 + count = 0
301 325 end
302 326  
303   - special["amount"] = count
304   - specials[spKey] = special
305   - specialsFlag[RewardTYpe.TOP] = topRoleIds
306   - self:setProperty("specialsFlag", specialsFlag)
307   - self:setProperty("specials", specials)
308   - return {role_ids = topRoleIds, award = sspecial["award"]}
  327 + if not topRecord[v.roleId]then
  328 + topRecord[v.roleId] = {amount = v.amount }
  329 + else
  330 + topRecord[v.roleId] = {amount = (topRecord[v.roleId]["amount"] or 0) + tmpCount}
  331 + end
309 332 end
310 333  
311   - return nil
  334 + local rewardByRole, count = getSpecialRoleNotify(topRecord, special["amount"], special["award"], spKey, SpecialType.TOP)
  335 +
  336 + special["amount"] = count
  337 + specials[spKey] = special
  338 + specialsRecord[SpecialType.TOP] = rewardByRole
  339 + self:setProperties({specialsRecord = specialsRecord, specials = specials})
  340 + return rewardByRole
  341 +
312 342 end
313 343  
314 344 --TODO
315 345 function Capsule:getCore(record)
316   - if self:getGoodsAmount() > 0 then return nil end
317   -
318   - local specialsFlag = self:getProperty("specialsFlag") or {}
319   - if specialsFlag[RewardTYpe.CORE] then return nil end
  346 + local spKey, special = self:checkSpecialFlag(SpecialType.CORE)
  347 + if not special then return nil end
320 348  
321 349 local specials = self:getProperty("specials") or {}
322   - local spKey, special = self:getSpecialByType(RewardTYpe.CORE)
323   - if not special then return nil end
  350 + local specialsRecord = self:getProperty("specialsRecord") or {}
  351 +
  352 + if self:getGoodsAmount() > 0 then return nil end
324 353  
325 354 local np = special["np"]
326 355 if np > #record then return nil end
... ... @@ -341,54 +370,38 @@ function Capsule:getCore(record)
341 370 count = 0
342 371 end
343 372  
344   - if not roleRecord[v.role_id]then
345   - roleRecord[v.role_id] = {amount = v.amount }
  373 + if not roleRecord[v.roleId]then
  374 + roleRecord[v.roleId] = {amount = v.amount }
346 375 else
347   - roleRecord[v.role_id] = {amount = (roleRecord[v.rol_id]["amount"] or 0) + tmpCount}
  376 + roleRecord[v.roleId] = {amount = (roleRecord[v.rol_id]["amount"] or 0) + tmpCount}
348 377 end
349 378 end
350 379  
351 380 end
352 381  
353   - count = special["amount"]
354   - local roleIds = {}
355   - while(count > 0 and next(roleRecord)) do
356   - local roleId = math.randWeight(roleRecord, "amount")
357   - if roleId then
358   - table.insert(roleIds, roleId)
359   - local tmpLastRecord = roleRecord[roleId]
360   - tmpLastRecord["amount"] = tmpLastRecord["amount"] - 1
361   -
362   - if tmpLastRecord["amount"] <= 0 then roleRecord[roleId] = nil end
  382 + local rewardByRole, count = getSpecialRoleNotify(roleRecord, special["amount"], special["award"], SpecialType.CORE)
363 383  
364   - count = count - 1
365   - end
366   - end
367 384 special["amount"] = count
368 385 specials[spKey] = special
369   - specialsFlag[RewardTYpe.CORE] = roleIds
370   - self:setProperty("specialsFlag", specialsFlag)
371   - self:setProperty("specials", specials)
372   - return {role_ids = roleIds, award = special["award"]}
  386 + specialsRecord[SpecialType.CORE] = rewardByRole
  387 + self:setProperties({specialsRecord = specialsRecord, specials = specials})
  388 + return rewardByRole
373 389 end
374 390  
375 391 function Capsule:getLast(record)
376   - if self:getGoodsAmount() > 0 then return nil end
377   -
378   - local specialsFlag = self:getProperty("specialsFlag") or {}
379   - if specialsFlag[RewardTYpe.LAST] then return nil end
  392 + local spKey, special = self:checkSpecialFlag(SpecialType.LAST)
  393 + if not special then return nil end
380 394  
381 395 local specials = self:getProperty("specials") or {}
382   - local spKey, special = self:getSpecialByType(RewardTYpe.LAST)
383   - if not special then return nil end
  396 + local specialsRecord = self:getProperty("specialsRecord") or {}
384 397  
385   - if not next(record) then return nil end
386   - table.sort(record, function(a, b) return a.create_time > b.create_time end)
  398 + if self:getGoodsAmount() > 0 then return nil end
387 399  
  400 + table.sort(record, function(a, b) return a.create_time > b.create_time end)
388 401  
389 402 local np = special["np"]
390 403 local count = np
391   - local lastRecord = {}
  404 + local roleRecord = {}
392 405 for _, v in ipairs(record) do
393 406 if count <= 0 then break end
394 407  
... ... @@ -401,174 +414,130 @@ function Capsule:getLast(record)
401 414 count = 0
402 415 end
403 416  
404   - if not lastRecord[v.role_id]then
405   - lastRecord[v.role_id] = {amount = v.amount }
  417 + if not roleRecord[v.roleId]then
  418 + roleRecord[v.roleId] = {amount = v.amount }
406 419 else
407   - lastRecord[v.role_id] = {amount = (lastRecord[v.rol_id]["amount"] or 0) + tmpCount}
  420 + roleRecord[v.roleId] = {amount = (roleRecord[v.rol_id]["amount"] or 0) + tmpCount}
408 421 end
409 422 end
410 423  
411   - count = special["amount"]
412   - local lastRoleIds = {}
413   - while(count > 0 and next(lastRecord)) do
414   - local roleId = math.randWeight(lastRecord, "amount")
415   - if roleId then
416   - table.insert(lastRoleIds, roleId)
417   - local tmpLastRecord = lastRecord[roleId]
418   - tmpLastRecord["amount"] = tmpLastRecord["amount"] - 1
  424 + local rewardByRole, count = getSpecialRoleNotify(roleRecord, special["amount"], special["award"], SpecialType.LAST)
419 425  
420   - if tmpLastRecord["amount"] <= 0 then lastRecord[roleId] = nil end
421   -
422   - count = count - 1
423   - end
424   - end
425 426 special["amount"] = count
426 427 specials[spKey] = special
427   - specialsFlag[RewardTYpe.LAST] = lastRoleIds
428   - self:setProperty("specialsFlag", specialsFlag)
429   - self:setProperty("specials", specials)
430   - return {role_ids = lastRoleIds, award = special["award"]}
  428 + specialsRecord[SpecialType.LAST] = rewardByRole
  429 + self:setProperties({specialsRecord = specialsRecord, specials = specials})
  430 + return rewardByRole
431 431 end
432 432  
433 433 function Capsule:getJoker(record)
434   - if self:getGoodsAmount() > 0 then return nil end
435   - local specialsFlag = self:getProperty("specialsFlag") or {}
436   - if specialsFlag[RewardTYpe.JOKER] then return nil end
  434 + local spKey, special = self:checkSpecialFlag(SpecialType.JOKER)
  435 + if not special then return nil end
437 436  
438 437 local specials = self:getProperty("specials") or {}
439   - local spKey, special = self:getSpecialByType(RewardTYpe.JOKER)
440   - if not special then return nil end
  438 + local specialsRecord = self:getProperty("specialsRecord") or {}
  439 +
  440 + if self:getGoodsAmount() > 0 then return nil end
441 441  
442 442 local roleRecord = {}
443 443 for _, v in ipairs(record) do
444   - if not roleRecord[v.role_id]then
445   - roleRecord[v.role_id] = {amount = v.amount }
  444 + if not roleRecord[v.roleId]then
  445 + roleRecord[v.roleId] = {amount = v.amount }
446 446 else
447   - roleRecord[v.role_id] = {amount = (roleRecord[v.rol_id]["amount"] or 0) + v.amount}
  447 + roleRecord[v.roleId] = {amount = (roleRecord[v.rol_id]["amount"] or 0) + v.amount}
448 448 end
449 449 end
450 450  
451   - local count = special["amount"]
452   - local roleIds = {}
453   - while(count > 0 and next(roleRecord)) do
454   - local roleId = math.randWeight(roleRecord, "amount")
455   - if roleId then
456   - table.insert(roleIds, roleId)
457   - local tmpRoleRecord = roleRecord[roleId]
458   - tmpRoleRecord["amount"] = tmpRoleRecord["amount"] - 1
459   -
460   - if tmpRoleRecord["amount"] <= 0 then roleRecord[roleId] = nil end
  451 + local rewardByRole, count = getSpecialRoleNotify(roleRecord, special["amount"], special["award"], SpecialType.JOKER)
461 452  
462   - count = count - 1
463   - end
464   - end
465 453 special["amount"] = count
466 454 specials[spKey] = special
467   - specialsFlag[RewardTYpe.JOKER] = roleIds
468   - self:setProperty("specialsFlag", specialsFlag)
469   - self:setProperty("specials", specials)
470   - return {role_ids = roleIds, award = special["award"]}
  455 + specialsRecord[SpecialType.JOKER] = rewardByRole
  456 + self:setProperties({specialsRecord = specialsRecord, specials = specials})
  457 + return rewardByRole
471 458 end
472 459  
473 460 function Capsule:getKing(record)
474   - if self:getGoodsAmount() > 0 then return nil end
475   - local specialsFlag = self:getProperty("specialsFlag") or {}
476   - if specialsFlag[RewardTYpe.JOKER] then return nil end
  461 + local spKey, special = self:checkSpecialFlag(SpecialType.KING)
  462 + if not special then return nil end
477 463  
478 464 local specials = self:getProperty("specials") or {}
479   - local spKey, special = self:getSpecialByType(RewardTYpe.KING)
480   - if not special then return nil end
  465 + local specialsRecord = self:getProperty("specialsRecord") or {}
481 466  
  467 + if self:getGoodsAmount() > 0 then return nil end
482 468  
483 469 local roleRecord = {}
484 470 for _, v in ipairs(record) do
485   - if not roleRecord[v.role_id]then
486   - roleRecord[v.role_id] = {amount = v.amount }
  471 + if not roleRecord[v.roleId]then
  472 + roleRecord[v.roleId] = {amount = v.amount }
487 473 else
488   - roleRecord[v.role_id] = {amount = (roleRecord[v.rol_id]["amount"] or 0) + v.amount}
  474 + roleRecord[v.roleId] = {amount = (roleRecord[v.rol_id]["amount"] or 0) + v.amount}
489 475 end
490 476 end
491 477  
492   - local count = special["amount"]
493   - local roleIds = {}
494   - while(count > 0 and next(roleRecord)) do
495   - local roleId = math.randWeight(roleRecord, "amount")
496   - if roleId then
497   - table.insert(roleIds, roleId)
498   - local tmpRoleRecord = roleRecord[roleId]
499   - tmpRoleRecord["amount"] = tmpRoleRecord["amount"] - 1
  478 + local rewardByRole, count = getSpecialRoleNotify(roleRecord, special["amount"], special["award"], SpecialType.KING)
  479 + special["amount"] = count
  480 + specials[spKey] = special
  481 + specialsRecord[SpecialType.KING] = rewardByRole
  482 + self:setProperties({specialsRecord = specialsRecord, specials = specials})
  483 + return rewardByRole
  484 +end
500 485  
501   - if tmpRoleRecord["amount"] <= 0 then roleRecord[roleId] = nil end
  486 +local rewardToNtyFunc = function(notify, tmpReward)
  487 + for key, val in pairs(tmpReward or {}) do
  488 + if not notify[key] then
  489 + notify[key] = val
  490 + else
  491 + for k, v in pairs(val) do
  492 + if not notify[key][k] then
  493 + notify[key][k] = v
  494 + else
  495 + notify[key][k] = notify[key][k].amount + v.amount
  496 + end
  497 + end
502 498  
503   - count = count - 1
504 499 end
505 500 end
506   - special["amount"] = count
507   - specials[spKey] = special
508   - specialsFlag[RewardTYpe.KING] = roleIds
509   - self:setProperty("specialsFlag", specialsFlag)
510   - self:setProperty("specials", specials)
511   - return {role_ids = roleIds, award = special["award"]}
512 501 end
513 502  
514   -
515   -function Capsule:checkSpecialReward()
  503 +function Capsule:checkSpecialReward( now)
516 504 local specials = self:getProperty("specials") or {}
517 505 if not next(specials) then return nil end
518 506 local record = self:getProperty("record") or {}
  507 +
519 508 if not next(record) then return nil end
520 509 table.sort(record, function(a, b) return a.create_time < b.create_time end )
521   - local notify = {}
522 510  
523   - local topReward = self:getTop(record)
524   - if topReward then
525   - for _, roleId in ipairs(topReward.role_ids) do
526   - rpcRole(roleId, "paySpecialReward", RewardTYpe.TOP, topReward.award)
527   - table.insert(notify, {role_id = roleId, typ = RewardTYpe.TOP, award = topReward.award, amount = 1, create_time= skynet.timex()})
528   - end
529   - end
  511 +
  512 + local notify = self:getTop(record) or {}
530 513  
531 514 local coreReward = self:getCore(record)
532   - if coreReward then
533   - for _, roleId in ipairs(topReward.role_ids) do
534   - rpcRole(roleId, "paySpecialReward", RewardTYpe.CORE, coreReward.award)
535   - table.insert(notify, {role_id = roleId, typ = RewardTYpe.CORE, award = topReward.award, amount = 1, create_time= skynet.timex()})
536   - end
537   - end
  515 + rewardToNtyFunc(notify, coreReward)
  516 +
538 517 local lastReward = self:getLast(record)
539   - if lastReward then
540   - for _, roleId in ipairs(lastReward.role_ids) do
541   - rpcRole(roleId, "paySpecialReward", RewardTYpe.LAST, lastReward.award)
542   - table.insert(notify, {role_id = roleId, typ = RewardTYpe.LAST, award = topReward.award, amount = 1, create_time= skynet.timex()})
543   - end
544   - end
  518 + rewardToNtyFunc(notify, lastReward)
  519 +
545 520 local jokerReward = self:getJoker(record)
546   - if jokerReward then
547   - for _, roleId in ipairs(jokerReward.role_ids) do
548   - rpcRole(roleId, "paySpecialReward", RewardTYpe.JOKER, jokerReward.award)
549   - table.insert(notify, {role_id = roleId, typ = RewardTYpe.JOKER, award = topReward.award, amount = 1, create_time= skynet.timex()})
550   - end
551   - end
  521 + rewardToNtyFunc(notify, jokerReward)
  522 +
552 523 local kingReward = self:getKing(record)
553   - if kingReward then
554   - for _, roleId in ipairs(kingReward.role_ids) do
555   - rpcRole(roleId, "paySpecialReward", RewardTYpe.KING, kingReward.award)
556   - table.insert(notify, {role_id = roleId, typ = RewardTYpe.KING, award = topReward.award, amount = 1, create_time= skynet.timex()})
557   - end
558   - end
  524 + rewardToNtyFunc(notify, kingReward)
559 525  
  526 + --广播出去TODO
  527 + --rpcRole(roleId, "paySpecialReward", RewardTYpe.JOKER, jokerReward.award)
560 528 return notify
561 529 end
562 530  
563   -function Capsule:checkIncentive(roleId)
  531 +function Capsule:checkIncentive(roleId, now)
564 532 local goods = self:getProperty("goods") or {}
565   - local record = self:getProperty("record") or {}
566 533 local recordByRole = self:getProperty("recordByRole") or {}
567 534 local roleRecord = recordByRole[roleId] or {}
  535 + local incentiveRecord = self:getProperty("incentiveRecord") or {}
  536 + local incentiveByRole = incentiveRecord[roleId] or {}
568 537 local incentive = self:getProperty("incentive")
569 538  
570 539  
571   - local reward
  540 + local notify = {}
572 541 -- 最后一抽 TODO
573 542 if incentive["last"] then
574 543 local last = true
... ... @@ -578,7 +547,9 @@ function Capsule:checkIncentive(roleId)
578 547 break
579 548 end
580 549 end
581   - reward = incentive["last"]["award"]
  550 + if last then
  551 + notify["last"] = {good_id = "last", typ = RewardType.INCENTIVE, award = incentive["last"]["award"], amount = 1, quality = 1, create_time= now}
  552 + end
582 553 end
583 554  
584 555 --次数
... ... @@ -592,9 +563,7 @@ function Capsule:checkIncentive(roleId)
592 563  
593 564 local count = math.floor(amount / incentive["amount"]["np"])
594 565 local tmpCount = count * incentive["amount"]["np"]
595   - for i=1, count do
596   - reward = reward.. " " .. incentive["amount"]["award"]
597   - end
  566 + notify["amount"] = {good_id = "amount", typ = RewardType.INCENTIVE, award = incentive["amount"]["award"], amount = count, quality = 2, create_time= now}
598 567  
599 568 --填充v.calculated 字段,标识已经用于每x抽的计算中。
600 569 for _, v in pairs(roleRecord) do
... ... @@ -618,21 +587,15 @@ function Capsule:checkIncentive(roleId)
618 587 if incentive["probabilities"] then
619 588 local probabilities = math.randomInt(1, 100)
620 589 if probabilities <= incentive["probabilities"]["np"] then
621   - reward = reward .. " " .. incentive["probabilities"]["award"]
  590 + notify["probabilities"] = {good_id = "probabilities", typ = RewardType.INCENTIVE, award = incentive["probabilities"]["award"], amount = 1, quality = 3, create_time= now}
  591 +
622 592 end
623 593 end
624   - if reward and reward ~= "" then
625   - local tmpReward, notify = {}, {}
626   - for k, v in pairs(reward:toNumMap()) do
627   - tmpReward[k] = (tmpReward[k] or 0) + v
628   - end
  594 + table.insert(incentiveByRole, notify)
  595 + incentiveRecord[roleId] = incentiveByRole
  596 + self:setProperty("incentiveRecord", incentiveRecord)
629 597  
630   - notify = {role_id = roleId, typ = RewardTYpe.incentive, award = reward, amount = 1, create_time= skynet.timex()}
631   - table.insert(record, notify)
632   - self:setProperty("record", record)
633   - return tmpReward,notify
634   - end
635   - return nil, nil
  598 + return notify
636 599 end
637 600  
638 601 function Capsule:drawByCount(roleId, count)
... ... @@ -641,61 +604,74 @@ function Capsule:drawByCount(roleId, count)
641 604 local goods = self:getProperty("goods") or {}
642 605 local record = self:getProperty("record") or {}
643 606 local recordByRole = self:getProperty("recordByRole") or {}
  607 + local roleRecord = recordByRole[roleId] or {}
644 608  
645 609 local id = self:getProperty("id")
646 610 local room = self:getProperty("room")
647 611 local ichibankuji = csvdb["ichibankuji_mainCsv"][id][room]
648 612 local goods_id = ichibankuji["goods_id"]
  613 + local now = skynet.timex()
649 614  
650 615 --奖励, 通知信息
651   - local reward, notify= {}, {}
  616 + local notify= {}
  617 + notify[roleId] = {}
  618 +
652 619 while (goods and next(goods) and count > 0) do
653 620 local good_id = math.randWeight(goods, "weight")
654 621 if good_id then
655 622 local good = goods[good_id] or {}
656   - if good.amount > 0 then
  623 + if good and good.amount > 0 then
657 624 good.amount = good.amount - 1
658   - for k, v in pairs(good.award:toNumMap()) do
659   - reward[k] = (reward[k] or 0) + v
660   - end
661 625  
662 626 --插入记录
663   - local tmpNotify = {role_id = roleId, good_id = good_id, typ = RewardTYpe.GOODS, award = good.award, amount = 1, quality = good.quality, create_time= skynet.timex()}
664   -
  627 + local tmpNotify = {good_id = good_id, typ = RewardType.GOODS, award = good.award, amount = 1, quality = good.quality, create_time= now}
665 628 table.insert(record, tmpNotify)
666   - table.insert(notify, tmpNotify)
667 629  
668   - --记录角色的抽奖记录
669   - local tmp = recordByRole[roleId]
670   - if not tmp then
671   - recordByRole[roleId] = {good_id=notify}
  630 + --作为奖励记录+通知
  631 + if not notify[roleId][good_id] then
  632 + notify[roleId][good_id] = tmpNotify
672 633 else
673   - if not tmp[good_id] then
674   - tmp[good_id] = notify
675   - else
676   - tmp[good_id].amount = tmp[good_id].amount + 1
677   - end
  634 + notify[roleId][good_id].amount = notify[roleId][good_id].amount + 1
678 635 end
679 636  
680   - good.weight = good.weight - csvdb["ichibankuji_goodsCsv"][goods_id].weight
  637 + --记录角色的抽奖记录 计算激励奖需要用到
  638 + if not roleRecord[good_id] then
  639 + roleRecord[good_id] = tmpNotify
  640 + else
  641 + roleRecord[good_id].amount = roleRecord[good_id].amount + 1
  642 + end
  643 +
  644 + good.weight = good.weight - csvdb["ichibankuji_goodsCsv"][goods_id][good.id].weight
681 645 count = count - 1
682 646 end
683 647 end
684 648  
685 649 end
  650 + recordByRole[roleId] = roleRecord
  651 + self:setProperties({recordByRole = recordByRole, record = record, goods = goods})
686 652  
687   - self:setProperty("recordByRole", recordByRole)
688   - self:setProperty("record", record)
689   - self:setProperty("goods", goods)
690   - local incentiveReward, tmpNotify = self:checkIncentive(roleId)
691   - for k, v in pairs(incentiveReward or {}) do
692   - reward[k] = (reward[k] or 0) + v
  653 + local tmpNotify = self:checkIncentive(roleId, now)
  654 + for k, v in pairs(tmpNotify) do
  655 + if not notify[roleId][k] then
  656 + notify[roleId][k] = v
  657 + else
  658 + notify[roleId][k].amount = notify[roleId][k].amount + v.amount
  659 + end
693 660 end
694   - if tmpNotify then table.insert(notify, tmpNotify) end
695 661  
696   - local speciNotify = self:checkSpecialReward(roleId)
697   - if speciNotify and next(speciNotify) then table.insert(notify, speciNotify) end
  662 + local speciNotify = self:checkSpecialReward(now)
  663 + rewardToNtyFunc(notify, speciNotify)
698 664  
  665 + local reward = {}
  666 + for key, val in pairs(notify) do
  667 + if key == roleId then
  668 + for _, v in pairs(val) do
  669 + for id, count in pairs(v.award:toNumMap()) do
  670 + reward[id] = (reward[id] or 0) + count
  671 + end
  672 + end
  673 + end
  674 + end
699 675 return reward, notify
700 676 end
701 677  
... ... @@ -703,55 +679,67 @@ function Capsule:drawAll(roleId)
703 679 local goods = self:getProperty("goods") or {}
704 680 local record = self:getProperty("record") or {}
705 681 local recordByRole = self:getProperty("recordByRole") or {}
  682 + local roleRecord = recordByRole[roleId] or {}
  683 + local now = skynet.timex()
706 684  
707   - local reward, notify = {}, {}
  685 + local notify = {}
  686 + notify[roleId] = {}
708 687 for good_id, good in pairs(goods) do
709   -
710 688 if good.amount > 0 then
711   - notify = {role_id = roleId, good_id = good_id, typ = RewardTYpe.GOODS, award = good.award, amount = good.amount, quality = good.quality, create_time = skynet.timex()}
  689 + --插入记录
  690 + local tmpNotify = {role_id = roleId, good_id = good_id, typ = RewardType.GOODS, award = good.award, amount = good.amount, quality = good.quality, create_time = now}
712 691 table.insert(record, notify)
713 692  
714   - --记录角色的抽奖记录
715   - local tmp = recordByRole[roleId]
716   - if not tmp then
717   - recordByRole[roleId] = {good_id=notify}
  693 + --作为奖励记录+通知
  694 + if not notify[roleId][good_id] then
  695 + notify[roleId][good_id] = tmpNotify
718 696 else
719   - if not tmp[good_id] then
720   - tmp[good_id] = notify
721   - else
722   - tmp[good_id].amount = tmp[good_id].amount + good.amount
723   - end
  697 + notify[roleId][good_id].amount = notify[roleId][good_id].amount + good.award
724 698 end
725   - end
726 699  
727   - while(good.amount > 0) do
728   - for k, v in pairs(good.award:toNumMap()) do
729   - reward[k] = (reward[k] or 0) + v
  700 + --记录角色的抽奖记录
  701 + if not roleRecord[good_id] then
  702 + roleRecord[good_id] = notify
  703 + else
  704 + roleRecord[good_id].amount = roleRecord[good_id].amount + good.amount
730 705 end
731   - good.amount = good.amount - 1
  706 +
  707 + good.amount = 0
732 708 end
733 709  
734 710 end
  711 + recordByRole[roleId] = roleRecord
  712 + self:setProperties({recordByRole = recordByRole, record = record, goods = goods})
735 713  
736   - local incentiveReward, tmpNotify = self:checkIncentive(roleId)
737   - for k, v in pairs(incentiveReward or {}) do
738   - reward[k] = (reward[k] or 0) + v
  714 + local tmpNotify = self:checkIncentive(roleId, now)
  715 + for k, v in pairs(tmpNotify) do
  716 + if not notify[roleId][k] then
  717 + notify[roleId][k] = v
  718 + else
  719 + notify[roleId][k].amount = notify[roleId][k].amount + v.amount
  720 + end
739 721 end
740   - if tmpNotify then table.insert(notify, tmpNotify) end
741 722  
742   - local speciNotify = self:checkSpecialReward(roleId)
743   - if speciNotify and next(speciNotify) then table.insert(notify, speciNotify) end
  723 + local speciNotify = self:checkSpecialReward(now)
  724 + rewardToNtyFunc(notify, speciNotify)
744 725  
745   - self:setProperty("recordByRole", recordByRole)
746   - self:setProperty("record", record)
747   - self:setProperty("goods", goods)
  726 + local reward = {}
  727 + for key, val in pairs(notify) do
  728 + if key == roleId then
  729 + for _, v in pairs(val) do
  730 + for id, count in pairs(v.award:toNumMap()) do
  731 + reward[id] = (reward[id] or 0) + count
  732 + end
  733 + end
  734 + end
  735 + end
748 736 return reward, notify
749 737 end
750 738  
751 739 --@param
752 740 --[[
753 741 @roleId
754   -@typ 1=全收 0=单次
  742 +@typ 0=独享,1=公开
755 743 @cares 关注{k=v}
756 744 ]]--
757 745  
... ... @@ -793,7 +781,7 @@ function Capsule:data(roleId)
793 781 goods = self:getProperty("goods"),
794 782 specials = self:getProperty("specials"),
795 783 incentive = self:getProperty("incentive"),
796   - specialsFlag= self:getProperty("specialsFlag"),
  784 + specialsRecord= self:getProperty("specialsRecord"),
797 785 }
798 786 end
799 787  
... ...
src/services/capsuled.lua
... ... @@ -3,7 +3,7 @@ require &quot;shared.init&quot;
3 3 require "GlobalVar"
4 4 require "RedisKeys"
5 5 require "skynet.manager"
6   -local skynet = require "skynet"
  6 +skynet = require "skynet"
7 7 csvdb = require "shared.csvdata"
8 8 redisproxy = require "shared.redisproxy"
9 9 datacenter = require "skynet.datacenter"
... ... @@ -56,7 +56,6 @@ end
56 56  
57 57  
58 58 local function add(roleId, capsuleId)
59   - print(type(capsuleId))
60 59 local capsule = capsules[capsuleId] or {}
61 60 if next(capsule) then
62 61 capsule:join(roleId)
... ... @@ -86,7 +85,7 @@ function CMD.start()
86 85 local now = skynet.timex()
87 86 local res = redisproxy:smembers(CAPSULE_INFO) or {}
88 87 for _, key in pairs(res) do
89   - local capsule = require("models.Capsule").new({ key = CAPSULE_PUBLIC:format(tonumber(key))})
  88 + local capsule = require("models.Capsule").new({ key = CAPSULE_PUBLIC:format(key)})
90 89 capsule:load()
91 90 if capsule:isShow() then
92 91 if capsule:refreshing(now) then
... ... @@ -95,7 +94,7 @@ function CMD.start()
95 94 end
96 95 capsules[key] = capsule
97 96 else
98   - redisproxy:del(CAPSULE_PUBLIC:format(tonumber(key)))
  97 + redisproxy:del(CAPSULE_PUBLIC:format(key))
99 98 redisproxy:srem(CAPSULE_INFO, key)
100 99 end
101 100 end
... ... @@ -103,9 +102,9 @@ function CMD.start()
103 102 for _, data in pairs(csvdb["ichibankuji_mainCsv"]) do
104 103 for _, val in ipairs(data) do
105 104 if val.type == 1 then
106   - local key = string.format("%d%d", val.id, val.room)
  105 + local key = val.id..val.room
107 106 if not capsules[key] then
108   - local capsule = require("models.Capsule").new({ key = CAPSULE_PUBLIC:format(tonumber(key)), id= val.id, room = val.room, typ = 1, name=val.name})
  107 + local capsule = require("models.Capsule").new({ key = CAPSULE_PUBLIC:format(key), id= val.id, room = val.room, typ = 1, name=val.name})
109 108 capsule:init()
110 109 capsule:create()
111 110 capsules[key] = capsule
... ... @@ -138,10 +137,19 @@ end
138 137  
139 138  
140 139 function CMD.exit(roleId, capsuleId)
141   - local capsule = capsules[capsuleId] or {}
142   - if next(capsule) then
143   - capsule:exit(roleId)
144   - broadCastCapsule(roleId, capsuleId, {changeType = NotifyChangeType.EXIT, roleId = roleId})
  140 + if capsuleId then
  141 + local capsule = capsules[capsuleId] or {}
  142 + if next(capsule) then
  143 + capsule:exit(roleId)
  144 + broadCastCapsule(roleId, capsuleId, {changeType = NotifyChangeType.EXIT, roleId = roleId})
  145 + end
  146 + else
  147 + for _, capsule in pairs(capsules) do
  148 + if next(capsule) then
  149 + capsule:exit(roleId)
  150 + broadCastCapsule(roleId, capsuleId, {changeType = NotifyChangeType.EXIT, roleId = roleId})
  151 + end
  152 + end
145 153 end
146 154 end
147 155  
... ... @@ -152,7 +160,7 @@ function CMD.draw_capsule(roleId, capsuleId, full, cares)
152 160 --if ret > 4 then
153 161 -- broadCastCapsule(roleId, capsuleId, {changeType = NotifyChangeType.DRAW, roleId = roleId, notify = notify})
154 162 --end
155   - return ret, reward
  163 + return ret, reward, capsule:data(roleId)
156 164 end
157 165 return nil
158 166 end
... ...