123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117 |
- 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)
- }
- }
- }
|