Files
Sun1602/Client/GameClient/CharacterCreationInfoParser.cpp
T
2022-10-26 12:25:11 +08:00

176 lines
5.8 KiB
C++

#include "SunClientPrecompiledHeader.h"
#include "CharacterCreationInfoParser.h"
#include "AppearanceResourceCode.h"
CharacterCreationInfoParser::CharacterCreationInfoParser()
{
}
CharacterCreationInfoParser::~CharacterCreationInfoParser()
{
}
void CharacterCreationInfoParser::Release()
{
Unload();
}
VOID CharacterCreationInfoParser::Init(DWORD info_pool_size)
{
creation_info_list_.clear();
}
VOID CharacterCreationInfoParser::Init(DWORD info_pool_size, char* pack_filename)
{
Init(info_pool_size);
SetPackFileName(pack_filename);
}
VOID CharacterCreationInfoParser::Unload()
{
CREATION_INFO_ITR found_itr = creation_info_list_.begin();
CREATION_INFO_ITR list_end_itr = creation_info_list_.end();
for ( ; found_itr != list_end_itr; ++found_itr)
{
CREATION_INFO* creation_info = (*found_itr);
delete creation_info;
}
creation_info_list_.clear();
}
BOOL CharacterCreationInfoParser::LoadScript(eSCRIPT_CODE script_code, BOOL is_reload)
{
if (script_code != SCRIPT_CHARACTER_CREATION_INFO)
{
return FALSE;
}
LoadScript();
return TRUE;
}
#ifdef _NA_005003_20120612_NEW_CHARACTER_MYSTIC_FOR_CLIENT
void CharacterCreationInfoParser::LoadScript()
{
int row_size = GetRowSize();
for (int row = 0; row < row_size; ++row)
{
CREATION_INFO* creation_info = new CREATION_INFO;
// 기본 클래스 타입
creation_info->class_type = GetDataBYTE("Index", row);
// 기본 클래스 이름
strncpy(&(creation_info->class_name[0]), GetDataString("Class", row), MAX_CHARNAME_LENGTH);
creation_info->class_name[MAX_CHARNAME_LENGTH] = '\0';
// 기본 클래스 설명 스트링코드
creation_info->class_description_code = GetDataDWORD("ClassStrCode", row);
// 종족 이름
strncpy(&(creation_info->class_name[0]), GetDataString("Race", row), MAX_CHARNAME_LENGTH);
creation_info->race_name[MAX_CHARNAME_LENGTH] = '\0';
// 종족 설명 스트링코드
creation_info->race_description_code = GetDataDWORD("RaceStrCode", row);
// 클래스의 기본 성별
GenderType::Value gender_type =
ResourceCode::GetBaseGenderOfClass(static_cast<eCHAR_TYPE>(creation_info->class_type));
creation_info->base_gender_type = static_cast<BYTE>(gender_type);
// 선택가능한 클래스여부
// 버서커
creation_info->enable_select_class[eCHAR_BERSERKER - 1] = GetDataDWORD("Berserker", row);
// 드래곤나이트
creation_info->enable_select_class[eCHAR_DRAGON - 1] = GetDataDWORD("Dragonknight", row);
// 섀도우
creation_info->enable_select_class[eCHAR_SHADOW - 1] = GetDataDWORD("Shadow", row);
// 발키리
creation_info->enable_select_class[eCHAR_VALKYRIE - 1] = GetDataDWORD("Valkyrie", row);
// 엘리멘탈리스트
creation_info->enable_select_class[eCHAR_ELEMENTALIST - 1] = GetDataDWORD("Elementalist", row);
// 미스틱
creation_info->enable_select_class[eCHAR_MYSTIC - 1] = GetDataDWORD("Mystic", row);
creation_info_list_.push_back(creation_info);
}
}
#else
void CharacterCreationInfoParser::LoadScript()
{
int row_size = GetRowSize();
for (int row = 0; row < row_size; ++row)
{
CREATION_INFO* creation_info = new CREATION_INFO;
// 기본 클래스 타입
creation_info->class_type = GetDataBYTE("ChaIndex", row);
// 기본 클래스 이름
strncpy(&(creation_info->class_name[0]), GetDataString("ChaName", row), MAX_CHARNAME_LENGTH);
creation_info->class_name[MAX_CHARNAME_LENGTH] = '\0';
// 기본 클래스 설명 스트링코드
creation_info->class_description_code = GetDataDWORD("ChaStrCode", row);
// 클래스의 기본 성별
creation_info->base_gender_type = GetDataBYTE("GenderType", row);
// 선택가능한 클래스여부
// 버서커
creation_info->enable_select_class[eCHAR_BERSERKER - 1] = GetDataDWORD("Berserker", row);
// 드래곤나이트
creation_info->enable_select_class[eCHAR_DRAGON - 1] = GetDataDWORD("Dragonknight", row);
// 섀도우
creation_info->enable_select_class[eCHAR_SHADOW - 1] = GetDataDWORD("Shadow", row);
// 발키리
creation_info->enable_select_class[eCHAR_VALKYRIE - 1] = GetDataDWORD("Valkyrie", row);
// 엘리멘탈리스트
creation_info->enable_select_class[eCHAR_ELEMENTALIST - 1] = GetDataDWORD("Elementalist", row);
creation_info_list_.push_back(creation_info);
}
}
#endif //_NA_005003_20120612_NEW_CHARACTER_MYSTIC_FOR_CLIENT
CREATION_INFO* CharacterCreationInfoParser::GetCreationInfo(BYTE class_type)
{
if ((class_type == eCHAR_NONE) ||
(class_type >= eCHAR_TYPE_MAX) ||
((class_type - 1) >= static_cast<BYTE>(creation_info_list_.size())))
{
return NULL;
}
return creation_info_list_[class_type - 1];
}
//------------------------------------------------------------------------------
int CharacterCreationInfoParser::GetSkinClass(eCHAR_TYPE char_class, OUT bool skin_class[/*eCHAR_TYPE_MAX*/])
{
if (char_class < eCHAR_BERSERKER || char_class >= eCHAR_TYPE_MAX)
{
return 0;
}
#ifdef _NA_005003_20120612_NEW_CHARACTER_MYSTIC_FOR_CLIENT
const DWORD kInvalidParamater = 0;
#else
const DWORD kInvalidParamater = 999999;
#endif //_NA_005003_20120612_NEW_CHARACTER_MYSTIC_FOR_CLIENT
int class_count = 0;
CREATION_INFO_LIST::iterator begin = creation_info_list_.begin();
CREATION_INFO_LIST::iterator end = creation_info_list_.end();
for (; begin != end; ++begin)
{
skin_class[(*begin)->class_type] = false;
DWORD class_parameter = (*begin)->enable_select_class[char_class - 1];
if (class_parameter != kInvalidParamater)
{
skin_class[(*begin)->class_type] = true;
++class_count;
}
}
return class_count;
}