Files
Sun1602/ProgramCommon/MaxGuildMemberInfoParser.cpp
T
2022-10-26 12:25:11 +08:00

159 lines
4.1 KiB
C++

#include "StdAfx.h"
#include ".\maxguildmemberinfoparser.h"
MaxGuildMemberInfoParser::MaxGuildMemberInfoParser(void)
{
}
MaxGuildMemberInfoParser::~MaxGuildMemberInfoParser(void)
{
}
VOID MaxGuildMemberInfoParser::Init( char * pszPackFileName )
{
SetPackFileName( pszPackFileName );
}
VOID MaxGuildMemberInfoParser::Release()
{
MAX_GUILDMEMBER_INFO_MAP_ITER iter;
for( iter = m_mapMaxGuildMemberInfo.begin(); iter != m_mapMaxGuildMemberInfo.end(); ++iter )
{
MaxGuildMemberInfo* pInfo = iter->second;
if( pInfo )
delete pInfo;
}
m_mapMaxGuildMemberInfo.clear();
}
BOOL MaxGuildMemberInfoParser::LoadScript( eSCRIPT_CODE ScriptCode, BOOL bReload )
{
switch( ScriptCode )
{
case SCRIPT_MAX_GUILD_MEMBER_INFO:
return _Load( bReload );
}
return FALSE;
}
//군단별 최대 인원수
BYTE MaxGuildMemberInfoParser::GetMaxMemberByCorps( BYTE Grade, BYTE byCorpsNum )
{
if( Grade >= MAX_GUILD_LEVEL )
return 0;
// 군단 최대개수는 직할 군단 포함이므로 -1 개 한다.( 군단 최대 개수는 직할군단(0) + 일반군단(7) 이다. )
if( byCorpsNum >= MAX_GUILD_CORPS_NUM - 1 )
return 0;
// eGUILD_DUTY_MAX 는 각 군단별 총 합을 가지고 있는 인자다.
MAX_GUILDMEMBER_INFO_MAP_ITER iter = m_mapMaxGuildMemberInfo.find( eGUILD_DUTY_MAX );
if( iter == m_mapMaxGuildMemberInfo.end() )
return 0;
MaxGuildMemberInfo* pInfo = iter->second;
if( !pInfo ) return 0;
//직할군단이면.. 직할군단은 길드 등급별로 인원수가 다르다. 일반 군단은 똑같다.
if( byCorpsNum == 0 )
return pInfo->m_byBaseCorpsMember[ Grade - 1 ];
else
return pInfo->m_byNormalCorpsMember;
assert(!"impossible reached point");
//return 0;
}
// 해당 군단의 직책별 최대 인원수.
BYTE MaxGuildMemberInfoParser::GetMaxCorpsMemberByDuty( BYTE Grade, BYTE byCorpsNum, eGUILD_DUTY Duty )
{
if( Grade >= MAX_GUILD_LEVEL )
return 0;
// 군단 최대개수는 직할 군단 포함이므로 -1 개 한다.( 군단 최대 개수는 직할군단(0) + 일반군단(7) 이다. )
if( byCorpsNum >= ( MAX_GUILD_CORPS_NUM - 1 ) )
return 0;
if( Duty >= eGUILD_DUTY_MAX )
return 0;
// eGUILD_DUTY_MAX 는 각 군단별 총 합을 가지고 있는 인자다.
MAX_GUILDMEMBER_INFO_MAP_ITER iter = m_mapMaxGuildMemberInfo.find( Duty );
if( iter == m_mapMaxGuildMemberInfo.end() )
return 0;
MaxGuildMemberInfo* pInfo = iter->second;
if( !pInfo ) return 0;
//직할군단이면.. 직할군단은 길드 등급별로 인원수가 다르다. 일반 군단은 똑같다.
if( byCorpsNum == 0 )
return pInfo->m_byBaseCorpsMember[ Grade - 1 ];
else
return pInfo->m_byNormalCorpsMember;
assert(!"impossible reached point");
//return 0;
}
//#pragma warning ( push )
//#pragma warning ( disable : 4244)
BOOL MaxGuildMemberInfoParser::_Load( BOOL bReload )
{
__UNUSED(bReload);
MaxGuildMemberInfo* pSum = new MaxGuildMemberInfo;
ZeroMemory( pSum, sizeof(pSum) );
int nRowSize = GetRowSize();
for( int nRow = 0; nRow < nRowSize; ++nRow )
{
MaxGuildMemberInfo* pInfo = new MaxGuildMemberInfo;
pInfo->m_GuildDuty = (eGUILD_DUTY)GetDataInt( "iIndex", nRow );
strncpy( pInfo->m_szGuildDutyName, GetDataString( "GuildDutyName", nRow ), MAX_CHARNAME_LENGTH );
TCHAR szTemp[MAX_FIELD_NAME_SIZE];
for( int i = 0 ; i < MAX_GUILD_LEVEL; i++ )
{
_snprintf( szTemp, MAX_FIELD_NAME_SIZE, "DirectCorps%dNum\0", i+1 );
pInfo->m_byBaseCorpsMember[i] = GetDataBYTE( szTemp, nRow );
pSum->m_byBaseCorpsMember[i] += pInfo->m_byBaseCorpsMember[i];
}
pInfo->m_byNormalCorpsMember = GetDataBYTE( "CorpsNum", nRow );
pSum->m_byNormalCorpsMember += pInfo->m_byNormalCorpsMember;
if( !m_mapMaxGuildMemberInfo.insert( std::make_pair( pInfo->m_GuildDuty, pInfo ) ).second )
delete pInfo;
}
strncpy( pSum->m_szGuildDutyName, "SUM", MAX_CHARNAME_LENGTH );
pSum->m_GuildDuty = eGUILD_DUTY_MAX;
if( !m_mapMaxGuildMemberInfo.insert( std::make_pair( pSum->m_GuildDuty, pSum ) ).second )
delete pSum;
return TRUE;
}
//#pragma warning ( pop )
MaxGuildMemberInfo* MaxGuildMemberInfoParser::FindInfo( eGUILD_DUTY Duty )
{
MAX_GUILDMEMBER_INFO_MAP_ITER iter;
iter = m_mapMaxGuildMemberInfo.find( Duty );
if( iter != m_mapMaxGuildMemberInfo.end() )
{
MaxGuildMemberInfo* pInfo = iter->second;
if( pInfo )
return pInfo;
}
return NULL;
}