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

313 lines
11 KiB

  1. #ifndef TABLE_FRAME_SINK_TDH_HEAD_FILE
  2. #define TABLE_FRAME_SINK_TDH_HEAD_FILE
  3. #pragma once
  4. #include "Stdafx.h"
  5. #include "GameLogic_tdh.h"
  6. #include "ReplayRecordManager.h"
  7. #include "data.h"
  8. #include "../俱乐部/Source/MessageDef/Pb_RecordPacket.pb.h"
  9. #define TowMjNullseat 1
  10. //游戏桌子类
  11. class CTableFrameSink_tdh : public ITableFrameSink, public ITableUserAction
  12. {
  13. //游戏变量
  14. public:
  15. UINT32 m_startTime; //游戏开始时间
  16. BYTE LianXuHuPai[GAME_PLAYER]; //连续胡牌次数,用来记录老庄的
  17. LONG m_lSiceCount; //骰子点数
  18. LONG m_lSiceCountCheckBank; //骰子点数
  19. WORD m_wBankerUser; //庄家用户,庄家用户是老庄高8位为1,否则就是平常的
  20. WORD m_wNextBankerUser; //下一个庄家
  21. int m_lGameScore[GAME_PLAYER]; //单局游戏得分
  22. int m_lGameTatolScore[GAME_PLAYER]; //单轮积分计算 拥有计分
  23. BYTE m_HuPai[GAME_PLAYER]; //玩家胡牌次数
  24. int m_HuPaiLiuShui[16*GAME_PLAYER]; //流水详情
  25. BYTE m_cbCardIndex[GAME_PLAYER][MAX_INDEX]; //用户扑克
  26. BYTE m_bTrustee[GAME_PLAYER]; //是否托管
  27. BYTE m_bReading[GAME_PLAYER]; //是否准备
  28. BYTE m_cbMagicFirstData; //癞子皮(两个财神牌)
  29. BYTE m_cbMagicSecondData; //癞子
  30. BYTE m_cbQiangGangCardData[GAME_PLAYER]; //抢杠的牌
  31. bool m_bPlayStatus[GAME_PLAYER]; //玩家状态
  32. std::list<DWORD> m_offlineUsers; //掉线的玩家
  33. //BYTE m_OutLastLaiZiData; //最后杠牌数据
  34. BYTE m_PaiQuan[GAME_PLAYER]; //1表示 当前不是自己的牌权,但是已经听了
  35. BYTE m_TabbOutCardCout[GAME_PLAYER]; //可以打出的牌就听牌的个数 255表示 当前不是自己的牌权,但是已经听了
  36. BYTE m_TabbOutCardData[GAME_PLAYER][MAX_COUNT]; //具体打哪几张牌 胡牌个数255 表示可以胡任意一个牌。
  37. BYTE m_TabbTingCardCount[GAME_PLAYER][MAX_COUNT]; //相对应打出牌可听牌个数,索引表示第几张,值是对应对应的听牌个数
  38. WORD m_TabbTingCardData[GAME_PLAYER][MAX_COUNT][MAX_TING]; //具体听牌数据,一维索引表示打出牌的第几个,二维索引表示听牌的第几个,值表示牌数据
  39. // m_TabbTingCardData[wChairID][0][m_cbTingParCount - 1]
  40. public:
  41. CMD_S_GameConfig m_gameConfig; //游戏配置
  42. bool m_isCanOutCard; //是否可以出牌
  43. bool m_bDelete; //是否解散房间
  44. bool bIsHuang; //是否黄庄
  45. //出牌信息
  46. private:
  47. WORD m_wOutCardUser; //出牌用户
  48. BYTE m_cbOutCardData; //出牌扑克
  49. BYTE m_cbOutCardCount; //出牌数目
  50. BYTE m_cbDiscardCount[GAME_PLAYER]; //丢弃数目
  51. BYTE m_cbDiscardCard[GAME_PLAYER][40]; //丢弃记录
  52. //记忆库记录的是每一次牌权到另一次牌权牌 就是从抓牌到下一次抓牌的记忆库
  53. BYTE m_cbLastDisCardData[GAME_PLAYER][MAX_COUNT];//每个玩家得记忆库,用于判断是否可以碰不
  54. BYTE m_cbLastDisCount[GAME_PLAYER]; //每个玩家记忆库得个数
  55. //发牌信息
  56. private:
  57. BYTE m_cbSendCardData; //发牌扑克
  58. BYTE m_cbSendCardCount; //发牌数目
  59. BYTE m_cbLeftCardCount; //剩余数目
  60. BYTE m_cbRepertoryCard[MAX_REPERTORY_ZJ]; //库存扑克
  61. BYTE m_cbShiJiLeftCardCount; //实际剩余数目
  62. BYTE m_cbGangCount; //记录杠的次数
  63. BYTE m_cbTotalCardCount; //玩法总牌数
  64. //运行变量
  65. private:
  66. WORD m_wResumeUser; //还原用户(下一个用户?)
  67. WORD m_wCurrentUser; //当前用户
  68. WORD m_wProvideUser; //供应用户
  69. BYTE m_cbProvideCard; //供应扑克
  70. //状态变量
  71. private:
  72. //bool m_bGangStatus; //杠上开花状态位
  73. bool m_bUsersGangStatus[GAME_PLAYER] ;//杠上开花状态位
  74. int m_bGangOption; // 用操作状态标示 是补杠 暗杠 还是明杠
  75. int m_GangPrivedUserID; //保存用户杠牌时 自己的补杠,暗杠,还是别人点的明杠
  76. bool m_bQiangGang; //抢杠胡标示位,当有补杠,且有胡为true
  77. //用户状态
  78. private:
  79. bool m_bResponse[GAME_PLAYER]; //响应标志
  80. INT m_cbUserAction[GAME_PLAYER]; //用户动作
  81. BYTE m_cbOperateCard[GAME_PLAYER]; //操作扑克
  82. BYTE m_cbOperateCaiCard[GAME_PLAYER][GAME_PLAYER];//财神牌操作扑克
  83. INT m_cbPerformAction[GAME_PLAYER]; //执行动作
  84. //组合扑克
  85. private:
  86. BYTE m_cbWeaveItemCount[GAME_PLAYER]; //组合数目
  87. tagWeaveItem m_WeaveItemArray[GAME_PLAYER][MAX_WEAVE];//组合扑克
  88. //组件变量
  89. private:
  90. CGameLogic_tdh m_GameLogic; //游戏逻辑
  91. ITableFrame * m_pITableFrame; //框架接口
  92. const tagGameServiceOption * m_pGameServiceOption; //配置参数
  93. bool m_bReplayRecordStart; //是否开始录像
  94. std::vector<RecordPacket::pb_GameRecordPacket> m_UserReplayRecord; //对四个位置用户的数据的记录,用于回放。
  95. //bool m_bReduceBean; //是否已扣房卡(游戏豆)
  96. //LONGLONG m_lUserTmpScore[GAME_PLAYER];
  97. //游戏人数
  98. byte mPlayGameUserCount;
  99. bool m_bTwoPlayerFlag;
  100. //桌子ID
  101. int mGameTableId;
  102. //函数定义
  103. public:
  104. //构造函数
  105. CTableFrameSink_tdh();
  106. //析构函数
  107. virtual ~CTableFrameSink_tdh();
  108. //void ReduceBean();
  109. //bool IsCanOutCard(); //是否可以出牌
  110. //基础接口
  111. public:
  112. //释放对象
  113. virtual VOID Release() { delete this; }
  114. //接口查询
  115. virtual void * QueryInterface(const IID & Guid, DWORD dwQueryVer);
  116. //管理接口
  117. public:
  118. //初始化
  119. virtual bool Initialization(IUnknownEx * pIUnknownEx);
  120. //复位桌子
  121. virtual VOID RepositionSink();
  122. //查询接口
  123. public:
  124. virtual void DeletePrivateTable(bool bSendState = false);
  125. virtual bool ConcludeGame(BYTE cbGameStatus, bool bSendState = false)
  126. {
  127. //结束记录回放数据
  128. bool dataPair = RepayRecordEnd();
  129. //结束游戏
  130. m_pITableFrame->ConcludeGame(cbGameStatus, bSendState);
  131. return true;
  132. }
  133. //查询限额
  134. virtual SCORE QueryConsumeQuota(IServerUserItem * pIServerUserItem){ return 0; };
  135. //最少积分
  136. virtual SCORE QueryLessEnterScore(WORD wChairID, IServerUserItem * pIServerUserItem){ return 0; };
  137. //查询是否扣服务费
  138. virtual bool QueryBuckleServiceCharge(WORD wChairID){return true;}
  139. //查询总得分
  140. virtual int QueryTatolScore(WORD wChairID){ if (wChairID >= GAME_PLAYER || wChairID<0) ASSERT(false); return m_lGameTatolScore[wChairID]; }
  141. //查询癞子数
  142. virtual int QueryTatolLaiGang(WORD wChairID){ if (wChairID >= GAME_PLAYER || wChairID < 0) ASSERT(false); return 0; }
  143. //查询是否使用临时积分
  144. virtual bool QueryUseTemporaryScore() {
  145. return (0!=lstrlen(m_gameConfig.sPrivateTableID)); //私有房间私用临时积分
  146. }
  147. //比赛接口
  148. public:
  149. //设置基数
  150. virtual void SetGameBaseScore(LONG lBaseScore){};
  151. //把房间的基本信息记录到类
  152. virtual void SetGameConfig(VOID * pDataBuffer, WORD wDataSize, std::wstring sPrivateRoomId);
  153. //游戏事件
  154. public:
  155. bool RepayRecordStart();
  156. bool RepayRecordEnd();
  157. bool RepayRecord(WORD wChairID, WORD wSubCmdId, void* pData, WORD wSize);
  158. // bool CheckGameConclude();
  159. public:
  160. //游戏开始
  161. virtual bool OnEventGameStart();
  162. //游戏结束
  163. virtual bool OnEventGameConclude(WORD wChairID, IServerUserItem * pIServerUserItem, BYTE cbReason, bool bSendState = false);
  164. //发送场景
  165. virtual bool OnEventSendGameScene(WORD wChiarID, IServerUserItem * pIServerUserItem, BYTE cbGameStatus, bool bSendSecret);
  166. //事件接口
  167. public:
  168. //定时器事件
  169. virtual bool OnTimerMessage(DWORD wTimerID, WPARAM wBindParam);
  170. //数据事件
  171. virtual bool OnDataBaseMessage(WORD wRequestID, VOID * pData, WORD wDataSize) { return false; }
  172. //积分事件
  173. virtual bool OnUserScroeNotify(WORD wChairID, IServerUserItem * pIServerUserItem, BYTE cbReason) { return false; }
  174. //网络接口
  175. public:
  176. //游戏消息处理
  177. virtual bool OnGameMessage(WORD wSubCmdID, VOID * pDataBuffer, WORD wDataSize, IServerUserItem * pIServerUserItem);
  178. //框架消息处理
  179. virtual bool OnFrameMessage(WORD wSubCmdID, VOID * pDataBuffer, WORD wDataSize, IServerUserItem * pIServerUserItem);
  180. //用户事件
  181. public:
  182. //用户断线
  183. virtual bool OnActionUserOffLine(WORD wChairID,IServerUserItem * pIServerUserItem) { return true; }
  184. //用户重入 需要处理重新发送指令
  185. virtual bool OnActionUserConnect(WORD wChairID, IServerUserItem * pIServerUserItem);
  186. //用户坐下
  187. virtual bool OnActionUserSitDown(WORD wChairID,IServerUserItem * pIServerUserItem, bool bLookonUser);
  188. //用户起立
  189. virtual bool OnActionUserStandUp(WORD wChairID,IServerUserItem * pIServerUserItem, bool bLookonUser);
  190. //用户同意
  191. virtual bool OnActionUserOnReady(WORD wChairID,IServerUserItem * pIServerUserItem, void * pData, WORD wDataSize) { return true; }
  192. //游戏中途旁观进入
  193. virtual bool PerformLookonLogin(IServerUserItem * pIServerUserItem);
  194. //游戏事件
  195. protected:
  196. //用户出牌
  197. bool OnUserOutCard(WORD wChairID, BYTE cbCardData);
  198. //用户操作
  199. bool OnUserOperateCard(WORD wChairID, int cbOperateCode, BYTE cbOperateCard, BYTE cbCaiShenCard[4]);
  200. //辅助函数
  201. protected:
  202. //发送操作
  203. bool SendOperateNotify();
  204. //派发扑克,默认false正常起牌,true末尾棋牌
  205. bool DispatchCardData(WORD wCurrentUser,bool bTail=false);
  206. //响应判断
  207. bool EstimateUserRespond(WORD wCenterUser, BYTE cbCenterCard, enEstimatKind EstimatKind);
  208. //返回胡牌牌型
  209. int bHuPaiType(CChiHuRight &CChiHuRight);
  210. //优先级判断
  211. bool OperatorPriority(WORD TempUser, WORD &wTargetUser, int &cbTargetAction);
  212. //广播操作扣手牌牌
  213. bool DeleteCaiShenCard(WORD wChairID, BYTE cbTargetCaiCard[4], int cbTargetAction, BYTE cbTargetCard);
  214. //自主操作扣财神牌
  215. bool DeleteCard(WORD wChairID, BYTE cbTargetCaiCard[4], int cbOperateCode, BYTE cbOperateCard);
  216. //获取剩余牌数
  217. BYTE RemainNum(WORD wChairId, const BYTE m_cbCard,BYTE cbOutCardIndex);
  218. //听牌数据函数
  219. bool TingCard(WORD wChairID);
  220. //打出牌时固定听牌数据
  221. bool OutTingCard(WORD wChairID, BYTE cardIndex);
  222. //发送听牌协议
  223. void HttpTingCard(WORD wChairID);
  224. //操作协议
  225. void HttpOperateResult(WORD wChairID, BYTE cbCaiShenCard[4], int cbOperateCode, BYTE cbOperateCard, int cbActionMask, WORD cbActionCard[6]);
  226. //////////////////////////////////////////////////////////////////////////
  227. //ZORO
  228. BYTE GetNextMagicCardData(BYTE cbMagicCardFirst);
  229. int mMaxTaiNum;
  230. //////////////////////////////////////////////////////////////////////////
  231. //计分 诸暨
  232. enum _WinWay_
  233. {
  234. Win_FangPao = 0,
  235. Win_ZiMo,
  236. win_DiHu,
  237. };
  238. //胡牌 计算分数
  239. /*
  240. *WinChairID 胡牌玩家ID
  241. *nTai 胡牌台数
  242. *WinWay 胡牌方式
  243. *provideUserID 如果是放炮,谁放的
  244. *
  245. */
  246. void CaculationScore(BYTE WinChairID, BYTE nTai, BYTE WinWay, BYTE provideUserID, CChiHuRight chr, CMD_S_GangScore& cmd_Score);
  247. void FanMagicCaculation(BYTE WinChairID, BYTE nTai, BYTE WinWay, BYTE provideUserID, CChiHuRight chr, CMD_S_GangScore& cmd_Score);
  248. void CaculationHuangZhuang(CMD_S_GangScore& cmd_Score);
  249. public:
  250. void WinFanMagic_ZiMo_Score(BYTE WinChairID, BYTE nTai, BYTE WinWay, BYTE provideUserID, CMD_S_GangScore& cmd_Score);
  251. void WinFanMagic_ZiMo_QiangGang_Score(BYTE WinChairID, BYTE nTai, BYTE WinWay, BYTE provideUserID, CMD_S_GangScore& cmd_Score);
  252. void WinFanMagic_FangPao_Score(BYTE WinChairID, BYTE nTai, BYTE WinWay, BYTE provideUserID, CMD_S_GangScore& cmd_Score);
  253. void SendGangScore(BYTE GangUserID, BYTE ProvideUserID,int action);
  254. //////////////////////////////////////////////////////////////////////////
  255. void WritePaiCardData(TCHAR* TableId,int count);
  256. BOOL ReadGameData();
  257. void PrintUsersScore(LPCTSTR strInfo);
  258. BYTE m_cbOptCard[GAME_PLAYER]; //吃的牌,一圈不能再出
  259. int m_gangScore[GAME_PLAYER]; //记录每局结束时,每个玩家杠牌导致的积分变动。
  260. BYTE m_cbLastGangCard;
  261. // 08-14增加是否可以放冲胡 [8/15/2018 Zoro]
  262. BOOL mCanFangChong;
  263. };
  264. //////////////////////////////////////////////////////////////////////////
  265. #endif