package chess import ( rule "mongo.games.com/game/gamerule/chess" proto_chesstitians "mongo.games.com/game/protocol/chesstitians" "mongo.games.com/game/protocol/player" "mongo.games.com/game/robot/base" "mongo.games.com/goserver/core/netlib" ) type ChesstitiansScene struct { base.BaseScene *proto_chesstitians.SCChesstitiansRoomInfo players map[int32]*ChesstitiansPlayer chess rule.Logic } type filterFunc func(*ChesstitiansScene, *ChesstitiansPlayer, []int32, []int32, []int32, bool) (bool, []int32) var FilterMgr []filterFunc func NewChesstitiansScene(info *proto_chesstitians.SCChesstitiansRoomInfo) *ChesstitiansScene { s := &ChesstitiansScene{ SCChesstitiansRoomInfo: info, players: make(map[int32]*ChesstitiansPlayer), } s.Init() return s } func (s *ChesstitiansScene) Init() { s.players = make(map[int32]*ChesstitiansPlayer) for _, mpd := range s.GetPlayers() { p := NewChesstitiansPlayer(mpd) if p != nil { s.AddPlayer(p) } } s.chess = rule.NewChess(int(s.Variant)) s.chess.Init() s.makeChessStruct(s.chess) } func (s *ChesstitiansScene) GetIsAllAi() bool { var i int for _, p := range s.players { if p.IsRobot() { i++ } } return i == 4 } func (s *ChesstitiansScene) Clear() { for _, p := range s.players { p.Clear() } } func (s *ChesstitiansScene) AddPlayer(p base.IPlayer) { if mp, ok := p.(*ChesstitiansPlayer); ok { s.players[p.GetSnId()] = mp } } func (s *ChesstitiansScene) DelPlayer(snid int32) { if p, exist := s.players[snid]; exist && p != nil { delete(s.players, snid) } } func (s *ChesstitiansScene) GetPlayerByPos(pos int32) base.IPlayer { return nil } func (s *ChesstitiansScene) GetPlayerBySnid(snid int32) base.IPlayer { if p, exist := s.players[snid]; exist { return p } return nil } func (s *ChesstitiansScene) GetPlayerByNotSnid(snid int32) base.IPlayer { for _, chesstitiansPlayer := range s.players { if chesstitiansPlayer.GetSnId() != snid { return chesstitiansPlayer } } return nil } func (this *ChesstitiansScene) GetMe(s *netlib.Session) base.IPlayer { if user, ok := s.GetAttribute(base.SessionAttributeUser).(*player.SCPlayerData); ok { return this.GetPlayerBySnid(user.GetData().GetSnId()) } return nil } func (this *ChesstitiansScene) GetOp(s *netlib.Session) base.IPlayer { if user, ok := s.GetAttribute(base.SessionAttributeUser).(*player.SCPlayerData); ok { return this.GetPlayerByNotSnid(user.GetData().GetSnId()) } return nil } func (s *ChesstitiansScene) IsFull() bool { return len(s.players) >= int(s.MaxPlayerNum) } func (s *ChesstitiansScene) IsMatchScene() bool { return s.IsMatch == 1 || s.IsMatch == 2 //锦标赛和冠军赛 } func (this *ChesstitiansScene) Update(ts int64) { } func (this *ChesstitiansScene) makeChessStruct(chess rule.Logic) { chess.Set(this.GetChess(), nil, this.GetAct(), this.GetCastling(), this.GetCambodianMove(), int(this.GetEnpassant()), int(this.GetChessRound())) } func (this *ChesstitiansScene) PlayOp(fromIdx int, toIdx int) { this.chess.Move(fromIdx, toIdx) this.Chess[fromIdx] = string(this.chess.GetPiece(fromIdx)) this.Chess[toIdx] = string(this.chess.GetPiece(toIdx)) this.chess.NextAct() this.Act = this.chess.GetAct() this.Round = int32(this.chess.GetRound()) this.CambodianMove = this.chess.GetCambodianMove() }