#ifndef TABLE_FRAME_SINK_HEAD_FILE #define TABLE_FRAME_SINK_HEAD_FILE #pragma once #include "Stdafx.h" #include "GameLogic.h" ////////////////////////////////////////////////////////////////////////// //枚举定义 //效验类型 enum enEstimatKind { EstimatKind_OutCard, //出牌效验 EstimatKind_GangCard, //杠牌效验 }; enum eGangType { eGangType_BuGang, //补杠; eGangType_MingGang, //明杠; eGangType_AnGang, //暗杠; }; ////////////////////////////////////////////////////////////////////////// //游戏桌子类 class CTableFrameSink : public ITableFrameSink, public ITableUserAction { //游戏变量 protected: bool m_bActiveUser[GAME_PLAYER]; //激活玩家; WORD m_wSiceCount; //骰子点数 WORD m_wSiceCount2; //骰子点数  WORD m_wSiceCount3; //骰子点数3 WORD m_wBankerUser; //庄家用户 BYTE m_cbCardIndex[GAME_PLAYER][MAX_INDEX]; //用户扑克 bool m_bCallCard[GAME_PLAYER]; //洗澡标志 BYTE m_cbBatch[GAME_PLAYER]; //洗澡倍数 bool m_bTrustee[GAME_PLAYER]; //是否托管 bool m_bBatchEnd[GAME_PLAYER]; //洗澡结束 //历史积分; protected: SCORE m_lAllTurnScore[GAME_PLAYER]; //总局得分 SCORE m_lLastTurnScore[GAME_PLAYER]; //上局得分 BYTE m_cbAllGangCounts[GAME_PLAYER]; //统计杠的次数; protected: //临时变量; BYTE m_cbDelCardIndex[GAME_PLAYER][MAX_INDEX];//用户打出去扑克和删除的扑克; //出牌信息 protected: WORD m_wOutCardUser; //出牌用户 BYTE m_cbOutCardData; //出牌扑克 BYTE m_cbOutCardCount; //出牌数目 BYTE m_cbDiscardCount[GAME_PLAYER]; //丢弃数目 BYTE m_cbDiscardCard[GAME_PLAYER][55]; //丢弃记录 BYTE m_cbGangCount; //杠牌次数 INT m_BankContinueCount; //连庄次数 上下楼 BYTE m_cbMustLeft; //留8墙墩 //发牌信息 protected: BYTE m_cbSendCardData; //发牌扑克 BYTE m_cbSendCardCount; //发牌数目 BYTE m_cbLeftCardCount; //剩余数目 BYTE m_cbRepertoryCard[MAX_REPERTORY]; //库存扑克 BYTE m_cbMasterCheckCard[GAME_PLAYER]; //玩家要牌 //运行变量 protected: WORD m_wResumeUser; //还原用户 WORD m_wCurrentUser; //当前用户 WORD m_wProvideUser; //供应用户 BYTE m_cbProvideCard; //供应扑克 WORD m_wProvideMingGangUser; //供应明杠的用户; //状态变量 protected: bool m_bSendStatus; //发牌状态 bool m_bGangStatus; //抢杆状态 //bool m_bEnjoinChiHu[GAME_PLAYER]; //禁止吃胡 //bool m_bEnjoinChiPeng[GAME_PLAYER]; //禁止吃碰 //用户状态 public: bool m_bResponse[GAME_PLAYER]; //响应标志 WORD m_wUserAction[GAME_PLAYER]; //用户动作 BYTE m_cbOperateCard[GAME_PLAYER]; //操作扑克 WORD m_wPerformAction[GAME_PLAYER]; //执行动作 //组合扑克 protected: BYTE m_cbWeaveItemCount[GAME_PLAYER]; //组合数目 tagWeaveItem m_WeaveItemArray[GAME_PLAYER][4]; //组合扑克 //结束信息 protected: BYTE m_cbChiHuCard; //吃胡扑克 tagChiHuResult m_ChiHuResult[GAME_PLAYER]; //吃胡结果 //组件变量 protected: CGameLogic m_GameLogic; //游戏逻辑 ITableFrame * m_pITableFrame; //框架接口 const tagGameServiceOption * m_pGameServiceOption; //配置参数 //属性变量 protected: static const WORD m_wPlayerCount; //游戏人数 //static const enStartMode m_GameStartMode; //开始模式 BYTE m_genDaLiHuCards[GAME_PLAYER]; //立打立胡的牌值; BYTE m_genHuCards[GAME_PLAYER][4]; //跟胡牌的牌值; BYTE m_genPengCards[GAME_PLAYER][4]; //跟碰牌的牌值; BYTE m_cbContinueGangs[GAME_PLAYER]; //连续杠的次数; tagGangCardResult m_GangPaiResult[GAME_PLAYER]; //杠牌结果 BYTE m_cbContinueGangTypes[GAME_PLAYER][4]; //连续杠每次杠的类型; //函数定义 public: //构造函数 CTableFrameSink(); //析构函数 virtual ~CTableFrameSink(); //基础接口 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 SCORE QueryConsumeQuota(IServerUserItem * pIServerUserItem){return 0;} //最少积分 virtual SCORE QueryLessEnterScore(WORD wChairID, IServerUserItem * pIServerUserItem){return 0;} //数据事件 virtual bool OnDataBaseMessage(WORD wRequestID, VOID * pData, WORD wDataSize){return false;} //积分事件 virtual bool OnUserScroeNotify(WORD wChairID, IServerUserItem * pIServerUserItem, BYTE cbReason){return false;} //查询是否扣服务费 virtual bool QueryBuckleServiceCharge(WORD wChairID){return true;} //比赛接口 public: //设置基数 virtual void SetGameBaseScore(LONG lBaseScore){}; //游戏状态 virtual bool IsUserPlaying(WORD wChairID); //游戏事件 public: //游戏开始 virtual bool OnEventGameStart(); //游戏结束 virtual bool OnEventGameConclude(WORD wChairID, IServerUserItem * pIServerUserItem, BYTE cbReason); //发送场景 virtual bool OnEventSendGameScene(WORD wChiarID, IServerUserItem * pIServerUserItem, BYTE cbGameStatus, bool bSendSecret); //事件接口 public: //定时器事件 virtual bool OnTimerMessage(DWORD wTimerID, WPARAM wBindParam); //游戏消息处理 virtual bool OnGameMessage(WORD wSubCmdID, VOID * pDataBuffer, WORD wDataSize, IServerUserItem * pIServerUserItem); //框架消息处理 virtual bool OnFrameMessage(WORD wSubCmdID, VOID * pDataBuffer, WORD wDataSize, IServerUserItem * pIServerUserItem); //数据事件 virtual bool OnGameDataBase(WORD wRequestID, VOID * pData, WORD wDataSize); //用户事件 public: //用户断线 virtual bool OnActionUserOffLine(WORD wChairID,IServerUserItem * pIServerUserItem) { return true; } //用户重入 virtual bool OnActionUserConnect(WORD wChairID,IServerUserItem * pIServerUserItem) { return true; } //用户坐下 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 OnActionUserFangKaCheck(WORD wChairID, IServerUserItem * pIServerUserItem, SCORE lUserInsure) { return true; } //用户开始游戏 virtual bool OnActionUserOnStart(WORD wChairID, IServerUserItem * pIServerUserItem, VOID * pData, WORD wDataSize) { return true; } //用户开始游戏 virtual bool OnActionUserStartGame(WORD wChairID, IServerUserItem * pIServerUserItem, VOID * pData, WORD wDataSize) { return true; } //游戏事件 protected: //用户出牌 bool OnUserOutCard(WORD wChairID, BYTE cbCardData); //用户操作 bool OnUserOperateCard(WORD wChairID, WORD wOperateCode, BYTE cbOperateCard); //获取可以操作牌 BYTE GetOperateCard(WORD wChairID); //辅助函数 protected: //发送操作 bool SendOperateNotify(const tagGangCardResult& GangCardResult); //派发扑克 bool DispatchCardData(WORD wCurrentUser,bool bNotGang=true); //响应判断 bool EstimateUserRespond(WORD wCenterUser, BYTE cbCenterCard, enEstimatKind EstimatKind); //私人场 public: virtual void SetPrivateInfo(BYTE bGameTypeIdex, DWORD bGameRuleIdex); //重置私人场结束信息 virtual void ResetPrivateEndInfo(); //获得私人场结束信息流 virtual void GetPrivateEndInfo(DataStream &kDataStream, bool bSend); //判断私人场是否结束 virtual bool IsPrivateEnd(); //真实椅子数 virtual WORD GetRealChairCount(); // 获取下家椅子号; WORD getNextChairID(WORD wChairID); //私人场辅助函数; public: bool IsHasGameRule(eWNMJRuleEnum eType ); //是否有相应规则; BYTE GetFanShuType(); //获得胡牌规则类型; BYTE GetHURuleType(); // 录像事件 public: // 游戏开始 void starGameRecord(); // 玩家操作提示; void addGameRecordAction(WORD wSubCmdID, void* pSubMessage, int nMessageSize); private: //把吃碰杠牌插入DelCardIndex; void InsertIntoDelCardIndex(WORD wChairID, tagWeaveItem &reftagWeaveItem); void InsertIntoDelCardIndex(WORD wChairID, BYTE cbRemoveCard[], BYTE cbRemoveCount); //插入跟打不能胡牌值; void InsertGenHuCards(WORD wChairID, BYTE cbHuCardData); bool IsInInsertGenHuCards(WORD wChairID, BYTE cbCardData); bool HasGenHuCards(WORD wChairID); //插入跟打不能碰牌值; void InsertGenPengCards(WORD wChairID, BYTE cbPengCardData); bool IsInInsertGenPengCards(WORD wChairID, BYTE cbCardData); //玩家要牌 BYTE getSendCardData(WORD dwSendUser); //发送排堆; void sendMasterLeftCard(int nChairdID); //使用牌库 void UseCardLibrary(); //从牌堆中删除一些牌 bool RemoveCards(BYTE cbCards[], BYTE cbCardCount, BYTE cbRemoveCards[], BYTE cbRemoveCount); //私人场结算信息 public: CMD_S_Private_End_Info m_PrivateEndInfo; //录像 public: tagGameRecord m_kGameRecord; //运行变量 protected: WORD m_wCheatChairID; //作弊玩家坐位置号 WORD m_wDropped; // 掉线率 }; ////////////////////////////////////////////////////////////////////////// #endif