Files
2026-03-03 13:56:44 +08:00

273 lines
8.7 KiB
C++

#ifndef IMMEDIATE_GROUP_HEAD_FILE
#define IMMEDIATE_GROUP_HEAD_FILE
#pragma once
//包含文件
#include "TableFrameHook.h"
#include "MatchServiceHead.h"
///////////////////////////////////////////////////////////////////////////////////////////////////////
//时钟定义
#define IDI_DELETE_OVER_MATCH (IDI_MATCH_MODULE_START+1) //删除结束的比赛组
#define IDI_CHECK_OVER_MATCH (IDI_MATCH_MODULE_START+2) //检查一场比赛
#define IDI_GROUP_TIMER_START (IDI_MATCH_MODULE_START+10) //比赛组内的定时器
//时钟定义
#define IDI_CHECK_MATCH_GROUP (IDI_GROUP_TIMER_START+1) //轮巡所有开赛比赛组
#define IDI_WAITTABLE_FIRST_ROUND (IDI_GROUP_TIMER_START+2) //等待配桌
#define IDI_WAITTABLE_RAND_TABLE (IDI_GROUP_TIMER_START+3) //等待随机分配
#define IDI_SWITCH_WAIT_TIME (IDI_GROUP_TIMER_START+4) //换桌等待时间
#define IDI_ALL_DISMISS_GAME (IDI_GROUP_TIMER_START+5) //全部解散游戏
#define IDI_LASTMATCHRESULT (IDI_GROUP_TIMER_START+6) //结束比赛
#define IDI_ENTER_NEXT_ROUND (IDI_GROUP_TIMER_START+7) //进入下一个循环
#define IDI_TABLE_REQUEST_USER (IDI_GROUP_TIMER_START+8) //自动分配桌子
//时钟定义
#define IDI_CONTINUE_GAME 1 //继续游戏
#define IDI_LEAVE_TABLE 2 //离开桌子
#define IDI_CHECK_TABLE_START 3 //检查分配桌子是否开始(解决有可能准备后不开始情况)
///////////////////////////////////////////////////////////////////////////////////////////////////////
//结构定义
//比赛状态
enum enMatchStatus
{
MatchStatus_Null=0, //无状态
MatchStatus_Signup, //报名中
MatchStatus_Wait, //等待桌子
MatchStatus_FirstRound //首轮比赛
};
//比赛定时器
struct tagMatchTimer
{
DWORD dwTimerID; //定时器ID
int iElapse; //执行间隔秒
WPARAM wParam; //附加参数
LPARAM lParam; //附加参数
};
//排名单项
struct tagMatchRanking
{
DWORD dwUserID; //用户I D
SCORE lScore; //用户分数
LONG lExpand; //扩展值
IServerUserItem * pUserItem; //用户接口
};
//比赛桌详情
struct tagTableFrameInfo
{
ITableFrame * pTableFrame; //桌子接口
WORD wTableID; //桌子编号
DWORD dwBaseScore; //基础分数
BYTE cbPlayCount; //游戏局数
bool bRoundTableFinish; //完成标识
bool bSwtichTableFinish; //换桌完成
bool bWaitForNextInnings; //等待下局
};
///////////////////////////////////////////////////////////////////////////////////////////////////////
//类型定义
//数组定义
typedef CWHArray<tagMatchTimer *> CUserMatchTimerArray;
typedef CWHArray<tagMatchScore *> CUserMatchScoreArray;
typedef CWHArray<IServerUserItem *> CMatchUserItemArray;
typedef CWHArray<tagTableFrameInfo *> CTableFrameMananerArray;
//字典定义
typedef CMap<DWORD,DWORD,IServerUserItem *, IServerUserItem *> CUserItemMap;
typedef CMap<IServerUserItem *, IServerUserItem *, DWORD, DWORD> CUserSeatMap;
///////////////////////////////////////////////////////////////////////////////////////////////////////
//接口定义
//类型声明
class CImmediateGroup;
//分组回调
interface IImmediateGroupSink
{
//比赛事件
public:
//开始比赛
virtual bool OnEventMatchStart(CImmediateGroup *pMatch)=NULL;
//比赛结束
virtual bool OnEventMatchOver(CImmediateGroup *pMatch)=NULL;
//定时器接口
public:
//删除定时器
virtual bool KillGameTimer(DWORD dwTimerID,CImmediateGroup *pMatch)=NULL;
//设置定时器
virtual bool SetGameTimer(DWORD dwTimerID, DWORD dwElapse, DWORD dwRepeat, WPARAM dwBindParameter,CImmediateGroup *pMatch)=NULL;
//发送函数
public:
//发送数据
virtual bool SendMatchInfo(IServerUserItem * pIServerUserItem)=NULL;
//发送信息
virtual bool SendGroupUserMessage(LPCTSTR pStrMessage,CImmediateGroup *pMatch)=NULL;
//发送分数
virtual bool SendGroupUserScore(IServerUserItem * pIServerUserItem,CImmediateGroup *pMatch)=NULL;
//发送状态
virtual bool SendGroupUserStatus(IServerUserItem * pIServerUserItem,CImmediateGroup *pMatch)=NULL;
//发送消息
virtual bool SendGameMessage(IServerUserItem * pIServerUserItem, LPCTSTR lpszMessage, WORD wMessageType)=NULL;
//发送消息
virtual bool SendRoomMessage(IServerUserItem * pIServerUserItem, LPCTSTR lpszMessage, WORD wMessageType)=NULL;
//发送数据
virtual bool SendGroupData(WORD wMainCmdID, WORD wSubCmdID, void * pData, WORD wDataSize,CImmediateGroup *pMatch)=NULL;
//发送数据
virtual bool SendData(IServerUserItem * pIServerUserItem, WORD wMainCmdID, WORD wSubCmdID, VOID * pData, WORD wDataSize)=NULL;
//功能函数
public:
//插入空的桌子
virtual void InsertNullTable()=NULL;
//获取机器人
virtual IAndroidUserItem * GetFreeAndroidUserItem()=NULL;
//用户淘汰
virtual bool OnUserOut(IServerUserItem *pUserItem,LPCTSTR szReason,WORD wLen,WORD wRank,CImmediateGroup *pMatch)=NULL;
};
///////////////////////////////////////////////////////////////////////////////////////////////////////
//比赛分组
class CImmediateGroup: public IMatchEventSink
{
friend class CImmediateMatch;
//状态信息
protected:
DWORD m_dwCurBase; //当前基数
DWORD m_dwMatchNO; //比赛编号
enMatchStatus m_enMatchStatus; //比赛阶段
BYTE m_LoopTimer; //循环定时器
WORD m_wAndroidUserCount; //机器人个数
SYSTEMTIME m_MatchStartTime; //比赛开始
//指针变量
protected:
tagGameMatchOption * m_pMatchOption; //比赛规则
IImmediateGroupSink * m_pMatchSink; //管理回调
//存储变量
protected:
CUserItemMap m_OnMatchUserMap; //参赛用户
CMatchUserItemArray m_FreeUserArray; //空闲用户
CTableFrameMananerArray m_MatchTableArray; //预定比赛桌子
CUserMatchTimerArray m_MatchTimerArray; //比赛专用定时器
//静态变量
protected:
static WORD m_wChairCount; //椅子数目
//函数定义
public:
//构造函数
CImmediateGroup(DWORD dwMatchNO,tagGameMatchOption * pGameMatchOption,IImmediateGroupSink *pIImmediateGroupSink);
//析构函数
virtual ~CImmediateGroup();
//基础接口
public:
//释放对象
virtual VOID Release(){}
//接口查询
virtual VOID * QueryInterface(REFGUID Guid, DWORD dwQueryVer);
//功能函数
public:
//游戏开始
virtual bool OnEventGameStart(ITableFrame *pITableFrame, WORD wChairCount);
//游戏结束
virtual bool OnEventGameEnd(ITableFrame *pITableFrame,WORD wChairID, IServerUserItem * pIServerUserItem, BYTE cbReason);
//用户事件
public:
//用户坐下
virtual bool OnActionUserSitDown(WORD wTableID, WORD wChairID, IServerUserItem * pIServerUserItem, bool bLookonUser);
//用户起来
virtual bool OnActionUserStandUp(WORD wTableID, WORD wChairID, IServerUserItem * pIServerUserItem, bool bLookonUser);
//用户同意
virtual bool OnActionUserOnReady(WORD wTableID, WORD wChairID, IServerUserItem * pIServerUserItem, VOID * pData, WORD wDataSize);
//用户事件
public:
//用户报名
bool OnUserSignUpMatch(IServerUserItem *pUserItem);
//用户退赛
BOOL OnUserQuitMatch(IServerUserItem *pUserItem);
//辅助函数
protected:
//比赛结束
void MatchOver();
//效验比赛开始
void EfficacyStartMatch();
//检测参赛人数
bool CheckMatchUser();
//玩家排序
WORD SortMapUser(tagMatchScore score[]);
//所有玩家起立
void RearrangeUserSeat(bool bDismissGame=true);
//定时器消息
bool OnTimeMessage(DWORD dwTimerID, WPARAM dwBindParameter);
WORD GetUserRank(IServerUserItem *pUserItem, ITableFrame *pITableFrame=NULL);
//发送提示
VOID SendWaitTip(ITableFrame *pTableFrame, WORD wChairID=INVALID_CHAIR);
//加入比赛桌子
void AddMatchTable(tagTableFrameInfo* pTableFrameInfo){m_MatchTableArray.Add(pTableFrameInfo);}
//获取桌子专用接口
tagTableFrameInfo* GetTableInterface(ITableFrame* ITable);
//空闲桌子拉空闲用户
void TabelRequestUser(bool bPrecedeSit=true);
//发送一组信息
void SendGroupBox(LPCTSTR pStrMessage);
//设置所有用户离开
void AllUserExitTable(ITableFrame *pITableFrame);
//本桌继续游戏
void ContinueGame(ITableFrame *pITableFrame);
//获取优先坐下用户
WORD GetPrecedeSitUser(DWORD dwCurTime);
//实现该函数可保证Free组唯一
void InsertFreeGroup(IServerUserItem *pUserItem);
//发送比赛信息
void SendTableUserMatchInfo(ITableFrame *pITableFrame, WORD wChairID);
//定局排名游戏结束
void FirstRoundRuleInningsGameEnd(ITableFrame *pITableFrame);
//标记函数
protected:
//检测标记
bool CheckRoundTableFinish();
//检测标记
bool CheckSwitchTableFinish();
//设置标记
void SetRoundTableFinish(ITableFrame *pITableFrame);
//设置标记
void SetSwitchTableFinish(ITableFrame *pITableFrame);
//定时器函数
protected:
//捕获定时器
void CaptureMatchTimer();
//杀死定时器
void AllKillMatchTimer();
//杀死定时器
bool KillMatchTimer(INT_PTR dwIndexID);
//杀死定时器
bool KillMatchTimer(DWORD dwTimerID, WPARAM wParam);
//投递定时器
void PostMatchTimer(DWORD dwTimerID, int iElapse, WPARAM wParam=0, LPARAM lParam=0);
//杀死定时器
void KillMatchGameTimer(DWORD dwTimerID);
//设定定时器
void SetMatchGameTimer(DWORD dwTimerID, DWORD dwElapse, DWORD dwRepeat, WPARAM dwBindParameter);
};
#endif