Files
Sun1602/Achievement/AchievementParser.cpp
2022-10-26 12:25:11 +08:00

177 lines
5.8 KiB
C++

#include "StdAfx.h"
#include ".\AchievementSearch.h"
AchievementParser::AchievementParser(void) : script_data_table_(NULL)
{
}
AchievementParser::~AchievementParser(void)
{
}
VOID AchievementParser::Release()
{
if (script_data_table_ == NULL) {
return;
};
script_data_table_->SetFirst();
while (Achievement_ParserInfo * row_info = script_data_table_->GetNext())
{
delete row_info;
}
script_data_table_->RemoveAll();
delete script_data_table_;
script_data_table_ = NULL;
AchievementSearch::Instance()->DestroyInstance();
}
VOID AchievementParser::Init(DWORD dwPoolSize)
{
ASSERT( script_data_table_ == NULL );
script_data_table_ = new util::SolarHashTable<Achievement_ParserInfo*>;
script_data_table_->Initialize( dwPoolSize );
}
VOID AchievementParser::Init(DWORD dwPoolSize , char *pszPackFileName)
{
Init(dwPoolSize);
SetPackFileName( pszPackFileName );
}
BOOL AchievementParser::LoadScript( eSCRIPT_CODE ScriptCode, BOOL bReload )
{
//C_NA_0_20100520_ACSYSTEM_CHANGED
if( ScriptCode == SCRIPT_ACHIEVEMENT_INFO)
return _Load( bReload );
return FALSE;
}
Achievement_ParserInfo * AchievementParser::GetRowData(WORD index, BOOL reload)
{
__UNUSED(reload);
Achievement_ParserInfo* row_info = script_data_table_->GetData(index);
if (row_info == NULL)
{
row_info = new Achievement_ParserInfo;
// NOTE: f110520.3L, prevent garbage data in a storage
ZeroMemory(row_info, sizeof(*row_info));
row_info->index_ = index;
script_data_table_->Add(row_info, row_info->index_);
}
#if !defined(_SERVER)
else
{
TCHAR string[255] = {0,};
sprintf(string, "AcScript.txt 索引:%d 个重复!! 请确认.", index);
::MessageBox(NULL, string, "error", MB_OK);
}
#endif //_SERVER
return row_info;
}
BOOL AchievementParser::_Load(BOOL reload)
{
__UNUSED(reload);
const int max_rows = GetRowSize();
if (max_rows > MAX_ACHIEVEMENT_COUNT)
{
ASSERT("已超过最大成就数.");
SUNLOG(eCRITICAL_LOG, "["__FUNCTION__"] AC MaxCount 错误!/ 已超过角色的最大可达成成就。");
};
for (int row = 0; row < max_rows; ++row)
{
WORD index = GetDataWORD( "Index", row );
Achievement_ParserInfo* row_info = GetRowData(index, reload);
// side-effects of calling GetRowData are to make cleared data and to align the index.
//row_info->index_ = index;
row_info->location_code_ = GetDataWORD("LocationString", row);
row_info->object_string_code_ = GetDataDWORD("ObejctString", row);
row_info->tooltip_string_code_ = GetDataDWORD("ToolTipString", row);
row_info->icon_code_ = GetDataDWORD("Icon", row);
row_info->object_type_ = GetDataBYTE("ObjectType", row);
#ifdef _NA_006541_RENEWER_ACDIALOG
row_info->lower_group_index_ = GetDataInt("LocationOrder",row);
row_info->lower_group_string_= row_info->location_code_;
row_info->upper_group_index_ = GetDataInt("CroupOrder",row);
row_info->upper_group_string_= GetDataDWORD("CroupString",row);
#endif
//_NA_001990_ACSYSTEM_ADD
row_info->class_type_ = GetDataDWORD("Class", row);
if (row_info->class_type_ >= eCHAR_TYPE_MAX)
{
ASSERT( "ACScript.txt 的类超过最大类型.");
__debugbreak();
}
//
static const char* column_parent_names[MAX_ACHIEVEMENT_PARENT_CODE] = {
"ParentACCode1", "ParentACCode2", "ParentACCode3", "ParentACCode4",
};
for (int i = 0; i < _countof(column_parent_names); ++i)
{
row_info->parent_ac_code_[i] = GetDataWORD(column_parent_names[i], row);
};
//
//_NA_001990_ACSYSTEM_ADD
static const char* column_object_code_names[MAX_ACHIEVEMENT_OBJECT] = {
"ObjectCode1", "ObjectCode2", "ObjectCode3", "ObjectCode4", "ObjectCode5",
"ObjectCode6", "ObjectCode7", "ObjectCode8", "ObjectCode9", "ObjectCode10",
};
//_NA_001990_ACSYSTEM_ADD
static const char* column_object_num_names[MAX_ACHIEVEMENT_OBJECT] = {
"ObjectNum1", "ObjectNum2", "ObjectNum3", "ObjectNum4", "ObjectNum5",
"ObjectNum6", "ObjectNum7", "ObjectNum8", "ObjectNum9", "ObjectNum10",
};
BOOST_STATIC_ASSERT(_countof(column_object_code_names) ==
_countof(column_object_num_names));
for (int i = 0; i < _countof(column_object_code_names); ++i)
{
row_info->obejcts_[i].object_code_ = GetDataWORD(column_object_code_names[i], row);
row_info->obejcts_[i].object_number_ = GetDataWORD(column_object_num_names[i], row);
};
//
static const char* column_reward_type_names[MAX_ACHIEVEMENT_REWARD] = {
"RewardType1", "RewardType2",
};
static const char* column_reward_code_names[MAX_ACHIEVEMENT_REWARD] = {
"RewardCode1", "RewardCode2",
};
BOOST_STATIC_ASSERT(_countof(column_reward_type_names) ==
_countof(column_reward_code_names));
for (int i = 0; i < _countof(column_reward_type_names); ++i)
{
Achievement_ParserInfo_Reward* const reward = &row_info->rewards_[i];
reward->reward_type_ = GetDataWORD(column_reward_type_names[i], row);
if (reward->reward_type_ == ACHIEVEMENT_REWARD_NONE) {
continue;
};
++row_info->rewards_count_;
reward->reward_code_ = GetDataWORD(column_reward_code_names[i], row);
};
//
AchievementSearch::Instance()->AddAchievementParserInfo(row_info);
//
}
return TRUE;
}
Achievement_ParserInfo * AchievementParser::GetAchievement_ParserInfo( WORD key )
{
return script_data_table_->GetData( key );
}