From af8dd8b28d579ff365b7c396235476aa3fc84fa0 Mon Sep 17 00:00:00 2001 From: Aleos Date: Mon, 6 Apr 2020 10:44:17 -0400 Subject: [PATCH] Fixes issue with power skills (#4751) * Fixes #4743. * Resolves an issue with power skills and default data defined in the skill's array. * Adds back linear determination and documentation for it. * Adds a check in the converter to not print out values of 0 for levels 6 and higher for skill unit layout and skill unit range. * Removes these values from the skill database. Thanks to @Surefirer and @teededung! --- db/pre-re/skill_db.yml | 176 -------------------------------- db/re/skill_db.yml | 176 -------------------------------- doc/mob_skill_db_powerskill.txt | 9 +- src/map/skill.cpp | 34 ++++++ src/tool/csv2yaml.cpp | 4 + 5 files changed, 45 insertions(+), 354 deletions(-) diff --git a/db/pre-re/skill_db.yml b/db/pre-re/skill_db.yml index aa2e90d678..d6a5e0d6cb 100644 --- a/db/pre-re/skill_db.yml +++ b/db/pre-re/skill_db.yml @@ -1249,10 +1249,6 @@ Body: Size: 2 - Level: 11 Size: 3 - - Level: 12 - Size: 0 - - Level: 13 - Size: 0 Interval: 1000 Target: Enemy Flag: @@ -3321,10 +3317,6 @@ Body: Size: 5 - Level: 11 Size: 7 - - Level: 12 - Size: 0 - - Level: 13 - Size: 0 Range: 1 Interval: 1250 Target: Enemy @@ -3416,12 +3408,6 @@ Body: Size: 2 - Level: 10 Size: 2 - - Level: 11 - Size: 0 - - Level: 12 - Size: 0 - - Level: 13 - Size: 0 Interval: -1 Flag: PathCheck: true @@ -7852,22 +7838,6 @@ Body: Size: 4 - Level: 5 Size: 5 - - Level: 6 - Size: 0 - - Level: 7 - Size: 0 - - Level: 8 - Size: 0 - - Level: 9 - Size: 0 - - Level: 10 - Size: 0 - - Level: 11 - Size: 0 - - Level: 12 - Size: 0 - - Level: 13 - Size: 0 Interval: -1 Flag: PathCheck: true @@ -14944,12 +14914,6 @@ Body: Size: 3 - Level: 10 Size: 4 - - Level: 11 - Size: 0 - - Level: 12 - Size: 0 - - Level: 13 - Size: 0 Interval: -1 Flag: PathCheck: true @@ -15138,22 +15102,6 @@ Body: Size: 3 - Level: 5 Size: 4 - - Level: 6 - Size: 0 - - Level: 7 - Size: 0 - - Level: 8 - Size: 0 - - Level: 9 - Size: 0 - - Level: 10 - Size: 0 - - Level: 11 - Size: 0 - - Level: 12 - Size: 0 - - Level: 13 - Size: 0 Interval: 1000 Target: Enemy Flag: @@ -15764,12 +15712,6 @@ Body: Size: 5 - Level: 10 Size: 13 - - Level: 11 - Size: 0 - - Level: 12 - Size: 0 - - Level: 13 - Size: 0 Interval: 1000 Flag: NoOverlap: true @@ -25536,22 +25478,6 @@ Body: Size: 4 - Level: 5 Size: 4 - - Level: 6 - Size: 0 - - Level: 7 - Size: 0 - - Level: 8 - Size: 0 - - Level: 9 - Size: 0 - - Level: 10 - Size: 0 - - Level: 11 - Size: 0 - - Level: 12 - Size: 0 - - Level: 13 - Size: 0 Interval: 1000 Target: Enemy Flag: @@ -25621,22 +25547,6 @@ Body: Size: 4 - Level: 5 Size: 4 - - Level: 6 - Size: 0 - - Level: 7 - Size: 0 - - Level: 8 - Size: 0 - - Level: 9 - Size: 0 - - Level: 10 - Size: 0 - - Level: 11 - Size: 0 - - Level: 12 - Size: 0 - - Level: 13 - Size: 0 Interval: 1000 Target: Enemy Flag: @@ -25756,22 +25666,6 @@ Body: Size: 4 - Level: 5 Size: 5 - - Level: 6 - Size: 0 - - Level: 7 - Size: 0 - - Level: 8 - Size: 0 - - Level: 9 - Size: 0 - - Level: 10 - Size: 0 - - Level: 11 - Size: 0 - - Level: 12 - Size: 0 - - Level: 13 - Size: 0 Interval: 500 Target: Enemy Flag: @@ -26007,22 +25901,6 @@ Body: Size: 2 - Level: 5 Size: 3 - - Level: 6 - Size: 0 - - Level: 7 - Size: 0 - - Level: 8 - Size: 0 - - Level: 9 - Size: 0 - - Level: 10 - Size: 0 - - Level: 11 - Size: 0 - - Level: 12 - Size: 0 - - Level: 13 - Size: 0 Interval: 500 Target: Enemy Flag: @@ -27687,22 +27565,6 @@ Body: Size: 3 - Level: 5 Size: 3 - - Level: 6 - Size: 0 - - Level: 7 - Size: 0 - - Level: 8 - Size: 0 - - Level: 9 - Size: 0 - - Level: 10 - Size: 0 - - Level: 11 - Size: 0 - - Level: 12 - Size: 0 - - Level: 13 - Size: 0 Interval: 500 Target: Enemy Flag: @@ -28710,12 +28572,6 @@ Body: Size: 1 - Level: 10 Size: 2 - - Level: 11 - Size: 0 - - Level: 12 - Size: 0 - - Level: 13 - Size: 0 Interval: 1000 Target: Enemy Flag: @@ -30986,22 +30842,6 @@ Body: Size: 3 - Level: 5 Size: 4 - - Level: 6 - Size: 0 - - Level: 7 - Size: 0 - - Level: 8 - Size: 0 - - Level: 9 - Size: 0 - - Level: 10 - Size: 0 - - Level: 11 - Size: 0 - - Level: 12 - Size: 0 - - Level: 13 - Size: 0 Interval: 1000 Target: Enemy Flag: @@ -31602,22 +31442,6 @@ Body: Size: 2 - Level: 5 Size: 3 - - Level: 6 - Size: 0 - - Level: 7 - Size: 0 - - Level: 8 - Size: 0 - - Level: 9 - Size: 0 - - Level: 10 - Size: 0 - - Level: 11 - Size: 0 - - Level: 12 - Size: 0 - - Level: 13 - Size: 0 Interval: 2000 Target: Enemy Flag: diff --git a/db/re/skill_db.yml b/db/re/skill_db.yml index 12b78e9ba3..b0a2eef985 100644 --- a/db/re/skill_db.yml +++ b/db/re/skill_db.yml @@ -1260,10 +1260,6 @@ Body: Size: 2 - Level: 11 Size: 3 - - Level: 12 - Size: 0 - - Level: 13 - Size: 0 Interval: 1000 Target: Enemy Flag: @@ -3466,10 +3462,6 @@ Body: Size: 6 - Level: 11 Size: 7 - - Level: 12 - Size: 0 - - Level: 13 - Size: 0 Range: 1 Interval: 1250 Target: Enemy @@ -3562,12 +3554,6 @@ Body: Size: 2 - Level: 10 Size: 2 - - Level: 11 - Size: 0 - - Level: 12 - Size: 0 - - Level: 13 - Size: 0 Interval: -1 Flag: PathCheck: true @@ -8255,22 +8241,6 @@ Body: Size: 4 - Level: 5 Size: 5 - - Level: 6 - Size: 0 - - Level: 7 - Size: 0 - - Level: 8 - Size: 0 - - Level: 9 - Size: 0 - - Level: 10 - Size: 0 - - Level: 11 - Size: 0 - - Level: 12 - Size: 0 - - Level: 13 - Size: 0 Interval: -1 Flag: PathCheck: true @@ -15368,12 +15338,6 @@ Body: Size: 3 - Level: 10 Size: 4 - - Level: 11 - Size: 0 - - Level: 12 - Size: 0 - - Level: 13 - Size: 0 Interval: -1 Flag: PathCheck: true @@ -15586,22 +15550,6 @@ Body: Size: 2 - Level: 5 Size: 3 - - Level: 6 - Size: 0 - - Level: 7 - Size: 0 - - Level: 8 - Size: 0 - - Level: 9 - Size: 0 - - Level: 10 - Size: 0 - - Level: 11 - Size: 0 - - Level: 12 - Size: 0 - - Level: 13 - Size: 0 Interval: 1000 Target: Enemy Flag: @@ -16233,12 +16181,6 @@ Body: Size: 5 - Level: 10 Size: 13 - - Level: 11 - Size: 0 - - Level: 12 - Size: 0 - - Level: 13 - Size: 0 Interval: 1000 Flag: NoOverlap: true @@ -26494,22 +26436,6 @@ Body: Size: 4 - Level: 5 Size: 4 - - Level: 6 - Size: 0 - - Level: 7 - Size: 0 - - Level: 8 - Size: 0 - - Level: 9 - Size: 0 - - Level: 10 - Size: 0 - - Level: 11 - Size: 0 - - Level: 12 - Size: 0 - - Level: 13 - Size: 0 Interval: 1000 Target: Enemy Flag: @@ -26590,22 +26516,6 @@ Body: Size: 4 - Level: 5 Size: 4 - - Level: 6 - Size: 0 - - Level: 7 - Size: 0 - - Level: 8 - Size: 0 - - Level: 9 - Size: 0 - - Level: 10 - Size: 0 - - Level: 11 - Size: 0 - - Level: 12 - Size: 0 - - Level: 13 - Size: 0 Interval: 1000 Target: Enemy Flag: @@ -26747,22 +26657,6 @@ Body: Size: 4 - Level: 5 Size: 5 - - Level: 6 - Size: 0 - - Level: 7 - Size: 0 - - Level: 8 - Size: 0 - - Level: 9 - Size: 0 - - Level: 10 - Size: 0 - - Level: 11 - Size: 0 - - Level: 12 - Size: 0 - - Level: 13 - Size: 0 Interval: 500 Target: Enemy Flag: @@ -27022,22 +26916,6 @@ Body: Size: 2 - Level: 5 Size: 3 - - Level: 6 - Size: 0 - - Level: 7 - Size: 0 - - Level: 8 - Size: 0 - - Level: 9 - Size: 0 - - Level: 10 - Size: 0 - - Level: 11 - Size: 0 - - Level: 12 - Size: 0 - - Level: 13 - Size: 0 Interval: 500 Target: Enemy Flag: @@ -28767,22 +28645,6 @@ Body: Size: 3 - Level: 5 Size: 3 - - Level: 6 - Size: 0 - - Level: 7 - Size: 0 - - Level: 8 - Size: 0 - - Level: 9 - Size: 0 - - Level: 10 - Size: 0 - - Level: 11 - Size: 0 - - Level: 12 - Size: 0 - - Level: 13 - Size: 0 Interval: 500 Target: Enemy Flag: @@ -30811,12 +30673,6 @@ Body: Size: 1 - Level: 10 Size: 2 - - Level: 11 - Size: 0 - - Level: 12 - Size: 0 - - Level: 13 - Size: 0 Interval: 1000 Target: Enemy Flag: @@ -32393,22 +32249,6 @@ Body: Size: 2 - Level: 5 Size: 3 - - Level: 6 - Size: 0 - - Level: 7 - Size: 0 - - Level: 8 - Size: 0 - - Level: 9 - Size: 0 - - Level: 10 - Size: 0 - - Level: 11 - Size: 0 - - Level: 12 - Size: 0 - - Level: 13 - Size: 0 Interval: -1 Target: Enemy Flag: @@ -33077,22 +32917,6 @@ Body: Size: 3 - Level: 5 Size: 4 - - Level: 6 - Size: 0 - - Level: 7 - Size: 0 - - Level: 8 - Size: 0 - - Level: 9 - Size: 0 - - Level: 10 - Size: 0 - - Level: 11 - Size: 0 - - Level: 12 - Size: 0 - - Level: 13 - Size: 0 Interval: -1 Target: Enemy Flag: diff --git a/doc/mob_skill_db_powerskill.txt b/doc/mob_skill_db_powerskill.txt index 3c7e6075e8..8c191a8771 100644 --- a/doc/mob_skill_db_powerskill.txt +++ b/doc/mob_skill_db_powerskill.txt @@ -3,7 +3,7 @@ //===== By: ================================================== //= rAthena Dev Team //===== Last Updated: ======================================== -//= 20160213 +//= 20200104 //===== Description: ========================================= //= Reference for monster level 10 skills. //============================================================ @@ -12,7 +12,12 @@ When a monster uses a level 10 skill on Aegis, it will be much stronger than the normal player version. On rAthena we reflect this by giving the monster a skill level above the maximum player level. The following lists explains the skill specialities and the corresponding level -you need to put for these skills in the mob_skill_db. +which needs to be put for these skills in the mob_skill_db. + +Note: The "SkillDatabase::parseNode" template has a linear determination feature +where it will attempt to fill the values from the last level defined to MAX_SKILL_LEVEL. +If it can't determine a trend it will fill with the last level defined. + ------------------------------------------------------------------------------- Skill | rAthena Lv | Explanation ------------------------------------------------------------------------------- diff --git a/src/map/skill.cpp b/src/map/skill.cpp index 2c2546f64a..d4e05a9ca7 100755 --- a/src/map/skill.cpp +++ b/src/map/skill.cpp @@ -21707,6 +21707,8 @@ template bool SkillDatabase::parseNode(std::string nodeNam for (size_t i = 0; i < S; i++) arr[i] = value; } else { + uint16 max_level = 0; + for (const YAML::Node &it : node[nodeName]) { uint16 skill_lv; @@ -21722,7 +21724,39 @@ template bool SkillDatabase::parseNode(std::string nodeNam continue; arr[skill_lv - 1] = value; + max_level = max(max_level, skill_lv); } + + size_t i = max_level, j; + + // Check for linear change with increasing steps until we reach half of the data acquired. + for (size_t step = 1; step <= i / 2; step++) { + int diff = arr[i - 1] - arr[i - step - 1]; + + for (j = i - 1; j >= step; j--) { + if ((arr[j] - arr[j - step]) != diff) + break; + } + + if (j >= step) // No match, try next step. + continue; + + for (; i < MAX_SKILL_LEVEL; i++) { // Apply linear increase + arr[i] = arr[i - step] + diff; + + if (arr[i] < 1 && arr[i - 1] >= 0) { // Check if we have switched from + to -, cap the decrease to 0 in said cases. + arr[i] = 1; + diff = 0; + step = 1; + } + } + + return true; + } + + // Unable to determine linear trend, fill remaining array values with last value + for (; i < S; i++) + arr[i] = arr[max_level - 1]; } return true; diff --git a/src/tool/csv2yaml.cpp b/src/tool/csv2yaml.cpp index 68bd257d1e..2ed9d6c44e 100644 --- a/src/tool/csv2yaml.cpp +++ b/src/tool/csv2yaml.cpp @@ -2297,6 +2297,8 @@ static bool skill_parse_row_skilldb(char* split[], int columns, int current) { body << YAML::BeginSeq; for (size_t i = 0; i < ARRAYLENGTH(it_unit->second.unit_layout_type); i++) { + if (it_unit->second.unit_layout_type[i] == 0 && i + 1 > 5) + continue; body << YAML::BeginMap; body << YAML::Key << "Level" << YAML::Value << i + 1; body << YAML::Key << "Size" << YAML::Value << it_unit->second.unit_layout_type[i]; @@ -2314,6 +2316,8 @@ static bool skill_parse_row_skilldb(char* split[], int columns, int current) { body << YAML::BeginSeq; for (size_t i = 0; i < ARRAYLENGTH(it_unit->second.unit_range); i++) { + if (it_unit->second.unit_range[i] == 0 && i + 1 > 5) + continue; body << YAML::BeginMap; body << YAML::Key << "Level" << YAML::Value << i + 1; body << YAML::Key << "Size" << YAML::Value << it_unit->second.unit_range[i];