game_sync/gamesrv/tienlen/playerdata_tienlen.go

223 lines
5.7 KiB
Go

package tienlen
import (
"math/rand"
"strconv"
"time"
rule "mongo.games.com/game/gamerule/tienlen"
"mongo.games.com/game/gamesrv/base"
"mongo.games.com/game/proto"
"mongo.games.com/game/protocol/tienlen"
)
// 玩家身上的额外数据
type TienLenPlayerData struct {
*base.Player //玩家信息
cards [rule.HandCardNum]int32 //手牌信息
delCards [][]int32 //出过的手牌
bombScore int64 //炸弹得分
bombTaxScore int64 //炸弹税收
isPass bool //小轮标记过牌
isDelAll bool //出完牌了
robotGameTimes int32 //机器人局数限制
winCoin int64 //本局赢的钱
odds int32 // 调控概率
bombRankScore int64 // 排位炸弹积分
tianHu int32 // 天胡类型
ThinkLongCnt int32 //长考次数
curHandLimitTimeOut time.Duration // 出牌时间上限
isNotOverLastHand bool //手牌不能压过上家出牌标志
cardScore int // 手牌评分
playerPool int // 个人水池分
}
func (this *TienLenPlayerData) init() {
for i := int32(0); i < rule.HandCardNum; i++ {
this.cards[i] = rule.InvalideCard
}
this.delCards = [][]int32{}
this.bombScore = 0
this.bombTaxScore = 0
this.isPass = false
this.isDelAll = false
this.robotGameTimes = rule.RobotGameTimesMin + rand.Int31n(rule.RobotGameTimesMax)
this.winCoin = 0
this.odds = 0
this.bombRankScore = 0
this.tianHu = 0
this.ThinkLongCnt = 0
this.curHandLimitTimeOut = rule.TienLenPlayerOpTimeout
this.isNotOverLastHand = false
this.cardScore = 0
this.playerPool = 0
}
func (this *TienLenPlayerData) Clear() {
for i := int32(0); i < rule.HandCardNum; i++ {
this.cards[i] = rule.InvalideCard
}
this.delCards = [][]int32{}
this.bombScore = 0
this.bombTaxScore = 0
this.isPass = false
this.isDelAll = false
this.winCoin = 0
this.odds = 0
this.bombRankScore = 0
this.tianHu = 0
this.ThinkLongCnt = 0
this.curHandLimitTimeOut = rule.TienLenPlayerOpTimeout
this.isNotOverLastHand = false
this.playerPool = 0
this.MarkFlag(base.PlayerState_WaitNext)
this.TestLog = this.TestLog[:0]
}
// CanOp 能否操作
func (this *TienLenPlayerData) CanOp() bool {
if this.IsGameing() && !this.isPass && !this.isDelAll {
return true
}
return false
}
// TotalOutIn 计算玩家赔率 产出/投入
func (this *TienLenPlayerData) TotalOutIn(gameId int32) (int64, int64) {
if this.GDatas != nil {
if d, exist := this.GDatas[strconv.Itoa(int(gameId))]; exist {
return d.Statics.TotalOut, d.Statics.TotalIn
}
}
return 0, 0
}
// GetThinkLongTime 根据长考次数获取当前出牌时间
func (this *TienLenPlayerData) GetThinkLongTime() time.Duration {
if this.IsRobot() {
return rule.TienLenPlayerOpTimeout
}
CurThinkLongCnt := this.ThinkLongCnt
if CurThinkLongCnt < 0 {
CurThinkLongCnt = 0
}
for _, TlValue := range rule.ThinkLongSct {
if CurThinkLongCnt >= TlValue.Min && CurThinkLongCnt <= TlValue.Max {
return TlValue.Time
}
}
return rule.TienLenPlayerOpTimeout
}
// RefreshThinkLongCnt 根据出牌时间计算 刷新长考次数
func (this *TienLenPlayerData) RefreshThinkLongCnt(handTime time.Duration, bSetZero bool) {
if this.IsRobot() {
return
}
CurThingLongTime := this.GetThinkLongTime()
if bSetZero {
this.ThinkLongCnt = 0
} else {
// 长考时间减去 出牌时间
second := (CurThingLongTime - handTime) / (time.Second)
if second <= 5 {
this.ThinkLongCnt++
}
}
this.SendThinkLongCnt()
}
// SendThinkLongCnt 发送长考次数
func (this *TienLenPlayerData) SendThinkLongCnt() {
if this.IsRobot() {
return
}
pack := &tienlen.SCTienLenPlayerThinkLongCnt{}
pack.ThinkLongCnt = this.ThinkLongCnt
proto.SetDefaults(pack)
this.SendToClient(int(tienlen.TienLenPacketID_PACKET_SCTienLenThinkLongCnt), pack)
//logger.Logger.Trace("-------(this *TienLenPlayerData) SendThinkLongCnt player SnId:", this.SnId, ";SCTienLenPlayerThinkLongCnt: ", pack.ThinkLongCnt)
}
// RefreshCurHandLimitTimeOut 刷新玩家出牌时间
func (this *TienLenPlayerData) RefreshCurHandLimitTimeOut() {
if this.IsRobot() {
return
}
this.curHandLimitTimeOut = this.GetThinkLongTime()
}
func (this *TienLenPlayerData) GetCurHandLimitTimeOut() time.Duration {
if this.IsRobot() {
return rule.TienLenPlayerOpTimeout
}
return this.curHandLimitTimeOut
}
// EnterAutoState 游戏中 进入自动托管状态
func (this *TienLenPlayerData) EnterAutoState() {
if this.IsRobot() {
return
}
if this.isNotOverLastHand {
return
}
if this.IsAuto() {
return
}
this.RefreshThinkLongCnt(0, true)
s := this.GetScene()
if s != nil {
if sceneEx, ok := s.GetExtraData().(*TienLenSceneData); ok {
if sceneEx.GetGaming() {
this.MarkFlag(base.PlayerState_Auto)
this.SyncFlag(true)
//logger.Logger.Trace("(this *TienLenPlayerData) EnterAutoState", " player=", this.Name, " ThinkLongCnt=", this.ThinkLongCnt)
}
}
}
}
// 游戏中 离开自动托管状态
func (this *TienLenPlayerData) LeaveAutoState(s *base.Scene) {
if this.IsRobot() {
return
}
this.RefreshThinkLongCnt(0, true)
if _, ok := s.GetExtraData().(*TienLenSceneData); ok {
this.UnmarkFlag(base.PlayerState_Auto)
onlyMyself := []bool{true}
this.SyncFlag(onlyMyself...)
//logger.Logger.Trace("(this *TienLenPlayerData) LeaveAutoState", " player:", this.SnId, " Flag=", this.GetFlag())
}
}
// 能否用记牌器
func (this *TienLenPlayerData) CanUseRecordItem() bool {
if this.ItemRecExpireTime >= time.Now().Unix() {
return true
}
return false
}