// Include #include "gamesrv.h" #include "RandomTable.h" #include "logprotocol.h" #include #include // Local definitions #pragma warning( disable: 4244 ) #pragma warning( disable: 4127 ) // Global data cRandomTable* cRandomTable::mpRandomTable = NULL; // cRandomTable Constructor cRandomTable::cRandomTable(void) { mpRandomTable = this; m_million = NULL; m_mOffset = 0; m_mLength = 0; m_hundred = NULL; m_hOffset = 0; m_hLength = 0; } // ~cRandomTable Destructor cRandomTable::~cRandomTable(void) { Shutdown( ); mpRandomTable = NULL; } // Initialize Method - Å×À̺í Çì´õ¿Í ÃÖ´ëÅ©±â °Ë»ç ÇÊ¿äÇÔ. bool cRandomTable::Initialize( ) { FILE* stream; size_t numread; bool retMillion = false; bool retHundred = false; // rand function ½Ãµå°ª ÃʱâÈ­. srand( (unsigned)time( NULL ) ); stream = fopen( "./Script/Resource/rand_million.", "rb" ); numread = 0; if ( stream != NULL ) { WORD type; // Çì´õÁ¤º¸ È®ÀÎ fread( &type, sizeof(type), 1, stream ); if ( type == ((WORD) ('T' << 8) | 'R') ) { // Å×À̺íÀÌ NULL ÀÌ ¾Æ´Ò°á¿ì ÇØÁ¦ ¹× ÃʱâÈ­. if ( m_million != NULL ) { GlobalFree( m_million ); m_million = NULL; } // Å×ÀÌºí ¿ÀÇÁ¼Â ÃʱâÈ­. m_mOffset = 0; // Å×À̺í ÃÖ´ë Å©±â °¡Á®¿À±â. fread( &m_mLength, sizeof(m_mLength), 1, stream ); // Å×ÀÌºí ¸Þ¸ð¸® »ý¼º. m_million = (double*)GlobalAlloc( GPTR, sizeof(double)*m_mLength ); if ( m_million != NULL ) { // Å×ÀÌºí °¡Á®¿À±â & ÃÖ´ë Å©±â¿Í ºñ±³. numread = fread( m_million, sizeof(double), m_mLength, stream ); if ( numread != m_mLength ) { GlobalFree( m_million ); m_million = NULL; } else { // Å×ÀÌºí ¿ÀÇÁ¼Â ·¥´ý¼³Á¤. m_mOffset = rand( ) % m_mLength; retMillion = true; } } } fclose( stream ); } stream = fopen( "./Script/Resource/rand_hundred.", "rb" ); numread = 0; if ( stream != NULL ) { WORD type; // Çì´õÁ¤º¸ È®ÀÎ fread( &type, sizeof(type), 1, stream ); if ( type == ((WORD) ('T' << 8) | 'R') ) { // Å×À̺íÀÌ NULL ÀÌ ¾Æ´Ò°á¿ì ÇØÁ¦ ¹× ÃʱâÈ­. if ( m_hundred != NULL ) { GlobalFree( m_hundred ); m_hundred = NULL; } // Å×ÀÌºí ¿ÀÇÁ¼Â ÃʱâÈ­. m_hOffset = 0; // Å×À̺í ÃÖ´ë Å©±â °¡Á®¿À±â. fread( &m_hLength, sizeof(m_hLength), 1, stream ); // Å×ÀÌºí ¸Þ¸ð¸® »ý¼º. m_hundred = (double*)GlobalAlloc( GPTR, sizeof(double)*m_hLength ); if ( m_hundred != NULL ) { // Å×ÀÌºí °¡Á®¿À±â & ÃÖ´ë Å©±â¿Í ºñ±³. numread = fread( m_hundred, sizeof(double), m_hLength, stream ); if ( numread != m_hLength ) { GlobalFree( m_hundred ); m_hundred = NULL; } else { // Å×ÀÌºí ¿ÀÇÁ¼Â ·¥´ý¼³Á¤. m_hOffset = rand( ) % m_hLength; retHundred = true; } } } fclose( stream ); } return (retMillion && retHundred); } // Shutdown Method void cRandomTable::Shutdown( ) { if ( m_million != NULL ) { GlobalFree( m_million ); m_million = NULL; } m_mOffset = 0; m_mLength = 0; if ( m_hundred != NULL ) { GlobalFree( m_hundred ); m_hundred = NULL; } m_hOffset = 0; m_hLength = 0; } // GetSeed Method DWORD cRandomTable::GetSeed( ) { return rand( ) % m_mLength; } // Get Method double cRandomTable::Get( ) { double value = 0; if ( m_million != NULL && m_mOffset < m_mLength ) { value = *(m_million + m_mOffset); if ( ++m_mOffset >= m_mLength ) m_mOffset = 0; } return value; } // Get Method double cRandomTable::Get(DWORD& seed) { double value = 0; if ( m_million != NULL ) { // ÃÖ´ë °ªº¸´Ù Å©°Å³ª °°À»°æ¿ì. if ( seed >= m_mLength ) seed %= m_mLength; value = *(m_million + seed); // ÃÖ´ë °ªº¸´Ù Ä¿Áø°æ¿ì.. if ( ++seed >= m_mLength ) seed = 0; } return value; } // GetSeedx100 Method DWORD cRandomTable::GetSeedx100( ) { return rand( ) % m_hLength; } // Getx100 Method double cRandomTable::Getx100( ) { double value = 0; if ( m_hundred != NULL && m_hOffset < m_hLength ) { value = *(m_hundred + m_hOffset); if ( ++m_hOffset >= m_hLength ) m_hOffset = 0; } return value; } // Getx100 Method double cRandomTable::Getx100(DWORD& seed) { double value = 0; if ( m_hundred != NULL ) { // ÃÖ´ë °ªº¸´Ù Å©°Å³ª °°À»°æ¿ì. if ( seed >= m_hLength ) seed %= m_hLength; value = *(m_hundred + seed); // ÃÖ´ë °ªº¸´Ù Ä¿Áø°æ¿ì.. if ( ++seed >= m_hLength ) seed = 0; } return value; }