#ifndef TABLE_FRAME_HEAD_FILE #define TABLE_FRAME_HEAD_FILE #include "Stdafx.h" #include "DataBasePacket.h" #include ////////////////////////////////////////////////////////////////////////////////// //数组定义 typedef IServerUserItem * CTableUserItemArray[MAX_CHAIR]; //游戏数组 typedef CWHArray CLookonUserItemArray; //旁观数组 typedef CWHArray CGameScoreRecordArray; //记录数组 interface IMatchTableFrameNotify; ////////////////////////////////////////////////////////////////////////////////// //桌子框架 class CTableFrame : public ITableFrame, public ICompilationSink { //游戏属性 protected: DWORD m_wPrivateTablParentNodeID; //私有桌子父节点ID DWORD m_wPrivateTableOwnerID; //创建者ID std::wstring m_sPrivateTableID; //私有桌子号 WORD m_wTableID; //桌子号码 WORD m_wChairCount; //椅子数目 BYTE m_cbStartMode; //开始模式 WORD m_wUserCount; //用户数目 BYTE m_wTableKind; //桌子类型 DWORD m_dwClubID; //俱乐部ID BYTE m_cbAuto; //桌子自动创建属性 //状态变量 protected: bool m_bGameStarted; //游戏标志 bool m_bDrawStarted; //游戏标志 bool m_bTableStarted; //游戏标志 bool m_bTableInitFinish; //初始标识 WORD m_wStartCount; //开始游戏次数 bool m_bJieSan; //上次解散是否成功 //状态变量 protected: bool m_bAllowLookon[MAX_CHAIR]; //旁观标志 bool m_GameRead[MAX_CHAIR]; //游戏中准备 bool m_GameShuffleRead[MAX_CHAIR]; //游戏中洗牌准备 SCORE m_lFrozenedScore[MAX_CHAIR]; //服务费用 JN_GR_RoomLockDate m_jgrUserLockData[6]; //房间已经冻结用户冻结的钱 //游戏变量 protected: LONG m_lCellScore; //单元积分 BYTE m_cbGameStatus; //游戏状态 //时间变量 protected: DWORD m_dwDrawStartTime; //开始时间 SYSTEMTIME m_SystemTimeStart; //开始时间 WORD m_wDrawCount; //游戏局数 void* m_ReplayRecordData; //回放数据 WORD m_ReplayRecordDataSize; //回放数据长度 //动态属性 protected: DWORD m_dwTableOwnerID; //桌主用户 TCHAR m_szEnterPassword[LEN_PASSWORD]; //进入密码 //断线变量 protected: WORD m_wOffLineCount[MAX_CHAIR]; //断线次数 DWORD m_dwOffLineTime[MAX_CHAIR]; //断线时间 //用户数组 protected: CTableUserItemArray m_TableUserItemArray; //游戏用户 CLookonUserItemArray m_LookonUserItemArray; //旁观用户 protected: std::unordered_map m_AgreeDeletePriTableUsers; //投票解散的用户 //组件接口 protected: ITimerEngine * m_pITimerEngine; //时间引擎 ITableFrameSink * m_pITableFrameSink; //桌子接口 IMainServiceFrame * m_pIMainServiceFrame; //服务接口 IAndroidUserManager * m_pIAndroidUserManager; //机器接口 //扩展接口 protected: ITableUserAction * m_pITableUserAction; //动作接口 ITableUserRequest * m_pITableUserRequest; //请求接口 //数据接口 protected: IDataBaseEngine * m_pIKernelDataBaseEngine; //内核数据 IDataBaseEngine * m_pIRecordDataBaseEngine; //记录数据 //配置信息 protected: tagGameParameter * m_pGameParameter; //配置参数 tagGameServiceAttrib * m_pGameServiceAttrib; //服务属性 tagGameServiceOption * m_pGameServiceOption; //服务配置 tagGameConfig mGameConfig; //游戏配置 WORD wXianZhi; //开始游戏时钻石限制 //游戏记录 protected: CGameScoreRecordArray m_GameScoreRecordActive; //游戏记录 static CGameScoreRecordArray m_GameScoreRecordBuffer; //游戏记录 //比赛接口 protected: ITableFrameHook * m_pITableFrameHook; //比赛接口 ITableUserAction * m_pIMatchTableAction; //动作接口 protected: UINT32 m_iLastDismissVoteTime; //上一次解散投票的时间 bool m_bDismissVoteStarted; //解散投票开始标志 WORD w_SendChairID; //投票发起人座位号 //函数定义 public: //构造函数 CTableFrame(); //析构函数 virtual ~CTableFrame(); //基础接口 public: //释放对象 virtual VOID Release() { delete this;} //接口查询 virtual VOID * QueryInterface(REFGUID Guid, DWORD dwQueryVer); //属性接口 public: //++交换座位 virtual bool SwapChair(); //私有桌子号码 virtual std::wstring& GetPrivateTableID() { return m_sPrivateTableID; } //私有桌子号码 virtual bool GetPrivateTableID(TCHAR *pTableID, DWORD dLen); //设置私有桌子号码 void SetPrivateTableID(TCHAR *pTableID) { m_sPrivateTableID = pTableID; }; //桌子号码 virtual WORD GetTableID() { return m_wTableID; } //游戏人数 virtual WORD GetChairCount() { return m_wChairCount; } //修改最大人数 virtual VOID SetChairCount(WORD wNewChairCount) { m_wChairCount = wNewChairCount; } //设置桌子类型 virtual VOID SetTableKind(BYTE Kind){m_wTableKind = Kind; } virtual BYTE GetTableKind(){ return m_wTableKind; } //设置俱乐部ID virtual VOID SetTableClub(DWORD clubID){ m_dwClubID = clubID; } virtual DWORD GetTableClub(){ return m_dwClubID; } //设置桌子自动属性 virtual VOID SetTableAuto(BYTE Auto){ m_cbAuto = Auto; } virtual BYTE GetTableAuto(){ return m_cbAuto; } //空位置数目 virtual WORD GetNullChairCount(){ return m_wChairCount - m_wUserCount; } //配置参数 public: //自定配置 virtual VOID * GetCustomRule() { return m_pGameServiceOption->cbCustomRule; }; //服务属性 virtual tagGameServiceAttrib * GetGameServiceAttrib() { return m_pGameServiceAttrib; } //服务配置 virtual tagGameServiceOption * GetGameServiceOption() { return m_pGameServiceOption; } //设置游戏配置 virtual bool SetGameConfig(tagGameConfig a, WORD b) { mGameConfig = a; wXianZhi = b; return true; } //获取游戏配置 virtual tagGameConfig GetGameConfig() { return mGameConfig; } //配置接口 public: //开始模式 virtual BYTE GetStartMode() { return m_cbStartMode; } //开始模式 virtual VOID SetStartMode(BYTE cbStartMode) { m_cbStartMode = cbStartMode; } //单元积分 public: //单元积分 virtual LONG GetCellScore() { return m_lCellScore; } //单元积分 virtual VOID SetCellScore(LONG lCellScore); //状态接口 public: //获取状态 virtual BYTE GetGameStatus() { return m_cbGameStatus; } //设置状态 virtual VOID SetGameStatus(BYTE cbGameStatus) { m_cbGameStatus = cbGameStatus; } //信息接口 public: //游戏状态 virtual bool IsGameStarted() { return m_bGameStarted; } //游戏状态 virtual bool IsDrawStarted() { return m_bDrawStarted; } //游戏状态 virtual bool IsTableStarted() { return m_bTableStarted; } //锁定状态 virtual bool IsTableLocked() { return (m_szEnterPassword[0] != 0); } //控制接口 public: //开始游戏 virtual bool StartGame(); //解散游戏 virtual bool DismissGame(); //一脚赖油此局总共需要多少元宝 virtual USHORT GetNeedPay(); //纸牌 virtual USHORT GetNeedPayZhiPai(); //血流此局总共需要多少元宝 virtual USHORT GetNeedPayEx(); //戳瞎子总共需要多少元宝 virtual USHORT GetNeedPayCxz(); //结束游戏 virtual bool ConcludeGame(BYTE cbGameStatus, bool bSendState = false); //结束桌子 virtual bool ConcludeTable(); //房主在未开始游戏前,请求解散牌桌 virtual bool SetTableFree(); //删除私人桌子 virtual bool DeletePrivateTableNow(); //直接扣除房卡 virtual bool NowReduceBeans(DWORD dwUserID, UINT32 dwConsumeCurrency); //从冻结中消耗元宝 virtual bool ReduceBeans(DWORD dwUserID, UINT32 dwConsumeCurrency); //锁定元宝 virtual bool LockBeans(DWORD dwUserID, UINT32 dwConsumeCurrency); //解锁元宝 virtual bool UnLockBeans(DWORD dwUserID, UINT32 dwConsumeCurrency); //在桌子解散的情况下,按照约定处理房间创建者需要解锁的元宝 virtual void UnAdminLockBeans(); virtual WORD GetStartCount() { return m_wStartCount; } virtual IServerUserItem* GetPrivateTableCreator() { if (m_wPrivateTableOwnerID <= 0) return NULL; return m_pIMainServiceFrame->SearchUserItem(m_wPrivateTableOwnerID); } void SetPrivateTableParentNodeID(DWORD wPrivateTablParentNodeID) { m_wPrivateTablParentNodeID = wPrivateTablParentNodeID; } //设置冻结金额 bool SetUserLockData(DWORD dwUserID, DWORD dwNum); //获取冻结金额 DWORD GetUserLockData(DWORD dwUserID); void SetPrivateTableOwnerID(DWORD dwUserID){ m_wPrivateTableOwnerID = dwUserID; } DWORD GetPrivateTableOwnerID(){ return m_wPrivateTableOwnerID; } //删除私有桌子 bool DeletePrivateTableReq(IServerUserItem * pIUserItem, CMD_GR_DELETE_PRIVATE_ROOM_REQ req); //删除私有桌子 bool DeletePrivateTableResp(IServerUserItem * pIUserItem, BYTE bAgree, bool bSendMe = false); bool DeletePrivateResult(USHORT uState, LPCTSTR szDescription); bool DeletePrivateStarted(USHORT uState, LPCTSTR szDescription); virtual bool SaveReplayRecord(void* pData, WORD wDataSize);//保存回放记录 //用户接口 public: //寻找用户 virtual IServerUserItem * SearchUserItem(DWORD dwUserID); //游戏用户 virtual IServerUserItem * GetTableUserItem(WORD wChairID); //旁观用户 virtual IServerUserItem * EnumLookonUserItem(WORD wEnumIndex); //写分接口 public: //写入积分 virtual bool WriteUserScore(WORD wChairID, tagScoreInfo & ScoreInfo, DWORD dwGameMemal = INVALID_DWORD, DWORD dwPlayGameTime = INVALID_DWORD); //写入积分 virtual bool WriteTableScore(tagScoreInfo ScoreInfoArray[], WORD wScoreCount); //写入俱乐部记录 void WriteClubTableRecord(); //推送闲聊机器人 /*void WriteXianLiaoTableRecord();*/ //计算接口 public: //计算税收 virtual SCORE CalculateRevenue(WORD wChairID, SCORE lScore); //查询限额 virtual SCORE QueryConsumeQuota(IServerUserItem * pIServerUserItem); //时间接口 public: //设置时间 virtual bool SetGameTimer(DWORD dwTimerID, DWORD dwElapse, DWORD dwRepeat, WPARAM dwBindParameter); //删除时间 virtual bool KillGameTimer(DWORD dwTimerID); //游戏用户 public: //发送数据 virtual bool SendTableData(WORD wChairID, WORD wSubCmdID); //发送数据 virtual bool SendTableData(WORD wChairID, WORD wSubCmdID, VOID * pData, WORD wDataSize, WORD wMainCmdID = MDM_GF_GAME); //旁观用户 public: //发送数据 virtual bool SendLookonData(WORD wChairID, WORD wSubCmdID); //发送数据 virtual bool SendLookonData(WORD wChairID, WORD wSubCmdID, VOID * pData, WORD wDataSize); //所有用户 public: //发送数据 virtual bool SendUserItemData(IServerUserItem * pIServerUserItem, WORD wSubCmdID); //发送数据 virtual bool SendUserItemData(IServerUserItem * pIServerUserItem, WORD wSubCmdID, VOID * pData, WORD wDataSize); //系统消息 public: //发送消息 virtual bool SendGameMessage(LPCTSTR lpszMessage, WORD wType); //游戏消息 virtual bool SendGameMessage(IServerUserItem * pIServerUserItem, LPCTSTR lpszMessage, WORD wType); //房间消息 virtual bool SendRoomMessage(IServerUserItem * pIServerUserItem, LPCTSTR lpszMessage, WORD wType); //动作处理 public: //用户创建私有房间 bool OnTCPNetworkSubUserCreateRoom(IServerUserItem * pIServerUserItem); //起立动作 virtual bool PerformStandUpAction(IServerUserItem * pIServerUserItem, bool bInitiative = false, bool bSendState = false); //游戏中途旁观进入 virtual bool PerformLookonLogin(IServerUserItem * pIServerUserItem); //旁观动作 virtual bool PerformLookonAction(IServerUserItem * pIServerUserItem); //坐下动作 virtual bool PerformSitDownAction(WORD wChairID, IServerUserItem * pIServerUserItem, LPCTSTR lpszPassword = NULL); //发送在坐用户状态 virtual bool SendUserInfoStat(IServerUserItem * pIServerUserItem); //比对客户端版本 bool CheckClient(TCHAR *pNow, LPCTSTR pOld); //功能接口 public: //发送场景 virtual bool SendGameScene(IServerUserItem * pIServerUserItem, VOID * pData, WORD wDataSize); //比赛接口 public: //设置接口 virtual bool SetTableFrameHook(IUnknownEx * pIUnknownEx); //获取接口 virtual IUnknownEx * GetTableFrameHook(){ return m_pITableFrameHook; } //获取信息 public: //获取信息 virtual LPCTSTR GetCompilation(){ return szCompilation; } //功能函数 public: //游戏局数 WORD GetDrawCount(); //获取出房主椅子外的座位 WORD GetNullChairIDWithoutHost(); //获取空位 WORD GetNullChairID(); //随机空位 WORD GetRandNullChairID(); //用户数目 WORD GetSitUserCount(); //旁观数目 WORD GetLookonUserCount(); //断线数目 WORD GetOffLineUserCount(); //功能函数 public: //用户状况 WORD GetTableUserInfo(tagTableUserInfo & TableUserInfo); //配置桌子 bool InitializationFrame(WORD wTableID, tagTableFrameParameter & TableFrameParameter, WORD wGameType); //用户事件 public: //上线事件 bool OnEventUserOnLine(IServerUserItem * pIServerUserItem); //断线事件 bool OnEventUserOffLine(IServerUserItem * pIServerUserItem); //积分事件 bool OnUserScroeNotify(WORD wChairID, IServerUserItem * pIServerUserItem, BYTE cbReason); //系统事件 public: //时间事件 bool OnEventTimer(DWORD dwTimerID, WPARAM dwBindParameter); //游戏事件 bool OnEventSocketGame(WORD wSubCmdID, VOID * pData, WORD wDataSize, IServerUserItem * pIServerUserItem); //框架事件 bool OnEventSocketFrame(WORD wSubCmdID, VOID * pData, WORD wDataSize, IServerUserItem * pIServerUserItem); //设置游戏配置 void OnEventSetGameConfig(VOID * pData, WORD wDataSize, std::wstring sPrivateRoomId); //辅助函数 public: //桌子状态 bool SendTableStatus(); //请求失败 bool SendRequestFailure(IServerUserItem * pIServerUserItem, LPCTSTR pszDescribe, LONG lErrorCode); //效验函数 public: //开始效验 bool EfficacyStartGame(WORD wReadyChairID); //地址效验 bool EfficacyIPAddress(IServerUserItem * pIServerUserItem); //积分效验 bool EfficacyScoreRule(IServerUserItem * pIServerUserItem); //积分效验 bool EfficacyEnterTableScoreRule(WORD wChairID, IServerUserItem * pIServerUserItem); public: //检查分配 bool CheckDistribute(); //游戏记录 void RecordGameScore(bool bDrawStarted, DWORD dwStartGameTime = INVALID_DWORD, bool bUpdateParent=false); //温岭扣钻 调用数据库接口 bool DeductWLZuanshi(DWORD dwUserID); }; ////////////////////////////////////////////////////////////////////////////////// #endif