prizepool.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. package gamelogic
  2. import (
  3. "encoding/json"
  4. "sync"
  5. "time"
  6. "bet24.com/log"
  7. "bet24.com/redis"
  8. timetool "bet24.com/servers/common"
  9. "bet24.com/servers/games/masharie_table/common"
  10. "bet24.com/servers/games/masharie_table/config"
  11. )
  12. const PrizePoolKey = "prizePool"
  13. const PrizeRankCount = 20
  14. // 项目奖池发奖比例
  15. var projectPrize = map[common.CardProject]int{
  16. common.Project_Fifty: 20,
  17. common.Project_Hundred: 40,
  18. common.Project_StraightFlush: 60,
  19. }
  20. type PrizeRankUser struct {
  21. Time int // 时间
  22. UserId int // 用户ID
  23. BetAmount int // 投注额
  24. Score int // 彩金
  25. }
  26. // 彩金
  27. type prizePool struct {
  28. Jackpot int // 奖池 (总下注额的2%) 从config.Room.PrizePoolRate中取
  29. Rank []PrizeRankUser // 前20排行榜
  30. lock *sync.RWMutex
  31. roomInfo *config.RoomInfo
  32. }
  33. // 创建一个彩金
  34. func newPrizePool(roomInfo *config.RoomInfo) *prizePool {
  35. ret := new(prizePool)
  36. ret.lock = &sync.RWMutex{}
  37. ret.roomInfo = roomInfo
  38. // 从redis中获取奖池数据
  39. key := PrizePoolKey
  40. data, _ := redis.String_Get(common.GetRedisKey(key))
  41. ret.Jackpot = 0
  42. ret.Rank = make([]PrizeRankUser, 0)
  43. if data == "" {
  44. // redis中没有奖池数据
  45. ret.prizePoolToRedis()
  46. } else {
  47. err := json.Unmarshal([]byte(data), ret)
  48. if err != nil {
  49. log.Release("prizePool json.Unmarshal err:%v", err)
  50. }
  51. }
  52. //起一个定时器,每2分钟同步一次数据到Redis
  53. ret.startTimer()
  54. return ret
  55. }
  56. func (pp *prizePool) startTimer() {
  57. pp.prizePoolToRedis()
  58. go func() {
  59. time.AfterFunc(2*time.Minute, func() {
  60. pp.startTimer()
  61. })
  62. }()
  63. }
  64. func (pp *prizePool) getPrizePool() int {
  65. pp.lock.RLock()
  66. var jackpot = pp.Jackpot
  67. defer pp.lock.RUnlock()
  68. return jackpot
  69. }
  70. // 更新奖池
  71. func (pp *prizePool) updatePrizePool(betAmount int) {
  72. pp.lock.Lock()
  73. pp.Jackpot += betAmount * pp.roomInfo.PrizePoolRate / 100
  74. pp.lock.Unlock()
  75. }
  76. // 扣除奖池
  77. func (pp *prizePool) deductJackpot(jackpot int) {
  78. pp.lock.Lock()
  79. pp.Jackpot -= jackpot
  80. pp.lock.Unlock()
  81. }
  82. func (pp *prizePool) prizePoolToRedis() {
  83. key := PrizePoolKey
  84. pp.lock.RLock()
  85. data, err := json.Marshal(pp)
  86. pp.lock.RUnlock()
  87. if err != nil {
  88. log.Debug("prizePool json.Marshal err:%v", err)
  89. return
  90. }
  91. redis.String_Set(common.GetRedisKey(key), string(data))
  92. }
  93. // 记录幸运星榜单
  94. func (pp *prizePool) updatePrizeRank(userId, score, betAmount int) {
  95. ts := timetool.GetTimeStamp()
  96. var rank = PrizeRankUser{
  97. Time: ts,
  98. UserId: userId,
  99. BetAmount: betAmount,
  100. Score: score,
  101. }
  102. pp.lock.Lock()
  103. //最新的在最前面
  104. pp.Rank = append(pp.Rank, rank)
  105. if len(pp.Rank) > PrizeRankCount {
  106. pp.Rank = pp.Rank[1:]
  107. }
  108. pp.lock.Unlock()
  109. pp.prizePoolToRedis()
  110. }
  111. // 获得幸运星榜单数据
  112. func (pp *prizePool) getPrizeRank() []PrizeRankUser {
  113. pp.lock.RLock()
  114. defer pp.lock.RUnlock()
  115. return pp.Rank
  116. }
  117. func GetProjectRate(project common.CardProject) (rate int) {
  118. rate = projectPrize[project]
  119. return
  120. }