#ifndef CMD_SPARROW_HEAD_FILE #define CMD_SPARROW_HEAD_FILE #pragma pack(1) ////////////////////////////////////////////////////////////////////////// //公共宏定义 #define KIND_ID 558 //游戏 I D #define GAME_PLAYER 4 //游戏人数 #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_BATCH (GAME_STATUS_PLAY+1) //洗澡状态 #define GS_MJ_SICE (GAME_STATUS_PLAY+2) //筛子状态 #define GS_MJ_PLAY (GAME_STATUS_PLAY+3) //游戏状态 #define MAX_COUNT 14 //最大数目 #define MUST_LEFT_COUNT 1 //预留数目 #define MAX_INDEX 34 //最大索引 ////////////////////////////////////////////////////////////////////////// #define VERSION_SERVER PROCESS_VERSION(6,0,3) //程序版本 #define VERSION_CLIENT PROCESS_VERSION(6,0,3) //程序版本 //组合子项 struct tagWeaveItem { WORD wWeaveKind; //组合类型 BYTE cbCenterCard; //中心扑克 BYTE cbPublicCard; //公开标志 WORD wProvideUser; //供应用户 }; enum eWNMJHURuleEnum { eWNMJHURuleEnum_Invalid = 0, eWNMJHURuleEnum_YingHU = 1, eWNMJHURuleEnum_YiBianDaoHU = 2, eWNMJHURuleEnum_HunHU = 3, }; enum eWNMJRuleEnum { eWNMJRuleEnum_Null = 0, //无效值; eWNMJRuleEnum_CardAA = 1, //房卡AA; eWNMJRuleEnum_OneTwoFAN = 1 << 1, //1,2翻倍; eWNMJRuleEnum_TwoThreeFAN = 1 << 2, //2,3翻倍; eWNMJRuleEnum_YingHU = 1 << 3, //硬胡; eWNMJRuleEnum_YiBianDaoHU = 1 << 4, //一边倒胡; eWNMJRuleEnum_HunHU = 1 << 5, //混子打发; eWNMJRuleEnum_ZhiAnGang = 1 << 6, //直暗杠翻倍; eWNMJRuleEnum_PlayCount2 = 1 << 7, //2人; eWNMJRuleEnum_PlayCount3 = 1 << 8, //3人; eWNMJRuleEnum_PlayCount_auto = 1 << 29, //2~4人; eWNMJRuleEnum_DaiKaiFang = 1 << 30, //代开房; eWNMJRuleEnum_NOSameIPAddr = 1 << 31, //不可以同IP地址; }; ////////////////////////////////////////////////////////////////////////// //服务器命令结构 #define SUB_S_GAME_START 100 //游戏开始 #define SUB_S_OUT_CARD 101 //出牌命令 #define SUB_S_SEND_CARD 102 //发送扑克 #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_BATCH 108 //洗澡命令 #define SUB_S_GANG_SCORE 109 //杠分消息; #define SUB_S_MASTER_LEFTCARD 114 //剩余牌堆 //游戏状态 struct CMD_S_StatusFree { SCORE lCellScore; //基础金币 WORD wBankerUser; //庄家用户 bool bTrustee[GAME_PLAYER]; //是否托管 bool bActiveStatus[GAME_PLAYER]; //玩家状态; SCORE lAllTurnScore; //总局得分 SCORE lLastTurnScore; //上局得分 }; //游戏状态 struct CMD_S_StatusBatch { SCORE lCellScore; //基础金币 BYTE bComplete; //完成标志 bool bTrustee[GAME_PLAYER]; //是否托管 bool bActiveStatus[GAME_PLAYER]; //玩家状态; //历史积分 SCORE lAllTurnScore[4]; //总局得分 SCORE lLastTurnScore[4]; //上局得分 }; //杠牌结果 struct tagGangCardResult { BYTE cbCardCount; //扑克数目 BYTE cbCardData[4]; //扑克数据 }; //游戏状态 struct CMD_S_StatusPlay { //游戏变量 SCORE lCellScore; //单元积分 WORD wSiceCount; //骰子点数 WORD wSiceCount2; //骰子点数 WORD wSiceCount3; //骰子点数 WORD wBankerUser; //庄家用户 WORD wCurrentUser; //当前用户 bool bTrustee[GAME_PLAYER]; //是否托管 bool bActiveStatus[GAME_PLAYER]; //玩家状态; //风牌记录 BYTE cbFengCardData[8]; //风牌记录 BYTE cbFengCardCount; //风牌记录 //状态变量 BYTE cbLeftCardCount; //剩余数目 BYTE cbActionCard; //动作扑克 WORD dwActionMask; //动作掩码 tagGangCardResult GangPaiResult; //杠牌操作 //出牌信息 WORD wOutCardUser; //出牌用户 BYTE cbOutCardData; //出牌扑克 BYTE cbDiscardCount[4]; //丢弃数目 BYTE cbDiscardCard[4][55]; //丢弃记录 //扑克数据 BYTE cbCardCount; //扑克数目 BYTE cbCardData[MAX_COUNT]; //扑克列表 BYTE cbSendCardData; //发送扑克 //组合扑克 BYTE cbWeaveCount[4]; //组合数目 tagWeaveItem WeaveItemArray[4][4]; //组合扑克 //历史积分 SCORE lAllTurnScore[4]; //总局得分 SCORE lLastTurnScore[4]; //上局得分 }; //游戏开始 struct CMD_S_GameStart { WORD wSiceCount; //骰子点数 WORD wBankerUser; //庄家用户 WORD wCurrentUser; //当前用户 BYTE wUserAction; //用户动作 tagGangCardResult GangPaiResult; //杠牌操作 BYTE cbCardData[MAX_COUNT]; //扑克列表 bool bTrustee[GAME_PLAYER]; //是否托管 bool bActiveStatus[GAME_PLAYER]; //玩家状态; }; // 录像专用; struct CMD_R_GameStart { WORD wSiceCount; //骰子点数 WORD wBankerUser; //庄家用户 WORD wCurrentUser; //当前用户 BYTE wUserAction; //用户动作 bool bActiveStatus[GAME_PLAYER]; //玩家状态; BYTE cbCardData[GAME_PLAYER][MAX_COUNT]; //扑克列表 }; struct CMD_S_BatchResult { BYTE cbBatchResult[GAME_PLAYER]; //庄家用户 }; //出牌命令 struct CMD_S_OutCard { WORD wOutCardUser; //出牌用户 BYTE cbOutCardData; //出牌扑克 }; //发送扑克 struct CMD_S_SendCard { BYTE cbCardData; //扑克数据 WORD wActionMask; //动作掩码 WORD wCurrentUser; //当前用户 bool cbIsNotGang; //是否杠牌 tagGangCardResult GangPaiResult; //杠牌操作 }; //操作提示 struct CMD_S_OperateNotify { WORD wResumeUser; //还原用户 WORD dwActionMask; //动作掩码 BYTE cbActionCard; //动作扑克 tagGangCardResult GangPaiResult; //杠牌操作 }; //操作命令 struct CMD_S_OperateResult { WORD wOperateUser; //操作用户 WORD wProvideUser; //供应用户 WORD dwOperateCode; //操作代码 BYTE cbOperateCard; //操作扑克 }; //杠分消息; struct CMD_S_GangScore { WORD wChairId; //杠牌者; BYTE cbXiaYu; //是否暗杠; }; //游戏结束 struct CMD_S_GameEnd { //税收 SCORE lGameTax; //游戏税收 bool bActiveStatus[GAME_PLAYER]; //玩家状态; //结束信息 WORD wProvideUser; //供应用户 BYTE cbChiHuCard; //供应扑克 DWORD dwChiHuKind[GAME_PLAYER]; //胡牌类型 DWORD dwChiHuRight[GAME_PLAYER]; //胡牌类型 //积分信息 SCORE lGameScore[GAME_PLAYER]; //游戏积分 SCORE lGameScoreEx[GAME_PLAYER]; //奖励分 SCORE lGameHuScore[GAME_PLAYER]; //胡牌分; //扑克信息 BYTE cbCardCount[GAME_PLAYER]; //扑克数目 BYTE cbCardData[GAME_PLAYER][MAX_COUNT]; //扑克数据 BYTE cbWeaveItemCount[GAME_PLAYER]; //组合数目 tagWeaveItem WeaveItemArray[GAME_PLAYER][4]; //组合牌 SCORE lAllTurnScore[GAME_PLAYER]; //总局得分 SCORE lLastTurnScore[GAME_PLAYER]; //上局得分 }; //用户托管 struct CMD_S_Trustee { bool bTrustee; //是否托管 WORD wChairID; //托管用户 }; ////////////////////////////////////////////////////////////////////////// //客户端命令结构 #define SUB_C_OUT_CARD 1 //出牌命令; #define SUB_C_BATCH 2 //洗澡开始; #define SUB_C_OPERATE_CARD 3 //操作扑克; #define SUB_C_TRUSTEE 4 //用户托管; #define SUB_C_BATCH_END 5 //洗澡完毕; #define SUB_C_PASS_KING 6 //经过精牌; #define SUB_C_MASTER_CHEAKCARD 10 //选择的牌; #define SUB_C_MASTER_LEFTCARD 11 //剩余牌堆; //出牌命令 struct CMD_C_OutCard { BYTE cbCardData; //扑克数据 }; //洗澡 struct CMD_C_BATCH { BYTE cbChipTimes; //买顶倍数 WORD wCurrentUser; //当前用户 }; //操作命令 struct CMD_C_OperateCard { WORD dwOperateCode; //操作代码 BYTE cbOperateCard; //操作扑克 }; //用户托管 struct CMD_C_Trustee { bool bTrustee; //是否托管 }; struct CMD_C_MaterCheckCard { BYTE cbCheakCard; //操作代码 }; struct MasterLeftCard { BYTE kMasterCheakCard; // 当前选择; BYTE kMasterLeftIndex[MAX_INDEX]; // 排堆; }; // 游戏解散结构 struct CMD_S_Private_End_Info { bool aryActiveStatus[GAME_PLAYER]; //玩家状态; BYTE cbAllGangCounts[GAME_PLAYER]; //统计杠的次数; BYTE cbZiMoCout[GAME_PLAYER]; //自摸次数; BYTE cbDianPaoCout[GAME_PLAYER]; //点炮次数; SCORE lAllScore[GAME_PLAYER]; //总成绩; SCORE lMaxScore[GAME_PLAYER]; //最高得分; void StreamValue(DataStream& kData, bool bSend) { if (bSend) { kData.pushValue(this, sizeof(CMD_S_Private_End_Info)); } else { kData.popValue(this, sizeof(CMD_S_Private_End_Info)); } } }; extern void MyLog(TCHAR *szLog, ...); ////////////////////////////////////////////////////////////////////////// #pragma pack() #endif