重写消息

This commit is contained in:
liuxiaobo 2025-06-08 22:29:01 +08:00
parent 0cd61a60c2
commit 758af0443f
8 changed files with 3223 additions and 3712 deletions

View File

@ -24,26 +24,12 @@ type ColorRoomConfig struct {
JpYRate int `json:"jp_y_rate"` // jp池追加比例
JpXYRate int `json:"jp_xy_rate"` // 系统池为正时jackpot追加比例
AreaBetLimit int64 `json:"area_bet_limit"` // 下注区域自己的下注限制
NoBetCountMax int `json:"no_bet_count_max"` // 未操作回合踢出房间
BetList [][]int64 `json:"bet_list"` // 筹码
BetLevel []int64 `json:"bet_level"` // 筹码等级
OneCreateMin int32 `json:"one_create_min"` // 一次创建机器最少数
OneCreateMax int32 `json:"one_create_max"` // 一次创建机器人最大数
UserAddRobotNum int32 `json:"user_add_robot_num"` // 真人+机器人最小数
UserAddRobotNumMax int32 `json:"user_add_robot_num_max"` // 真人+机器人最大数
OneDeleteNum int32 `json:"one_delete_num"` // 一次删除机器人数量
BalanceMin int64 `json:"balance_min"` // 机器人生成最小金币
BalanceMax int64 `json:"balance_max"` // 机器人生成最大金币
BalanceMinDelete int64 `json:"balance_min_delete"` // 机器人低于多少金币删除
RobotCreateTime int32 `json:"robot_create_time"` // 多少时间创建机器人
RobotDeleteTime int32 `json:"robot_delete_time"` // 多少时间删除机器人
RobotBetNumMin int32 `json:"robot_bet_num_min"` // 机器人每轮下注最少次数
RobotBetNumMax int32 `json:"robot_bet_num_max"` // 机器人每轮下注最大次数
OpenRobot bool `json:"open_robot"` // 机器人开关
BetMap map[int64][]int32
TotalBetLimit int64 `json:"total_bet_limit"`
AreaBetLimit int64 `json:"area_bet_limit"` // 下注区域自己的下注限制
NoBetCountMax int `json:"no_bet_count_max"` // 未操作回合踢出房间
BetList [][]int64 `json:"bet_list"` // 筹码
BetLevel []int64 `json:"bet_level"` // 筹码等级
BetMap map[int64][]int32
TotalBetLimit int64 `json:"total_bet_limit"`
}
type ColorGameTiming struct {

View File

@ -2,579 +2,270 @@ syntax = "proto3";
package pb;
option go_package = "common/proto/pb";
import "code.proto";
//
enum ColorPrizeArea
{
CPA_Single_0 = 0; //
CPA_Single_1 = 1; //
CPA_Single_2 = 2; //
CPA_Double = 3; //
CPA_Three = 4; //
}
//
message ColorPrizeAreaRange
{
ColorPrizeArea pos = 1; // 0-2
int64 minMul = 2;
int64 maxMul = 3;
}
// color玩法配置信息
message ColorRoomInfo
message ColorRoomConfig
{
repeated int64 betList = 3; //
repeated ColorPrizeAreaRange mulRangeConfig = 5; //
}
//
enum ColorPinoyLiveDiceColorType {
ColorPinoyLiveType_Void = 0;
ColorPinoyLiveType_YELLOW = 1; //
ColorPinoyLiveType_WHITE = 2; //
ColorPinoyLiveType_PINK = 3; //
ColorPinoyLiveType_BLUE = 4; //
ColorPinoyLiveType_RED = 5; //
ColorPinoyLiveType_GREEN = 6; //绿
enum ColorType
{
CT_Yellow = 0; //
CT_White = 1; //
CT_Pink = 2; //
CT_Blue = 3; //
CT_Red = 4; //
CT_Green = 5; // 绿
}
// jackpot版本的押注类型
enum ColorPinoyLiveBetTypeJP {
CLJ_Yellow = 0; //
CLJ_White = 1; //
CLJ_Pink = 2; //
CLJ_Blue = 3; //
CLJ_Red = 4; //
CLJ_Green = 5; // 绿
//
enum ColorBetArea
{
CBA_Yellow = 0; //
CBA_White = 1; //
CBA_Pink = 2; //
CBA_Blue = 3; //
CBA_Red = 4; //
CBA_Green = 5; // 绿
CLJ_Double_Yellow = 6; //
CLJ_Double_White = 7; //
CLJ_Double_Pink = 8; //
CLJ_Double_Blue = 9; //
CLJ_Double_Red = 10; //
CLJ_Double_Green = 11; // 绿
CBA_Yellow2 = 6; //
CBA_White2 = 7; //
CBA_Pink2 = 8; //
CBA_Blue2 = 9; //
CBA_Red2 = 10; //
CBA_Green2 = 11; // 绿
CLJ_Three_Yellow = 12; //
CLJ_Three_White = 13; //
CLJ_Three_Pink = 14; //
CLJ_Three_Blue = 15; //
CLJ_Three_Red = 16; //
CLJ_Three_Green = 17; // 绿
CBA_Yellow3 = 12; //
CBA_White3 = 13; //
CBA_Pink3 = 14; //
CBA_Blue3 = 15; //
CBA_Red3 = 16; //
CBA_Green3 = 17; // 绿
}
//
enum ColorPinoyLiveGameStatus{
ColorPinoyLiveStartUnReady = 0;
ColorPinoyLiveStartReady = 1; //321
ColorPinoyLiveStartMovie = 2; //
ColorPinoyLiveBetStatus = 3; //
ColorPinoyLiveEndBetMovie = 4; //
// ColorPinoyLiveOpenLuckyDice = 5; //lucky dice
ColorPinoyLiveOpenThreeDice = 6; //3 dice
ColorPinoyLiveSettleStatus = 7; //
ColorPinoyLiveRankStatus = 8; //
enum ColorGameStatus
{
CGS_WaitStart = 0; //
CGS_Start = 1; //
CGS_Betting = 2; //
CGS_BetEnd = 3; //
CGS_OpenThreeDice = 4; //
CGS_Settle = 5; //
}
enum ColorPinoyLiveLeaveReason {
ColorPinoyLiveLeaveReason_void = 0;
ColorPinoyLiveLeaveReason_PLAYER_QUIT_ROOM=2; //
ColorPinoyLiveLeaveReason_Maintaince=20; //
ColorPinoyLiveLeaveReason_Server_Update=21; //
ColorPinoyLiveLeaveReason_Ban=22; //
//
message ColorRoomWaitStart
{
NotifyColorTrend Trends = 1; //
}
//
message ColorRoomStart
{
NotifyColorTrend Trends = 1; //
}
//
message ColorRoomBetting
{
NotifyColorBetAreaInfo betAreaInfo = 1; //
}
//
message ColorRoomEndBet
{
NotifyColorEndBetting areaMul = 1; //
NotifyColorBetAreaInfo betAreaInfo = 2; //
NotifyColorBigUser bigUser = 3; //
}
//
message ColorRoomOpenThreeDice
{
NotifyColorOpenThreeDice dices = 1;
}
//
message ColorRoomSettle
{
NotifyColorSettle settle = 1;
}
//
message NotifyColorRoomInfo
{
ColorGameStatus status = 1;
int64 endTime = 2; //
ColorRoomConfig config = 101; //
ColorUser user = 100;
ColorRoomWaitStart waitStart = 3; //
ColorRoomStart start = 4;
ColorRoomBetting betting = 5;
ColorRoomEndBet endBet = 6;
ColorRoomOpenThreeDice openThreeDice = 7;
ColorRoomSettle settle = 8;
}
message ColorPinoyLiveStatusMessage{
int32 Status = 1; //
int32 StatusTime = 2; //
int32 StatusRemainTime = 3; //
int64 jackpot = 4;
message NotifyColorGameStart
{
int64 endTime = 1; // 3endTime = statusTime+3
}
message NotifyColorBetting
{
int64 endTime = 1; //
}
message ReqColorBetting
{
ColorBetArea area = 1;
int64 bet = 2;
}
message RspColorBetting
{
ErrCode code = 1;
ColorBetArea area = 2;
int64 bet = 3;
int64 gold = 4; //
}
//
message NotifyColorBetAreaInfo
{
message BetAreaInfo
{
ColorBetArea area = 1; //
int64 totalGold = 2; //
int32 playerNum = 3; //
int64 myBet = 4; //
}
repeated BetAreaInfo areaInfos = 1;
}
//
enum ColorPrizeType
{
CPT_Normal = 0; //
CPT_Big = 1; //
CPT_Jackpot = 2; // jackpot奖
}
//
message ColorBetAreaMul
{
ColorBetArea area = 1; //
ColorPrizeArea prizeArea = 2; //
ColorPrizeType prizeType = 3; //
int64 mul = 4; //
}
//
message NotifyColorEndBetting
{
int64 endTime = 1; //
repeated ColorBetAreaMul areaMul = 2; //
int64 jackpot = 3; // jackpot值
}
message NotifyColorOpenThreeDice
{
repeated ColorType color = 1; // 3
int32 aniRouteIndex = 3; //
repeated ColorBetAreaMul winBetArea = 5; //
}
message ColorPinoyLiveGameOpenThreeDice{
int32 Status = 1; //
repeated ColorPinoyLiveDiceColorType color = 2; // 3
int32 aniRouteIndex = 3; //
//
message NotifyColorSettle
{
message UserBetAreaMul
{
ColorBetAreaMul areaMul = 1;
int64 bet = 2; //
int64 win = 3; //
}
repeated UserBetAreaMul userAreaWin = 1; //
repeated ColorType threeDice = 2; //
int64 totalWin = 3; //
int64 totalBet = 4; //
int64 tax = 5; //
}
message ColorPinoyLiveBetReq {
ColorPinoyLiveBetTypeJP BetType = 1;//
int32 BetLevel = 2;//
int32 BetIndex = 3;//
int64 BetAmount = 4;//cash
}
//
message ColorPinoyLiveBetReqs {
repeated ColorPinoyLiveBetReq info = 1; //
}
message ColorPinoyLiveBetResp {
int32 code = 1;
string msg = 2;
}
//
message ColorPinoyLiveSeatUser {
message ColorUser {
string Nick = 1; //
string Head = 2; //
int64 Score = 3; //
int32 SeatId = 4; //id
int64 UserID = 5; //ID
}
// 线
message ColorPinoyLiveS2COnlinePlayerNum{
int64 Num = 1; //
}
//
message ColorPinoyLivePlayerBigWinner
message NotifyColorBigUser
{
repeated ColorPinoyLiveBigWinner bigBet = 34; //
int64 jackpot = 1; // jackpot值
repeated ColorBigUser bigUser = 34; //
}
message ColorPinoyLiveSceneBetInfo{
int64 UserBetTotal = 1;//
repeated int64 TotalBets = 2;//
repeated int64 UserBets = 3;//
ColorPinoyLiveUserInfo UserInfo = 4;//
}
message ColorPinoyLiveBetArr{
repeated int64 betArr = 3; //
}
//
message ColorPinoyLiveRoomBetRuleMsg{
int32 userBetLimit = 1;
int64 betMinLimit = 2;//
repeated ColorPinoyLiveBetArr betLevels = 3;//
repeated int64 level = 4;//
repeated BetAreaMulRangeConfig mulRangeConfig = 5; //
}
message ColorPinoyLiveTrendGroup{
ColorPinoyLiveDiceColorType luckyDice = 1; //
repeated ColorPinoyLiveDiceColorType threeDice = 2; // 3
}
message ColorPinoyLiveTrend{
repeated ColorPinoyLiveTrendGroup listTrendGroup = 1;
repeated int32 luckStarRate = 2; // 0-5(ColorPinoyLiveDiceColorType-1)
}
//
message TRTCRoomArgs {
int32 appId = 1;
string strRoomId = 2;
string userId = 3;
string userSig = 4;
}
// 6
message ColorPinoyLiveBigWinner
//
message NotifyColorTrend
{
string nickName = 5;//
message ColorRate
{
ColorType color = 1;
int32 rate = 2;
}
repeated ColorRate colorRate = 1; // 30
}
// 6
message ColorBigUser
{
string nickName = 5; //
string avatar = 2;
int64 winChips = 1; //
int64 winChips = 1; //
repeated int64 areaId = 3; // (6)
}
//
message BetAreaMulRangeConfig {
ColorPinoyLiveBigBetAreaPos pos = 1; // 0-2
int64 minMul = 2;
int64 maxMul = 3;
}
//
message SceneMessage{
int32 roomID = 1;
ColorPinoyLiveStatusMessage gameStatus = 2; //
int32 statusTime = 3; // ( )
int32 onlineNum = 4; // 线
ColorPinoyLiveTrend trendList = 5; //
ColorPinoyLiveDiceColorType luckyDice = 6; //
repeated ColorPinoyLiveDiceColorType threeDice = 7; // 3
repeated ColorPinoyLiveGameBetAreaInfo betAreaInfo = 8; //
ColorPinoyLiveRoomBetRuleMsg betRule = 9; //
// repeated SeatUser userData = 10; //
int32 aniLuckyDiceRouteIndex = 10; //
int32 aniThreeDiceRouteIndex = 11; // 3
int32 onlineNums = 12; // 线
repeated ColorPinoyLiveBetReqs lastTimeBet = 13; //
repeated ColorPinoyLivePlayerData rankList = 14; //
int32 bonus = 15; //
string artcUrl = 16; //
TRTCRoomArgs trtcRoomArgs = 17; //
int64 balance = 18; //
repeated ColorPinoyLiveBigWinner bigWinner = 19; //
repeated string dealerName = 20; //
int64 jackpot = 21; // jackpot值
repeated BetAreaMulRangeConfig mulRangeConfig = 22; //
}
message ColorPinoyLiveUserSitDown{
int32 ChairNo = 1;//
}
message ColorPinoyLiveUserSitDownFail{
string FailReaSon = 1;//
}
message ColorPinoyLiveBetAreaOdd{
ColorPinoyLiveBetTypeJP betArea = 1; //
int64 odd = 4; //
int64 viewOdd = 9; // x10赔率
bool isBigOdd = 5; // true:
ColorPinoyLiveBigBetAreaPos bigSingleColorOddPos = 6; // 0-2
bool isWin = 7; //
bool isJackpot = 8; // true:jackpot位置
}
//
message ColorPinoyLivePokerMsg{
repeated ColorPinoyLiveBetAreaOdd winBetArea = 5; //
}
message ColorPinoyLiveUserInfo{
string NikeName = 1;//
int64 UserGlod = 2;//
int64 BetGold = 3;//20
int32 WinCount = 4;//
string Head = 5; //
int64 UserID = 6;//id
}
//
message ColorPinoyLiveUserList{
repeated ColorPinoyLiveUserInfo UserList = 1;
}
//
message ColorPinoyLiveUserSettleMsg{
int64 TotalWinBaseBet = 1; //
int64 UserScore = 2; //
int64 TotalWin = 3; //
repeated int64 UserBets = 4; //
repeated int64 TotalBets = 5; //
repeated int64 UserWins = 6; //
repeated int64 UserRealWins = 7;//
int64 Tax = 9; //
repeated int64 oddsWins = 10; // // todo
repeated int64 userBetsCount = 11; //
repeated ColorPinoyLiveBetAreaOdd winAreaOdd = 12; //
int64 jackpotWin = 13; // jackpot奖励
repeated string jackpotUserName = 14; // jackpot
}
message ColorPinoyLiveGameBetAreaUserInfo{
int64 userID = 1;
int64 betChips = 2;
}
//
enum ColorPinoyLiveBigBetAreaPos {
BBA_Single_0 = 0; //
BBA_Single_1 = 1; //
BBA_Single_2 = 2; //
BBA_Double = 3; //
BBA_Three = 4; //
}
message ColorPinoyLiveGameBetAreaInfo{
ColorPinoyLiveBetTypeJP betType = 1;//
repeated ColorPinoyLiveGameBetAreaUserInfo betChipsInfo = 2;//
int32 isWin = 3; //
repeated int64 odd = 4; //
bool isBigOdd = 5; // true:
ColorPinoyLiveBigBetAreaPos bigSingleColorOddPos = 6; // 0-2
bool isJackpot = 7; // jackpot
}
message ColorPinoyLiveSceneUserInfo{
int64 UserID = 1;
int32 SceneSeatID = 2;
int64 UserScore = 3; //
int64 TotalWin = 4; //
int64 jackpotWin = 5; // jackpot赢钱
int64 normalWin = 6; // jackpot赢钱
}
//
message ColorPinoyLiveSceneSettleMsg{
repeated ColorPinoyLiveGameBetAreaInfo betAreaInfo = 1; //
// repeated SceneUserInfo UserList = 2; //
int64 noChairTotalWin = 2;
int64 sysDealerAreaInfo = 3; //
ColorPinoyLiveSceneUserInfo selfWinInfo = 4; //
ColorPinoyLiveDiceColorType luckyDice = 5; //
repeated ColorPinoyLiveDiceColorType threeDice = 6; // 3
ColorPinoyLiveTrendGroup trendGroup = 7;
repeated ColorPinoyLiveBetReqs lastTimeBet = 8; //
ColorPinoyLiveTrend trendGroupEx = 9;
repeated ColorPinoyLiveBigWinner bigWinner = 10; //
int64 jackpot = 11; // jackpot池
repeated string jackpotUserName = 12; // jackpot
}
//message ExitFail{
// string FailReason = 1;//
//}
message ColorPinoyLiveKickOutUserMsg{
string KickOutReason = 1;//
int32 reason = 2; //1 2
}
//
message ColorPinoyLiveUpdateRoomInfoMsg{
int64 OnlineNum = 1; //线
}
//
message ColorPinoyLivetempCardMsg{
bytes LongPoker = 1;
bytes HuPoker = 2;
}
//
message ColorPinoyLiveBetSuccessMessage {
int32 SeatId = 1;//
int32 BetLevel = 2;//
int32 BetIndex = 3;//
ColorPinoyLiveBetTypeJP BetType = 4;//
int64 UserBet = 5; //
int64 UserBets = 6; //
int64 TotalBets = 7;//
}
//
message ColorPinoyLiveS2CRepetBet {
repeated ColorPinoyLiveBetSuccessMessage betInfo = 1;
int64 UserScore = 2; //
int64 uid = 3;
}
message ColorPinoyLiveS2CNoChairRepetBet {
repeated ColorPinoyLiveBetSuccessMessage betInfo = 1;
repeated int64 UserBets = 2;//
repeated int64 TotalBets = 3;//
int64 UserScore = 4; //
int64 uid = 5;
}
//
message ColorPinoyLiveC2SBetDouble {
}
//
enum ColorPinoyLiveUndoType{
ColorPinoyLiveUndoVoid = 0;
ColorPinoyLiveUndoOne = 1;//
ColorPinoyLiveUndoAll = 2; //
}
//
message ColorPinoyLiveC2SUndoBet {
ColorPinoyLiveUndoType undoType = 1;
}
//
message S2CUndoBet {
ColorPinoyLiveUndoType undoType = 1;
repeated ColorPinoyLiveBetSuccessMessage betInfo = 2;
int64 UserScore = 3; //
int64 uid = 4;
}
// 广
message ColorPinoyLiveNtfBigOddBetArea
message NotifyColorKickOutUser
{
repeated ColorPinoyLiveGameBetAreaInfo betAreas = 1; //
ErrCode code = 1; //
}
message ColorPinoyLiveMainteNtf {
ColorPinoyLiveUserInfo userInfo = 1;
string maintMsg = 2;//
int64 returnGold = 3;//
}
message ColorPinoyLiveS2CBetEndFailResult{ //
int32 code = 1;
repeated ColorPinoyLiveS2CRepetBet players = 2;
}
message ColorPinoyLiveApplyPropsReq{
int64 userId = 1;//使 uid
int64 acceptUserId = 2;//uid
string propsId = 3;//id
}
message ColorPinoyLivePlayerPropsResp{
int64 applyUserId = 1;//
int64 acceptUserId = 2;//
string propsId = 3;//id
int64 chips = 4;//使
}
message ColorPinoyLiveLeaveResp{
int32 code = 1; // 0
string msg = 2;
}
// 广
message ColorPinoyLiveDealerName
//
message NotifyColorMaintain
{
repeated string dealerName = 1; //
}
//================================================================================================================================
message ColorPinoyLivePlayerData {
int64 uid = 1;
repeated int64 totalBets = 2; //
int64 totalBet = 3; //
int64 score = 4; //
int64 profit = 5; // &
int64 tax = 6; //
int64 balance = 7; //
int64 wait_time = 8; //
int64 pre_balance = 9; //
repeated int64 userWins = 10; //
repeated int64 userRealWins = 11; //
int64 start_time = 12;
string nickname = 13; // API查询写入
string avatar = 14; // API查询写入
int64 trans_bet = 15; //
int64 trans_win = 16; //
int32 dev_mode = 17; //
repeated int64 odds = 18; // // todo
repeated int64 userBetsCount = 19; //
int32 isDiscard = 20; // 0 1
repeated ColorPinoyLiveBetAreaOdd areaOdds = 21; //
}
message ColorPinoyLiveDetail {
repeated int64 winDoubleColorMul = 1; // // todo
repeated int64 winSingleColorMul = 2; // // todo
int64 bonus = 3; //
repeated ColorPinoyLiveDiceColorType threeDice = 4; // 3
ColorPinoyLiveDiceColorType luckyDice = 5; // // todo
repeated ColorPinoyLiveDiceColorType startDice = 6; //
repeated string resultImg = 7; //
repeated string dealerName = 8; //
repeated ColorPinoyLiveBetAreaOdd betAreaMul = 9; //
int64 jackpotFunding = 10; // jackpot系统垫资多少0
int64 jackpotX = 11; // ()
int64 jackpotY = 12; // jackpot池子比例
}
// ()
message ColorPinoyLiveEnd {
string game_no = 1; //
int64 start_time = 2; //
int64 end_time = 3; //
int32 level = 4; //
int64 base_bet = 5; //
repeated ColorPinoyLivePlayerData player_data = 6; //
int64 tax_rate = 7; //
int64 totalBet = 8; //
repeated int64 totalBets = 9; //
int64 realSystemWin = 10; //
repeated int64 realSystemWins = 11; //
int64 tax = 12; //
repeated ColorPinoyLiveBetTypeJP wins = 13; //
string op_token = 14; //
ColorPinoyLiveDetail detail = 15; //
int32 isDiscard = 16; // 0 1
}
//================================================================================================================================
// ColorPinoyLiveGameStatus 0 1 2 3 4 5 6 7 8
// 2,3 3 0 1 3 4 5 6 7 8
enum ColorPinoyLiveProcessCmd{
ColorPinoyLiveVoid = 0;
ColorPinoyLiveMSGGameGetStatus = 300;// ColorPinoyLiveGetStatus
ColorPinoyLiveMSGReady = 301;//
ColorPinoyLiveMSGBetting = 302;//
ColorPinoyLiveMSGLucky = 303;// ColorPinoyLiveLucky
ColorPinoyLiveMSGResult = 304;// ColorPinoyLiveResult
ColorPinoyLiveMSGSettle = 305;//
ColorPinoyLiveMSGRank = 306;//
ColorPinoyLiveMSGMMainteSet = 307;// ColorPinoyLiveMainte -> ColorPinoyLiveCommResp
ColorPinoyLiveMSGMDiscard = 308;// ColorPinoyLiveMainte -> ColorPinoyLiveCommResp
ColorPinoyLiveMSGMRankList = 309;// ->ColorPinoyLiveRankList
ColorPinoyLiveMSGMEndBet = 310;//
ColorPinoyLiveMSGMStartDice = 311;//
ColorPinoyLiveMSGMResultImg = 312;//
ColorPinoyLiveMSGMSyncNotify = 400;//
ColorPinoyLiveMSGMChat = 401; //
ColorPinoyLiveMSGLiveConfig = 402; //
ColorPinoyLiveMSGSetDealer = 403; //
}
enum ColorPinoyLiveCmd{
ColorPinoyLiveCmdMSGMRandomNext = 0; // NEXT按钮推进流程
}
enum ColorPinoyLiveProcessError{
ColorPinoyLiveProcessErrorVoid =0;
ColorPinoyLiveProcessErrorGameSatus = 1;//
ColorPinoyLiveProcessErrorMainteStatus = 2;//
ColorPinoyLiveProcessErrorDice = 3;//
}
//
message ColorPinoyLiveCommResp{
int32 code = 1;
string msg = 2;
int32 gameId = 3;
int32 gameStatus = 4; //
int64 countdown = 5; //
int64 countdown2 = 6; //
int32 maintainStatus = 7; // 0 1
string maintainMsg = 8; //
ColorPinoyLiveDiceColorType luckyStar = 9; //
repeated ColorPinoyLiveDiceColorType drawResult = 10; //
repeated int64 times = 11;
ColorPinoyLiveRankList rankList = 12; //
repeated ColorPinoyLiveDiceColorType startDice = 13; //
repeated string resultImg = 14; //
bool randomNext = 15; // randomNext
string gameNo = 16; //
repeated string dealerName = 19; //
repeated ColorPinoyLiveGameBetAreaInfo betAreaMul = 20; //
int64 jackpot = 30; // jackpot金额
}
//GameGetStatus
message ColorPinoyLiveGetStatus{
int32 gameId = 1;
}
//
message ColorPinoyLiveLucky{
ColorPinoyLiveDiceColorType Color = 1;
}
//
message ColorPinoyLiveResult{
repeated ColorPinoyLiveDiceColorType Color = 1;
}
//
message ColorPinoyLiveStartDice{
repeated ColorPinoyLiveDiceColorType startDice = 1; //
}
//
message ColorPinoyLiveResultImg{
repeated string resultImg = 1; //
int32 stage = 2; // 使 1: random 2: lottery
}
//
message ColorPinoyLiveMaintain{
int32 targetStatus = 1;// 0 1
string msg = 2;//
}
//
message ColorPinoyLiveRankList{
repeated ColorPinoyLivePlayerData player_data = 1; //
string game_no = 2; //
int64 start_time = 3; //
int64 end_time = 4; //
}
//
message ColorPinoyLiveSetDealer{
repeated string dealerName = 1; //
string msg = 2; //
int64 gold = 3; //
}

View File

@ -1,518 +1,441 @@
package room
import (
"encoding/json"
"game/common/proto/pb"
"github.com/fox/fox/log"
)
//import (
// "encoding/json"
// "game/common/proto/pb"
// "github.com/fox/fox/log"
//)
// const (
// LiveProcessInit = iota
// LiveProcessStart
// LiveProcessWait
// LiveProcessWaitDone
// LiveProcessFuncStart
// LiveProcessFuncDone
// )
//
// var LiveProcessStatusName = map[int]string{
// LiveProcessInit: "LiveProcessInit",
// LiveProcessStart: "LiveProcessStart",
// LiveProcessWait: "LiveProcessWait",
// LiveProcessWaitDone: "LiveProcessWaitDone",
// LiveProcessFuncStart: "LiveProcessFuncStart",
// LiveProcessFuncDone: "LiveProcessFuncDone",
// }
type LiveMgr struct {
// LiveWg *sync.WaitGroup
// Count int // 当前数量
// Mu *sync.Mutex
MaintenanceStatus int32 // 维护状态 0 正常 1 维护
// ProcessStatus int // 进程状态
Restting bool // 重置状态
MainteMsg string
DiscardMsg string
DiscardStatus int
DiscardRestting bool // 重置状态
RankList *pb.ColorPinoyLiveRankList
HasMainte bool
}
func NewLiveMgr() *LiveMgr {
return &LiveMgr{
// LiveWg: new(sync.WaitGroup),
// Mu: new(sync.Mutex),
RankList: new(pb.ColorPinoyLiveRankList),
}
}
func (lm *LiveMgr) Reset() {
lm.Restting = false
lm.DiscardRestting = false
lm.DiscardStatus = 0
}
// func (lm *LiveMgr) IsAdd() bool {
// lm.Mu.Lock()
// defer lm.Mu.Unlock()
// return lm.Count > 0
// }
//
// func (lm *LiveMgr) Add() {
// log.Debug("LiveMgr add")
// lm.Mu.Lock()
// defer lm.Mu.Unlock()
// lm.LiveWg.Add(1)
// lm.Count++
// }
//type LiveMgr struct {
// // LiveWg *sync.WaitGroup
// // Count int // 当前数量
// // Mu *sync.Mutex
// MaintenanceStatus int32 // 维护状态 0 正常 1 维护
// // ProcessStatus int // 进程状态
// Restting bool // 重置状态
// MainteMsg string
// DiscardMsg string
// DiscardStatus int
// DiscardRestting bool // 重置状态
// RankList *pb.ColorPinoyLiveRankList
// HasMainte bool
//}
//
// func (lm *LiveMgr) Done() {
// log.Debug("LiveMgr Done")
// lm.Mu.Lock()
// defer lm.Mu.Unlock()
// if lm.Count == 0 {
// return
// }
// lm.LiveWg.Done()
// lm.Count--
// }
//func NewLiveMgr() *LiveMgr {
// return &LiveMgr{
// // LiveWg: new(sync.WaitGroup),
// // Mu: new(sync.Mutex),
// RankList: new(pb.ColorPinoyLiveRankList),
// }
//}
//
// func (lm *LiveMgr) Wait() {
// log.Debug("LiveMgr Wait")
// lm.LiveWg.Wait()
// }
func (lm *LiveMgr) NeedMaintenance() bool {
return !lm.HasMainte && (lm.MaintenanceStatus == 1 || lm.DiscardStatus == 1)
}
func (rm *ColorRoom) LiveDelayUpdate() error {
event := &events.ServCmdKafka{
ServCmd: common.ServCmd_sc_live_delay_update,
}
data := &common.ServLiveDelayUpdate{
GameId: gconfig.GConfig.GRoomConfig.GameId,
MainteStatus: rm.LiveMgr.MaintenanceStatus,
MainteMsg: rm.LiveMgr.MainteMsg,
}
event.Data, _ = proto.Marshal(data)
err := gconfig.Produce(context.Background(), define.TopicSysServerCmd, event)
if err != nil {
log.Error(rm.Log("fail to Produce Event(%+v), err: %v", event, err))
return err
}
return nil
}
func (rm *ColorRoom) NotifyLiveDelayUpdate() {
if !gconfig.DelayUpdateServer {
return
}
if rm.LiveDelayUpdate() != nil {
return
}
gconfig.DelayUpdateServer = false
}
func (rm *ColorRoom) ServerMaintenanceKickPlayer() {
rm.Traverse(func(u *model.User) bool {
kMsg := new(pb.ColorPinoyLiveKickOutUserMsg)
kMsg.Reason = int32(pb.ColorPinoyLiveLeaveReason_ColorPinoyLiveLeaveReason_Server_Update)
u.SendMsg(int32(pb.ColorPinoyLiveSendToClientMessageType_ColorPinoyLiveNoticeKickOutUser), kMsg)
rm.KickOutUser(u)
return true
})
}
func (rm *ColorRoom) SyncServerMaintenance(st int32, ss string) {
_ = st
_ = ss
rm.LoadDealerNames()
// 可能即将变为 normal
if gconfig.GConfig.GServConfig.Status != define.GameStatusNoraml {
rm.LiveMgr.MaintenanceStatus = 0
rm.LiveMgr.MainteMsg = ""
return
}
ssv := redisf.RSC.LiveMainteGet(gconfig.GConfig.GDataConfig.VersionMode, gconfig.GConfig.GRoomConfig.GameId)
resp := new(pb.ColorPinoyLiveCommResp)
_ = json.Unmarshal([]byte(ssv), resp)
rm.LiveMgr.MaintenanceStatus = resp.MaintainStatus
rm.LiveMgr.MainteMsg = resp.MaintainMsg
}
func (rm *ColorRoom) OnLiveGameMessage(subCmd int32, buffer []byte) ([]byte, error) {
// log.Debug("收到后台消息:", subCmd)
var result proto.Message
_, err := rm.Table.RunAndWait(func() any {
switch subCmd {
case int32(pb.ColorPinoyLiveProcessCmd_ColorPinoyLiveMSGGameGetStatus):
result = rm.LiveGetGameStatus(buffer)
case int32(pb.ColorPinoyLiveProcessCmd_ColorPinoyLiveMSGReady):
result = rm.LiveGameReady(buffer) // 点击finish
case int32(pb.ColorPinoyLiveProcessCmd_ColorPinoyLiveMSGBetting):
result = rm.LiveGameBetting(buffer) // 点击start
case int32(pb.ColorPinoyLiveProcessCmd_ColorPinoyLiveMSGMStartDice):
result = rm.LiveGameStartDice(buffer)
case int32(pb.ColorPinoyLiveProcessCmd_ColorPinoyLiveMSGMResultImg):
result = rm.LiveGameResultImg(buffer)
// case int32(pb.ColorPinoyLiveProcessCmd_ColorPinoyLiveMSGLucky):
// result = rm.LiveGameLucky(buffer)
case int32(pb.ColorPinoyLiveProcessCmd_ColorPinoyLiveMSGResult):
result = rm.LiveGameResult(buffer)
case int32(pb.ColorPinoyLiveProcessCmd_ColorPinoyLiveMSGMMainteSet):
result = rm.LiveGameMainte(buffer)
case int32(pb.ColorPinoyLiveProcessCmd_ColorPinoyLiveMSGMDiscard):
result = rm.LiveGameDiscard(buffer)
case int32(pb.ColorPinoyLiveProcessCmd_ColorPinoyLiveMSGMRankList):
result = rm.LiveGameRankList(buffer)
case int32(pb.ColorPinoyLiveProcessCmd_ColorPinoyLiveMSGSetDealer):
result = rm.LiveGameSetDealerName(buffer)
default:
log.Error(rm.Log("no protocol"))
return nil
}
return result
})
if err == nil && result != nil {
b, _ := proto.Marshal(result)
canLog := true
if subCmd == int32(pb.ColorPinoyLiveProcessCmd_ColorPinoyLiveMSGGameGetStatus) {
if rd := rand.RandInt(0, 100); rd < 90 {
canLog = false
}
}
if canLog {
j, _ := json.Marshal(result)
log.Debug(rm.Log("返回后台消息 subCmd:%d, msg:%s", subCmd, string(j)))
}
return b, nil
}
return nil, err
}
func (rm *ColorRoom) getStatus() (int32, int64) {
switch rm.Status {
case pb.ColorPinoyLiveGameStatus_ColorPinoyLiveStartUnReady:
return int32(rm.Status), rm.StatusTime + int64(rm.RoomCfg.TimeConf.Readymove)
case pb.ColorPinoyLiveGameStatus_ColorPinoyLiveStartReady:
return int32(rm.Status), rm.StatusTime + int64(rm.RoomCfg.TimeConf.Startmove)
case pb.ColorPinoyLiveGameStatus_ColorPinoyLiveStartMovie:
return int32(pb.ColorPinoyLiveGameStatus_ColorPinoyLiveBetStatus), rm.StatusTime + int64(rm.RoomCfg.TimeConf.Startbet)
case pb.ColorPinoyLiveGameStatus_ColorPinoyLiveBetStatus:
return int32(rm.Status), rm.StatusTime + int64(rm.RoomCfg.TimeConf.Startbet)
case pb.ColorPinoyLiveGameStatus_ColorPinoyLiveEndBetMovie:
return int32(rm.Status), rm.StatusTime + int64(rm.RoomCfg.TimeConf.Endmove)
case pb.ColorPinoyLiveGameStatus_ColorPinoyLiveOpenThreeDice:
return int32(rm.Status), rm.StatusTime + int64(rm.RoomCfg.TimeConf.OpenThreeDice)
case pb.ColorPinoyLiveGameStatus_ColorPinoyLiveSettleStatus:
return int32(rm.Status), rm.StatusTime + int64(rm.RoomCfg.TimeConf.Endpay)
case pb.ColorPinoyLiveGameStatus_ColorPinoyLiveRankStatus:
return int32(rm.Status), rm.StatusTime + int64(rm.RoomCfg.TimeConf.Rank)
default:
return int32(rm.Status), rm.StatusTime
}
}
func (rm *ColorRoom) LiveStatus() *pb.ColorPinoyLiveCommResp {
resp := &pb.ColorPinoyLiveCommResp{
GameId: gconfig.GConfig.GRoomConfig.GameId,
MaintainStatus: rm.LiveMgr.MaintenanceStatus,
MaintainMsg: rm.LiveMgr.MainteMsg,
Times: rm.RoomCfg.TimeConf.Get(),
GameNo: rm.Table.GetGameRoundId(),
DealerName: rm.dealerName,
Jackpot: rm.jackpotMgr.GetJackpotCopy(),
}
resp.GameStatus, resp.Countdown = rm.getStatus()
resp.BetAreaMul = rm.betEndBetAreasOdds
for _, dice := range rm.StartDices {
resp.StartDice = append(resp.StartDice, pb.ColorPinoyLiveDiceColorType(model.GetColor(dice)))
}
resp.ResultImg = rm.ResultImgs
switch rm.Status {
case pb.ColorPinoyLiveGameStatus_ColorPinoyLiveOpenThreeDice:
resp.LuckyStar = pb.ColorPinoyLiveDiceColorType(model.GetColor(rm.LuckyDice))
for _, dice := range rm.NormalDices {
resp.DrawResult = append(resp.DrawResult, pb.ColorPinoyLiveDiceColorType(model.GetColor(dice)))
}
case pb.ColorPinoyLiveGameStatus_ColorPinoyLiveSettleStatus, pb.ColorPinoyLiveGameStatus_ColorPinoyLiveRankStatus:
resp.LuckyStar = pb.ColorPinoyLiveDiceColorType(model.GetColor(rm.LuckyDice))
for _, dice := range rm.NormalDices {
resp.DrawResult = append(resp.DrawResult, pb.ColorPinoyLiveDiceColorType(model.GetColor(dice)))
}
resp.RankList = rm.LiveMgr.RankList
default:
}
// 结束下注后,后台可看到更新爆奖后的投注面板
if rm.Status > pb.ColorPinoyLiveGameStatus_ColorPinoyLiveBetStatus {
resp.BetAreaMul = rm.betEndBetAreasOdds
}
return resp
}
func (rm *ColorRoom) LiveGetGameStatus(buffer []byte) proto.Message {
_ = buffer
return rm.LiveStatus()
}
func (rm *ColorRoom) LiveGameReady(buffer []byte) proto.Message {
_ = buffer
log.Debug(rm.Log("LiveGameReady"))
// rm.MutexStatus.Lock()
// defer rm.MutexStatus.Unlock()
resp := rm.LiveStatus()
if rm.LiveMgr.MaintenanceStatus == 1 {
resp.Code = int32(pb.ColorPinoyLiveProcessError_ColorPinoyLiveProcessErrorMainteStatus)
return resp
}
if rm.Status != pb.ColorPinoyLiveGameStatus_ColorPinoyLiveRankStatus {
resp.Code = int32(pb.ColorPinoyLiveProcessError_ColorPinoyLiveProcessErrorGameSatus)
return resp
}
rm.Ready()
resp.GameStatus, resp.Countdown = rm.getStatus()
return resp
}
func (rm *ColorRoom) LiveGameBetting(buffer []byte) proto.Message {
_ = buffer
log.Debug(rm.Log("LiveGameBetting"))
// rm.MutexStatus.Lock()
// defer rm.MutexStatus.Unlock()
resp := rm.LiveStatus()
if rm.LiveMgr.MaintenanceStatus == 1 {
resp.Code = int32(pb.ColorPinoyLiveProcessError_ColorPinoyLiveProcessErrorMainteStatus)
return resp
}
if rm.Status != pb.ColorPinoyLiveGameStatus_ColorPinoyLiveStartReady {
resp.Code = int32(pb.ColorPinoyLiveProcessError_ColorPinoyLiveProcessErrorGameSatus)
return resp
}
rm.StartBet()
return resp
}
func (rm *ColorRoom) LiveGameStartDice(buffer []byte) proto.Message {
log.Debug(rm.Log("LiveGameStartDice"))
resp := rm.LiveStatus()
if rm.LiveMgr.MaintenanceStatus == 1 {
resp.Code = int32(pb.ColorPinoyLiveProcessError_ColorPinoyLiveProcessErrorMainteStatus)
return resp
}
if rm.Status != pb.ColorPinoyLiveGameStatus_ColorPinoyLiveEndBetMovie {
resp.Code = int32(pb.ColorPinoyLiveProcessError_ColorPinoyLiveProcessErrorGameSatus)
return resp
}
req := new(pb.ColorPinoyLiveStartDice)
_ = proto.Unmarshal(buffer, req)
if len(req.GetStartDice()) != 3 {
resp.Code = int32(pb.ColorPinoyLiveProcessError_ColorPinoyLiveProcessErrorDice)
return resp
}
for i := 0; i < len(req.GetStartDice()); i++ {
rm.StartDices[i] = byte(req.GetStartDice()[i])
}
log.Debug(rm.Log("req:", req.GetStartDice(), ",StartDice:", rm.StartDices))
resp.StartDice = make([]pb.ColorPinoyLiveDiceColorType, 0)
for _, dice := range rm.StartDices {
resp.StartDice = append(resp.StartDice, pb.ColorPinoyLiveDiceColorType(model.GetColor(dice)))
}
resp.ResultImg = rm.ResultImgs
return resp
}
func (rm *ColorRoom) LiveGameResultImg(buffer []byte) proto.Message {
resp := rm.LiveStatus()
if rm.LiveMgr.MaintenanceStatus == 1 {
resp.Code = int32(pb.ColorPinoyLiveProcessError_ColorPinoyLiveProcessErrorMainteStatus)
return resp
}
req := new(pb.ColorPinoyLiveResultImg)
_ = proto.Unmarshal(buffer, req)
rm.ResultImgs = append(rm.ResultImgs, req.GetResultImg()...)
log.Debug(rm.Log("req:", req.GetResultImg(), ",ResultImg:", rm.ResultImgs))
resp.StartDice = make([]pb.ColorPinoyLiveDiceColorType, 0)
for _, dice := range rm.StartDices {
resp.StartDice = append(resp.StartDice, pb.ColorPinoyLiveDiceColorType(model.GetColor(dice)))
}
resp.ResultImg = rm.ResultImgs
return resp
}
func (rm *ColorRoom) LiveGameResult(buffer []byte) proto.Message {
// rm.MutexStatus.Lock()
// defer rm.MutexStatus.Unlock()
log.Debug(rm.Log("LiveGameResult"))
resp := rm.LiveStatus()
if rm.LiveMgr.MaintenanceStatus == 1 {
resp.Code = int32(pb.ColorPinoyLiveProcessError_ColorPinoyLiveProcessErrorMainteStatus)
return resp
}
log.Debug(rm.Log("LiveGameResult status:%v ", rm.Status))
if rm.Status != pb.ColorPinoyLiveGameStatus_ColorPinoyLiveEndBetMovie {
resp.Code = int32(pb.ColorPinoyLiveProcessError_ColorPinoyLiveProcessErrorGameSatus)
return resp
}
req := new(pb.ColorPinoyLiveResult)
_ = proto.Unmarshal(buffer, req)
if len(req.GetColor()) != 3 {
resp.Code = int32(pb.ColorPinoyLiveProcessError_ColorPinoyLiveProcessErrorDice)
return resp
} else {
for i := 0; i < len(req.GetColor()); i++ {
if !model.IsLogic(int32(req.GetColor()[i])) {
resp.Code = int32(pb.ColorPinoyLiveProcessError_ColorPinoyLiveProcessErrorDice)
return resp
}
rm.NormalDices[i] = byte(req.GetColor()[i])
}
}
log.Debug(rm.Log("LiveGameResult req:%v NormalDices:%v", req.GetColor(), rm.NormalDices))
rm.Table.Run(rm.openThreeDice)
return resp
}
func (rm *ColorRoom) LiveGameMainte(buffer []byte) proto.Message {
req := new(pb.ColorPinoyLiveMaintain)
_ = proto.Unmarshal(buffer, req)
b, _ := json.Marshal(req)
log.Debug(rm.Log("LiveGameMainte:%v", string(b)))
resp := rm.LiveStatus()
if rm.LiveMgr.Restting {
resp.Code = int32(pb.ColorPinoyLiveProcessError_ColorPinoyLiveProcessErrorMainteStatus)
resp.Msg = "Restting"
return resp
}
if req.TargetStatus == rm.LiveMgr.MaintenanceStatus {
resp.Code = int32(pb.ColorPinoyLiveProcessError_ColorPinoyLiveProcessErrorMainteStatus)
return resp
}
if rm.GetGameStatus() == pb.ColorPinoyLiveGameStatus_ColorPinoyLiveSettleStatus {
resp.Code = int32(pb.ColorPinoyLiveProcessError_ColorPinoyLiveProcessErrorGameSatus)
resp.Msg = "SettleStatus"
return resp
}
defer func() {
_ = pushGate.NotifyConfigUpdated(msg.ConfigUpdateType_ConfigUpdateTypeLiveConfig)
rm.SetLiveGameStatus()
}()
if req.TargetStatus == 0 {
rm.LiveMgr.MaintenanceStatus = 0
rm.LiveMgr.MainteMsg = ""
rm.LiveMgr.HasMainte = false
} else {
rm.LiveMgr.MaintenanceStatus = req.TargetStatus
rm.LiveMgr.MainteMsg = req.GetMsg()
rm.LiveMainteCnt()
}
resp.MaintainStatus = rm.LiveMgr.MaintenanceStatus
resp.MaintainMsg = rm.LiveMgr.MainteMsg
resp.GameStatus, resp.Countdown = rm.getStatus()
br, _ := json.Marshal(resp)
redisf.RSC.LiveMainteSet(gconfig.GConfig.GDataConfig.VersionMode, gconfig.GConfig.GRoomConfig.GameId, string(br))
redisf.RSC.LiveMainteLobbySet(gconfig.GConfig.GDataConfig.VersionMode, gconfig.GConfig.GRoomConfig.GameId, rm.LiveMgr.MaintenanceStatus, rm.LiveMgr.MainteMsg)
return resp
}
func (rm *ColorRoom) LiveMainteCnt() {
rm.LiveMainte()
}
func (rm *ColorRoom) LiveMainte() {
if rm.LiveMgr.MaintenanceStatus == 1 {
rm.LiveMgr.HasMainte = true
rm.LiveMgr.Restting = true
}
if rm.LiveMgr.DiscardStatus == 1 {
rm.LiveMgr.DiscardRestting = true
}
rm.GameDiscard()
// rm.LiveMgr.SetProcessStatus(LiveProcessInit)
if rm.LiveMgr.MaintenanceStatus == 1 {
rm.LiveMgr.Restting = false
}
if rm.LiveMgr.DiscardStatus == 1 {
rm.LiveMgr.DiscardRestting = false
rm.LiveMgr.DiscardStatus = 0
}
}
func (rm *ColorRoom) LiveGameDiscard(_ []byte) proto.Message {
log.Debug(rm.Log("LiveGameDiscard"))
resp := rm.LiveStatus()
if rm.LiveMgr.MaintenanceStatus == 1 {
log.Error(rm.Log("rm.LiveMgr.MaintenanceStatus"))
resp.Code = int32(pb.ColorPinoyLiveProcessError_ColorPinoyLiveProcessErrorMainteStatus)
return resp
}
if rm.LiveMgr.DiscardRestting {
resp.Code = int32(pb.ColorPinoyLiveProcessError_ColorPinoyLiveProcessErrorMainteStatus)
resp.Msg = "DiscardRestting"
return resp
}
// if rm.GetGameStatus() == pb.ColorPinoyLiveGameStatus_ColorPinoyLiveSettleStatus {
// resp.Code = int32(pb.ColorPinoyLiveProcessError_ColorPinoyLiveProcessErrorGameSatus)
// resp.Msg = "SettleStatus"
// return resp
// }
rm.LiveMgr.DiscardStatus = 1
rm.LiveMgr.DiscardMsg = ""
rm.LiveMainteCnt()
resp.GameStatus, resp.Countdown = rm.getStatus()
return resp
}
func (rm *ColorRoom) LiveGameRankList(buffer []byte) proto.Message {
_ = buffer
return rm.LiveMgr.RankList
}
func (rm *ColorRoom) LiveGameSetDealerName(buffer []byte) proto.Message {
resp := rm.LiveStatus()
if rm.LiveMgr.MaintenanceStatus == 1 {
resp.Code = int32(pb.ColorPinoyLiveProcessError_ColorPinoyLiveProcessErrorMainteStatus)
return resp
}
req := new(pb.ColorPinoyLiveSetDealer)
_ = proto.Unmarshal(buffer, req)
rm.UpdateDealerName(req.DealerName)
log.Debug(rm.Log("set dealer:", req.DealerName))
resp.DealerName = rm.dealerName
return resp
}
// 长度0 维护, 长度1 设置状态 , 长度2 设置排行榜
func (rm *ColorRoom) SetLiveGameStatus(pushRank ...int) {
lScene := &lws.CPLScene{
Status: int32(rm.Status),
RankList: nil,
MaintainStatus: rm.LiveMgr.MaintenanceStatus,
}
if rm.LiveMgr.RankList != nil &&
(rm.Status == pb.ColorPinoyLiveGameStatus_ColorPinoyLiveSettleStatus || rm.Status == pb.ColorPinoyLiveGameStatus_ColorPinoyLiveRankStatus) {
lScene.RankList = &lws.CPLRankList{
PlayerData: nil,
GameNo: rm.LiveMgr.RankList.GameNo,
}
for _, dd := range rm.LiveMgr.RankList.PlayerData {
lScene.RankList.PlayerData = append(lScene.RankList.PlayerData, &lws.CPLPlayerData{
Uid: dd.Uid,
Profit: dd.Profit,
Nickname: dd.Nickname,
Avatar: dd.Avatar,
})
}
}
if len(pushRank) == 0 {
live.PushScene(lScene)
} else if len(pushRank) == 1 {
live.PushStatus(&lws.CPLStatus{Status: lScene.Status})
} else if len(pushRank) == 2 {
live.PushColorRank(lScene.RankList)
}
go redisf.RSC.SetLiveGameStatus(lScene, gconfig.GConfig.GRoomConfig.GameId, gconfig.GConfig.GDataConfig.VersionMode)
}
//func (lm *LiveMgr) Reset() {
// lm.Restting = false
// lm.DiscardRestting = false
// lm.DiscardStatus = 0
//}
//
//
//func (lm *LiveMgr) NeedMaintenance() bool {
// return !lm.HasMainte && (lm.MaintenanceStatus == 1 || lm.DiscardStatus == 1)
//}
//
//func (rm *ColorRoom) LiveDelayUpdate() error {
// event := &events.ServCmdKafka{
// ServCmd: common.ServCmd_sc_live_delay_update,
// }
// data := &common.ServLiveDelayUpdate{
// GameId: gconfig.GConfig.GRoomConfig.GameId,
// MainteStatus: rm.LiveMgr.MaintenanceStatus,
// MainteMsg: rm.LiveMgr.MainteMsg,
// }
// event.Data, _ = proto.Marshal(data)
// err := gconfig.Produce(context.Background(), define.TopicSysServerCmd, event)
// if err != nil {
// log.Error(rm.Log("fail to Produce Event(%+v), err: %v", event, err))
// return err
// }
// return nil
//}
//
//func (rm *ColorRoom) NotifyLiveDelayUpdate() {
// if !gconfig.DelayUpdateServer {
// return
// }
// if rm.LiveDelayUpdate() != nil {
// return
// }
// gconfig.DelayUpdateServer = false
//}
//
//func (rm *ColorRoom) ServerMaintenanceKickPlayer() {
// rm.Traverse(func(u *model.User) bool {
// kMsg := new(pb.ColorPinoyLiveKickOutUserMsg)
// kMsg.Reason = int32(pb.ColorPinoyLiveLeaveReason_ColorPinoyLiveLeaveReason_Server_Update)
// u.SendMsg(int32(pb.ColorPinoyLiveSendToClientMessageType_ColorPinoyLiveNoticeKickOutUser), kMsg)
// rm.KickOutUser(u)
// return true
// })
//}
//
//func (rm *ColorRoom) SyncServerMaintenance(st int32, ss string) {
// _ = st
// _ = ss
// rm.LoadDealerNames()
// // 可能即将变为 normal
// if gconfig.GConfig.GServConfig.Status != define.GameStatusNoraml {
// rm.LiveMgr.MaintenanceStatus = 0
// rm.LiveMgr.MainteMsg = ""
// return
// }
// ssv := redisf.RSC.LiveMainteGet(gconfig.GConfig.GDataConfig.VersionMode, gconfig.GConfig.GRoomConfig.GameId)
// resp := new(pb.ColorPinoyLiveCommResp)
// _ = json.Unmarshal([]byte(ssv), resp)
// rm.LiveMgr.MaintenanceStatus = resp.MaintainStatus
// rm.LiveMgr.MainteMsg = resp.MaintainMsg
//
//}
//
//func (rm *ColorRoom) OnLiveGameMessage(subCmd int32, buffer []byte) ([]byte, error) {
// // log.Debug("收到后台消息:", subCmd)
// var result proto.Message
// _, err := rm.Table.RunAndWait(func() any {
// switch subCmd {
// case int32(pb.ColorPinoyLiveProcessCmd_ColorPinoyLiveMSGGameGetStatus):
// result = rm.LiveGetGameStatus(buffer)
// case int32(pb.ColorPinoyLiveProcessCmd_ColorPinoyLiveMSGReady):
// result = rm.LiveGameReady(buffer) // 点击finish
// case int32(pb.ColorPinoyLiveProcessCmd_ColorPinoyLiveMSGBetting):
// result = rm.LiveGameBetting(buffer) // 点击start
// case int32(pb.ColorPinoyLiveProcessCmd_ColorPinoyLiveMSGMStartDice):
// result = rm.LiveGameStartDice(buffer)
// case int32(pb.ColorPinoyLiveProcessCmd_ColorPinoyLiveMSGMResultImg):
// result = rm.LiveGameResultImg(buffer)
// // case int32(pb.ColorPinoyLiveProcessCmd_ColorPinoyLiveMSGLucky):
// // result = rm.LiveGameLucky(buffer)
// case int32(pb.ColorPinoyLiveProcessCmd_ColorPinoyLiveMSGResult):
// result = rm.LiveGameResult(buffer)
// case int32(pb.ColorPinoyLiveProcessCmd_ColorPinoyLiveMSGMMainteSet):
// result = rm.LiveGameMainte(buffer)
// case int32(pb.ColorPinoyLiveProcessCmd_ColorPinoyLiveMSGMDiscard):
// result = rm.LiveGameDiscard(buffer)
// case int32(pb.ColorPinoyLiveProcessCmd_ColorPinoyLiveMSGMRankList):
// result = rm.LiveGameRankList(buffer)
// case int32(pb.ColorPinoyLiveProcessCmd_ColorPinoyLiveMSGSetDealer):
// result = rm.LiveGameSetDealerName(buffer)
// default:
// log.Error(rm.Log("no protocol"))
// return nil
// }
// return result
// })
// if err == nil && result != nil {
// b, _ := proto.Marshal(result)
// canLog := true
// if subCmd == int32(pb.ColorPinoyLiveProcessCmd_ColorPinoyLiveMSGGameGetStatus) {
// if rd := rand.RandInt(0, 100); rd < 90 {
// canLog = false
// }
// }
// if canLog {
// j, _ := json.Marshal(result)
// log.Debug(rm.Log("返回后台消息 subCmd:%d, msg:%s", subCmd, string(j)))
// }
// return b, nil
// }
// return nil, err
//}
//
//func (rm *ColorRoom) getStatus() (int32, int64) {
// switch rm.Status {
// case pb.ColorPinoyLiveGameStatus_ColorPinoyLiveStartUnReady:
// return int32(rm.Status), rm.StatusTime + int64(rm.RoomCfg.TimeConf.Readymove)
// case pb.ColorPinoyLiveGameStatus_ColorPinoyLiveStartReady:
// return int32(rm.Status), rm.StatusTime + int64(rm.RoomCfg.TimeConf.Startmove)
// case pb.ColorPinoyLiveGameStatus_ColorPinoyLiveStartMovie:
// return int32(pb.ColorPinoyLiveGameStatus_ColorPinoyLiveBetStatus), rm.StatusTime + int64(rm.RoomCfg.TimeConf.Startbet)
// case pb.ColorPinoyLiveGameStatus_ColorPinoyLiveBetStatus:
// return int32(rm.Status), rm.StatusTime + int64(rm.RoomCfg.TimeConf.Startbet)
// case pb.ColorPinoyLiveGameStatus_ColorPinoyLiveEndBetMovie:
// return int32(rm.Status), rm.StatusTime + int64(rm.RoomCfg.TimeConf.Endmove)
// case pb.ColorPinoyLiveGameStatus_ColorPinoyLiveOpenThreeDice:
// return int32(rm.Status), rm.StatusTime + int64(rm.RoomCfg.TimeConf.OpenThreeDice)
// case pb.ColorPinoyLiveGameStatus_ColorPinoyLiveSettleStatus:
// return int32(rm.Status), rm.StatusTime + int64(rm.RoomCfg.TimeConf.Endpay)
// case pb.ColorPinoyLiveGameStatus_ColorPinoyLiveRankStatus:
// return int32(rm.Status), rm.StatusTime + int64(rm.RoomCfg.TimeConf.Rank)
// default:
// return int32(rm.Status), rm.StatusTime
// }
//}
//
//func (rm *ColorRoom) LiveStatus() *pb.ColorPinoyLiveCommResp {
// resp := &pb.ColorPinoyLiveCommResp{
// GameId: gconfig.GConfig.GRoomConfig.GameId,
// MaintainStatus: rm.LiveMgr.MaintenanceStatus,
// MaintainMsg: rm.LiveMgr.MainteMsg,
// Times: rm.RoomCfg.TimeConf.Get(),
// GameNo: rm.Table.GetGameRoundId(),
// DealerName: rm.dealerName,
// Jackpot: rm.jackpotMgr.GetJackpotCopy(),
// }
// resp.GameStatus, resp.Countdown = rm.getStatus()
// resp.BetAreaMul = rm.betEndBetAreasOdds
// for _, dice := range rm.StartDices {
// resp.StartDice = append(resp.StartDice, pb.ColorPinoyLiveDiceColorType(model.GetColor(dice)))
// }
// resp.ResultImg = rm.ResultImgs
// switch rm.Status {
// case pb.ColorPinoyLiveGameStatus_ColorPinoyLiveOpenThreeDice:
// resp.LuckyStar = pb.ColorPinoyLiveDiceColorType(model.GetColor(rm.LuckyDice))
// for _, dice := range rm.NormalDices {
// resp.DrawResult = append(resp.DrawResult, pb.ColorPinoyLiveDiceColorType(model.GetColor(dice)))
// }
// case pb.ColorPinoyLiveGameStatus_ColorPinoyLiveSettleStatus, pb.ColorPinoyLiveGameStatus_ColorPinoyLiveRankStatus:
// resp.LuckyStar = pb.ColorPinoyLiveDiceColorType(model.GetColor(rm.LuckyDice))
// for _, dice := range rm.NormalDices {
// resp.DrawResult = append(resp.DrawResult, pb.ColorPinoyLiveDiceColorType(model.GetColor(dice)))
// }
// resp.RankList = rm.LiveMgr.RankList
// default:
// }
// // 结束下注后,后台可看到更新爆奖后的投注面板
// if rm.Status > pb.ColorPinoyLiveGameStatus_ColorPinoyLiveBetStatus {
// resp.BetAreaMul = rm.betEndBetAreasOdds
// }
// return resp
//}
//
//func (rm *ColorRoom) LiveGetGameStatus(buffer []byte) proto.Message {
// _ = buffer
// return rm.LiveStatus()
//}
//
//func (rm *ColorRoom) LiveGameReady(buffer []byte) proto.Message {
// _ = buffer
// log.Debug(rm.Log("LiveGameReady"))
// // rm.MutexStatus.Lock()
// // defer rm.MutexStatus.Unlock()
// resp := rm.LiveStatus()
// if rm.LiveMgr.MaintenanceStatus == 1 {
// resp.Code = int32(pb.ColorPinoyLiveProcessError_ColorPinoyLiveProcessErrorMainteStatus)
// return resp
// }
// if rm.Status != pb.ColorPinoyLiveGameStatus_ColorPinoyLiveRankStatus {
// resp.Code = int32(pb.ColorPinoyLiveProcessError_ColorPinoyLiveProcessErrorGameSatus)
// return resp
// }
// rm.Ready()
// resp.GameStatus, resp.Countdown = rm.getStatus()
// return resp
//}
//
//func (rm *ColorRoom) LiveGameBetting(buffer []byte) proto.Message {
// _ = buffer
// log.Debug(rm.Log("LiveGameBetting"))
// // rm.MutexStatus.Lock()
// // defer rm.MutexStatus.Unlock()
// resp := rm.LiveStatus()
// if rm.LiveMgr.MaintenanceStatus == 1 {
// resp.Code = int32(pb.ColorPinoyLiveProcessError_ColorPinoyLiveProcessErrorMainteStatus)
// return resp
// }
// if rm.Status != pb.ColorPinoyLiveGameStatus_ColorPinoyLiveStartReady {
// resp.Code = int32(pb.ColorPinoyLiveProcessError_ColorPinoyLiveProcessErrorGameSatus)
// return resp
// }
//
// rm.StartBet()
// return resp
//}
//
//func (rm *ColorRoom) LiveGameStartDice(buffer []byte) proto.Message {
// log.Debug(rm.Log("LiveGameStartDice"))
// resp := rm.LiveStatus()
// if rm.LiveMgr.MaintenanceStatus == 1 {
// resp.Code = int32(pb.ColorPinoyLiveProcessError_ColorPinoyLiveProcessErrorMainteStatus)
// return resp
// }
// if rm.Status != pb.ColorPinoyLiveGameStatus_ColorPinoyLiveEndBetMovie {
// resp.Code = int32(pb.ColorPinoyLiveProcessError_ColorPinoyLiveProcessErrorGameSatus)
// return resp
// }
// req := new(pb.ColorPinoyLiveStartDice)
// _ = proto.Unmarshal(buffer, req)
// if len(req.GetStartDice()) != 3 {
// resp.Code = int32(pb.ColorPinoyLiveProcessError_ColorPinoyLiveProcessErrorDice)
// return resp
// }
// for i := 0; i < len(req.GetStartDice()); i++ {
// rm.StartDices[i] = byte(req.GetStartDice()[i])
// }
// log.Debug(rm.Log("req:", req.GetStartDice(), ",StartDice:", rm.StartDices))
// resp.StartDice = make([]pb.ColorPinoyLiveDiceColorType, 0)
// for _, dice := range rm.StartDices {
// resp.StartDice = append(resp.StartDice, pb.ColorPinoyLiveDiceColorType(model.GetColor(dice)))
// }
// resp.ResultImg = rm.ResultImgs
// return resp
//}
//
//func (rm *ColorRoom) LiveGameResultImg(buffer []byte) proto.Message {
// resp := rm.LiveStatus()
// if rm.LiveMgr.MaintenanceStatus == 1 {
// resp.Code = int32(pb.ColorPinoyLiveProcessError_ColorPinoyLiveProcessErrorMainteStatus)
// return resp
// }
// req := new(pb.ColorPinoyLiveResultImg)
// _ = proto.Unmarshal(buffer, req)
// rm.ResultImgs = append(rm.ResultImgs, req.GetResultImg()...)
// log.Debug(rm.Log("req:", req.GetResultImg(), ",ResultImg:", rm.ResultImgs))
// resp.StartDice = make([]pb.ColorPinoyLiveDiceColorType, 0)
// for _, dice := range rm.StartDices {
// resp.StartDice = append(resp.StartDice, pb.ColorPinoyLiveDiceColorType(model.GetColor(dice)))
// }
// resp.ResultImg = rm.ResultImgs
// return resp
//}
//
//func (rm *ColorRoom) LiveGameResult(buffer []byte) proto.Message {
// // rm.MutexStatus.Lock()
// // defer rm.MutexStatus.Unlock()
// log.Debug(rm.Log("LiveGameResult"))
// resp := rm.LiveStatus()
// if rm.LiveMgr.MaintenanceStatus == 1 {
// resp.Code = int32(pb.ColorPinoyLiveProcessError_ColorPinoyLiveProcessErrorMainteStatus)
// return resp
// }
// log.Debug(rm.Log("LiveGameResult status:%v ", rm.Status))
// if rm.Status != pb.ColorPinoyLiveGameStatus_ColorPinoyLiveEndBetMovie {
// resp.Code = int32(pb.ColorPinoyLiveProcessError_ColorPinoyLiveProcessErrorGameSatus)
// return resp
// }
// req := new(pb.ColorPinoyLiveResult)
// _ = proto.Unmarshal(buffer, req)
// if len(req.GetColor()) != 3 {
// resp.Code = int32(pb.ColorPinoyLiveProcessError_ColorPinoyLiveProcessErrorDice)
// return resp
// } else {
// for i := 0; i < len(req.GetColor()); i++ {
// if !model.IsLogic(int32(req.GetColor()[i])) {
// resp.Code = int32(pb.ColorPinoyLiveProcessError_ColorPinoyLiveProcessErrorDice)
// return resp
// }
// rm.NormalDices[i] = byte(req.GetColor()[i])
// }
// }
// log.Debug(rm.Log("LiveGameResult req:%v NormalDices:%v", req.GetColor(), rm.NormalDices))
//
// rm.Table.Run(rm.openThreeDice)
// return resp
//}
//
//func (rm *ColorRoom) LiveGameMainte(buffer []byte) proto.Message {
// req := new(pb.ColorPinoyLiveMaintain)
// _ = proto.Unmarshal(buffer, req)
// b, _ := json.Marshal(req)
// log.Debug(rm.Log("LiveGameMainte:%v", string(b)))
// resp := rm.LiveStatus()
// if rm.LiveMgr.Restting {
// resp.Code = int32(pb.ColorPinoyLiveProcessError_ColorPinoyLiveProcessErrorMainteStatus)
// resp.Msg = "Restting"
// return resp
// }
// if req.TargetStatus == rm.LiveMgr.MaintenanceStatus {
// resp.Code = int32(pb.ColorPinoyLiveProcessError_ColorPinoyLiveProcessErrorMainteStatus)
// return resp
// }
// if rm.GetGameStatus() == pb.ColorPinoyLiveGameStatus_ColorPinoyLiveSettleStatus {
// resp.Code = int32(pb.ColorPinoyLiveProcessError_ColorPinoyLiveProcessErrorGameSatus)
// resp.Msg = "SettleStatus"
// return resp
// }
// defer func() {
// _ = pushGate.NotifyConfigUpdated(msg.ConfigUpdateType_ConfigUpdateTypeLiveConfig)
// rm.SetLiveGameStatus()
// }()
// if req.TargetStatus == 0 {
// rm.LiveMgr.MaintenanceStatus = 0
// rm.LiveMgr.MainteMsg = ""
// rm.LiveMgr.HasMainte = false
// } else {
// rm.LiveMgr.MaintenanceStatus = req.TargetStatus
// rm.LiveMgr.MainteMsg = req.GetMsg()
// rm.LiveMainteCnt()
// }
// resp.MaintainStatus = rm.LiveMgr.MaintenanceStatus
// resp.MaintainMsg = rm.LiveMgr.MainteMsg
// resp.GameStatus, resp.Countdown = rm.getStatus()
// br, _ := json.Marshal(resp)
// redisf.RSC.LiveMainteSet(gconfig.GConfig.GDataConfig.VersionMode, gconfig.GConfig.GRoomConfig.GameId, string(br))
// redisf.RSC.LiveMainteLobbySet(gconfig.GConfig.GDataConfig.VersionMode, gconfig.GConfig.GRoomConfig.GameId, rm.LiveMgr.MaintenanceStatus, rm.LiveMgr.MainteMsg)
// return resp
//}
//
//func (rm *ColorRoom) LiveMainteCnt() {
// rm.LiveMainte()
//}
//
//func (rm *ColorRoom) LiveMainte() {
// if rm.LiveMgr.MaintenanceStatus == 1 {
// rm.LiveMgr.HasMainte = true
// rm.LiveMgr.Restting = true
// }
// if rm.LiveMgr.DiscardStatus == 1 {
// rm.LiveMgr.DiscardRestting = true
// }
// rm.GameDiscard()
// // rm.LiveMgr.SetProcessStatus(LiveProcessInit)
// if rm.LiveMgr.MaintenanceStatus == 1 {
// rm.LiveMgr.Restting = false
// }
// if rm.LiveMgr.DiscardStatus == 1 {
// rm.LiveMgr.DiscardRestting = false
// rm.LiveMgr.DiscardStatus = 0
// }
//}
//
//func (rm *ColorRoom) LiveGameDiscard(_ []byte) proto.Message {
// log.Debug(rm.Log("LiveGameDiscard"))
// resp := rm.LiveStatus()
// if rm.LiveMgr.MaintenanceStatus == 1 {
// log.Error(rm.Log("rm.LiveMgr.MaintenanceStatus"))
// resp.Code = int32(pb.ColorPinoyLiveProcessError_ColorPinoyLiveProcessErrorMainteStatus)
// return resp
// }
// if rm.LiveMgr.DiscardRestting {
// resp.Code = int32(pb.ColorPinoyLiveProcessError_ColorPinoyLiveProcessErrorMainteStatus)
// resp.Msg = "DiscardRestting"
// return resp
// }
// // if rm.GetGameStatus() == pb.ColorPinoyLiveGameStatus_ColorPinoyLiveSettleStatus {
// // resp.Code = int32(pb.ColorPinoyLiveProcessError_ColorPinoyLiveProcessErrorGameSatus)
// // resp.Msg = "SettleStatus"
// // return resp
// // }
// rm.LiveMgr.DiscardStatus = 1
// rm.LiveMgr.DiscardMsg = ""
// rm.LiveMainteCnt()
// resp.GameStatus, resp.Countdown = rm.getStatus()
// return resp
//}
//func (rm *ColorRoom) LiveGameRankList(buffer []byte) proto.Message {
// _ = buffer
// return rm.LiveMgr.RankList
//}
//
//func (rm *ColorRoom) LiveGameSetDealerName(buffer []byte) proto.Message {
// resp := rm.LiveStatus()
// if rm.LiveMgr.MaintenanceStatus == 1 {
// resp.Code = int32(pb.ColorPinoyLiveProcessError_ColorPinoyLiveProcessErrorMainteStatus)
// return resp
// }
// req := new(pb.ColorPinoyLiveSetDealer)
// _ = proto.Unmarshal(buffer, req)
// rm.UpdateDealerName(req.DealerName)
// log.Debug(rm.Log("set dealer:", req.DealerName))
// resp.DealerName = rm.dealerName
// return resp
//}

View File

@ -3,7 +3,6 @@ package room
import (
"game/common/proto/pb"
"github.com/fox/fox/ipb"
"github.com/fox/fox/log"
)
func (rm *ColorRoom) checkEnterRoom(user *ColorPlayer, iMsg *ipb.InternalMsg, req *pb.C2SMatchRoom) {
@ -16,210 +15,212 @@ func (rm *ColorRoom) OnEnterRoom(user *ColorPlayer, iMsg *ipb.InternalMsg, req *
return
}
func (rm *ColorRoom) ApplyLeave(buffer []byte, user inter.UserInetr) {
_ = buffer
resp := new(pb.ColorPinoyLiveLeaveResp)
u := rm.GetPlayer(user.GetId())
if u == nil {
rm.Table.KickOut(user)
return
}
// 有下注时不让玩家离开
if u.TotalBet != 0 {
resp.Code = 1
_ = user.SendMsg(int32(pb.ColorPinoyLiveReceiveFromClientMessageType_ColorPinoyLiveApplyLeave), resp)
return
}
rm.KickOutUser(u)
_ = user.SendMsg(int32(pb.ColorPinoyLiveReceiveFromClientMessageType_ColorPinoyLiveApplyLeave), resp)
return
}
func (rm *ColorRoom) checkNoBet() bool {
return rm.GetGameStatus() != pb.ColorPinoyLiveGameStatus_ColorPinoyLiveBetStatus ||
rm.LiveMgr.MaintenanceStatus == 1 ||
rm.LiveMgr.DiscardRestting
}
func (rm *ColorRoom) Bet(buffer []byte, user inter.UserInetr) {
u := rm.getUser(user)
u.MutexBet.Lock()
defer u.MutexBet.Unlock()
if rm.checkNoBet() {
log.Error(rm.Log("game bet status err:%v", rm.GetGameStatus()))
model.SendBetFailMessageInetr(model.StatusError, user)
return
}
// 用户下注
BetPb := &pb.ColorPinoyLiveBetReqs{}
err := proto.Unmarshal(buffer, BetPb)
if err != nil {
log.Error(rm.Log("proto.Unmarshal err:%v", err))
model.SendBetFailMessageInetr(model.DataErr, user)
return
}
log.Debug(rm.Log("Bet pb = ", BetPb))
var bets []*pb.ColorPinoyLiveBetReq
for _, bet := range BetPb.Info {
req := &pb.ColorPinoyLiveBetReq{
BetType: bet.BetType,
BetLevel: bet.BetLevel,
BetIndex: bet.BetIndex,
BetAmount: bet.BetAmount,
}
bets = append(bets, req)
}
// log.Debug("Bet bets =", bets)
rm.CheckAndBet(u, bets)
}
func (rm *ColorRoom) UserSitDown(buffer []byte, user inter.UserInetr) {
us := &pb.ColorPinoyLiveUserSitDown{}
_ = proto.Unmarshal(buffer, us)
// u, ok := rm.AllUserList[user.GetId()]
u := rm.GetPlayer(user.GetId())
if u != nil {
if rm.SceneInfo.SitScene(u, int(us.ChairNo)) {
u.SceneChairId = int(us.ChairNo)
rm.Traverse(func(v *model.User) bool {
// rm.SendSceneMsg(v)
return true
})
}
}
}
func (rm *ColorRoom) SendUserListInfo(user inter.UserInetr) {
msg := new(pb.ColorPinoyLiveUserList)
for _, u := range rm.OnlineUserList {
userinfo := new(pb.ColorPinoyLiveUserInfo)
userinfo.NikeName = u.UserInetr.GetNike()
userinfo.UserGlod = u.Balance
userinfo.Head = u.UserInetr.GetHead()
userinfo.UserID = u.UserID
msg.UserList = append(msg.UserList, userinfo)
}
// log.Debug("SendUserListInfo", msg)
_ = user.SendMsg(int32(pb.ColorPinoyLiveReceiveFromClientMessageType_ColorPinoyLiveApplyGetUserListInfo), msg)
}
func (rm *ColorRoom) SendTrend(u inter.UserInetr) {
// log.Debug("发送走势图")
msg := new(pb.ColorPinoyLiveTrend)
msg.ListTrendGroup = rm.GameTrend.ListTrendGroup
msg.LuckStarRate = rm.GetGameTrend()
_ = u.SendMsg(int32(pb.ColorPinoyLiveSendToClientMessageType_ColorPinoyLiveNoticeGameTrendInfo), msg)
}
func (rm *ColorRoom) OnUserStanUp(user *model.User) {
rm.SceneInfo.UserStandUp(user.UserInetr)
user.Mn.Lock()
user.SceneChairId = 0
user.Mn.Unlock()
if rm.GetGameStatus() < pb.ColorPinoyLiveGameStatus_ColorPinoyLiveOpenThreeDice {
rm.SelectUserListBalanceTopSitDownChair()
} else {
// rm.Traverse(func(v *model.User) bool {
// rm.SendSceneMsg(v)
// return true
// })
}
}
func (rm *ColorRoom) AgainBet(user inter.UserInetr) {
u := rm.getUser(user)
u.MutexBet.Lock()
defer u.MutexBet.Unlock()
if rm.checkNoBet() {
log.Error(rm.Log("game bet status err ", rm.GetGameStatus()))
model.SendBetFailMessageInetr(model.StatusError, user)
return
}
// u := rm.getUser(user)
var bets []*pb.ColorPinoyLiveBetReq
if u.TempLastTimeBet != nil {
for _, bet := range u.TempLastTimeBet {
bets = append(bets, bet...)
}
}
rm.CheckAndBet(u, bets)
}
func (rm *ColorRoom) BetDouble(user inter.UserInetr) {
u := rm.getUser(user)
u.MutexBet.Lock()
defer u.MutexBet.Unlock()
if rm.checkNoBet() {
log.Error(rm.Log("game bet status err ", rm.GetGameStatus()))
model.SendBetFailMessageInetr(model.StatusError, user)
return
}
// u := rm.getUser(user)
var bets []*pb.ColorPinoyLiveBetReq
if u.LastTimeBet != nil {
for _, bet := range u.LastTimeBet {
bets = append(bets, bet...)
}
// log.Debug("BetDouble 上次下注:", u.LastTimeBet, "bets:", bets)
}
if len(bets) > 1000 {
log.Error(rm.Log("game bet status err ", rm.GetGameStatus()))
model.SendBetFailMessageInetr(12, user)
return
}
rm.CheckAndBet(u, bets)
}
func (rm *ColorRoom) OnUndoBet(buffer []byte, user inter.UserInetr) {
u := rm.getUser(user)
u.MutexBet.Lock()
defer u.MutexBet.Unlock()
if rm.checkNoBet() {
log.Error(rm.Log("game bet status err:%v", rm.GetGameStatus()))
model.SendBetFailMessageInetr(model.StatusError, user)
return
}
reqInfo := &pb.ColorPinoyLiveC2SUndoBet{}
err := proto.Unmarshal(buffer, reqInfo)
if err != nil {
log.Error(rm.Log("proto.Unmarshal err:%v", err))
model.SendBetFailMessageInetr(model.DataErr, user)
return
}
rm.UndoBet(u, reqInfo.UndoType)
}
// ApplyUseProps todo
func (rm *ColorRoom) ApplyUseProps(buffer []byte, userInter inter.UserInetr) {
applyInfo := new(pb.ColorPinoyLiveApplyPropsReq)
err := proto.Unmarshal(buffer, applyInfo)
user := rm.getUser(userInter)
if err != nil {
log.Error(rm.Log("proto.Unmarshal err:%v", err))
model.SendBetFailMessage(model.DataErr, user)
return
}
AcceptUser := rm.GetPlayer(applyInfo.AcceptUserId)
if AcceptUser == nil {
log.Error(rm.Log("AcceptUser is null"))
model.SendBetFailMessage(model.UserNull, user)
return
}
_, err = user.GetPropsReal(rm.RoomCfg.Prop, rm.Table, rm.RoomCfg)
if err != nil {
log.Error(rm.Log("GetPropsReal err", err))
model.SendBetFailMessage(model.ScoreLess, user)
return
}
leftCoins := user.Balance
propsResp := &pb.ColorPinoyLivePlayerPropsResp{
ApplyUserId: user.UserID,
AcceptUserId: AcceptUser.UserID,
PropsId: applyInfo.PropsId,
Chips: leftCoins,
}
rm.Table.Broadcast(int32(pb.ColorPinoyLiveSendToClientMessageType_ColorPinoyLiveNoticePlayerUseProps), propsResp)
}
//---------------------------------------------------------------------------------------------------------------------
//
//func (rm *ColorRoom) ApplyLeave(buffer []byte, user inter.UserInetr) {
// _ = buffer
// resp := new(pb.ColorPinoyLiveLeaveResp)
// u := rm.GetPlayer(user.GetId())
// if u == nil {
// rm.Table.KickOut(user)
// return
// }
// // 有下注时不让玩家离开
// if u.TotalBet != 0 {
// resp.Code = 1
// _ = user.SendMsg(int32(pb.ColorPinoyLiveReceiveFromClientMessageType_ColorPinoyLiveApplyLeave), resp)
// return
// }
// rm.KickOutUser(u)
// _ = user.SendMsg(int32(pb.ColorPinoyLiveReceiveFromClientMessageType_ColorPinoyLiveApplyLeave), resp)
// return
//}
//
//func (rm *ColorRoom) checkNoBet() bool {
// return rm.GetGameStatus() != pb.ColorPinoyLiveGameStatus_ColorPinoyLiveBetStatus ||
// rm.LiveMgr.MaintenanceStatus == 1 ||
// rm.LiveMgr.DiscardRestting
//}
//
//func (rm *ColorRoom) Bet(buffer []byte, user inter.UserInetr) {
// u := rm.getUser(user)
// u.MutexBet.Lock()
// defer u.MutexBet.Unlock()
// if rm.checkNoBet() {
// log.Error(rm.Log("game bet status err:%v", rm.GetGameStatus()))
// model.SendBetFailMessageInetr(model.StatusError, user)
// return
// }
// // 用户下注
// BetPb := &pb.ColorPinoyLiveBetReqs{}
// err := proto.Unmarshal(buffer, BetPb)
// if err != nil {
// log.Error(rm.Log("proto.Unmarshal err:%v", err))
// model.SendBetFailMessageInetr(model.DataErr, user)
// return
// }
// log.Debug(rm.Log("Bet pb = ", BetPb))
// var bets []*pb.ColorPinoyLiveBetReq
//
// for _, bet := range BetPb.Info {
// req := &pb.ColorPinoyLiveBetReq{
// BetType: bet.BetType,
// BetLevel: bet.BetLevel,
// BetIndex: bet.BetIndex,
// BetAmount: bet.BetAmount,
// }
// bets = append(bets, req)
// }
//
// // log.Debug("Bet bets =", bets)
// rm.CheckAndBet(u, bets)
//}
//
//func (rm *ColorRoom) UserSitDown(buffer []byte, user inter.UserInetr) {
// us := &pb.ColorPinoyLiveUserSitDown{}
// _ = proto.Unmarshal(buffer, us)
// // u, ok := rm.AllUserList[user.GetId()]
// u := rm.GetPlayer(user.GetId())
// if u != nil {
// if rm.SceneInfo.SitScene(u, int(us.ChairNo)) {
// u.SceneChairId = int(us.ChairNo)
// rm.Traverse(func(v *model.User) bool {
// // rm.SendSceneMsg(v)
// return true
// })
// }
// }
//}
//
//func (rm *ColorRoom) SendUserListInfo(user inter.UserInetr) {
// msg := new(pb.ColorPinoyLiveUserList)
// for _, u := range rm.OnlineUserList {
// userinfo := new(pb.ColorPinoyLiveUserInfo)
// userinfo.NikeName = u.UserInetr.GetNike()
// userinfo.UserGlod = u.Balance
// userinfo.Head = u.UserInetr.GetHead()
// userinfo.UserID = u.UserID
// msg.UserList = append(msg.UserList, userinfo)
// }
// // log.Debug("SendUserListInfo", msg)
// _ = user.SendMsg(int32(pb.ColorPinoyLiveReceiveFromClientMessageType_ColorPinoyLiveApplyGetUserListInfo), msg)
//}
//
//func (rm *ColorRoom) SendTrend(u inter.UserInetr) {
// // log.Debug("发送走势图")
// msg := new(pb.ColorPinoyLiveTrend)
// msg.ListTrendGroup = rm.GameTrend.ListTrendGroup
// msg.LuckStarRate = rm.GetGameTrend()
// _ = u.SendMsg(int32(pb.ColorPinoyLiveSendToClientMessageType_ColorPinoyLiveNoticeGameTrendInfo), msg)
//}
//
//func (rm *ColorRoom) OnUserStanUp(user *model.User) {
// rm.SceneInfo.UserStandUp(user.UserInetr)
// user.Mn.Lock()
// user.SceneChairId = 0
// user.Mn.Unlock()
// if rm.GetGameStatus() < pb.ColorPinoyLiveGameStatus_ColorPinoyLiveOpenThreeDice {
// rm.SelectUserListBalanceTopSitDownChair()
// } else {
// // rm.Traverse(func(v *model.User) bool {
// // rm.SendSceneMsg(v)
// // return true
// // })
// }
//}
//
//func (rm *ColorRoom) AgainBet(user inter.UserInetr) {
// u := rm.getUser(user)
// u.MutexBet.Lock()
// defer u.MutexBet.Unlock()
// if rm.checkNoBet() {
// log.Error(rm.Log("game bet status err ", rm.GetGameStatus()))
// model.SendBetFailMessageInetr(model.StatusError, user)
// return
// }
// // u := rm.getUser(user)
// var bets []*pb.ColorPinoyLiveBetReq
// if u.TempLastTimeBet != nil {
// for _, bet := range u.TempLastTimeBet {
// bets = append(bets, bet...)
// }
// }
// rm.CheckAndBet(u, bets)
//}
//
//func (rm *ColorRoom) BetDouble(user inter.UserInetr) {
// u := rm.getUser(user)
// u.MutexBet.Lock()
// defer u.MutexBet.Unlock()
// if rm.checkNoBet() {
// log.Error(rm.Log("game bet status err ", rm.GetGameStatus()))
// model.SendBetFailMessageInetr(model.StatusError, user)
// return
// }
// // u := rm.getUser(user)
// var bets []*pb.ColorPinoyLiveBetReq
// if u.LastTimeBet != nil {
// for _, bet := range u.LastTimeBet {
// bets = append(bets, bet...)
// }
// // log.Debug("BetDouble 上次下注:", u.LastTimeBet, "bets:", bets)
// }
// if len(bets) > 1000 {
// log.Error(rm.Log("game bet status err ", rm.GetGameStatus()))
// model.SendBetFailMessageInetr(12, user)
// return
// }
//
// rm.CheckAndBet(u, bets)
//}
//
//func (rm *ColorRoom) OnUndoBet(buffer []byte, user inter.UserInetr) {
// u := rm.getUser(user)
// u.MutexBet.Lock()
// defer u.MutexBet.Unlock()
// if rm.checkNoBet() {
// log.Error(rm.Log("game bet status err:%v", rm.GetGameStatus()))
// model.SendBetFailMessageInetr(model.StatusError, user)
// return
// }
// reqInfo := &pb.ColorPinoyLiveC2SUndoBet{}
// err := proto.Unmarshal(buffer, reqInfo)
// if err != nil {
// log.Error(rm.Log("proto.Unmarshal err:%v", err))
// model.SendBetFailMessageInetr(model.DataErr, user)
// return
// }
// rm.UndoBet(u, reqInfo.UndoType)
//}
//
//// ApplyUseProps todo
//func (rm *ColorRoom) ApplyUseProps(buffer []byte, userInter inter.UserInetr) {
// applyInfo := new(pb.ColorPinoyLiveApplyPropsReq)
// err := proto.Unmarshal(buffer, applyInfo)
// user := rm.getUser(userInter)
// if err != nil {
// log.Error(rm.Log("proto.Unmarshal err:%v", err))
// model.SendBetFailMessage(model.DataErr, user)
// return
// }
// AcceptUser := rm.GetPlayer(applyInfo.AcceptUserId)
// if AcceptUser == nil {
// log.Error(rm.Log("AcceptUser is null"))
// model.SendBetFailMessage(model.UserNull, user)
// return
// }
// _, err = user.GetPropsReal(rm.RoomCfg.Prop, rm.Table, rm.RoomCfg)
// if err != nil {
// log.Error(rm.Log("GetPropsReal err", err))
// model.SendBetFailMessage(model.ScoreLess, user)
// return
// }
// leftCoins := user.Balance
// propsResp := &pb.ColorPinoyLivePlayerPropsResp{
// ApplyUserId: user.UserID,
// AcceptUserId: AcceptUser.UserID,
// PropsId: applyInfo.PropsId,
// Chips: leftCoins,
// }
// rm.Table.Broadcast(int32(pb.ColorPinoyLiveSendToClientMessageType_ColorPinoyLiveNoticePlayerUseProps), propsResp)
//}

View File

@ -1,68 +1,53 @@
package room
import (
"fmt"
"game/common/baseroom"
"game/common/proto/pb"
"github.com/fox/fox/log"
"github.com/fox/fox/processor"
"github.com/fox/fox/service"
"sync"
"time"
)
const (
BET_TYPE_NUM = 18
)
type ColorRoom struct {
*baseroom.BaseRoom[ColorSeat]
//---------------------------------
Status pb.ColorPinoyLiveGameStatus // 房间状态1 表示
StatusTime int64 // 切换状态时的时间戳
//Status pb.ColorPinoyLiveGameStatus // 房间状态1 表示
//StatusTime int64 // 切换状态时的时间戳
//
//NormalDices []byte // 普通骰子 3个
//StartDices []byte // 初始位置摆放的骰子 3个
//
//// DefaultLuckyDice byte // 幸运骰子 1个 每局开始 放在拉杆上的骰子
//// DefaultNormalDices []byte // 普通骰子 3个 每局开始 放在拉杆上的骰子
//
//TotalBets [BET_TYPE_NUM]int64 // 各区域的下注统计
//TotalBet int64 // 下注统计
////SceneInfo model.SceneInfo // 下注的玩家列表
//
//GameTrend *pb.ColorPinoyLiveTrend // 走势图
////OnlineUserList []*model.User // 所有的玩家列表 用于排序
//PokerMsg *pb.ColorPinoyLivePokerMsg // 扑克消息
//RoomCfg game.ColorRoomConfig // 房间配置
//GameTiming game.ColorGameTiming // 时间配置
//startAt int64
//endAt int64
//
//ServerStatus int32
//wd *sync.WaitGroup
//TrendRedisKey string
//_aniLuckyDiceRouteIndex int32 // 幸运骰子动画路径
//_aniThreeDiceRouteIndex int32 // 3个骰子动画路径
//BigWinner []*pb.ColorPinoyLiveBigWinner
//LiveMgr *LiveMgr
//dealerName []string // 主播名字
//betEndBetAreasOdds []*pb.ColorPinoyLiveGameBetAreaInfo // 下注结束后,每个区域更新是否爆奖
//afterBetAreaOdds []*pb.ColorPinoyLiveBetAreaOdd // 开奖后,更新每个区域的赔率(主要是单色投注区开奖后三个赔率变为1个赔率)
LuckyDice byte // 幸运骰子 1个
NormalDices []byte // 普通骰子 3个
StartDices []byte // 初始位置摆放的骰子 3个
ResultImgs []string // 结果图片
// DefaultLuckyDice byte // 幸运骰子 1个 每局开始 放在拉杆上的骰子
// DefaultNormalDices []byte // 普通骰子 3个 每局开始 放在拉杆上的骰子
TotalBets [config.BET_TYPE_NUM]int64 // 各区域的下注统计
TotalBet int64 // 下注统计
SceneInfo model.SceneInfo // 下注的玩家列表
GamePoker *model.GameDice // 管理一副牌
TimerJob *clock.Job // job
RobotCreateJob *clock.Job // job
RobotDeleteJob *clock.Job // job
// LuckyBetType int32 // 幸运区域
// LuckyMul int32 // 幸运倍率
// RobotTimerJob *clock.Job // 机器人job
// LastMasterBetType int32 // 最近一次神算子下注的类型
GameTrend *pb.ColorPinoyLiveTrend // 走势图
OnlineUserList []*model.User // 所有的玩家列表 用于排序
PokerMsg *pb.ColorPinoyLivePokerMsg // 扑克消息
RoomCfg *config.RoomConfig // 房间配置
Cfg *config.ColorPinoyLiveConfig // 房间配置
startAt int64
endAt int64
MutexData *sync.RWMutex
MutexStatus *sync.RWMutex
MutexUserList *sync.RWMutex
ServerStatus int32
wd *sync.WaitGroup
TrendRedisKey string
_aniLuckyDiceRouteIndex int32 // 幸运骰子动画路径
_aniThreeDiceRouteIndex int32 // 3个骰子动画路径
BigWinner []*pb.ColorPinoyLiveBigWinner
LiveMgr *LiveMgr
dealerName []string // 主播名字
betEndBetAreasOdds []*pb.ColorPinoyLiveGameBetAreaInfo // 下注结束后,每个区域更新是否爆奖
afterBetAreaOdds []*pb.ColorPinoyLiveBetAreaOdd // 开奖后,更新每个区域的赔率(主要是单色投注区开奖后三个赔率变为1个赔率)
jackpotMgr *jackpot.JackPotMgr
jackpotFunding int64 // 本局垫资
jackpotX int64 // 赎回比例
jackpotY int64 // 追加进
costJackpot int64 // 本局发下去的jackpot奖励回滚用
jackpotUser map[int64]int64 // 本局中jackpot的玩家用于kafka发送消息
}
func newColorRoom(id, roomType int, srv service.IService) (baseroom.IRoom, pb.ErrCode) {
@ -100,406 +85,327 @@ func (rm *ColorRoom) AddGold(user *ColorPlayer, add int64) (int64, bool) {
}
// ---------------------------------------------------------------------------------------------------
const (
BigWinnerCount = 6
GameName = "ColorPinoyLive"
)
func (rm *ColorRoom) SetGameStatus(status pb.ColorPinoyLiveGameStatus) {
rm.Status = status
rm.StatusTime = time.Now().UnixMilli()
log.Debug("设置房间状态:", status)
rm.SetLiveGameStatus([]int{1}...)
}
func (rm *ColorRoom) GetGameStatus() pb.ColorPinoyLiveGameStatus {
return rm.Status
}
func (rm *ColorRoom) UserOffline(user inter.UserInetr) {
_ = user
}
// 客户端显示赔率范围
func (rm *ColorRoom) MulRangeConfig() []*pb.BetAreaMulRangeConfig {
var mulRangeCfg []*pb.BetAreaMulRangeConfig
for pos, mul := range rm.Cfg.WinSingleColorMul {
if len(mul) > 0 {
mulRangeCfg = append(mulRangeCfg, &pb.BetAreaMulRangeConfig{
Pos: pb.ColorPinoyLiveBigBetAreaPos(pos),
MinMul: mul[0].Mul,
MaxMul: mul[len(mul)-1].Mul,
})
}
}
if len(rm.Cfg.WinDoubleColorMul) > 0 {
mul := rm.Cfg.WinDoubleColorMul
mulRangeCfg = append(mulRangeCfg, &pb.BetAreaMulRangeConfig{
Pos: pb.ColorPinoyLiveBigBetAreaPos_BBA_Double,
MinMul: mul[0].Mul,
MaxMul: mul[0].Mul,
})
}
if len(rm.Cfg.WinThreeColorMul) > 0 {
mul := rm.Cfg.WinThreeColorMul
mulRangeCfg = append(mulRangeCfg, &pb.BetAreaMulRangeConfig{
Pos: pb.ColorPinoyLiveBigBetAreaPos_BBA_Three,
MinMul: mul[0].Mul,
MaxMul: mul[0].Mul,
})
}
if len(mulRangeCfg) != len(pb.ColorPinoyLiveBigBetAreaPos_name) {
log.Error(rm.Log(("配置错误")))
return nil
}
for pos, v := range mulRangeCfg {
log.Debug(rm.Log("pos:%v 赔率区间:%v-%v", pos, v.MinMul, v.MaxMul))
}
return mulRangeCfg
}
func (rm *ColorRoom) InitBigOddsBetAreas() {
if len(rm.betEndBetAreasOdds) == 0 {
rm.betEndBetAreasOdds = make([]*pb.ColorPinoyLiveGameBetAreaInfo, 0, len(pb.ColorPinoyLiveBetTypeJP_name))
}
rm.betEndBetAreasOdds = rm.betEndBetAreasOdds[0:0]
for betType := 0; betType < config.BET_TYPE_NUM; betType++ {
rm.betEndBetAreasOdds = append(rm.betEndBetAreasOdds, &pb.ColorPinoyLiveGameBetAreaInfo{
BetType: pb.ColorPinoyLiveBetTypeJP(betType),
BetChipsInfo: nil,
IsWin: 0,
Odd: nil,
IsBigOdd: false,
BigSingleColorOddPos: 0,
})
}
for pos, betArea := range rm.betEndBetAreasOdds {
betArea.IsBigOdd = false
index := pos / int(pb.ColorPinoyLiveDiceColorType_ColorPinoyLiveType_GREEN)
if index == 0 {
betArea.BigSingleColorOddPos = pb.ColorPinoyLiveBigBetAreaPos_BBA_Single_0
var mulRangeW []*MulRangeW
begin := 0
for _, mul := range rm.Cfg.WinSingleColorMul[0] {
mulRangeW = append(mulRangeW, &MulRangeW{MulRate: mul, ColorPos: pb.ColorPinoyLiveBigBetAreaPos(pos), MinW: begin, MaxW: begin + mul.Rate})
begin += mul.Rate
}
rdv := rand.RandInt(mulRangeW[0].MinW, mulRangeW[len(mulRangeW)-1].MaxW)
singleMul := rm.Cfg.WinSingleColorMul[0][0].Mul
for _, mul := range mulRangeW {
if rdv < mul.MinW || rdv >= mul.MaxW {
continue
}
singleMul = mul.Mul
break
}
log.Debug(rm.Log("单色区域基础权重区间:[%v,%v],随机数:%v 基础赔率:%v", mulRangeW[0].MinW, mulRangeW[len(mulRangeW)-1].MaxW, rdv, singleMul))
betArea.Odd = append(betArea.Odd, singleMul)
betArea.Odd = append(betArea.Odd, rm.Cfg.WinSingleColorMul[1][0].Mul)
betArea.Odd = append(betArea.Odd, rm.Cfg.WinSingleColorMul[2][0].Mul)
} else if index == 1 {
betArea.BigSingleColorOddPos = pb.ColorPinoyLiveBigBetAreaPos_BBA_Double
betArea.Odd = append(betArea.Odd, rm.Cfg.WinDoubleColorMul[0].Mul)
} else {
betArea.BigSingleColorOddPos = pb.ColorPinoyLiveBigBetAreaPos_BBA_Three
betArea.Odd = append(betArea.Odd, rm.Cfg.WinThreeColorMul[0].Mul)
}
}
for _, betArea := range rm.betEndBetAreasOdds {
log.Debug(rm.Log("初始化投注区域:%v 倍率:%v 是否爆奖:%v 是否jackpot:%v", betArea.BetType, betArea.Odd, betArea.IsBigOdd, betArea.IsJackpot))
}
}
func (rm *ColorRoom) Log(format string, args ...any) string {
s := fmt.Sprintf(format, args...)
head := fmt.Sprintf("gameno:%v ", rm.Table.GetGameRoundId())
return head + s
}
func (rm *ColorRoom) LogEx(user *model.User, format string, args ...any) string {
s := fmt.Sprintf(format, args...)
head := fmt.Sprintf("gameno:%v user:%v", rm.Table.GetGameRoundId(), user.UserID)
return head + s
}
func (rm *ColorRoom) InitTableFrameSink(table inter.TableInter) inter.LiveRoomInter {
room := new(ColorPinoyLiveGame)
room.Table = table
room.OnlineUserList = make([]*model.User, 0)
room.SceneInfo.Init()
room.PokerMsg = new(pb.ColorPinoyLivePokerMsg)
// room.PokerMsg.LongPoker = make([]int32, 1)
// room.PokerMsg.HuPoker = make([]int32, 1)
room.MutexData = new(sync.RWMutex)
room.MutexStatus = new(sync.RWMutex)
room.MutexUserList = new(sync.RWMutex)
room.GamePoker = new(model.GameDice)
room.wd = new(sync.WaitGroup)
room.GamePoker.InitPoker()
room.NormalDices = make([]byte, 3)
// room.DefaultNormalDices = make([]byte, 3)
room.GameTrend = new(pb.ColorPinoyLiveTrend)
room.GameTrend.ListTrendGroup = []*pb.ColorPinoyLiveTrendGroup{}
room.GameRoundStart()
room.InitWinTrend()
room.LiveMgr = NewLiveMgr()
room.InitBigOddsBetAreas()
room.jackpotMgr = jackpot.NewJackPotMgr()
// room.jackpotMgr.Load(room.RoomCfg.ColorPinoyLiveConfig.InitJackpot)
table.BindGame(room)
return room
}
func (rm *ColorRoom) ResetConfigPrivate() bool {
rm.RoomCfg = config.ResetConfigPrivate()
rm.Cfg = &rm.RoomCfg.ColorPinoyLiveConfig
return true
}
func (rm *ColorRoom) GetPlayer(userid int64) *model.User {
user, ok := rm.AllUserList.Load(userid)
if !ok {
return nil
}
player, ok := user.(*model.User)
if !ok {
return nil
}
return player
}
func (rm *ColorRoom) AddPlayer(player *model.User) {
rm.AllUserList.Store(player.UserInetr.GetId(), player)
rm.MutexUserList.Lock()
rm.OnlineUserList = append(rm.OnlineUserList, player)
rm.MutexUserList.Unlock()
}
type TraverseFunc func(v *model.User) bool
func (rm *ColorRoom) Traverse(f TraverseFunc) {
function := func(key, value interface{}) bool {
if value != nil {
us, ok := value.(*model.User)
if !ok {
log.Warn("user is not *UserInetr")
} else {
return f(us)
}
}
return true
}
rm.AllUserList.Range(function)
}
func (rm *ColorRoom) TraverseRobotNum(num int, f TraverseFunc) {
curNum := 0
function := func(key, value interface{}) bool {
if value != nil {
us, ok := value.(*model.User)
if !ok {
log.Warn("user is not *UserInetr")
} else if us.IsRobot {
curNum++
f(us)
}
}
if num > 0 && curNum == num {
return false
}
return true
}
rm.AllUserList.Range(function)
}
func (rm *ColorRoom) DeletePlayer(uid int64) {
p := rm.GetPlayer(uid)
if p != nil {
rm.AllUserList.Delete(uid)
rm.DeleteExitUserFromOnlineUserListSlice(p)
}
}
func (rm *ColorRoom) getUserLen() int64 {
len1 := int64(0)
rm.Traverse(func(v *model.User) bool {
len1++
return true
})
return len1
}
func (rm *ColorRoom) getUserAndRobotLen() (userNum, robotNum int64) {
rm.Traverse(func(v *model.User) bool {
if v.IsRobot {
robotNum++
} else {
userNum++
}
return true
})
return
}
func (rm *ColorRoom) UserReady(user inter.UserInetr) bool {
_ = user
return true
}
// 用户坐下
func (rm *ColorRoom) OnActionUserSitDown(user inter.UserInetr, chairId int, config string) int {
_ = chairId
_ = config
u := rm.getUser(user)
// log.Debug("玩家坐下...OnActionUserSitDown:", u, chairId, config)
go rm.SceneUserSitDown(u)
return 1 // business.OnActionUserSitDownHandler()
}
func (rm *ColorRoom) UserExit(user inter.UserInetr) bool {
u := rm.getUser(user)
// 有下注时不让玩家离开
if u.TotalBet != 0 {
return false
}
rm.KickOutUser(u)
return true
}
func (rm *ColorRoom) LeaveGame(user inter.UserInetr) bool {
u := rm.getUser(user)
if u.TotalBet != 0 {
// msg := new(pb.KickOutUserMsg)
// msg.KickOutReason = "游戏中不能退出!"
// u.SendMsg(int32(pb.SendToClientMessageType_NoticeExitRet), msg)
return false
}
rm.KickOutUser(u)
return true
}
// 游戏消息
func (rm *ColorRoom) OnGameMessage(subCmd int32, buffer []byte, user inter.UserInetr) {
// log.Debug("收到客户端消息:", subCmd)
switch pb.ColorPinoyLiveReceiveFromClientMessageType(subCmd) {
case pb.ColorPinoyLiveReceiveFromClientMessageType_ColorPinoyLiveApplyRefresh:
rm.GameSync(user)
case pb.ColorPinoyLiveReceiveFromClientMessageType_ColorPinoyLiveApplyBetChips:
monitor.GoSafe(rm.Bet, buffer, user)
case pb.ColorPinoyLiveReceiveFromClientMessageType_ColorPinoyLiveApplyGetUserListInfo:
monitor.GoSafe(rm.SendUserListInfo, user)
case pb.ColorPinoyLiveReceiveFromClientMessageType_ColorPinoyLiveApplyGetTrend:
monitor.GoSafe(rm.SendTrend, user)
case pb.ColorPinoyLiveReceiveFromClientMessageType_ColorPinoyLiveApplyBetAgain:
// go rm.AgainBet(user)
monitor.GoSafe(rm.AgainBet, user)
case pb.ColorPinoyLiveReceiveFromClientMessageType_ColorPinoyLiveApplyBetDouble:
monitor.GoSafe(rm.BetDouble, user)
case pb.ColorPinoyLiveReceiveFromClientMessageType_ColorPinoyLiveApplyUndoBet:
monitor.GoSafe(rm.OnUndoBet, buffer, user)
case pb.ColorPinoyLiveReceiveFromClientMessageType_ColorPinoyLiveApplyUseProps:
monitor.GoSafe(rm.ApplyUseProps, buffer, user)
case pb.ColorPinoyLiveReceiveFromClientMessageType_ColorPinoyLiveApplyLeave:
monitor.GoSafe(rm.ApplyLeave, buffer, user)
}
}
func (rm *ColorRoom) initDefaultDiceGameRoundReady() {
// rm.DefaultLuckyDice = rm.GamePoker.ShuffleDices(1)[0]
//
// rm.DefaultNormalDices[0] = rm.GamePoker.ShuffleDices(1)[0]
// rm.DefaultNormalDices[1] = rm.GamePoker.ShuffleDices(1)[0]
// rm.DefaultNormalDices[2] = rm.GamePoker.ShuffleDices(1)[0]
}
// 开lucky dice
func (rm *ColorRoom) OpenLuckyDice() {
dealDice := rm.GetPairDice(1, 0, 1)
if dealDice == nil || len(dealDice) < 1 {
rm.LuckyDice = rm.GamePoker.ShuffleDices(1)[0]
} else {
deck := model.GetInitialDeck()
rm.LuckyDice = deck[dealDice[0]-1]
}
}
// 开3个普通 dice
func (rm *ColorRoom) OpenThreeDice() {
dealDice := rm.GetPairDice(3, 1, 4)
if dealDice == nil || len(dealDice) < 3 {
rm.NormalDices[0] = rm.GamePoker.ShuffleDices(1)[0]
rm.NormalDices[1] = rm.GamePoker.ShuffleDices(1)[0]
rm.NormalDices[2] = rm.GamePoker.ShuffleDices(1)[0]
} else {
deck := model.GetInitialDeck()
rm.NormalDices[0] = deck[dealDice[0]-1]
rm.NormalDices[1] = deck[dealDice[1]-1]
rm.NormalDices[2] = deck[dealDice[2]-1]
}
}
func (rm *ColorRoom) getUser(user inter.UserInetr) *model.User {
// u, ok := rm.AllUserList[user.GetId()]
u := rm.GetPlayer(user.GetId())
if u == nil {
u = new(model.User)
u.UserID = user.GetId()
u.UserInetr = user
u.Balance = user.GetScore()
u.Carry = user.GetCarry()
u.Time = time.Now().UnixNano() / 1e6
u.UserInetr = user
rm.AddPlayer(u)
u.ResetUserData()
}
return u
}
func (rm *ColorRoom) getRobotUser(user inter.UserInetr) *model.User {
// u, ok := rm.AllUserList[user.GetId()]
u := rm.GetPlayer(user.GetId())
if u == nil {
u = new(model.User)
u.UserID = user.GetId()
u.UserInetr = user
u.Balance = user.GetScore()
u.Carry = user.GetCarry()
u.Time = time.Now().UnixNano() / 1e6
u.UserInetr = user
u.IsRobot = true
rm.AddPlayer(u)
u.ResetUserData()
}
return u
}
// 游戏开始入口.....
func (rm *ColorRoom) GameStart() bool {
if rm.GetGameStatus() == 0 {
rm.Ready()
rm.SyncServerMaintenance(0, "")
_ = rm.LiveDelayUpdate()
// 防止卡房间
rm.Table.AddTimerRepeat(60, 0, func() {
if rm.LiveMgr.MaintenanceStatus == 1 {
rm.Table.EndGame()
}
})
} else if rm.TimerJob != nil {
}
return true
}
func (rm *ColorRoom) GameRoundStart() {
rm.RoomCfg = config.ResetConfig()
rm.Cfg = &rm.RoomCfg.ColorPinoyLiveConfig
rm.ServerStatus = gconfig.GConfig.GServConfig.Status
}
func (rm *ColorRoom) ResetTable() {
rm.SetGameStatus(0)
}
// 关闭桌子
func (rm *ColorRoom) CloseTable() {
}
//
//const (
// BigWinnerCount = 6
// GameName = "ColorPinoyLive"
//)
//
//func (rm *ColorRoom) SetGameStatus(status pb.ColorPinoyLiveGameStatus) {
// rm.Status = status
// rm.StatusTime = time.Now().UnixMilli()
// log.DebugF(rm.Log("设置房间状态:%v", status))
//}
//func (rm *ColorRoom) GetGameStatus() pb.ColorPinoyLiveGameStatus {
// return rm.Status
//}
//
//// 客户端显示赔率范围
//func (rm *ColorRoom) MulRangeConfig() []*pb.BetAreaMulRangeConfig {
// var mulRangeCfg []*pb.BetAreaMulRangeConfig
// for pos, mul := range rm.RoomCfg.WinSingleColorMul {
// if len(mul) > 0 {
// mulRangeCfg = append(mulRangeCfg, &pb.BetAreaMulRangeConfig{
// Pos: pb.ColorPinoyLiveBigBetAreaPos(pos),
// MinMul: mul[0].Mul,
// MaxMul: mul[len(mul)-1].Mul,
// })
// }
// }
// if len(rm.RoomCfg.WinDoubleColorMul) > 0 {
// mul := rm.RoomCfg.WinDoubleColorMul
// mulRangeCfg = append(mulRangeCfg, &pb.BetAreaMulRangeConfig{
// Pos: pb.ColorPinoyLiveBigBetAreaPos_BBA_Double,
// MinMul: mul[0].Mul,
// MaxMul: mul[0].Mul,
// })
// }
// if len(rm.RoomCfg.WinThreeColorMul) > 0 {
// mul := rm.RoomCfg.WinThreeColorMul
// mulRangeCfg = append(mulRangeCfg, &pb.BetAreaMulRangeConfig{
// Pos: pb.ColorPinoyLiveBigBetAreaPos_BBA_Three,
// MinMul: mul[0].Mul,
// MaxMul: mul[0].Mul,
// })
// }
// if len(mulRangeCfg) != len(pb.ColorPinoyLiveBigBetAreaPos_name) {
// log.Error(rm.Log(("配置错误")))
// return nil
// }
// for pos, v := range mulRangeCfg {
// log.Debug(rm.Log("pos:%v 赔率区间:%v-%v", pos, v.MinMul, v.MaxMul))
// }
// return mulRangeCfg
//}
//
//func (rm *ColorRoom) InitBigOddsBetAreas() {
// if len(rm.betEndBetAreasOdds) == 0 {
// rm.betEndBetAreasOdds = make([]*pb.ColorPinoyLiveGameBetAreaInfo, 0, len(pb.ColorPinoyLiveBetTypeJP_name))
// }
// rm.betEndBetAreasOdds = rm.betEndBetAreasOdds[0:0]
// for betType := 0; betType < BET_TYPE_NUM; betType++ {
// rm.betEndBetAreasOdds = append(rm.betEndBetAreasOdds, &pb.ColorPinoyLiveGameBetAreaInfo{
// BetType: pb.ColorPinoyLiveBetTypeJP(betType),
// BetChipsInfo: nil,
// IsWin: 0,
// Odd: nil,
// IsBigOdd: false,
// BigSingleColorOddPos: 0,
// })
// }
// for pos, betArea := range rm.betEndBetAreasOdds {
// betArea.IsBigOdd = false
// index := pos / int(pb.ColorPinoyLiveDiceColorType_ColorPinoyLiveType_GREEN)
// if index == 0 {
// betArea.BigSingleColorOddPos = pb.ColorPinoyLiveBigBetAreaPos_BBA_Single_0
// var mulRangeW []*MulRangeW
// begin := 0
// for _, mul := range rm.RoomCfg.WinSingleColorMul[0] {
// mulRangeW = append(mulRangeW, &MulRangeW{MulRate: mul, ColorPos: pb.ColorPinoyLiveBigBetAreaPos(pos), MinW: begin, MaxW: begin + mul.Rate})
// begin += mul.Rate
// }
// rdv := xrand.RandRange[int](mulRangeW[0].MinW, mulRangeW[len(mulRangeW)-1].MaxW)
// singleMul := rm.Cfg.WinSingleColorMul[0][0].Mul
// for _, mul := range mulRangeW {
// if rdv < mul.MinW || rdv >= mul.MaxW {
// continue
// }
// singleMul = mul.Mul
// break
// }
// log.Debug(rm.Log("单色区域基础权重区间:[%v,%v],随机数:%v 基础赔率:%v", mulRangeW[0].MinW, mulRangeW[len(mulRangeW)-1].MaxW, rdv, singleMul))
// betArea.Odd = append(betArea.Odd, singleMul)
// betArea.Odd = append(betArea.Odd, rm.Cfg.WinSingleColorMul[1][0].Mul)
// betArea.Odd = append(betArea.Odd, rm.Cfg.WinSingleColorMul[2][0].Mul)
// } else if index == 1 {
// betArea.BigSingleColorOddPos = pb.ColorPinoyLiveBigBetAreaPos_BBA_Double
// betArea.Odd = append(betArea.Odd, rm.Cfg.WinDoubleColorMul[0].Mul)
// } else {
// betArea.BigSingleColorOddPos = pb.ColorPinoyLiveBigBetAreaPos_BBA_Three
// betArea.Odd = append(betArea.Odd, rm.Cfg.WinThreeColorMul[0].Mul)
// }
// }
// for _, betArea := range rm.betEndBetAreasOdds {
// log.Debug(rm.Log("初始化投注区域:%v 倍率:%v 是否爆奖:%v 是否jackpot:%v", betArea.BetType, betArea.Odd, betArea.IsBigOdd, betArea.IsJackpot))
// }
//}
//
//func (rm *ColorRoom) Log(format string, args ...any) string {
// s := fmt.Sprintf(format, args...)
// head := fmt.Sprintf("gameno:%v ", rm.Table.GetGameRoundId())
// return head + s
//}
//
//func (rm *ColorRoom) LogEx(user *model.User, format string, args ...any) string {
// s := fmt.Sprintf(format, args...)
// head := fmt.Sprintf("gameno:%v user:%v", rm.Table.GetGameRoundId(), user.UserID)
// return head + s
//}
//
//
//func (rm *ColorRoom) ResetConfigPrivate() bool {
// rm.RoomCfg = config.ResetConfigPrivate()
// rm.Cfg = &rm.RoomCfg.ColorPinoyLiveConfig
// return true
//}
//func (rm *ColorRoom) GetPlayer(userid int64) *model.User {
// user, ok := rm.AllUserList.Load(userid)
// if !ok {
// return nil
// }
// player, ok := user.(*model.User)
// if !ok {
// return nil
// }
// return player
//}
//func (rm *ColorRoom) AddPlayer(player *model.User) {
// rm.AllUserList.Store(player.UserInetr.GetId(), player)
// rm.MutexUserList.Lock()
// rm.OnlineUserList = append(rm.OnlineUserList, player)
// rm.MutexUserList.Unlock()
//}
//
//type TraverseFunc func(v *model.User) bool
//
//func (rm *ColorRoom) Traverse(f TraverseFunc) {
// function := func(key, value interface{}) bool {
// if value != nil {
// us, ok := value.(*model.User)
// if !ok {
// log.Warn("user is not *UserInetr")
// } else {
// return f(us)
// }
// }
// return true
// }
// rm.AllUserList.Range(function)
//}
//
//
//func (rm *ColorRoom) DeletePlayer(uid int64) {
// p := rm.GetPlayer(uid)
// if p != nil {
// rm.AllUserList.Delete(uid)
// rm.DeleteExitUserFromOnlineUserListSlice(p)
// }
//}
//
//
//
//
//
//func (rm *ColorRoom) UserExit(user inter.UserInetr) bool {
// u := rm.getUser(user)
// // 有下注时不让玩家离开
// if u.TotalBet != 0 {
// return false
// }
// rm.KickOutUser(u)
// return true
//}
//func (rm *ColorRoom) LeaveGame(user inter.UserInetr) bool {
// u := rm.getUser(user)
// if u.TotalBet != 0 {
// // msg := new(pb.KickOutUserMsg)
// // msg.KickOutReason = "游戏中不能退出!"
// // u.SendMsg(int32(pb.SendToClientMessageType_NoticeExitRet), msg)
// return false
// }
//
// rm.KickOutUser(u)
// return true
//}
//
//// 游戏消息
//func (rm *ColorRoom) OnGameMessage(subCmd int32, buffer []byte, user inter.UserInetr) {
// // log.Debug("收到客户端消息:", subCmd)
// switch pb.ColorPinoyLiveReceiveFromClientMessageType(subCmd) {
// case pb.ColorPinoyLiveReceiveFromClientMessageType_ColorPinoyLiveApplyRefresh:
// rm.GameSync(user)
// case pb.ColorPinoyLiveReceiveFromClientMessageType_ColorPinoyLiveApplyBetChips:
// monitor.GoSafe(rm.Bet, buffer, user)
// case pb.ColorPinoyLiveReceiveFromClientMessageType_ColorPinoyLiveApplyGetUserListInfo:
// monitor.GoSafe(rm.SendUserListInfo, user)
// case pb.ColorPinoyLiveReceiveFromClientMessageType_ColorPinoyLiveApplyGetTrend:
// monitor.GoSafe(rm.SendTrend, user)
// case pb.ColorPinoyLiveReceiveFromClientMessageType_ColorPinoyLiveApplyBetAgain:
// // go rm.AgainBet(user)
// monitor.GoSafe(rm.AgainBet, user)
// case pb.ColorPinoyLiveReceiveFromClientMessageType_ColorPinoyLiveApplyBetDouble:
// monitor.GoSafe(rm.BetDouble, user)
// case pb.ColorPinoyLiveReceiveFromClientMessageType_ColorPinoyLiveApplyUndoBet:
// monitor.GoSafe(rm.OnUndoBet, buffer, user)
// case pb.ColorPinoyLiveReceiveFromClientMessageType_ColorPinoyLiveApplyUseProps:
// monitor.GoSafe(rm.ApplyUseProps, buffer, user)
// case pb.ColorPinoyLiveReceiveFromClientMessageType_ColorPinoyLiveApplyLeave:
// monitor.GoSafe(rm.ApplyLeave, buffer, user)
// }
//}
//
//func (rm *ColorRoom) initDefaultDiceGameRoundReady() {
// // rm.DefaultLuckyDice = rm.GamePoker.ShuffleDices(1)[0]
// //
// // rm.DefaultNormalDices[0] = rm.GamePoker.ShuffleDices(1)[0]
// // rm.DefaultNormalDices[1] = rm.GamePoker.ShuffleDices(1)[0]
// // rm.DefaultNormalDices[2] = rm.GamePoker.ShuffleDices(1)[0]
//}
//
//// 开lucky dice
//func (rm *ColorRoom) OpenLuckyDice() {
//
// dealDice := rm.GetPairDice(1, 0, 1)
//
// if dealDice == nil || len(dealDice) < 1 {
// rm.LuckyDice = rm.GamePoker.ShuffleDices(1)[0]
// } else {
// deck := model.GetInitialDeck()
// rm.LuckyDice = deck[dealDice[0]-1]
// }
//}
//
//// 开3个普通 dice
//func (rm *ColorRoom) OpenThreeDice() {
//
// dealDice := rm.GetPairDice(3, 1, 4)
// if dealDice == nil || len(dealDice) < 3 {
// rm.NormalDices[0] = rm.GamePoker.ShuffleDices(1)[0]
// rm.NormalDices[1] = rm.GamePoker.ShuffleDices(1)[0]
// rm.NormalDices[2] = rm.GamePoker.ShuffleDices(1)[0]
// } else {
// deck := model.GetInitialDeck()
// rm.NormalDices[0] = deck[dealDice[0]-1]
// rm.NormalDices[1] = deck[dealDice[1]-1]
// rm.NormalDices[2] = deck[dealDice[2]-1]
// }
//}
//
//func (rm *ColorRoom) getUser(user inter.UserInetr) *model.User {
// // u, ok := rm.AllUserList[user.GetId()]
// u := rm.GetPlayer(user.GetId())
// if u == nil {
// u = new(model.User)
// u.UserID = user.GetId()
// u.UserInetr = user
// u.Balance = user.GetScore()
// u.Carry = user.GetCarry()
// u.Time = time.Now().UnixNano() / 1e6
// u.UserInetr = user
// rm.AddPlayer(u)
// u.ResetUserData()
// }
//
// return u
//}
//
//func (rm *ColorRoom) getRobotUser(user inter.UserInetr) *model.User {
// // u, ok := rm.AllUserList[user.GetId()]
// u := rm.GetPlayer(user.GetId())
// if u == nil {
// u = new(model.User)
// u.UserID = user.GetId()
// u.UserInetr = user
// u.Balance = user.GetScore()
// u.Carry = user.GetCarry()
// u.Time = time.Now().UnixNano() / 1e6
// u.UserInetr = user
// u.IsRobot = true
// rm.AddPlayer(u)
// u.ResetUserData()
// }
//
// return u
//}
//
//// 游戏开始入口.....
//func (rm *ColorRoom) GameStart() bool {
// if rm.GetGameStatus() == 0 {
// rm.Ready()
// rm.SyncServerMaintenance(0, "")
// _ = rm.LiveDelayUpdate()
// // 防止卡房间
// rm.Table.AddTimerRepeat(60, 0, func() {
// if rm.LiveMgr.MaintenanceStatus == 1 {
// rm.Table.EndGame()
// }
// })
// } else if rm.TimerJob != nil {
// }
//
// return true
//}
//
//func (rm *ColorRoom) GameRoundStart() {
// rm.RoomCfg = config.ResetConfig()
// rm.Cfg = &rm.RoomCfg.ColorPinoyLiveConfig
// rm.ServerStatus = gconfig.GConfig.GServConfig.Status
//}
//
//func (rm *ColorRoom) ResetTable() {
// rm.SetGameStatus(0)
//}
//
//// 关闭桌子
//func (rm *ColorRoom) CloseTable() {
//}

File diff suppressed because it is too large Load Diff

View File

@ -1,117 +1,118 @@
package room
import (
"encoding/json"
"game/common/proto/pb"
"github.com/fox/fox/ipb"
"time"
)
func (rm *ColorRoom) Ready() {
rm.Table.ResetGameRoundId()
rm.ResetData(true)
rm.Table.EndGame()
if isFunding := rm.jackpotMgr.Load(rm.RoomCfg.ColorPinoyLiveConfig.InitJackpot); isFunding {
rm.kafkaJackpotFunding(rm.RoomCfg.ColorPinoyLiveConfig.InitJackpot)
rm.jackpotFunding = rm.RoomCfg.ColorPinoyLiveConfig.InitJackpot
log.Debugf(rm.Log("发生垫资:%v", rm.jackpotFunding))
} else {
rm.jackpotFunding = 0
log.Debugf(rm.Log("没有垫资"))
}
rm.jackpotUser = nil
rm.costJackpot = 0
log.Debugf(rm.Log("游戏开始costJackpot重置为0"))
rm.SetGameStatus(pb.ColorPinoyLiveGameStatus_ColorPinoyLiveStartReady)
rm.TimerJob, _ = rm.Table.AddTimer(time.Duration(rm.RoomCfg.TimeConf.Readymove), func() {
rm.Start()
})
// 初始化默认骰子
// rm.initDefaultDiceGameRoundReady()
// 开始动画消息
msg := new(pb.ColorPinoyLiveStatusMessage)
msg.Status = int32(rm.GetGameStatus())
msg.StatusTime = int32(rm.RoomCfg.TimeConf.Startmove)
msg.Jackpot = rm.jackpotMgr.GetJackpot()
rm.Table.Broadcast(int32(pb.ColorPinoyLiveSendToClientMessageType_ColorPinoyLiveNoticeGameReady), msg)
}
func (rm *ColorRoom) Start() {
rm.GameRoundStart()
rm.InitBigOddsBetAreas()
// 推送房间筹码选择规则
rm.SendRuleInfo()
rm.checkUserBet()
// 选择列表中前6个用户上座
rm.SelectUserListBalanceTopSitDownChair()
rm.startAt = time.Now().Unix()
rm.Table.StartGame()
// 开始动画消息
msg := new(pb.ColorPinoyLiveStatusMessage)
msg.Status = int32(rm.GetGameStatus())
msg.StatusTime = int32(rm.RoomCfg.TimeConf.Startmove)
// rm.jackpotMgr.Load(rm.Cfg.InitJackpot)
msg.Jackpot = rm.jackpotMgr.GetJackpot()
rm.Table.Broadcast(int32(pb.ColorPinoyLiveSendToClientMessageType_ColorPinoyLiveNoticeGameStart), msg)
}
func (rm *ColorRoom) StartBet() {
rm.SetGameStatus(pb.ColorPinoyLiveGameStatus_ColorPinoyLiveBetStatus)
rm.TimerJob, _ = rm.Table.AddTimer(time.Duration(rm.RoomCfg.TimeConf.Startbet), func() {
rm.EndBet()
})
// 发送开始下注消息
msg := new(pb.ColorPinoyLiveStatusMessage)
msg.Status = int32(rm.GetGameStatus())
msg.StatusTime = int32(rm.RoomCfg.TimeConf.Startbet)
msg.Jackpot = rm.jackpotMgr.GetJackpot()
rm.Table.Broadcast(int32(pb.ColorPinoyLiveSendToClientMessageType_ColorPinoyLiveNoticeGameStartBet), msg)
// log.Debug("pb. 开始下注.....StartBet()")
}
func (rm *ColorRoom) EndBet() {
rm.SetGameStatus(pb.ColorPinoyLiveGameStatus_ColorPinoyLiveEndBetMovie)
// 停止下注就扣钱
rm.StartTransInoutBet()
// 发送停止下注消息
msg := new(pb.ColorPinoyLiveStatusMessage)
msg.Status = int32(rm.GetGameStatus())
msg.StatusTime = int32(rm.RoomCfg.TimeConf.Endmove)
msg.Jackpot = rm.jackpotMgr.GetJackpot()
rm.Table.Broadcast(int32(pb.ColorPinoyLiveSendToClientMessageType_ColorPinoyLiveNoticeGameEndBet), msg)
// log.Debug("pb. 停止下注.....EndBet()")
}
// 开3个 dice
func (rm *ColorRoom) openThreeDice() {
// log.Debug("aabb openThreeDice")
rm.SetGameStatus(pb.ColorPinoyLiveGameStatus_ColorPinoyLiveOpenThreeDice)
rm.Table.AddTimer(time.Duration(rm.RoomCfg.TimeConf.OpenThreeDice), func() {
// log.Debug("aabb settle")
rm.CompareDiceResult()
rm.Settle()
})
// 发送开三个骰子消息
rm._aniThreeDiceRouteIndex = int32(rand.RandIntM(0, 48))
msg := new(pb.ColorPinoyLiveGameOpenThreeDice)
msg.Status = int32(rm.GetGameStatus())
msg.AniRouteIndex = rm._aniThreeDiceRouteIndex // 掉落路径
for _, dice := range rm.NormalDices {
msg.Color = append(msg.Color, pb.ColorPinoyLiveDiceColorType(model.GetColor(dice)))
}
rm.Table.Broadcast(int32(pb.ColorPinoyLiveSendToClientMessageType_ColorPinoyLiveNoticeGameOpenThreeDice), msg)
}
// 结算
func (rm *ColorRoom) Settle() {
// log.Debug("aabb 结算")
rm.SetGameStatus(pb.ColorPinoyLiveGameStatus_ColorPinoyLiveSettleStatus)
rm.endAt = time.Now().Unix()
rm.SetUserSettleMsg()
}
//
//import (
// "encoding/json"
// "game/common/proto/pb"
// "github.com/fox/fox/ipb"
// "time"
//)
//
//func (rm *ColorRoom) Ready() {
// rm.Table.ResetGameRoundId()
// rm.ResetData(true)
// rm.Table.EndGame()
//
// if isFunding := rm.jackpotMgr.Load(rm.RoomCfg.ColorPinoyLiveConfig.InitJackpot); isFunding {
// rm.kafkaJackpotFunding(rm.RoomCfg.ColorPinoyLiveConfig.InitJackpot)
// rm.jackpotFunding = rm.RoomCfg.ColorPinoyLiveConfig.InitJackpot
// log.Debugf(rm.Log("发生垫资:%v", rm.jackpotFunding))
// } else {
// rm.jackpotFunding = 0
// log.Debugf(rm.Log("没有垫资"))
// }
// rm.jackpotUser = nil
// rm.costJackpot = 0
// log.Debugf(rm.Log("游戏开始costJackpot重置为0"))
// rm.SetGameStatus(pb.ColorPinoyLiveGameStatus_ColorPinoyLiveStartReady)
// rm.TimerJob, _ = rm.Table.AddTimer(time.Duration(rm.RoomCfg.TimeConf.Readymove), func() {
// rm.Start()
// })
//
// // 初始化默认骰子
// // rm.initDefaultDiceGameRoundReady()
// // 开始动画消息
// msg := new(pb.ColorPinoyLiveStatusMessage)
// msg.Status = int32(rm.GetGameStatus())
// msg.StatusTime = int32(rm.RoomCfg.TimeConf.Startmove)
// msg.Jackpot = rm.jackpotMgr.GetJackpot()
// rm.Table.Broadcast(int32(pb.ColorPinoyLiveSendToClientMessageType_ColorPinoyLiveNoticeGameReady), msg)
//}
//
//func (rm *ColorRoom) Start() {
// rm.GameRoundStart()
// rm.InitBigOddsBetAreas()
// // 推送房间筹码选择规则
// rm.SendRuleInfo()
// rm.checkUserBet()
// // 选择列表中前6个用户上座
// rm.SelectUserListBalanceTopSitDownChair()
// rm.startAt = time.Now().Unix()
// rm.Table.StartGame()
// // 开始动画消息
// msg := new(pb.ColorPinoyLiveStatusMessage)
// msg.Status = int32(rm.GetGameStatus())
// msg.StatusTime = int32(rm.RoomCfg.TimeConf.Startmove)
// // rm.jackpotMgr.Load(rm.Cfg.InitJackpot)
// msg.Jackpot = rm.jackpotMgr.GetJackpot()
// rm.Table.Broadcast(int32(pb.ColorPinoyLiveSendToClientMessageType_ColorPinoyLiveNoticeGameStart), msg)
//}
//
//func (rm *ColorRoom) StartBet() {
// rm.SetGameStatus(pb.ColorPinoyLiveGameStatus_ColorPinoyLiveBetStatus)
// rm.TimerJob, _ = rm.Table.AddTimer(time.Duration(rm.RoomCfg.TimeConf.Startbet), func() {
// rm.EndBet()
// })
//
// // 发送开始下注消息
// msg := new(pb.ColorPinoyLiveStatusMessage)
// msg.Status = int32(rm.GetGameStatus())
// msg.StatusTime = int32(rm.RoomCfg.TimeConf.Startbet)
// msg.Jackpot = rm.jackpotMgr.GetJackpot()
// rm.Table.Broadcast(int32(pb.ColorPinoyLiveSendToClientMessageType_ColorPinoyLiveNoticeGameStartBet), msg)
// // log.Debug("pb. 开始下注.....StartBet()")
//}
//
//func (rm *ColorRoom) EndBet() {
// rm.SetGameStatus(pb.ColorPinoyLiveGameStatus_ColorPinoyLiveEndBetMovie)
// // 停止下注就扣钱
// rm.StartTransInoutBet()
//
// // 发送停止下注消息
// msg := new(pb.ColorPinoyLiveStatusMessage)
// msg.Status = int32(rm.GetGameStatus())
// msg.StatusTime = int32(rm.RoomCfg.TimeConf.Endmove)
// msg.Jackpot = rm.jackpotMgr.GetJackpot()
// rm.Table.Broadcast(int32(pb.ColorPinoyLiveSendToClientMessageType_ColorPinoyLiveNoticeGameEndBet), msg)
//
// // log.Debug("pb. 停止下注.....EndBet()")
//}
//
//// 开3个 dice
//func (rm *ColorRoom) openThreeDice() {
// // log.Debug("aabb openThreeDice")
// rm.SetGameStatus(pb.ColorPinoyLiveGameStatus_ColorPinoyLiveOpenThreeDice)
// rm.Table.AddTimer(time.Duration(rm.RoomCfg.TimeConf.OpenThreeDice), func() {
// // log.Debug("aabb settle")
// rm.CompareDiceResult()
// rm.Settle()
// })
// // 发送开三个骰子消息
// rm._aniThreeDiceRouteIndex = int32(rand.RandIntM(0, 48))
// msg := new(pb.ColorPinoyLiveGameOpenThreeDice)
// msg.Status = int32(rm.GetGameStatus())
// msg.AniRouteIndex = rm._aniThreeDiceRouteIndex // 掉落路径
//
// for _, dice := range rm.NormalDices {
// msg.Color = append(msg.Color, pb.ColorPinoyLiveDiceColorType(model.GetColor(dice)))
// }
// rm.Table.Broadcast(int32(pb.ColorPinoyLiveSendToClientMessageType_ColorPinoyLiveNoticeGameOpenThreeDice), msg)
//}
//
//// 结算
//func (rm *ColorRoom) Settle() {
// // log.Debug("aabb 结算")
// rm.SetGameStatus(pb.ColorPinoyLiveGameStatus_ColorPinoyLiveSettleStatus)
// rm.endAt = time.Now().Unix()
// rm.SetUserSettleMsg()
//}

File diff suppressed because it is too large Load Diff