github.com/lianghucheng/zrddz@v0.0.0-20200923083010-c71f680932e2/src/game/internal/room.go (about)

     1  package internal
     2  
     3  import (
     4  	"common"
     5  	"fmt"
     6  
     7  	"github.com/name5566/leaf/log"
     8  	"gopkg.in/mgo.v2/bson"
     9  )
    10  
    11  // 房间状态
    12  const (
    13  	roomIdle = iota // 0 空闲
    14  	roomGame        // 1 游戏中
    15  )
    16  
    17  // 房间类型
    18  const (
    19  	roomPractice          = iota // 0 练习
    20  	roomBaseScoreMatching        // 1 底分匹配
    21  	roomBaseScorePrivate         // 2 底分私人
    22  	roomVIPPrivate               // 3 VIP私人
    23  	roomRedPacketMatching        // 4 红包匹配
    24  	roomRedPacketPrivate         // 5 红包私人
    25  )
    26  
    27  var (
    28  	roomNumbers []int
    29  	roomCounter = 0
    30  )
    31  
    32  type Room interface {
    33  	Enter(user *User) bool
    34  	Exit(user *User)
    35  	SitDown(user *User, pos int)
    36  	StandUp(user *User, pos int)
    37  	GetAllPlayers(user *User)
    38  	StartGame()
    39  	EndGame()
    40  }
    41  
    42  type room struct {
    43  	state           int
    44  	loginIPs        map[string]bool
    45  	positionUserIDs map[int]int // key: 座位号, value: userID
    46  	creatorUserID   int         // 创建者 userID
    47  	ownerUserID     int         // 房主 userID
    48  	number          string
    49  	desc            string
    50  	startTimestamp          int64 // 开始时间
    51  	eachRoundStartTimestamp int64 // 每一局开始时间
    52  	endTimestamp            int64 // 结束时间
    53  }
    54  
    55  func init() {
    56  	for i := 0; i < 1000000; i++ {
    57  		roomNumbers = append(roomNumbers, i)
    58  	}
    59  	roomNumbers = common.Shuffle(roomNumbers)
    60  }
    61  
    62  func getRoomNumber() string {
    63  	log.Debug("房间计数器: %v", roomCounter)
    64  	roomNumber := fmt.Sprintf("%06d", roomNumbers[roomCounter])
    65  	roomCounter = (roomCounter + 1) % 1000000
    66  	return roomNumber
    67  }
    68  
    69  func broadcast(msg interface{}, positionUserIDs map[int]int, pos int) {
    70  	for position, userID := range positionUserIDs {
    71  		if position == pos {
    72  			continue
    73  		}
    74  		if user, ok := userIDUsers[userID]; ok {
    75  			if user.state != userLogout {
    76  				user.WriteMsg(msg)
    77  			}
    78  		}
    79  	}
    80  }
    81  
    82  func broadcastAll(msg interface{}) {
    83  	for _, user := range userIDUsers {
    84  		if user.state != userLogout {
    85  			user.WriteMsg(msg)
    86  		}
    87  	}
    88  }
    89  
    90  func toRelativePosition(pos int, zeroPos int, maxPlayers int) int {
    91  	return (maxPlayers - zeroPos + pos) % maxPlayers
    92  }
    93  
    94  func toRealPosition(relativePos int, zeroPos int, maxPlayers int) int {
    95  	return (maxPlayers + zeroPos + relativePos) % maxPlayers
    96  }
    97  
    98  func upsertRobotData(id string, update interface{}) {
    99  	skeleton.Go(func() {
   100  		db := mongoDB.Ref()
   101  		defer mongoDB.UnRef(db)
   102  		_, err := db.DB(DB).C("robot").UpsertId(id, update)
   103  		if err != nil {
   104  			log.Error("upsert %v error: %v", id, err)
   105  		}
   106  	}, nil)
   107  }
   108  
   109  func upsertTaskTicket(id interface{}, update interface{}) {
   110  	skeleton.Go(func() {
   111  		db := mongoDB.Ref()
   112  		defer mongoDB.UnRef(db)
   113  		_, err := db.DB(DB).C("taskticket").Upsert(id, update)
   114  		if err != nil {
   115  			log.Error("upsert taskticket %v error: %v", id, err)
   116  		}
   117  	}, nil)
   118  }
   119  
   120  func clearToken() {
   121  	skeleton.Go(func() {
   122  		db := mongoDB.Ref()
   123  		defer mongoDB.UnRef(db)
   124  
   125  		userData := new(UserData)
   126  		iter := db.DB(DB).C("users").Find(bson.M{"role": rolePlayer}).Iter()
   127  		for iter.Next(&userData) {
   128  			if user, ok := userIDUsers[userData.UserID]; ok {
   129  				user.baseData.userData.Token = ""
   130  			} else {
   131  				updateUserData(userData.UserID, bson.M{"$set": bson.M{"token": ""}})
   132  			}
   133  		}
   134  		if err := iter.Close(); err != nil {
   135  			log.Error("iter close error: %v", err)
   136  		}
   137  
   138  	}, nil)
   139  }