Files
2026-02-13 14:34:15 +08:00

1375 lines
40 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include "StdAfx.h"
#include ".\matchservice.h"
#include "DataBasePacket.h"
//////////////////////////////////////////////////////////////////////////
//常量定义
#define IDI_MATCH_TIME_PULSE 200 //服务脉冲
#define IDI_MATCH_GAME_START 201 //比赛开始
#define IDI_MATCH_GAME_OVER 202 //比赛结束
#define IDI_DISTRIBUTE_TIMER 203 //定时分配
BEGIN_MESSAGE_MAP(CDlgAddMatchDate, CDialog)
END_MESSAGE_MAP()
BEGIN_MESSAGE_MAP(CDlgAddMatchInfo, CDialog)
END_MESSAGE_MAP()
//构造函数
CTimeRankingsMatch::CTimeRankingsMatch(WORD wMatchID):m_wMatchID(wMatchID)
{
m_dwMatchFee=100;
m_pIMainServiceFrame=NULL;
m_pIKernelDataBaseEngine=NULL;
ZeroMemory(&m_MatchInfo,sizeof(m_MatchInfo));
m_cbMatchStatus=MATCH_STATUS_NOT_STARTED;
m_cbCurMatch=0xFF;
ZeroMemory(m_szMatchName,sizeof(m_szMatchName));
m_pMatchRank=NULL;
m_wRankCount=0;
m_pParameterDlg=new CMatchParameterDlg(m_MatchInfo,m_uiMatchDate,m_cbMatchTime,m_szMatchName,m_dwMatchFee,m_lInitScore,m_wMatchGameCount,m_wMatchID);
}
//析构函数
CTimeRankingsMatch::~CTimeRankingsMatch(void)
{
m_DistributeManage.RemoveAll();
m_ServerUserItemMap.RemoveAll();
for(INT_PTR i=0; i<m_MatchInfo.GetCount();i++)
{
SafeDelete(m_MatchInfo.GetAt(i));
}
if(m_pParameterDlg!=NULL)
SafeDelete(m_pParameterDlg);
if(m_pMatchRank!=NULL)
SafeDeleteArray(m_pMatchRank);
m_MatchInfo.RemoveAll();
}
//启动事件
bool CTimeRankingsMatch::OnAttemperEngineStart(IUnknownEx * pIUnknownEx)
{
StartNextMatch();
m_pITimerEngine->SetTimer(IDI_MATCH_TIME_PULSE,1000,-1,0);
m_pITimerEngine->SetTimer(IDI_DISTRIBUTE_TIMER,15000,-1,0);
return true;
}
//停止事件
bool CTimeRankingsMatch::OnAttemperEngineConclude(IUnknownEx * pIUnknownEx)
{
m_DistributeManage.RemoveAll();
m_ServerUserItemMap.RemoveAll();
for(INT_PTR i=0; i<m_MatchInfo.GetCount();i++)
{
SafeDelete(m_MatchInfo.GetAt(i));
}
m_MatchInfo.RemoveAll();
m_dwMatchFee=0;
m_pIMainServiceFrame=NULL;
m_pIKernelDataBaseEngine=NULL;
ZeroMemory(&m_MatchInfo,sizeof(m_MatchInfo));
return true;
}
//接口查询
VOID * CTimeRankingsMatch::QueryInterface(REFGUID Guid, DWORD dwQueryVer)
{
QUERYINTERFACE(IMatchService,Guid,dwQueryVer);
QUERYINTERFACE(IMatchTableFrameNotify,Guid,dwQueryVer);
QUERYINTERFACE_IUNKNOWNEX(IMatchService,Guid,dwQueryVer);
return NULL;
}
//用户报名
bool CTimeRankingsMatch::OnUserJoinMatch(IServerUserItem * pIServerUserItem)
{
TCHAR szDescribe[128]=TEXT("");
if(m_cbMatchStatus==MATCH_STATUS_NOT_STARTED)
{
SYSTEMTIME stBegin = {};
m_TimeMatchStart.GetAsSystemTime(stBegin);
_sntprintf( szDescribe,CountArray(szDescribe),TEXT("%s 第 [ %ld ] 场比赛开始时间为 %s请耐心等候"),m_szMatchName,m_cbCurMatch+1,GetTimeString(stBegin));
m_pIMainServiceFrame->SendRoomMessage(pIServerUserItem,szDescribe,SMT_EJECT);
return true;
}
else if(m_cbMatchStatus==MATCH_STATUS_WAIT_FINISH || m_cbMatchStatus==MATCH_STATUS_FINISH)
{
if(m_cbCurMatch==m_cbMatchTime-1)
_sntprintf( szDescribe,CountArray(szDescribe),TEXT("抱歉,比赛已经全部结束,欢迎下次参加比赛!"));
else
{
FILETIME ftBegin = {};
SYSTEMTIME stBegin = {};
if(m_cbMatchStatus==MATCH_STATUS_WAIT_FINISH)
CopyMemory( &ftBegin,&m_uiMatchDate[(m_cbCurMatch+1)*2],sizeof(ftBegin));
else if(m_cbMatchStatus==MATCH_STATUS_FINISH)
CopyMemory( &ftBegin,&m_uiMatchDate[(m_cbCurMatch)*2],sizeof(ftBegin));
CTime tStart(ftBegin);
tStart.GetAsSystemTime(stBegin);
_sntprintf( szDescribe,CountArray(szDescribe),TEXT("本场比赛即将结束,下场比赛开始时间为%s, 请耐心等待!"),GetTimeString(stBegin));
}
m_pIMainServiceFrame->SendRoomMessage(pIServerUserItem,szDescribe,SMT_CHAT);
return true;
}
if(m_wMatchGameCount>0)
{
tagUserInfo * pUserInfo=pIServerUserItem->GetUserInfo();
if(pUserInfo->dwWinCount+pUserInfo->dwLostCount+pUserInfo->dwDrawCount+pUserInfo->dwFleeCount>=m_wMatchGameCount)
{
TCHAR szMess[128]=TEXT("\0");
_sntprintf(szMess, CountArray(szMess), TEXT("恭喜您已经完成比赛规定局数%d局等待其他玩家继续游戏后将公布比赛成绩敬请关注"),m_wMatchGameCount);
m_pIMainServiceFrame->SendRoomMessage(pIServerUserItem, szMess,SMT_EJECT);
return true;
}
}
if(!CUserRight::IsGameMatchUser(pIServerUserItem->GetUserRight()) && m_dwMatchFee>0)
{
ASSERT(m_pIMainServiceFrame!=NULL);
if(m_pIMainServiceFrame==NULL) return false;
m_pIMainServiceFrame->SendData(pIServerUserItem,MDM_GR_MATCH,SUB_GR_MATCH_FEE,&m_dwMatchFee, sizeof(DWORD));
return false;
}
else
{
if(pIServerUserItem->GetTableID()==INVALID_TABLE)
m_pIMainServiceFrame->SendRoomMessage(pIServerUserItem,TEXT("恭喜,报名成功,请等待系统为您安排座位!"),SMT_EJECT);
InsertDistribute(pIServerUserItem);
}
return true;
}
//用户退赛
bool CTimeRankingsMatch::OnUserQuitMatch(IServerUserItem * pIServerUserItem)
{
//参数效验
ASSERT(pIServerUserItem!=NULL);
if(pIServerUserItem==NULL) return false;
if(pIServerUserItem->GetUserStatus()>=US_PLAYING) return true;
m_DistributeManage.RemoveDistributeNode(pIServerUserItem);
m_ServerUserItemMap.RemoveKey(pIServerUserItem->GetUserID());
CMD_GR_Match_Num MatchNum;
MatchNum.dwWaitting=m_DistributeManage.GetCount();
MatchNum.dwTotal=(DWORD)m_ServerUserItemMap.GetCount();
m_pIMainServiceFrame->SendData(BG_COMPUTER,MDM_GR_MATCH,SUB_GR_MATCH_NUM,&MatchNum, sizeof(MatchNum));
return true;
}
//用户准备
bool CTimeRankingsMatch::OnUserReay(IServerUserItem * pIServerUserItem,WORD wTableID,WORD wChairID)
{
if(m_cbMatchStatus!=MATCH_STATUS_MATCHING)
{
m_pIMainServiceFrame->SendGameMessage(pIServerUserItem,TEXT("抱歉,比赛即将结束,请耐心等待下场比赛!"),SMT_EJECT|SMT_CLOSE_GAME);
}
return true;
}
//设置接口
bool CTimeRankingsMatch::InitMatchService(IMainServiceFrame *pIMainServiceFrame, IDataBaseEngine *pIKernelDataBaseEngine,ITimerEngine *pITimerEngine,
tagGameServiceAttrib *pGameServiceAttrib,tagGameServiceOption *pGameServiceOption,CTableFrameArray &TableFrameArray)
{
//参数效验
ASSERT(pIMainServiceFrame!=NULL && pIKernelDataBaseEngine!=NULL && pGameServiceOption!=NULL && pGameServiceAttrib!=NULL && pITimerEngine!=NULL);
if(pIMainServiceFrame==NULL || pIKernelDataBaseEngine==NULL || pGameServiceOption==NULL || pGameServiceAttrib==NULL || pITimerEngine==NULL) return false;
m_pIMainServiceFrame=pIMainServiceFrame;
m_pIKernelDataBaseEngine=pIKernelDataBaseEngine;
m_pGameServiceOption=pGameServiceOption;
m_pGameServiceAttrib=pGameServiceAttrib;
m_TableFrameArray.Append(TableFrameArray);
for(INT_PTR i=0; i<m_TableFrameArray.GetCount(); i++)
m_TableFrameArray.GetAt(i)->SetMatchInterface((IUnknownEx*)QueryInterface(IID_IMatchTableFrameNotify,VER_IMatchTableFrameNotify));
m_pITimerEngine=pITimerEngine;
return true;
}
//命令消息
bool CTimeRankingsMatch::OnEventSocketMatch(WORD wSubCmdID, VOID * pData, WORD wDataSize, IServerUserItem * pIServerUserItem, DWORD dwSocketID)
{
switch (wSubCmdID)
{
case SUB_GR_MATCH_FEE: //比赛费用
{
//参数效验
ASSERT(wDataSize==sizeof(DWORD));
if(wDataSize!=sizeof(DWORD)) return false;
DWORD dwMatchFee=*(DWORD*)pData;
if(dwMatchFee!=m_dwMatchFee)return false;
DBR_GR_MatchFee MatchFee;
MatchFee.dwUserID=pIServerUserItem->GetUserID();
MatchFee.dwMatchFee=m_dwMatchFee;
MatchFee.dwInoutIndex=pIServerUserItem->GetInoutIndex();
MatchFee.dwClientAddr=pIServerUserItem->GetClientAddr();
lstrcpyn(MatchFee.szMachineID,pIServerUserItem->GetMachineID(),CountArray(MatchFee.szMachineID));
//投递数据
m_pIKernelDataBaseEngine->PostDataBaseRequest(DBR_GR_MATCH_FEE,dwSocketID,&MatchFee,sizeof(MatchFee));
return true;
}
case SUB_GR_LEAVE_MATCH: //退出比赛
{
//参数效验
ASSERT(pIServerUserItem!=NULL);
if(pIServerUserItem==NULL) return false;
if(pIServerUserItem->GetUserStatus()>=US_PLAYING) return true;
m_DistributeManage.RemoveDistributeNode(pIServerUserItem);
m_ServerUserItemMap.RemoveKey(pIServerUserItem->GetUserID());
CMD_GR_Match_Num MatchNum;
MatchNum.dwWaitting=m_DistributeManage.GetCount();
MatchNum.dwTotal=(DWORD)m_ServerUserItemMap.GetCount();
m_pIMainServiceFrame->SendData(BG_COMPUTER,MDM_GR_MATCH,SUB_GR_MATCH_NUM,&MatchNum, sizeof(MatchNum));
return true;
}
}
return true;
}
//插入分配
bool CTimeRankingsMatch::InsertDistribute(IServerUserItem * pIServerUserItem)
{
//效验参数
ASSERT(pIServerUserItem!=NULL);
if (pIServerUserItem==NULL) return false;
//状态判断
ASSERT(pIServerUserItem->GetUserStatus()<US_PLAYING);
if (pIServerUserItem->GetUserStatus()>=US_PLAYING) return false;
//变量定义
tagDistributeInfo DistributeInfo;
ZeroMemory(&DistributeInfo,sizeof(DistributeInfo));
//设置变量
DistributeInfo.pIServerUserItem=pIServerUserItem;
DistributeInfo.wLastTableID=pIServerUserItem->GetTableID();
DistributeInfo.dwClientAddr=pIServerUserItem->GetClientAddr();
DistributeInfo.pPertainNode=NULL;
//加入数组
m_DistributeManage.InsertDistributeNode(DistributeInfo);
m_ServerUserItemMap[pIServerUserItem->GetUserID()]=pIServerUserItem;
//用户起立
if (pIServerUserItem->GetTableID()!=INVALID_TABLE)
{
WORD wTableID=pIServerUserItem->GetTableID();
//m_TableFrameArray[wTableID]->PerformStandUpAction(pIServerUserItem);
}
//分配判断
// bool bDistribute=false;
// if (m_pGameServiceOption->cbDistributeRule&DISTRIBUTE_IMMEDIATE) bDistribute=true;
// if ((m_pGameServiceOption->wMaxDistributeUser!=0)&&(m_DistributeManage.GetCount()>=m_pGameServiceOption->wMaxDistributeUser)) bDistribute=true;
//
// //执行分组
// if (bDistribute==true)
// {
// PerformDistribute();
// }
CMD_GR_Match_Num MatchNum;
MatchNum.dwWaitting=m_DistributeManage.GetCount();
MatchNum.dwTotal=(DWORD)m_ServerUserItemMap.GetCount();
m_pIMainServiceFrame->SendData(BG_COMPUTER,MDM_GR_MATCH,SUB_GR_MATCH_NUM,&MatchNum, sizeof(MatchNum));
return true;
}
//分配用户
bool CTimeRankingsMatch::PerformDistribute()
{
//人数校验
// if(m_DistributeManage.GetCount()<m_pGameServiceOption->wMinDistributeUser) return false;
//分配用户
while(true)
{
//人数校验
//ASSERT(m_DistributeManage.GetCount()>=m_pGameServiceOption->wMinGameUser);
//if(m_DistributeManage.GetCount()<m_pGameServiceOption->wMinGameUser) return false;
if(m_DistributeManage.GetRealCount()==0) return false;
//变量定义
CDistributeInfoArray DistributeInfoArray;
//获取用户
//WORD wRandCount = __max(m_pGameServiceOption->wMaxGameUser-m_pGameServiceOption->wMinGameUser+1,1);
//WORD wChairCount = m_pGameServiceOption->wMinGameUser+rand()%wRandCount;
WORD wDistributeCount = m_DistributeManage.PerformDistribute(DistributeInfoArray,m_pGameServiceAttrib->wChairCount);
if(wDistributeCount < m_pGameServiceAttrib->wChairCount) break;
//寻找位置
CTableFrame * pCurrTableFrame=NULL;
for (WORD i=0;i<m_TableFrameArray.GetCount();i++)
{
//获取对象
ASSERT(m_TableFrameArray[i]!=NULL);
CTableFrame * pTableFrame=m_TableFrameArray[i];
//状态判断
if (pTableFrame->GetSitUserCount()==0)
{
pCurrTableFrame=pTableFrame;
break;
}
}
//桌子判断
if(pCurrTableFrame==NULL) break;
//玩家坐下
bool bSitSuccess=true;
INT_PTR nSitFailedIndex=INVALID_CHAIR;
for(INT_PTR nIndex=0;nIndex<DistributeInfoArray.GetCount();nIndex++)
{
//变量定义
WORD wChairID=pCurrTableFrame->GetNullChairID();
//分配用户
if (wChairID!=INVALID_CHAIR)
{
//获取用户
IServerUserItem * pIServerUserItem=DistributeInfoArray[nIndex].pIServerUserItem;
//用户起立
if(pIServerUserItem->GetTableID()!=INVALID_TABLE)
{
WORD wTableID=pIServerUserItem->GetTableID();
m_TableFrameArray[wTableID]->PerformStandUpAction(pIServerUserItem);
}
//用户坐下
if(pCurrTableFrame->PerformSitDownAction(wChairID,pIServerUserItem)==false)
{
bSitSuccess=false;
nSitFailedIndex=nIndex;
break;
}
}
}
//坐下处理
if(bSitSuccess)
{
//移除结点
while(DistributeInfoArray.GetCount()>0)
{
m_DistributeManage.RemoveDistributeNode((tagDistributeNode *)DistributeInfoArray[0].pPertainNode);
DistributeInfoArray.RemoveAt(0);
}
}
else
{
for(INT_PTR nIndex=0;nIndex<DistributeInfoArray.GetCount();nIndex++)
{
if(nSitFailedIndex==nIndex)
m_DistributeManage.RemoveDistributeNode((tagDistributeNode *)DistributeInfoArray[nIndex].pPertainNode);
else
{
//用户起立
if (DistributeInfoArray[nIndex].pIServerUserItem->GetTableID()!=INVALID_TABLE)
{
WORD wTableID=DistributeInfoArray[nIndex].pIServerUserItem->GetTableID();
m_TableFrameArray[wTableID]->PerformStandUpAction(DistributeInfoArray[nIndex].pIServerUserItem);
}
}
}
}
}
for(WORD i=0; i<m_pGameServiceOption->wTableCount; i++)
{
//获取对象
CTableFrame * pTableFrame=m_TableFrameArray[i];
if(pTableFrame==NULL)continue;
//状态判断
WORD wSitUserCount=pTableFrame->GetSitUserCount();
if(pTableFrame->IsGameStarted() || wSitUserCount==m_pGameServiceAttrib->wChairCount || wSitUserCount==0) continue;
if(m_pGameServiceAttrib->wChairCount-wSitUserCount>m_pGameServiceAttrib->wChairCount/2)
{
// for(WORD j=0; j)
}
}
return true;
}
//赛事信息
bool CTimeRankingsMatch::SendMatchInfo(IServerUserItem * pIServerUserItem)
{
CMD_GR_Match_Num MatchNum;
MatchNum.dwWaitting=m_DistributeManage.GetCount();
MatchNum.dwTotal=(DWORD)m_ServerUserItemMap.GetCount();
m_pIMainServiceFrame->SendData(pIServerUserItem,MDM_GR_MATCH,SUB_GR_MATCH_NUM,&MatchNum, sizeof(MatchNum));
if(m_MatchInfo.GetCount()>0)
{
CMD_GR_Match_Info *pMatchInfo=new CMD_GR_Match_Info[m_MatchInfo.GetCount()];
for(INT_PTR i=0; i<m_MatchInfo.GetCount();i++)
{
CopyMemory(&pMatchInfo[i],m_MatchInfo.GetAt(i),sizeof(CMD_GR_Match_Info));
}
m_pIMainServiceFrame->SendData(pIServerUserItem,MDM_GR_MATCH,SUB_GR_MATCH_INFO,pMatchInfo,(WORD)(sizeof(CMD_GR_Match_Info)*m_MatchInfo.GetCount()));
delete [] pMatchInfo;
}
return true;
}
//数据库事件
bool CTimeRankingsMatch::OnEventDataBase(WORD wRequestID, IServerUserItem * pIServerUserItem, VOID * pData, WORD wDataSize)
{
switch (wRequestID)
{
case DBO_GR_MATCH_FEE_RESULT: //报名结果
{
//参数效验
if(pIServerUserItem==NULL) return true;
if(wDataSize!=sizeof(LONG)) return false;
//变量定义
LONG lReturnValue=*(LONG*)pData;
if(lReturnValue==0)
{
pIServerUserItem->ModifyUserRight(UR_GAME_MATCH_USER,0);
InsertDistribute(pIServerUserItem);
m_pIMainServiceFrame->SendRoomMessage(pIServerUserItem,TEXT("恭喜,报名成功,请等待系统为您安排座位!"),SMT_EJECT);
}
else if(lReturnValue==1)
{
TCHAR szDescribe[128]=TEXT("");
_sntprintf(szDescribe,CountArray(szDescribe),TEXT("您游戏币不够,不能加入比赛!"));
m_pIMainServiceFrame->SendRoomMessage(pIServerUserItem,szDescribe,SMT_EJECT);
}
break;
}
case DBO_GR_MATCH_RANK: //比赛名次
{
//参数效验
ASSERT(wDataSize%sizeof(DBO_GR_MatchRank)==0);
if(wDataSize%sizeof(DBO_GR_MatchRank)!=0) return false;
DBO_GR_MatchRank *pMatchRank=(DBO_GR_MatchRank *)pData;
m_wRankCount=wDataSize/sizeof(DBO_GR_MatchRank);
m_pMatchRank=new CMD_GR_MatchRank[m_wRankCount];
for(WORD i=0; i<m_wRankCount; i++)
{
m_pMatchRank[i].cbRank=pMatchRank[i].cbRank;
m_pMatchRank[i].lMatchScore=pMatchRank[i].lMatchScore;
lstrcpyn(m_pMatchRank[i].szNickName, pMatchRank[i].szNickName, LEN_NICKNAME);
}
m_pIMainServiceFrame->SendData(BG_COMPUTER, MDM_GR_MATCH, SUB_GR_MATCH_RANK, m_pMatchRank,sizeof(CMD_GR_MatchRank)*m_wRankCount);
}
break;
}
return true;
}
//设置参数
bool CTimeRankingsMatch::ModifyMatchParameter()
{
m_pParameterDlg->DoModal();
return true;
}
//时间事件
bool CTimeRankingsMatch::OnEventTimer(DWORD dwTimerID, WPARAM dwBindParameter)
{
if(dwTimerID==IDI_MATCH_TIME_PULSE)
{
if(m_cbCurMatch==0xFF || m_cbMatchStatus== MATCH_STATUS_FINISH) return true;
CTime CurTime=CTime::GetCurrentTime();
if(m_cbMatchStatus==MATCH_STATUS_NOT_STARTED)
{
if((m_TimeMatchStart==CurTime))
{
m_cbMatchStatus=MATCH_STATUS_MATCHING;
CString strMsg;
strMsg.Format(TEXT("%s 比赛第[ %d ]场开始了!"),m_szMatchName,m_cbCurMatch+1);
m_pIMainServiceFrame->SendRoomMessage(strMsg,SMT_CHAT);
CTraceService::TraceString(strMsg,TraceLevel_Normal);
//通知调试
if(m_pIMainServiceFrame!=NULL) m_pIMainServiceFrame->OnEventMatchStart(m_lInitScore);
//构造数据
DBR_GR_MatchStart MatchStart;
MatchStart.wMatchID=m_wMatchID;
MatchStart.wMatchNo=(WORD)m_cbCurMatch;
MatchStart.wMatchCount=(WORD)m_cbMatchTime;
MatchStart.lInitScore=m_lInitScore;
m_pIKernelDataBaseEngine->PostDataBaseRequest(DBR_GR_MATCH_START,0,&MatchStart,sizeof(MatchStart));
}
}
else if(m_cbMatchStatus==MATCH_STATUS_MATCHING)
{
CTimeSpan span=m_TimeMatchOver-CurTime;
if(span.GetTotalMinutes()<=5)
{
TCHAR szMess[128] = {};
_sntprintf(szMess,CountArray(szMess),TEXT("各位玩家注意,第 [ %ld ] 场比赛5分钟内即将结束请大家加紧时间"),m_cbCurMatch+1);
m_pIMainServiceFrame->SendGameMessage(szMess,SMT_CHAT);
m_pIMainServiceFrame->SendRoomMessage(szMess,SMT_CHAT);
m_cbMatchStatus=MATCH_STATUS_WAIT_FINISH;
CTraceService::TraceString(szMess,TraceLevel_Normal);
}
}
else if(m_cbMatchStatus==MATCH_STATUS_WAIT_FINISH)
{
CTimeSpan span=m_TimeMatchOver-CurTime;
if(span.GetTotalSeconds()<=30)
{
for(INT_PTR i=0; i<m_TableFrameArray.GetCount(); i++)
{
if(m_TableFrameArray.GetAt(i)->IsGameStarted())
m_TableFrameArray.GetAt(i)->DismissGame();
}
}
for(INT_PTR i=0; i<m_TableFrameArray.GetCount(); i++)
{
if(m_TableFrameArray.GetAt(i)->IsGameStarted())
return true;
}
m_DistributeManage.RemoveAll();
POSITION pos=m_ServerUserItemMap.GetStartPosition();
DWORD dwUserID;
IServerUserItem *pIServerUserItem=NULL;
while(pos!=NULL)
{
m_ServerUserItemMap.GetNextAssoc(pos,dwUserID, pIServerUserItem);
if(pIServerUserItem!=NULL)
m_pIMainServiceFrame->SendRoomMessage(pIServerUserItem,TEXT(""),SMT_CLOSE_GAME);
}
m_ServerUserItemMap.RemoveAll();
if(abs((int)span.GetTotalSeconds())<=1)
{
TCHAR szMess[128] = {};
_sntprintf(szMess,CountArray(szMess),TEXT("第 [ %ld ] 场比赛结束"),m_cbCurMatch+1);
CTraceService::TraceString(szMess,TraceLevel_Normal);
m_cbMatchStatus=MATCH_STATUS_FINISH;
DBR_GR_MatchOver MatchOver;
MatchOver.wMatchID=m_wMatchID;
MatchOver.wMatchNo=(WORD)m_cbCurMatch;
MatchOver.wMatchCount=(WORD)m_cbMatchTime;
m_pIKernelDataBaseEngine->PostDataBaseRequest(DBR_GR_MATCH_OVER,0,&MatchOver,sizeof(MatchOver));
if(m_cbCurMatch<m_cbMatchTime-1)
StartNextMatch();
}
}
}
else if(dwTimerID==IDI_DISTRIBUTE_TIMER)
{
PerformDistribute();
}
return true;
}
//开始下一场比赛
VOID CTimeRankingsMatch::StartNextMatch()
{
//计算比赛时间
CTime CurTime = CTime::GetCurrentTime();
BYTE i=0;
for(i=0; i<m_cbMatchTime; i++)
{
FILETIME ftBegin = {};
FILETIME ftEnd = {};
CopyMemory( &ftBegin,&m_uiMatchDate[i*2],sizeof(ftBegin) );
CopyMemory( &ftEnd,&m_uiMatchDate[i*2+1],sizeof(ftEnd) );
CTime TimeBegin(ftBegin);
CTime TimeEnd(ftEnd);
if(CurTime< TimeBegin)
{
m_TimeMatchStart = TimeBegin;
m_TimeMatchOver = TimeEnd;
m_cbCurMatch=i;
m_cbMatchStatus=MATCH_STATUS_NOT_STARTED;
break;
}
if( TimeBegin <= CurTime && TimeEnd > CurTime)
{
m_TimeMatchStart = TimeBegin;
m_TimeMatchOver = TimeEnd;
m_cbCurMatch=i;
m_cbMatchStatus=MATCH_STATUS_MATCHING;
CTimeSpan span;
span=TimeEnd-CurTime;
if(span.GetTotalMinutes()<=5)
m_cbMatchStatus=MATCH_STATUS_WAIT_FINISH;
break;
}
}
//设置变量
if(i==m_cbMatchTime)
{
m_cbMatchStatus=MATCH_STATUS_FINISH;
m_cbCurMatch=m_cbMatchTime-1;
}
if( m_cbMatchStatus==MATCH_STATUS_NOT_STARTED || m_cbMatchStatus==MATCH_STATUS_MATCHING)
{
//提示消息
TCHAR szMess[256] = TEXT("");
TCHAR szStart[32] = TEXT("");
TCHAR szOver[32] = TEXT("");
SYSTEMTIME stBegin = {};
m_TimeMatchStart.GetAsSystemTime(stBegin);
SYSTEMTIME stEnd = {};
m_TimeMatchOver.GetAsSystemTime(stEnd);
lstrcpyn( szStart,GetTimeString(stBegin),CountArray(szStart) );
lstrcpyn( szOver,GetTimeString(stEnd),CountArray(szOver) );
_sntprintf( szMess,CountArray(szMess),TEXT("%s 第 [ %ld ] 场比赛将于 %s 到 %s 进行。"),m_szMatchName,m_cbCurMatch+1,szStart,szOver );
m_pIMainServiceFrame->SendRoomMessage(szMess,SMT_CHAT);
CTraceService::TraceString(szMess,TraceLevel_Normal);
}
else if(m_cbMatchStatus==MATCH_STATUS_FINISH)
{
//提示消息
CTraceService::TraceString(TEXT("比赛全部结束。"),TraceLevel_Normal);
}
return;
}
//游戏结束
bool CTimeRankingsMatch::OnEventGameEnd(WORD wTableID)
{
if(m_wMatchGameCount>0)
{
//参数效验
if(wTableID>=m_TableFrameArray.GetCount()) return false;
//变量定义
CTableFrame * pTableFrame=m_TableFrameArray[wTableID];
if(pTableFrame==NULL) return false;
for(WORD i=0; i<m_pGameServiceAttrib->wChairCount; i++)
{
IServerUserItem *pIServerUserItem=pTableFrame->GetTableUserItem(i);
if(pIServerUserItem==NULL) continue;
//变量定义
tagUserInfo * pUserInfo=pIServerUserItem->GetUserInfo();
DWORD dwGameCount=pUserInfo->dwWinCount+pUserInfo->dwLostCount+pUserInfo->dwDrawCount+pUserInfo->dwFleeCount;
if(dwGameCount>=m_wMatchGameCount)
{
TCHAR szMess[128]=TEXT("\0");
_sntprintf(szMess, CountArray(szMess), TEXT("恭喜您已经完成比较规定局数%d局等待其他玩家继续游戏后将公布比赛成绩敬请关注"),m_wMatchGameCount);
m_pIMainServiceFrame->SendGameMessage(pIServerUserItem, szMess,SMT_EJECT|SMT_CLOSE_GAME);
}
else
{
TCHAR szMess[128] = TEXT("");
_sntprintf( szMess,CountArray(szMess),TEXT("您已经完成%d局共%d局。"),dwGameCount,m_wMatchGameCount);
m_pIMainServiceFrame->SendGameMessage(pIServerUserItem,szMess,SMT_CHAT);
}
}
}
if(m_cbMatchStatus!=MATCH_STATUS_WAIT_FINISH) return true;
for(INT_PTR i=0; i<m_TableFrameArray.GetCount(); i++)
{
if(m_TableFrameArray.GetAt(i)->IsGameStarted())
return true;
}
return true;
}
//获取时间字符串
LPCTSTR CTimeRankingsMatch::GetTimeString( SYSTEMTIME &st )
{
//变量定义
static TCHAR szTime[32] = TEXT("");
_sntprintf(szTime,CountArray(szTime),TEXT("%4d年%02d月%02d日 %02d时%02d分%02d秒"),st.wYear,st.wMonth,st.wDay,st.wHour,st.wMinute,st.wSecond);
return szTime;
}
//////////////////////////////////////////////////////////////////////////////////
BEGIN_MESSAGE_MAP(CMatchParameterDlg, CDialog)
ON_BN_CLICKED(IDC_BT_ADD, OnBnClickedAdd)
ON_BN_CLICKED(IDC_BT_MODIFY, OnBnClickedModify)
ON_BN_CLICKED(IDC_BT_DELETE, OnBnClickedDelete)
ON_BN_CLICKED(IDC_BT_ADD_INFO, OnBnClickedAddInfo)
ON_BN_CLICKED(IDC_BT_MODIFY_INFO, OnBnClickedModifyInfo)
ON_BN_CLICKED(IDC_BT_DELETE_INFO, OnBnClickedDeleteInfo)
END_MESSAGE_MAP()
CMatchParameterDlg::CMatchParameterDlg(CMatchInfoArray &MatchInfo,ULARGE_INTEGER *puiMatchDate,BYTE &cbMatchTime, TCHAR *pszMatchRoom,DWORD &dwMatchFee,\
LONG &lInitScore, WORD &wMatchGameCount,WORD wMatchID):
CDialog(IDD),m_MatchInfo(MatchInfo),m_puiMatchDate(puiMatchDate),m_cbMatchTime(cbMatchTime),m_pszMatchRoom(pszMatchRoom),m_dwMatchFee(dwMatchFee),
m_lInitScore(lInitScore),m_wMatchGameCount(wMatchGameCount), m_wMatchID(wMatchID)
{
//设置变量
m_cbMatchTime = 0;
ZeroMemory( m_puiMatchDate,sizeof(m_puiMatchDate) );
//获取目录
TCHAR szPath[MAX_PATH]=TEXT("");
GetCurrentDirectory(sizeof(szPath),szPath);
//读取配置
TCHAR szFileName[MAX_PATH]=TEXT("");
_sntprintf(szFileName,sizeof(szFileName),TEXT("%s\\MatchOption.ini"),szPath);
//信息条数
CString strTemp,strAppName,strValue;
strAppName.Format(TEXT("%dTimeRankings"),m_wMatchID);
UINT uItemCount=GetPrivateProfileInt(strAppName,TEXT("InfoItemCount"),0,szFileName);
//读取场次
m_cbMatchTime=(BYTE)GetPrivateProfileInt(strAppName,TEXT("MatchCount"),0,szFileName);
ASSERT(m_cbMatchTime<MAX_MATCH_COUNT);
if(m_cbMatchTime>=MAX_MATCH_COUNT)return ;
//读取费用
m_dwMatchFee=(UINT)GetPrivateProfileInt(strAppName,TEXT("MatchFee"),0,szFileName);
//读取名称
GetPrivateProfileString(strAppName,TEXT("MatchRoom"),TEXT(""), m_pszMatchRoom,32,szFileName);
//初始积分
m_lInitScore=(LONG)GetPrivateProfileInt(strAppName,TEXT("InitScore"),0,szFileName);
//比赛局数
m_wMatchGameCount=(WORD)GetPrivateProfileInt(strAppName,TEXT("MatchGameCount"),0,szFileName);
//读取信息
for(UINT i=0; i<uItemCount; i++)
{
CMD_GR_Match_Info *pMatchInfo=new CMD_GR_Match_Info;
strAppName.Format(TEXT("%dItem%d"),m_wMatchID,i);
GetPrivateProfileString(strAppName,TEXT("InfoTitle"),TEXT(""),pMatchInfo->szTitle,CountArray(pMatchInfo->szTitle),szFileName);
GetPrivateProfileString(strAppName,TEXT("InfoDescribe"),TEXT(""),pMatchInfo->szDescribe,CountArray(pMatchInfo->szDescribe),szFileName);
strValue.Format(TEXT("%d"),pMatchInfo->wTitleLen);
pMatchInfo->wTitleLen=(WORD)GetPrivateProfileInt(strAppName,TEXT("InfoTitleLen"),0,szFileName);
pMatchInfo->wDescribeLen=(WORD)GetPrivateProfileInt(strAppName,TEXT("InfoDescribeLen"),0,szFileName);
m_MatchInfo.Add(pMatchInfo);
}
//场次信息
TCHAR szValue[32]=TEXT("");
for(BYTE i=0; i<m_cbMatchTime; i++)
{
strAppName.Format(TEXT("%dMatchDate%d"),m_wMatchID,i);
GetPrivateProfileString(strAppName,TEXT("TimeStart"),TEXT(""),szValue,15,szFileName);
//提取时间
SYSTEMTIME stTime;
CString strValue(szValue);
stTime.wYear=_ttoi(strValue.Left(4));
stTime.wMonth=_ttoi(strValue.Mid(4,2));
stTime.wDay=_ttoi(strValue.Mid(6,2));
stTime.wHour=_ttoi(strValue.Mid(8,2));
stTime.wMinute=_ttoi(strValue.Mid(10,2));
stTime.wSecond=_ttoi(strValue.Mid(12,2));
SYSTEMTIME st = {};
CTime TimeBegin(stTime);
TimeBegin.GetAsSystemTime(st);
FILETIME ft = {}, ftUTC = {};
::SystemTimeToFileTime(&st,&ft);
::LocalFileTimeToFileTime(&ft,&ftUTC);
CopyMemory( &m_puiMatchDate[i*2],&ftUTC,sizeof(ftUTC) );
GetPrivateProfileString(strAppName,TEXT("TimeEnd"),TEXT(""),szValue,15,szFileName);
//提取时间
strValue=CString(szValue);
stTime.wYear=_ttoi(strValue.Left(4));
stTime.wMonth=_ttoi(strValue.Mid(4,2));
stTime.wDay=_ttoi(strValue.Mid(6,2));
stTime.wHour=_ttoi(strValue.Mid(8,2));
stTime.wMinute=_ttoi(strValue.Mid(10,2));
stTime.wSecond=_ttoi(strValue.Mid(12,2));
CTime TimeEnd(stTime);
TimeEnd.GetAsSystemTime(st);
::SystemTimeToFileTime(&st,&ft);
::LocalFileTimeToFileTime(&ft,&ftUTC);
CopyMemory( &m_puiMatchDate[i*2+1],&ftUTC,sizeof(ftUTC) );
}
}
CMatchParameterDlg::~CMatchParameterDlg()
{
}
//添加时间
VOID CMatchParameterDlg::OnBnClickedAdd()
{
if( m_cbMatchTime == MAX_MATCH_COUNT )
{
AfxMessageBox( TEXT("比赛场次达到最高上限了,不能再添加"),MB_ICONINFORMATION );
return;
}
CDlgAddMatchDate Dlg;
if( IDOK == Dlg.DoModal() )
{
//添加开始时间
SYSTEMTIME st = {};
Dlg.m_TimeBegin.GetAsSystemTime(st);
FILETIME ft = {}, ftUTC = {};
::SystemTimeToFileTime(&st,&ft);
::LocalFileTimeToFileTime(&ft,&ftUTC);
CopyMemory( &m_puiMatchDate[m_cbMatchTime*2],&ftUTC,sizeof(ftUTC) );
//添加结束时间
Dlg.m_TimeEnd.GetAsSystemTime(st);
::SystemTimeToFileTime(&st,&ft);
::LocalFileTimeToFileTime(&ft,&ftUTC);
CopyMemory( &m_puiMatchDate[m_cbMatchTime*2+1],&ftUTC,sizeof(ftUTC) );
m_cbMatchTime++;
UpdateMatchList();
}
return;
}
//修改时间
VOID CMatchParameterDlg::OnBnClickedModify()
{
POSITION pos = m_ListMatch.GetFirstSelectedItemPosition();
if( pos == NULL )
{
AfxMessageBox( TEXT("请选择要修改的场次"),MB_ICONINFORMATION );
return;
}
//获取选中项
int nItem = m_ListMatch.GetNextSelectedItem(pos);
//获取索引
DWORD_PTR dwMatchIndex = m_ListMatch.GetItemData(nItem);
//提取时间
FILETIME ftBegin = {};
CopyMemory( &ftBegin,&m_puiMatchDate[dwMatchIndex*2],sizeof(ftBegin) );
FILETIME ftEnd = {};
CopyMemory( &ftEnd,&m_puiMatchDate[dwMatchIndex*2+1],sizeof(ftEnd) );
CTime TimeBegin(ftBegin);
CTime TimeEnd(ftEnd);
//构造对话框
CDlgAddMatchDate Dlg;
Dlg.m_TimeBegin = TimeBegin;
Dlg.m_TimeEnd = TimeEnd;
//显示对话框
if( IDOK == Dlg.DoModal() )
{
if( Dlg.m_TimeBegin != TimeBegin || Dlg.m_TimeEnd != TimeEnd )
{
//添加开始时间
SYSTEMTIME st = {};
Dlg.m_TimeBegin.GetAsSystemTime(st);
FILETIME ft = {},ftUTC = {};
::SystemTimeToFileTime(&st,&ft);
::LocalFileTimeToFileTime(&ft,&ftUTC);
CopyMemory( &m_puiMatchDate[dwMatchIndex*2],&ftUTC,sizeof(ftUTC) );
//添加结束时间
Dlg.m_TimeEnd.GetAsSystemTime(st);
::SystemTimeToFileTime(&st,&ft);
::LocalFileTimeToFileTime(&ft,&ftUTC);
CopyMemory( &m_puiMatchDate[dwMatchIndex*2+1],&ftUTC,sizeof(ftUTC) );
UpdateMatchList();
}
}
return;
}
//删除时间
VOID CMatchParameterDlg::OnBnClickedDelete()
{
POSITION pos = m_ListMatch.GetFirstSelectedItemPosition();
if( pos == NULL )
{
AfxMessageBox( TEXT("请选择要删除的场次"),MB_ICONINFORMATION );
return;
}
//遍历选中项
while( pos )
{
int nItem = m_ListMatch.GetNextSelectedItem(pos);
DWORD_PTR dwMatchIndex = m_ListMatch.GetItemData(nItem);
m_puiMatchDate[dwMatchIndex*2].QuadPart = 0L;
m_puiMatchDate[dwMatchIndex*2+1].QuadPart = 0L;
}
//删除
BYTE cbMatchTime = m_cbMatchTime;
m_cbMatchTime = 0;
for( BYTE i = 0; i < cbMatchTime; i++ )
{
if( m_puiMatchDate[i*2].QuadPart != 0L )
{
m_puiMatchDate[m_cbMatchTime*2].QuadPart = m_puiMatchDate[i*2].QuadPart;
m_puiMatchDate[m_cbMatchTime*2+1].QuadPart = m_puiMatchDate[i*2+1].QuadPart;
m_cbMatchTime++;
}
}
//更新列表
UpdateMatchList();
return;
}
//添加时间
VOID CMatchParameterDlg::OnBnClickedAddInfo()
{
if( m_cbMatchTime == MAX_MATCH_COUNT )
{
AfxMessageBox( TEXT("比赛场次达到最高上限了,不能再添加"),MB_ICONINFORMATION );
return;
}
CDlgAddMatchInfo AddMatchInfo;
if(AddMatchInfo.DoModal()==IDOK)
{
int nItem = m_ListMatchInfo.GetItemCount();
CString strDesc;
m_ListMatchInfo.InsertItem(nItem, AddMatchInfo.m_strInfoTitle);
strDesc.Format(TEXT("%d"),AddMatchInfo.m_nInfoTitleLen);
m_ListMatchInfo.SetItem(nItem,1,LVIF_TEXT,strDesc,0,0,0,0,0);
m_ListMatchInfo.SetItem(nItem,2,LVIF_TEXT,AddMatchInfo.m_strInfoDesc,0,0,0,0,0);
strDesc.Format(TEXT("%d"),AddMatchInfo.m_nInfoDescLen);
m_ListMatchInfo.SetItem(nItem,3,LVIF_TEXT,strDesc,0,0,0,0,0);
CMD_GR_Match_Info *pMatchInfo=new CMD_GR_Match_Info;
ZeroMemory(pMatchInfo,sizeof(CMD_GR_Match_Info));
lstrcpyn(pMatchInfo->szTitle,AddMatchInfo.m_strInfoTitle,CountArray(pMatchInfo->szTitle));
lstrcpyn(pMatchInfo->szDescribe,AddMatchInfo.m_strInfoDesc,CountArray(pMatchInfo->szDescribe));
pMatchInfo->wDescribeLen=(WORD)AddMatchInfo.m_nInfoDescLen;
pMatchInfo->wTitleLen=(WORD)AddMatchInfo.m_nInfoTitleLen;
m_MatchInfo.Add(pMatchInfo);
}
return;
}
//修改时间
VOID CMatchParameterDlg::OnBnClickedModifyInfo()
{
POSITION pos = m_ListMatchInfo.GetFirstSelectedItemPosition();
if( pos == NULL )
{
AfxMessageBox( TEXT("请选择要修改的信息"),MB_ICONINFORMATION );
return;
}
//获取选中项
int nItem = m_ListMatchInfo.GetNextSelectedItem(pos);
//获取索引
DWORD_PTR dwMatchIndex = m_ListMatchInfo.GetItemData(nItem);
//构造对话框
CDlgAddMatchInfo Dlg;
CMD_GR_Match_Info *pMatchInfo=m_MatchInfo.GetAt(nItem);
Dlg.m_strInfoTitle=pMatchInfo->szTitle;
Dlg.m_strInfoDesc=pMatchInfo->szDescribe;
Dlg.m_nInfoDescLen=(int)pMatchInfo->wDescribeLen;
Dlg.m_nInfoTitleLen=(int)pMatchInfo->wTitleLen;
//显示对话框
if( IDOK == Dlg.DoModal() )
{
lstrcpyn(pMatchInfo->szDescribe,(LPCTSTR)Dlg.m_strInfoDesc.GetBuffer(), CountArray(pMatchInfo->szDescribe));
lstrcpyn(pMatchInfo->szTitle, (LPCTSTR)Dlg.m_strInfoTitle.GetBuffer(), CountArray(pMatchInfo->szTitle));
pMatchInfo->wDescribeLen=(WORD)Dlg.m_nInfoDescLen;
pMatchInfo->wTitleLen=(WORD)Dlg.m_nInfoTitleLen;
UpdateMatchInfoList();
}
return;
}
//删除时间
VOID CMatchParameterDlg::OnBnClickedDeleteInfo()
{
POSITION pos = m_ListMatchInfo.GetFirstSelectedItemPosition();
if( pos == NULL )
{
AfxMessageBox( TEXT("请选择要删除的场次"),MB_ICONINFORMATION );
return;
}
//遍历选中项
while( pos )
{
int nItem = m_ListMatchInfo.GetNextSelectedItem(pos);
DWORD_PTR dwMatchIndex = m_ListMatchInfo.GetItemData(nItem);
m_MatchInfo.RemoveAt(nItem);
}
//更新列表
UpdateMatchInfoList();
return;
}
//更新控件
VOID CMatchParameterDlg::UpdateMatchList()
{
//清空列表
m_ListMatch.DeleteAllItems();
for( BYTE i = 0; i < m_cbMatchTime; i++ )
{
FILETIME ftBegin = {}, ftLocalBegin = {};
FILETIME ftEnd = {}, ftLocalEnd = {};
CopyMemory( &ftBegin,&m_puiMatchDate[i*2],sizeof(ftBegin) );
CopyMemory( &ftEnd,&m_puiMatchDate[i*2+1],sizeof(ftEnd) );
FileTimeToLocalFileTime(&ftBegin,&ftLocalBegin);
FileTimeToLocalFileTime(&ftEnd,&ftLocalEnd);
SYSTEMTIME stBegin = {}, stEnd = {};
FileTimeToSystemTime(&ftLocalBegin,&stBegin);
FileTimeToSystemTime(&ftLocalEnd,&stEnd);
//添加到列表
int nItem = m_ListMatch.GetItemCount();
CString str;
str.Format( TEXT("第%ld场"),nItem+1 );
m_ListMatch.InsertItem( nItem,str );
//开始时间
m_ListMatch.SetItem( nItem,1,LVIF_TEXT,GetTimeString(stBegin),0,0,0,0,0 );
//结束时间
m_ListMatch.SetItem( nItem,2,LVIF_TEXT,GetTimeString(stEnd),0,0,0,0,0 );
m_ListMatch.SetItemData(nItem,i);
}
}
//更新控件
VOID CMatchParameterDlg::UpdateMatchInfoList()
{
//清空列表
m_ListMatchInfo.DeleteAllItems();
for(INT_PTR i = 0; i<m_MatchInfo.GetCount(); i++ )
{
//添加到列表
CMD_GR_Match_Info *pMatchInfo=m_MatchInfo.GetAt(i);
int nItem = m_ListMatchInfo.GetItemCount();
CString strDesc;
m_ListMatchInfo.InsertItem(nItem, pMatchInfo->szTitle);
strDesc.Format(TEXT("%d"),pMatchInfo->wTitleLen);
m_ListMatchInfo.SetItem(nItem,1,LVIF_TEXT,strDesc,0,0,0,0,0);
m_ListMatchInfo.SetItem(nItem,2,LVIF_TEXT,pMatchInfo->szDescribe,0,0,0,0,0);
strDesc.Format(TEXT("%d"),pMatchInfo->wDescribeLen);
m_ListMatchInfo.SetItem(nItem,3,LVIF_TEXT,strDesc,0,0,0,0,0);
}
}
//获取时间字符串
LPCTSTR CMatchParameterDlg::GetTimeString( SYSTEMTIME &st )
{
//变量定义
static TCHAR szTime[32] = TEXT("");
_sntprintf(szTime,CountArray(szTime),TEXT("%4d年%02d月%02d日 %02d时%02d分%02d秒"),st.wYear,st.wMonth,st.wDay,st.wHour,st.wMinute,st.wSecond);
return szTime;
}
//数据交换
void CMatchParameterDlg::DoDataExchange(CDataExchange* pDX)
{
__super::DoDataExchange(pDX);
DDX_Control( pDX,IDC_LIST_MATCH,m_ListMatch );
DDX_Control( pDX,IDC_LIST_MATCH_INFO,m_ListMatchInfo);
}
//初始化函数
BOOL CMatchParameterDlg::OnInitDialog()
{
__super::OnInitDialog();
//初始化列表
m_ListMatch.SetExtendedStyle(LVS_EX_FULLROWSELECT);
m_ListMatch.InsertColumn( 0,TEXT("场次"),LVCFMT_LEFT,62 );
m_ListMatch.InsertColumn( 1,TEXT("开始时间"),LVCFMT_LEFT,200 );
m_ListMatch.InsertColumn( 2,TEXT("结束时间"),LVCFMT_LEFT,200 );
m_ListMatchInfo.SetExtendedStyle(LVS_EX_FULLROWSELECT);
m_ListMatchInfo.InsertColumn( 0,TEXT("信息标题"),LVCFMT_LEFT,60 );
m_ListMatchInfo.InsertColumn( 1,TEXT("标题长度"),LVCFMT_LEFT,60 );
m_ListMatchInfo.InsertColumn( 2,TEXT("信息内容"),LVCFMT_LEFT,200 );
m_ListMatchInfo.InsertColumn( 3,TEXT("内容长度"),LVCFMT_LEFT,60 );
//更新数据
UpdateMatchInfoList();
UpdateMatchList();
//设置数据
CString strTemp;
GetDlgItem(IDC_EDIT_MATCH_NAME)->SetWindowText(m_pszMatchRoom);
strTemp.Format(TEXT("%d"),m_dwMatchFee);
GetDlgItem(IDC_EDIT_FEE)->SetWindowText(strTemp);
strTemp.Format(TEXT("%d"),m_lInitScore);
GetDlgItem(IDC_EDIT_INIT_SCORE)->SetWindowText(strTemp);
strTemp.Format(TEXT("%d"),m_wMatchGameCount);
GetDlgItem(IDC_EDIT_MATCH_GAME_COUNT)->SetWindowText(strTemp);
return FALSE;
}
void CMatchParameterDlg::OnOK()
{
//获取目录
TCHAR szPath[MAX_PATH]=TEXT("");
GetCurrentDirectory(sizeof(szPath),szPath);
//读取配置
TCHAR szFileName[MAX_PATH]=TEXT("");
_sntprintf(szFileName,sizeof(szFileName),TEXT("%s\\MatchOption.ini"),szPath);
//变量定义
CString strTemp,strAppName,strValue;
//写入配置
strAppName.Format(TEXT("%dTimeRankings"),m_wMatchID);
strTemp.Format(TEXT("%d"),m_MatchInfo.GetCount());
WritePrivateProfileString(strAppName,TEXT("InfoItemCount"),strTemp,szFileName);
//写入场次
strTemp.Format(TEXT("%d"),m_cbMatchTime);
WritePrivateProfileString(strAppName,TEXT("MatchCount"),strTemp,szFileName);
//写入费用
GetDlgItem(IDC_EDIT_FEE)->GetWindowText(strTemp);
CT2CA strNum(strTemp);
m_dwMatchFee=atoi(strNum);
WritePrivateProfileString(strAppName,TEXT("MatchFee"),strTemp,szFileName);
//写入名称
GetDlgItem(IDC_EDIT_MATCH_NAME)->GetWindowText(strTemp);
lstrcpyn(m_pszMatchRoom, strTemp, 32);
WritePrivateProfileString(strAppName,TEXT("MatchRoom"), m_pszMatchRoom,szFileName);
//初始积分
GetDlgItem(IDC_EDIT_INIT_SCORE)->GetWindowText(strTemp);
CT2CA strScore(strTemp);
m_lInitScore=atoi(strScore);
WritePrivateProfileString(strAppName,TEXT("InitScore"), strTemp,szFileName);
//比赛局数
GetDlgItem(IDC_EDIT_MATCH_GAME_COUNT)->GetWindowText(strTemp);
CT2CA strGameCount(strTemp);
m_wMatchGameCount=atoi(strGameCount);
WritePrivateProfileString(strAppName,TEXT("MatchGameCount"), strTemp,szFileName);
//写入信息
for(INT_PTR i=0; i<m_MatchInfo.GetCount(); i++)
{
CMD_GR_Match_Info *pMatchInfo=m_MatchInfo.GetAt(i);
strAppName.Format(TEXT("%dItem%d"),m_wMatchID,i);
WritePrivateProfileString(strAppName,TEXT("InfoTitle"),pMatchInfo->szTitle,szFileName);
WritePrivateProfileString(strAppName,TEXT("InfoDescribe"),pMatchInfo->szDescribe,szFileName);
strValue.Format(TEXT("%d"),pMatchInfo->wTitleLen);
WritePrivateProfileString(strAppName,TEXT("InfoTitleLen"),strValue,szFileName);
strValue.Format(TEXT("%d"),pMatchInfo->wDescribeLen);
WritePrivateProfileString(strAppName,TEXT("InfoDescribeLen"),strValue,szFileName);
}
//写入时间
for(BYTE i=0; i<m_cbMatchTime; i++)
{
//提取时间
FILETIME ftBegin = {};
CopyMemory( &ftBegin,&m_puiMatchDate[i*2],sizeof(ftBegin) );
FILETIME ftEnd = {};
CopyMemory( &ftEnd,&m_puiMatchDate[i*2+1],sizeof(ftEnd) );
CTime TimeBegin(ftBegin);
CTime TimeEnd(ftEnd);
strAppName.Format(TEXT("%dMatchDate%d"),m_wMatchID,i);
WritePrivateProfileString(strAppName,TEXT("TimeStart"),TimeBegin.Format("%Y%m%d%H%M%S"),szFileName);
WritePrivateProfileString(strAppName,TEXT("TimeEnd"),TimeEnd.Format("%Y%m%d%H%M%S"),szFileName);
}
CDialog::OnOK();
}
//////////////////////////////////////////////////////////////////////////
//构造函数
CDlgAddMatchDate::CDlgAddMatchDate(): CDialog(IDD_DATETIME_MATCH)
{
m_TimeBegin = CTime::GetCurrentTime();
m_TimeEnd = CTime::GetCurrentTime();
}
//析构函数
CDlgAddMatchDate::~CDlgAddMatchDate()
{
}
//数据交换
void CDlgAddMatchDate::DoDataExchange(CDataExchange* pDX)
{
__super::DoDataExchange(pDX);
DDX_Control( pDX,IDC_DATE_BEGIN,m_CtrlDateBegin );
DDX_Control( pDX,IDC_TIME_BEGIN,m_CtrlTimeBegin );
DDX_Control( pDX,IDC_DATE_END,m_CtrlDateEnd );
DDX_Control( pDX,IDC_TIME_END,m_CtrlTimeEnd );
}
//初始化
BOOL CDlgAddMatchDate::OnInitDialog()
{
__super::OnInitDialog();
//更新控件
m_CtrlDateBegin.SetTime( &m_TimeBegin );
m_CtrlTimeBegin.SetTime( &m_TimeBegin );
m_CtrlDateEnd.SetTime( &m_TimeEnd );
m_CtrlTimeEnd.SetTime( &m_TimeEnd );
return TRUE;
}
//确定函数
VOID CDlgAddMatchDate::OnOK()
{
UpdateData();
//获取开始时间
CTime DateBegin;
m_CtrlDateBegin.GetTime( DateBegin );
CTime TimeBegin;
m_CtrlTimeBegin.GetTime( TimeBegin );
CTime Time1( DateBegin.GetYear(),DateBegin.GetMonth(),DateBegin.GetDay(),TimeBegin.GetHour(),TimeBegin.GetMinute(),TimeBegin.GetSecond() );
m_TimeBegin = Time1;
//获取结束时间
CTime DateEnd;
m_CtrlDateEnd.GetTime( DateEnd );
CTime TimeEnd;
m_CtrlTimeEnd.GetTime( TimeEnd );
CTime Time2( DateEnd.GetYear(),DateEnd.GetMonth(),DateEnd.GetDay(),TimeEnd.GetHour(),TimeEnd.GetMinute(),TimeEnd.GetSecond() );
m_TimeEnd = Time2;
//效验
if( m_TimeBegin >= m_TimeEnd )
{
AfxMessageBox( TEXT("结束时间必须大于开始时间,请重新输入"),MB_ICONERROR );
return;
}
__super::OnOK();
}
//////////////////////////////////////////////////////////////////////////////////
//构造函数
CDlgAddMatchInfo::CDlgAddMatchInfo(): CDialog(IDD)
, m_strInfoTitle(_T(""))
, m_strInfoDesc(_T(""))
, m_nInfoTitleLen(0)
, m_nInfoDescLen(0)
{
}
//析构函数
CDlgAddMatchInfo::~CDlgAddMatchInfo()
{
}
//数据交换
void CDlgAddMatchInfo::DoDataExchange(CDataExchange* pDX)
{
__super::DoDataExchange(pDX);
}
//初始化
BOOL CDlgAddMatchInfo::OnInitDialog()
{
__super::OnInitDialog();
GetDlgItem(IDC_EDIT_DESC)->SetWindowText(m_strInfoDesc);
GetDlgItem(IDC_EDIT_TITLE)->SetWindowText(m_strInfoTitle);
CString strTemp;
strTemp.Format(TEXT("%d"),m_nInfoDescLen);
GetDlgItem(IDC_EDIT_DESC_LEN)->SetWindowText(strTemp);
strTemp.Format(TEXT("%d"),m_nInfoTitleLen);
GetDlgItem(IDC_EDIT_TITLE_LEN)->SetWindowText(strTemp);
return TRUE;
}
//确定函数
VOID CDlgAddMatchInfo::OnOK()
{
GetDlgItem(IDC_EDIT_DESC)->GetWindowText(m_strInfoDesc);
GetDlgItem(IDC_EDIT_TITLE)->GetWindowText(m_strInfoTitle);
CString strTemp;
GetDlgItem(IDC_EDIT_DESC_LEN)->GetWindowText(strTemp);
CT2CA strNum(strTemp);
m_nInfoDescLen=atoi(strNum);
GetDlgItem(IDC_EDIT_TITLE_LEN)->GetWindowText(strTemp);
CT2CA strNum1(strTemp);
m_nInfoTitleLen=atoi(strNum1);
__super::OnOK();
}
//////////////////////////////////////////////////////////////////////////////////