诸暨麻将添加redis
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
 
 
 
 
 
 

268 строки
9.3 KiB

  1. #ifndef TABLE_FRAME_SINK_50K_HEAD_FILE
  2. #define TABLE_FRAME_SINK_50K_HEAD_FILE
  3. #pragma once
  4. #include "../Stdafx.h"
  5. #include "../data.h"
  6. #include <fstream>
  7. #include <vector>
  8. #include <map>
  9. #include <list>
  10. #include<algorithm>
  11. #include "GameLogic_poker.h"
  12. using namespace std;
  13. //回放
  14. struct CMD_GR_ReplayRecordResp_Poker
  15. {
  16. UINT32 m_UUID; //回放唯一ID
  17. UINT32 m_tableID; //公开桌子号
  18. UINT32 m_startTime; //游戏开始时间
  19. UINT32 m_endTime; //游戏结束时间
  20. UINT32 m_UserId; //用户ID
  21. CMD_S_GameConfig_Poker m_gameconfig; //游戏基本配置
  22. ChairRecord m_chairList[GAME_PLAYER]; //游戏椅子玩家信息
  23. UINT16 m_recordCount; //回放数据记录数
  24. char pData[0]; //回放记录列表(尾拖数据)
  25. };
  26. //游戏桌子类
  27. class CTableFrameSinkPoker : public ITableFrameSink, public ITableUserAction
  28. {
  29. //游戏变量
  30. private:
  31. ITableFrame* m_pITableFrame; //框架接口
  32. const tagGameServiceOption* m_pGameServiceOption; //配置参数
  33. CMD_S_GameConfig_Poker m_gameConfig; //房间配置
  34. CGameLogic_Poker m_GameLogic; //扑克逻辑类
  35. BYTE m_cbPlayerNum; //游戏人数
  36. BYTE m_cbCardNum; //游戏牌数
  37. // 用户状态
  38. BYTE m_cbOffline[GAME_PLAYER]; //是否断线 0正常 1断线
  39. BYTE m_cbTrustee[GAME_PLAYER]; //是否托管 0正常 1托管
  40. BYTE m_cbTimeOutCount[GAME_PLAYER]; //超时次数 连续两次触发托管
  41. UINT m_unUserID[GAME_PLAYER]; //顺时针用户顺序
  42. // 玩家分数
  43. INT m_lGameTatolScore[GAME_PLAYER]; //16局积分
  44. //BYTE m_nWins[GAME_PLAYER]; //胜场数
  45. int m_HuPaiLiuShui[16 * GAME_PLAYER]; //流水详情
  46. // 游戏回放
  47. bool m_bReplayRecordStart; //是否开始录像
  48. std::vector<GameRecordPacket> m_UserReplayRecord; //对四个位置用户的数据的记录,用于回放。
  49. /*
  50. ------------------------------------------------------------------------------------
  51. 单局变量
  52. */
  53. int m_GameScore[GAME_PLAYER]; //本局总积分
  54. short m_lGameGongXianScore[GAME_PLAYER]; //本局贡献分
  55. short m_lGameAwardScore[GAME_PLAYER]; //本局双扣基础分
  56. WORD m_wWinCount; //胜利人数
  57. BYTE m_wWinOrder[GAME_PLAYER]; //出完牌顺序
  58. BYTE m_winLoseCount[GAME_PLAYER]; //玩家胜利失败次数
  59. WORD m_wTurnWiner; //胜利玩家
  60. WORD m_wBankerUser; //庄家用户
  61. WORD m_wCurrentUser; //当前玩家
  62. WORD m_wCurrentOperate; //当前用户操作类型
  63. BYTE m_cbTurnCardCount; //出牌数目
  64. BYTE m_cbTurnCardData[MAX_COUNT_Poker]; //出牌数据 真实牌
  65. BYTE m_cbMagicCardData[MAX_COUNT_Poker]; //变幻扑克 如果有magic 则是变换后的牌
  66. bool m_bTrustee[GAME_PLAYER]; //是否托管
  67. bool m_bSwitchChair; //交换位置
  68. WORD m_wSourceID[2]; //原始ID
  69. WORD m_wTargetID[2]; //目标ID
  70. bool m_bResponse[GAME_PLAYER]; //用户反馈
  71. // 要牌状态
  72. BYTE m_cbResponse[GAME_PLAYER]; //1:要不起|2:要了|0:未操作 出牌判定时需要:如果两家要不起,随意出牌;如果某家要了,需接上次出牌
  73. BYTE m_cbUserOPerate_mask[GAME_PLAYER]; //记录了 每个玩家的操作类型
  74. // 发牌信息
  75. BYTE m_cbLeftCardCount; //剩余数目
  76. BYTE m_cbRepertoryCard[FULL_COUNT_Poker]; //库存扑克
  77. BYTE m_cbCardDataCount[GAME_PLAYER]; //扑克数目
  78. BYTE m_cbCardData[GAME_PLAYER][MAX_COUNT_Poker]; //用户手上扑克
  79. BYTE m_cbStartRandCard;//双扣开始时 随机扑克 的数值
  80. // 出牌提示
  81. BYTE m_cbHintNum; //提示数目
  82. BYTE m_cbCurrentHintNum; //当前提示数目
  83. std::vector<HitStruct> mHistList; //所有的提示牌
  84. // 出牌信息
  85. OutCard m_struOutCard; //上家出牌
  86. list<OutCard> m_listOutCard; //出牌记录
  87. BYTE m_cbJokerReplacePoker[4][4]; //当前玩家出的牌中王替换的牌
  88. BYTE m_BomoCouut[GAME_PLAYER]; //本局每个人的炸弹个数
  89. BYTE m_lastLianxianInfo; //上一个出牌玩家的 炸弹 连排信息
  90. BYTE m_BoomCountInfo[4][9]; //记录每个玩家 单局4 5 6 7 8 9 10 11 12 线 炸弹的累计次数
  91. /*
  92. 基础函数定义 ----------------------------------------------------------------------------
  93. */
  94. public:
  95. //构造函数
  96. CTableFrameSinkPoker();
  97. //析构函数
  98. virtual ~CTableFrameSinkPoker();
  99. //释放对象
  100. virtual VOID Release() { delete this; }
  101. //接口查询
  102. virtual void * QueryInterface(const IID & Guid, DWORD dwQueryVer);
  103. //初始化
  104. virtual bool Initialization(IUnknownEx * pIUnknownEx);
  105. //复位桌子
  106. virtual VOID RepositionSink();
  107. //删除桌子
  108. virtual void DeletePrivateTable(bool bSendState = false);
  109. virtual bool ConcludeGame(BYTE cbGameStatus, bool bSendState = false)
  110. {
  111. //结束记录回放数据
  112. auto dataPair = RepayRecordEnd();
  113. //结束游戏
  114. m_pITableFrame->ConcludeGame(cbGameStatus, bSendState);
  115. return true;
  116. }
  117. //查询限额
  118. virtual SCORE QueryConsumeQuota(IServerUserItem * pIServerUserItem){ return 0; };
  119. //最少积分
  120. virtual SCORE QueryLessEnterScore(WORD wChairID, IServerUserItem * pIServerUserItem){ return 0; };
  121. //查询是否扣服务费
  122. virtual bool QueryBuckleServiceCharge(WORD wChairID){ return true; }
  123. //查询总得分
  124. virtual int QueryTatolScore(WORD wChairID){ if (wChairID >= GAME_PLAYER || wChairID<0) ASSERT(false); return m_lGameTatolScore[wChairID]; }
  125. //查询癞子数
  126. virtual int QueryTatolLaiGang(WORD wChairID){ if (wChairID >= GAME_PLAYER || wChairID < 0) ASSERT(false); return 0; }
  127. //查询是否使用临时积分
  128. virtual bool QueryUseTemporaryScore() {
  129. return (0 != lstrlen(m_gameConfig.sPrivateTableID)); //私有房间私用临时积分
  130. }
  131. //设置基数
  132. virtual void SetGameBaseScore(LONG lBaseScore){};
  133. /*
  134. 用户事件 ----------------------------------------------------------------------------
  135. */
  136. //public:
  137. //用户断线
  138. virtual bool OnActionUserOffLine(WORD wChairID, IServerUserItem * pIServerUserItem) { return true; }
  139. //用户重入 需要处理重新发送指令
  140. virtual bool OnActionUserConnect(WORD wChairID, IServerUserItem * pIServerUserItem);
  141. //用户坐下
  142. virtual bool OnActionUserSitDown(WORD wChairID, IServerUserItem * pIServerUserItem, bool bLookonUser);
  143. //用户起立
  144. virtual bool OnActionUserStandUp(WORD wChairID, IServerUserItem * pIServerUserItem, bool bLookonUser);
  145. //用户同意
  146. virtual bool OnActionUserOnReady(WORD wChairID, IServerUserItem * pIServerUserItem, void * pData, WORD wDataSize);
  147. //游戏中途旁观进入
  148. virtual bool PerformLookonLogin(IServerUserItem * pIServerUserItem);
  149. //
  150. ///*
  151. // 游戏事件 ----------------------------------------------------------------------------
  152. //*/
  153. //public:
  154. // //设置游戏配置
  155. virtual void SetGameConfig(VOID * pDataBuffer, WORD wDataSize, std::wstring sPrivateRoomId);
  156. //游戏开始事件
  157. virtual bool OnEventGameStart();
  158. // //游戏消息处理
  159. virtual bool OnGameMessage(WORD wSubCmdID, VOID * pDataBuffer, WORD wDataSize, IServerUserItem * pIServerUserItem);
  160. // //框架消息处理
  161. virtual bool OnFrameMessage(WORD wSubCmdID, VOID * pDataBuffer, WORD wDataSize, IServerUserItem * pIServerUserItem);
  162. // //发送场景 断线重连
  163. virtual bool OnEventSendGameScene(WORD wChiarID, IServerUserItem * pIServerUserItem, BYTE cbGameStatus, bool bSendSecret);
  164. // //游戏结束事件
  165. virtual bool OnEventGameConclude(WORD wChairID, IServerUserItem * pIServerUserItem, BYTE cbReason, bool bSendState = false);
  166. //
  167. //
  168. // //定时器事件
  169. virtual bool OnTimerMessage(DWORD wTimerID, WPARAM wBindParam);
  170. // //数据事件
  171. virtual bool OnDataBaseMessage(WORD wRequestID, VOID * pData, WORD wDataSize);
  172. // //积分事件
  173. virtual bool OnUserScroeNotify(WORD wChairID, IServerUserItem * pIServerUserItem, BYTE cbReason);
  174. //
  175. //protected:
  176. //
  177. ///*
  178. // 辅助函数 ----------------------------------------------------------------------------
  179. //*/
  180. //
  181. //
  182. ///*
  183. // 回放纪录 ----------------------------------------------------------------------------
  184. //*/
  185. //public:
  186. //开始纪录回放数据
  187. bool RepayRecordStart();
  188. //纪录回放数据
  189. bool RepayRecord(WORD wChairID, WORD wSubCmdId, void* pData, WORD wSize);
  190. //上传回放数据到数据库
  191. bool RepayRecordEnd();
  192. private:
  193. //用户操作
  194. bool OnUserOperate(WORD wChairID, CMD_C_OPERATE_CALLBACK_SK* pOperateCallback, BYTE cbType = 0);
  195. public:
  196. bool IsTeShuCard(BYTE cbCardData[], BYTE cbCount, BomoType& BomoInfo, WORD&WinScore);
  197. //具体执行函数
  198. private:
  199. //用户出牌
  200. //cbJokerReplacePoker 王 替换的牌
  201. bool OnUserOutCard(WORD wChairID, BYTE bCardData[], BYTE bCardCount, BYTE cbCardType, BYTE cbJokerReplacePoker[4], BYTE LianxianInfo);
  202. //判断是否为自由出牌
  203. bool BeOutCardFree(WORD wChairID);
  204. //下家操作
  205. bool NextOperate(WORD wChairID);
  206. void PrintCards(const BYTE cbCardData[], short cbCount);
  207. //寻找队友
  208. void FindCardOwner(BOOL &bSwitchChair);
  209. //队友换桌
  210. void SwapSeat();
  211. //提示
  212. bool OnUserHint(WORD wChairID);
  213. void SortCard(BYTE cbCardData[], BYTE cbCardCount);
  214. BOOL IsWinByChairID(BYTE wChairID);
  215. //按位分析 特殊牌
  216. void WithByteAnalyzeCardFlags(BYTE lianxianinfo, BomoType &BomoInfo);
  217. void SetCardFlags(BOOL IsLian, BYTE fuOrLian, BYTE xian);
  218. bool TrusteeOut(WORD wChairID);
  219. bool SendTeamfrindCards(WORD MyWchairID);
  220. //重新设置排名 为游戏结束 以玩家座位号为key 排名为值
  221. bool RestartRank(const BYTE cbRank[4], BYTE outRandToEnd[4]);
  222. //删除当前用户的出牌记录
  223. BOOL DeleteListOutCardRecord(DWORD wChairID);
  224. void ReadGameData();
  225. //计算 某个玩家此次出牌 的炸弹 是否符合累计出到某F某线,并计算特殊分数
  226. BOOL IsHaveBoomCountScore(BYTE wCharid, BYTE cbCardCount, WORD & WinScore);
  227. };
  228. //////////////////////////////////////////////////////////////////////////
  229. #endif