273 lines
8.7 KiB
C++
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 |