#ifndef TABLE_FRAME_SINK_HEAD_FILE #define TABLE_FRAME_SINK_HEAD_FILE #pragma once #include "Stdafx.h" #include "GameLogic.h" #include "ReplayRecordManager.h" #include "data.h" //游戏桌子类 class CTableFrameSink : public ITableFrameSink, public ITableUserAction { //游戏变量 private: BYTE bGameType; //游戏到底是0一脚癞油,1无癞到底,2半癞 LONG m_lSiceCount; //骰子点数 WORD m_wBankerUser; //庄家用户 WORD m_wNextBankerUser; //下一个庄家 int m_lGameScore[GAME_PLAYER]; //单局游戏得分 int m_lGameTatolScore[GAME_PLAYER]; //单轮积分计算 BYTE m_HuPai[GAME_PLAYER]; //玩家胡牌次数 int m_HuPaiLiuShui[16*GAME_PLAYER]; //流水详情 BYTE m_cbCardIndex[GAME_PLAYER][MAX_INDEX]; //用户扑克 BYTE m_bTrustee[GAME_PLAYER]; //是否托管 BYTE m_bReading[GAME_PLAYER]; //是否准备 BYTE m_cbLaiZiPiData; //癞子皮 BYTE m_cbLaiZiData; //癞子 BYTE m_cbQiangGangCardData[GAME_PLAYER]; //抢杠的牌 BYTE m_cbGenCount[GAME_PLAYER]; // bool m_bPlayStatus[GAME_PLAYER]; //玩家状态 std::list m_offlineUsers; //掉线的玩家 BYTE m_cbWinCount; // WORD m_wWinOrder[GAME_PLAYER]; // LONG m_lGameTax[GAME_PLAYER]; // //tagGangScore m_GangScore[GAME_PLAYER]; //玩家具体杠的信息 BYTE m_OutLaiZi[GAME_PLAYER]; //每个用户打出癞子牌个数 BYTE m_TabbOutCardCout[GAME_PLAYER]; //可以打出的牌就听牌的个数 BYTE m_TabbOutCardData[GAME_PLAYER][MAX_COUNT]; //具体打哪几张牌 BYTE m_TabbTingCardCount[GAME_PLAYER][MAX_COUNT]; //相对应打出牌可听牌个数,索引表示第几张,值是对应对应的听牌个数 BYTE m_TabbTingCardData[GAME_PLAYER][MAX_COUNT][MAX_INDEX]; //具体听牌数据,一维索引表示打出牌的第几个,二维索引表示听牌的第几个,值表示牌数据 private: CMD_S_GameConfig m_gameConfig; //游戏配置 bool m_isCanOutCard; //是否可以出牌 bool m_bDelete; //是否解散房间 bool bIsHuang; //bool m_isTingPai[GAME_PLAYER]; //玩家是否听牌 //出牌信息 private: WORD m_wOutCardUser; //出牌用户 BYTE m_cbOutCardData; //出牌扑克 BYTE m_cbOutCardCount; //出牌数目 BYTE m_cbDiscardCount[GAME_PLAYER]; //丢弃数目 BYTE m_cbDiscardCard[GAME_PLAYER][55]; //丢弃记录 BYTE m_cbLastDisCardData[GAME_PLAYER][MAX_COUNT];//每个玩家得记忆库,用于判断是否可以碰不 BYTE m_cbLastDisCount[GAME_PLAYER]; //每个玩家记忆库得个数 ///BYTE m_cbDiscardWuYongCount[GAME_PLAYER]; //丢弃之后,也没碰杠的牌数目 //BYTE m_cbDiscardWuYongCard[GAME_PLAYER][55]; //具体数据 //发牌信息 private: BYTE m_cbSendCardData; //发牌扑克 BYTE m_cbSendCardCount; //发牌数目 BYTE m_cbLeftCardCount; //剩余数目 BYTE m_cbRepertoryCard[MAX_REPERTORY]; //库存扑克 //堆立变量 private: WORD m_wHeapHand; //堆立头部(从哪堆牌开始摸?) WORD m_wHeapTail; //堆立尾部(摸到堆牌结束?) BYTE m_cbHeapCardInfo[4][2]; //堆牌信息(记录4堆牌的堆头和堆尾各被摸了几张,如果( 堆头+堆尾 = 堆总数 ) 表示这堆牌被摸完了,需要切到下个玩家的那堆牌开始摸) //运行变量 private: WORD m_wResumeUser; //还原用户(下一个用户?) WORD m_wCurrentUser; //当前用户 WORD m_wProvideUser; //供应用户 BYTE m_cbProvideCard; //供应扑克 //状态变量 private: bool m_bSendStatus; //发牌状态 bool m_bGangStatus; //癞子杠状态,表示当时出牌是癞子,杠胡癞油 WORD m_wDianGangUser; //点杠用户(如果是自己,表示暗杠,他人表示点杠) bool m_bGangOutStatus; //杠后炮,没用 bool m_bEnjoinChiHu[GAME_PLAYER]; //禁止吃胡,没用 bool m_bEnjoinChiPeng[GAME_PLAYER]; //禁止吃碰,没用 //用户状态 private: bool m_bResponse[GAME_PLAYER]; //响应标志 INT m_cbUserAction[GAME_PLAYER]; //用户动作 BYTE m_cbOperateCard[GAME_PLAYER]; //操作扑克 INT m_cbPerformAction[GAME_PLAYER]; //执行动作 //组合扑克 private: BYTE m_cbWeaveItemCount[GAME_PLAYER]; //组合数目 tagWeaveItem m_WeaveItemArray[GAME_PLAYER][MAX_WEAVE];//组合扑克 //结束信息 private: BYTE m_cbChiHuCard; //吃胡扑克 DWORD m_dwChiHuKind[GAME_PLAYER]; //吃胡结果 //std::vector m_ChiHuRight[GAME_PLAYER]; //血战到底需要记录下每个用户胡牌的类型,但是癞油不需要,胡牌就结束 WORD m_wProvider[GAME_PLAYER]; // //组件变量 private: CGameLogic m_GameLogic; //游戏逻辑 ITableFrame * m_pITableFrame; //框架接口 const tagGameServiceOption * m_pGameServiceOption; //配置参数 bool m_bReplayRecordStart; //是否开始录像 std::vector m_UserReplayRecord; //对四个位置用户的数据的记录,用于回放。 //bool m_bReduceBean; //是否已扣房卡(游戏豆) LONGLONG m_lUserTmpScore[GAME_PLAYER]; //INT m_lZimo[GAME_PLAYER]; //累计自摸次数 //LONG m_lFangPao[GAME_PLAYER]; //累计放炮次数 //LONG m_lDianPao[GAME_PLAYER]; //累计点炮次数 //LONG m_lMingGang[GAME_PLAYER]; //累计明杠次数 //LONG m_lAnGang[GAME_PLAYER]; //累计暗杠次数 //LONG m_lChaDaJiao[GAME_PLAYER]; //累计查大叫 //函数定义 public: //构造函数 CTableFrameSink(); //析构函数 virtual ~CTableFrameSink(); //void ReduceBean(); //bool IsCanOutCard(); //是否可以出牌 //基础接口 public: //释放对象 virtual VOID Release() { delete this; } //接口查询 virtual void * QueryInterface(const IID & Guid, DWORD dwQueryVer); //管理接口 public: //初始化 virtual bool Initialization(IUnknownEx * pIUnknownEx); //复位桌子 virtual VOID RepositionSink(); //查询接口 public: virtual void DeletePrivateTable(bool bSendState = false); virtual bool ConcludeGame(BYTE cbGameStatus, bool bSendState = false) { //结束记录回放数据 auto dataPair = RepayRecordEnd(); //结束游戏 m_pITableFrame->ConcludeGame(cbGameStatus, bSendState); return true; } //查询限额 virtual SCORE QueryConsumeQuota(IServerUserItem * pIServerUserItem){ return 0; }; //最少积分 virtual SCORE QueryLessEnterScore(WORD wChairID, IServerUserItem * pIServerUserItem){ return 0; }; //查询是否扣服务费 virtual bool QueryBuckleServiceCharge(WORD wChairID){return true;} //查询总得分 virtual int QueryTatolScore(WORD wChairID){ if (wChairID >= GAME_PLAYER || wChairID<0) ASSERT(false); return m_lGameTatolScore[wChairID]; } //查询癞子数 virtual int QueryTatolLaiGang(WORD wChairID){ if (wChairID >= GAME_PLAYER || wChairID < 0) ASSERT(false); return m_OutLaiZi[wChairID]; } //查询是否使用临时积分 virtual bool QueryUseTemporaryScore() { return (0!=lstrlen(m_gameConfig.sPrivateTableID)); //私有房间私用临时积分 } //比赛接口 public: //设置基数 virtual void SetGameBaseScore(LONG lBaseScore){}; virtual void SetGameConfig(VOID * pDataBuffer, WORD wDataSize, std::wstring sPrivateRoomId); //游戏事件 public: bool RepayRecordStart(); bool RepayRecordEnd(); bool RepayRecord(WORD wChairID, WORD wSubCmdId, void* pData, WORD wSize); // bool CheckGameConclude(); public: //游戏开始 virtual bool OnEventGameStart(); //游戏结束 virtual bool OnEventGameConclude(WORD wChairID, IServerUserItem * pIServerUserItem, BYTE cbReason, bool bSendState = false); //发送场景 virtual bool OnEventSendGameScene(WORD wChiarID, IServerUserItem * pIServerUserItem, BYTE cbGameStatus, bool bSendSecret); //事件接口 public: //定时器事件 virtual bool OnTimerMessage(DWORD wTimerID, WPARAM wBindParam); //数据事件 virtual bool OnDataBaseMessage(WORD wRequestID, VOID * pData, WORD wDataSize) { return false; } //积分事件 virtual bool OnUserScroeNotify(WORD wChairID, IServerUserItem * pIServerUserItem, BYTE cbReason) { return false; } //网络接口 public: //游戏消息处理 virtual bool OnGameMessage(WORD wSubCmdID, VOID * pDataBuffer, WORD wDataSize, IServerUserItem * pIServerUserItem); //框架消息处理 virtual bool OnFrameMessage(WORD wSubCmdID, VOID * pDataBuffer, WORD wDataSize, IServerUserItem * pIServerUserItem); //用户事件 public: //用户断线 virtual bool OnActionUserOffLine(WORD wChairID,IServerUserItem * pIServerUserItem) { return true; } //用户重入 需要处理重新发送指令 virtual bool OnActionUserConnect(WORD wChairID, IServerUserItem * pIServerUserItem); //用户坐下 virtual bool OnActionUserSitDown(WORD wChairID,IServerUserItem * pIServerUserItem, bool bLookonUser); //用户起立 virtual bool OnActionUserStandUp(WORD wChairID,IServerUserItem * pIServerUserItem, bool bLookonUser); //用户同意 virtual bool OnActionUserOnReady(WORD wChairID,IServerUserItem * pIServerUserItem, void * pData, WORD wDataSize) { return true; } //用户准备 //virtual bool OnActionUserReading(WORD wChairID); //游戏中途旁观进入 virtual bool PerformLookonLogin(IServerUserItem * pIServerUserItem); //游戏事件 protected: //用户出牌 bool OnUserOutCard(WORD wChairID, BYTE cbCardData); //用户操作 bool OnUserOperateCard(WORD wChairID, int cbOperateCode, BYTE cbOperateCard); //辅助函数 protected: bool IsWin(WORD wChairID); //发送操作 bool SendOperateNotify(); //派发扑克 bool DispatchCardData(WORD wCurrentUser,bool bTail=false,bool bLaiZiGang=false); //响应判断 bool EstimateUserRespond(WORD wCenterUser, BYTE cbCenterCard, enEstimatKind EstimatKind); // //void ProcessChiHuUser( WORD wChairId,CChiHuRight& chr, bool bGiveUp ); //获取根数 int GetGenCount(WORD wChairId, CChiHuRight& chr); BYTE RemainNum(WORD wChairId, const BYTE m_cbCard,BYTE bIndex); // //void FiltrateRight( WORD wChairId,CChiHuRight &chr ); }; ////////////////////////////////////////////////////////////////////////// #endif