📄 royalrumble.cpp
字号:
// RoyalRumble.cpp: implementation of the CRoyalRumble class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "server.h"
#include "RoyalRumble.h"
#include "ServerDlg.h"
#include "extern.h"
#include "bufferex.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
extern CServerDlg *g_pMainDlg;
extern CString g_strARKRRWinner;
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CRoyalRumble::CRoyalRumble()
{
m_iMaxApplyNum = 200; // 弥措 脚没 倾侩
m_iMinLevel = 26; // 弥家 鞘夸 饭骇
m_bRRStatus = RR_EMPTY; // 肺锯 烦喉狼 泅犁 惑怕
m_iStartCount = 3; // 矫累矫俊 技林绰 墨款飘
m_iPlayMinute = 30; // 肺锯 烦喉 版扁 矫埃(盒)
m_iZoneNum = 59; // 肺锯 烦喉 俺弥 粮
m_iBravoSecond = 60; // 版扁 饶 磊绵 矫埃(檬)
m_bNextRRInit = FALSE; // 促澜 版扁甫 汲沥沁绰瘤俊 措茄 敲贰弊
m_iItemSid = 840; // 惑前栏肺 林绰 酒捞袍狼 SID
}
CRoyalRumble::~CRoyalRumble()
{
m_bRRStatus = RR_EMPTY;
for( int i = 0; i < m_arRRUser.GetSize(); i++ )
{
if( m_arRRUser[i] )
{
delete m_arRRUser[i];
}
}
m_arRRUser.RemoveAll();
}
void CRoyalRumble::Init(int year, int month, int day)
{
MAP* pMap = NULL;
for( int i = 0; i < g_zone.GetSize(); i++ )
{
if( g_zone[i] )
{
if( g_zone[i]->m_Zone == m_iZoneNum )
{
pMap = g_zone[i];
break;
}
}
}
if( !pMap ) // 肺凯烦喉 甘阑 救啊瘤绊 乐促. 檬扁拳 角菩
{
return;
}
m_pRRMap = pMap;
m_iCurrentStartCount = m_iStartCount;
m_bRRStatus = RR_IDLE;
m_iCurrentPlaySecond = 0;
m_iCurrentBravoSecond = 0;
m_bNextRRInit = FALSE;
// 脚没 啊瓷 矫埃
m_timeApplyStart = CTime( year, month, day, 19, 0, 0 );
m_timeApplyEnd = CTime( year, month, day, 19, 50, 0 );
// 涝厘 啊瓷 矫埃
m_timeEnterStart = CTime( year, month, day, 19, 50, 0 );
m_timeEnterEnd = CTime( year, month, day, 20, 0, 0 );
m_dwLastEnterMsg = GetTickCount();
m_dwLastStartMsg = GetTickCount();
m_ItemRR.sSid = m_iItemSid;
m_ItemRR.sLevel = g_arItemTable[m_ItemRR.sSid]->m_byRLevel;
m_ItemRR.sCount = 1;
m_ItemRR.sDuration = g_arItemTable[m_ItemRR.sSid]->m_sDuration;
m_ItemRR.sBullNum = g_arItemTable[m_ItemRR.sSid]->m_sBullNum;
m_ItemRR.tMagic[0] = (BYTE)137;
m_ItemRR.tMagic[1] = (BYTE)141;
m_ItemRR.tMagic[2] = (BYTE)128;
m_ItemRR.tMagic[3] = (BYTE)42;
m_ItemRR.tMagic[4] = (BYTE)31;
m_ItemRR.tMagic[5] = (BYTE)33;
m_ItemRR.tIQ = UNIQUE_ITEM;
m_ItemRR.iItemSerial= 0;
m_ItemRR.dwMoney = 0;
}
void CRoyalRumble::CheckRRStatus()
{
CTime curTime = CTime::GetCurrentTime();
CString strMsg;
switch( m_bRRStatus )
{
/* case RR_IDLE: // 泅犁 版扁啊 国绢瘤绊 乐瘤 臼促
if( curTime >= m_timeApplyStart && curTime < m_timeApplyEnd ) // 版扁 矫累 矫埃捞扼搁
{
m_bRRStatus = RR_APPLY; // 泅犁 惑怕甫 脚没惑怕肺 官操绊
}
break;
*/
case RR_EMPTY: // 捞辑滚绰 肺锯烦喉 措雀啊 绝促.
break;
case RR_IDLE: // 泅犁 版扁啊 国绢瘤绊 乐瘤 臼促
if( curTime >= m_timeEnterStart && curTime < m_timeEnterEnd ) // 涝厘 矫埃捞扼搁
{
m_bRRStatus = RR_ENTERING; // 泅犁 惑怕甫 涝厘惑怕肺 官槽促
break;
}
if( curTime >= m_timeApplyStart && curTime < m_timeApplyEnd )
{
Apply();
}
break;
case RR_ENTERING:
if( curTime >= m_timeEnterEnd )
{
m_bRRStatus = RR_ENTERING_END;
strMsg = _T("肺锯烦喉 拜捧啊 矫累邓聪促.");
g_pMainDlg->AnnounceZone( (LPTSTR)(LPCTSTR)strMsg, SYSTEM_ANNOUNCE, m_iZoneNum );
break;
}
if( GetTickCount() - m_dwLastEnterMsg > 2 * 60 * 1000 )
{
strMsg.Format( "肺凯烦喉俊 曼咯窍角 盒甸篮 %d矫 %02d盒 捞傈鳖瘤 版扁厘栏肺 涝厘秦林矫扁 官而聪促", m_timeEnterEnd.GetHour(), m_timeEnterEnd.GetMinute() );
g_pMainDlg->AnnounceAllServer( (LPTSTR)(LPCTSTR)strMsg, SYSTEM_ANNOUNCE );
m_dwLastEnterMsg = GetTickCount();
}
break;
case RR_ENTERING_END:
CountDownStart();
break;
case RR_START:
if( GetTickCount() - m_dwLastStartMsg > 2 * 60 * 1000 )
{
strMsg = _T("泅犁 NEO A.R.K 拜捧厘俊辑 肺凯烦喉 拜捧啊 凯府绊 乐嚼聪促");
g_pMainDlg->AnnounceAllServer( (LPTSTR)(LPCTSTR)strMsg, SYSTEM_ANNOUNCE );
m_dwLastStartMsg = GetTickCount();
}
CheckRREnd();
break;
case RR_END:
CheckRRBravoEnd();
break;
}
}
void CRoyalRumble::CountDownStart()
{
if( m_bRRStatus != RR_ENTERING_END )
{
return;
}
if( m_iCurrentStartCount <= 0 && m_bRRStatus != RR_START ) // 墨款飘甫 促 技菌绰单档 矫累登瘤 臼篮 惑炔
{
Start();
return;
}
CString strMsg;
if( m_iCurrentStartCount <= 0 ) // 墨款飘甫 促 技菌促. 矫累 矫挪促.
{
m_bRRStatus = RR_START;
m_iCurrentStartCount = m_iStartCount;
Start();
return;
}
strMsg.Format("%d", m_iCurrentStartCount ); m_iCurrentStartCount--;
g_pMainDlg->AnnounceZone( (LPTSTR)(LPCTSTR)strMsg, SYSTEM_ANNOUNCE, m_iZoneNum );
}
void CRoyalRumble::Start()
{
CString strMsg;
strMsg = _T("矫累 !!!");
g_pMainDlg->AnnounceZone( (LPTSTR)(LPCTSTR)strMsg, SYSTEM_ANNOUNCE, m_iZoneNum );
m_dwLastStartMsg = GetTickCount();
m_bRRStatus = RR_START;
}
void CRoyalRumble::CheckRREnd()
{
m_iCurrentPlaySecond++;
CString strMsg;
int iRemainSecond = (m_iPlayMinute * 60) - m_iCurrentPlaySecond;
if( iRemainSecond == 5 * 60 ) // 场唱扁 5盒傈
{
strMsg = _T("5盒 饶 肺凯烦喉 版扁啊 辆丰邓聪促");
g_pMainDlg->AnnounceZone( (LPTSTR)(LPCTSTR)strMsg, SYSTEM_ANNOUNCE, m_iZoneNum );
}
else if( iRemainSecond == 1 * 60 )
{
strMsg = _T("1盒 饶 肺凯烦喉 版扁啊 辆丰邓聪促");
g_pMainDlg->AnnounceZone( (LPTSTR)(LPCTSTR)strMsg, SYSTEM_ANNOUNCE, m_iZoneNum );
}
else if( iRemainSecond <= 5 && iRemainSecond > 0 )
{
strMsg.Format( "%d", iRemainSecond );
g_pMainDlg->AnnounceZone( (LPTSTR)(LPCTSTR)strMsg, SYSTEM_ANNOUNCE, m_iZoneNum );
}
if( m_iCurrentPlaySecond >= m_iPlayMinute * 60 )
{
End();
}
GetWinner();
}
void CRoyalRumble::End()
{
CString strMsg;
char strTitle[128];
char strContent[2048];
CTime time = CTime::GetCurrentTime();
sprintf( strTitle, "%d岿 %d老 肺凯烦喉 措雀 快铰磊", time.GetMonth(), time.GetDay() );
m_bRRStatus = RR_END;
g_strARKRRWinner = _T("");
m_bNextRRInit = FALSE;
USER* pUser = GetWinner();
if( !pUser )
{
strMsg = _T("肺凯烦喉 版扁啊 辆丰登菌嚼聪促");
g_pMainDlg->AnnounceAllServer( (LPTSTR)(LPCTSTR)strMsg, SYSTEM_ANNOUNCE );
sprintf( strContent, "\r\n %d岿 %d老 肺凯烦喉 措雀绰\r\n\r\n快铰磊啊 绝嚼聪促.", time.GetMonth(), time.GetDay() );
BBSWrite( strTitle, strContent );
UpdateRoyalRumbleWinner();
InitRRUser();
return;
}
strMsg.Format( "%s丛捞 肺凯烦喉 快铰磊啊 登继嚼聪促. 绵窍靛赋聪促", pUser->m_strUserID );
g_pMainDlg->AnnounceAllServer( (LPTSTR)(LPCTSTR)strMsg, SYSTEM_ANNOUNCE );
sprintf( strContent, "\r\n %d岿 %d老 肺凯烦喉 措雀 快铰磊绰\r\n\r\n %s 丛 涝聪促\r\n\r\n *** 绵窍靛赋聪促 ***", time.GetMonth(), time.GetDay(), pUser->m_strUserID );
BBSWrite( strTitle, strContent );
g_strARKRRWinner.Format( "%s", pUser->m_strUserID );
UpdateRoyalRumbleWinner();
GiveItemToWinner( pUser );
InitRRUser();
}
USER* CRoyalRumble::GetWinner()
{
int i = 0;
int iCount = 0;
USER* pUser = NULL;
USER* pWinner = NULL;
COM* pCom = g_pMainDlg->GetCOM();
if( !pCom ) return NULL;
if( m_bRRStatus == RR_END ) // 霸烙捞 场车阑 版快 贸府
{
for( i = 0; i < m_arRRUser.GetSize(); i++ )
{
if( m_arRRUser[i] )
{
if( !m_arRRUser[i]->m_bLive ) continue;
if( m_arRRUser[i]->m_iUID < 0 || m_arRRUser[i]->m_iUID > MAX_USER ) continue;
pUser = pCom->GetUserUid( m_arRRUser[i]->m_iUID );
if( !pUser ) continue;
if( pUser->m_state != STATE_GAMESTARTED ) continue;
if( pUser->m_curz != m_iZoneNum ) continue;
if( strcmp( pUser->m_strUserID, m_arRRUser[i]->m_strUserID ) ) continue;
if( pUser->m_bLive == FALSE ) continue;
if( pUser->m_sHP <= 0 ) continue;
iCount++; // 捞 荤恩篮 混酒巢篮 荤恩捞促.
pWinner = pUser;
}
}
// 窜 1疙父 混酒巢酒具 快铰磊肺 贸府
if( iCount == 1 )
{
return pWinner;
}
else
return NULL;
}
else if( m_bRRStatus == RR_START ) // 霸烙 吝 贸府
{
for( i = 0; i < m_arRRUser.GetSize(); i++ )
{
if( m_arRRUser[i] )
{
if( !m_arRRUser[i]->m_bLive ) continue;
if( m_arRRUser[i]->m_iUID < 0 || m_arRRUser[i]->m_iUID > MAX_USER ) continue;
iCount++;
}
}
if( iCount <= 1 )
{
m_bRRStatus = RR_END;
End();
return NULL;
}
}
return NULL;
}
BOOL CRoyalRumble::CheckEnteringByTime()
{
if( m_bRRStatus == RR_ENTERING ) return TRUE;
return FALSE;
}
BOOL CRoyalRumble::CheckEnteringByMaxUser()
{
if( m_arRRUser.GetSize() < m_iMaxApplyNum ) return TRUE;
return FALSE;
}
BOOL CRoyalRumble::Enter(USER *pUser)
{
if( !pUser ) return FALSE;
CRoyalRumbleUser* pNewUser = new CRoyalRumbleUser;
pNewUser->m_iUID = pUser->m_uid;
strcpy( pNewUser->m_strUserID, pUser->m_strUserID );
m_arRRUser.Add( pNewUser );
return TRUE;
}
void CRoyalRumble::Exit(USER* pUser)
{
if( !pUser ) return;
int i;
for( i = 0; i < m_arRRUser.GetSize(); i++ )
{
if( m_arRRUser[i] )
{
if( m_arRRUser[i]->m_iUID == pUser->m_uid )
{
if( !strcmp( m_arRRUser[i]->m_strUserID, pUser->m_strUserID ) )
{
m_arRRUser[i]->m_bLive = FALSE;
}
}
}
}
GetWinner();
}
void CRoyalRumble::CheckRRBravoEnd()
{
m_iCurrentBravoSecond++;
if( m_iCurrentBravoSecond >= m_iBravoSecond )
{
m_bRRStatus = RR_IDLE;
ForceExit();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -