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.
106 lines
2.6 KiB
106 lines
2.6 KiB
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() |
|
}
|
|
|