诸暨麻将添加redis
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 
 
 
 

442 行
14 KiB

  1. #ifndef TABLE_FRAME_HEAD_FILE
  2. #define TABLE_FRAME_HEAD_FILE
  3. #include "Stdafx.h"
  4. #include "DataBasePacket.h"
  5. #include <unordered_map>
  6. //////////////////////////////////////////////////////////////////////////////////
  7. //数组定义
  8. typedef IServerUserItem * CTableUserItemArray[MAX_CHAIR]; //游戏数组
  9. typedef CWHArray<IServerUserItem *> CLookonUserItemArray; //旁观数组
  10. typedef CWHArray<tagGameScoreRecord *> CGameScoreRecordArray; //记录数组
  11. interface IMatchTableFrameNotify;
  12. //////////////////////////////////////////////////////////////////////////////////
  13. //桌子框架
  14. class CTableFrame : public ITableFrame, public ICompilationSink
  15. {
  16. //游戏属性
  17. protected:
  18. DWORD m_wPrivateTablParentNodeID; //私有桌子父节点ID
  19. DWORD m_wPrivateTableOwnerID; //创建者ID
  20. std::wstring m_sPrivateTableID; //私有桌子号
  21. WORD m_wTableID; //桌子号码
  22. WORD m_wChairCount; //椅子数目
  23. BYTE m_cbStartMode; //开始模式
  24. WORD m_wUserCount; //用户数目
  25. BYTE m_wTableKind; //桌子类型
  26. DWORD m_dwClubID; //俱乐部ID
  27. BYTE m_cbAuto; //桌子自动创建属性
  28. //状态变量
  29. protected:
  30. bool m_bGameStarted; //游戏标志
  31. bool m_bDrawStarted; //游戏标志
  32. bool m_bTableStarted; //游戏标志
  33. bool m_bTableInitFinish; //初始标识
  34. WORD m_wStartCount; //开始游戏次数
  35. bool m_bJieSan; //上次解散是否成功
  36. //状态变量
  37. protected:
  38. bool m_bAllowLookon[MAX_CHAIR]; //旁观标志
  39. bool m_GameRead[MAX_CHAIR]; //游戏中准备
  40. bool m_GameShuffleRead[MAX_CHAIR]; //游戏中洗牌准备
  41. SCORE m_lFrozenedScore[MAX_CHAIR]; //服务费用
  42. JN_GR_RoomLockDate m_jgrUserLockData[6]; //房间已经冻结用户冻结的钱
  43. //游戏变量
  44. protected:
  45. LONG m_lCellScore; //单元积分
  46. BYTE m_cbGameStatus; //游戏状态
  47. //时间变量
  48. protected:
  49. DWORD m_dwDrawStartTime; //开始时间
  50. SYSTEMTIME m_SystemTimeStart; //开始时间
  51. WORD m_wDrawCount; //游戏局数
  52. void* m_ReplayRecordData; //回放数据
  53. WORD m_ReplayRecordDataSize; //回放数据长度
  54. //动态属性
  55. protected:
  56. DWORD m_dwTableOwnerID; //桌主用户
  57. TCHAR m_szEnterPassword[LEN_PASSWORD]; //进入密码
  58. //断线变量
  59. protected:
  60. WORD m_wOffLineCount[MAX_CHAIR]; //断线次数
  61. DWORD m_dwOffLineTime[MAX_CHAIR]; //断线时间
  62. //用户数组
  63. protected:
  64. CTableUserItemArray m_TableUserItemArray; //游戏用户
  65. CLookonUserItemArray m_LookonUserItemArray; //旁观用户
  66. protected:
  67. std::unordered_map<DWORD,int> m_AgreeDeletePriTableUsers; //投票解散的用户
  68. //组件接口
  69. protected:
  70. ITimerEngine * m_pITimerEngine; //时间引擎
  71. ITableFrameSink * m_pITableFrameSink; //桌子接口
  72. IMainServiceFrame * m_pIMainServiceFrame; //服务接口
  73. IAndroidUserManager * m_pIAndroidUserManager; //机器接口
  74. //扩展接口
  75. protected:
  76. ITableUserAction * m_pITableUserAction; //动作接口
  77. ITableUserRequest * m_pITableUserRequest; //请求接口
  78. //数据接口
  79. protected:
  80. IDataBaseEngine * m_pIKernelDataBaseEngine; //内核数据
  81. IDataBaseEngine * m_pIRecordDataBaseEngine; //记录数据
  82. //配置信息
  83. protected:
  84. tagGameParameter * m_pGameParameter; //配置参数
  85. tagGameServiceAttrib * m_pGameServiceAttrib; //服务属性
  86. tagGameServiceOption * m_pGameServiceOption; //服务配置
  87. tagGameConfig mGameConfig; //游戏配置
  88. WORD wXianZhi; //开始游戏时钻石限制
  89. //游戏记录
  90. protected:
  91. CGameScoreRecordArray m_GameScoreRecordActive; //游戏记录
  92. static CGameScoreRecordArray m_GameScoreRecordBuffer; //游戏记录
  93. //比赛接口
  94. protected:
  95. ITableFrameHook * m_pITableFrameHook; //比赛接口
  96. ITableUserAction * m_pIMatchTableAction; //动作接口
  97. protected:
  98. UINT32 m_iLastDismissVoteTime; //上一次解散投票的时间
  99. bool m_bDismissVoteStarted; //解散投票开始标志
  100. WORD w_SendChairID; //投票发起人座位号
  101. //函数定义
  102. public:
  103. //构造函数
  104. CTableFrame();
  105. //析构函数
  106. virtual ~CTableFrame();
  107. //基础接口
  108. public:
  109. //释放对象
  110. virtual VOID Release() { delete this;}
  111. //接口查询
  112. virtual VOID * QueryInterface(REFGUID Guid, DWORD dwQueryVer);
  113. //属性接口
  114. public:
  115. //++交换座位
  116. virtual bool SwapChair();
  117. //私有桌子号码
  118. virtual std::wstring& GetPrivateTableID() { return m_sPrivateTableID; }
  119. //私有桌子号码
  120. virtual bool GetPrivateTableID(TCHAR *pTableID, DWORD dLen);
  121. //设置私有桌子号码
  122. void SetPrivateTableID(TCHAR *pTableID) { m_sPrivateTableID = pTableID; };
  123. //桌子号码
  124. virtual WORD GetTableID() { return m_wTableID; }
  125. //游戏人数
  126. virtual WORD GetChairCount() { return m_wChairCount; }
  127. //修改最大人数
  128. virtual VOID SetChairCount(WORD wNewChairCount) {
  129. m_wChairCount = wNewChairCount;
  130. }
  131. //设置桌子类型
  132. virtual VOID SetTableKind(BYTE Kind){m_wTableKind = Kind; }
  133. virtual BYTE GetTableKind(){ return m_wTableKind; }
  134. //设置俱乐部ID
  135. virtual VOID SetTableClub(DWORD clubID){ m_dwClubID = clubID; }
  136. virtual DWORD GetTableClub(){ return m_dwClubID; }
  137. //设置桌子自动属性
  138. virtual VOID SetTableAuto(BYTE Auto){ m_cbAuto = Auto; }
  139. virtual BYTE GetTableAuto(){ return m_cbAuto; }
  140. //空位置数目
  141. virtual WORD GetNullChairCount(){ return m_wChairCount - m_wUserCount; }
  142. //配置参数
  143. public:
  144. //自定配置
  145. virtual VOID * GetCustomRule() { return m_pGameServiceOption->cbCustomRule; };
  146. //服务属性
  147. virtual tagGameServiceAttrib * GetGameServiceAttrib() { return m_pGameServiceAttrib; }
  148. //服务配置
  149. virtual tagGameServiceOption * GetGameServiceOption() { return m_pGameServiceOption; }
  150. //设置游戏配置
  151. virtual bool SetGameConfig(tagGameConfig a, WORD b) { mGameConfig = a; wXianZhi = b; return true; }
  152. //获取游戏配置
  153. virtual tagGameConfig GetGameConfig() { return mGameConfig; }
  154. //配置接口
  155. public:
  156. //开始模式
  157. virtual BYTE GetStartMode() { return m_cbStartMode; }
  158. //开始模式
  159. virtual VOID SetStartMode(BYTE cbStartMode) { m_cbStartMode = cbStartMode; }
  160. //单元积分
  161. public:
  162. //单元积分
  163. virtual LONG GetCellScore() { return m_lCellScore; }
  164. //单元积分
  165. virtual VOID SetCellScore(LONG lCellScore);
  166. //状态接口
  167. public:
  168. //获取状态
  169. virtual BYTE GetGameStatus() { return m_cbGameStatus; }
  170. //设置状态
  171. virtual VOID SetGameStatus(BYTE cbGameStatus) { m_cbGameStatus = cbGameStatus; }
  172. //信息接口
  173. public:
  174. //游戏状态
  175. virtual bool IsGameStarted() { return m_bGameStarted; }
  176. //游戏状态
  177. virtual bool IsDrawStarted() { return m_bDrawStarted; }
  178. //游戏状态
  179. virtual bool IsTableStarted() { return m_bTableStarted; }
  180. //锁定状态
  181. virtual bool IsTableLocked() { return (m_szEnterPassword[0] != 0); }
  182. //控制接口
  183. public:
  184. //开始游戏
  185. virtual bool StartGame();
  186. //解散游戏
  187. virtual bool DismissGame();
  188. //一脚赖油此局总共需要多少元宝
  189. virtual USHORT GetNeedPay();
  190. //纸牌
  191. virtual USHORT GetNeedPayZhiPai();
  192. //血流此局总共需要多少元宝
  193. virtual USHORT GetNeedPayEx();
  194. //戳瞎子总共需要多少元宝
  195. virtual USHORT GetNeedPayCxz();
  196. //结束游戏
  197. virtual bool ConcludeGame(BYTE cbGameStatus, bool bSendState = false);
  198. //结束桌子
  199. virtual bool ConcludeTable();
  200. //房主在未开始游戏前,请求解散牌桌
  201. virtual bool SetTableFree();
  202. //删除私人桌子
  203. virtual bool DeletePrivateTableNow();
  204. //直接扣除房卡
  205. virtual bool NowReduceBeans(DWORD dwUserID, UINT32 dwConsumeCurrency);
  206. //从冻结中消耗元宝
  207. virtual bool ReduceBeans(DWORD dwUserID, UINT32 dwConsumeCurrency);
  208. //锁定元宝
  209. virtual bool LockBeans(DWORD dwUserID, UINT32 dwConsumeCurrency);
  210. //解锁元宝
  211. virtual bool UnLockBeans(DWORD dwUserID, UINT32 dwConsumeCurrency);
  212. //在桌子解散的情况下,按照约定处理房间创建者需要解锁的元宝
  213. virtual void UnAdminLockBeans();
  214. virtual WORD GetStartCount() { return m_wStartCount; }
  215. virtual IServerUserItem* GetPrivateTableCreator()
  216. {
  217. if (m_wPrivateTableOwnerID <= 0)
  218. return NULL;
  219. return m_pIMainServiceFrame->SearchUserItem(m_wPrivateTableOwnerID);
  220. }
  221. void SetPrivateTableParentNodeID(DWORD wPrivateTablParentNodeID) {
  222. m_wPrivateTablParentNodeID = wPrivateTablParentNodeID;
  223. }
  224. //设置冻结金额
  225. bool SetUserLockData(DWORD dwUserID, DWORD dwNum);
  226. //获取冻结金额
  227. DWORD GetUserLockData(DWORD dwUserID);
  228. void SetPrivateTableOwnerID(DWORD dwUserID){ m_wPrivateTableOwnerID = dwUserID; }
  229. DWORD GetPrivateTableOwnerID(){ return m_wPrivateTableOwnerID; }
  230. //删除私有桌子
  231. bool DeletePrivateTableReq(IServerUserItem * pIUserItem, CMD_GR_DELETE_PRIVATE_ROOM_REQ req);
  232. //删除私有桌子
  233. bool DeletePrivateTableResp(IServerUserItem * pIUserItem, BYTE bAgree, bool bSendMe = false);
  234. bool DeletePrivateResult(USHORT uState, LPCTSTR szDescription);
  235. bool DeletePrivateStarted(USHORT uState, LPCTSTR szDescription);
  236. virtual bool SaveReplayRecord(void* pData, WORD wDataSize);//保存回放记录
  237. //用户接口
  238. public:
  239. //寻找用户
  240. virtual IServerUserItem * SearchUserItem(DWORD dwUserID);
  241. //游戏用户
  242. virtual IServerUserItem * GetTableUserItem(WORD wChairID);
  243. //旁观用户
  244. virtual IServerUserItem * EnumLookonUserItem(WORD wEnumIndex);
  245. //写分接口
  246. public:
  247. //写入积分
  248. virtual bool WriteUserScore(WORD wChairID, tagScoreInfo & ScoreInfo, DWORD dwGameMemal = INVALID_DWORD, DWORD dwPlayGameTime = INVALID_DWORD);
  249. //写入积分
  250. virtual bool WriteTableScore(tagScoreInfo ScoreInfoArray[], WORD wScoreCount);
  251. //写入俱乐部记录
  252. void WriteClubTableRecord();
  253. //推送闲聊机器人
  254. /*void WriteXianLiaoTableRecord();*/
  255. //计算接口
  256. public:
  257. //计算税收
  258. virtual SCORE CalculateRevenue(WORD wChairID, SCORE lScore);
  259. //查询限额
  260. virtual SCORE QueryConsumeQuota(IServerUserItem * pIServerUserItem);
  261. //时间接口
  262. public:
  263. //设置时间
  264. virtual bool SetGameTimer(DWORD dwTimerID, DWORD dwElapse, DWORD dwRepeat, WPARAM dwBindParameter);
  265. //删除时间
  266. virtual bool KillGameTimer(DWORD dwTimerID);
  267. //游戏用户
  268. public:
  269. //发送数据
  270. virtual bool SendTableData(WORD wChairID, WORD wSubCmdID);
  271. //发送数据
  272. virtual bool SendTableData(WORD wChairID, WORD wSubCmdID, VOID * pData, WORD wDataSize, WORD wMainCmdID = MDM_GF_GAME);
  273. //旁观用户
  274. public:
  275. //发送数据
  276. virtual bool SendLookonData(WORD wChairID, WORD wSubCmdID);
  277. //发送数据
  278. virtual bool SendLookonData(WORD wChairID, WORD wSubCmdID, VOID * pData, WORD wDataSize);
  279. //所有用户
  280. public:
  281. //发送数据
  282. virtual bool SendUserItemData(IServerUserItem * pIServerUserItem, WORD wSubCmdID);
  283. //发送数据
  284. virtual bool SendUserItemData(IServerUserItem * pIServerUserItem, WORD wSubCmdID, VOID * pData, WORD wDataSize);
  285. //系统消息
  286. public:
  287. //发送消息
  288. virtual bool SendGameMessage(LPCTSTR lpszMessage, WORD wType);
  289. //游戏消息
  290. virtual bool SendGameMessage(IServerUserItem * pIServerUserItem, LPCTSTR lpszMessage, WORD wType);
  291. //房间消息
  292. virtual bool SendRoomMessage(IServerUserItem * pIServerUserItem, LPCTSTR lpszMessage, WORD wType);
  293. //动作处理
  294. public:
  295. //用户创建私有房间
  296. bool OnTCPNetworkSubUserCreateRoom(IServerUserItem * pIServerUserItem);
  297. //起立动作
  298. virtual bool PerformStandUpAction(IServerUserItem * pIServerUserItem, bool bInitiative = false, bool bSendState = false);
  299. //游戏中途旁观进入
  300. virtual bool PerformLookonLogin(IServerUserItem * pIServerUserItem);
  301. //旁观动作
  302. virtual bool PerformLookonAction(IServerUserItem * pIServerUserItem);
  303. //坐下动作
  304. virtual bool PerformSitDownAction(WORD wChairID, IServerUserItem * pIServerUserItem, LPCTSTR lpszPassword = NULL);
  305. //发送在坐用户状态
  306. virtual bool SendUserInfoStat(IServerUserItem * pIServerUserItem);
  307. //比对客户端版本
  308. bool CheckClient(TCHAR *pNow, LPCTSTR pOld);
  309. //功能接口
  310. public:
  311. //发送场景
  312. virtual bool SendGameScene(IServerUserItem * pIServerUserItem, VOID * pData, WORD wDataSize);
  313. //比赛接口
  314. public:
  315. //设置接口
  316. virtual bool SetTableFrameHook(IUnknownEx * pIUnknownEx);
  317. //获取接口
  318. virtual IUnknownEx * GetTableFrameHook(){ return m_pITableFrameHook; }
  319. //获取信息
  320. public:
  321. //获取信息
  322. virtual LPCTSTR GetCompilation(){ return szCompilation; }
  323. //功能函数
  324. public:
  325. //游戏局数
  326. WORD GetDrawCount();
  327. //获取出房主椅子外的座位
  328. WORD GetNullChairIDWithoutHost();
  329. //获取空位
  330. WORD GetNullChairID();
  331. //随机空位
  332. WORD GetRandNullChairID();
  333. //用户数目
  334. WORD GetSitUserCount();
  335. //旁观数目
  336. WORD GetLookonUserCount();
  337. //断线数目
  338. WORD GetOffLineUserCount();
  339. //功能函数
  340. public:
  341. //用户状况
  342. WORD GetTableUserInfo(tagTableUserInfo & TableUserInfo);
  343. //配置桌子
  344. bool InitializationFrame(WORD wTableID, tagTableFrameParameter & TableFrameParameter, WORD wGameType);
  345. //用户事件
  346. public:
  347. //上线事件
  348. bool OnEventUserOnLine(IServerUserItem * pIServerUserItem);
  349. //断线事件
  350. bool OnEventUserOffLine(IServerUserItem * pIServerUserItem);
  351. //积分事件
  352. bool OnUserScroeNotify(WORD wChairID, IServerUserItem * pIServerUserItem, BYTE cbReason);
  353. //系统事件
  354. public:
  355. //时间事件
  356. bool OnEventTimer(DWORD dwTimerID, WPARAM dwBindParameter);
  357. //游戏事件
  358. bool OnEventSocketGame(WORD wSubCmdID, VOID * pData, WORD wDataSize, IServerUserItem * pIServerUserItem);
  359. //框架事件
  360. bool OnEventSocketFrame(WORD wSubCmdID, VOID * pData, WORD wDataSize, IServerUserItem * pIServerUserItem);
  361. //设置游戏配置
  362. void OnEventSetGameConfig(VOID * pData, WORD wDataSize, std::wstring sPrivateRoomId);
  363. //辅助函数
  364. public:
  365. //桌子状态
  366. bool SendTableStatus();
  367. //请求失败
  368. bool SendRequestFailure(IServerUserItem * pIServerUserItem, LPCTSTR pszDescribe, LONG lErrorCode);
  369. //效验函数
  370. public:
  371. //开始效验
  372. bool EfficacyStartGame(WORD wReadyChairID);
  373. //地址效验
  374. bool EfficacyIPAddress(IServerUserItem * pIServerUserItem);
  375. //积分效验
  376. bool EfficacyScoreRule(IServerUserItem * pIServerUserItem);
  377. //积分效验
  378. bool EfficacyEnterTableScoreRule(WORD wChairID, IServerUserItem * pIServerUserItem);
  379. public:
  380. //检查分配
  381. bool CheckDistribute();
  382. //游戏记录
  383. void RecordGameScore(bool bDrawStarted, DWORD dwStartGameTime = INVALID_DWORD, bool bUpdateParent=false);
  384. //温岭扣钻 调用数据库接口
  385. bool DeductWLZuanshi(DWORD dwUserID);
  386. };
  387. //////////////////////////////////////////////////////////////////////////////////
  388. #endif