411 lines
10 KiB
Go
411 lines
10 KiB
Go
package smallrocket
|
|
|
|
import (
|
|
"fmt"
|
|
rule "mongo.games.com/game/gamerule/smallrocket"
|
|
"mongo.games.com/game/gamesrv/base"
|
|
"mongo.games.com/game/proto"
|
|
"mongo.games.com/game/protocol/smallrocket"
|
|
"mongo.games.com/goserver/core/logger"
|
|
"strconv"
|
|
)
|
|
|
|
type PlayerEx struct {
|
|
*base.Player //玩家信息
|
|
|
|
betData []*rule.BetDataEx // 下注信息
|
|
CurBetData []*rule.BetDataEx // 本局的下注信息
|
|
gainCoin int64 // 本局赢的金币
|
|
taxCoin int64 // 本局税收
|
|
odds int32
|
|
}
|
|
|
|
func (this *PlayerEx) Clear(baseScore int32) {
|
|
this.UnmarkFlag(base.PlayerState_WaitNext)
|
|
this.UnmarkFlag(base.PlayerState_GameBreak)
|
|
this.MarkFlag(base.PlayerState_Ready)
|
|
|
|
this.gainCoin = 0
|
|
this.taxCoin = 0
|
|
this.odds = 0
|
|
|
|
this.betData = make([]*rule.BetDataEx, 2)
|
|
this.CurBetData = make([]*rule.BetDataEx, 2)
|
|
|
|
this.InitBetData(baseScore)
|
|
}
|
|
|
|
func (this *PlayerEx) CanOp(sceneEx *SceneEx) bool {
|
|
if !this.IsGameing() {
|
|
logger.Logger.Trace("(this *PlayerEx) CanOp return false ", this.SnId)
|
|
return false
|
|
}
|
|
return true
|
|
}
|
|
|
|
// 按下注位置检查能否下注
|
|
func (this *PlayerEx) CanBetCoinByPos(betPos int, betVal int64) bool {
|
|
if len(this.betData) >= 2 && betPos <= 1 {
|
|
if this.GetCoin() >= betVal {
|
|
return true
|
|
}
|
|
}
|
|
|
|
return false
|
|
}
|
|
|
|
// 检查金币能否够下注
|
|
func (this *PlayerEx) CanBetCoin() bool {
|
|
if len(this.betData) >= 2 {
|
|
var betCoins int64 = 0
|
|
for i := 0; i <= len(this.betData); i++ {
|
|
betCoins += this.betData[i].BetVal
|
|
}
|
|
|
|
if this.Coin >= betCoins {
|
|
return true
|
|
}
|
|
}
|
|
|
|
return false
|
|
}
|
|
|
|
// 游戏新一局 设置数据
|
|
func (this *PlayerEx) ReStartGame() {
|
|
this.ReBetDataStartGame()
|
|
this.gainCoin = 0
|
|
this.taxCoin = 0
|
|
this.odds = 0
|
|
}
|
|
|
|
// 金币不够停止下注
|
|
func (this *PlayerEx) StopBetCoinByPos(betPos int) {
|
|
|
|
logger.Logger.Trace("(this *PlayerEx) StopBetCoinByPos SnId: ", this.SnId, " | betPos:", betPos)
|
|
|
|
if len(this.betData) >= 2 && betPos <= 1 {
|
|
|
|
if this.betData[betPos].IsAutoBetAndTake {
|
|
|
|
params := make([]int64, 10)
|
|
params[0] = int64(betPos)
|
|
pack := &smallrocket.SCSmallRocketOp{
|
|
SnId: proto.Int32(this.SnId),
|
|
OpCode: proto.Int32(int32(rule.SmallRocketPlayerOpStopAutoBet)),
|
|
Params: params,
|
|
OpRetCode: smallrocket.OpResultCode_OPRC_CoinNotEnough,
|
|
}
|
|
|
|
if this.betData != nil {
|
|
for i := 0; i < len(this.betData); i++ {
|
|
|
|
tempBetEml := &smallrocket.BetDataInfo{
|
|
BetVal: proto.Int64(this.betData[i].BetVal),
|
|
TakeMul: proto.Float32(float32(this.betData[i].TakeMul)),
|
|
IsCurBet: proto.Bool(false),
|
|
IsNextBet: proto.Bool(false),
|
|
IsTakeGain: proto.Bool(false),
|
|
IsAutoBetAndTake: proto.Bool(false),
|
|
}
|
|
|
|
pack.BetDataArr = append(pack.BetDataArr, tempBetEml)
|
|
}
|
|
}
|
|
|
|
this.SendToClient(int(smallrocket.SmallRocketPacketID_PACKET_SC_SMALLROCKET_PLAYEROP), pack)
|
|
}
|
|
|
|
this.betData[betPos].IsCurBet = false
|
|
this.betData[betPos].IsNextBet = false
|
|
this.betData[betPos].IsAutoBetAndTake = false
|
|
this.betData[betPos].IsTakeGain = false
|
|
}
|
|
}
|
|
|
|
// 停止不能下注的
|
|
func (this *PlayerEx) StopBetCoin() (betPos0 bool, betPos1 bool) {
|
|
|
|
if len(this.betData) >= 2 {
|
|
BetCoin0Val := this.betData[0].BetVal
|
|
BetCoin1Val := this.betData[1].BetVal
|
|
|
|
logger.Logger.Trace("(this *PlayerEx) StopBetCoin SnId:", this.SnId, " | Coin:", this.Coin, " | BetCoin0Val:", BetCoin0Val, " | BetCoin1Val:", BetCoin1Val)
|
|
|
|
if this.betData[0].IsCurBet && this.betData[1].IsCurBet {
|
|
if this.GetCoin() <= 0 {
|
|
this.StopBetCoinByPos(0)
|
|
this.StopBetCoinByPos(1)
|
|
return true, true
|
|
}
|
|
|
|
// 两个押注都够,什么也不做
|
|
if (BetCoin0Val + BetCoin1Val) <= this.Coin {
|
|
return false, false
|
|
}
|
|
|
|
// 两个押注都不够,全部停止投注
|
|
if BetCoin0Val > this.Coin && BetCoin1Val > this.Coin {
|
|
this.StopBetCoinByPos(0)
|
|
this.StopBetCoinByPos(1)
|
|
return true, true
|
|
}
|
|
|
|
// 两个押注之和大于 玩家所拥有金币数
|
|
if (BetCoin0Val + BetCoin1Val) > this.Coin {
|
|
if BetCoin0Val < this.Coin && BetCoin1Val < this.Coin {
|
|
if BetCoin0Val >= BetCoin1Val {
|
|
this.StopBetCoinByPos(1)
|
|
betPos0 = false
|
|
betPos1 = true
|
|
} else {
|
|
this.StopBetCoinByPos(0)
|
|
betPos0 = true
|
|
betPos1 = false
|
|
}
|
|
return
|
|
}
|
|
|
|
if BetCoin0Val <= this.Coin || BetCoin1Val <= this.Coin {
|
|
if BetCoin0Val > this.Coin {
|
|
this.StopBetCoinByPos(0)
|
|
betPos0 = false
|
|
betPos1 = true
|
|
}
|
|
|
|
if BetCoin1Val > this.Coin {
|
|
this.StopBetCoinByPos(1)
|
|
betPos0 = false
|
|
betPos1 = true
|
|
}
|
|
|
|
return betPos0, betPos1
|
|
}
|
|
}
|
|
} else if this.betData[0].IsCurBet && !this.betData[1].IsCurBet {
|
|
if BetCoin0Val > this.Coin {
|
|
this.StopBetCoinByPos(0)
|
|
}
|
|
} else if !this.betData[0].IsCurBet && this.betData[1].IsCurBet {
|
|
if BetCoin1Val > this.Coin {
|
|
this.StopBetCoinByPos(1)
|
|
}
|
|
}
|
|
}
|
|
|
|
return false, false
|
|
}
|
|
|
|
// 不在线的玩家停止自动下注
|
|
func (this *PlayerEx) StopLineAutoBetCoin() {
|
|
if this.IsOnLine() {
|
|
return
|
|
}
|
|
|
|
if len(this.betData) >= 2 {
|
|
for i := 0; i < len(this.betData); i++ {
|
|
if this.betData[i].IsAutoBetAndTake || this.betData[i].IsCurBet {
|
|
this.betData[i].IsAutoBetAndTake = false
|
|
this.betData[i].IsCurBet = false
|
|
this.betData[i].IsNextBet = false
|
|
|
|
this.betData[i].ReStartGame()
|
|
logger.Logger.Trace("(this *PlayerEx) StopLineAutoBetCoin SnId:", this.SnId, " betPos:", i)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// 初始化下注数据
|
|
func (this *PlayerEx) InitBetData(baseScore int32) {
|
|
|
|
for i := 0; i < len(this.betData); i++ {
|
|
|
|
TakeMul, _ := strconv.ParseFloat(fmt.Sprintf("%.2f", 1.20), 64)
|
|
this.betData[i] = &rule.BetDataEx{
|
|
BetVal: int64(baseScore),
|
|
TakeMul: TakeMul,
|
|
IsCurBet: false,
|
|
IsNextBet: false,
|
|
IsTakeGain: false,
|
|
IsAutoBetAndTake: false,
|
|
}
|
|
}
|
|
|
|
for i := 0; i < len(this.betData); i++ {
|
|
|
|
TakeMul, _ := strconv.ParseFloat(fmt.Sprintf("%.2f", 1.20), 64)
|
|
this.CurBetData[i] = &rule.BetDataEx{
|
|
BetVal: int64(baseScore),
|
|
TakeMul: TakeMul,
|
|
IsCurBet: false,
|
|
IsNextBet: false,
|
|
IsTakeGain: false,
|
|
IsAutoBetAndTake: false,
|
|
}
|
|
}
|
|
}
|
|
|
|
func (this *PlayerEx) CopyToCurBetData() {
|
|
|
|
for i := 0; i < len(this.betData); i++ {
|
|
this.CurBetData[i].BetVal = this.betData[i].BetVal
|
|
this.CurBetData[i].TakeMul = this.betData[i].TakeMul
|
|
this.CurBetData[i].IsCurBet = this.betData[i].IsCurBet
|
|
this.CurBetData[i].IsNextBet = this.betData[i].IsNextBet
|
|
this.CurBetData[i].IsTakeGain = this.betData[i].IsTakeGain
|
|
this.CurBetData[i].IsAutoBetAndTake = this.betData[i].IsAutoBetAndTake
|
|
this.CurBetData[i].GainSearchTime = this.betData[i].GainSearchTime
|
|
this.CurBetData[i].GainCoinMul = this.betData[i].GainCoinMul
|
|
|
|
}
|
|
}
|
|
|
|
// 重置下注数据
|
|
func (this *PlayerEx) ResetBetData() {
|
|
if len(this.betData) >= 2 {
|
|
for i := 0; i < len(this.betData); i++ {
|
|
this.betData[i].Reset()
|
|
}
|
|
}
|
|
|
|
if len(this.CurBetData) >= 2 {
|
|
for i := 0; i < len(this.CurBetData); i++ {
|
|
this.CurBetData[i].Reset()
|
|
}
|
|
}
|
|
}
|
|
|
|
// 游戏新一局 设置下注数据
|
|
func (this *PlayerEx) ReBetDataStartGame() {
|
|
if len(this.betData) >= 2 {
|
|
for i := 0; i < len(this.betData); i++ {
|
|
this.betData[i].ReStartGame()
|
|
}
|
|
}
|
|
|
|
if len(this.CurBetData) >= 2 {
|
|
this.CopyToCurBetData()
|
|
}
|
|
}
|
|
|
|
// 玩家设置自动
|
|
func (this *PlayerEx) SetAutoBetAndTake(isAutoBet int64, betPos int64) {
|
|
if len(this.betData) >= 2 && betPos <= 1 {
|
|
|
|
if isAutoBet == 1 {
|
|
this.betData[betPos].IsAutoBetAndTake = true
|
|
} else if isAutoBet == 0 {
|
|
this.betData[betPos].IsAutoBetAndTake = false
|
|
}
|
|
}
|
|
}
|
|
|
|
func (this *PlayerEx) GetAutoBetAndTake(betPos int64) bool {
|
|
if len(this.betData) >= 2 && betPos <= 1 {
|
|
return this.betData[betPos].IsAutoBetAndTake
|
|
}
|
|
|
|
return false
|
|
}
|
|
|
|
func (this *PlayerEx) IsAutoBetAndTakeByPos(betPos int64) bool {
|
|
if len(this.betData) >= 2 && betPos <= 1 {
|
|
return this.betData[betPos].IsAutoBetAndTake
|
|
}
|
|
|
|
return false
|
|
}
|
|
|
|
func (this *PlayerEx) IsAutoBetAndTake() bool {
|
|
if len(this.betData) >= 2 {
|
|
for i := 0; i < len(this.betData); i++ {
|
|
if this.betData[i].IsAutoBetAndTake {
|
|
return true
|
|
}
|
|
}
|
|
}
|
|
|
|
return false
|
|
}
|
|
|
|
func (this *PlayerEx) CanPlayerOpInState(sceneState int, betPos int) bool {
|
|
if len(this.betData) < 2 || betPos > 1 {
|
|
return false
|
|
}
|
|
|
|
return false
|
|
}
|
|
|
|
// 玩家自动下注
|
|
func (this *PlayerEx) PlayerAutoBet(sceneState int) {
|
|
|
|
if len(this.betData) >= 2 {
|
|
for i := 0; i < len(this.betData); i++ {
|
|
if sceneState == rule.SmallRocketSceneStateStart {
|
|
if this.betData[i].IsAutoBetAndTake {
|
|
this.betData[i].IsCurBet = true
|
|
this.betData[i].IsTakeGain = false
|
|
}
|
|
} else if sceneState == rule.SmallRocketSceneStatePlayGame {
|
|
if this.betData[i].IsAutoBetAndTake {
|
|
this.betData[i].IsNextBet = true
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// 能否退出游戏
|
|
func (this *PlayerEx) CanLeaveScene(sceneState int) bool {
|
|
|
|
if len(this.betData) >= 2 {
|
|
for i := 0; i < len(this.betData); i++ {
|
|
if sceneState == rule.SmallRocketSceneStateStart {
|
|
if this.betData[i].IsCurBet && !this.betData[i].IsTakeGain {
|
|
return false
|
|
}
|
|
} else if sceneState == rule.SmallRocketSceneStatePlayGame {
|
|
if this.betData[i].IsCurBet && !this.betData[i].IsTakeGain {
|
|
return false
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return true
|
|
}
|
|
|
|
// 本局是否领取过押注奖励
|
|
func (this *PlayerEx) IsFinishTakeBet(sceneState int) bool {
|
|
|
|
if len(this.betData) >= 2 {
|
|
for i := 0; i < len(this.betData); i++ {
|
|
if sceneState == rule.SmallRocketSceneStatePlayGame {
|
|
if this.betData[i].IsCurBet && this.betData[i].IsTakeGain {
|
|
return true
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return false
|
|
}
|
|
|
|
func (this *PlayerEx) PrintBetData(sceneState int) {
|
|
if sceneState == rule.SmallRocketSceneStateStart {
|
|
logger.Logger.Trace("StateStart: PrintBetData")
|
|
} else if sceneState == rule.SmallRocketSceneStatePlayGame {
|
|
logger.Logger.Trace("PlayGame: PrintBetData")
|
|
} else if sceneState == rule.SmallRocketSceneStateBilled {
|
|
logger.Logger.Trace("StateBilled: PrintBetData")
|
|
}
|
|
|
|
if len(this.betData) >= 2 {
|
|
for i := 0; i < len(this.betData); i++ {
|
|
logger.Logger.Trace("SnId:", this.SnId, " Name: ", this.Name, "PlayerEx-----betData[", i, "]:", *this.betData[i])
|
|
// logger.Logger.Trace("SnId:", this.SnId, " PlayerEx-----betData: ", *this.betData[i])
|
|
}
|
|
|
|
}
|
|
}
|