⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 royalrumble.cpp

📁 决战帝王1.5武神降临对喜爱决战的玩家共享研究用
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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 + -