Restructure repository to include all source folders

Move git root from Client/ to src/ to track all source code:
- Client: Game client source (moved to Client/Client/)
- Server: Game server source
- GameTools: Development tools
- CryptoSource: Encryption utilities
- database: Database scripts
- Script: Game scripts
- rylCoder_16.02.2008_src: Legacy coder tools
- GMFont, Game: Additional resources

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-11-29 20:17:20 +09:00
parent 5d3cd64a25
commit dd97ddec92
11602 changed files with 1446576 additions and 0 deletions

View File

@@ -0,0 +1,504 @@
#ifndef _BinTree_H_
#define _BinTree_H_
#include <assert.h>
#include <stdexcept>
#include <vector>
using namespace std;
#pragma warning(disable:4786) //STL<54><4C> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Warning<6E><67> <20><><EFBFBD>ֱ<EFBFBD> <20><><EFBFBD><EFBFBD>..
typedef unsigned char byte;
/////////////////////////////////////////////////////////////////////////////
//
int Power( int x, unsigned y )
{
int result = 1;
for( unsigned i = 0; i < y; i++ )
{
result *= x;
}
return result;
}
//LOGxY<78><59><EFBFBD><EFBFBD> <20>Ҽ<EFBFBD><D2BC><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD> <20><><EFBFBD>ϵȴ<CFB5>.
int LogInt( unsigned x, unsigned y )
{
int i = 0;
while( y >= x )
{
i++;
y /= x;
}
return i;
}
/////////////////////////////////////////////////////////////////////////////
// <09><><EFBFBD><EFBFBD> Ʈ<><C6AE> - 1<><31><EFBFBD><EFBFBD> <20><EFBFBD><E8BFAD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ϹǷ<CFB9> 0 ... n <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȸ<EFBFBD><C8B8> <20>ϸ<EFBFBD>
// <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȸ(level-order-traversal)<29><> <20><>.
// <09>ε<EFBFBD><CEB5><EFBFBD> 0<><30> ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
template < class T >
class CBinTree
{
public:
typedef void (*SAVEFUNC)( FILE *, const T & );
typedef void (*LOADFUNC)( FILE *, T & );
public:
////////////////<2F><>ƿ<EFBFBD><C6BF>Ƽ <20>Լ<EFBFBD><D4BC><EFBFBD>/////////////////////
//<2F><><EFBFBD>ϰ<EFBFBD> 0<><30> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ǹ<EFBFBD><C7B9><EFBFBD>.
static unsigned Root() { return 1; }
static unsigned Parent( unsigned index ) { return index / 2; }
static unsigned LeftChild( unsigned index ) { return index * 2; }
static unsigned RightChild( unsigned index ) { return index * 2 + 1; }
static unsigned LevelAtIndex( unsigned index ) { return LogInt( x, index ); }
static unsigned IndexAtLevel( unsigned nLevel ) { return int( Power( 2, nLevel ) ); }
////////////////////////////////////////////////////
protected:
struct SNode
{
T data; //<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
byte isRed : 1;
byte isValid : 1;
byte isLeaf : 1;
};
protected:
typedef vector<SNode> DATACONTAINER;
DATACONTAINER m_vecTreeData;
protected:
void LoadExtraInfo( SNode & node, FILE * fp )
{
unsigned char c = 0;
fread( &c, sizeof( c ), 1, fp );
node.isRed = ( c & 0x01 ) >> 0;
node.isValid = ( c & 0x02 ) >> 1;
node.isLeaf = ( c & 0x04 ) >> 2;
}
void SaveExtraInfo( SNode & node, FILE * fp )
{
unsigned char c = 0;
c = ( node.isRed << 0 ) | ( node.isValid << 1 ) | ( node.isLeaf << 2 );
assert( ( ( c & 0x01 ) >> 0 ) == node.isRed );
assert( ( ( c & 0x02 ) >> 1 ) == node.isValid );
assert( ( ( c & 0x04 ) >> 2 ) == node.isLeaf );
fwrite( &c, sizeof( c ), 1, fp );
}
public:
///////////////////<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̽<EFBFBD>////////////////////
CBinTree()
{
}
~CBinTree()
{
Destroy();
}
void Create()
{
Destroy();
m_vecTreeData.push_back( SNode() ); //<2F>Ѹ<EFBFBD><D1B8><EFBFBD><EFBFBD><EFBFBD> <20>߰<EFBFBD>
for( unsigned i = 0; i < m_vecTreeData.size(); i++ ) //<2F><><EFBFBD><EFBFBD> <20><>ȿ(invalid) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
{
m_vecTreeData[i].isValid = 0;
m_vecTreeData[i].isLeaf = 1;
}
m_vecTreeData[0].isValid = 1;
}
void Create( FILE * fp, LOADFUNC LoadData )
{
Destroy();
if( LoadData == 0 )
return;
if( fp == 0 )
return;
unsigned size = 0;
fread( &size, sizeof( unsigned ), 1, fp );
m_vecTreeData.push_back( SNode() );
for( unsigned i = 1; i < size; i++ )
{
m_vecTreeData.push_back( SNode() );
assert( m_vecTreeData.size() == ( i + 1 ) );
LoadData( fp, m_vecTreeData[i].data );
LoadExtraInfo( m_vecTreeData[i], fp );
}
}
void Destroy()
{
m_vecTreeData.clear();
}
void Save( FILE * fp, SAVEFUNC SaveData )
{
if( SaveData == 0 )
return;
if( fp == 0 )
return;
unsigned size = m_vecTreeData.size();
fwrite( &size, sizeof( unsigned ), 1, fp );
for( unsigned i = 1; i < size; i++ )
{
SaveData( fp, m_vecTreeData[i].data );
SaveExtraInfo( m_vecTreeData[i], fp );
}
}
//////////////////////////////////////////////////
T & SetData( unsigned index )
{
if( index >= m_vecTreeData.size() )
{
m_vecTreeData.resize( index + 1 );
}
m_vecTreeData[ index ].isValid = true;
m_vecTreeData[ Parent( index ) ].isLeaf = false;
return m_vecTreeData[ index ].data;
}
const T & GetData( unsigned index )
{
if( index >= m_vecTreeData.size() )
throw out_of_range( "index out of range(at CBinTree::GetData)" );
return m_vecTreeData[ index ].data;
}
//////////////////////////////////////////////////
bool IsEmpty()
{
if( m_vecTreeData.size() < 2 )
return true;
if( m_vecTreeData[1].isValid == false )
return true;
return false;
}
bool IsValid( unsigned index )
{
if( index >= m_vecTreeData.size() )
return false;
return m_vecTreeData[ index ].isValid == 1;
}
bool IsLeaf( unsigned index )
{
if( index >= m_vecTreeData.size() )
return true;
return m_vecTreeData[ index ].isLeaf == 1;
}
unsigned Capacity()
{
return m_vecTreeData.capacity();
}
unsigned Size()
{
return m_vecTreeData.size();
}
unsigned Min( unsigned index ) //index<65><78> <20>ڽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>ּҰ<D6BC><D2B0><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
{
while( LeftChild( index ) < m_vecTreeData.size() && IsValid( LeftChild( index ) ) )
index = LeftChild( index );
return index;
}
unsigned Max( unsigned index ) //index<65><78> <20>ڽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>ִ밪<D6B4><EBB0AA> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
{
while( RightChild( index ) < m_vecTreeData.size() && IsValid( RightChild( index ) ) )
index = RightChild( index );
return index;
}
//////////////////////////////////////////////////
class iterator_base
{
protected:
CBinTree * m_pBinTree;
unsigned m_uiCurIndex;
public:
iterator_base( CBinTree * pBinTree, unsigned index )
: m_pBinTree( pBinTree ), m_uiCurIndex( index )
{
}
T & operator*() const
{
return m_pBinTree->m_vecTreeData[m_uiCurIndex].data;
}
T * operator->() const
{
return (&**this);
}
bool operator==( iterator_base & rhs ) const
{
if( m_pBinTree == rhs.m_pBinTree && m_uiCurIndex == rhs.m_uiCurIndex )
return true;
else
return false;
}
bool operator!=( iterator_base & rhs ) const
{
return !operator==( rhs );
}
bool IsValid() const
{
if( m_pBinTree != NULL && m_uiCurIndex != 0 )
return true;
else
return false;
}
unsigned GetIndex() const
{
return m_uiCurIndex;
}
};
//////////////////////////////////////////////////
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȸ - 1 2 4 8 9 5 10 11 3 6 12 13 7 14 15
class iterator_preorder : public iterator_base
{
protected:
void Inc()
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȿ<EFBFBD><C8BF> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȿ<EFBFBD>ϸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
//<2F><><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD> <20><>ȿ<EFBFBD>ϸ<EFBFBD> <20>θ<EFBFBD><CEB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ư<EFBFBD><C6B0><EFBFBD>.
//<2F>θ<EFBFBD> <20><><EFBFBD><20><EFBFBD>ߴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD≯<EFBFBD> <20>Ǵٽ<C7B4> <20>θ<EFBFBD><CEB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
if( m_pBinTree->IsValid( LeftChild( m_uiCurIndex ) ) )
m_uiCurIndex = LeftChild( m_uiCurIndex );
else if( m_pBinTree->IsValid( RightChild( m_uiCurIndex ) ) )
m_uiCurIndex = RightChild( m_uiCurIndex );
else
{
unsigned tempIndex;
while( m_uiCurIndex == RightChild( tempIndex = Parent( m_uiCurIndex ) )
|| !m_pBinTree->IsValid( RightChild( tempIndex ) ) )
{
m_uiCurIndex = tempIndex;
if( m_uiCurIndex == 0 )
return;
}
m_uiCurIndex = RightChild( tempIndex );
}
}
void Dec()
{
//<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD> ȣ<><C8A3><EFBFBD>ϸ<EFBFBD> <20>ٷ<EFBFBD> end<6E><64> <20>Ǿ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>س<EFBFBD><D8B3><EFBFBD>.
m_uiCurIndex = 0;
}
public:
iterator_preorder( CBinTree * pBinTree, unsigned index )
: iterator_base( pBinTree, index )
{
}
iterator_preorder & operator++()
{
Inc();
return (*this);
}
iterator_preorder operator++(int)
{
iterator_preorder tmp = *this;
Inc();
return tmp;
}
iterator_preorder & operator--()
{
Dec();
return (*this);
}
iterator_preorder operator--(int)
{
iterator_preorder tmp = *this;
Dec();
return tmp;
}
};
//////////////////////////////////////////////////
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȸ - 8 4 9 2 10 5 11 1 12 6 13 3 14 7 15
class iterator_inorder
{
protected:
void Inc()
{
//Leftmost<73><74> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>.
if( m_pBinTree->IsValid( RightChild( m_uiCurIndex ) ) )
m_uiCurIndex = Min( RightChild( m_uiCurIndex ) );
else
{
unsigned tempIndex;
while( m_uiCurIndex == RightChild( tempIndex = Parent( m_uiCurIndex ) ) )
m_uiCurIndex = tempIndex;
m_uiCurIndex = tempIndex;
}
}
void Dec()
{
if( m_pBinTree->IsValid( LeftChild( m_uiCurIndex ) ) )
m_uiCurIndex = Max( LeftChild( m_uiCurIndex ) );
else
{
unsigned tempIndex;
while( m_uiCurIndex == LeftChild( tempIndex = Parent( m_uiCurIndex ) ) )
m_uiCurIndex = tempIndex;
m_uiCurIndex = tempIndex;
}
}
public:
iterator_inorder( CBinTree * pBinTree, unsigned index )
: iterator_base( pBinTree, index )
{
}
iterator_inorder & operator++()
{
Inc();
return (*this);
}
iterator_inorder operator++(int)
{
iterator_inorder tmp = *this;
Inc();
return tmp;
}
iterator_inorder & operator--()
{
Dec();
return (*this);
}
iterator_inorder operator--(int)
{
iterator_inorder tmp = *this;
Dec();
return tmp;
}
};
//////////////////////////////////////////////////
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȸ - 0~n<><6E><EFBFBD><EFBFBD> <20><><EFBFBD>ʴ<EFBFBD><CAB4><EFBFBD> <20><>ȸ<EFBFBD>ϸ<EFBFBD> <20><>.
class iterator_levelorder
{
public:
iterator_levelorder( CBinTree * pBinTree, unsigned index )
: iterator_base( pBinTree, index )
{
}
iterator_levelorder & operator++()
{
m_uiCurIndex++;
return (*this );
}
iterator_levelorder operator++(int)
{
iterator_levelorder tmp = *this;
m_uiCurIndex++;
return tmp;
}
iterator_levelorder & operator--()
{
m_uiCurIndex--;
return (*this);
}
iterator_levelorder operator--(int)
{
iterator_levelorder tmp = *this;
m_uiCurIndex--;
return tmp;
}
};
iterator_preorder Begin_preorder() { return iterator_preorder( this, 1 ); }
iterator_levelorder Begin_levelorder() { return iterator_levelorder( this, 1 ); }
iterator_preorder End_preorder() { return iterator_preorder( this, 0 ); }
iterator_levelorder End_levelorder() { return iterator_levelorder( this, m_TreeData.size() ); }
friend class iterator_base;
};
#endif