诸暨麻将添加redis
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

248 rivejä
9.0 KiB

  1. #ifndef TABLE_FRAME_SINK_ZHIPAI_HEAD_FILE
  2. #define TABLE_FRAME_SINK_ZHIPAI_HEAD_FILE
  3. #pragma once
  4. #include "Stdafx.h"
  5. #include "GameLogicZhiPai.h"
  6. #include "ReplayRecordManager.h"
  7. #include "data.h"
  8. //游戏桌子类
  9. class TableFrameSinkZhiPai : public ITableFrameSink, public ITableUserAction
  10. {
  11. //游戏变量
  12. private:
  13. BYTE bGameType; //湖北花牌
  14. WORD m_wBankerUser; //庄家用户
  15. WORD m_wNextBankerUser; //下一个庄家
  16. BYTE m_HuPai[GAME_PLAY]; //玩家胡牌次数
  17. bool b_QingTong[GAME_PLAY]; //玩家开局请统
  18. int m_lGameScore[GAME_PLAY]; //单局游戏得分
  19. int m_lGameTatolScore[GAME_PLAY]; //单轮积分计算
  20. int m_HuPaiLiuShui[16*GAME_PLAY]; //流水详情
  21. BYTE m_cbOperateScore[GAME_PLAY]; //操作显示胡数分
  22. BYTE m_cbTongCount[GAME_PLAY]; //玩家统的个数
  23. BYTE m_cbCardIndex[GAME_PLAY][MAX_INDEX_HUA]; //用户扑克
  24. BYTE m_cbHuaCardIndex[GAME_PLAY][5]; //三个用户手中各花牌的个数--不含统组合的
  25. BYTE m_cbHuaWeaveCardIndex[GAME_PLAY][5]; //三个用户组合牌中各花牌的个数--不含统组合的
  26. BYTE m_cbDuiOperator[GAME_PLAY]; //玩家对的次数
  27. BYTE m_cbCardIndex_Tong[GAME_PLAY][MAX_INDEX_HUA];//用户扑克,保存统的手牌
  28. BYTE m_cbHuaCardIndex_Tong[GAME_PLAY][5]; //保存统的花牌手牌
  29. BYTE m_cbHuaWeaveCardIndex_Tong[GAME_PLAY][5]; //加上了统的组合花牌
  30. BYTE m_bTrustee[GAME_PLAY]; //是否托管
  31. BYTE m_bReading[GAME_PLAY]; //是否准备
  32. bool m_bPlayStatus[GAME_PLAY]; //玩家状态
  33. std::list<DWORD> m_offlineUsers; //掉线的玩家
  34. private:
  35. CMD_S_GameConfig m_gameConfig; //游戏配置
  36. bool m_isCanOutCard; //是否可以出牌
  37. bool m_bDelete; //是否解散房间
  38. bool bIsHuang; //是否黄庄
  39. bool m_IsHu; //记录当局是否胡牌结束。
  40. //出牌信息
  41. private:
  42. WORD m_wOutCardUser; //出牌用户
  43. BYTE m_cbOutCardData; //出牌扑克
  44. BYTE m_cbOutCardCount; //出牌数目
  45. BYTE m_cbDiscardCount[GAME_PLAY]; //丢弃数目
  46. BYTE m_cbDiscardCard[GAME_PLAY][15]; //丢弃记录
  47. BYTE m_cbLastDisCardData[GAME_PLAY][15];//每个玩家得记忆库,用于判断是否可以碰不
  48. BYTE m_cbLastDisCount[GAME_PLAY]; //每个玩家记忆库得个数
  49. //发牌信息
  50. private:
  51. BYTE m_cbSendCardData; //发牌扑克
  52. BYTE m_cbSendCardCount; //发牌数目
  53. BYTE m_cbLeftCardCount; //剩余数目
  54. BYTE m_cbRepertoryCard[MAX_REPERTORY_HUA]; //库存扑克
  55. BYTE m_cbRepertoryCard_One[MAX_REPERTORY_HUA_ONE]; //库存扑克
  56. BYTE m_cbRepertoryCard_Two[MAX_REPERTORY_HUA_TWO]; //库存扑克
  57. //运行变量
  58. private:
  59. WORD m_wResumeUser; //还原用户(下一个用户?)
  60. WORD m_wCurrentUser; //当前用户
  61. WORD m_wProvideUser; //供应用户
  62. BYTE m_cbProvideCard; //供应扑克
  63. //状态变量
  64. bool m_bSendStatus; //发牌状态
  65. //用户状态
  66. private:
  67. bool m_bResponse[GAME_PLAY]; //响应标志
  68. INT m_cbUserAction[GAME_PLAY]; //用户动作
  69. BYTE m_cbOperateCard[GAME_PLAY]; //操作扑克
  70. BYTE m_cbOperateCard_FuJia[GAME_PLAY][4];//操作扑克的额外的花牌或者别杠牌
  71. INT m_cbPerformAction[GAME_PLAY]; //执行动作
  72. BYTE EsponseHuShu[GAME_PLAY]; //胡数
  73. BYTE EsponsePaPoShu[GAME_PLAY]; //爬坡数
  74. BYTE m_cbGamePlayerHandCard[GAME_PLAY][9][9];//每位玩家手牌牌墙排列
  75. //组合扑克
  76. private:
  77. BYTE m_cbWeaveItemCount[GAME_PLAY]; //组合数目 ,落地组合个数 满足前端显示需要
  78. tagWeaveItem_Hua m_WeaveItemArray[GAME_PLAY][MAX_WEAVE_HUA]; //组合扑克 ,落地的组合
  79. BYTE m_cbWeaveItemCount_HuPai[GAME_PLAY]; //胡牌用到的组合,去除统的组合
  80. tagWeaveItem_Hua m_WeaveItemArray_HuPai[GAME_PLAY][MAX_WEAVE_HUA]; //胡牌用到的组合,去除统的组合
  81. tagHuCardResult ChiHu; //保存胡牌者数据
  82. //组件变量
  83. private:
  84. CGameLogicZhiPai m_GameLogic; //游戏逻辑
  85. ITableFrame * m_pITableFrame; //框架接口
  86. const tagGameServiceOption * m_pGameServiceOption; //配置参数
  87. bool m_bReplayRecordStart; //是否开始录像
  88. std::vector<GameRecordPacket> m_UserReplayRecord; //对四个位置用户的数据的记录,用于回放。
  89. //bool m_bReduceBean; //是否已扣房卡(游戏豆)
  90. LONGLONG m_lUserTmpScore[GAME_PLAY];
  91. //函数定义
  92. public:
  93. //构造函数
  94. TableFrameSinkZhiPai();
  95. //析构函数
  96. virtual ~TableFrameSinkZhiPai();
  97. //void ReduceBean();
  98. //bool IsCanOutCard(); //是否可以出牌
  99. //基础接口
  100. public:
  101. //释放对象
  102. virtual VOID Release() { delete this; }
  103. //接口查询
  104. virtual void * QueryInterface(const IID & Guid, DWORD dwQueryVer);
  105. //管理接口
  106. public:
  107. //初始化
  108. virtual bool Initialization(IUnknownEx * pIUnknownEx);
  109. //复位桌子
  110. virtual VOID RepositionSink();
  111. //查询接口
  112. public:
  113. virtual void DeletePrivateTable(bool bSendState = false);
  114. virtual bool ConcludeGame(BYTE cbGameStatus, bool bSendState = false)
  115. {
  116. //结束记录回放数据
  117. auto dataPair = RepayRecordEnd();
  118. //结束游戏
  119. m_pITableFrame->ConcludeGame(cbGameStatus, bSendState);
  120. return true;
  121. }
  122. //查询限额
  123. virtual SCORE QueryConsumeQuota(IServerUserItem * pIServerUserItem){ return 0; };
  124. //最少积分
  125. virtual SCORE QueryLessEnterScore(WORD wChairID, IServerUserItem * pIServerUserItem){ return 0; };
  126. //查询是否扣服务费
  127. virtual bool QueryBuckleServiceCharge(WORD wChairID){return true;}
  128. //查询总得分
  129. virtual int QueryTatolScore(WORD wChairID){ if (wChairID >= GAME_PLAYER || wChairID<0) ASSERT(false); return m_lGameTatolScore[wChairID]; }
  130. //查询癞子数
  131. virtual int QueryTatolLaiGang(WORD wChairID){ if (wChairID >= GAME_PLAYER || wChairID < 0) ASSERT(false); return 0; }
  132. //查询是否使用临时积分
  133. virtual bool QueryUseTemporaryScore() {
  134. return (0!=lstrlen(m_gameConfig.sPrivateTableID)); //私有房间私用临时积分
  135. }
  136. //比赛接口
  137. public:
  138. //设置基数
  139. virtual void SetGameBaseScore(LONG lBaseScore){};
  140. virtual void SetGameConfig(VOID * pDataBuffer, WORD wDataSize, std::wstring sPrivateRoomId);
  141. //游戏事件
  142. public:
  143. bool RepayRecordStart();
  144. bool RepayRecordEnd();
  145. bool RepayRecord(WORD wChairID, WORD wSubCmdId, void* pData, WORD wSize);
  146. // bool CheckGameConclude();
  147. public:
  148. //游戏开始
  149. virtual bool OnEventGameStart();
  150. //游戏结束
  151. virtual bool OnEventGameConclude(WORD wChairID, IServerUserItem * pIServerUserItem, BYTE cbReason, bool bSendState = false);
  152. //发送场景
  153. virtual bool OnEventSendGameScene(WORD wChiarID, IServerUserItem * pIServerUserItem, BYTE cbGameStatus, bool bSendSecret);
  154. //事件接口
  155. public:
  156. //定时器事件
  157. virtual bool OnTimerMessage(DWORD wTimerID, WPARAM wBindParam);
  158. //数据事件
  159. virtual bool OnDataBaseMessage(WORD wRequestID, VOID * pData, WORD wDataSize) { return false; }
  160. //积分事件
  161. virtual bool OnUserScroeNotify(WORD wChairID, IServerUserItem * pIServerUserItem, BYTE cbReason) { return false; }
  162. //网络接口
  163. public:
  164. //游戏消息处理
  165. virtual bool OnGameMessage(WORD wSubCmdID, VOID * pDataBuffer, WORD wDataSize, IServerUserItem * pIServerUserItem);
  166. //框架消息处理
  167. virtual bool OnFrameMessage(WORD wSubCmdID, VOID * pDataBuffer, WORD wDataSize, IServerUserItem * pIServerUserItem);
  168. //用户事件
  169. public:
  170. //用户断线
  171. virtual bool OnActionUserOffLine(WORD wChairID,IServerUserItem * pIServerUserItem) { return true; }
  172. //用户重入 需要处理重新发送指令
  173. virtual bool OnActionUserConnect(WORD wChairID, IServerUserItem * pIServerUserItem);
  174. //用户坐下
  175. virtual bool OnActionUserSitDown(WORD wChairID,IServerUserItem * pIServerUserItem, bool bLookonUser);
  176. //用户起立
  177. virtual bool OnActionUserStandUp(WORD wChairID,IServerUserItem * pIServerUserItem, bool bLookonUser);
  178. //用户同意
  179. virtual bool OnActionUserOnReady(WORD wChairID,IServerUserItem * pIServerUserItem, void * pData, WORD wDataSize) { return true; }
  180. //游戏中途旁观进入
  181. virtual bool PerformLookonLogin(IServerUserItem * pIServerUserItem);
  182. //游戏事件
  183. protected:
  184. //用户出牌
  185. bool OnUserOutCard(WORD wChairID, BYTE cbCardData, BYTE cbWeiZhi);
  186. //用户操作
  187. bool OnUserOperateCard(WORD wChairID, int cbOperateCode, BYTE cbOperateCard, BYTE cbHuaCard[]);
  188. //辅助函数
  189. //bool IsWin(WORD wChairID);
  190. //发送操作
  191. bool SendOperateNotify();
  192. //派发扑克
  193. bool DispatchCardData(WORD wCurrentUser,bool bTail=false);
  194. //响应判断
  195. bool EstimateUserRespond(WORD wCenterUser, BYTE cbCenterCard, enEstimatKind EstimatKind);
  196. //玩家胡牌类型
  197. //BYTE FiltrateRight(WORD wChairId, WORD HuPaiType, bool bIsZiMo = true);
  198. //BYTE RemainNum(WORD wChairId, const BYTE m_cbCard,BYTE bIndex);
  199. //操作优先级判断
  200. bool OperatorPriority(WORD TempUser, WORD &wTargetUser, int &cbTargetAction);
  201. bool GetGameEndPaiQiang(WORD wChairID, BYTE GameEndCard[9][5]);
  202. bool GetPaiQiang(WORD wChairID, BYTE HandCard[9][9]);
  203. bool GetGameEndCardIndex(WORD wChairID, BYTE TempCardIndex[28]);
  204. bool DeleteHandCardData(WORD wChairID, BYTE CardData[], BYTE CardCount);
  205. //操作对应分数
  206. BYTE GetOperatorScore(INT OperatorCode, BYTE OperatorCardIndex, BYTE HuaCard[4]);
  207. //响应展示手牌和手牌个数是否相等
  208. bool IsEqual(WORD wChairID);
  209. };
  210. //////////////////////////////////////////////////////////////////////////
  211. #endif