game/common/jackpot/jackpot.go
2025-06-09 23:52:18 +08:00

117 lines
3.7 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package jackpot
import (
"fmt"
"game/common/model/jackpot"
"github.com/fox/fox/log"
"github.com/go-redis/redis/v8"
)
type JackPotMgr struct {
gameId int
jackpotUser map[int64]int64 // 中jackpot玩家key:玩家id value:投注额bet
rdb *redis.Client
}
func NewJackpotMgr(gameId int, rdb *redis.Client) *JackPotMgr {
mgr := &JackPotMgr{}
mgr.gameId = gameId
mgr.rdb = rdb
return mgr
}
// true:出现垫资
func (m *JackPotMgr) Load(initJp int64) bool {
if jackpot.JackpotGet(m.rdb, m.gameId) < initJp {
return true
}
return false
}
func (m *JackPotMgr) resetJackpot(initJp int64) int64 {
jackpot.JackpotAdd(m.rdb, m.gameId, initJp)
count := jackpot.JackpotInitCountAdd(m.rdb, m.gameId)
system := jackpot.JackpotSystemAdd(m.rdb, m.gameId, -initJp)
log.Info(fmt.Sprintf("game:%v gameid:%v jackpot已被掏空重置为:%v 重置次数:%v 系统盈亏:%v", m.gameId, m.gameId, initJp, count, system))
return initJp
}
func (m *JackPotMgr) GetJackpot() int64 {
return jackpot.JackpotGet(m.rdb, m.gameId)
}
// jpXRate:赎回比例 jpYRate:追加比例
func (m *JackPotMgr) AddJp(loseBet, jpXRate, jpYRate, jpXYRate int64) (jpX, jpY int64) {
if loseBet == 0 {
return
}
// jackpot池追加资金、玩家赎回资金(让庄家jp池垫的钱回归0)、庄家总垫资
var jpAdd, userRepaid, sysValue int64
if sysValue = jackpot.JackpotSystemGet(m.rdb, m.gameId); sysValue < 1 {
userRepaid = loseBet * jpXRate / 10000
jpAdd = loseBet * jpYRate / 10000
sysValue = jackpot.JackpotSystemAdd(m.rdb, m.gameId, userRepaid)
_ = jackpot.JackpotUserRepaidAdd(m.rdb, m.gameId, userRepaid)
} else {
jpAdd = loseBet * jpXYRate / 10000
}
log.Debug(fmt.Sprintf("%v进入系统池,%v进入jackpot池系统池盈亏:%v", userRepaid, jpAdd, sysValue))
return userRepaid, jpAdd
}
// 回滚。funding:垫资,jpX:赎回 jpY:追加
func (m *JackPotMgr) RollBackJpXAndJpY(lastJackpot, funding, jpX, jpY int64) {
log.Debug(fmt.Sprintf("分出去的jackpot:%v,当前jackpot池:%v 需要回退的垫资:%v 需要回退的赎回jpx:%v 需要回退的追加jpy:%v",
lastJackpot, jackpot.JackpotGet(m.rdb, m.gameId), funding, jpX, jpY))
jpv := jackpot.JackpotAdd(m.rdb, m.gameId, -jpY)
sys := jackpot.JackpotSystemAdd(m.rdb, m.gameId, -jpX)
repaid := jackpot.JackpotUserRepaidAdd(m.rdb, m.gameId, -jpX)
log.Debug(fmt.Sprintf("当前系统池:%v赎回值:%v", sys, repaid))
if lastJackpot == 0 {
return
}
jackpot.JackpotSet(m.rdb, m.gameId, lastJackpot)
jpv = jackpot.JackpotAdd(m.rdb, m.gameId, -jpY)
jpv = jackpot.JackpotGet(m.rdb, m.gameId)
sys = jackpot.JackpotSystemAdd(m.rdb, m.gameId, funding)
log.Debug(fmt.Sprintf("当前系统池:%v赎回值:%v jackpot值:%v", sys, repaid, jpv))
}
// 中jackpot玩家
func (m *JackPotMgr) AddJpUser(userId, bet int64) {
if jpBet, ok := m.jackpotUser[userId]; ok {
m.jackpotUser[userId] = jpBet + bet
} else {
m.jackpotUser[userId] = bet
}
}
// 返回map[中奖玩家]奖金,总jackpot值
func (m *JackPotMgr) WinJackpot() (map[int64]int64, int64) {
if len(m.jackpotUser) == 0 {
return nil, 0
}
jpV := jackpot.JackpotGet(m.rdb, m.gameId)
// totalJpBet := int64(0)
// for _, bet := range m.jackpotUser {
// totalJpBet += bet
// }
// jpRate := jackpot / totalJpBet
// log.Debug("jackpot:", jackpot, " totalJpBet:", totalJpBet, " jpRate:", jpRate)
// winUser := make(map[int64]int64)
// for userId, bet := range m.jackpotUser {
// winUser[userId] = bet * jpRate
// }
userJp := jpV / int64(len(m.jackpotUser))
log.DebugF("jackpot:%v 每个玩家分jp:%v. 清空jackpot池", userJp, userJp)
winUser := make(map[int64]int64)
for userId := range m.jackpotUser {
winUser[userId] = userJp
}
jackpot.JackpotSet(m.rdb, m.gameId, 0)
m.jackpotUser = make(map[int64]int64)
return winUser, jpV
}