syntax = "proto3";

package BBMessage;
option go_package = "./;message";

// 通用操作结果码
enum GameStatus {
    GAME_STATUS_OK = 0;
    GAME_STATUS_PLAYER_NIL = 1001; // 玩家不存在
    GAME_STATUS_UID_PASSWD_NIL = 1002; // 账号或密码不能为空
    GAME_STATUS_UID_ERROR = 1003; // 账号不存在
    GAME_STATUS_PASSWD_ERROR = 1004; // 密码错误
    GAME_STATUS_ROOM_NOT_EXIT = 1005; // 房间不存在
    GAME_STATUS_PB_ERR = 1006;//协议解析报错
    GAME_STATUS_INNER_ERR = 1007; // 服务器内部错误


    GAME_STATUS_LOGIN_CHECK_ERR = 1055; // 登录校验失败
    Player_Status_0=11;//表示玩家在大厅，
    Player_Status_1=1;//表示玩家开始匹配，
    Player_Status_2=2;//玩家进入游戏房间，
    Player_Status_3=3;//ready，玩家落座开始游戏
    Player_Status_4=4;//play，
    Player_Status_5=5;//胜利后观战，
    Player_Status_6=6;//胜利后离开，
    Player_Status_7=7;//组队逃跑，
    Player_Status_8=8;//逃跑，
    Player_Status_9=9;//托管，
    Player_Status_10=10;//观战玩家，
    //GAME_STATUS_LOGIN_CHECK_ERR = 1055; // 登录校验失败

}

// 心跳包C->S, Cmd.MSGID_Heartbeat_Push(心跳包需要保持，不然玩家会被踢下线）
message HeartbeatPush {

}

// 登录请求 C->S, Cmd.MSGID_Login
message LoginReq {
    string uid = 1;//账号ID
    string passWd = 2;//密码
}

// 登录响应 S->C, Cmd.MSGID_Login
message LoginRsp {
    uint32 result = 1;//结果
    int64 playerId = 2;//玩家ID
    bool isNew = 3;//是否为新玩家
}

message CreateGameReq {
    uint32 mode = 1;//游戏模式，1是经典，2是匹配
    uint32 playerNum  = 2;//选择玩家人数  2是两个人，4是四个人
    uint32 admissionFee  = 3;//入场金额   500、1000、2000、5000、10000、20000
    bool isRoom  = 4;//是否房间内建房
    string uid  = 5;//玩家id
    string name  = 6;//玩家名称
    string headImg  = 7;//玩家头像
    optional uint32 money  = 8;//玩家金币
     optional uint32 chatRoomId  = 9;//语聊房id

}
message CreateGameRsp {
    optional uint32 roomId =1; //房间id
    string uid =2; //用户id
    string name  = 3;//玩家名称
    string headImg  = 4;//玩家头像
    optional uint32 money  = 5;//玩家金币
}
message RoomInfoRsp {
    optional uint32 result = 1;//结果
    repeated  uint32 money=2;
    repeated string playerID =3;
    repeated string nick=4; //昵称
    repeated string headUrl =5; //头像
     repeated uint32 seatId =9; //头像
    uint32 mode = 6;//游戏模式，1是经典，2是匹配
    uint32 playerNum  = 7;//选择玩家人数  2是两个人，4是四个人
    uint32 admissionFee  = 8;//入场金额   500、1000、2000、5000、10000、20000
     

}

message JoinRoomReq {
     string uid = 1;//uID
    string name  = 2;//玩家名称
    string headImg  = 3;//玩家头像
    optional uint32 money  = 4;//玩家金币
    optional uint32 roomId  = 5;//房间id
    bool restartBtn  = 6;//是否是restart点击
}

message RoomKickUserReq {
    string uid = 1;//uID

}
message RoomKickUserRsp {
    string uid = 1;//uID
    string name  = 2;//玩家名称
}
message RoomQuitUserReq {
    string uid = 1;//uID

}

message RoomInviteReq {
    string uid = 1;//邀请的玩家id
    optional uint32 chatRoomId = 2;//语聊房id
    optional uint32 roomId = 3;//游戏房间id
}
message RoomInviteRsp {
   optional uint32 result = 1;//结果

}
message RoomQuitUserRsp {
    string uid = 1;//uID
    string name  = 2;//玩家名称
}
message JoinRoomInfoRsp {
    optional uint32 result = 1;//结果
    string money=2;
    string playerID =3;
    uint32 playerStatus=4;  // 玩家的当前状态, 0、1 表示空位无玩家，2: sitdown, 3: ready, 4: play, 5: 胜利后观战, 6: 胜利后离开，7: 组队逃跑，8: 逃跑
    uint32 tableID=5; // 桌子ID
    optional uint32 seatID=6; //座位号
    string nick=7; //昵称
    string headUrl =8; //头像
    string gender =9; //性别
    optional uint32 playerNum=10;  // 玩家数量
    uint32 playerType=11;  // 玩家类型1是正常玩家2是机器人
}

message RoomInfoReq {
 optional uint32 roomId = 1;//房间id
  string uid = 2;//玩家id
}

message CancelMatchReq {

}
message CancelMatchRsp {
    optional uint32 result = 1;//结果0表示成功，其他表示失败
    string uid = 2;//用户id
}

message MatchRsp {
    optional uint32 result = 1;//结果  0表示成功，其他表示失败
}
message MatchJoinUserRsp {
    optional uint32 result = 1;//结果
    string playerID =2;
    string nick=3; //昵称
    string headUrl =4; //头像
    string gender =5; //性别
    uint32 playerNum=6;  // 玩家数量
}


message RoomStartGameReq {

}
message RoomStartGameRsp {

}

//获取玩家数据
message GetUserInfoReq {
    string uid = 1;//账号ID
    uint32 roomId  = 2;//房间ID
}
//获取玩家数据
message KickUserReq {
    string uid = 1;//账号ID
}
message GetUserInfoRsp {
    optional uint32 result = 1;//结果
    repeated string money=2;
    repeated string playerID =3;
    repeated uint32 playerStatus=4;  // 玩家的当前状态, 0、1 表示空位无玩家，2: sitdown, 3: ready, 4: play, 5: 胜利后观战, 6: 胜利后离开，7: 组队逃跑，8: 逃跑

    repeated uint32 tableID=5; // 桌子ID
    repeated uint32 seatID=6; //座位号
    repeated string nick=7; //昵称
    repeated string headUrl =8; //头像
    repeated string gender =9; //性别
    uint32 playerNum=10;  // 玩家数量
    repeated uint32 playerType=11;  // 玩家类型1是正常玩家2是机器人
    optional uint32 selfSeatId=12;  // 玩家座位号
    optional uint32 watchingPlayers=13;  // 观战玩家数量
     optional uint32 countdown=14;  // 游戏结束倒计时
 uint32 gameType=15;  // 游戏类型，1经典，2匹配
}

message TKickEventRsp {
    optional uint32 PlayerNum=1; // 被踢玩家数
    repeated KickPlayerRsp kickPlayer=2;
}

message KickPlayerRsp {
    optional uint32 seatId=1; // 被踢玩家
    optional uint32 planeNum=2; // 被踢飞机数
    string planeID=3; // 飞机ID
}
message FinishEventRsp {
    optional uint32 seatId=1; // 到达玩家
    string planeId=2;// 飞机ID
}
message PlayerRsp {
    optional uint32 seatId=1; // 到达玩家
    repeated PlaneRsp planes=2;// 飞机
}
message PlaneRsp {
    string planeId=1;// 飞机ID
    optional uint32 currentIndex=2; // 飞机下标
    optional uint32 planeStatus=3; // 0是未起飞，1是移动中，2是到达终点
}
message RoomDjsRsp {
    optional uint32 time=1;// 倒计时时间    
}

//加入房间通知其他玩家
message RoomJoinUserRsp {
    optional uint32 result = 1;//结果
     string money=2;
     string playerID =3;
     uint32 playerStatus=4;  // 玩家的当前状态, 0、1 表示空位无玩家，2: sitdown, 3: ready, 4: play, 5: 胜利后观战, 6: 胜利后离开，7: 组队逃跑，8: 逃跑
     uint32 tableID=5; // 桌子ID
     uint32 seatID=6; //座位号
     string nick=7; //昵称
     string headUrl =8; //头像
     string gender =9; //性别
    uint32 playerNum=10;  // 玩家数量
    uint32 playerType=11;  // 玩家类型1是正常玩家2是机器人
}

//1，通知开始掷子并且开始倒计时
message GameStartRsp {
    optional uint32 result = 1;//结果
    optional uint32 seatID = 2;//掷子玩家座位号
    optional uint32 castSecond = 3;//结果
}


 //  2，客户端请求掷子，空消息
message ThrowTheDiceReq {
}
//3，通知掷子结果
message ThrowTheDiceRsp {
    optional uint32 result = 1;//结果 0表示成功，其他表示失败
    optional uint32 seatID = 2;//座位id
    uint32 point = 3;//掷子点数
    optional uint32 skipReason = 4;//玩家是否可以行棋，不为0表示不能行棋
    optional uint32 nextTurn=5;//玩家不能行走时下一玩家
    optional uint32 autoMove=6;//1代表正常 2自动骰子 3自动起飞，4自动行走
    repeated PlayerRsp players=7;
}
//4，客户端请求起飞
message PlaneStartReq {
    string planeID = 1;//飞机id，从0开始
}
//5，通知起飞结果
message PlaneStartRsp {
    optional uint32 result = 1;//结果
    optional uint32 seatID = 2;//起飞玩家座位id
    string planeID = 3;//起飞飞机ID
    optional uint32 nextTurn = 4;//下一个玩家座位id
    uint32 playerNum=5;//玩家数
    repeated PlayerRsp players=6;
}
  //  6，客户端请求行走
message MoveReq {
    string planeID = 1;//飞机id，从0开始
}
//7，通知移动结果
message MoveRsp {
    optional uint32 result = 1;//0表示成功，其他表示失败
    optional uint32 seatID = 2;//起飞玩家座位id
    string planeID = 3;//行走飞机ID
    optional uint32 step = 4;//行走的步数
    optional uint32 curPosIndex=5;// 棋子当前相对于行走路线的索引
    optional uint32 nextTurn = 6;//下一个玩家
    optional uint32 hasWin = 7;//玩家是否已经获胜，1表示已经获胜，0表示还没有获胜
    uint32 playerNum=8;//玩家数
    FinishEventRsp finishEvent=9;
    TKickEventRsp tKickEvent=10;
    repeated PlayerRsp players=11;
}




//9，客户端请求托管
message TrusteeshipReq {
    bool trust = 1;//true表示托管，2表示不托管
}
//8，通知玩家托管
message TrusteeshipRsp {
    bool trust = 1;//true表示托管，false表示不托管
    optional uint32 seatID = 2;//座位id
}


//退出游戏请求
message QuitReq {

}
//通知玩家退出游戏,直接剔除这个玩家
message QuitRsp {
    uint32 playerStatus=1;  // 玩家的当前状态, 0、1 表示空位无玩家，2: sitdown, 3: ready, 4: play, 5: 胜利后观战, 6: 胜利后离开，7: 组队逃跑，8: 逃跑 10,观战玩家
    optional uint32 seatID=2; //座位号
    optional uint32 nextTurn=3; //下一个座位号
    string uid =4; //用户id
}

//通知玩家游戏结束
message EndGameRsp {
    repeated uint32 seatID =1; //座位号
    repeated string playerStatus =2; //玩家状态
    repeated uint32 kick =3; //- 玩家当局撞棋数量
    repeated uint32 beKick =4; //- 玩家当局被撞棋数量
    repeated uint32 money =5; //- 胜方当局赢得金额
}

//拉房失败解散游戏
message DissolveTheGameReq {

}

//拉房失败解散游戏
message DissolveTheGameRsp {

}

//pb解析失败
message PbErrorRsp {
    string messageData =1; //错误信息
}

////////////////////////////房间消息//////////////////////////////
// 拉取房间列表 C->S, Cmd.MSGID_Get_Room_List
message GetRoomListReq {
}

// 拉取房间列表 S->C, Cmd.MSGID_Get_Room_List
message GetRoomListRsp {
    uint32 result = 1;			//结果
}




// 踢人原因
enum KickReason {
    KICK_REASON_UNKNOWN = 0;
    KICK_REASON_LOGIN_ELSEWHERE = 1;
    KICK_REASON_HEARTBEAT_TIMEOUT = 2;
    KICK_REASON_NOT_LOGIN = 3;
}

// 踢人通知 S->C, Cmd.MSGID_Kick_Notify
message KickNotify {
    uint32 reason = 1;
}
//退出客户端房主变更
message RoomChangeOfHomeownerRsp {
  string uid = 1;//玩家ID
}
message GetUserMoneyReq {
  string uid = 1;//玩家ID
}
message GetUserMoneyRsp {
  optional uint32 money = 1;//玩家金币
}

message DiscReq {
  string uid = 1;//玩家ID
    uint32 roomId  = 2;//房间ID
}

message RoomQuitReq {
 
}

message RoomRestartReq {
 
}
message SendMsgReq{
    string data = 1;//消息数据
}
message SendMsgRsp{
    string data = 1;//消息数据
    string uid = 2;//消息数据
}