诸暨麻将添加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.
 
 
 
 
 
 

280 lines
11 KiB

  1. #ifndef TABLE_FRAME_SINK_OTHER_HEAD_FILE
  2. #define TABLE_FRAME_SINK_OTHER_HEAD_FILE
  3. #pragma once
  4. #include "Stdafx.h"
  5. #include "GameLogicOther.h"
  6. #include "ReplayRecordManager.h"
  7. #include "data.h"
  8. //游戏桌子类
  9. class CTableFrameSinkOther : public ITableFrameSink, public ITableUserAction
  10. {
  11. //游戏变量
  12. private:
  13. BYTE bGameType; //游戏到底是0一脚癞油,1无癞到底,2半癞,10血流成河
  14. LONG m_lSiceCount; //骰子点数
  15. WORD m_wBankerUser; //庄家用户
  16. WORD m_wNextBankerUser; //下一个庄家
  17. int m_lGameScore[GAME_PLAYER]; //单局游戏得分
  18. int m_lGameTatolScore[GAME_PLAYER]; //单轮积分计算
  19. BYTE m_HuPai[GAME_PLAYER]; //玩家胡牌次数
  20. BYTE m_JiFenCount[GAME_PLAYER]; //积分变动次数
  21. int m_HuPaiLiuShui[16*GAME_PLAYER]; //流水详情
  22. BYTE m_cbCardIndex[GAME_PLAYER][MAX_INDEX]; //用户扑克
  23. BYTE m_bTrustee[GAME_PLAYER]; //是否托管
  24. BYTE m_bReading[GAME_PLAYER]; //是否准备
  25. BYTE m_cbHuanSanZhang[GAME_PLAYER]; //换三张
  26. CMD_C_HuanSanZhang m_HuanSanZhangData[GAME_PLAYER]; //换三张的数据
  27. CTime StartTime; //游戏开始时间,用来记录换三张超时用的
  28. BYTE YouXiFan[GAME_PLAYER]; //游戏翻型,3,6,8,14/1,4,6,12
  29. BYTE m_cbQiangGangCardData[GAME_PLAYER]; //抢杠的牌
  30. BYTE m_cbGenCount[GAME_PLAYER]; //
  31. bool m_bPlayStatus[GAME_PLAYER]; //玩家状态
  32. std::list<DWORD> m_offlineUsers; //掉线的玩家
  33. BYTE m_cbWinCount; //
  34. WORD m_wWinOrder[GAME_PLAYER]; //记录玩家是否胡牌
  35. LONG m_lGameTax[GAME_PLAYER]; //
  36. BYTE m_AnGangNum[GAME_PLAYER]; //玩家暗杠次数
  37. BYTE m_MingGangNum[GAME_PLAYER]; //玩家明杠次数
  38. BYTE m_TabbOutCardCout[GAME_PLAYER]; //可以打出的牌就听牌的个数
  39. BYTE m_TabbOutCardData[GAME_PLAYER][MAX_COUNT]; //具体打哪几张牌
  40. BYTE m_TabbTingCardCount[GAME_PLAYER][MAX_COUNT]; //相对应打出牌可听牌个数,索引表示第几张,值是对应对应的听牌个数
  41. WORD m_TabbTingCardData[GAME_PLAYER][MAX_COUNT][MAX_TING]; //具体听牌数据,一维索引表示打出牌的第几个,二维索引表示听牌的第几个,值表示牌数据
  42. private:
  43. CMD_S_GameConfig m_gameConfig; //游戏配置
  44. bool m_isCanOutCard; //是否可以出牌
  45. bool m_bDelete; //是否解散房间
  46. //bool m_isTingPai[GAME_PLAYER]; //玩家是否听牌
  47. //出牌信息
  48. private:
  49. WORD m_wOutCardUser; //出牌用户
  50. BYTE m_cbOutCardData; //出牌扑克
  51. BYTE m_cbOutCardCount; //出牌数目
  52. BYTE m_cbDiscardCount[GAME_PLAYER]; //丢弃数目
  53. BYTE m_cbDiscardCard[GAME_PLAYER][55]; //丢弃记录
  54. BYTE m_cbLastDisCardData[GAME_PLAYER][MAX_JIYI];//每个玩家得记忆库,用于判断是否可以碰不
  55. BYTE m_cbLastDisCount[GAME_PLAYER]; //每个玩家记忆库得个数
  56. ///BYTE m_cbDiscardWuYongCount[GAME_PLAYER]; //丢弃之后,也没碰杠的牌数目
  57. //BYTE m_cbDiscardWuYongCard[GAME_PLAYER][55]; //具体数据
  58. //发牌信息
  59. private:
  60. BYTE m_cbSendCardData; //发牌扑克
  61. BYTE m_cbSendCardCount; //发牌数目
  62. BYTE m_cbLeftCardCount; //剩余数目
  63. BYTE m_cbRepertoryCard[MAX_REPERTORY]; //库存扑克
  64. //堆立变量
  65. private:
  66. WORD m_wHeapHand; //堆立头部(从哪堆牌开始摸?)
  67. WORD m_wHeapTail; //堆立尾部(摸到堆牌结束?)
  68. BYTE m_cbHeapCardInfo[4][2]; //堆牌信息(记录4堆牌的堆头和堆尾各被摸了几张,如果( 堆头+堆尾 = 堆总数 ) 表示这堆牌被摸完了,需要切到下个玩家的那堆牌开始摸)
  69. //运行变量
  70. private:
  71. WORD m_wResumeUser; //还原用户(下一个用户?)
  72. WORD m_wCurrentUser; //当前用户
  73. WORD m_wProvideUser; //供应用户
  74. BYTE m_cbProvideCard; //供应扑克
  75. //状态变量
  76. private:
  77. bool m_bSendStatus; //发牌状态
  78. bool m_bGangStatus; //癞子杠状态,表示当时出牌是癞子,杠胡癞油
  79. WORD m_wDianGangUser; //点杠用户(如果是自己,表示暗杠,他人表示点杠)
  80. bool m_bGangOutStatus; //杠后炮,没用
  81. bool m_bEnjoinChiHu[GAME_PLAYER]; //禁止吃胡,没用
  82. bool m_bEnjoinChiPeng[GAME_PLAYER]; //禁止吃碰,没用
  83. //用户状态
  84. private:
  85. bool m_bResponse[GAME_PLAYER]; //响应标志
  86. INT m_cbUserAction[GAME_PLAYER]; //用户动作
  87. BYTE m_cbOperateCard[GAME_PLAYER]; //操作扑克
  88. INT m_cbPerformAction[GAME_PLAYER]; //执行动作
  89. bool m_bDuoPao; //一炮多向标识位
  90. bool m_bQiangGang; //抢杠胡标示位,当有补杠,且有胡为true
  91. //组合扑克
  92. private:
  93. BYTE m_cbWeaveItemCount[GAME_PLAYER]; //组合数目
  94. tagWeaveItem m_WeaveItemArray[GAME_PLAYER][MAX_WEAVE];//组合扑克
  95. //结束信息
  96. private:
  97. BYTE m_cbChiHuCard; //吃胡扑克
  98. DWORD m_dwChiHuKind[GAME_PLAYER]; //吃胡结果
  99. tagChihu m_ChiHuRight[GAME_PLAYER][MAX_CHANGE_SCORE]; //血流记录每个玩家每局的积分变动数据
  100. tagChiCard m_wChiHuCard[GAME_PLAYER][MAX_CHANGE_SCORE]; //血流记录每个玩家每局的胡牌数据
  101. tagActionLast m_cbLastAction;
  102. //组件变量
  103. private:
  104. CGameLogicOther m_GameLogic; //游戏逻辑
  105. ITableFrame * m_pITableFrame; //框架接口
  106. const tagGameServiceOption * m_pGameServiceOption; //配置参数
  107. bool m_bReplayRecordStart; //是否开始录像
  108. std::vector<GameRecordPacket> m_UserReplayRecord; //对四个位置用户的数据的记录,用于回放。
  109. //bool m_bReduceBean; //是否已扣房卡(游戏豆)
  110. LONGLONG m_lUserTmpScore[GAME_PLAYER];
  111. //INT m_lZimo[GAME_PLAYER]; //累计自摸次数
  112. //LONG m_lFangPao[GAME_PLAYER]; //累计放炮次数
  113. //LONG m_lDianPao[GAME_PLAYER]; //累计点炮次数
  114. //LONG m_lMingGang[GAME_PLAYER]; //累计明杠次数
  115. //LONG m_lAnGang[GAME_PLAYER]; //累计暗杠次数
  116. //LONG m_lChaDaJiao[GAME_PLAYER]; //累计查大叫
  117. //函数定义
  118. public:
  119. //构造函数
  120. CTableFrameSinkOther();
  121. //析构函数
  122. virtual ~CTableFrameSinkOther();
  123. //void ReduceBean();
  124. //bool IsCanOutCard(); //是否可以出牌
  125. //基础接口
  126. public:
  127. //释放对象
  128. virtual VOID Release() { delete this; }
  129. //接口查询
  130. virtual void * QueryInterface(const IID & Guid, DWORD dwQueryVer);
  131. //管理接口
  132. public:
  133. //初始化
  134. virtual bool Initialization(IUnknownEx * pIUnknownEx);
  135. //复位桌子
  136. virtual VOID RepositionSink();
  137. //查询接口
  138. public:
  139. virtual void DeletePrivateTable(bool bSendState = false);
  140. virtual bool ConcludeGame(BYTE cbGameStatus, bool bSendState = false)
  141. {
  142. //结束记录回放数据
  143. auto dataPair = RepayRecordEnd();
  144. //结束游戏
  145. m_pITableFrame->ConcludeGame(cbGameStatus, bSendState);
  146. return true;
  147. }
  148. //查询限额
  149. virtual SCORE QueryConsumeQuota(IServerUserItem * pIServerUserItem){ return 0; };
  150. //最少积分
  151. virtual SCORE QueryLessEnterScore(WORD wChairID, IServerUserItem * pIServerUserItem){ return 0; };
  152. //查询是否扣服务费
  153. virtual bool QueryBuckleServiceCharge(WORD wChairID){return true;}
  154. //查询总得分
  155. virtual int QueryTatolScore(WORD wChairID){ if (wChairID >= GAME_PLAYER || wChairID<0) ASSERT(false); return m_lGameTatolScore[wChairID]; }
  156. //查询癞子数
  157. //virtual int QueryTatolLaiGang(WORD wChairID){ if (wChairID >= GAME_PLAYER || wChairID < 0) ASSERT(false); return m_OutLaiZi[wChairID]; }
  158. //查询是否使用临时积分
  159. virtual bool QueryUseTemporaryScore() {
  160. return (0!=lstrlen(m_gameConfig.sPrivateTableID)); //私有房间私用临时积分
  161. }
  162. //查询癞子数
  163. virtual int QueryTatolLaiGang(WORD wChairID){ return 0; }
  164. //比赛接口
  165. public:
  166. //设置基数
  167. virtual void SetGameBaseScore(LONG lBaseScore){};
  168. virtual void SetGameConfig(VOID * pDataBuffer, WORD wDataSize, std::wstring sPrivateRoomId);
  169. //游戏事件
  170. public:
  171. bool RepayRecordStart();
  172. bool RepayRecordEnd();
  173. bool RepayRecord(WORD wChairID, WORD wSubCmdId, void* pData, WORD wSize);
  174. // bool CheckGameConclude();
  175. public:
  176. //游戏开始
  177. virtual bool OnEventGameStart();
  178. //游戏结束
  179. virtual bool OnEventGameConclude(WORD wChairID, IServerUserItem * pIServerUserItem, BYTE cbReason, bool bSendState = false);
  180. //发送场景
  181. virtual bool OnEventSendGameScene(WORD wChiarID, IServerUserItem * pIServerUserItem, BYTE cbGameStatus, bool bSendSecret);
  182. //事件接口
  183. public:
  184. //定时器事件
  185. virtual bool OnTimerMessage(DWORD wTimerID, WPARAM wBindParam);
  186. //数据事件
  187. virtual bool OnDataBaseMessage(WORD wRequestID, VOID * pData, WORD wDataSize) { return false; }
  188. //积分事件
  189. virtual bool OnUserScroeNotify(WORD wChairID, IServerUserItem * pIServerUserItem, BYTE cbReason) { return false; }
  190. //网络接口
  191. public:
  192. //游戏消息处理
  193. virtual bool OnGameMessage(WORD wSubCmdID, VOID * pDataBuffer, WORD wDataSize, IServerUserItem * pIServerUserItem);
  194. //框架消息处理
  195. virtual bool OnFrameMessage(WORD wSubCmdID, VOID * pDataBuffer, WORD wDataSize, IServerUserItem * pIServerUserItem);
  196. //用户事件
  197. public:
  198. //用户断线
  199. virtual bool OnActionUserOffLine(WORD wChairID,IServerUserItem * pIServerUserItem) { return true; }
  200. //用户重入 需要处理重新发送指令
  201. virtual bool OnActionUserConnect(WORD wChairID, IServerUserItem * pIServerUserItem);
  202. //用户坐下
  203. virtual bool OnActionUserSitDown(WORD wChairID,IServerUserItem * pIServerUserItem, bool bLookonUser);
  204. //用户起立
  205. virtual bool OnActionUserStandUp(WORD wChairID,IServerUserItem * pIServerUserItem, bool bLookonUser);
  206. //用户同意
  207. virtual bool OnActionUserOnReady(WORD wChairID,IServerUserItem * pIServerUserItem, void * pData, WORD wDataSize) { return true; }
  208. //用户准备
  209. //virtual bool OnActionUserReading(WORD wChairID);
  210. //游戏中途旁观进入
  211. virtual bool PerformLookonLogin(IServerUserItem * pIServerUserItem);
  212. //游戏事件
  213. protected:
  214. //用户出牌
  215. bool OnUserOutCard(WORD wChairID, BYTE cbCardData);
  216. //用户操作
  217. bool OnUserOperateCard(WORD wChairID, int cbOperateCode, BYTE cbOperateCard);
  218. //辅助函数
  219. protected:
  220. bool IsWin(WORD wChairID);
  221. //发送操作
  222. bool SendOperateNotify();
  223. //派发扑克
  224. bool DispatchCardData(WORD wCurrentUser,bool bTail=false,bool bLaiZiGang=false);
  225. //响应判断
  226. bool EstimateUserRespond(WORD wCenterUser, BYTE cbCenterCard, enEstimatKind EstimatKind);
  227. //
  228. //void ProcessChiHuUser( WORD wChairId,CChiHuRight& chr, bool bGiveUp );
  229. //获取根数
  230. int GetGenCount(WORD wChairId, CChiHuRight& chr);
  231. BYTE RemainNum(WORD wChairId, const BYTE m_cbCard,BYTE bIndex);
  232. //玩家胡牌类型
  233. BYTE FiltrateRight(WORD wChairId,BYTE *HuPaiFanXing);
  234. //记录玩家积分变动函数
  235. void RecordScoreChange(WORD wChairID, BYTE action, BYTE card, BYTE FanXing, BYTE FanShu, int Score, BYTE ExUser);
  236. //听牌数据函数
  237. bool TingCard(WORD wChairID);
  238. //打出牌时固定听牌数据
  239. bool OutTingCard(WORD wChairID, BYTE cardIndex);
  240. //判断目前换牌状态
  241. BYTE PanDuanHuanCard(WORD wChairID);
  242. //胡牌次数数据编码
  243. bool EncodeChiHuCardMash(BYTE ChiHuCardMash[GAME_PLAYER][MAX_INDEX]);
  244. //发送听牌协议
  245. void HttpTingCard(WORD wChairID);
  246. };
  247. //////////////////////////////////////////////////////////////////////////
  248. #endif