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

622 lines
18 KiB
C++

#include "StdAfx.h"
#if defined(_NA_008121_20150311_EQUIPMENT_AWAKENING_SYSTEM) || defined(_NA_008124_20150313_AWAKENING_SYSTEM)
#include "AwakeningInfoParser.h"
#include "ItemInfoParser.h"
AwakeningInfoParser::AwakeningInfoParser(void)
{
}
AwakeningInfoParser::~AwakeningInfoParser(void)
{
}
void AwakeningInfoParser::Init( DWORD pool_size )
{
}
void AwakeningInfoParser::Init( DWORD pool_size, char* pszPackFileName )
{
SetPackFileName(pszPackFileName);
}
void AwakeningInfoParser::Release()
{
Unload();
}
void AwakeningInfoParser::Unload()
{
AwakeningInfo_Hash::const_iterator it, end( awakeninginfo_hash_.end() );
for(it = awakeninginfo_hash_.begin() ; it != end ; ++it)
{
AwakeningInfo* info = (it->second);
info->awakening_level_info_map.clear();
SAFE_DELETE(info);
}
awakeninginfo_hash_.clear();
}
BOOL AwakeningInfoParser::_Load( BOOL is_reload )
{
if ( is_reload == TRUE )
{
awakeninginfo_hash().clear();
}
int nRowSize = GetRowSize();
for ( int nRow = 0; nRow < nRowSize; ++nRow )
{
AwakeningInfo* info = new AwakeningInfo();
info->item_code = GetDataDWORD("ItemCode", nRow);
info->item_name = GetDataString("ItemName", nRow);
info->awake_separation = GetDataDWORD("AwakeSeparation", nRow);
TCHAR attribute_string[2048] = {0, };
#ifdef _NA_008536_20151030_AWAKENING_MATERIAL_AMOUNT_ADD
for ( int i = 0; i < AwakeningInfo::MAX_ALLROUND_MATERIAL; ++i )
{
AllRoundMaterialInfo allround_material_info;
sprintf(attribute_string, _T("AllroundMaterialCode%d"), i + 1);
allround_material_info.allround_material_code = GetDataDWORD(attribute_string, nRow);
if (allround_material_info.allround_material_code == 0)
{
continue;
}
sprintf(attribute_string, _T("AllroundMaterialCount%d"), i + 1);
allround_material_info.allround_material_count = GetDataBYTE(attribute_string, nRow);
info->allround_material_info_list.push_back(allround_material_info);
}
#else
for ( int i = 0; i < AwakeningInfo::MAX_ALLROUND_MATERIAL; ++i )
{
CODETYPE allround_material_code = 0;
sprintf(attribute_string, _T("AllroundMaterialCode%d"), i + 1);
allround_material_code = GetDataDWORD(attribute_string, nRow);
info->allround_material_code_map.insert(allround_material_code);
}
#endif // _NA_008536_20151030_AWAKENING_MATERIAL_AMOUNT_ADD
info->awake_permit_level = GetDataBYTE("AwakeLimitLevel", nRow);
info->additive_item_code = GetDataDWORD("AdditiveItemCode", nRow);
info->additive_count = GetDataBYTE("AdditiveCount", nRow);
info->probability_success = GetDataBYTE("ProbabilitySuccess", nRow);
info->optType = GetDataBYTE("OptionType", nRow); //xiaomi add Awakening
info->optKind = GetDataBYTE("OptionKind", nRow);
for ( int i = 1; i <= MAX_AWAKENING_GRADE; ++i )
{
DWORD awakening_level_info = 0;
sprintf(attribute_string, _T("OptionParam%d"), i);
awakening_level_info = GetDataDWORD(attribute_string, nRow);
info->awakening_level_info_map.insert(std::make_pair(i, awakening_level_info));
}
info->addKind = GetDataBYTE("AddOptionKind", nRow);//GetDataBYTE("AddOptionKind", nRow);
info->addType = GetDataBYTE("AddOptionType", nRow);//GetDataBYTE("AddOptionType", nRow);
for ( int i = 1; i <= MAX_AWAKENING_GRADE; ++i )
{
DWORD awakening_leveladd_info = 0;
sprintf(attribute_string, _T("AddOptionValue%d"), i);
awakening_leveladd_info = GetDataDWORD(attribute_string, nRow);
info->awakening_level_addinfo_map.insert(std::make_pair(i, awakening_leveladd_info));
}
info->evolution_item_code = GetDataDWORD("EvolutionItemCode", nRow);
info->evolution_additive_item_code = GetDataDWORD("EvolutionAdditiveItemCode", nRow);
info->evolution_additive_count = GetDataBYTE("EvolutionAdditiveItemCount", nRow);
info->evolution_probability_success = GetDataBYTE("EvolutionProbabilitySuccess", nRow);
AwakeningInfo_Hash::_Pairib result = awakeninginfo_hash().insert(
AwakeningInfo_Hash::value_type(static_cast<DWORD>(info->item_code), info));
ASSERT(result.second == true);
}
return TRUE;
}
BOOL AwakeningInfoParser::LoadScript( eSCRIPT_CODE script_code, BOOL is_reload )
{
switch ( script_code )
{
case SCRIPT_AWAKENING_INFO:
return _Load(is_reload);
}
return FALSE;
}
const AwakeningInfo* AwakeningInfoParser::FindData( const CODETYPE& item_code ) const
{
AwakeningInfo_Hash::const_iterator begin_iterator = awakeninginfo_hash_.begin(),
end_iterator = awakeninginfo_hash_.end();
for ( ; begin_iterator != end_iterator; ++begin_iterator )
{
const AwakeningInfo* find_info = begin_iterator->second;
if ( find_info->item_code == item_code )
{
return find_info;
}
}
return NULL;
}
RC::eITEM_RESULT
AwakeningInfoParser::ResultAwakeningCheck( const SCItemSlot& equip_item,
const SCItemSlot& material_item,
const SCItemSlot& additive_item )
{
RC::eITEM_RESULT result_code = PermitEquipmentCheck(equip_item);
if ( result_code != RC::RC_ITEM_SUCCESS )
{
return result_code;
}
#ifdef _NA_008536_20151030_AWAKENING_MATERIAL_AMOUNT_ADD
result_code = PermitMaterialCheck(equip_item.GetCode(), material_item.GetCode(), material_item.GetNum());
#else
result_code = PermitMaterialCheck(equip_item.GetCode(), material_item.GetCode());
#endif // _NA_008536_20151030_AWAKENING_MATERIAL_AMOUNT_ADD
if ( result_code != RC::RC_ITEM_SUCCESS )
{
return result_code;
}
result_code = PermitAdditiveCheck(equip_item, material_item, additive_item);
if ( result_code != RC::RC_ITEM_SUCCESS )
{
return result_code;
}
return RC::RC_ITEM_SUCCESS;
}
RC::eITEM_RESULT
AwakeningInfoParser::PermitEquipmentCheck( const SCItemSlot& equip_item )
{
if (equip_item.IsShellItem() == true || equip_item.IsEtheriaItem() == true)
{
return RC::RC_EQUIPMENT_AWAKENING_INVALID_EQUIP_INFO;
}
const AwakeningInfo* awakening_info = FindData(equip_item.GetCode());
if ( awakening_info == NULL )
{
return RC::RC_EQUIPMENT_AWAKENING_INVALID_EQUIP_INFO;
}
if ( equip_item.GetAwakening() >= MAX_AWAKENING_GRADE )
{
return RC::RC_EQUIPMENT_AWAKENING_EQUIP_MAX_LEVEL;
}
if ( equip_item.GetAwakening() >= awakening_info->awake_permit_level )
{
return RC::RC_EQUIPMENT_AWAKENING_EQUIP_EXCEEDED_PERMIT_LEVEL;
}
return RC::RC_ITEM_SUCCESS;
}
#ifdef _NA_008536_20151030_AWAKENING_MATERIAL_AMOUNT_ADD
RC::eITEM_RESULT
AwakeningInfoParser::PermitMaterialCheck( const CODETYPE equip_item_code,
const CODETYPE material_item_code,
const DURATYPE material_item_num )
{
const AwakeningInfo* awakening_info = FindData(equip_item_code);
if ( awakening_info == NULL )
{
return RC::RC_EQUIPMENT_AWAKENING_INVALID_EQUIP_INFO;
}
// 재료 정보가 없을 때 만능재료 검사.
return IsAllroundMaterial(equip_item_code, material_item_code, material_item_num);
}
#else
RC::eITEM_RESULT
AwakeningInfoParser::PermitMaterialCheck( const CODETYPE equip_item_code,
const CODETYPE material_item_code )
{
const AwakeningInfo* awakening_info = FindData(equip_item_code);
#ifdef _NA_000000_20150424_AWAKENING_FROM_SEPARATION
const AwakeningInfo* awakening_material_info = FindData(material_item_code);
#endif // _NA_000000_20150424_AWAKENING_FROM_SEPARATION
if ( awakening_info == NULL )
{
return RC::RC_EQUIPMENT_AWAKENING_INVALID_EQUIP_INFO;
}
#ifdef _NA_000000_20150424_AWAKENING_FROM_SEPARATION
if ( awakening_material_info == NULL )
#endif // _NA_000000_20150424_AWAKENING_FROM_SEPARATION
{
// 재료 정보가 없을 때 만능재료 검사.
if ( IsAllroundMaterial(equip_item_code, material_item_code) == true )
{
return RC::RC_ITEM_SUCCESS;
}
return RC::RC_EQUIPMENT_AWAKENING_INVALID_MATERIAL_INFO;
}
#ifdef _NA_000000_20150424_AWAKENING_FROM_SEPARATION
else
{
if ( awakening_info->awake_separation == awakening_material_info->awake_separation )
{
return RC::RC_ITEM_SUCCESS;
}
}
return RC::RC_EQUIPMENT_AWAKENING_DOES_NOT_MATCH_MATERIAL;
#endif // _NA_000000_20150424_AWAKENING_FROM_SEPARATION
}
#endif // _NA_008536_20151030_AWAKENING_MATERIAL_AMOUNT_ADD
RC::eITEM_RESULT
AwakeningInfoParser::PermitAdditiveCheck( const SCItemSlot& equip_item,
const SCItemSlot& material_item,
const SCItemSlot& additive_item )
{
if (additive_item.IsShellItem() == true)
{
return RC::RC_EQUIPMENT_AWAKENING_DOES_NOT_MATCH_ADDITIVE;
}
const AwakeningInfo* awakening_info = FindData(equip_item.GetCode());
if ( awakening_info == NULL )
{
return RC::RC_EQUIPMENT_AWAKENING_INVALID_EQUIP_INFO;
}
int result_awakening_level = GetResultAwakening(equip_item, material_item.GetCode(), material_item.GetAwakening());
int need_additive_number = awakening_info->additive_count;
std::map<BYTE, DWORD>::const_iterator iter;
iter = awakening_info->awakening_level_info_map.find(result_awakening_level);
if ( iter == awakening_info->awakening_level_info_map.end() )
{
return RC::RC_EQUIPMENT_AWAKENING_INVALID_AWAKENING_INFO;
}
if ( additive_item.GetCode() != awakening_info->additive_item_code )
{
return RC::RC_EQUIPMENT_AWAKENING_DOES_NOT_MATCH_ADDITIVE;
}
if ( additive_item.GetNum() < need_additive_number )
{
return RC::RC_EQUIPMENT_AWAKENING_DOES_NOT_MATCH_ADDITIVE_AMOUNT;
}
return RC::RC_ITEM_SUCCESS;
}
const DWORD
AwakeningInfoParser::GetOptionValue( const CODETYPE equip_item_code,
const BYTE awakening_grade )
{
const AwakeningInfo* awakening_info = FindData(equip_item_code);
if ( awakening_info == NULL )
{
return 0;
}
if (awakening_grade <= 0 || awakening_grade > MAX_AWAKENING_GRADE)
{
return 0;
}
std::map<BYTE, DWORD>::const_iterator iter;
iter = awakening_info->awakening_level_info_map.find(awakening_grade);
if ( iter == awakening_info->awakening_level_info_map.end() )
{
return 0;
}
return (iter->second);
}
const BYTE
AwakeningInfoParser::GetResultAwakening( const SCItemSlot& equip_item,
const CODETYPE material_item_code,
const BYTE material_awakening)
{
BYTE material_awakening_grade = 0;
const BASE_ITEMINFO* material_info = ItemInfoParser::Instance()->GetItemInfo(material_item_code);
if (material_info != NULL)
{
if (material_info->m_wType == eITEMTYPE_AWAKENING_ALLROUND_MATERIAL)
{
material_awakening_grade = material_info->m_iOptionValue[0];
}
else
{
material_awakening_grade = material_awakening + 1;
}
}
BYTE result_awakening_grade = equip_item.GetAwakening() + material_awakening_grade;
if ( result_awakening_grade >= MAX_AWAKENING_GRADE )
{
result_awakening_grade = MAX_AWAKENING_GRADE;
}
const AwakeningInfo* awakening_info = FindData(equip_item.GetCode());
if ( awakening_info != NULL && result_awakening_grade >= (awakening_info->awake_permit_level) )
{
result_awakening_grade = awakening_info->awake_permit_level;
}
return result_awakening_grade;
}
const int
AwakeningInfoParser::GetSuccessProbability( const SCItemSlot& equip_item,
const CODETYPE material_item_code,
const BYTE material_awakening )
{
BYTE result_awakening = AwakeningInfoParser::Instance()->GetResultAwakening(equip_item, material_item_code, material_awakening);
const AwakeningInfo* awakening_info = FindData(equip_item.GetCode());
if (awakening_info == NULL)
{
return 0;
}
return awakening_info->probability_success;
}
#ifdef _NA_008536_20151030_AWAKENING_MATERIAL_AMOUNT_ADD
RC::eITEM_RESULT
AwakeningInfoParser::IsAllroundMaterial( const SLOTCODE equip_item_code,
const CODETYPE material_item_code,
const DURATYPE material_item_num )
{
const AwakeningInfo* awakening_info = FindData(equip_item_code);
if ( awakening_info == NULL )
{
return RC::RC_EQUIPMENT_AWAKENING_INVALID_EQUIP_INFO;
}
RC::eITEM_RESULT result_code = RC::RC_EQUIPMENT_AWAKENING_DOES_NOT_MATCH_MATERIAL;
std::list<AllRoundMaterialInfo>::const_iterator cur_iter =
awakening_info->allround_material_info_list.begin();
std::list<AllRoundMaterialInfo>::const_iterator end_iter =
awakening_info->allround_material_info_list.end();
for ( ; cur_iter != end_iter; ++ cur_iter )
{
if ( (*cur_iter).allround_material_code == material_item_code )
{
if ((*cur_iter).allround_material_count > material_item_num)
{
result_code = RC::RC_EQUIPMENT_AWAKENING_DOES_NOT_MATCH_MATERIAL_AMOUNT;
break;
}
const BASE_ITEMINFO* material_info =
ItemInfoParser::Instance()->GetItemInfo(material_item_code);
if (material_info == NULL)
{
continue;
}
if (material_info->m_wType == eITEMTYPE_AWAKENING_ALLROUND_MATERIAL)
{
return RC::RC_ITEM_SUCCESS;
}
}
}
return result_code;
}
#else
const bool
AwakeningInfoParser::IsAllroundMaterial( const SLOTCODE equip_item_code,
const CODETYPE material_item_code )
{
const AwakeningInfo* awakening_info = FindData(equip_item_code);
if ( awakening_info == NULL )
{
return false;
}
std::set<CODETYPE>::const_iterator cur_iter =
awakening_info->allround_material_code_map.begin();
std::set<CODETYPE>::const_iterator end_iter =
awakening_info->allround_material_code_map.end();
for ( ; cur_iter != end_iter; ++ cur_iter )
{
if ( *cur_iter == material_item_code)
{
const BASE_ITEMINFO* material_info =
ItemInfoParser::Instance()->GetItemInfo(material_item_code);
if (material_info == NULL)
{
continue;
}
if (material_info->m_wType == eITEMTYPE_AWAKENING_ALLROUND_MATERIAL)
{
return true;
}
}
}
return false;
}
#endif // _NA_008536_20151030_AWAKENING_MATERIAL_AMOUNT_ADD
RC::eITEM_RESULT AwakeningInfoParser::PermitEvolutionEquipmentCheck( const SCItemSlot& equip_item )
{
if (equip_item.IsShellItem() == true)
{
return RC::RC_EQUIPMENT_EVOLUTION_ITEM_CAN_NOT_EVOLUTION;
}
const AwakeningInfo* awakening_info = FindData(equip_item.GetCode());
if ( awakening_info == NULL )
{
return RC::RC_EQUIPMENT_EVOLUTION_ITEM_CAN_NOT_EVOLUTION;
}
if ( awakening_info->evolution_item_code == 0 )
{
return RC::RC_EQUIPMENT_EVOLUTION_ITEM_CAN_NOT_EVOLUTION;
}
if ( equip_item.GetAwakening() < MAX_AWAKENING_GRADE )
{
return RC::RC_EQUIPMENT_EVOLUTION_DOES_NOT_MATCH_AWAKENING_GRADE;
}
return RC::RC_ITEM_SUCCESS;
}
RC::eITEM_RESULT AwakeningInfoParser::PermitEvolutionAdditiveCheck( const SCItemSlot& equip_item, const SCItemSlot& additive_item )
{
if (additive_item.IsShellItem() == true)
{
return RC::RC_EQUIPMENT_EVOLUTION_DOES_NOT_MATCH_ADDITIVE;
}
const AwakeningInfo* awakening_info = FindData(equip_item.GetCode());
if ( awakening_info == NULL )
{
return RC::RC_EQUIPMENT_EVOLUTION_ITEM_CAN_NOT_EVOLUTION;
}
if ( awakening_info->evolution_additive_item_code != additive_item.GetCode() )
{
return RC::RC_EQUIPMENT_EVOLUTION_DOES_NOT_MATCH_ADDITIVE;
}
if ( additive_item.GetNum() < awakening_info->evolution_additive_count )
{
return RC::RC_EQUIPMENT_EVOLUTION_DOES_NOT_MATCH_ADDITIVE_AMOUT;
}
return RC::RC_ITEM_SUCCESS;
}
RC::eITEM_RESULT AwakeningInfoParser::ResultEvolutionCheck( const SCItemSlot& equip_item, const SCItemSlot& additive_item )
{
RC::eITEM_RESULT result_code = PermitEvolutionEquipmentCheck(equip_item);
if ( result_code != RC::RC_ITEM_SUCCESS )
{
return result_code;
}
result_code = PermitEvolutionAdditiveCheck(equip_item, additive_item);
if ( result_code != RC::RC_ITEM_SUCCESS )
{
return result_code;
}
return RC::RC_ITEM_SUCCESS;
}
const CODETYPE AwakeningInfoParser::GetResultEvolutionItemCode( const CODETYPE& equip_item_code )
{
const AwakeningInfo* awakening_info = FindData(equip_item_code);
if ( awakening_info == NULL )
{
return 0;
}
return awakening_info->evolution_item_code;
}
const CODETYPE AwakeningInfoParser::GetEvolutionAdditiveItemCode( const CODETYPE& equip_item_code )
{
const AwakeningInfo* awakening_info = FindData(equip_item_code);
if ( awakening_info == NULL )
{
return 0;
}
return awakening_info->evolution_additive_item_code;
}
const BYTE AwakeningInfoParser::GetEvolutionAdditiveCount( const CODETYPE& equip_item_code )
{
const AwakeningInfo* awakening_info = FindData(equip_item_code);
if ( awakening_info == NULL )
{
return 0;
}
return awakening_info->evolution_additive_count;
}
const int AwakeningInfoParser::GetEvolutionSuccessProbability( const CODETYPE& equip_item_code )
{
const AwakeningInfo* awakening_info = FindData(equip_item_code);
if ( awakening_info == NULL )
{
return 0;
}
return awakening_info->evolution_probability_success;
}
#endif // _NA_008121_20150311_EQUIPMENT_AWAKENING_SYSTEM // _NA_008124_20150313_AWAKENING_SYSTEM
#ifdef _NA_008536_20151030_AWAKENING_MATERIAL_AMOUNT_ADD
bool AwakeningInfoParser::GetAllRoundMaterialInfo_First( const CODETYPE& equip_item_code, OUT AllRoundMaterialInfo& allround_material_info )
{
const AwakeningInfo* awakening_info = FindData(equip_item_code);
if (awakening_info == NULL)
{
return false;
}
std::list<AllRoundMaterialInfo>::const_iterator iter = awakening_info->allround_material_info_list.begin();
if (iter == awakening_info->allround_material_info_list.end())
{
return false;
}
allround_material_info = (*iter);
return true;
}
int AwakeningInfoParser::GetAllRoundMaterialNum( const CODETYPE& equip_item_code, const CODETYPE& material_code )
{
const AwakeningInfo* awakening_info = FindData(equip_item_code);
if (awakening_info == NULL)
{
return false;
}
std::list<AllRoundMaterialInfo>::const_iterator iter = awakening_info->allround_material_info_list.begin();
for ( ; iter != awakening_info->allround_material_info_list.end(); ++iter )
{
if ((*iter).allround_material_code == material_code)
{
return (*iter).allround_material_count;
}
}
return 0;
}
#endif // _NA_008536_20151030_AWAKENING_MATERIAL_AMOUNT_ADD