game_sync/gamesrv/smallrocket/player.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])
}
}
}