#ifndef CMD_GAME_Pooker_HEAD_FILE #define CMD_GAME_Pooker_HEAD_FILE ////////////////////////////////////////////////////////////////////////// //服务定义 //游戏属性 ////////////////////////////////////////////////////////////////////////// //数目定义 #pragma pack(1) #define MAX_COUNT_Poker 27 //最大数目 #define FULL_COUNT_Poker 108 //全牌数目 ////////////////////////////////////////////////////////////////////////// //数值掩码 #define MASK_COLOR 0xF0 //花色掩码 #define MASK_VALUE 0x0F //数值掩码 // //扑克类型 #define CT_ERROR 0 //错误类型 #define CT_SINGLE 1 //单牌类型 #define CT_DOUBLE 2 //对子类型 #define CT_THREE 3 //三条类型 #define CT_DOUBLE_LINK 4 //对连类型//334455 #define CT_THREE_LINK 5 //三连类型//555666777 #define CT_SHUNZI 6 //顺子类型 #define CT_BOMB 7 //炸弹类型 #define CT_BOMB_3W 8 //3王炸弹 #define CT_BOMB_TW 9 //天王炸弹 #define CT_BOMB_LINK 10 //排炸类型 N线M连 #define CT_BOMB_XIAN 11 //N付N线类型 // //////////////////////////////////////////////////////////////////////////// ////状态定义 // ////游戏状态 //#define GS_SK_FREE GS_FREE //等待开始 //#define GS_SK_PLAYING GS_PLAYING //游戏状态 // //////////////////////////////////////////////////////////////////////////// ////命令定义 // //#define SUB_S_GAME_START 100 //游戏函数 //#define SUB_S_OUT_CARD 101 //用户出牌 //#define SUB_S_PASS_CARD 102 //用户放弃 //#define SUB_S_GAME_END 103 //游戏结束 //#define SUB_S_TRUSTEE 104 //用户托管 //#define SUB_S_SWITCH 105 //用户调换 /* 前端->后台*/ #define SUB_C_TRUSTEE_Poker 1 //用户 托管 #define SUB_C_OPERATE_CALLBACK_Poker 150 //用户操作 #define SUB_S_HINT_RESULT_Poker 151 //获取提示 /*后台->前端*/ #define SUB_S_GAME_START_Poker 250 //游戏开始 #define SUB_S_OUT_BROADCAST_Poker 251 //出牌广播 #define SUB_S_OPERATE_Poker 252 //操作通知 #define SUB_S_GAME_END_Poker 253 //游戏结束 #define SUB_S_GAME_JiangJin_Poker 254 //奖金变更 #define SUB_S_TEAMMATE_HANDCARD_Poker 255 //通知队友手牌 #define SUB_S_HINT_RESULT 256 //提示 #define SUB_S_PANGGUAN_Poker 200 #define SUB_S_TRUSTEE_Poker 1 //托管广播 //发牌方式 enum DealCardType{ OneCardDeal = 0, ThreeCardDeal = 1, sixCardDeal = 2 }; // 操作掩码 后面用到 enum OPERATE_MASK : WORD { OPERATE_MASK_NULL_Poker = 0x0000, //默认 OPERATE_MASK_HINT_Poker = 0x0001, //提示 OPERATE_MASK_NOOUT_Poker = 0x0002, //要不起 OPERATE_MASK_OUT_Poker = 0x0004, //出牌 OPERATE_MASK_PASS_Poker = 0x0008, //不出 }; //2 双癞子 1 单癞子 0 无癞子 enum MagicMode{ NoHaveMagic = 0, OneMagicMode, TwoMagicMode }; //设置 struct CMD_S_GameConfig_Poker { WORD wSubGameID; //100 双扣 int wDiScore; //底分1 WORD wFanFei; //房费(0房间创建者,1打牌者平摊) WORD wIpLimit; //IP限制(0限制,1不限制); WORD wPlayCountRule; //一次玩的局数(8局?16局?) WORD RoomId; //房间ID WORD IsOwner; //是否房主 WORD wHadPlayCount; //当前局数 TCHAR sPrivateTableID[LEN_PRIVATE_TABLE_ID];// 数字ID BYTE bDuoLai; //2 大小王 1 大王 0 无癞子 WORD HaveBoomScore; //是否有炸弹奖金 1 有 0 没有 BYTE PeoplesNum; //玩家人数 int tmp2; //纸牌 发牌模式 0 1张 1 3张 2 6张 bool ToString(TCHAR* pBuffer, int iLen) { if (sizeof(CMD_S_GameConfig_Poker) * 16 > iLen) return false; return true; } }; //开局 struct CMD_S_GameStart_SK { WORD wCurrentUser; //当前玩家(应该是第一个出牌的玩家吧) int lCellScore[4]; //玩家积分 BYTE cbCardData[4][MAX_COUNT_Poker];//扑克列表 BYTE cbPartnerCardData[MAX_COUNT_Poker];//队友扑克 BYTE bTrustee; //是否托管 BYTE cbStartRandCard; //随机扑克 UINT userSortID[4]; //排序后的位置 BYTE cbCurrPlay; //当前局数 bool ToString(TCHAR* pBuffer, int iLen) { #ifdef _UNICODE CString StrCards; for (int i = 0; i < MAX_COUNT_Poker; i++) { CString tmp; tmp.Format(_T(",%02x"), cbCardData[i]); StrCards += tmp; } _snwprintf(pBuffer, iLen, TEXT("游戏开始->当前局数:%d,随机牌:%d,换桌顺序:%d,%d,%d,%d,玩家总积分:%d,%d,%d,%d 玩家手牌=%s") , cbCurrPlay, cbStartRandCard, userSortID[0], userSortID[1], userSortID[2], userSortID[3], lCellScore[0], lCellScore[1], lCellScore[2], lCellScore[3], StrCards); #else _snwprintf(pBuffer, iLen, TEXT("游戏开始->当前局数:%d,明牌:%d,换桌顺序:%d,%d,%d,%d,玩家总积分:%d,%d,%d,%d") , cbCurrPlay, cbStartRandCard, userSortID[0], userSortID[1], userSortID[2], userSortID[3], lCellScore[0], lCellScore[1], lCellScore[2], lCellScore[3]); #endif //StringCchCat(pBuffer, iLen / sizeof(TCHAR), tempcard); return true; } }; //托管 struct CMD_C_Trustee_SK { BYTE cbTrustee; //是否托管 WORD wChairID; //托管用户 }; //客户端 发过来的操作 struct CMD_C_OPERATE_CALLBACK_SK { WORD wOperateType; //操作掩码 BYTE cbCardType; //出牌牌型 BYTE cbJokerReplacePoker[4]; //癞子替换牌 BYTE cbCardData[27]; //出牌扑克 BYTE LianxianInfo; //告诉后台连线信息 bool ToString(TCHAR* pBuffer, int iLen) { #ifdef _UNICODE CString CardS; for (int i = 0; i < MAX_COUNT_Poker;i++) { if (cbCardData[i]==0) { break; } CString tmp; tmp.Format(L"0x%02x,", cbCardData[i]); CardS += tmp; } _snwprintf(pBuffer, iLen, TEXT("客户端操作: 操作掩码=%d 出牌牌型=%d 癞子替换牌=[%d %d %d %d] 出牌扑克[%s] 特殊牌信息=%d") , wOperateType, cbCardType, cbJokerReplacePoker[0], cbJokerReplacePoker[1], cbJokerReplacePoker[2], cbJokerReplacePoker[3], CardS,LianxianInfo); #else _snwprintf(pBuffer, iLen, TEXT("客户端操作: 操作掩码=%d 出牌牌型=%d 癞子替换牌=[%d %d %d %d] 特殊牌信息=%d") , wOperateType, cbCardType, cbJokerReplacePoker[0], cbJokerReplacePoker[1], cbJokerReplacePoker[2], cbJokerReplacePoker[3],LianxianInfo); #endif //StringCchCat(pBuffer, iLen / sizeof(TCHAR), tempcard); return true; } }; //出牌广播 struct CMD_S_Out_Broadcast_SK { WORD wOutCardUser; //出牌用户 WORD cbOperateType; //操作类型 WORD cbCardType; //出牌牌型 BYTE cbJokerReplacePoker[4];//替换癞子的牌 BYTE cbOutCardData[27]; //出牌扑克 BYTE cbIsFreeOut; //是否自由出牌 BYTE cbIsTrusteeOut; //是否托管出牌 BYTE cbLeftCount; //剩余牌数 BYTE cbRanking[4]; //当前名次 BYTE LianXianInfo; //标示 特殊牌 线 和连 等信息 bool ToString(TCHAR* pBuffer, int iLen) { #ifdef _UNICODE _snwprintf(pBuffer, iLen, TEXT("出牌广播: 操作类型=%d 操作掩码=%d 出牌牌型=%d 替换癞子的牌=[%d %d %d %d] 是否自由出牌=%d cbLeftCount=%d 当前名次=[%d %d %d %d] 特殊牌信息 =%d") , wOutCardUser, cbOperateType, cbCardType, cbJokerReplacePoker[0], cbJokerReplacePoker[1], cbJokerReplacePoker[2], cbJokerReplacePoker[3], cbIsFreeOut, cbLeftCount, cbRanking[0], cbRanking[1], cbRanking[2], cbRanking[3], LianXianInfo); #else _snwprintf(pBuffer, iLen, TEXT("出牌广播: 操作类型=%d 操作掩码=%d 出牌牌型=%d 替换癞子的牌=[%d %d %d %d] 是否自由出牌=%d cbLeftCount=%d 当前名次=[%d %d %d %d] 特殊牌信息 =%d") , wOutCardUser, cbOperateType, cbCardType, cbJokerReplacePoker[0], cbJokerReplacePoker[1], cbJokerReplacePoker[2], cbJokerReplacePoker[3], cbIsFreeOut, cbLeftCount, cbRanking[0], cbRanking[1], cbRanking[2], cbRanking[3], LianXianInfo); #endif //StringCchCat(pBuffer, iLen / sizeof(TCHAR), tempcard); return true; } }; struct CMD_S_Operate_SK { WORD wOperateUser; //操作用户 WORD wOperateType; //操作掩码 BYTE cbOptTime; //操作时间(秒) BYTE cbIsFreeOut; //是否自由出牌 BYTE LianXianInfo; //上一个玩家的 特殊信息 bool ToString(TCHAR* pBuffer, int iLen) { #ifdef _UNICODE _snwprintf(pBuffer, iLen, TEXT("操作提示: 用户=%d 操作掩码=%d 操作时间=%d 是否自动出牌=%d") , wOperateUser, wOperateType, cbOptTime, cbIsFreeOut); #else _snwprintf(pBuffer, iLen, TEXT("操作提示: 用户=%d 操作掩码=%d 操作时间=%d 是否自动出牌=%d") , wOperateUser, wOperateType, cbOptTime, cbIsFreeOut); #endif //StringCchCat(pBuffer, iLen / sizeof(TCHAR), tempcard); return true; } }; struct CMD_S_StatusPlay_SK { CMD_S_GameConfig_Poker gameConfig; //游戏配置 INT lUserTmpScore[4]; //临时积分。本轮玩家的积分 BYTE leftTime; //未开始设置 255 WORD wchairId; //解散申请人 BYTE options[4]; //解散状态 //游戏变量 WORD wBankerUser; //本局游戏庄家 WORD wCurrentUser; //当前用户 BYTE cbCurrPlayCount; //当前局数 BYTE cbTotaPlayCount; //总局数 BYTE leftOptTime; //剩余操作时间--- BYTE cbOutCardData[4][27]; //玩家出牌 WORD cbcardType; //操作类型 我的出牌类型 BYTE cbCardCount[4]; //扑克数目 BYTE cbCardData[4][27]; //玩家手牌 WORD cbOtherOperateType[4]; //别人的操作类型(不出,要不起) BYTE cbDiscardType; //应该是上一家出牌类型 BYTE cbReplaceCard[4 * 4]; //癞子替换牌值 BYTE cbRankIndex[4]; //名次排行,游戏中谁先打完排名 BYTE cbTeamCardData[27]; //展示队友牌,重连时自己已打完 BYTE cbTrusteeStatus[4]; //托管状态 BYTE LeftMinPokerVal; //开局的那张名牌 BYTE LianXianInfo; //标示 特殊牌 线 和连 等信息 short UserGongXianScore[4]; //玩家贡献分 }; struct CMD_S_GameEnd_SK { BYTE cbEndType; //结束类型 操作类型(1常规结束 2解散 )1 BYTE cbCardCount[4]; //玩家手牌数目 BYTE cbCardData[4][27]; //玩家手牌值 BYTE cbRank[4]; //名次排行 BYTE cbWinorLose[4]; //玩家单局输赢情况(0,输,1赢) BYTE cbWinorLoseCount[4]; //输赢次数 short nWanJiaScore[4]; //本局积分 short GongxianScore[4]; //贡献分(炸弹分) short AwardScore[4]; //奖金分(双扣分) INT cbWanJiaTotalScore[4]; //总积分 BYTE bFinish; //是否结束本轮 BYTE playGameNum; //当前局数 INT lGameScoreDetail[16 * 4]; //流水详情 }; typedef struct _HitStruct_ { BYTE cbHintLogicCardData[MAX_COUNT_Poker]; BYTE cbCardCount; WORD cbCardType; _HitStruct_(){ ZeroMemory(cbHintLogicCardData, MAX_COUNT_Poker); cbCardType = CT_ERROR; cbCardCount = 0; }; }HitStruct; // 出牌信息 typedef struct _OutCard_ { WORD wOutCardUser; //出牌用户 BYTE cbOutCardData[MAX_COUNT_Poker]; //出牌扑克 BYTE cbOutCardCount; //出牌数目 BYTE cbOutCardType; //出牌类型 BYTE cbOutCardValue; //牌眼(用于比较大小) }OutCard; struct CMD_S_Hint_Result_Poker { BYTE cbHintCardData[27]; //提示扑克(长度应该是27吧) WORD cbCardType; //出牌牌型 }; struct CMD_S_JiangJin { BYTE wOperateUser; //出牌大牌的用户 BYTE cbCardData[27]; //出牌数据 BYTE cbCardType; //出牌类型 short Scores[4]; //各个玩家的奖金变更 short TureScores[4]; //变更后的真实贡献分数 bool ToString(TCHAR* pBuffer, int iLen) { #ifdef _UNICODE CString CardS; for (int i = 0; i < MAX_COUNT_Poker; i++) { if (cbCardData[i] == 0) { break; } CString tmp; tmp.Format(L"0x%02x,", cbCardData[i]); CardS += tmp; } _snwprintf(pBuffer, iLen, TEXT("奖金提示: 用户=%d 出牌数据=[%s ]出牌类型=%d 奖金变更[%d %d %d %d ] 变更后的[%d %d %d %d]") , wOperateUser, CardS, cbCardType, Scores[0], Scores[1], Scores[2], Scores[3], TureScores[0], TureScores[1], TureScores[2], TureScores[3]); #else _snwprintf(pBuffer, iLen, TEXT("奖金提示: 用户=%d 出牌数据=[%s ]出牌类型=%d 奖金变更[%d %d %d %d ] 变更后的[%d %d %d %d]") , wOperateUser, CardS, cbCardType, Scores[0], Scores[1], Scores[2], Scores[3], TureScores[0], TureScores[1], TureScores[2], TureScores[3]); #endif //StringCchCat(pBuffer, iLen / sizeof(TCHAR), tempcard); return true; } }; struct CMD_S_PangGuan_Poler { CMD_S_GameConfig_Poker gameConfig; INT lUserTmpScore[4]; //玩家积分 BYTE GameStatus; //当前状态 WORD wBankerUser; //本局游戏庄家 WORD wCurrentUser; //当前用户 BYTE cbCurrPlayCount; //当前局数 BYTE cbTotaPlayCount; //总局数 BYTE leftOptTime;//剩余操作时间 WORD cbOtherOperate[4]; //他人操作 BYTE cbOutCardData[4][27]; //玩家出牌 WORD cbCardType; //出牌类型 WORD cbOtherOperateType[4];//别人的操作类型(不出,要不起) BYTE cbDiscardType;//应该是上一家出牌类型 BYTE cbReplaceCard[4 * 4];//癞子替换牌值 BYTE cbRankIndex[4];//名次排行,游戏中谁先打完排名 BYTE cbCardCount[4]; //扑克数目 BYTE cbCardData[4][27]; //玩家手牌 BYTE cbTrusteeStatus[4]; //托管状态 0正常 1托管 BYTE LeftMinPokerVal; //开局的那张名牌 short UserGongXianScore[4]; //玩家贡献分 }; //用户托管 struct CMD_S_Trustee_Poler { BYTE cbTrustee; //是否托管 WORD wChairID; //托管用户 }; //队友手牌 struct CMD_S_TEAMMATE_HANDCARD { WORD wTeammateChairID; //队友座位 BYTE cbCardData[27]; //队友手牌 }; #pragma pack() #endif