Files
Sun1602/ProgramCommon/StrengthPenaltyParser.cpp
git 9cb257e7ae Add GameClients drops and keep current 1602 source work.
CN1602 is the local client. KR is the official tree with unpacked Data, System, and Sound. Packed .wpk files stay off git.
2026-08-30 23:24:31 +03:00

234 lines
6.9 KiB
C++

#include "stdafx.h"
#include "./StrengthPenaltyParser.h"
#ifdef __NA_001062_20080623_STRENGTH_PENALTY
//==================================================================================================
//==================================================================================================
//==================================================================================================
StrengthPenaltyParser* StrengthPenaltyParser::instance_static_ = NULL;
StrengthPenaltyParser* StrengthPenaltyParser::CreateInstance()
{
// if the old util::Singleton support interface don't exist, the below code need implements
static struct AutoClosure {
AutoClosure(StrengthPenaltyParser** static_table) : static_table_(static_table) {
}
~AutoClosure() {
SAFE_DELETE(*static_table_);
}
StrengthPenaltyParser** static_table_;
} auto_closure(&instance_static_);
//
if (instance_static_ != NULL) {
return instance_static_;
}
//
StrengthPenaltyParser* provider = new StrengthPenaltyParser;
// initialization...
instance_static_ = provider;
//
return instance_static_;
}
// old util::Singleton support interface
void StrengthPenaltyParser::DestroyInstance()
{
SAFE_DELETE(instance_static_);
}
//==================================================================================================
sSTRENGTH_PENALTY::sSTRENGTH_PENALTY()
: m_fStrengthPro(0.0f)
, m_nStrengthUIIndex(0)
, m_StrengthColorCode(0)
{
}
struct StrengthPenaltyParser::StrengthPenaltyRecord
{
int index_;
sSTRENGTH_PENALTY sections_[kMaxNumberOfStrengthPenaltySections];
//
__DISABLE_COPY(StrengthPenaltyRecord);
};
//==================================================================================================
StrengthPenaltyParser::StrengthPenaltyParser()
: number_of_records_(0)
, table_(NULL)
{
}
StrengthPenaltyParser::~StrengthPenaltyParser()
{
Unload();
}
//void StrengthPenaltyParser::Init(char * pszPackFileName)
//{
// SetPackFileName(pszPackFileName);
//}
BOOL StrengthPenaltyParser::LoadScript(eSCRIPT_CODE script_code, BOOL reloaded)
{
switch (script_code)
{
case SCRIPT_STRENGTH_PENALTY:
return _Load(reloaded);
}
return false;
}
void StrengthPenaltyParser::Release()
{
Unload();
};
void StrengthPenaltyParser::Unload()
{
if (table_) {
::free(table_);
table_ = NULL;
};
number_of_records_ = 0;
}
__forceinline
StrengthPenaltyParser::StrengthPenaltyRecord*
StrengthPenaltyParser::FindStrengthPenalty(int index) const
{
if (table_ == NULL) {
return NULL;
};
StrengthPenaltyRecord* it = table_;
const StrengthPenaltyRecord* const end = table_ + number_of_records_;
for (; it != end; ++it)
{
if (it->index_ == index) {
return it;
};
}
return NULL;
}
int StrengthPenaltyParser::CalcStrengthToIdx(int max_durability, int cur_durability) const
{
// NOTE: f110505.3L, remove 'Err_Idx' because this value is not controlled.
enum {
MinMaxPairNum = 2,
};
static const short kRatioSections[kMaxNumberOfStrengthPenaltySections][MinMaxPairNum] =
{
// min, max
{ 8100, 10000 }, // 81.00% ~ 100.00%
{ 6100, 8099 }, // 61.00% ~ 80.99%
{ 4100, 6099 }, // 41.00% ~ 60.99%
{ 2100, 4099 }, // 21.00% ~ 40.99%
{ 1100, 2099 }, // 11.00% ~ 20.99%
{ 600, 1099 }, // 6.00% ~ 10.99%
{ 100, 599 }, // 1.00% ~ 5.99%
{ 000, 99 } // 0.00% ~ 0.99%
};
BOOST_STATIC_ASSERT(_countof(kRatioSections) == kMaxNumberOfStrengthPenaltySections);
if (cur_durability == 0) {
return _countof(kRatioSections) - 1;
};
if (max_durability <= 0 || cur_durability < 0) {
return _countof(kRatioSections) - 1;
};
// NOTE: prevent error if missing data is inputed in scripts = { strengthpenalty, items... }
if (max_durability <= cur_durability) {
return 0;
};
//
cur_durability *= 10000;
const short ratio = static_cast<short>(cur_durability / max_durability);
for (int section_num = 0; section_num < _countof(kRatioSections); ++section_num)
{
if (ratio >= kRatioSections[section_num][Percent_Min] &&
ratio <= kRatioSections[section_num][Percent_Max])
{
return section_num;
}
};
return _countof(kRatioSections) - 1;
}
sSTRENGTH_PENALTY* StrengthPenaltyParser::GetStrengthPenaltyInfo(int index,
int max_durability, int cur_durability) const
{
const StrengthPenaltyRecord* record = FindStrengthPenalty(index);
if (record == NULL) {
return NULL;
};
int offset = CalcStrengthToIdx(max_durability, cur_durability);
const sSTRENGTH_PENALTY* penalty_info = &record->sections_[offset];
return const_cast<sSTRENGTH_PENALTY*>(penalty_info);
}
bool StrengthPenaltyParser::_Load(BOOL reloaded)
{
__UNUSED(reloaded);
//
const int max_rows = GetRowSize();
if (FlowControl::FCAssert(max_rows != 0 && table_ == NULL) == false) {
return false;
};
;{
const size_t buffer_size = sizeof(*table_) * max_rows;
table_ = reinterpret_cast<StrengthPenaltyRecord*>(::malloc(buffer_size));
ZeroMemory(table_, buffer_size);
number_of_records_ = 0;
};
char column_buffer[MAX_FIELD_NAME_SIZE];
for (int row = 0; row < max_rows; ++row, ++number_of_records_)
{
StrengthPenaltyRecord* const record = &table_[row];
record->index_ = GetDataInt("Index", row);
if (StrengthPenaltyRecord* check_record = FindStrengthPenalty(record->index_))
{
SUNLOG(eCRITICAL_LOG, "StrengthPenalty 인덱스(%d)가 중복됩니다", record->index_);
FASSERT(!"data error.");
};
for (int i = 0; i < _countof(record->sections_); ++i)
{
sSTRENGTH_PENALTY* const node = &record->sections_[i];
//
_snprintf(column_buffer, _countof(column_buffer), "StrengthPro%d\0", i + 1);
const_cast<float&>(node->m_fStrengthPro) = GetDataFloat(column_buffer, row);
_snprintf(column_buffer, _countof(column_buffer), "StrengthUIIndex%d\0", i + 1);
const_cast<int&>(node->m_nStrengthUIIndex) = GetDataInt(column_buffer, row);
_snprintf(column_buffer, _countof(column_buffer), "StrengthColorCode%d\0", i + 1);
const_cast<COLORREF&>(node->m_StrengthColorCode) =
strtol(GetDataString(column_buffer, row), NULL, 16);
}
FASSERT(CheckValidated(record));
}
return true;
}
bool StrengthPenaltyParser::CheckValidated(StrengthPenaltyRecord* const record)
{
if (record->index_ == 0)
{
// 잘못된 인덱스 값.
ASSERT(false);
}
for (int i = 0; i < kMaxNumberOfStrengthPenaltySections; ++i)
{
//스크립트 값 체크.
}
return true;
}
#endif //__NA_001062_20080623_STRENGTH_PENALTY