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.
107 lines
2.6 KiB
107 lines
2.6 KiB
|
1 year ago
|
package crash
|
||
|
|
|
||
|
|
import (
|
||
|
|
"server/game"
|
||
|
|
"server/pb"
|
||
|
|
|
||
|
|
timewheel "github.com/liangdas/mqant/module/modules/timer"
|
||
|
|
)
|
||
|
|
|
||
|
|
type Player struct {
|
||
|
|
*game.Player
|
||
|
|
SetAutoCashoutOdd int64 // 客户端设置的值
|
||
|
|
AutoCashoutOdd int64 // 自动下车生效倍数
|
||
|
|
IsAutoSettle bool // 是否是自动下车触发的结算
|
||
|
|
AutoCashoutTimer string
|
||
|
|
}
|
||
|
|
|
||
|
|
func NewPlayer(player *game.Player) *Player {
|
||
|
|
p := &Player{Player: player}
|
||
|
|
player.MillionSubPlayer = game.NewMillionSubPlayer(player, p)
|
||
|
|
return p
|
||
|
|
}
|
||
|
|
|
||
|
|
func (p *Player) Reset() {
|
||
|
|
p.IsAutoSettle = false
|
||
|
|
p.AutoCashoutOdd = 0
|
||
|
|
p.AutoCashoutTimer = ""
|
||
|
|
}
|
||
|
|
|
||
|
|
func (p *Player) Enter() {
|
||
|
|
p.OnEnter()
|
||
|
|
}
|
||
|
|
|
||
|
|
func (p *Player) OnEnter() {
|
||
|
|
p.TableInfo()
|
||
|
|
}
|
||
|
|
|
||
|
|
func (p *Player) TableInfo() {
|
||
|
|
t := p.T.SubTable.(*Table)
|
||
|
|
resp := &pb.CrashMsgTableInfoResp{TableInfo: &pb.GameCommonTableInfo{}}
|
||
|
|
p.PackTableInfo(resp.TableInfo)
|
||
|
|
resp.AutoCashOut = p.SetAutoCashoutOdd
|
||
|
|
if t.Status == pb.GameStatus_GameStatusSettle {
|
||
|
|
resp.Multiple = t.Result
|
||
|
|
} else if t.Status == pb.GameStatus_GameStatusSpecial {
|
||
|
|
resp.Multiple = t.CalOdds() + 100
|
||
|
|
}
|
||
|
|
p.Send(int(pb.GameProtocol_TableInfoResp), resp)
|
||
|
|
}
|
||
|
|
|
||
|
|
func (p *Player) Settle() {
|
||
|
|
t := p.T.SubTable.(*Table)
|
||
|
|
odds := GetOdds(int64(t.FlyTime))
|
||
|
|
shouldSettleCashout := t.Status == pb.GameStatus_GameStatusSpecial // 是否应该结算退出获利
|
||
|
|
if t.Status == pb.GameStatus_GameStatusSpecial {
|
||
|
|
if p.IsAutoSettle {
|
||
|
|
odds = p.AutoCashoutOdd - 100
|
||
|
|
} else {
|
||
|
|
odds = t.CalOdds()
|
||
|
|
}
|
||
|
|
} else if p.AutoCashoutOdd-100 <= odds {
|
||
|
|
odds = p.AutoCashoutOdd - 100
|
||
|
|
shouldSettleCashout = true
|
||
|
|
}
|
||
|
|
if odds <= 0 {
|
||
|
|
shouldSettleCashout = false
|
||
|
|
}
|
||
|
|
if p.AutoCashoutTimer != "" {
|
||
|
|
timewheel.GetTimeWheel().RemoveTimer(p.AutoCashoutTimer)
|
||
|
|
}
|
||
|
|
p.Debug("settle,odds:%v", odds)
|
||
|
|
// 爆炸前结算或者开出jackpot时玩家还未退出,按最高倍数结算
|
||
|
|
if shouldSettleCashout {
|
||
|
|
p.FinalSettle = (odds + 100) * p.TotalBet / 100
|
||
|
|
if t.Status == pb.GameStatus_GameStatusSpecial {
|
||
|
|
t.Broadcast(int(pb.CrashProtocol_CrashCashOutResp), &pb.CrashMsgOtherCashOutResp{UID: uint32(p.UID), ODD: odds + 100, Nick: p.Nick}, p.UID)
|
||
|
|
p.Send(int(pb.CrashProtocol_CrashCashOutResp), &pb.CrashMsgOtherCashOutResp{UID: uint32(p.UID), ODD: odds + 100, Nick: p.Nick, Amount: p.FinalSettle})
|
||
|
|
}
|
||
|
|
}
|
||
|
|
p.Debug("set:%v", p.FinalSettle)
|
||
|
|
p.MillionSubPlayer.Settle()
|
||
|
|
}
|
||
|
|
|
||
|
|
func (p *Player) Leave() bool {
|
||
|
|
return p.MillionLeave()
|
||
|
|
}
|
||
|
|
|
||
|
|
func (p *Player) CashOut() {
|
||
|
|
t := p.T
|
||
|
|
if t.Status != pb.GameStatus_GameStatusSpecial {
|
||
|
|
return
|
||
|
|
}
|
||
|
|
p.Player.Settle()
|
||
|
|
}
|
||
|
|
|
||
|
|
func (p *Player) AutoCashOut() {
|
||
|
|
t := p.T
|
||
|
|
if t.Status != pb.GameStatus_GameStatusSpecial {
|
||
|
|
return
|
||
|
|
}
|
||
|
|
if p.AutoCashoutOdd == 0 {
|
||
|
|
return
|
||
|
|
}
|
||
|
|
p.IsAutoSettle = true
|
||
|
|
p.Player.Settle()
|
||
|
|
}
|