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

402 lines
14 KiB

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