| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137 |
- package gamelogic
- import (
- "encoding/json"
- "sync"
- "time"
- "bet24.com/log"
- "bet24.com/redis"
- timetool "bet24.com/servers/common"
- "bet24.com/servers/games/masharie_table/common"
- "bet24.com/servers/games/masharie_table/config"
- )
- const PrizePoolKey = "prizePool"
- const PrizeRankCount = 20
- // 项目奖池发奖比例
- var projectPrize = map[common.CardProject]int{
- common.Project_Fifty: 20,
- common.Project_Hundred: 40,
- common.Project_StraightFlush: 60,
- }
- type PrizeRankUser struct {
- Time int // 时间
- UserId int // 用户ID
- BetAmount int // 投注额
- Score int // 彩金
- }
- // 彩金
- type prizePool struct {
- Jackpot int // 奖池 (总下注额的2%) 从config.Room.PrizePoolRate中取
- Rank []PrizeRankUser // 前20排行榜
- lock *sync.RWMutex
- roomInfo *config.RoomInfo
- }
- // 创建一个彩金
- func newPrizePool(roomInfo *config.RoomInfo) *prizePool {
- ret := new(prizePool)
- ret.lock = &sync.RWMutex{}
- ret.roomInfo = roomInfo
- // 从redis中获取奖池数据
- key := PrizePoolKey
- data, _ := redis.String_Get(common.GetRedisKey(key))
- ret.Jackpot = 0
- ret.Rank = make([]PrizeRankUser, 0)
- if data == "" {
- // redis中没有奖池数据
- ret.prizePoolToRedis()
- } else {
- err := json.Unmarshal([]byte(data), ret)
- if err != nil {
- log.Release("prizePool json.Unmarshal err:%v", err)
- }
- }
- //起一个定时器,每2分钟同步一次数据到Redis
- ret.startTimer()
- return ret
- }
- func (pp *prizePool) startTimer() {
- pp.prizePoolToRedis()
- go func() {
- time.AfterFunc(2*time.Minute, func() {
- pp.startTimer()
- })
- }()
- }
- func (pp *prizePool) getPrizePool() int {
- pp.lock.RLock()
- var jackpot = pp.Jackpot
- defer pp.lock.RUnlock()
- return jackpot
- }
- // 更新奖池
- func (pp *prizePool) updatePrizePool(betAmount int) {
- pp.lock.Lock()
- pp.Jackpot += betAmount * pp.roomInfo.PrizePoolRate / 100
- pp.lock.Unlock()
- }
- // 扣除奖池
- func (pp *prizePool) deductJackpot(jackpot int) {
- pp.lock.Lock()
- pp.Jackpot -= jackpot
- pp.lock.Unlock()
- }
- func (pp *prizePool) prizePoolToRedis() {
- key := PrizePoolKey
- pp.lock.RLock()
- data, err := json.Marshal(pp)
- pp.lock.RUnlock()
- if err != nil {
- log.Debug("prizePool json.Marshal err:%v", err)
- return
- }
- redis.String_Set(common.GetRedisKey(key), string(data))
- }
- // 记录幸运星榜单
- func (pp *prizePool) updatePrizeRank(userId, score, betAmount int) {
- ts := timetool.GetTimeStamp()
- var rank = PrizeRankUser{
- Time: ts,
- UserId: userId,
- BetAmount: betAmount,
- Score: score,
- }
- pp.lock.Lock()
- //最新的在最前面
- pp.Rank = append(pp.Rank, rank)
- if len(pp.Rank) > PrizeRankCount {
- pp.Rank = pp.Rank[1:]
- }
- pp.lock.Unlock()
- pp.prizePoolToRedis()
- }
- // 获得幸运星榜单数据
- func (pp *prizePool) getPrizeRank() []PrizeRankUser {
- pp.lock.RLock()
- defer pp.lock.RUnlock()
- return pp.Rank
- }
- func GetProjectRate(project common.CardProject) (rate int) {
- rate = projectPrize[project]
- return
- }
|