package clawdoll import ( "mongo.games.com/game/common" rule "mongo.games.com/game/gamerule/clawdoll" "mongo.games.com/game/gamesrv/base" "mongo.games.com/game/proto" "mongo.games.com/game/protocol/clawdoll" "mongo.games.com/goserver/core/logger" "mongo.games.com/goserver/core/netlib" "mongo.games.com/goserver/srvlib" ) type PlayerData struct { SnId int32 Head int32 //头像框 VIP int32 //VIP帐号 等级 Name string //名字 Sex int32 //性别 IsRob bool Coin int64 gainCoin int64 //本局赢的金币 taxCoin int64 //本局税收 isBilled bool //是否结算 CurIsWin int64 //当局输赢 负数:输 正数:赢 InviterId int32 //邀请人Id BeUnderAgentCode string //隶属经销商(推广人) IsPlayerFirst bool Platform string //平台 Channel string //渠道信息 PackageID string //推广包标识 对应客户端的packagetag flag int } type SceneEx struct { *base.Scene // 场景 logic *rule.Logic // players map[int32]*PlayerEx // 玩家信息 PlayerBackup map[int32]*PlayerData // 本局离场玩家数据备份 seats []*PlayerEx // 本局游戏中的玩家状态数据 RoundId int // 局数,第几局 robotNum int // 参与游戏的机器人数量 logid string machineId int //娃娃机ID machineConn *netlib.Session //娃娃机链接 machineStatus int32 //娃娃机链接状态 0:离线 1:在线 } // 游戏是否能开始 func (this *SceneEx) CanStart() bool { //人数>=1自动开始 if len(this.players) >= 0 && (this.GetRealPlayerNum() >= 0 || this.IsPreCreateScene()) { return true } return false } // 从房间删除玩家 func (this *SceneEx) delPlayer(p *base.Player) { if p, exist := this.players[p.SnId]; exist { this.seats[p.GetPos()] = nil delete(this.players, p.SnId) } } // 广播玩家离开 func (this *SceneEx) BroadcastPlayerLeave(p *base.Player, reason int) { scLeavePack := &clawdoll.SCCLAWDOLLPlayerLeave{ Pos: proto.Int(p.GetPos()), } proto.SetDefaults(scLeavePack) this.Broadcast(int(clawdoll.CLAWDOLLPacketID_PACKET_SC_CLAWDOLL_PlayerLeave), scLeavePack, p.GetSid()) } // 玩家离开事件 func (this *SceneEx) OnPlayerLeave(p *base.Player, reason int) { this.delPlayer(p) this.BroadcastPlayerLeave(p, reason) } func (this *SceneEx) SceneDestroy(force bool) { //销毁房间 this.Scene.Destroy(force) } func (e *SceneEx) playerOpPack(snId int32, opcode int, opRetCode clawdoll.OpResultCode, params []int64) *clawdoll.SCCLAWDOLLOp { pack := &clawdoll.SCCLAWDOLLOp{ SnId: proto.Int32(snId), OpCode: proto.Int32(int32(opcode)), Params: params, OpRetCode: opRetCode, } proto.SetDefaults(pack) return pack } // OnPlayerSCOp 发送玩家操作情况 func (e *SceneEx) OnPlayerSCOp(p *base.Player, opcode int, opRetCode clawdoll.OpResultCode, params []int64) { pack := e.playerOpPack(p.SnId, opcode, opRetCode, params) p.SendToClient(int(clawdoll.CLAWDOLLPacketID_PACKET_SC_CLAWDOLL_PLAYEROP), pack) logger.Logger.Tracef("OnPlayerSCOp %s", pack) } // 房间信息打包 func (this *SceneEx) ClawdollCreateRoomInfoPacket(s *base.Scene, p *base.Player) interface{} { pack := &clawdoll.SCCLAWDOLLRoomInfo{ RoomId: proto.Int(s.GetSceneId()), GameId: proto.Int(s.GetGameId()), RoomMode: proto.Int(s.GetSceneMode()), Params: common.CopySliceInt64ToInt32(s.Params), State: proto.Int(s.GetSceneState().GetState()), TimeOut: proto.Int(s.GetSceneState().GetTimeout(s)), TotalPlayer: proto.Int(len(this.players)), RoundId: proto.Int(this.RoundId), ParamsEx: nil, GameFreeId: 0, BaseScore: proto.Int32(this.GetBaseScore()), } // 玩家信息 for _, playerEx := range this.players { if p.SnId == playerEx.SnId { pd := &clawdoll.CLAWDOLLPlayerData{ SnId: proto.Int32(playerEx.SnId), Name: proto.String(playerEx.Name), Head: proto.Int32(playerEx.Head), Sex: proto.Int32(playerEx.Sex), Coin: proto.Int64(playerEx.Coin), Flag: proto.Int(playerEx.GetFlag()), HeadOutLine: proto.Int32(playerEx.HeadOutLine), VIP: proto.Int32(playerEx.VIP), WinCoin: proto.Int64(playerEx.gainCoin), } pack.Players = append(pack.Players, pd) } } proto.SetDefaults(pack) if p != nil { p.SyncFlag() } return pack } func NewClawdollSceneData(s *base.Scene) *SceneEx { sceneEx := &SceneEx{ Scene: s, logic: new(rule.Logic), players: make(map[int32]*PlayerEx), seats: make([]*PlayerEx, s.GetPlayerNum()), PlayerBackup: make(map[int32]*PlayerData), } return sceneEx } func (this *SceneEx) init() bool { this.Clear() return true } // 检查上分是否合法 func (this *SceneEx) CheckPayOp(betVal int64, takeMul int64) bool { //游戏底分 return true } func (this *SceneEx) Clear() { this.robotNum = 0 this.PlayerBackup = make(map[int32]*PlayerData) this.RoundId = 0 for i := 0; i < this.GetPlayerNum(); i++ { if this.seats[i] != nil { this.seats[i].Clear(this.GetBaseScore()) } } } func (this *SceneEx) BackupPlayer(p *PlayerEx, isBilled bool) { this.PlayerBackup[p.SnId] = &PlayerData{ SnId: p.SnId, gainCoin: p.gainCoin, taxCoin: p.taxCoin, isBilled: isBilled, IsRob: p.IsRob, Coin: p.Coin, Head: p.Head, flag: p.GetFlag(), Platform: p.Platform, Channel: p.Channel, PackageID: p.PackageID, CurIsWin: p.CurIsWin, Name: p.Name, Sex: p.Sex, VIP: p.VIP, InviterId: p.InviterId, IsPlayerFirst: this.IsPlayerFirst(p.Player), BeUnderAgentCode: p.BeUnderAgentCode, } } // 向娃娃机主机发送消息 func (this *SceneEx) SendToMachine(pid int, msg interface{}) { if this.machineConn == nil { this.machineConn = srvlib.ServerSessionMgrSington.GetSession(1, 10, 1001) } if this.machineConn != nil { this.machineConn.Send(pid, msg) } else { logger.Logger.Error("MachineConn is nil !") } }