#ifndef _CHARACTER_DOC_H_ #define _CHARACTER_DOC_H_ #include #include #include class CCharacterDoc : public CStaticSingleton { public: #pragma pack(1) // ij¸¯ÅÍ Ã£±â ±âº»Á¤º¸ struct In_CharacterIndex { TCHAR m_szCharName[16]; // ij¸¯ÅÍ À̸§ unsigned long m_UID; // ij¸¯ÅÍ UID unsigned long m_CID; // ij¸¯ÅÍ CID }; // 1°³ÀÇ ¼­¹ö±ºÀÌ °¡Áö°íÀִ ij¸¯ÅÍ struct In_ServerCharacter { unsigned long dwServerGroup; // ¼­¹ö±º Index unsigned char dwCharCount; // µî·ÏµÇ¾îÀִ ij¸¯ÅÍ In_CharacterIndex CharIdx[CGameDB::MAX_CHAR_SLOT]; // ij¸¯ÅÍ Á¤º¸ }; // ÇÊ¿äÇÑ Ç׸ñÀÌ ÀÖÀ¸¸é ¿©±â¿¡ °è¼Ó Ãß°¡Çϸ鼭 ÀÛ¾÷ÇÑ´Ù. struct CharDocInfo // MDI¿¡¼­ 1°³ÀÇ View´Â CCharDocInfoÀÇ ³»¿ëÀ» ÅëÇØ¼­ Á¤º¸¸¦ ±¸¼ºÇÑ´Ù. { typedef std::list isListCharIdx; enum STATE { EMPTY, // ¾Æ¹«·± ÀÛ¾÷À» ÇÏÁö ¾Ê´Â ij¸¯ÅÍ LOADING, // ·ÎµùÁßÀΠij¸¯ÅÍ FINISH // ·ÎµùÀÌ ¿Ï·áµÈ ij¸¯ÅÍ }; unsigned char m_cCharacterState; CDocument* m_ModifyDocument; bool m_bLoaded; unsigned long m_dwDocKey; isListCharIdx m_listTreeInfo; // Æ®¸® ÄÁÆ®·Ñ¿¡¼­ »ç¿ëÇÏ°ÔµÉ µ¥ÀÌÅÍ CModifyCharacter* m_ModifyCharacter; // ÇöÀç ÀÛ¾÷ÁßÀΠij¸¯Å͵¥ÀÌÅÍ unsigned char m_cOldServerGroup; // Part2Selectable ŸÀÔÀ϶§ ÂüÁ¶ CharDocInfo() : m_ModifyCharacter(NULL) , m_bLoaded(false) , m_ModifyDocument(NULL) , m_cCharacterState(EMPTY) {} // ÁöÁöÇÏ°Ô new, delete ¾²Áö¸»°í ¿Ø¸¸Çϸé À̳ðÀ» ¾²ÀÚ... void ReleaseCharacter() { if(m_ModifyCharacter) { delete m_ModifyCharacter; m_ModifyCharacter = NULL; } } In_CharacterIndex* GetSrvChar(unsigned long dwServer, unsigned long dwCID) { isListCharIdx::iterator pos = m_listTreeInfo.begin(); while(pos != m_listTreeInfo.end()) { if((*pos).dwServerGroup == dwServer) { for(int search = 0; (*pos).dwCharCount > search; search++) { if((*pos).CharIdx[search].m_CID == dwCID) { return ((*pos).CharIdx + search); } } } } return NULL; } CModifyCharacter* Createcharacter() { ReleaseCharacter(); if(NULL == m_ModifyCharacter) { m_ModifyCharacter = new CModifyCharacter; } return m_ModifyCharacter; } ~CharDocInfo() { m_listTreeInfo.clear(); if(NULL != m_ModifyCharacter) { delete m_ModifyCharacter; } } }; struct Zone { enum { MAX_NAME = 100, }; TCHAR m_szName[MAX_NAME]; unsigned char m_Zone; float m_fPosX; float m_fPosZ; }; struct ZoneList { typedef std::vector vecZoneList; vecZoneList ZoneInfo; void Serialize_In(char* Out_Data) { unsigned long* dwSize = reinterpret_cast(Out_Data); unsigned char* cRowCount = reinterpret_cast(Out_Data + sizeof(unsigned long)); char* cDataBody = static_cast(Out_Data + sizeof(unsigned long) + sizeof(unsigned char)); ZoneInfo.clear(); for(unsigned char cnt = 0; cnt < *cRowCount; ++cnt) { Zone* Data = reinterpret_cast< Zone* >( cDataBody + ( cnt * sizeof( Zone ) ) ); ZoneInfo.push_back( *Data ); } } bool Serialize_Out( char* In_Data, unsigned short& wLength ) { unsigned long* dwSize = reinterpret_cast< unsigned long* > ( In_Data ); unsigned char* cRowCount = reinterpret_cast< unsigned char* > ( In_Data + sizeof( unsigned long ) ); char* cDataBody = static_cast< char* > ( In_Data + sizeof( unsigned long ) + sizeof( unsigned char ) ); unsigned char cCount = 0; unsigned short wBufferLength = wLength; vecZoneList::iterator pos = ZoneInfo.begin( ); wLength = sizeof( unsigned long ) + sizeof( unsigned char ); wBufferLength ++; while( pos != ZoneInfo.end( ) ) { if( wBufferLength < ( wLength + sizeof( Zone ) ) ) return false; CopyMemory( ( cDataBody + ( cCount * sizeof( Zone ) ) ), &(*pos), sizeof( Zone ) ); wLength += sizeof( Zone ); ++cCount; ++pos; } *cRowCount = cCount; *dwSize = ( unsigned long )wLength; return true; } bool Erase( TCHAR* szName ) { vecZoneList::iterator begin = ZoneInfo.begin( ); while( begin != ZoneInfo.end( ) ) { Zone& stZone = ( *begin ); if( !_tcsicmp( szName, stZone.m_szName ) ) { ZoneInfo.erase( begin ); return true; } else { ++begin; } } return false; } vecZoneList::iterator Find( TCHAR* szName ) { vecZoneList::iterator begin = ZoneInfo.begin( ); while( begin != ZoneInfo.end( ) ) { if( false == _tcsicmp( szName, ( *begin ).m_szName ) ) { return begin; } ++begin; } return ZoneInfo.end( ); } }; struct ServerInfo { CString m_strServerName; unsigned long m_dwServerIndex; ServerInfo(CString strServerName, unsigned long dwServerIndex) : m_strServerName(strServerName), m_dwServerIndex(dwServerIndex) {} }; #pragma pack() typedef std::list islistServerInfo; typedef std::map isMapDoc; typedef islistServerInfo::iterator listServerInfoPos; public: CCharacterDoc ( ) : m_dwKey( 0 ) {} ~CCharacterDoc ( ); void Destroy(); unsigned long NextKey ( ) { return m_dwKey + 1; } unsigned long PushCharDocInfo ( CharDocInfo* lpCharDocInfo ); CharDocInfo* GetCharDocInfo ( unsigned long dwKey ); bool DeleteCharDocInfo ( unsigned long dwKey ); void PushServerGroup ( CString strServerName, unsigned long dwServerIndex ); bool GetServerIndex ( CString strServerName, unsigned long& dwServerIndex ); bool GetServerName ( unsigned long dwServerGroup, CString& strServerName ); listServerInfoPos GetServerInfoBegin ( ) { return m_listServerInfo.begin( ); } listServerInfoPos GetServerInfoEnd ( ) { return m_listServerInfo.end( ); } ZoneList& GetZoneList ( ) { return m_ZoneList; } private: unsigned long m_dwKey; isMapDoc m_mapCharDoc; islistServerInfo m_listServerInfo; ZoneList m_ZoneList; }; #endif