印度包网
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

263 lines
6.3 KiB

1 year ago
package game
import (
"server/call"
"server/common"
"server/db"
"server/pb"
"server/util"
"time"
"github.com/liangdas/mqant/log"
)
const (
MillionMaxSeat = 4
)
// MillionSubTable 百人场子游戏数据
type MillionSubTable struct {
Table *Table
History []int64
TotalBet []int64
Jackpot *common.Jackpot
MillionSubTableInter
}
type MillionSubTableInter interface {
GetResult() (string, string)
}
func (t *Table) NewMillionSubTable() {
t.MillionSubTable = &MillionSubTable{Table: t}
db.Redis().GetJsonData(common.GetRedisKeyGameResult(ThisGameID, t.Room.RoomId()), &t.History)
}
func (t *MillionSubTable) GetTotal() (total int64) {
for _, v := range t.TotalBet {
total += v
}
return
}
func (t *MillionSubTable) Reset() {
t.Table.ResetTimeOut()
// 如果配置有改动,重新加载配置,广播告知客户端
if t.Table.ConfigChange {
t.Table.ConfigChange = false
t.Table.Config = *t.Table.Room.Config
for _, v := range t.Table.GetSeats() {
p := v.(*Player)
if p.IsRobot() {
continue
}
p.SubPlayer.TableInfo()
}
}
t.TotalBet = make([]int64, len(t.Table.Config.BetLimit))
for _, v := range t.Table.GetSeats() {
p := v.(*Player)
if p.IsLeave || p.WatchCount >= MaxWatchCount {
p.TotalBet = 0
p.Status = pb.PlayerStatus_PlayerStatusNormal
p.Leave()
continue
}
p.Reset()
// if !t.Table.IsSingle && !p.IsRobot() && call.ShouldMillionBlack(p.UID, t.Table.GameID) {
// p.IsLeave = true
// p.Leave()
// InnerActionGame(&pb.ActionGame{
// Action: 0,
// UID: int32(p.UID),
// GameKind: common.GetGameKindByID(ThisGameID),
// })
// }
}
t.Table.StartGame()
}
type MillionSubPlayerInter interface {
GetHistory()
}
// MillionSubPlayer 百人场子游戏玩家数据
type MillionSubPlayer struct {
*Player
AreaBet []int64
AreaWin []int64 // 每个区域输赢
WatchCount int // 观看不下注局数
MillionSubPlayerInter
}
func NewMillionSubPlayer(player *Player, sp MillionSubPlayerInter) *MillionSubPlayer {
p := &MillionSubPlayer{Player: player, MillionSubPlayerInter: sp}
p.AreaBet = make([]int64, len(p.Player.T.Config.BetLimit))
p.AreaWin = make([]int64, len(p.Player.T.Config.BetLimit))
return p
}
func (sp *MillionSubPlayer) Reset() {
sp.AreaBet = make([]int64, len(sp.Player.T.Config.BetLimit))
sp.AreaWin = make([]int64, len(sp.Player.T.Config.BetLimit))
}
func (sp *MillionSubPlayer) Settle() {
if sp.T.Room.RoomType == RoomTypePractice {
return
}
ct := sp.GameCurrencyType
settle := sp.FinalSettle
update := &common.UpdateCurrency{
NotNotify: true,
CurrencyBalance: &common.CurrencyBalance{
UID: sp.UID,
Type: ct,
Value: settle,
},
}
sp.PackUpdate(update)
util.Go(func() {
call.UpdateCurrencyPro(update)
})
}
func (p *MillionSubPlayer) MillionLeave() bool {
t := p.T
p.Debug("leave table,totalBet:%v", p.TotalBet)
resp := &pb.GameLeaveResp{Result: CodeOk}
if p.WatchCount >= MaxWatchCount {
resp.Reason = 1
}
p.SendReal(int(pb.GameProtocol_LeaveResp), resp)
if p.TotalBet > 0 || (t.IsSingle && t.Status != pb.GameStatus_GameStatusNormal) {
p.IsLeave = true
return false
}
// if p.SeatID >= 0 {
// t.SeatPlayers[p.SeatID] = nil
// t.Broadcast(int(pb.MillionProtocol_MillionSitdownResp), &pb.GameSitdownResp{Index: uint32(p.SeatID), Opt: 2})
// }
return true
}
func (p *MillionSubPlayer) MillionBet(area, amount int64) {
t := p.T
p.Debug("Bet area %v amount %v", area, amount)
code := CodeOk
defer func() {
p.DeferBet(area, amount, code)
}()
if t.Status != pb.GameStatus_GameStatusPlaying || int(area) > len(t.Config.BetLimit)-1 {
p.Debug("bet area:%v,areaBet:%v", area, len(t.Config.BetLimit))
code = CodeBetInvalid
return
}
if p.AreaBet[area]+int64(amount) > t.Config.BetLimit[area] {
code = CodeBetLimit
return
}
update := &common.UpdateCurrency{
CurrencyBalance: &common.CurrencyBalance{
Type: p.GameCurrencyType,
Value: -amount,
Event: common.CurrencyEventGameBet,
},
}
p.PackUpdate(update)
pro := call.MineCurrencyProReal(update)
if pro.Err != nil {
log.Error("err:%v", pro.Err)
code = CodeSeverError
return
}
// p.Currency.SetBalance(p.GameCurrencyType, pro.Balance)
p.Balance = pro.Balance
p.Status = pb.PlayerStatus_PlayerStatusPlaying
t.TotalBet[area] += int64(amount)
p.AreaBet[area] += int64(amount)
p.TotalBet += int64(amount)
// 更新排行榜
p.UpdateBetList()
}
// MillionSettle 百人场结算逻辑
func (p *Player) MillionSettle() {
if p.Status == pb.PlayerStatus_PlayerStatusNormal {
p.WatchCount++
} else {
p.WatchCount = 0
p.Settle()
}
}
func (mt *MillionSubTable) Settle() {
t := mt.Table
now := time.Now().Unix()
records := map[int]*common.ESMillionGameRecord{}
for _, v := range t.GetSeats() {
p := v.(*Player)
if p.Status == pb.PlayerStatus_PlayerStatusNormal || p.IsRobot() || p.TotalBet == 0 {
continue
}
record := records[p.ChannelID]
if record == nil {
record = &common.ESMillionGameRecord{
Time: now,
GameID: ThisGameID,
RoomID: t.Room.RoomId(),
UUID: t.UUID,
Channel: p.ChannelID,
}
record.Result, record.ResultDetail = mt.GetResult()
}
doc := &common.ESMillionPlayerRecord{
UID: p.UID,
Time: now,
GameID: ThisGameID,
RoomID: t.Room.RoomId(),
UUID: t.UUID,
Settle: p.FinalSettle,
Result: record.Result,
Channel: p.ChannelID,
Bets: p.AreaBet,
}
db.ES().InsertToESGO(common.ESIndexBackMillionPlayerRecord, doc)
record.PlayerCount++
record.PlayerBet += p.MillionSubPlayer.TotalBet
if p.FinalSettle > 0 {
record.Reward += p.FinalSettle
}
record.Profit += p.FinalSettle
records[p.ChannelID] = record
}
for i := range records {
db.ES().InsertToESGO(common.ESIndexBackMillionGameRecord, records[i])
}
}
func (p *MillionSubPlayer) DeferBet(area, amount int64, code int) {
t := p.T
resp := &pb.GameMsgBetResp{
Code: int64(code),
CurrencyType: int64(p.GameCurrencyType),
Amount: amount,
Balance: p.Balance,
Area: area,
}
p.Send(int(pb.GameProtocol_BetResp), resp)
if code != CodeOk {
return
}
respBroadcast := &pb.GameMsgBetBroadcastResp{
UID: int64(p.UID),
CurrencyType: int64(p.GameCurrencyType),
Amount: amount,
Area: area,
}
t.Broadcast(int(pb.GameProtocol_BetBroadcast), respBroadcast, p.UID)
}