Gogs 4 ماه پیش
والد
کامیت
2d9af562db
5فایلهای تغییر یافته به همراه564 افزوده شده و 139 حذف شده
  1. 23 0
      bin/client_msg/common.proto
  2. 76 0
      src/server/game/teen/buildRoom.go
  3. 1 1
      src/server/game/teen/event.go
  4. 5 23
      src/server/game/teen/teen.go
  5. 459 115
      src/server/msg/common.pb.go

+ 23 - 0
bin/client_msg/common.proto

@@ -37,6 +37,7 @@ message ReqJoinRoom {
   string userId = 1;
   string roomId = 2;
   string gameId = 3;
+  ReqRoom roomInfo = 4;
 }
 
 //玩法列表
@@ -112,6 +113,28 @@ message PlayerOpt {
     int64 timestamp = 3;         // 操作时间戳
 }
 
+message ReqRoom {
+  string Id = 1;
+  repeated ReqPlayer ReqPlayer = 2;
+  int32 Status = 3;
+  int32 Round = 4;
+  ReqGameRound GameRound = 5;
+}
+
+
+message ReqCard {
+  int32 Color = 1;
+  int32 Point = 2;
+}
+message  ReqPlayer {
+  string Id = 1;
+  repeated ReqCard HandCards =2;
+  int32 SitPos = 3;
+  bool IsDealer = 4;
+}
+message ReqGameRound {
+  repeated ReqRound Rounds = 1;
+}
 message ReqRound {
     // 回合数
     int32 round = 1;

+ 76 - 0
src/server/game/teen/buildRoom.go

@@ -0,0 +1,76 @@
+package teen
+
+import (
+	"server/game/room"
+	"server/msg"
+)
+
+func buildRoom(teenPattiRoom *room.Room) *msg.ReqRoom {
+	return &msg.ReqRoom{
+		Id:        teenPattiRoom.Id,
+		Status:    int32(teenPattiRoom.Status),
+		Round:     int32(teenPattiRoom.Round),
+		ReqPlayer: convertToMsgPlayerList(teenPattiRoom.Players),
+		GameRound: convertToMsgGameRound(teenPattiRoom.GameRound),
+	}
+}
+
+func convertToMsgPlayerList(players []*room.Player) []*msg.ReqPlayer {
+	msgPlayers := make([]*msg.ReqPlayer, len(players))
+	for i, player := range players {
+		msgPlayers[i] = &msg.ReqPlayer{
+			Id:        player.Id,
+			HandCards: convertToMsgCardList(player.HandCards),
+			SitPos:    int32(player.SitPos),
+			IsDealer:  player.IsDealer,
+		}
+	}
+	return msgPlayers
+}
+
+func convertToMsgCardList(cards []room.Card) []*msg.ReqCard {
+	msgCards := make([]*msg.ReqCard, len(cards))
+	for i, card := range cards {
+		msgCards[i] = &msg.ReqCard{
+			Color: int32(card.Color),
+			Point: int32(card.Point),
+		}
+	}
+	return msgCards
+}
+
+func convertToMsgGameRound(gameRound room.GameRound) *msg.ReqGameRound {
+	return &msg.ReqGameRound{
+		Rounds: convertToMsgRoundList(gameRound.Rounds),
+	}
+}
+
+func convertToMsgRoundList(rounds []room.Round) []*msg.ReqRound {
+	msgRounds := make([]*msg.ReqRound, len(rounds))
+	for i, round := range rounds {
+		msgRounds[i] = &msg.ReqRound{
+			Round:       int32(round.Round),
+			RoundSitPos: int32(round.RoundSitPos),
+		}
+	}
+	return msgRounds
+}
+
+func convertToMsgRoomList(rooms []TeenPattiRoom) *msg.TeenPattiRoomList {
+	msgRooms := make([]*msg.TeenPattiRoom, len(rooms))
+	for i, room := range rooms {
+		msgRooms[i] = &msg.TeenPattiRoom{
+			Boot:         room.Boot,
+			MinBuyin:     room.MinBuyin,
+			ChaalLimmit:  room.ChaalLimmit,
+			PotLimit:     room.PotLimit,
+			TotalPlayers: room.TotalPlayers,
+			RoomLevel:    room.RoomLevel,
+			RoomId:       room.RoomId,
+			Type:         room.Type,
+		}
+	}
+	return &msg.TeenPattiRoomList{
+		TeenPattiRoom: msgRooms,
+	}
+}

+ 1 - 1
src/server/game/teen/event.go

@@ -35,7 +35,7 @@ func handleEvents() {
 				UserData: userData,
 				SitPos:   0,
 			})
-			go startGame(m.UserId, m.RoomId, event.Agent)
+			go startGame(m.UserId, m.RoomId, event.Agent, userData.Teen_Patti_Room)
 		case events.EventTeenPattiPlayerOptAction:
 			// m := event.Data.(*msg.ResPlayerOptAction)
 			m := event.Data.(*msg.ResPlayerOptAction)

+ 5 - 23
src/server/game/teen/teen.go

@@ -84,36 +84,18 @@ func createRobotUserData() *user.UserData {
 	}
 }
 
-func startGame(userId string, roomId string, agent gate.Agent) {
+func startGame(userId string, roomId string, agent gate.Agent, teenPattiRoom *room.Room) {
 	// agent := Teen_Patti_Room.GetPlayer(userId).Agent
 	createRoom(userId, roomId, agent)
 	agent.WriteMsg(&msg.ReqJoinRoom{
-		UserId: userId,
-		RoomId: roomId,
-		GameId: "teen_patti",
+		UserId:   userId,
+		RoomId:   roomId,
+		GameId:   "teen_patti",
+		RoomInfo: buildRoom(teenPattiRoom),
 	})
 
 }
 
-func convertToMsgRoomList(rooms []TeenPattiRoom) *msg.TeenPattiRoomList {
-	msgRooms := make([]*msg.TeenPattiRoom, len(rooms))
-	for i, room := range rooms {
-		msgRooms[i] = &msg.TeenPattiRoom{
-			Boot:         room.Boot,
-			MinBuyin:     room.MinBuyin,
-			ChaalLimmit:  room.ChaalLimmit,
-			PotLimit:     room.PotLimit,
-			TotalPlayers: room.TotalPlayers,
-			RoomLevel:    room.RoomLevel,
-			RoomId:       room.RoomId,
-			Type:         room.Type,
-		}
-	}
-	return &msg.TeenPattiRoomList{
-		TeenPattiRoom: msgRooms,
-	}
-}
-
 /* 完整的52张牌映射:
 黑桃(0):
     i=0:  ♠A  (Color=0, Point=1)

+ 459 - 115
src/server/msg/common.pb.go

@@ -376,9 +376,10 @@ type ReqJoinRoom struct {
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 
-	UserId string `protobuf:"bytes,1,opt,name=userId,proto3" json:"userId,omitempty"`
-	RoomId string `protobuf:"bytes,2,opt,name=roomId,proto3" json:"roomId,omitempty"`
-	GameId string `protobuf:"bytes,3,opt,name=gameId,proto3" json:"gameId,omitempty"`
+	UserId   string   `protobuf:"bytes,1,opt,name=userId,proto3" json:"userId,omitempty"`
+	RoomId   string   `protobuf:"bytes,2,opt,name=roomId,proto3" json:"roomId,omitempty"`
+	GameId   string   `protobuf:"bytes,3,opt,name=gameId,proto3" json:"gameId,omitempty"`
+	RoomInfo *ReqRoom `protobuf:"bytes,4,opt,name=roomInfo,proto3" json:"roomInfo,omitempty"`
 }
 
 func (x *ReqJoinRoom) Reset() {
@@ -434,6 +435,13 @@ func (x *ReqJoinRoom) GetGameId() string {
 	return ""
 }
 
+func (x *ReqJoinRoom) GetRoomInfo() *ReqRoom {
+	if x != nil {
+		return x.RoomInfo
+	}
+	return nil
+}
+
 // 玩法列表
 type PlayList struct {
 	state         protoimpl.MessageState
@@ -1045,6 +1053,258 @@ func (x *PlayerOpt) GetTimestamp() int64 {
 	return 0
 }
 
+type ReqRoom struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Id        string        `protobuf:"bytes,1,opt,name=Id,proto3" json:"Id,omitempty"`
+	ReqPlayer []*ReqPlayer  `protobuf:"bytes,2,rep,name=ReqPlayer,proto3" json:"ReqPlayer,omitempty"`
+	Status    int32         `protobuf:"varint,3,opt,name=Status,proto3" json:"Status,omitempty"`
+	Round     int32         `protobuf:"varint,4,opt,name=Round,proto3" json:"Round,omitempty"`
+	GameRound *ReqGameRound `protobuf:"bytes,5,opt,name=GameRound,proto3" json:"GameRound,omitempty"`
+}
+
+func (x *ReqRoom) Reset() {
+	*x = ReqRoom{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_common_proto_msgTypes[16]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ReqRoom) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ReqRoom) ProtoMessage() {}
+
+func (x *ReqRoom) ProtoReflect() protoreflect.Message {
+	mi := &file_common_proto_msgTypes[16]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ReqRoom.ProtoReflect.Descriptor instead.
+func (*ReqRoom) Descriptor() ([]byte, []int) {
+	return file_common_proto_rawDescGZIP(), []int{16}
+}
+
+func (x *ReqRoom) GetId() string {
+	if x != nil {
+		return x.Id
+	}
+	return ""
+}
+
+func (x *ReqRoom) GetReqPlayer() []*ReqPlayer {
+	if x != nil {
+		return x.ReqPlayer
+	}
+	return nil
+}
+
+func (x *ReqRoom) GetStatus() int32 {
+	if x != nil {
+		return x.Status
+	}
+	return 0
+}
+
+func (x *ReqRoom) GetRound() int32 {
+	if x != nil {
+		return x.Round
+	}
+	return 0
+}
+
+func (x *ReqRoom) GetGameRound() *ReqGameRound {
+	if x != nil {
+		return x.GameRound
+	}
+	return nil
+}
+
+type ReqCard struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Color int32 `protobuf:"varint,1,opt,name=Color,proto3" json:"Color,omitempty"`
+	Point int32 `protobuf:"varint,2,opt,name=Point,proto3" json:"Point,omitempty"`
+}
+
+func (x *ReqCard) Reset() {
+	*x = ReqCard{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_common_proto_msgTypes[17]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ReqCard) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ReqCard) ProtoMessage() {}
+
+func (x *ReqCard) ProtoReflect() protoreflect.Message {
+	mi := &file_common_proto_msgTypes[17]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ReqCard.ProtoReflect.Descriptor instead.
+func (*ReqCard) Descriptor() ([]byte, []int) {
+	return file_common_proto_rawDescGZIP(), []int{17}
+}
+
+func (x *ReqCard) GetColor() int32 {
+	if x != nil {
+		return x.Color
+	}
+	return 0
+}
+
+func (x *ReqCard) GetPoint() int32 {
+	if x != nil {
+		return x.Point
+	}
+	return 0
+}
+
+type ReqPlayer struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Id        string     `protobuf:"bytes,1,opt,name=Id,proto3" json:"Id,omitempty"`
+	HandCards []*ReqCard `protobuf:"bytes,2,rep,name=HandCards,proto3" json:"HandCards,omitempty"`
+	SitPos    int32      `protobuf:"varint,3,opt,name=SitPos,proto3" json:"SitPos,omitempty"`
+	IsDealer  bool       `protobuf:"varint,4,opt,name=IsDealer,proto3" json:"IsDealer,omitempty"`
+}
+
+func (x *ReqPlayer) Reset() {
+	*x = ReqPlayer{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_common_proto_msgTypes[18]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ReqPlayer) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ReqPlayer) ProtoMessage() {}
+
+func (x *ReqPlayer) ProtoReflect() protoreflect.Message {
+	mi := &file_common_proto_msgTypes[18]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ReqPlayer.ProtoReflect.Descriptor instead.
+func (*ReqPlayer) Descriptor() ([]byte, []int) {
+	return file_common_proto_rawDescGZIP(), []int{18}
+}
+
+func (x *ReqPlayer) GetId() string {
+	if x != nil {
+		return x.Id
+	}
+	return ""
+}
+
+func (x *ReqPlayer) GetHandCards() []*ReqCard {
+	if x != nil {
+		return x.HandCards
+	}
+	return nil
+}
+
+func (x *ReqPlayer) GetSitPos() int32 {
+	if x != nil {
+		return x.SitPos
+	}
+	return 0
+}
+
+func (x *ReqPlayer) GetIsDealer() bool {
+	if x != nil {
+		return x.IsDealer
+	}
+	return false
+}
+
+type ReqGameRound struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Rounds []*ReqRound `protobuf:"bytes,1,rep,name=Rounds,proto3" json:"Rounds,omitempty"`
+}
+
+func (x *ReqGameRound) Reset() {
+	*x = ReqGameRound{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_common_proto_msgTypes[19]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ReqGameRound) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ReqGameRound) ProtoMessage() {}
+
+func (x *ReqGameRound) ProtoReflect() protoreflect.Message {
+	mi := &file_common_proto_msgTypes[19]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ReqGameRound.ProtoReflect.Descriptor instead.
+func (*ReqGameRound) Descriptor() ([]byte, []int) {
+	return file_common_proto_rawDescGZIP(), []int{19}
+}
+
+func (x *ReqGameRound) GetRounds() []*ReqRound {
+	if x != nil {
+		return x.Rounds
+	}
+	return nil
+}
+
 type ReqRound struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
@@ -1063,7 +1323,7 @@ type ReqRound struct {
 func (x *ReqRound) Reset() {
 	*x = ReqRound{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_common_proto_msgTypes[16]
+		mi := &file_common_proto_msgTypes[20]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1076,7 +1336,7 @@ func (x *ReqRound) String() string {
 func (*ReqRound) ProtoMessage() {}
 
 func (x *ReqRound) ProtoReflect() protoreflect.Message {
-	mi := &file_common_proto_msgTypes[16]
+	mi := &file_common_proto_msgTypes[20]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1089,7 +1349,7 @@ func (x *ReqRound) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use ReqRound.ProtoReflect.Descriptor instead.
 func (*ReqRound) Descriptor() ([]byte, []int) {
-	return file_common_proto_rawDescGZIP(), []int{16}
+	return file_common_proto_rawDescGZIP(), []int{20}
 }
 
 func (x *ReqRound) GetRound() int32 {
@@ -1133,7 +1393,7 @@ type MsgError struct {
 func (x *MsgError) Reset() {
 	*x = MsgError{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_common_proto_msgTypes[17]
+		mi := &file_common_proto_msgTypes[21]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1146,7 +1406,7 @@ func (x *MsgError) String() string {
 func (*MsgError) ProtoMessage() {}
 
 func (x *MsgError) ProtoReflect() protoreflect.Message {
-	mi := &file_common_proto_msgTypes[17]
+	mi := &file_common_proto_msgTypes[21]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1159,7 +1419,7 @@ func (x *MsgError) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use MsgError.ProtoReflect.Descriptor instead.
 func (*MsgError) Descriptor() ([]byte, []int) {
-	return file_common_proto_rawDescGZIP(), []int{17}
+	return file_common_proto_rawDescGZIP(), []int{21}
 }
 
 func (x *MsgError) GetErrorCode() int32 {
@@ -1187,7 +1447,7 @@ type Hello struct {
 func (x *Hello) Reset() {
 	*x = Hello{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_common_proto_msgTypes[18]
+		mi := &file_common_proto_msgTypes[22]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1200,7 +1460,7 @@ func (x *Hello) String() string {
 func (*Hello) ProtoMessage() {}
 
 func (x *Hello) ProtoReflect() protoreflect.Message {
-	mi := &file_common_proto_msgTypes[18]
+	mi := &file_common_proto_msgTypes[22]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1213,7 +1473,7 @@ func (x *Hello) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use Hello.ProtoReflect.Descriptor instead.
 func (*Hello) Descriptor() ([]byte, []int) {
-	return file_common_proto_rawDescGZIP(), []int{18}
+	return file_common_proto_rawDescGZIP(), []int{22}
 }
 
 func (x *Hello) GetName() string {
@@ -1249,96 +1509,123 @@ var file_common_proto_rawDesc = []byte{
 	0x12, 0x16, 0x0a, 0x06, 0x72, 0x6f, 0x6f, 0x6d, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
 	0x52, 0x06, 0x72, 0x6f, 0x6f, 0x6d, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x67, 0x61, 0x6d, 0x65,
 	0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x67, 0x61, 0x6d, 0x65, 0x49, 0x64,
-	0x22, 0x55, 0x0a, 0x0b, 0x52, 0x65, 0x71, 0x4a, 0x6f, 0x69, 0x6e, 0x52, 0x6f, 0x6f, 0x6d, 0x12,
+	0x22, 0x7b, 0x0a, 0x0b, 0x52, 0x65, 0x71, 0x4a, 0x6f, 0x69, 0x6e, 0x52, 0x6f, 0x6f, 0x6d, 0x12,
 	0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
 	0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x6f, 0x6f, 0x6d, 0x49,
 	0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x6f, 0x6f, 0x6d, 0x49, 0x64, 0x12,
 	0x16, 0x0a, 0x06, 0x67, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52,
-	0x06, 0x67, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x22, 0x22, 0x0a, 0x08, 0x50, 0x6c, 0x61, 0x79, 0x4c,
-	0x69, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x18, 0x01, 0x20,
-	0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0x1e, 0x0a, 0x04, 0x53,
-	0x68, 0x6f, 0x70, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x18, 0x01, 0x20,
-	0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0x25, 0x0a, 0x0b, 0x52,
-	0x65, 0x73, 0x47, 0x61, 0x6d, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x16, 0x0a, 0x06, 0x67, 0x61,
-	0x6d, 0x65, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x67, 0x61, 0x6d, 0x65,
-	0x49, 0x64, 0x22, 0xbf, 0x01, 0x0a, 0x0b, 0x52, 0x65, 0x71, 0x47, 0x61, 0x6d, 0x65, 0x49, 0x6e,
-	0x66, 0x6f, 0x12, 0x16, 0x0a, 0x06, 0x67, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01,
-	0x28, 0x09, 0x52, 0x06, 0x67, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x67, 0x61,
-	0x6d, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x67, 0x61,
-	0x6d, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x67, 0x61, 0x6d, 0x65, 0x53, 0x74,
-	0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x67, 0x61, 0x6d, 0x65,
-	0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x67, 0x61, 0x6d, 0x65, 0x54, 0x79,
-	0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x67, 0x61, 0x6d, 0x65, 0x54, 0x79,
-	0x70, 0x65, 0x12, 0x40, 0x0a, 0x11, 0x74, 0x65, 0x65, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x69, 0x52,
-	0x6f, 0x6f, 0x6d, 0x4c, 0x69, 0x73, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e,
-	0x54, 0x65, 0x65, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x69, 0x52, 0x6f, 0x6f, 0x6d, 0x4c, 0x69, 0x73,
-	0x74, 0x52, 0x11, 0x74, 0x65, 0x65, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x69, 0x52, 0x6f, 0x6f, 0x6d,
-	0x4c, 0x69, 0x73, 0x74, 0x22, 0x49, 0x0a, 0x11, 0x54, 0x65, 0x65, 0x6e, 0x50, 0x61, 0x74, 0x74,
-	0x69, 0x52, 0x6f, 0x6f, 0x6d, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x34, 0x0a, 0x0d, 0x74, 0x65, 0x65,
-	0x6e, 0x50, 0x61, 0x74, 0x74, 0x69, 0x52, 0x6f, 0x6f, 0x6d, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b,
-	0x32, 0x0e, 0x2e, 0x54, 0x65, 0x65, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x69, 0x52, 0x6f, 0x6f, 0x6d,
-	0x52, 0x0d, 0x74, 0x65, 0x65, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x69, 0x52, 0x6f, 0x6f, 0x6d, 0x22,
-	0xeb, 0x01, 0x0a, 0x0d, 0x54, 0x65, 0x65, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x69, 0x52, 0x6f, 0x6f,
-	0x6d, 0x12, 0x12, 0x0a, 0x04, 0x62, 0x6f, 0x6f, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
-	0x04, 0x62, 0x6f, 0x6f, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x69, 0x6e, 0x42, 0x75, 0x79, 0x69,
-	0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x69, 0x6e, 0x42, 0x75, 0x79, 0x69,
-	0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x68, 0x61, 0x61, 0x6c, 0x4c, 0x69, 0x6d, 0x6d, 0x69, 0x74,
-	0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x68, 0x61, 0x61, 0x6c, 0x4c, 0x69, 0x6d,
-	0x6d, 0x69, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x6f, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x18,
-	0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12,
-	0x22, 0x0a, 0x0c, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x18,
-	0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x50, 0x6c, 0x61, 0x79,
-	0x65, 0x72, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x6f, 0x6f, 0x6d, 0x4c, 0x65, 0x76, 0x65, 0x6c,
-	0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x72, 0x6f, 0x6f, 0x6d, 0x4c, 0x65, 0x76, 0x65,
-	0x6c, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x6f, 0x6f, 0x6d, 0x49, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28,
-	0x09, 0x52, 0x06, 0x72, 0x6f, 0x6f, 0x6d, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70,
-	0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x25, 0x0a,
-	0x0b, 0x52, 0x65, 0x71, 0x44, 0x65, 0x61, 0x6c, 0x43, 0x61, 0x72, 0x64, 0x12, 0x16, 0x0a, 0x06,
+	0x06, 0x67, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x08, 0x72, 0x6f, 0x6f, 0x6d, 0x49,
+	0x6e, 0x66, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x52, 0x65, 0x71, 0x52,
+	0x6f, 0x6f, 0x6d, 0x52, 0x08, 0x72, 0x6f, 0x6f, 0x6d, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x22, 0x0a,
+	0x08, 0x50, 0x6c, 0x61, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65,
+	0x72, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49,
+	0x64, 0x22, 0x1e, 0x0a, 0x04, 0x53, 0x68, 0x6f, 0x70, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65,
+	0x72, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49,
+	0x64, 0x22, 0x25, 0x0a, 0x0b, 0x52, 0x65, 0x73, 0x47, 0x61, 0x6d, 0x65, 0x49, 0x6e, 0x66, 0x6f,
+	0x12, 0x16, 0x0a, 0x06, 0x67, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x06, 0x67, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x22, 0xbf, 0x01, 0x0a, 0x0b, 0x52, 0x65, 0x71,
+	0x47, 0x61, 0x6d, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x16, 0x0a, 0x06, 0x67, 0x61, 0x6d, 0x65,
+	0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x67, 0x61, 0x6d, 0x65, 0x49, 0x64,
+	0x12, 0x1a, 0x0a, 0x08, 0x67, 0x61, 0x6d, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x08, 0x67, 0x61, 0x6d, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a,
+	0x67, 0x61, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x0a, 0x67, 0x61, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1a, 0x0a, 0x08,
+	0x67, 0x61, 0x6d, 0x65, 0x54, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08,
+	0x67, 0x61, 0x6d, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x40, 0x0a, 0x11, 0x74, 0x65, 0x65, 0x6e,
+	0x50, 0x61, 0x74, 0x74, 0x69, 0x52, 0x6f, 0x6f, 0x6d, 0x4c, 0x69, 0x73, 0x74, 0x18, 0x06, 0x20,
+	0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x54, 0x65, 0x65, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x69, 0x52,
+	0x6f, 0x6f, 0x6d, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x11, 0x74, 0x65, 0x65, 0x6e, 0x50, 0x61, 0x74,
+	0x74, 0x69, 0x52, 0x6f, 0x6f, 0x6d, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x49, 0x0a, 0x11, 0x54, 0x65,
+	0x65, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x69, 0x52, 0x6f, 0x6f, 0x6d, 0x4c, 0x69, 0x73, 0x74, 0x12,
+	0x34, 0x0a, 0x0d, 0x74, 0x65, 0x65, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x69, 0x52, 0x6f, 0x6f, 0x6d,
+	0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x54, 0x65, 0x65, 0x6e, 0x50, 0x61, 0x74,
+	0x74, 0x69, 0x52, 0x6f, 0x6f, 0x6d, 0x52, 0x0d, 0x74, 0x65, 0x65, 0x6e, 0x50, 0x61, 0x74, 0x74,
+	0x69, 0x52, 0x6f, 0x6f, 0x6d, 0x22, 0xeb, 0x01, 0x0a, 0x0d, 0x54, 0x65, 0x65, 0x6e, 0x50, 0x61,
+	0x74, 0x74, 0x69, 0x52, 0x6f, 0x6f, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x62, 0x6f, 0x6f, 0x74, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x62, 0x6f, 0x6f, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6d,
+	0x69, 0x6e, 0x42, 0x75, 0x79, 0x69, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d,
+	0x69, 0x6e, 0x42, 0x75, 0x79, 0x69, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x68, 0x61, 0x61, 0x6c,
+	0x4c, 0x69, 0x6d, 0x6d, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x68,
+	0x61, 0x61, 0x6c, 0x4c, 0x69, 0x6d, 0x6d, 0x69, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x6f, 0x74,
+	0x4c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x74,
+	0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x50, 0x6c,
+	0x61, 0x79, 0x65, 0x72, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x6f, 0x74,
+	0x61, 0x6c, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x6f, 0x6f,
+	0x6d, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x72, 0x6f,
+	0x6f, 0x6d, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x6f, 0x6f, 0x6d, 0x49,
+	0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x6f, 0x6f, 0x6d, 0x49, 0x64, 0x12,
+	0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74,
+	0x79, 0x70, 0x65, 0x22, 0x25, 0x0a, 0x0b, 0x52, 0x65, 0x71, 0x44, 0x65, 0x61, 0x6c, 0x43, 0x61,
+	0x72, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x69, 0x74, 0x50, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x01,
+	0x28, 0x05, 0x52, 0x06, 0x73, 0x69, 0x74, 0x50, 0x6f, 0x73, 0x22, 0x29, 0x0a, 0x0f, 0x52, 0x65,
+	0x71, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a,
+	0x06, 0x73, 0x69, 0x74, 0x50, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x73,
+	0x69, 0x74, 0x50, 0x6f, 0x73, 0x22, 0x9e, 0x01, 0x0a, 0x12, 0x52, 0x65, 0x73, 0x50, 0x6c, 0x61,
+	0x79, 0x65, 0x72, 0x4f, 0x70, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06,
 	0x73, 0x69, 0x74, 0x50, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x73, 0x69,
-	0x74, 0x50, 0x6f, 0x73, 0x22, 0x29, 0x0a, 0x0f, 0x52, 0x65, 0x71, 0x50, 0x6c, 0x61, 0x79, 0x65,
-	0x72, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x69, 0x74, 0x50, 0x6f,
-	0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x73, 0x69, 0x74, 0x50, 0x6f, 0x73, 0x22,
-	0x9e, 0x01, 0x0a, 0x12, 0x52, 0x65, 0x73, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x4f, 0x70, 0x74,
-	0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x69, 0x74, 0x50, 0x6f, 0x73,
-	0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x73, 0x69, 0x74, 0x50, 0x6f, 0x73, 0x12, 0x28,
-	0x0a, 0x09, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x4f, 0x70, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28,
-	0x0b, 0x32, 0x0a, 0x2e, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x4f, 0x70, 0x74, 0x52, 0x09, 0x70,
-	0x6c, 0x61, 0x79, 0x65, 0x72, 0x4f, 0x70, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x6f, 0x6f, 0x6d,
-	0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x6f, 0x6f, 0x6d, 0x49, 0x64,
-	0x12, 0x16, 0x0a, 0x06, 0x67, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09,
-	0x52, 0x06, 0x67, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72,
-	0x49, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64,
-	0x22, 0x73, 0x0a, 0x09, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x4f, 0x70, 0x74, 0x12, 0x29, 0x0a,
-	0x08, 0x6f, 0x70, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32,
-	0x0e, 0x2e, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x4f, 0x70, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52,
-	0x07, 0x6f, 0x70, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x62, 0x65, 0x74, 0x5f,
-	0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x62, 0x65,
-	0x74, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73,
-	0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65,
-	0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x84, 0x01, 0x0a, 0x08, 0x52, 0x65, 0x71, 0x52, 0x6f, 0x75,
-	0x6e, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28,
-	0x05, 0x52, 0x05, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x6f, 0x75, 0x6e,
-	0x64, 0x53, 0x69, 0x74, 0x50, 0x6f, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x72,
-	0x6f, 0x75, 0x6e, 0x64, 0x53, 0x69, 0x74, 0x50, 0x6f, 0x73, 0x12, 0x28, 0x0a, 0x09, 0x70, 0x6c,
-	0x61, 0x79, 0x65, 0x72, 0x4f, 0x70, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e,
-	0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x4f, 0x70, 0x74, 0x52, 0x09, 0x70, 0x6c, 0x61, 0x79, 0x65,
-	0x72, 0x4f, 0x70, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x18, 0x04,
-	0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0x46, 0x0a, 0x08,
-	0x4d, 0x73, 0x67, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x72, 0x72, 0x6f,
-	0x72, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x65, 0x72,
-	0x72, 0x6f, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x65, 0x72, 0x72, 0x6f, 0x72,
-	0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x72, 0x72, 0x6f,
-	0x72, 0x4d, 0x73, 0x67, 0x22, 0x1b, 0x0a, 0x05, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x12, 0x12, 0x0a,
-	0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d,
-	0x65, 0x2a, 0x7c, 0x0a, 0x0d, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x4f, 0x70, 0x74, 0x54, 0x79,
-	0x70, 0x65, 0x12, 0x0c, 0x0a, 0x08, 0x4f, 0x50, 0x54, 0x5f, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00,
-	0x12, 0x11, 0x0a, 0x0d, 0x4f, 0x50, 0x54, 0x5f, 0x4c, 0x4f, 0x4f, 0x4b, 0x5f, 0x43, 0x41, 0x52,
-	0x44, 0x10, 0x01, 0x12, 0x0f, 0x0a, 0x0b, 0x4f, 0x50, 0x54, 0x5f, 0x44, 0x49, 0x53, 0x43, 0x41,
-	0x52, 0x44, 0x10, 0x02, 0x12, 0x0c, 0x0a, 0x08, 0x4f, 0x50, 0x54, 0x5f, 0x43, 0x41, 0x4c, 0x4c,
-	0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x4f, 0x50, 0x54, 0x5f, 0x52, 0x41, 0x49, 0x53, 0x45, 0x10,
-	0x04, 0x12, 0x0e, 0x0a, 0x0a, 0x4f, 0x50, 0x54, 0x5f, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, 0x10,
-	0x05, 0x12, 0x0c, 0x0a, 0x08, 0x4f, 0x50, 0x54, 0x5f, 0x46, 0x4f, 0x4c, 0x44, 0x10, 0x06, 0x42,
-	0x07, 0x5a, 0x05, 0x2e, 0x2f, 0x6d, 0x73, 0x67, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0x74, 0x50, 0x6f, 0x73, 0x12, 0x28, 0x0a, 0x09, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x4f, 0x70,
+	0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72,
+	0x4f, 0x70, 0x74, 0x52, 0x09, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x4f, 0x70, 0x74, 0x12, 0x16,
+	0x0a, 0x06, 0x72, 0x6f, 0x6f, 0x6d, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06,
+	0x72, 0x6f, 0x6f, 0x6d, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x67, 0x61, 0x6d, 0x65, 0x49, 0x64,
+	0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x67, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x16,
+	0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06,
+	0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0x73, 0x0a, 0x09, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72,
+	0x4f, 0x70, 0x74, 0x12, 0x29, 0x0a, 0x08, 0x6f, 0x70, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0e, 0x2e, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x4f, 0x70,
+	0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1d,
+	0x0a, 0x0a, 0x62, 0x65, 0x74, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01,
+	0x28, 0x05, 0x52, 0x09, 0x62, 0x65, 0x74, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1c, 0x0a,
+	0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03,
+	0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x9e, 0x01, 0x0a, 0x07,
+	0x52, 0x65, 0x71, 0x52, 0x6f, 0x6f, 0x6d, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x64, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x64, 0x12, 0x28, 0x0a, 0x09, 0x52, 0x65, 0x71, 0x50, 0x6c,
+	0x61, 0x79, 0x65, 0x72, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x52, 0x65, 0x71,
+	0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x52, 0x09, 0x52, 0x65, 0x71, 0x50, 0x6c, 0x61, 0x79, 0x65,
+	0x72, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28,
+	0x05, 0x52, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x52, 0x6f, 0x75,
+	0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x12,
+	0x2b, 0x0a, 0x09, 0x47, 0x61, 0x6d, 0x65, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x05, 0x20, 0x01,
+	0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x52, 0x65, 0x71, 0x47, 0x61, 0x6d, 0x65, 0x52, 0x6f, 0x75, 0x6e,
+	0x64, 0x52, 0x09, 0x47, 0x61, 0x6d, 0x65, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x22, 0x35, 0x0a, 0x07,
+	0x52, 0x65, 0x71, 0x43, 0x61, 0x72, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x43, 0x6f, 0x6c, 0x6f, 0x72,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x12, 0x14, 0x0a,
+	0x05, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x50, 0x6f,
+	0x69, 0x6e, 0x74, 0x22, 0x77, 0x0a, 0x09, 0x52, 0x65, 0x71, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72,
+	0x12, 0x0e, 0x0a, 0x02, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x64,
+	0x12, 0x26, 0x0a, 0x09, 0x48, 0x61, 0x6e, 0x64, 0x43, 0x61, 0x72, 0x64, 0x73, 0x18, 0x02, 0x20,
+	0x03, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x52, 0x65, 0x71, 0x43, 0x61, 0x72, 0x64, 0x52, 0x09, 0x48,
+	0x61, 0x6e, 0x64, 0x43, 0x61, 0x72, 0x64, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x69, 0x74, 0x50,
+	0x6f, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x53, 0x69, 0x74, 0x50, 0x6f, 0x73,
+	0x12, 0x1a, 0x0a, 0x08, 0x49, 0x73, 0x44, 0x65, 0x61, 0x6c, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01,
+	0x28, 0x08, 0x52, 0x08, 0x49, 0x73, 0x44, 0x65, 0x61, 0x6c, 0x65, 0x72, 0x22, 0x31, 0x0a, 0x0c,
+	0x52, 0x65, 0x71, 0x47, 0x61, 0x6d, 0x65, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x21, 0x0a, 0x06,
+	0x52, 0x6f, 0x75, 0x6e, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x09, 0x2e, 0x52,
+	0x65, 0x71, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x06, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x73, 0x22,
+	0x84, 0x01, 0x0a, 0x08, 0x52, 0x65, 0x71, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x14, 0x0a, 0x05,
+	0x72, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x72, 0x6f, 0x75,
+	0x6e, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x53, 0x69, 0x74, 0x50, 0x6f,
+	0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x53, 0x69,
+	0x74, 0x50, 0x6f, 0x73, 0x12, 0x28, 0x0a, 0x09, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x4f, 0x70,
+	0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72,
+	0x4f, 0x70, 0x74, 0x52, 0x09, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x4f, 0x70, 0x74, 0x12, 0x16,
+	0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06,
+	0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0x46, 0x0a, 0x08, 0x4d, 0x73, 0x67, 0x45, 0x72, 0x72,
+	0x6f, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x63, 0x6f, 0x64, 0x65,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x43, 0x6f, 0x64,
+	0x65, 0x12, 0x1b, 0x0a, 0x09, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x73, 0x67, 0x22, 0x1b,
+	0x0a, 0x05, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x2a, 0x7c, 0x0a, 0x0d, 0x50,
+	0x6c, 0x61, 0x79, 0x65, 0x72, 0x4f, 0x70, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0c, 0x0a, 0x08,
+	0x4f, 0x50, 0x54, 0x5f, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x11, 0x0a, 0x0d, 0x4f, 0x50,
+	0x54, 0x5f, 0x4c, 0x4f, 0x4f, 0x4b, 0x5f, 0x43, 0x41, 0x52, 0x44, 0x10, 0x01, 0x12, 0x0f, 0x0a,
+	0x0b, 0x4f, 0x50, 0x54, 0x5f, 0x44, 0x49, 0x53, 0x43, 0x41, 0x52, 0x44, 0x10, 0x02, 0x12, 0x0c,
+	0x0a, 0x08, 0x4f, 0x50, 0x54, 0x5f, 0x43, 0x41, 0x4c, 0x4c, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09,
+	0x4f, 0x50, 0x54, 0x5f, 0x52, 0x41, 0x49, 0x53, 0x45, 0x10, 0x04, 0x12, 0x0e, 0x0a, 0x0a, 0x4f,
+	0x50, 0x54, 0x5f, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x4f,
+	0x50, 0x54, 0x5f, 0x46, 0x4f, 0x4c, 0x44, 0x10, 0x06, 0x42, 0x07, 0x5a, 0x05, 0x2e, 0x2f, 0x6d,
+	0x73, 0x67, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
@@ -1354,7 +1641,7 @@ func file_common_proto_rawDescGZIP() []byte {
 }
 
 var file_common_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
-var file_common_proto_msgTypes = make([]protoimpl.MessageInfo, 19)
+var file_common_proto_msgTypes = make([]protoimpl.MessageInfo, 23)
 var file_common_proto_goTypes = []interface{}{
 	(PlayerOptType)(0),         // 0: PlayerOptType
 	(*ResLogin)(nil),           // 1: ResLogin
@@ -1373,22 +1660,31 @@ var file_common_proto_goTypes = []interface{}{
 	(*ReqPlayerAction)(nil),    // 14: ReqPlayerAction
 	(*ResPlayerOptAction)(nil), // 15: ResPlayerOptAction
 	(*PlayerOpt)(nil),          // 16: PlayerOpt
-	(*ReqRound)(nil),           // 17: ReqRound
-	(*MsgError)(nil),           // 18: MsgError
-	(*Hello)(nil),              // 19: Hello
+	(*ReqRoom)(nil),            // 17: ReqRoom
+	(*ReqCard)(nil),            // 18: ReqCard
+	(*ReqPlayer)(nil),          // 19: ReqPlayer
+	(*ReqGameRound)(nil),       // 20: ReqGameRound
+	(*ReqRound)(nil),           // 21: ReqRound
+	(*MsgError)(nil),           // 22: MsgError
+	(*Hello)(nil),              // 23: Hello
 }
 var file_common_proto_depIdxs = []int32{
-	18, // 0: ReqLogin.error:type_name -> MsgError
-	11, // 1: ReqGameInfo.teenPattiRoomList:type_name -> TeenPattiRoomList
-	12, // 2: TeenPattiRoomList.teenPattiRoom:type_name -> TeenPattiRoom
-	16, // 3: ResPlayerOptAction.playerOpt:type_name -> PlayerOpt
-	0,  // 4: PlayerOpt.opt_type:type_name -> PlayerOptType
-	16, // 5: ReqRound.playerOpt:type_name -> PlayerOpt
-	6,  // [6:6] is the sub-list for method output_type
-	6,  // [6:6] is the sub-list for method input_type
-	6,  // [6:6] is the sub-list for extension type_name
-	6,  // [6:6] is the sub-list for extension extendee
-	0,  // [0:6] is the sub-list for field type_name
+	22, // 0: ReqLogin.error:type_name -> MsgError
+	17, // 1: ReqJoinRoom.roomInfo:type_name -> ReqRoom
+	11, // 2: ReqGameInfo.teenPattiRoomList:type_name -> TeenPattiRoomList
+	12, // 3: TeenPattiRoomList.teenPattiRoom:type_name -> TeenPattiRoom
+	16, // 4: ResPlayerOptAction.playerOpt:type_name -> PlayerOpt
+	0,  // 5: PlayerOpt.opt_type:type_name -> PlayerOptType
+	19, // 6: ReqRoom.ReqPlayer:type_name -> ReqPlayer
+	20, // 7: ReqRoom.GameRound:type_name -> ReqGameRound
+	18, // 8: ReqPlayer.HandCards:type_name -> ReqCard
+	21, // 9: ReqGameRound.Rounds:type_name -> ReqRound
+	16, // 10: ReqRound.playerOpt:type_name -> PlayerOpt
+	11, // [11:11] is the sub-list for method output_type
+	11, // [11:11] is the sub-list for method input_type
+	11, // [11:11] is the sub-list for extension type_name
+	11, // [11:11] is the sub-list for extension extendee
+	0,  // [0:11] is the sub-list for field type_name
 }
 
 func init() { file_common_proto_init() }
@@ -1590,7 +1886,7 @@ func file_common_proto_init() {
 			}
 		}
 		file_common_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*ReqRound); i {
+			switch v := v.(*ReqRoom); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -1602,7 +1898,7 @@ func file_common_proto_init() {
 			}
 		}
 		file_common_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*MsgError); i {
+			switch v := v.(*ReqCard); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -1614,6 +1910,54 @@ func file_common_proto_init() {
 			}
 		}
 		file_common_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ReqPlayer); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_common_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ReqGameRound); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_common_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ReqRound); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_common_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*MsgError); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_common_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Hello); i {
 			case 0:
 				return &v.state
@@ -1632,7 +1976,7 @@ func file_common_proto_init() {
 			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
 			RawDescriptor: file_common_proto_rawDesc,
 			NumEnums:      1,
-			NumMessages:   19,
+			NumMessages:   23,
 			NumExtensions: 0,
 			NumServices:   0,
 		},