|
@@ -12249,9 +12249,22 @@ uint64 JobDatabase::parseBodyNode(const YAML::Node &node) {
|
|
|
std::shared_ptr<s_job_info> job = job_db.find(static_cast<uint16>(job_id));
|
|
|
bool exists = job != nullptr;
|
|
|
|
|
|
- if (!exists)
|
|
|
+ if (!exists) {
|
|
|
job = std::make_shared<s_job_info>();
|
|
|
|
|
|
+ job->job_bonus.resize(MAX_LEVEL);
|
|
|
+ std::fill(job->job_bonus.begin(), job->job_bonus.end(), std::array<uint16, PARAM_MAX> { 0 });
|
|
|
+
|
|
|
+ job->base_hp.resize(MAX_LEVEL);
|
|
|
+ std::fill(job->base_hp.begin(), job->base_hp.end(), 0);
|
|
|
+
|
|
|
+ job->base_sp.resize(MAX_LEVEL);
|
|
|
+ std::fill(job->base_sp.begin(), job->base_sp.end(), 0);
|
|
|
+
|
|
|
+ job->base_ap.resize(MAX_LEVEL);
|
|
|
+ std::fill(job->base_ap.begin(), job->base_ap.end(), 0);
|
|
|
+ }
|
|
|
+
|
|
|
if (this->nodeExists(node, "MaxWeight")) {
|
|
|
uint32 weight;
|
|
|
|
|
@@ -12336,34 +12349,6 @@ uint64 JobDatabase::parseBodyNode(const YAML::Node &node) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- if (this->nodeExists(node, "BonusStats")) {
|
|
|
- const YAML::Node &bonusNode = node["BonusStats"];
|
|
|
- job->job_bonus.resize(MAX_LEVEL);
|
|
|
-
|
|
|
- for (const YAML::Node &levelNode : bonusNode) {
|
|
|
- uint16 level;
|
|
|
-
|
|
|
- if (!this->asUInt16(levelNode, "Level", level))
|
|
|
- return 0;
|
|
|
-
|
|
|
- if (level > MAX_LEVEL) {
|
|
|
- this->invalidWarning(levelNode["Level"], "Level must be between 1~MAX_LEVEL for %s.\n", job_name.c_str());
|
|
|
- return 0;
|
|
|
- }
|
|
|
-
|
|
|
- for (uint8 idx = PARAM_STR; idx < PARAM_MAX; idx++) {
|
|
|
- if (this->nodeExists(levelNode, parameter_names[idx])) {
|
|
|
- int16 change;
|
|
|
-
|
|
|
- if (!this->asInt16(levelNode, parameter_names[idx], change))
|
|
|
- return 0;
|
|
|
-
|
|
|
- job->job_bonus[level - 1][idx] = change;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
if (this->nodeExists(node, "MaxStats")) {
|
|
|
const YAML::Node &statNode = node["MaxStats"];
|
|
|
|
|
@@ -12396,7 +12381,7 @@ uint64 JobDatabase::parseBodyNode(const YAML::Node &node) {
|
|
|
if (!this->asUInt16(node, "MaxBaseLevel", level))
|
|
|
return 0;
|
|
|
|
|
|
- if (level > MAX_LEVEL) {
|
|
|
+ if (level == 0 || level > MAX_LEVEL) {
|
|
|
this->invalidWarning(node["MaxBaseLevel"], "MaxBaseLevel must be between 1~MAX_LEVEL for %s, capping to MAX_LEVEL.\n", job_name.c_str());
|
|
|
level = MAX_LEVEL;
|
|
|
}
|
|
@@ -12414,7 +12399,10 @@ uint64 JobDatabase::parseBodyNode(const YAML::Node &node) {
|
|
|
if (!this->asUInt16(bexpNode, "Level", level))
|
|
|
return 0;
|
|
|
|
|
|
- if (level < 1 || level > MAX_LEVEL) {
|
|
|
+ if (level > job->max_base_level)
|
|
|
+ continue;
|
|
|
+
|
|
|
+ if (level == 0 || level > MAX_LEVEL) {
|
|
|
this->invalidWarning(bexpNode["Level"], "Level must be between 1~MAX_LEVEL for %s.\n", job_name.c_str());
|
|
|
return 0;
|
|
|
}
|
|
@@ -12436,13 +12424,12 @@ uint64 JobDatabase::parseBodyNode(const YAML::Node &node) {
|
|
|
if (!this->asUInt16(node, "MaxJobLevel", level))
|
|
|
return 0;
|
|
|
|
|
|
- if (level > MAX_LEVEL) {
|
|
|
+ if (level == 0 || level > MAX_LEVEL) {
|
|
|
this->invalidWarning(node["MaxJobLevel"], "MaxJobLevel must be between 1~MAX_LEVEL for %s, capping to MAX_LEVEL.\n", job_name.c_str());
|
|
|
level = MAX_LEVEL;
|
|
|
}
|
|
|
|
|
|
job->max_job_level = level;
|
|
|
- job->job_bonus.resize(level);
|
|
|
} else {
|
|
|
if (!exists)
|
|
|
job->max_job_level = MAX_LEVEL;
|
|
@@ -12455,7 +12442,10 @@ uint64 JobDatabase::parseBodyNode(const YAML::Node &node) {
|
|
|
if (!this->asUInt16(jexpNode, "Level", level))
|
|
|
return 0;
|
|
|
|
|
|
- if (level < 1 || level > MAX_LEVEL) {
|
|
|
+ if (level > job->max_job_level)
|
|
|
+ continue;
|
|
|
+
|
|
|
+ if (level == 0 || level > MAX_LEVEL) {
|
|
|
this->invalidWarning(jexpNode["Level"], "Level must be between 1~MAX_LEVEL for %s.\n", job_name.c_str());
|
|
|
return 0;
|
|
|
}
|
|
@@ -12471,17 +12461,45 @@ uint64 JobDatabase::parseBodyNode(const YAML::Node &node) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ if (this->nodeExists(node, "BonusStats")) {
|
|
|
+ const YAML::Node &bonusNode = node["BonusStats"];
|
|
|
+
|
|
|
+ for (const YAML::Node &levelNode : bonusNode) {
|
|
|
+ uint16 level;
|
|
|
+
|
|
|
+ if (!this->asUInt16(levelNode, "Level", level))
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ if (level == 0 || level > MAX_LEVEL) {
|
|
|
+ this->invalidWarning(levelNode["Level"], "Level must be between 1~MAX_LEVEL for %s.\n", job_name.c_str());
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (uint8 idx = PARAM_STR; idx < PARAM_MAX; idx++) {
|
|
|
+ if (this->nodeExists(levelNode, parameter_names[idx])) {
|
|
|
+ int16 change;
|
|
|
+
|
|
|
+ if (!this->asInt16(levelNode, parameter_names[idx], change))
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ job->job_bonus[level - 1][idx] = change;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
#ifdef HP_SP_TABLES
|
|
|
if (this->nodeExists(node, "BaseHp")) {
|
|
|
- job->base_hp.resize(job->max_base_level, 1);
|
|
|
-
|
|
|
for (const YAML::Node &bhpNode : node["BaseHp"]) {
|
|
|
uint16 level;
|
|
|
|
|
|
if (!this->asUInt16(bhpNode, "Level", level))
|
|
|
return 0;
|
|
|
|
|
|
- if (level > MAX_LEVEL) {
|
|
|
+ if (level > job->max_base_level)
|
|
|
+ continue;
|
|
|
+
|
|
|
+ if (level == 0 || level > MAX_LEVEL) {
|
|
|
this->invalidWarning(bhpNode["Level"], "Level must be between 1~MAX_LEVEL for %s.\n", job_name.c_str());
|
|
|
return 0;
|
|
|
}
|
|
@@ -12498,15 +12516,16 @@ uint64 JobDatabase::parseBodyNode(const YAML::Node &node) {
|
|
|
}
|
|
|
|
|
|
if (this->nodeExists(node, "BaseSp")) {
|
|
|
- job->base_sp.resize(job->max_base_level, 1);
|
|
|
-
|
|
|
for (const YAML::Node &bspNode : node["BaseSp"]) {
|
|
|
uint16 level;
|
|
|
|
|
|
if (!this->asUInt16(bspNode, "Level", level))
|
|
|
return 0;
|
|
|
|
|
|
- if (level > MAX_LEVEL) {
|
|
|
+ if (level > job->max_base_level)
|
|
|
+ continue;
|
|
|
+
|
|
|
+ if (level == 0 || level > MAX_LEVEL) {
|
|
|
this->invalidWarning(bspNode["Level"], "Level must be between 1~MAX_LEVEL for %s.\n", job_name.c_str());
|
|
|
return 0;
|
|
|
}
|
|
@@ -12523,15 +12542,16 @@ uint64 JobDatabase::parseBodyNode(const YAML::Node &node) {
|
|
|
}
|
|
|
|
|
|
if (this->nodeExists(node, "BaseAp")) {
|
|
|
- job->base_ap.resize(job->max_base_level, 1);
|
|
|
-
|
|
|
for (const YAML::Node &bapNode : node["BaseAp"]) {
|
|
|
uint16 level;
|
|
|
|
|
|
if (!this->asUInt16(bapNode, "Level", level))
|
|
|
return 0;
|
|
|
|
|
|
- if (level > MAX_LEVEL) {
|
|
|
+ if (level > job->max_base_level)
|
|
|
+ continue;
|
|
|
+
|
|
|
+ if (level == 0 || level > MAX_LEVEL) {
|
|
|
this->invalidWarning(bapNode["Level"], "Level must be between 1~MAX_LEVEL for %s.\n", job_name.c_str());
|
|
|
return 0;
|
|
|
}
|
|
@@ -12575,21 +12595,30 @@ void JobDatabase::loadingFinished() {
|
|
|
ShowWarning("Class %s (%d) does not have a job exp table.\n", job_name(job_id), job_id);
|
|
|
|
|
|
// Init and checking the empty value of Base HP/SP [Cydh]
|
|
|
- if (job->base_hp.size() == 0)
|
|
|
+ if (job->base_hp.empty())
|
|
|
job->base_hp.resize(maxBaseLv);
|
|
|
for (uint16 j = 0; j < maxBaseLv; j++) {
|
|
|
if (job->base_hp[j] == 0)
|
|
|
job->base_hp[j] = pc_calc_basehp(j + 1, job_id);
|
|
|
}
|
|
|
- if (job->base_sp.size() == 0)
|
|
|
- job->base_sp.resize(maxJobLv);
|
|
|
- for (uint16 j = 0; j < maxJobLv; j++) {
|
|
|
+ if (job->base_sp.empty())
|
|
|
+ job->base_sp.resize(maxBaseLv);
|
|
|
+ for (uint16 j = 0; j < maxBaseLv; j++) {
|
|
|
if (job->base_sp[j] == 0)
|
|
|
job->base_sp[j] = pc_calc_basesp(j + 1, job_id);
|
|
|
}
|
|
|
|
|
|
- // Resize for the maximum job level
|
|
|
- job->job_bonus.resize(maxJobLv);
|
|
|
+ // Resize to the maximum base level
|
|
|
+ if (job->base_hp.capacity() > maxBaseLv)
|
|
|
+ job->base_hp.erase(job->base_hp.begin() + maxBaseLv, job->base_hp.end());
|
|
|
+ if (job->base_sp.capacity() > maxBaseLv)
|
|
|
+ job->base_sp.erase(job->base_sp.begin() + maxBaseLv, job->base_sp.end());
|
|
|
+ if (job->base_ap.capacity() > maxBaseLv)
|
|
|
+ job->base_ap.erase(job->base_ap.begin() + maxBaseLv, job->base_ap.end());
|
|
|
+
|
|
|
+ // Resize to the maximum job level
|
|
|
+ if (job->job_bonus.capacity() > maxJobLv)
|
|
|
+ job->job_bonus.erase(job->job_bonus.begin() + maxJobLv, job->job_bonus.end());
|
|
|
|
|
|
for (uint16 parameter = PARAM_STR; parameter < PARAM_MAX; parameter++) {
|
|
|
// Store total
|