#ifndef CMD_SPARROW_HEAD_FILE #define CMD_SPARROW_HEAD_FILE #include #pragma pack(1) ////////////////////////////////////////////////////////////////////////// //公共宏定义 #define KIND_ID 302 //游戏 I D //组件属性 #define SAN_ZHANG 3 //换牌数--换三张 #define GAME_PLAYER 4 //游戏人数 #define GAME_PLAY 3 // #define VERSION_SERVER PROCESS_VERSION(6,0,3) //程序版本 #define VERSION_CLIENT PROCESS_VERSION(6,0,3) //程序版本 #define GAME_NAME TEXT("松滋晃晃") //游戏名字 #define GAME_GENRE (GAME_GENRE_SCORE|GAME_GENRE_MATCH|GAME_GENRE_GOLD) //游戏类型 //游戏状态 #define GS_MJ_FREE GAME_STATUS_FREE //空闲状态 #define GS_MJ_PLAY (GAME_STATUS_PLAY+1) //游戏状态 //常量定义 #define MAX_WEAVE 4 //最大组合 #define MAX_INDEX 27 //最大索引 27 #define MAX_COUNT 14 //最大数目 #define MAX_JIYI 28 //最大记忆牌数据 #define MAX_REPERTORY 108 //最大库存 #define MAX_REPERTORY_SRLF 72 //三人两房最大库存 #define MAX_WEAVE_HUA 8 //花牌最大组合 #define MAX_INDEX_HUA 23 //花牌最大索引 23 #define MAX_COUNT_HUA 26 //花牌最大数目 #define MAX_REPERTORY_HUA 110 //花牌最大库存 #define MAX_REPERTORY_HUA_ONE 111 //花牌最大库存 #define MAX_REPERTORY_HUA_TWO 112 //花牌最大库存 #define EXCHANGE 3 //默认换三张 #define MAX_TING 10 //最大听牌数 #define MAX_CHANGE_SCORE 20 //最大积分变动次数 //扑克定义 #define HEAP_FULL_COUNT 26 //堆立全牌 #define MAX_RIGHT_COUNT 1 //最大权位DWORD个数 #define TEMP_MAX_SCORE 1000 //最大临时积分 #define GAME_TIMEOUT 10 //玩家出牌超时时间 ////////////////////////////////////////////////////////////////////////// //组合子项 struct CMD_WeaveItem { INT cbWeaveKind; //组合类型 BYTE cbCenterCard; //中心扑克 BYTE cbPublicCard; //公开标志 WORD wProvideUser; //供应用户 BYTE cbMargicOffset[4]; //如果有财神参与组合,财神的位置 1-4 ,该位置存储实际是那张财神的index }; struct CMD_WeaveItem_Hua { INT cbWeaveKind; //组合类型 BYTE cbCenterCard; //中心扑克 BYTE cbPublicCard; //公开标志 WORD wProvideUser; //供应用户 BYTE cbMargicOffset[4]; //组合花牌个数 }; ////////////////////////////////////////////////////////////////////////// //服务器命令结构 //#define SUB_S_SEND_LAIZIGANG 97 //癞子杠 //#define SUB_S_SEND_LAIZIPI 98 //癞子皮 //#define SUB_S_GAME_READING 99 //游戏准备 //#define SUB_S_SEND_TINGPAI 99 //听牌数据 #define SUB_S_GAME_START 100 //游戏开始 #define SUB_S_OUT_CARD 101 //出牌命令 #define SUB_S_SEND_CARD 102 //发送扑克 #define SUB_S_TING_CARD 103 //听牌单独协议 #define SUB_S_OPERATE_NOTIFY 104 //操作提示 #define SUB_S_OPERATE_RESULT 105 //操作命令 #define SUB_S_GAME_END 106 //游戏结束 #define SUB_S_TRUSTEE 107 //用户托管 #define SUB_S_CHI_HU 108 //胡牌 #define SUB_S_XUELIU_END 109 //血流单局游戏结束协议 #define SUB_S_GANG_SCORE 110 // #define SUB_S_DIGNQUE 120 //定缺 #define SUB_S_HUAN_SAN_ZHANG 121 //换三张 #define SUB_S_GAME_NOTIFY 122 //游戏事件通知(1定缺,2换三张)现在用来发送换牌标示 #define SUB_S_PANGGUAN 200 //旁观者登陆游戏 #define SUB_S_GAME_START_HUA 150 //游戏开始 #define SUB_S_OUT_CARD_HUA 151 //出牌命令 #define SUB_S_SEND_CARD_HUA 152 //发送扑克 #define SUB_S_QINGTONG_NOTIFY_HUA 153 //请统操作提示 #define SUB_S_OPERATE_NOTIFY_HUA 154 //操作提示 #define SUB_S_OPERATE_RESULT_HUA 155 //花牌操作命令 #define SUB_S_GAME_END_HUA 156 //花牌游戏结束 #define SUB_S_TRUSTEE_HUA 157 //花牌用户托管 #define SUB_S_CHI_HU_HUA 158 //花牌胡牌 #define SUB_S_PANGGUAN_HUA 159 //花牌旁观者登陆游戏 #define SUB_S_YI_WEI_HUA 160 //玩家移位广播 #define LEN_PRIVATE_TABLE_ID 11 #define LEN_NICKNAME 32 #define LEN_HEAD_URL 256 enum MahJongType { xzdd = 0, //一脚癞油 xlch, //无赖到底 srlf, //半癞 cxz = 3, //戳瞎子一脚赖油 cxz2 = 4, //戳瞎子无赖到底 cxz3 = 5, //戳瞎子半癞 xueliu = 10,//血流+4 6 12 番 xueliu2 = 11,//血流+6 8 14 番 xueliu3 = 12,//血流+6 8 14 番 huapai = 14,//花牌+双杠 huapai2 = 15,//花牌+单杠 huapai3 = 16,//花牌+无杠 count = 20, //总数 }; enum CMRule_zimo { zimojiadi = 0, //自摸加底 zimojiafan, //自摸加番 }; enum CMRule_dgh { dgh_fp = 0, //点杠花当放炮 dgh_zm, //点杠话当自摸 }; enum CMRule_other { yaojiujiangdui = 0x001, //带幺九、将对 huansanzhang = 0x002, //换三张 menqing = 0x004, //门清中张 daxiaoyu = 0x008, //大小雨 tiandihu = 0x010, //天地胡 emax_other, }; enum DDH_Rule { dianpao, //点炮胡 zimo, //自摸胡 }; enum CMRule_MaxFan { max_two = 2, max_three = 3, max_four = 4, }; enum MahJong_JuShu { ju_two = 2, ju_four = 4, ju_eight = 8, }; struct tagChihuList { WORD chihuCount; DWORD chihuRightData[10]; //用户吃胡列表,最多显示10个; BYTE chihuCardData[10]; //用户吃胡牌的列表,最多显示10个; BYTE wProvideUser[10]; //用户吃胡牌的提供者列表,最多显示10个; }; struct CMD_S_GameConfig { WORD wSubGameID; //一脚癞油,无赖到底,半癞 血流 花牌//翻型 int wDiScore; //底分 WORD wFanFei; //房费(0房间创建者,1打牌者平摊) WORD wIpLimit; //IP限制(0限制,1不限制); WORD wPlayCountRule; //一次玩的局数(8局?16局?) WORD RoomId; //房间ID WORD IsOwner; //是否房主 WORD wHadPlayCount; //当前局数 TCHAR sPrivateTableID[7]; BYTE GameScoreType; //算分方式(0,传统得 1,算胡玩法) WORD tmp2; //备 BYTE temp3; int temp4; bool ToString(TCHAR* pBuffer, int iLen) { if (sizeof(CMD_S_GameConfig) * 16 > iLen) return false; #ifdef _UNICODE _snwprintf(pBuffer, iLen, TEXT("游戏配置->游戏类型:%d,游戏低分:%d,房费扣出方式:%d,IP地址限制:%d,玩的局数:%d,是否为房主:%d,当前局数:%d,房间号码:%d") , wSubGameID, wDiScore, wFanFei, wIpLimit, wPlayCountRule, IsOwner, wHadPlayCount, sPrivateTableID); #else _snwprintf(pBuffer, iLen, TEXT("游戏配置->游戏类型:%d,游戏低分:%d,房费扣出方式:%d,IP地址限制:%d,玩的局数:%d,是否为房主:%d,当前局数:%d,房间号码:%d") , wSubGameID, wDiScore, wFanFei, wIpLimit, wPlayCountRule, IsOwner, wHadPlayCount, sPrivateTableID); #endif //mylog::ToSet(pBuffer, iLen); return true; } }; //游戏状态 struct CMD_S_StatusFree { CMD_S_GameConfig gameConfig; //游戏基本配置 INT lUserTmpScore[GAME_PLAYER]; //临时积分。在私有桌子中不使用自身的积分或金币,使用临时积分。 BYTE leftTime; //未开始设置 255 WORD wchairId; //发起人座位号 BYTE options[GAME_PLAYER]; // 0 未决定 1 tongy 2jj BYTE UserStat; //玩家当前状态 }; //旁观者断线重连 struct CMD_S_PangGuan { CMD_S_GameConfig gameConfig; INT lUserTmpScore[GAME_PLAYER]; //临时积分。本轮玩家的积分 //游戏变量 BYTE GameStatus; //0等待开始,1游戏中 BYTE cbTotalCardCount; //游戏总牌数 BYTE cbLeftCardCount; //单局游戏剩余牌数 WORD wBankerUser; //本局游戏庄家 BYTE lSiZi[4]; //色子1,2,皮子,癞子 DWORD dwOwnerID; //房主ID BYTE bWanLaiZi[GAME_PLAYER]; //每个打出玩家癞子数 //当前状态 WORD wCurrentUser; //当前用户 BYTE bPutCardData[GAME_PLAYER]; //最后一张牌打出的人和牌值 BYTE totalOptTime; //总操作时间10秒 BYTE leftOptTime; //还剩多少时间0 BYTE cbDiscardCount[GAME_PLAYER]; //丢弃数目 BYTE cbDiscardCard[GAME_PLAYER][55]; //丢弃记录 BYTE cbCardCount[GAME_PLAYER]; //每个玩家扑克数目 //组合扑克 BYTE cbWeaveCount[GAME_PLAYER]; //组合数目 CMD_WeaveItem WeaveItemArray[GAME_PLAYER][MAX_WEAVE]; //组合扑克 BYTE bOutCardCout; //可以打出的牌就听牌的个数 血流 改为是否为换牌状态(0,表示非换牌状态.1,表示换牌状态,但是你已经选好牌了.2,表示换牌状态,但是还没有选牌) BYTE bTingCardCount[GAME_PLAYER]; //相对应打出牌可听牌个数,索引表示第几张,值是对应对应的听牌个数 血流 最后一个牌是打出值胡牌值 BYTE bTingCardData[GAME_PLAYER][MAX_INDEX]; //具体听牌数据,一维索引表示打出牌的第几个,二维索引表示听牌的第几个,值表示牌数据 血流 每个玩家胡牌数据ChiHuCard[4][20]掩码,里面涵盖胡牌数据来源 }; //旁观者花牌断线重连 struct CMD_S_PangGuan_Hua { CMD_S_GameConfig gameConfig; INT lUserTmpScore[GAME_PLAYER]; //临时积分。本轮玩家的积分 //游戏变量 BYTE GameStatus; //0等待开始,1游戏中 BYTE cbTotalCardCount; //游戏总牌数 BYTE cbLeftCardCount; //单局游戏剩余牌数 WORD wBankerUser; //本局游戏庄家 BYTE lSiZi[4]; //玩家统的个数 //当前状态 WORD wCurrentUser; //当前用户 BYTE bPutCardData[GAME_PLAY]; //最后一张牌打出的人和牌值 BYTE totalOptTime; //总操作时间10秒 BYTE leftOptTime; //还剩多少时间0 BYTE cbDiscardCount[GAME_PLAY]; //丢弃数目 BYTE cbDiscardCard[GAME_PLAY][15]; //丢弃记录 BYTE cbCardCount[GAME_PLAY]; //每个玩家扑克数目 //组合扑克 BYTE cbWeaveCount[GAME_PLAY]; //组合数目 CMD_WeaveItem_Hua WeaveItemArray[GAME_PLAY][MAX_WEAVE_HUA]; //组合扑克 BYTE GameScore[GAME_PLAY]; }; //游戏状态,断线重连 struct CMD_S_StatusPlay { CMD_S_GameConfig gameConfig; INT lUserTmpScore[GAME_PLAYER]; //临时积分。本轮玩家的积分 BYTE leftTime; // 255未开始 WORD wchairId; // 解散申请人 BYTE options[GAME_PLAYER]; // 在坐玩家 解散状态 0 未决定 1 tongy 2jj //游戏变量 BYTE cbTotalCardCount; //游戏总牌数 BYTE cbLeftCardCount; //单局游戏剩余牌数 WORD wBankerUser; //本局游戏庄家 BYTE lSiZi[4]; //色子1,2,皮子,癞子 DWORD dwOwnerID; //房主ID BYTE bWanLaiZi[GAME_PLAYER]; //每个打出玩家癞子数/改称玩家胡牌次数 //当前状态 WORD wCurrentUser; //当前用户 BYTE bPutCardData[GAME_PLAYER]; //最后一张牌打出的人和牌值 BYTE totalOptTime; //总操作时间10秒 BYTE leftOptTime; //还剩多少时间0 BYTE cbDiscardCount[GAME_PLAYER]; //丢弃数目 BYTE cbDiscardCard[GAME_PLAYER][55]; //丢弃记录 BYTE cbCardCount[GAME_PLAYER]; //每个玩家扑克数目 //组合扑克 BYTE cbWeaveCount[GAME_PLAYER]; //组合数目 CMD_WeaveItem WeaveItemArray[GAME_PLAYER][MAX_WEAVE]; //组合扑克 BYTE cbCardData[MAX_COUNT]; //当前玩家手牌 //断线玩家数据就是当前牌权玩家 INT cbActionMask; //操作掩码 BYTE gangCards[3]; //当有杠的时候这里面有牌 BYTE bOutCardCout; //可以打出的牌就听牌的个数 血流 改为是否为换牌状态(0,表示非换牌状态.1,表示换牌状态,但是你已经选好牌了.2,表示换牌状态,但是还没有选牌) BYTE bOutCardData[MAX_COUNT]; //具体打哪几张牌 血流 (1.时,存的是换牌的牌,2,存的是我默认推送的牌) BYTE bTingCardCount[MAX_COUNT]; //相对应打出牌可听牌个数,索引表示第几张,值是对应对应的听牌个数 血流 最后一个牌是打出值胡牌值 BYTE bTingCardData[MAX_COUNT][MAX_INDEX]; //具体听牌数据,一维索引表示打出牌的第几个,二维索引表示听牌的第几个,值表示牌数据 血流 每个玩家胡牌数据ChiHuCard[4][20]掩码,里面涵盖胡牌数据来源 bool ToString(TCHAR* pBuffer, int iLen) { if (sizeof(CMD_S_StatusPlay) * 16 > iLen) return false; #ifdef _UNICODE _snwprintf(pBuffer, iLen, TEXT("断线重连命令->重连用户:%d,最后的出牌:[%d][%d][%d][%d],玩家手牌数量:[%d][%d][%d][%d],玩家牌值:[%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d]") , wCurrentUser, bPutCardData[0], bPutCardData[1], bPutCardData[3], bPutCardData[3], cbCardCount[0], cbCardCount[1], cbCardCount[2], cbCardCount[3], cbCardData[0], cbCardData[1], cbCardData[2], cbCardData[3] , cbCardData[4], cbCardData[5], cbCardData[6], cbCardData[7] ,cbCardData[8], cbCardData[9], cbCardData[10], cbCardData[11],cbCardData[12], cbCardData[13]); #else _snwprintf(pBuffer, iLen, TEXT("断线重连命令->重连用户:%d,最后的出牌:[%d][%d][%d][%d],玩家手牌数量:[%d][%d][%d][%d],玩家牌值:[%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d]") , wCurrentUser, bPutCardData[0], bPutCardData[1], bPutCardData[3], bPutCardData[3], cbCardCount[0], cbCardCount[1], cbCardCount[2], cbCardCount[3], cbCardData[0], cbCardData[1], cbCardData[2], cbCardData[3] , cbCardData[4], cbCardData[5], cbCardData[6], cbCardData[7], cbCardData[8], cbCardData[9], cbCardData[10], cbCardData[11], cbCardData[12], cbCardData[13]); #endif return true; } }; //游戏状态,断线重连 struct CMD_S_StatusPlay_ZhuJi { CMD_S_GameConfig gameConfig; INT lUserTmpScore[GAME_PLAYER]; //临时积分。本轮玩家的积分 BYTE leftTime; //255未开始 WORD wchairId; //解散申请人 BYTE options[GAME_PLAYER]; //在坐玩家 解散状态 0 未决定 1 tongy 2jj //游戏变量 BYTE cbTotalCardCount; //游戏总牌数 BYTE cbLeftCardCount; //单局游戏剩余牌数 WORD wBankerUser; //本局游戏庄家 BYTE lSiZi[4]; //色子1,2,皮子,癞子 DWORD dwOwnerID; //房主ID //包家ID 6位 包家台数6位 每5位一个玩家台数 //WORD bWanLaiZi[GAME_PLAYER]; //每个玩家打出癞子数(低四位是癞子,中四位是红中杠的个数,高四位就是发财杠的个数) //当前状态 WORD wCurrentUser; //当前用户 BYTE bPutCardData[GAME_PLAYER]; //最后一张牌打出的人和牌值 BYTE totalOptTime; //总操作时间10秒 BYTE leftOptTime; //还剩多少时间0 BYTE cbDiscardCount[GAME_PLAYER]; //丢弃数目 BYTE cbDiscardCard[GAME_PLAYER][40]; //丢弃记录 BYTE cbCardCount[GAME_PLAYER]; //每个玩家扑克数目 //组合扑克 BYTE cbWeaveCount[GAME_PLAYER]; //组合数目 CMD_WeaveItem WeaveItemArray[GAME_PLAYER][MAX_WEAVE]; //组合扑克 BYTE cbCardData[MAX_COUNT]; //当前玩家手牌 //断线玩家数据就是当前牌权玩家 INT cbActionMask; //操作掩码 WORD gangCards[6]; //当有杠的时候这里面有牌 bool ToString(TCHAR* pBuffer, int iLen) { if (sizeof(CMD_S_StatusPlay) * 16 > iLen) return false; CString outCards; for (int i = 0; i < 4; i++) { CString tmp; tmp.Format(_T(" 玩家%d手牌 |\r\n"), i); outCards += tmp; for (int j = 0; i < cbDiscardCount[i]; j++) { CString strTmp; strTmp.Format(_T("0x%x "), cbDiscardCard[i][j]); outCards += strTmp; } outCards += _T(" |\r\n"); } OutputDebugString(outCards); TCHAR tempcard[1024 * 2] = { 0 }; #ifdef _UNICODE _snwprintf(tempcard, iLen, TEXT("断线重连命令->重连用户:%d,最后的出牌:[%d][%d][%d][%d],玩家手牌数量:[%d][%d][%d][%d],玩家牌值:[%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d],包家[%d],台数[%d] 打出的牌=%s ") , wCurrentUser, bPutCardData[0], bPutCardData[1], bPutCardData[3], bPutCardData[3], cbCardCount[0], cbCardCount[1], cbCardCount[2], cbCardCount[3], cbCardData[0], cbCardData[1], cbCardData[2], cbCardData[3] , cbCardData[4], cbCardData[5], cbCardData[6], cbCardData[7], cbCardData[8], cbCardData[9], cbCardData[10], cbCardData[11], cbCardData[12], cbCardData[13], (dwOwnerID & 0x3f), ((dwOwnerID >> 6) & 0x3f), outCards.GetBuffer() ); #else _snwprintf(tempcard, iLen, TEXT("断线重连命令->重连用户:%d,最后的出牌:[%d][%d][%d][%d],玩家手牌数量:[%d][%d][%d][%d],玩家牌值:[%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d],包家[%d],台数[%d]") , wCurrentUser, bPutCardData[0], bPutCardData[1], bPutCardData[3], bPutCardData[3], cbCardCount[0], cbCardCount[1], cbCardCount[2], cbCardCount[3], cbCardData[0], cbCardData[1], cbCardData[2], cbCardData[3] , cbCardData[4], cbCardData[5], cbCardData[6], cbCardData[7], cbCardData[8], cbCardData[9], cbCardData[10], cbCardData[11], cbCardData[12], cbCardData[13] (dwOwnerID & 0x3f), ((dwOwnerID >> 6) & 0x3f) ); #endif StringCchCat(pBuffer, iLen / sizeof(TCHAR), tempcard); return true; } }; //游戏状态,断线重连 struct CMD_S_StatusPlay_Hua { CMD_S_GameConfig gameConfig; INT lUserTmpScore[GAME_PLAYER]; //临时积分。本轮玩家的积分 BYTE leftTime; //255未开始 WORD wchairId; //解散申请人 BYTE options[GAME_PLAYER]; //在坐玩家 解散状态 0 未决定 1 tongy 2jj //游戏变量 BYTE cbTotalCardCount; //游戏总牌数 BYTE cbLeftCardCount; //单局游戏剩余牌数 WORD wBankerUser; //本局游戏庄家 BYTE lSiZi[4]; //记录玩家0,1,2统的个数 //当前状态 WORD wCurrentUser; //当前用户 BYTE bPutCardData[GAME_PLAY]; //最后一张牌打出的人和牌值 BYTE totalOptTime; //总操作时间10秒 BYTE leftOptTime; //还剩多少时间0 BYTE cbDiscardCount[GAME_PLAY]; //丢弃数目 BYTE cbDiscardCard[GAME_PLAY][15]; //丢弃记录 BYTE cbCardCount[GAME_PLAY]; //每个玩家扑克数目 //组合扑克 BYTE cbWeaveCount[GAME_PLAY]; //组合数目 CMD_WeaveItem_Hua WeaveItemArray[GAME_PLAY][MAX_WEAVE_HUA]; //组合扑克 BYTE cbCardData[9][9]; //当前玩家手牌 //断线玩家数据就是当前牌权玩家 INT cbActionMask; //操作掩码 BYTE gangCards[6]; //当有杠的时候这里面有牌 BYTE GameScore[GAME_PLAY]; //落地胡数 BYTE HuShu; //胡数 BYTE PaPoShu; //爬坡数 }; //游戏开始 struct CMD_S_GameStart { WORD wBankerUser; //庄家用户 WORD wCurrentUser; //当前用户 INT cbUserAction; //用户动作(0:没操作,0x08:碰牌,0x10:杠,0x80:自摸等) BYTE ActionCard[3]; //动作所对应的牌 BYTE cbCardData[MAX_COUNT*GAME_PLAYER]; //扑克列表 BYTE cbSiceLaiZi[4]; //色子1,2,皮子,癞子 BYTE cbLeftCardCount; //剩余牌 BYTE cbTotalCardCount; //总麻将数 BYTE cbOptTime; //操作时间(秒) BYTE cbCurrPlay; //当前局数 bool ToString(TCHAR* pBuffer, int iLen) { if (sizeof(CMD_S_GameStart) * 16 > iLen) return false; TCHAR tempcard[2000]; TCHAR tempActionCard[2000]; ZeroMemory(tempcard, 2000 * sizeof(TCHAR)); ZeroMemory(tempActionCard, 2000 * sizeof(TCHAR)); for (BYTE i = MAX_COUNT*wCurrentUser; i < MAX_COUNT*(wCurrentUser + 1); i++) { SwitchToStringCard(cbCardData[i], tempcard, 2000); } for (BYTE i =0; i < 3; i++) { SwitchToStringCard(ActionCard[i], tempActionCard, 2000); } tempcard[1999] = 0; tempActionCard[1999] = 0; #ifdef _UNICODE _snwprintf(pBuffer, iLen, TEXT("游戏开始->庄家用户:%d,当前用户:%d,用户动作:%d,动作所对应的牌:%s,扑克列表:%s,色子1:%d,色子2:%d,皮子:%d,癞子:%d,剩余牌数:%d,总麻将数:%d,操作时间:%d,当前局数:%d") , wBankerUser, wCurrentUser, cbUserAction, tempActionCard, tempcard, cbSiceLaiZi[0], cbSiceLaiZi[1], cbSiceLaiZi[2], cbSiceLaiZi[3], cbLeftCardCount, cbTotalCardCount, cbOptTime, cbCurrPlay); #else _snwprintf(pBuffer, iLen, TEXT("游戏开始->庄家用户:%d,当前用户:%d,用户动作:%d,动作所对应的牌:%s,扑克列表:%s,色子1:%d,色子2:%d,皮子:%d,癞子:%d,剩余牌数:%d,总麻将数:%d,操作时间:%d,当前局数:%d") , wBankerUser, wCurrentUser, cbUserAction, tempActionCard, tempcard, cbSiceLaiZi[0], cbSiceLaiZi[1], cbSiceLaiZi[2], cbSiceLaiZi[3], cbLeftCardCount, cbTotalCardCount, cbOptTime, cbCurrPlay); #endif //mylog::ToSet(pBuffer, iLen); return true; } bool SwitchToStringCard(BYTE bData, TCHAR pBuffer[], int iLen) { if (wcslen(pBuffer) > 1980 + iLen) { return false; } BYTE iHuaSe = (bData & 0xF0) >> 4; BYTE bValue = (bData & 0x0F); TCHAR szTemp[8]; ZeroMemory(szTemp, 8*sizeof(TCHAR)); switch (iHuaSe) { case 0: { switch (bValue) { case 1: { StringCchCat(szTemp, 16, _T("一万~")); break; } case 2: { StringCchCat(szTemp, 16, _T("二万~")); break; } case 3: { StringCchCat(szTemp, 16, _T("三万~")); break; } case 4: { StringCchCat(szTemp, 16, _T("四万~")); break; } case 5: { StringCchCat(szTemp, 16, _T("五万~")); break; } case 6: { StringCchCat(szTemp, 16, _T("六万~")); break; } case 7: { StringCchCat(szTemp, 16, _T("七万~")); break; } case 8: { StringCchCat(szTemp, 16, _T("八万~")); break; } case 9: { StringCchCat(szTemp, 16, _T("九万~")); break; } default: break; } break; } case 1: switch (bValue) { case 1: { StringCchCat(szTemp, 16, _T("一条~")); break; } case 2: { StringCchCat(szTemp, 16, _T("二条~")); break; } case 3: { StringCchCat(szTemp, 16, _T("三条~")); break; } case 4: { StringCchCat(szTemp, 16, _T("四条~")); break; } case 5: { StringCchCat(szTemp, 16, _T("五条~")); break; } case 6: { StringCchCat(szTemp, 16, _T("六条~")); break; } case 7: { StringCchCat(szTemp, 16, _T("七条~")); break; } case 8: { StringCchCat(szTemp, 16, _T("八条~")); break; } case 9: { StringCchCat(szTemp, 16, _T("九条~")); break; } default: break; } break; case 2: switch (bValue) { case 1: { StringCchCat(szTemp, 16, _T("一筒~")); break; } case 2: { StringCchCat(szTemp, 16, _T("二筒~")); break; } case 3: { StringCchCat(szTemp, 16, _T("三筒~")); break; } case 4: { StringCchCat(szTemp, 16, _T("四筒~")); break; } case 5: { StringCchCat(szTemp, 16, _T("五筒~")); break; } case 6: { StringCchCat(szTemp, 16, _T("六筒~")); break; } case 7: { StringCchCat(szTemp, 16, _T("七筒~")); break; } case 8: { StringCchCat(szTemp, 16, _T("八筒~")); break; } case 9: { StringCchCat(szTemp, 16, _T("九筒~")); break; } default: break; } break; default: break; } StringCchCat(pBuffer, iLen, szTemp); return true; } }; //花牌游戏开始 struct CMD_S_GameStart_Hua { WORD wBankerUser; //庄家用户 WORD wCurrentUser; //当前用户 INT cbUserAction; //用户动作(0:没操作,0x08:碰牌,0x10:杠,0x80:自摸等) BYTE ActionCard[6]; //动作所对应的牌 BYTE cbCardData[9][9]; //扑克列表 BYTE cbLeftCardCount; //剩余牌 BYTE cbTotalCardCount; //总花牌数 BYTE cbOptTime; //操作时间(秒) BYTE cbCurrPlay; //当前局数 bool ToString(TCHAR* pBuffer, int iLen) { if (sizeof(CMD_S_GameStart_Hua) * 16 > iLen) return false; BYTE TempCardData[26] = { 0 }; BYTE TempCount = 0; for (BYTE i = 0; i < 9; i++) { for (BYTE j = 0; j < 9; j++) { if (cbCardData[i][j] == 0) { break; } TempCardData[TempCount++] = cbCardData[i][j]; } if (TempCount == 26) { break; } } #ifdef _UNICODE _snwprintf(pBuffer, iLen, TEXT("游戏开始->庄家用户:%d,当前用户:%d,用户动作:%d,操作牌值:[%d][%d][%d][%d][%d][%d],扑克列表:[%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d],剩余牌数:%d,总麻将数:%d,操作时间:%d,当前局数:%d") , wBankerUser, wCurrentUser, cbUserAction, ActionCard[0], ActionCard[1], ActionCard[2], ActionCard[3], ActionCard[4], ActionCard[5], TempCardData[0], TempCardData[1], TempCardData[2], TempCardData[3], TempCardData[4], TempCardData[5], TempCardData[6], TempCardData[7], TempCardData[8], TempCardData[9], TempCardData[10], TempCardData[11], TempCardData[12], TempCardData[13], TempCardData[14], TempCardData[15], TempCardData[16], TempCardData[17], TempCardData[18], TempCardData[19], TempCardData[20], TempCardData[21], TempCardData[22], TempCardData[23], TempCardData[24], TempCardData[25], cbLeftCardCount, cbTotalCardCount, cbOptTime, cbCurrPlay); #else _snwprintf(pBuffer, iLen, TEXT("游戏开始->庄家用户:%d,当前用户:%d,用户动作:%d,操作牌值:[%d][%d][%d][%d][%d][%d],扑克列表:[%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d],剩余牌数:%d,总麻将数:%d,操作时间:%d,当前局数:%d") , wBankerUser, wCurrentUser, cbUserAction, ActionCard[0], ActionCard[1], ActionCard[2], ActionCard[3], ActionCard[4], ActionCard[5], TempCardData[0], TempCardData[1], TempCardData[2], TempCardData[3], TempCardData[4], TempCardData[5], TempCardData[6], TempCardData[7], TempCardData[8], TempCardData[9], TempCardData[10], TempCardData[11], TempCardData[12], TempCardData[13], TempCardData[14], TempCardData[15], TempCardData[16], TempCardData[17], TempCardData[18], TempCardData[19], TempCardData[20], TempCardData[21], TempCardData[22], TempCardData[23], TempCardData[24], TempCardData[25], cbLeftCardCount, cbTotalCardCount, cbOptTime, cbCurrPlay); #endif return true; } }; //出牌命令 struct CMD_S_OutCard { WORD wOutCardUser; //出牌用户,座位号 BYTE bOptType; //操作类型(0,表示普通出牌,1,表示癞子杠) BYTE cbOutCardData; //出牌扑克 bool ToString(TCHAR* pBuffer, int iLen) { if (sizeof(CMD_S_OutCard) * 16 > iLen) return false; #ifdef _UNICODE _snwprintf(pBuffer, iLen, TEXT("出牌命令->出牌用户:%d,操作类型(0表示普通出牌,1表示癞子杠):%d,出牌数据:%d") , wOutCardUser, bOptType, cbOutCardData); #else _snwprintf(pBuffer, iLen, TEXT("出牌命令->出牌用户:%d,操作类型(0表示普通出牌,1表示癞子杠):%d,出牌数据:%d") , wOutCardUser, bOptType, cbOutCardData); #endif //mylog::ToSet(pBuffer, iLen); return true; } }; //听牌数据单独协议 struct CMD_S_TingCard { BYTE bOutCardCout; //可以打出的牌就听牌的个数 BYTE bOutCardData[MAX_COUNT]; //具体打哪几张牌 BYTE bTingCardCount[MAX_COUNT]; //相对应打出牌可听牌个数,索引表示第几张,值是对应对应的听牌个数 WORD bTingCardData[MAX_COUNT][MAX_TING];//具体听牌数据,一维索引表示打出牌的第几个,二维索引表示听牌的第几个,值表示牌数据 }; //发送扑克 struct CMD_S_SendCard { BYTE cbCardData; //发牌扑克数据 INT cbActionMask; //动作掩码(0:没操作,0x08:碰牌,0x10:杠,0x80:自摸) BYTE cbActionCard[3]; //操作扑克(杠的时候才有数据,多杠时,补杠,暗杠,朝天才有数据) WORD wCurrentUser; //当前用户 BYTE bTail; //末尾发牌(0:正常发牌,1:末尾) BYTE bLeftCardCount; //剩余牌数 BYTE bOutCardCout; //可以打出的牌就听牌的个数 BYTE bOutCardData[MAX_COUNT]; //具体打哪几张牌 BYTE bTingCardCount[MAX_COUNT]; //相对应打出牌可听牌个数,索引表示第几张,值是对应对应的听牌个数 BYTE bTingCardData[MAX_COUNT][MAX_INDEX];//具体听牌数据,一维索引表示打出牌的第几个,二维索引表示听牌的第几个,值表示牌数据 bool ToString(TCHAR* pBuffer, int iLen) { if (sizeof(CMD_S_SendCard) * 8 > iLen) return false; TCHAR tempcard[2550]; TCHAR sbOutCardData[2550] = { 0 }; ZeroMemory(tempcard, 2550 * sizeof(TCHAR)); ZeroMemory(sbOutCardData, 2550 * sizeof(TCHAR)); for (BYTE i = 0; i < bOutCardCout; i++) { SwitchToStringCard(bOutCardData[i], sbOutCardData, 2550); for (BYTE j = 0; j < bTingCardCount[i]; j++) { BYTE tempCardData = bTingCardData[i][j] & 0x3f; SwitchToStringCard(tempCardData, tempcard, 2550); } StringCchCat(tempcard, 2550, _T("##~")); } #ifdef _UNICODE _snwprintf(pBuffer, iLen, TEXT("派发麻将->麻将数据:%d,动作掩码(0没操作 8碰牌 16杠 128自摸):%d,当前用户:%d,操作牌值:[%d][%d][%d],打出的牌就听牌的个数:%d,打牌数据:%s,相对应听牌数:[%d][%d][%d][%d][%d][%d],相对应听牌数据:%s,听牌位置1:[%d][%d][%d][%d][%d][%d][%d][%d],听牌位置2:[%d][%d][%d][%d][%d][%d],听牌位置3:[%d][%d][%d],听牌位置4:[%d][%d][%d],听牌位置5:[%d][%d][%d],听牌位置6:[%d][%d][%d],听牌位置7:[%d][%d][%d],听牌位置8[%d][%d][%d],听牌位置9:[%d][%d][%d],听牌位置10:[%d][%d][%d],听牌位置11:[%d][%d][%d],听牌位置12:[%d][%d][%d],听牌位置13:[%d][%d][%d],听牌位置14:[%d][%d][%d]") , cbCardData, cbActionMask, wCurrentUser, cbActionCard[0], cbActionCard[1], cbActionCard[2], bOutCardCout, sbOutCardData, bTingCardCount[0], bTingCardCount[1], bTingCardCount[2], bTingCardCount[3], bTingCardCount[4], bTingCardCount[5], tempcard, bTingCardData[0][0], bTingCardData[0][1], bTingCardData[0][2], bTingCardData[0][3], bTingCardData[0][4], bTingCardData[0][5], bTingCardData[0][6], bTingCardData[0][7], bTingCardData[1][0], bTingCardData[1][1], bTingCardData[1][2], bTingCardData[1][3], bTingCardData[1][4], bTingCardData[1][5] , bTingCardData[2][0], bTingCardData[2][1], bTingCardData[2][2], bTingCardData[3][0], bTingCardData[3][1], bTingCardData[3][2], bTingCardData[4][0], bTingCardData[4][1], bTingCardData[4][2] , bTingCardData[5][0], bTingCardData[5][1], bTingCardData[5][2], bTingCardData[6][0], bTingCardData[6][1], bTingCardData[6][2], bTingCardData[7][0], bTingCardData[7][1], bTingCardData[7][2] , bTingCardData[8][0], bTingCardData[8][1], bTingCardData[8][2], bTingCardData[9][0], bTingCardData[9][1], bTingCardData[9][2], bTingCardData[10][0], bTingCardData[10][1], bTingCardData[10][2] , bTingCardData[11][0], bTingCardData[11][1], bTingCardData[11][2], bTingCardData[12][0], bTingCardData[12][1], bTingCardData[12][2], bTingCardData[13][0], bTingCardData[13][1], bTingCardData[13][2]); #else _snwprintf(pBuffer, iLen, TEXT("派发麻将->麻将数据:%d,动作掩码(0没操作 8碰牌 16杠 128自摸):%d,当前用户:%d,操作牌值:%d,操作牌值:%d,操作牌值:%d,打出的牌就听牌的个数:%d,打牌数据:%s,相对应听牌数:[%d][%d][%d][%d][%d][%d],相对应听牌数据:%s,听牌位置1:[%d][%d][%d][%d][%d][%d][%d][%d],听牌位置2:[%d][%d][%d][%d][%d][%d],听牌位置3:[%d][%d][%d],听牌位置4:[%d][%d][%d],听牌位置5:[%d][%d][%d],听牌位置6:[%d][%d][%d],听牌位置7:[%d][%d][%d],听牌位置8[%d][%d][%d],听牌位置9:[%d][%d][%d],听牌位置10:[%d][%d][%d],听牌位置11:[%d][%d][%d],听牌位置12:[%d][%d][%d],听牌位置13:[%d][%d][%d],听牌位置14:[%d][%d][%d]") , cbCardData, cbActionMask, wCurrentUser, cbActionCard[0], cbActionCard[1], cbActionCard[2], bOutCardCout, sbOutCardData, bTingCardCount[0], bTingCardCount[1], bTingCardCount[2], bTingCardCount[3], bTingCardCount[4], bTingCardCount[5], tempcard, bTingCardData[0][0], bTingCardData[0][1], bTingCardData[0][2], bTingCardData[0][3], bTingCardData[0][4], bTingCardData[0][5], bTingCardData[0][6], bTingCardData[0][7], bTingCardData[1][0], bTingCardData[1][1], bTingCardData[1][2], bTingCardData[1][3], bTingCardData[1][4], bTingCardData[1][5] , bTingCardData[2][0], bTingCardData[2][1], bTingCardData[2][2], bTingCardData[3][0], bTingCardData[3][1], bTingCardData[3][2], bTingCardData[4][0], bTingCardData[4][1], bTingCardData[4][2] , bTingCardData[5][0], bTingCardData[5][1], bTingCardData[5][2], bTingCardData[6][0], bTingCardData[6][1], bTingCardData[6][2], bTingCardData[7][0], bTingCardData[7][1], bTingCardData[7][2] , bTingCardData[8][0], bTingCardData[8][1], bTingCardData[8][2], bTingCardData[9][0], bTingCardData[9][1], bTingCardData[9][2], bTingCardData[10][0], bTingCardData[10][1], bTingCardData[10][2] , bTingCardData[11][0], bTingCardData[11][1], bTingCardData[11][2], bTingCardData[12][0], bTingCardData[12][1], bTingCardData[12][2], bTingCardData[13][0], bTingCardData[13][1], bTingCardData[13][2]); #endif //mylog::ToSet(pBuffer, iLen); return true; } bool SwitchToStringCard(BYTE bData, TCHAR pBuffer[], int iLen) { if (wcslen(pBuffer) > 1980 + iLen) { return false; } BYTE iHuaSe = (bData & 0xF0) >> 4; BYTE bValue = (bData & 0x0F); TCHAR szTemp[8]; ZeroMemory(szTemp, 8 * sizeof(TCHAR)); switch (iHuaSe) { case 0: { switch (bValue) { case 1: { StringCchCat(szTemp, 16, _T("一万~")); break; } case 2: { StringCchCat(szTemp, 16, _T("二万~")); break; } case 3: { StringCchCat(szTemp, 16, _T("三万~")); break; } case 4: { StringCchCat(szTemp, 16, _T("四万~")); break; } case 5: { StringCchCat(szTemp, 16, _T("五万~")); break; } case 6: { StringCchCat(szTemp, 16, _T("六万~")); break; } case 7: { StringCchCat(szTemp, 16, _T("七万~")); break; } case 8: { StringCchCat(szTemp, 16, _T("八万~")); break; } case 9: { StringCchCat(szTemp, 16, _T("九万~")); break; } default: break; } break; } case 1: switch (bValue) { case 1: { StringCchCat(szTemp, 16, _T("一条~")); break; } case 2: { StringCchCat(szTemp, 16, _T("二条~")); break; } case 3: { StringCchCat(szTemp, 16, _T("三条~")); break; } case 4: { StringCchCat(szTemp, 16, _T("四条~")); break; } case 5: { StringCchCat(szTemp, 16, _T("五条~")); break; } case 6: { StringCchCat(szTemp, 16, _T("六条~")); break; } case 7: { StringCchCat(szTemp, 16, _T("七条~")); break; } case 8: { StringCchCat(szTemp, 16, _T("八条~")); break; } case 9: { StringCchCat(szTemp, 16, _T("九条~")); break; } default: break; } break; case 2: switch (bValue) { case 1: { StringCchCat(szTemp, 16, _T("一筒~")); break; } case 2: { StringCchCat(szTemp, 16, _T("二筒~")); break; } case 3: { StringCchCat(szTemp, 16, _T("三筒~")); break; } case 4: { StringCchCat(szTemp, 16, _T("四筒~")); break; } case 5: { StringCchCat(szTemp, 16, _T("五筒~")); break; } case 6: { StringCchCat(szTemp, 16, _T("六筒~")); break; } case 7: { StringCchCat(szTemp, 16, _T("七筒~")); break; } case 8: { StringCchCat(szTemp, 16, _T("八筒~")); break; } case 9: { StringCchCat(szTemp, 16, _T("九筒~")); break; } default: break; } break; default: break; } StringCchCat(pBuffer, iLen, szTemp); return true; } }; //花牌发送 struct CMD_S_SendCard_Hua { BYTE cbCardData; //发牌扑克数据 INT cbActionMask; //动作掩码() BYTE cbActionCard[6]; //操作扑克(杠的时候才有数据,多杠时,补杠,暗杠,朝天才有数据) WORD wCurrentUser; //当前用户 BYTE bTail; //末尾发牌(0:正常发牌,1:末尾) BYTE bLeftCardCount; //剩余牌数 BYTE HuShu; //胡数 BYTE PaPoShu; //爬坡数 bool ToString(TCHAR* pBuffer, int iLen) { if (sizeof(CMD_S_SendCard_Hua) * 8 > iLen) return false; //TCHAR tempcard[1024 * 2] = { 0 }; //ZeroMemory(tempcard, 1024 * 2 * sizeof(TCHAR)); #ifdef _UNICODE _snwprintf(pBuffer, iLen, TEXT("派发麻将->麻将数据:%d,动作掩码:%d,当前用户:%d,操作牌值:[%d][%d][%d][%d][%d][%d],是否是统抓牌:%d,剩余牌个数:%d,胡数:%d,爬坡数:%d") , cbCardData, cbActionMask, wCurrentUser, cbActionCard[0], cbActionCard[1], cbActionCard[2], cbActionCard[3], cbActionCard[4], cbActionCard[5], bTail, bLeftCardCount, HuShu, PaPoShu); #else _snwprintf(pBuffer, iLen, TEXT("派发麻将->麻将数据:%d,动作掩码:%d,当前用户:%d,操作牌值:[%d][%d][%d][%d][%d][%d],是否是统抓牌:%d,剩余牌个数:%d,胡数:%d,爬坡数:%d") , cbCardData, cbActionMask, wCurrentUser, cbActionCard[0], cbActionCard[1], cbActionCard[2], cbActionCard[3], cbActionCard[4], cbActionCard[5], bTail, bLeftCardCount, HuShu, PaPoShu); #endif //StringCchCat(pBuffer, iLen / sizeof(TCHAR), tempcard); return true; } }; //操作提示 struct CMD_S_OperateNotify { WORD wResumeUser; //还原用户 INT cbActionMask; //动作掩码() BYTE cbActionCard; //动作扑克 bool ToString(TCHAR* pBuffer, int iLen) { //if(sizeof(CMD_S_OperateNotify) * 8 > iLen) return false; TCHAR tempcard[255] = { 0 }; ZeroMemory(tempcard, 255 * sizeof(TCHAR)); #ifdef _UNICODE _snwprintf(tempcard, 255, TEXT("操作提示->还原用户:%d,动作掩码:%d,动作扑克:%d"), wResumeUser, cbActionMask, cbActionCard); #else _snprintf(tempcard, 255, TEXT("操作提示->还原用户:%d,动作掩码:%d,动作扑克:%d") , wResumeUser, cbActionMask, cbActionCard); #endif StringCchCat(pBuffer, iLen / sizeof(TCHAR), tempcard); return true; } }; //花牌操作提示 struct CMD_S_OperateNotify_Hua { WORD wResumeUser; //还原用户 INT cbActionMask; //动作掩码() BYTE cbActionCard; //动作扑克 BYTE HuShu; //胡数 BYTE PaPo; //爬了几坡 bool ToString(TCHAR* pBuffer, int iLen) { //if(sizeof(CMD_S_OperateNotify) * 8 > iLen) return false; TCHAR tempcard[255] = { 0 }; ZeroMemory(tempcard, 255 * sizeof(TCHAR)); #ifdef _UNICODE _snwprintf(tempcard, 255, TEXT("操作提示->还原用户:%d,动作掩码:%d,动作扑克:%d,胡数:%d,爬坡数:%d"), wResumeUser, cbActionMask, cbActionCard, HuShu, PaPo); #else _snwprintf(tempcard, 255, TEXT("操作提示->还原用户:%d,动作掩码:%d,动作扑克:%d,胡数:%d,爬坡数:%d"), wResumeUser, cbActionMask, cbActionCard, HuShu, PaPo); #endif StringCchCat(pBuffer, iLen / sizeof(TCHAR), tempcard); return true; } }; //请统提示 struct CMD_S_QingTongNotify { WORD OperatorUser; //操作用户 INT cbActionMask; //操作码 BYTE cbActionCard[6]; //动作扑克 bool ToString(TCHAR* pBuffer, int iLen) { TCHAR tempcard[255] = { 0 }; ZeroMemory(tempcard, 255 * sizeof(TCHAR)); #ifdef _UNICODE _snwprintf(tempcard, 255, TEXT("操作提示->操作用户:%d,动作掩码:%d,动作扑克:[%d][%d][%d][%d][%d][%d]"), OperatorUser, cbActionMask, cbActionCard[0], cbActionCard[1], cbActionCard[2], cbActionCard[3], cbActionCard[4], cbActionCard[5]); #else _snwprintf(tempcard, 255, TEXT("操作提示->操作用户:%d,动作掩码:%d,动作扑克:[%d][%d][%d][%d][%d][%d]"), OperatorUser, cbActionMask, cbActionCard[0], cbActionCard[1], cbActionCard[2], cbActionCard[3], cbActionCard[4], cbActionCard[5]); #endif StringCchCat(pBuffer, iLen / sizeof(TCHAR), tempcard); return true; } }; //操作命令 struct CMD_S_OperateResult { WORD wOperateUser; //操作用户 WORD wProvideUser; //供应用户 INT cbOperateCode; //操作代码 BYTE cbOperateCard; //操作扑克 INT cbActionMask; //动作 BYTE cbActionCard[3]; //动作牌值 BYTE bOutCardCout; //可以打出的牌就听牌的出牌个数 BYTE bOutCardData[MAX_COUNT]; //具体打哪几张牌 BYTE bTingCardCount[MAX_COUNT]; //相对应打出牌的可听牌个数,索引表示打出牌索引,值表示可听牌数 BYTE bTingCardData[MAX_COUNT][MAX_INDEX];//具体听牌数据,索引表示打出牌索引,值表示具体牌数据,根据上面值就知道这个有几个值 bool ToString(TCHAR* pBuffer, int iLen) { //if(sizeof(CMD_S_OperateNotify) * 8 > iLen) return false; TCHAR tempcard[1024*2] = { 0 }; ZeroMemory(tempcard, 1024 * 2 * sizeof(TCHAR)); #ifdef _UNICODE _snwprintf(tempcard, iLen / sizeof(TCHAR), TEXT("操作命令->操作用户:%d,供应用户:%d,操作代码:%d,操作扑克:%d,可打出牌个数:%d,具体牌值:[%d][%d][%d],听牌位置1:[%d][%d][%d][%d][%d][%d][%d],听牌位置2:[%d][%d][%d][%d][%d][%d],听牌位置3:[%d][%d][%d],听牌位置4:[%d][%d][%d],听牌位置5:[%d][%d][%d],听牌位置6:[%d][%d][%d],听牌位置7:[%d][%d][%d],听牌位置8[%d][%d][%d],听牌位置9:[%d][%d][%d],听牌位置10:[%d][%d][%d],听牌位置11:[%d][%d][%d],听牌位置12:[%d][%d][%d],听牌位置13:[%d][%d][%d],听牌位置14:[%d][%d][%d]") , wOperateUser, wProvideUser, cbOperateCode, cbOperateCard, bOutCardCout, bOutCardData[0], bOutCardData[1], bOutCardData[2], bTingCardData[0][0], bTingCardData[0][1], bTingCardData[0][2], bTingCardData[0][3], bTingCardData[0][4], bTingCardData[0][5], bTingCardData[0][6], bTingCardData[1][0], bTingCardData[1][1], bTingCardData[1][2], bTingCardData[1][3], bTingCardData[1][4], bTingCardData[1][5] , bTingCardData[2][0], bTingCardData[2][1], bTingCardData[2][2], bTingCardData[3][0], bTingCardData[3][1], bTingCardData[3][2], bTingCardData[4][0], bTingCardData[4][1], bTingCardData[4][2] , bTingCardData[5][0], bTingCardData[5][1], bTingCardData[5][2], bTingCardData[6][0], bTingCardData[6][1], bTingCardData[6][2], bTingCardData[7][0], bTingCardData[7][1], bTingCardData[7][2] , bTingCardData[8][0], bTingCardData[8][1], bTingCardData[8][2], bTingCardData[9][0], bTingCardData[9][1], bTingCardData[9][2], bTingCardData[10][0], bTingCardData[10][1], bTingCardData[10][2] , bTingCardData[11][0], bTingCardData[11][1], bTingCardData[11][2], bTingCardData[12][0], bTingCardData[12][1], bTingCardData[12][2], bTingCardData[13][0], bTingCardData[13][1], bTingCardData[13][2]); #else _snwprintf(tempcard, iLen / sizeof(TCHAR), TEXT("操作命令->操作用户:%d,供应用户:%d,操作代码:%d,操作扑克:%d,可打出牌个数:%d,具体牌值:[%d][%d][%d],听牌位置1:[%d][%d][%d][%d][%d][%d][%d],听牌位置2:[%d][%d][%d][%d][%d][%d],听牌位置3:[%d][%d][%d],听牌位置4:[%d][%d][%d],听牌位置5:[%d][%d][%d],听牌位置6:[%d][%d][%d],听牌位置7:[%d][%d][%d],听牌位置8[%d][%d][%d],听牌位置9:[%d][%d][%d],听牌位置10:[%d][%d][%d],听牌位置11:[%d][%d][%d],听牌位置12:[%d][%d][%d],听牌位置13:[%d][%d][%d],听牌位置14:[%d][%d][%d]") , wOperateUser, wProvideUser, cbOperateCode, cbOperateCard, bOutCardCout, bOutCardData[0], bOutCardData[1], bOutCardData[2], bTingCardData[0][0], bTingCardData[0][1], bTingCardData[0][2], bTingCardData[0][3], bTingCardData[0][4], bTingCardData[0][5], bTingCardData[0][6], bTingCardData[1][0], bTingCardData[1][1], bTingCardData[1][2], bTingCardData[1][3], bTingCardData[1][4], bTingCardData[1][5] , bTingCardData[2][0], bTingCardData[2][1], bTingCardData[2][2], bTingCardData[3][0], bTingCardData[3][1], bTingCardData[3][2], bTingCardData[4][0], bTingCardData[4][1], bTingCardData[4][2] , bTingCardData[5][0], bTingCardData[5][1], bTingCardData[5][2], bTingCardData[6][0], bTingCardData[6][1], bTingCardData[6][2], bTingCardData[7][0], bTingCardData[7][1], bTingCardData[7][2] , bTingCardData[8][0], bTingCardData[8][1], bTingCardData[8][2], bTingCardData[9][0], bTingCardData[9][1], bTingCardData[9][2], bTingCardData[10][0], bTingCardData[10][1], bTingCardData[10][2] , bTingCardData[11][0], bTingCardData[11][1], bTingCardData[11][2], bTingCardData[12][0], bTingCardData[12][1], bTingCardData[12][2], bTingCardData[13][0], bTingCardData[13][1], bTingCardData[13][2]); #endif StringCchCat(pBuffer, iLen / sizeof(TCHAR), tempcard); return true; } }; // struct CMD_S_OperateResult_Hua { WORD wOperateUser; //操作用户 WORD wProvideUser; //供应用户 INT cbOperateCode; //操作代码 BYTE cbOperateCard; //操作扑克 BYTE cbHuaGangCard[4]; //操作扑克 INT cbActionMask; //动作 BYTE cbActionCard[6]; //动作牌值 BYTE cbOperateScore; //胡数 bool ToString(TCHAR* pBuffer, int iLen) { TCHAR tempcard[1024 * 2] = { 0 }; ZeroMemory(tempcard, 1024 * 2 * sizeof(TCHAR)); #ifdef _UNICODE _snwprintf(tempcard, iLen / sizeof(TCHAR), TEXT("操作命令->操作用户:%d,供应用户:%d,操作代码:%d,操作扑克:%d,附加操作扑克:[%d][%d][%d][%d],返回操作码:%d,具体牌值:[%d][%d][%d][%d][%d][%d]"), wOperateUser, wProvideUser, cbOperateCode, cbOperateCard, cbHuaGangCard[0], cbHuaGangCard[1], cbHuaGangCard[2], cbHuaGangCard[3], cbActionMask, cbActionCard[0], cbActionCard[1], cbActionCard[2], cbActionCard[3], cbActionCard[4], cbActionCard[5]); #else _snwprintf(tempcard, iLen / sizeof(TCHAR), TEXT("操作命令->操作用户:%d,供应用户:%d,操作代码:%d,操作扑克:%d,附加操作扑克:[%d][%d][%d][%d],返回操作码:%d,具体牌值:[%d][%d][%d][%d][%d][%d]"), wOperateUser, wProvideUser, cbOperateCode, cbOperateCard, cbHuaGangCard[0], cbHuaGangCard[1], cbHuaGangCard[2], cbHuaGangCard[3], cbActionMask, cbActionCard[0], cbActionCard[1], cbActionCard[2], cbActionCard[3], cbActionCard[4], cbActionCard[5]); #endif StringCchCat(pBuffer, iLen / sizeof(TCHAR), tempcard); return true; } }; //血流game结束 struct CMD_S_XueLiuEnd { BYTE bFinish;//是否结束本轮。0表示否,1表示是 BYTE cbCardData[GAME_PLAYER][MAX_COUNT]; //玩家手牌 BYTE checkHuazhu[GAME_PLAYER]; //默认0 1查叫 2花猪 int checkCoin[GAME_PLAYER]; // 查花猪 或查叫的积分变化值 int DangJu[GAME_PLAYER]; //单局积分 int leftCoin[GAME_PLAYER]; //玩家积分 BYTE winScoreNum; //积分变化次数 BYTE winScoreType[MAX_CHANGE_SCORE]; //类型 BYTE winScoreRate[MAX_CHANGE_SCORE]; //倍数 int winScore[MAX_CHANGE_SCORE]; //分数 BYTE winProvider[MAX_CHANGE_SCORE]; //关连玩家 0表示3家 1下家 2对家 3上家 BYTE winFanType[MAX_CHANGE_SCORE]; //番型 }; //游戏结束 struct CMD_S_GameEnd { BYTE bOptType; //1操作类型(1胡牌结束,2黄庄,3解散)1 WORD bWanJiaId; //2玩家座位号 3 BYTE cbCardData[GAME_PLAYER][MAX_COUNT]; //62玩家手牌值 59 INT cbWanJiaScore[GAME_PLAYER]; //66玩家目前所拥有积分 75 BYTE bZimo[GAME_PLAYER]; //70每位玩家胡牌次数 79 BYTE bFinish; //71是否结束本轮。0表示否,1表示是 80 DWORD dwOwnerID; //75房主ID 84 BYTE bLeftCardCount; //76剩余牌数 85 BYTE bLeftCardDada[54]; //130剩余牌值 139 BYTE playGameNum; //打到第几局了 140 INT lGameScoreDetail[16 * GAME_PLAYER]; //195流水详情 204 }; //花牌游戏结束 struct CMD_S_GameEnd_Hua { BYTE bOptType; //1操作类型(1胡牌结束,2黄庄,3解散) WORD bWanJiaId; //2玩家座位号(胡牌玩家) BYTE bHuPaiCard; //1玩家座位号(胡牌牌值)(自摸牌值为零,点炮才有值) BYTE YingJiaCard[9][5]; //45赢家手牌排列 BYTE ZhuGold; //1主经 BYTE HuShu; //1胡数 BYTE cbCardIndex[GAME_PLAY][28]; //84玩家手牌值 INT cbBianDongScore[GAME_PLAY]; //12玩家积分变动 INT cbWanJiaScore[GAME_PLAY]; //12玩家目前所拥有积分 BYTE bZimo[GAME_PLAY]; //3每位玩家胡牌次数 BYTE bFinish; //1是否结束本轮。0表示否,1表示是 163 BYTE bLeftCardCount; //1剩余牌数 164 BYTE bLeftCardDada[47]; //130剩余牌值 BYTE playGameNum; //打到第几局了 INT lGameScoreDetail[16 * GAME_PLAY]; //195流水详情 }; //用户准备 struct CMD_S_Reading { BYTE bReading; WORD wChairID; }; //用户托管 struct CMD_S_Trustee { bool bTrustee; //是否托管 WORD wChairID; //托管用户 }; // struct CMD_S_ChiHu { //WORD wChiHuUser[3]; //胡牌人 BYTE wChiHuUser[GAME_PLAYER]; //下标胡牌人,值胡牌次数 WORD wProviderUser; //放炮人,只有自摸 BYTE cbChiHuCard; //胡牌数据 //BYTE TingPaiCard[MAX_COUNT]; //听牌数据 }; //积分变动 struct CMD_S_GangScore { WORD wChairId; //用户 int cbOperateCode; //操作代码 int lGangScore[GAME_PLAYER]; //杠积分算法,存得是每个用户积分变动情况 int cbWanJiaScore[GAME_PLAYER]; //玩家目前所拥有积分 }; struct CMD_S_DIGNQUE { BYTE cbDingQue[GAME_PLAYER]; }; struct CMD_S_HuanSanZhang { BYTE cbSice; BYTE cbCard1[GAME_PLAYER]; BYTE cbCard2[GAME_PLAYER]; BYTE cbCard3[GAME_PLAYER]; WORD wChairID[GAME_PLAYER]; INT cbUserAction; //用户动作(0:没操作,0x08:碰牌,0x10:杠,0x80:自摸等) BYTE ActionCard[3]; //动作所对应的牌 }; //游戏回放回放 struct GameRecordPacket { WORD wChairID; WORD wMainCmdID; WORD wSubCmdID; WORD wSize; void* pData; }; struct ChairRecord { WORD wChairId; //椅子号 UINT32 dwUserId; //用户id TCHAR userName[LEN_NICKNAME];//用户名 TCHAR headUrl[LEN_HEAD_URL]; //头像 }; struct CMD_GR_ReplayRecordResp { UINT32 m_UUID; //回放唯一ID UINT32 m_tableID; //公开桌子号 UINT32 m_startTime; //游戏开始时间 UINT32 m_endTime; //游戏结束时间 UINT32 m_UserId; //用户ID CMD_S_GameConfig m_gameconfig; //游戏基本配置 ChairRecord m_chairList[GAME_PLAYER]; //游戏椅子玩家信息 UINT16 m_recordCount; //回放数据记录数 char pData[0]; //回放记录列表(尾拖数据) }; struct CMD_S_GameNotify { WORD m_wChairID; // //UINT32 m_notifyType; //通知类型。1表示定缺,2表示换三张 }; struct CMD_S_YIWEI_HUA { BYTE bFlag;//表示是否成功(1表示成功,2表示牌值有问题,3表示开始位置失败,4表示开始成功结束失败) BYTE StarIpOne; BYTE StarIpTwo; BYTE EndIpOne; BYTE EndIpTwo; BYTE CardData; bool ToString(TCHAR* pBuffer, int iLen) { //if(sizeof(CMD_S_OperateNotify) * 8 > iLen) return false; TCHAR tempcard[255] = { 0 }; ZeroMemory(tempcard, 255 * sizeof(TCHAR)); #ifdef _UNICODE _snwprintf(tempcard, 255, TEXT("移动牌命令->1成功2牌值问题3开始失败4结束失败:%d,开始位置:[%d][%d],结束位置:[%d][%d],牌值:%d"), bFlag, StarIpOne, StarIpTwo, EndIpOne, EndIpTwo, CardData); #else _snwprintf(tempcard, 255, TEXT("移动牌命令->1成功2牌值问题3开始失败4结束失败:%d,开始位置:[%d][%d],结束位置:[%d][%d],牌值:%d"), bFlag, StarIpOne, StarIpTwo, EndIpOne, EndIpTwo, CardData); #endif StringCchCat(pBuffer, iLen / sizeof(TCHAR), tempcard); return true; } }; ////////////////////////////////////////////////////////////////////////// //客户端命令结构 #define SUB_C_OUT_CARD 1 //出牌命令 #define SUB_C_OPERATE_CARD 3 //操作扑克 #define SUB_C_TRUSTEE 4 //用户托管 //#define SUB_C_QINGTONG 5 //请统操作 #define SUB_C_REPLAY 6 //回放 //#define SUB_C_DIGNQUE 5 //定缺,一脚耐油用不到 //#define SUB_C_READING 99 //用户准备 //#define SUB_C_TINGPAI 2 //听牌按钮 #define SUB_C_HUAN_SAN_ZHANG 7 //换三张,一脚耐油用不到 #define SUB_C_OUT_CARD_HUA 11 //花牌出牌命令 #define SUB_C_OPERATE_CARD_HUA 13 //花牌操作扑克 #define SUB_C_TRUSTEE_HUA 14 //花牌用户托管 #define SUB_C_YIWEI_HUA 15 //花牌手牌移位操作 #define SUB_C_REPLAY_HUA 16 //花牌回放 //出牌命令 struct CMD_C_OutCard { BYTE cbCardData; //扑克数据 bool ToString(TCHAR* pBuffer, int iLen) { //if(sizeof(CMD_S_OperateNotify) * 8 > iLen) return false; TCHAR tempcard[255] = { 0 }; ZeroMemory(tempcard, 255 * sizeof(TCHAR)); #ifdef _UNICODE _snwprintf(tempcard, 255, TEXT("出牌命令->出牌牌值:%d"), cbCardData); #else _snwprintf(tempcard, 255, TEXT("出牌命令->出牌牌值:%d"), cbCardData); #endif StringCchCat(pBuffer, iLen / sizeof(TCHAR), tempcard); return true; } }; //出牌命令 struct CMD_C_OutCard_Hua { BYTE cbCardData; //扑克数据 BYTE cbCardWeiZhi; //起始位置 bool ToString(TCHAR* pBuffer, int iLen) { //if(sizeof(CMD_S_OperateNotify) * 8 > iLen) return false; TCHAR tempcard[255] = { 0 }; ZeroMemory(tempcard, 255 * sizeof(TCHAR)); #ifdef _UNICODE _snwprintf(tempcard, 255, TEXT("出牌命令->出牌牌值:%d,位置%d"), cbCardData, cbCardWeiZhi); #else _snwprintf(tempcard, 255, TEXT("出牌命令->出牌牌值:%d,位置%d"), cbCardData, cbCardWeiZhi); #endif StringCchCat(pBuffer, iLen / sizeof(TCHAR), tempcard); return true; } }; //操作命令 struct CMD_C_OperateCard { INT cbOperateCode; //操作代码 BYTE cbOperateCard; //操作扑克 bool ToString(TCHAR* pBuffer, int iLen) { //if(sizeof(CMD_S_OperateNotify) * 8 > iLen) return false; TCHAR tempcard[255] = { 0 }; ZeroMemory(tempcard, 255 * sizeof(TCHAR)); #ifdef _UNICODE _snwprintf(tempcard, 255, TEXT("操作命令->操作代码:%d,操作扑克:%d"), cbOperateCode, cbOperateCard); #else _snprintf(tempcard, 255, TEXT("操作命令->操作代码:%d,操作扑克:%d"), cbOperateCode, cbOperateCard); #endif StringCchCat(pBuffer, iLen / sizeof(TCHAR), tempcard); return true; } }; struct CMD_C_OperateCard_Hua { INT cbOperateCode; //操作代码 BYTE cbOperateCard; //操作扑克 BYTE cbHuaCard[4]; //前2 花牌 后2 别杠 bool ToString(TCHAR* pBuffer, int iLen) { //if(sizeof(CMD_S_OperateNotify) * 8 > iLen) return false; TCHAR tempcard[255] = { 0 }; ZeroMemory(tempcard, 255 * sizeof(TCHAR)); #ifdef _UNICODE _snwprintf(tempcard, 255, TEXT("操作命令->操作代码:%d,操作扑克:%d,%d,%d,%d,%d"), cbOperateCode, cbOperateCard, cbHuaCard[0], cbHuaCard[1], cbHuaCard[2], cbHuaCard[3]); #else _snwprintf(tempcard, 255, TEXT("操作命令->操作代码:%d,操作扑克:%d,%d,%d,%d,%d"), cbOperateCode, cbOperateCard, cbHuaCard[0], cbHuaCard[1], cbHuaCard[2], cbHuaCard[3]); #endif StringCchCat(pBuffer, iLen / sizeof(TCHAR), tempcard); return true; } }; //用户托管 struct CMD_C_Trustee { bool bTrustee; //是否托管 }; enum Huase { Huase_wan = 0, //万字 Huase_tiao, //1条子 Huase_tong, //2筒字 }; //操作命令 struct CMD_C_DingQue { BYTE cbHuaSeCode; //花色代码 (0万子,1条 子,2筒字) }; //花牌移位操作 struct CMD_C_YIWEI_HUA { BYTE cbStartIp; //从左到右,0-8个位置 BYTE cbEndIp; //从左到右,0-8个位置 BYTE cbOperateCard; //操作扑克 bool ToString(TCHAR* pBuffer, int iLen) { //if(sizeof(CMD_S_OperateNotify) * 8 > iLen) return false; TCHAR tempcard[255] = { 0 }; ZeroMemory(tempcard, 255 * sizeof(TCHAR)); #ifdef _UNICODE _snwprintf(tempcard, 255, TEXT("移位命令->开始位置:%d,结束位置:%d,操作扑克:%d"), cbStartIp, cbEndIp, cbOperateCard); #else _snwprintf(tempcard, 255, TEXT("移位命令->开始位置:%d,结束位置:%d,操作扑克:%d"), cbStartIp, cbEndIp, cbOperateCard); #endif StringCchCat(pBuffer, iLen / sizeof(TCHAR), tempcard); return true; } }; //出牌命令 struct CMD_C_RePlay { UINT32 m_UUID; //回放记录ID }; struct CMD_C_HuanSanZhang { byte cbCard1; byte cbCard2; byte cbCard3; }; ////////////////////////////////////////////////////////////////////////// #pragma pack() #endif