game_sync/robot/thirteen/thirteenwaterplayer.go

120 lines
2.7 KiB
Go

package thirteen
import (
rule "mongo.games.com/game/gamerule/thirteen"
"mongo.games.com/game/proto"
"mongo.games.com/game/protocol/thirteen"
"mongo.games.com/game/robot/base"
)
type ThirteenWaterPlayer struct {
base.BasePlayer
*thirteen.ThirteenPlayerData
oldCoin int64
OpDelayTimes int32 //本局延迟操作次数
allcardsO map[int]int32 //玩家所有牌型
cardsO *rule.Group //确定的牌型信息
maxcardsO int32 //最大牌的牌型
}
func NewThirteenWaterPlayer(data *thirteen.ThirteenPlayerData) *ThirteenWaterPlayer {
p := &ThirteenWaterPlayer{ThirteenPlayerData: data}
p.Init()
return p
}
func (p *ThirteenWaterPlayer) Init() {
p.oldCoin = p.GetCoin()
p.Clear()
}
func (p *ThirteenWaterPlayer) GetMaxCardsO() {
max := -1000
for _, v := range p.allcardsO {
sum := 0
if v >= 1000000 {
p.maxcardsO = v
break
}
a := v / 10000
b := (v - a*10000) / 100
c := v - a*10000 - b*100
s := []int32{a, b, c}
for _, k := range s {
if k > rule.PokersTypeZero && k <= rule.PokersTypeOne {
sum += rule.PokersTypeOne - int(k)
}
}
if max <= sum {
max = sum
p.maxcardsO = v
}
}
}
func (p *ThirteenWaterPlayer) Clear() {
p.UnmarkFlag(base.PlayerState_Ready)
p.UnmarkFlag(base.PlayerState_WaitNext)
p.UnmarkFlag(base.PlayerState_GameBreak)
p.OpDelayTimes = 0
p.allcardsO = make(map[int]int32)
p.cardsO = &rule.Group{Head: [3]int{-1, -1, -1}, Mid: [5]int{-1, -1, -1, -1, -1}, End: [5]int{-1, -1, -1, -1, -1}, PokerType: -1}
p.maxcardsO = -1
}
func (p *ThirteenWaterPlayer) MarkFlag(flag int32) {
myFlag := p.GetFlag()
myFlag |= flag
p.Flag = proto.Int32(myFlag)
}
func (p *ThirteenWaterPlayer) UnmarkFlag(flag int32) {
myFlag := p.GetFlag()
myFlag &= ^flag
p.Flag = proto.Int32(myFlag)
}
func (p *ThirteenWaterPlayer) IsMarkFlag(flag int32) bool {
if (p.GetFlag() & flag) != 0 {
return true
}
return false
}
func (p *ThirteenWaterPlayer) IsOnLine() bool {
return p.IsMarkFlag(base.PlayerState_Online)
}
func (p *ThirteenWaterPlayer) IsReady() bool {
return p.IsMarkFlag(base.PlayerState_Ready)
}
func (p *ThirteenWaterPlayer) IsSceneOwner() bool {
return p.IsMarkFlag(base.PlayerState_SceneOwner)
}
func (this *ThirteenWaterPlayer) IsGameing() bool {
return !this.IsMarkFlag(base.PlayerState_WaitNext) && !this.IsMarkFlag(base.PlayerState_GameBreak)
}
func (p *ThirteenWaterPlayer) IsRobot() bool {
player := base.PlayerMgrSingleton.GetPlayer(p.GetSnId())
return player != nil
}
func (p *ThirteenWaterPlayer) SetFlag(flag int32) {
p.Flag = proto.Int32(flag)
}
func (p *ThirteenWaterPlayer) GetLastOp() int32 {
return 0
}
func (p *ThirteenWaterPlayer) SetLastOp(op int32) {
}
func (p *ThirteenWaterPlayer) UpdateCards(cards []int32) {
if p != nil {
p.Cards = cards
}
}