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

📄 gamble.cpp

📁 韩国英雄王座倒闭后流出来部分源代码
💻 CPP
字号:
////////////////////////////////////////////////////////////////////////////////////////
//
//	Gamble	
//
//
////////////////////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "Gamble.h"
#include "BaseData.h"
#include "PlayerInfo.h"
#include "MapServerSocket.h"

#ifdef DEF_UNIQUEITEM
	#include "UniqueManager.h"
#endif


#ifdef DEF_AZIT
	#include "AzitManager.h"
#endif

#ifdef DEF_KUMA_GAMBLE


////////////////////////////////////////////////////////////////////////////////////////
//	Global Values
////////////////////////////////////////////////////////////////////////////////////////
extern	BaseData			g_Base;				//	Data Base 包访
extern	Map					*g_pMap;			//	MAP 包府 (User捞悼)
extern	MapServerSocket		*g_pServer; 

////////////////////////////////////////////////////////////////////////////////////////
//
////////////////////////////////////////////////////////////////////////////////////////
CGamble::CGamble()
{
	m_nGambleType		= 0;
	m_nGambleOption		= 0;
	m_pGambleBaseItem	= NULL;
	m_nDay				= 0;
	m_bStart			= FALSE;
}


////////////////////////////////////////////////////////////////////////////////////////
//
////////////////////////////////////////////////////////////////////////////////////////
CGamble::~CGamble()
{
	if ( !m_vOptions.empty() )
		m_vOptions.clear();
}


////////////////////////////////////////////////////////////////////////////////////////
//
//	High : TYPE 
//	Low  : Option
//
////////////////////////////////////////////////////////////////////////////////////////
void CGamble::LoadGambleLuck()
{
	for ( MAP_VOIDPTR::iterator it = g_Base.m_ProductionChart.Begin(); it != g_Base.m_ProductionChart.End(); ++it)
	{
		_PRODUCTIONCHART_	*p = ( _PRODUCTIONCHART_ *)it->second;

		if( p )
		{
			DWORD dwSeq = MAKELONG( p->wSeq, GAMBLE_MAGIC );
			m_vOptions.push_back( dwSeq );	
		}
	}

	for ( it = g_Base.m_RareEnchant.Begin(); it != g_Base.m_RareEnchant.End(); it++)
	{
		_RARE_ENCHANT_ *pRareEnchant = (_RARE_ENCHANT_ *)it->second;

		if( pRareEnchant )
		{		
			DWORD dwSeq = MAKELONG( (WORD)pRareEnchant->dwSEQ, GAMBLE_RARE );
			m_vOptions.push_back( dwSeq );
		}
	}	
}

////////////////////////////////////////////////////////////////////////////////////////
//
////////////////////////////////////////////////////////////////////////////////////////
BOOL CGamble::GetLuckTitle( char* szLuckOption, char* szLuckItem )
{
	strcpy( szLuckOption, "" );
	strcpy( szLuckItem, "" );

	if ( m_nGambleType == GAMBLE_MAGIC )
	{
		_PRODUCTIONCHART_	*p = (_PRODUCTIONCHART_*)g_Base.m_ProductionChart.Find( m_nGambleOption );
		if ( p )
			strcpy( szLuckOption, p->szName );
	}
	else if ( m_nGambleType == GAMBLE_RARE )
	{
		_RARE_ENCHANT_ *p = (_RARE_ENCHANT_*)g_Base.m_RareEnchant.Find( m_nGambleOption );

		if ( p )
			strcpy( szLuckOption, p->strNAME );
	}

	if ( m_pGambleBaseItem )	
		strcpy( szLuckItem, m_pGambleBaseItem->strITEMNAME );	

	return TRUE;
}


////////////////////////////////////////////////////////////////////////////////////////
//
////////////////////////////////////////////////////////////////////////////////////////
BOOL CGamble::InitGambleLuck(BOOL bStart)
{
	BOOL bRet = FALSE;

	if ( bStart )
		m_bStart = bStart;

	if ( !m_bStart )
		return bRet;

	struct tm *today;
	time_t t;

	time( &t );
	today = localtime( &t );	

	if ( m_nDay != 0 )
	{
		if ( today->tm_hour == GAMBLE_INIT_PERIODIC )
		{
			if ( today->tm_yday == m_nDay )
				return bRet;		

			if ( !bStart )
				bRet = TRUE;
		}
		else
			return bRet;
	}	

	m_nDay = today->tm_yday;

	if ( m_vOptions.empty() )
		LoadGambleLuck();

	if ( m_vOptions.empty() )
	{
		ErrorMsg( "OPTION IS EMPTY" );
	}

	srand( (unsigned)time( NULL ) );

	random_shuffle( m_vOptions.begin(), m_vOptions.end() ) ;
	
	DWORD dwSeq = m_vOptions.at( rand() % m_vOptions.size() );

	m_nGambleType	= HIWORD( dwSeq );
	m_nGambleOption	= LOWORD( dwSeq );
	
	int _N = iWeightSegementRandom( g_Base.m_GambleItemChart.GetCount(), 10 );

	if ( _N >= g_Base.m_GambleItemChart.GetCount() - 1 )
		_N = g_Base.m_GambleItemChart.GetCount() - 1;

	if ( _N < 0 )
		_N = 0;

	m_pGambleBaseItem = (_BASE_ITEM_*)g_Base.m_GambleItemChart.At( _N );

	g_Base.m_GambleNormalItemChart.Suffle();

	return bRet;
}

////////////////////////////////////////////////////////////////////////////////////////
//	胺喉傅 矫累
//
////////////////////////////////////////////////////////////////////////////////////////
void CGamble::GambleOpen( _LPSOCKET_FD pSocketFD )
{
	if ( pSocketFD->pPlayer->m_pTmpGambleItem )
	{
		pSocketFD->pPlayer->m_nGambleState = GAMBLE_STATE_STOP;
	}	
}

////////////////////////////////////////////////////////////////////////////////////////
//	胺喉傅 辆丰
//
////////////////////////////////////////////////////////////////////////////////////////
bool CGamble::GambleClose( _LPSOCKET_FD pSocketFD, bool bSell )
{
	bool bret = false;	

	if ( pSocketFD->pPlayer->m_pTmpGambleItem )
	{
		int _nMo		= 1;	

		if ( bSell )
		{
			_nMo		= GAMBLE_SELL_ITEM;	

			if ( m_pGambleBaseItem->dwIndex == pSocketFD->pPlayer->m_pTmpGambleItem->m_dwItemIndex )
			{
				_nMo		= GAMBLE_LUCK_ITEM;		

				if ( ( pSocketFD->pPlayer->m_pTmpGambleItem->m_nENCHANTTYPE ==  m_nGambleType ) &&
					 ( pSocketFD->pPlayer->m_pTmpGambleItem->m_wENCHANTID ==  m_nGambleOption ) )		
					 _nMo *= GAMBLE_LUCK_OPTION;
			}
			else if ( ( pSocketFD->pPlayer->m_pTmpGambleItem->m_nENCHANTTYPE ==  m_nGambleType ) &&
					  ( pSocketFD->pPlayer->m_pTmpGambleItem->m_wENCHANTID ==  m_nGambleOption ) )
				_nMo = GAMBLE_LUCK_OPTION;
		}


		int nBuyPrice	= (int)((float)(pSocketFD->pPlayer->m_pTmpGambleItem->m_nPrice) / (float)DEF_SELLRATE);
		nBuyPrice		= MIN( nBuyPrice, DEF_MAXITEMSELLPRICE) ;

		int _nPrice		= nBuyPrice * _nMo;

#ifdef _DEBUG

//		if ( bSell )
//		{
//			g_pServer->PacketSend_WarningMsg(pSocketFD, "[SELL]Sell Item: %d : %d * %d = %d", pSocketFD->pPlayer->m_pTmpGambleItem->m_nPrice, nBuyPrice, _nMo, _nPrice);	
//		}

#endif


		pSocketFD->pPlayer->Inventory_Delete( pSocketFD->pPlayer->m_pTmpGambleItem );
		g_pServer->PacketSend_InventoryDelete( pSocketFD, pSocketFD->pPlayer->m_pTmpGambleItem->m_dwItemHandle	);	
		
		pSocketFD->pPlayer->m_nGold			 += _nPrice;
		pSocketFD->pPlayer->m_nGetGold		 =  _nPrice;

		bret = true;
	}

	pSocketFD->pPlayer->m_pTmpGambleItem = NULL;
	pSocketFD->pPlayer->m_nGambleState	 = GAMBLE_STATE_NONE;

	if ( ( bret ) && ( !bSell ) )
		g_pServer->PacketSend_ChangeGold( pSocketFD );	

	return bret;
}

////////////////////////////////////////////////////////////////////////////////////////
//	胺喉傅狼 矫累
//
//	-	酒瘤飘 荐涝陛阑 且寸窃	
//
////////////////////////////////////////////////////////////////////////////////////////
BOOL CGamble::GambleStart( _LPSOCKET_FD pSocketFD )
{	
	if ( pSocketFD->pPlayer->m_nGambleState != GAMBLE_STATE_NONE )
	{
		GambleClose( pSocketFD );		
	}

	if ( pSocketFD->pPlayer->m_nGold < GAMBLE_MONEY )
	{
		g_pServer->PacketSend_WarningMsg( pSocketFD, MSG_FIGHTZONE_NOENOUGHMONEY );
		return FALSE;
	}	

	pSocketFD->pPlayer->m_nGold			-=	GAMBLE_MONEY;
	pSocketFD->pPlayer->m_nGetGold		=	-GAMBLE_MONEY;
	pSocketFD->pPlayer->m_nGambleState	=	GAMBLE_STATE_START;


#ifdef DEF_AZIT
		_Module.m_pAzitManager->SetAzitTex(	 pSocketFD->pPlayer->GetMapID(), GAMBLE_MONEY * DEF_AZITTAX_DEFAULTRATE );
#endif
		
#ifdef DEF_AZITSIMULATION
		g_pMap->AddAzitTax(pSocketFD->pPlayer->m_nMapLayer,  GAMBLE_MONEY* DEF_AZITTAX_DEFAULTRATE  ) ;
#endif 
		


	
	return TRUE;
}


////////////////////////////////////////////////////////////////////////////////////////
//	胺喉傅 辆丰
//
////////////////////////////////////////////////////////////////////////////////////////
CItem* CGamble::GambleStop( _LPSOCKET_FD pSocketFD )
{
	//	胺喉 矫累 窜拌啊 酒聪促..
	if ( pSocketFD->pPlayer->m_nGambleState != GAMBLE_STATE_START )
	{
		g_pServer->PacketSend_Gambling( pSocketFD, GAMBLE_STATE_STOP, GAMBLE_RESULT_FAIL );
		return NULL;
	}


	CItem *pNewItem = (CItem *)g_pMap->Pool_Item_Pop();		

	if( !pNewItem	)
	{	
		g_pServer->PacketSend_Gambling( pSocketFD, GAMBLE_STATE_STOP, GAMBLE_RESULT_FAIL );

		pSocketFD->pPlayer->m_nGold			+= GAMBLE_MONEY;
		pSocketFD->pPlayer->m_nGetGold		=  GAMBLE_MONEY;
		pSocketFD->pPlayer->m_nGambleState	= GAMBLE_STATE_NONE;

		g_pServer->PacketSend_ChangeGold( pSocketFD );

		return NULL;
	}


	// 1. 寸梅 / 参 魄沥

	// 寸梅
	if ( ( rand() % 100 ) > GAMBLE_PRIZE )
	{

#ifdef DEF_UNIQUEITEM
		
#ifdef DEF_UNIQUEITEMDROP_FIX_TEST
		if( 1 )
#else
		if( !pSocketFD->pPlayer->IsFreeUser() && rand()%40 ==  13 )		
#endif 
		{
				CItem *pTempItem = _Module.m_pUniqueManager->CreateUniqueItem();

				if( pTempItem  )
				{
					g_pMap->Pool_Item_Push( pNewItem );
					return pTempItem;
				}
				else
				{
					_BASE_ITEM_* pBaseItem = (_BASE_ITEM_*)g_Base.m_GambleNormalItemChart.At( rand() % g_Base.m_GambleNormalItemChart.GetCount() );		
					pNewItem->CreateItem( pBaseItem->dwIndex, 0, 0, 0  );	
				}
		}
		else
		{
#endif


			// 2. 傈眉 胺喉傅 酒捞袍吝 窍唱 急琶
			int _N = iWeightSegementRandom( g_Base.m_GambleItemChart.GetCount(), 10 );

			if ( _N >= g_Base.m_GambleItemChart.GetCount() - 1 )
				_N = g_Base.m_GambleItemChart.GetCount() - 1;

			if ( _N < 0 )
				_N = 0;

			_BASE_ITEM_* pBaseItem = (_BASE_ITEM_*)g_Base.m_GambleItemChart.At( _N );		


			// 3. 阁胶磐 饭骇 搬沥
			int _nM = iWeightSegementRandom( GAMBLE_LV_MAX, 10 );

			if ( _nM <= 1 )
				_nM = 0;

			if ( _nM > GAMBLE_LV_MAX )
				_nM = GAMBLE_LV_MAX;
			

			// 4. 老馆 / 概流 / 饭绢 魄沥

			_N = rand() % 100;

			if ( _N <= GAMBLE_PRIZE_NORMAL )
			{
				// NORMAL
				pNewItem->CreateItem( pBaseItem->dwIndex, 0, 0, 0  );			
			}
			else if ( ( _N > GAMBLE_PRIZE_NORMAL ) && ( _N <= ( GAMBLE_PRIZE_MAGIC + GAMBLE_PRIZE_NORMAL ) ) )
			{
				// MAGIC
				int nOptionDegree = 10 + rand()%MIN((2+(4 * _nM) / 10), 30 );
				pNewItem->CreateItem( pBaseItem->dwIndex, _nM, nOptionDegree, OPTIONNUMBER_MAGIC  );	
			}
			else
			{
				// RARE
				pNewItem->CreateGambleRareItem( _nM, pBaseItem->dwIndex );
			}

#ifdef DEF_UNIQUEITEM
		}		
#endif

	}
	// 参
	else
	{
		_BASE_ITEM_* pBaseItem = (_BASE_ITEM_*)g_Base.m_GambleNormalItemChart.At( rand() % g_Base.m_GambleNormalItemChart.GetCount() );		
		pNewItem->CreateItem( pBaseItem->dwIndex, 0, 0, 0  );		
	}

	pSocketFD->pPlayer->m_pTmpGambleItem = pNewItem;
	pSocketFD->pPlayer->m_nGambleState   = GAMBLE_STATE_STOP;

	BYTE _nResult	= GAMBLE_RESULT_OK;

#ifdef _DEBUG
	char tmpStr[64];
#endif

	if ( m_pGambleBaseItem->dwIndex == pNewItem->m_dwItemIndex )
	{	
		_nResult	= GAMBLE_RESULT_LUCKITEM;

#ifdef _DEBUG
		strcpy( tmpStr, "青款 酒捞袍" );
#endif

		if ( ( pNewItem->m_nENCHANTTYPE ==  m_nGambleType ) &&
			 ( pNewItem->m_wENCHANTID ==  m_nGambleOption ) )
		{			 
			 _nResult	= GAMBLE_RESULT_LUCKITEMOPTION;

#ifdef _DEBUG
			sprintf( tmpStr, "青款 酒捞袍 & 可记" );
#endif
		}
	}
	else if ( ( pNewItem->m_nENCHANTTYPE ==  m_nGambleType ) &&
			  ( pNewItem->m_wENCHANTID ==  m_nGambleOption ) )
	{
		_nResult	= GAMBLE_RESULT_LUCKOPTION;

#ifdef _DEBUG
		strcpy( tmpStr, "青款 可记" );
#endif
	}
	else
	{
#ifdef _DEBUG
		strcpy( tmpStr, "X" );
#endif	
	}

	g_pServer->PacketSend_Gambling( pSocketFD, GAMBLE_STATE_STOP, _nResult );

	return pNewItem;
}

////////////////////////////////////////////////////////////////////////////////////////
//
////////////////////////////////////////////////////////////////////////////////////////
BOOL CGamble::GambleSell( _LPSOCKET_FD pSocketFD )
{
	if ( pSocketFD->pPlayer->m_pTmpGambleItem == NULL )
	{
		g_pServer->PacketSend_Gambling( pSocketFD, GAMBLE_STATE_SELL, GAMBLE_RESULT_FAIL );

//#ifdef _DEBUG
//		g_pServer->PacketSend_WarningMsg(pSocketFD, "No Gamble Item");	
//#endif
		return FALSE;
	}

	if ( pSocketFD->pPlayer->m_nGambleState != GAMBLE_STATE_STOP )
	{
		g_pServer->PacketSend_Gambling( pSocketFD, GAMBLE_STATE_SELL, GAMBLE_RESULT_FAIL );

//#ifdef _DEBUG
//		g_pServer->PacketSend_WarningMsg(pSocketFD, "[SELL]Gamble State: %d", pSocketFD->pPlayer->m_nGambleState);	
//#endif
		return FALSE;
	} 

	GambleClose( pSocketFD, true );
	return TRUE;
}


#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -