package teen import ( "fmt" "server/game" "server/game/room" "server/msg" "time" ) // 创建定时管理器 var timerMgr = NewTimerManager() // 开始发牌,先给庄家发牌 func startDealCard(r *room.Room) { initCardDeck(r) shuffleCardDeck(r.CardDeck) if r.Status == room.RoomStatusWaiting { r.Status = room.RoomStatusDealing dealer := r.GetDealerPlayer() // 找到庄家下家依次发牌 for i, player := range r.GetPlayersBySitPos(dealer.SitPos) { player.HandCards = getThreeCards(r) player.WaitCard = false game.Module.Skeleton.AfterFunc(time.Second*1*time.Duration(i), func() { // 如果等待的人数小于等于0,则开始通知庄家操作 // if len(r.GetWaitCardPlayers()) <= 0 { // } notifyPlayerDealCard(r, player.SitPos) if player.SitPos == dealer.SitPos { game.Module.Skeleton.Go(func() { notifyPlayerAction(r, dealer.SitPos, msg.PlayerOptType_OPT_SELECT) }, func() { r.Status = room.RoomStatusPlaying }) } }) } } } // 返回牌堆里3张牌,并从牌堆中移除 func getThreeCards(room *room.Room) []room.Card { // 获取前三张牌 threeCards := room.CardDeck[:3] // 移除这三张牌(保留剩余的牌) room.CardDeck = room.CardDeck[3:] // 返回这三张牌 return threeCards } // 通知玩家发牌 func notifyPlayerDealCard(room *room.Room, sitPos int32) { //遍历所有玩家 for _, player := range room.Players { if player.Agent != nil { player.Agent.WriteMsg(&msg.ReqDealCard{SitPos: int32(sitPos)}) } } } // 通知玩家操作 func notifyPlayerAction(room *room.Room, sitPos int32, optType msg.PlayerOptType) { player := room.GetPlayerBySitPos(sitPos) if !player.IsRobot { } else { //人机直接操作 robotOpt(room, sitPos, optType) } players := room.GetPlayersBySitPos(sitPos) for _, p := range players { if p.Agent != nil { p.Agent.WriteMsg(&msg.ReqPlayerAction{SitPos: int32(sitPos), PlayerOpt: &msg.PlayerOpt{OptType: optType}}) addPlayerOptTimeout(room, player, time.Second*time.Duration(GameConfig.ThinkTime)) } } // game.Module.Skeleton.AfterFunc(time.Second*time.Duration(GameConfig.ThinkTime), func() { // }) } // 添加玩家操作超时事件 func addPlayerOptTimeout(room *room.Room, player *room.Player, timeout time.Duration) { eventID := fmt.Sprintf("player_%s_opt_%s", player.Id, player.SitPos) timerMgr.AddEvent(eventID, timeout, func() { // 超时处理逻辑,弃牌 discardCard(room, player.SitPos) }) } // 收到玩家操作 func recvPlayerOptAction(room *room.Room, sitPos int32, optType msg.PlayerOptType) { player := room.GetPlayerBySitPos(sitPos) if player.Agent != nil { cancelOptTimeout(player, sitPos) if optType == msg.PlayerOptType_OPT_SEEN { // 看牌 lookCard(room, sitPos) } else if optType == msg.PlayerOptType_OPT_PACKED { // 弃牌 discardCard(room, sitPos) } else if optType == msg.PlayerOptType_OPT_CHAAL { // 跟注 call(room, sitPos) } } } // 发送消息给所有玩家 func SendRoundMsgToAll(room *room.Room, msg *msg.ReqRound) { for _, player := range room.Players { if player.Agent != nil { player.Agent.WriteMsg(msg) } } }