📄 gamble.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 + -