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!
This commit is contained in:
Aleos 2020-04-06 10:44:17 -04:00 committed by GitHub
parent c94bae7359
commit af8dd8b28d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 45 additions and 354 deletions

View File

@ -1249,10 +1249,6 @@ Body:
Size: 2 Size: 2
- Level: 11 - Level: 11
Size: 3 Size: 3
- Level: 12
Size: 0
- Level: 13
Size: 0
Interval: 1000 Interval: 1000
Target: Enemy Target: Enemy
Flag: Flag:
@ -3321,10 +3317,6 @@ Body:
Size: 5 Size: 5
- Level: 11 - Level: 11
Size: 7 Size: 7
- Level: 12
Size: 0
- Level: 13
Size: 0
Range: 1 Range: 1
Interval: 1250 Interval: 1250
Target: Enemy Target: Enemy
@ -3416,12 +3408,6 @@ Body:
Size: 2 Size: 2
- Level: 10 - Level: 10
Size: 2 Size: 2
- Level: 11
Size: 0
- Level: 12
Size: 0
- Level: 13
Size: 0
Interval: -1 Interval: -1
Flag: Flag:
PathCheck: true PathCheck: true
@ -7852,22 +7838,6 @@ Body:
Size: 4 Size: 4
- Level: 5 - Level: 5
Size: 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 Interval: -1
Flag: Flag:
PathCheck: true PathCheck: true
@ -14944,12 +14914,6 @@ Body:
Size: 3 Size: 3
- Level: 10 - Level: 10
Size: 4 Size: 4
- Level: 11
Size: 0
- Level: 12
Size: 0
- Level: 13
Size: 0
Interval: -1 Interval: -1
Flag: Flag:
PathCheck: true PathCheck: true
@ -15138,22 +15102,6 @@ Body:
Size: 3 Size: 3
- Level: 5 - Level: 5
Size: 4 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 Interval: 1000
Target: Enemy Target: Enemy
Flag: Flag:
@ -15764,12 +15712,6 @@ Body:
Size: 5 Size: 5
- Level: 10 - Level: 10
Size: 13 Size: 13
- Level: 11
Size: 0
- Level: 12
Size: 0
- Level: 13
Size: 0
Interval: 1000 Interval: 1000
Flag: Flag:
NoOverlap: true NoOverlap: true
@ -25536,22 +25478,6 @@ Body:
Size: 4 Size: 4
- Level: 5 - Level: 5
Size: 4 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 Interval: 1000
Target: Enemy Target: Enemy
Flag: Flag:
@ -25621,22 +25547,6 @@ Body:
Size: 4 Size: 4
- Level: 5 - Level: 5
Size: 4 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 Interval: 1000
Target: Enemy Target: Enemy
Flag: Flag:
@ -25756,22 +25666,6 @@ Body:
Size: 4 Size: 4
- Level: 5 - Level: 5
Size: 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 Interval: 500
Target: Enemy Target: Enemy
Flag: Flag:
@ -26007,22 +25901,6 @@ Body:
Size: 2 Size: 2
- Level: 5 - Level: 5
Size: 3 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 Interval: 500
Target: Enemy Target: Enemy
Flag: Flag:
@ -27687,22 +27565,6 @@ Body:
Size: 3 Size: 3
- Level: 5 - Level: 5
Size: 3 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 Interval: 500
Target: Enemy Target: Enemy
Flag: Flag:
@ -28710,12 +28572,6 @@ Body:
Size: 1 Size: 1
- Level: 10 - Level: 10
Size: 2 Size: 2
- Level: 11
Size: 0
- Level: 12
Size: 0
- Level: 13
Size: 0
Interval: 1000 Interval: 1000
Target: Enemy Target: Enemy
Flag: Flag:
@ -30986,22 +30842,6 @@ Body:
Size: 3 Size: 3
- Level: 5 - Level: 5
Size: 4 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 Interval: 1000
Target: Enemy Target: Enemy
Flag: Flag:
@ -31602,22 +31442,6 @@ Body:
Size: 2 Size: 2
- Level: 5 - Level: 5
Size: 3 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 Interval: 2000
Target: Enemy Target: Enemy
Flag: Flag:

View File

@ -1260,10 +1260,6 @@ Body:
Size: 2 Size: 2
- Level: 11 - Level: 11
Size: 3 Size: 3
- Level: 12
Size: 0
- Level: 13
Size: 0
Interval: 1000 Interval: 1000
Target: Enemy Target: Enemy
Flag: Flag:
@ -3466,10 +3462,6 @@ Body:
Size: 6 Size: 6
- Level: 11 - Level: 11
Size: 7 Size: 7
- Level: 12
Size: 0
- Level: 13
Size: 0
Range: 1 Range: 1
Interval: 1250 Interval: 1250
Target: Enemy Target: Enemy
@ -3562,12 +3554,6 @@ Body:
Size: 2 Size: 2
- Level: 10 - Level: 10
Size: 2 Size: 2
- Level: 11
Size: 0
- Level: 12
Size: 0
- Level: 13
Size: 0
Interval: -1 Interval: -1
Flag: Flag:
PathCheck: true PathCheck: true
@ -8255,22 +8241,6 @@ Body:
Size: 4 Size: 4
- Level: 5 - Level: 5
Size: 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 Interval: -1
Flag: Flag:
PathCheck: true PathCheck: true
@ -15368,12 +15338,6 @@ Body:
Size: 3 Size: 3
- Level: 10 - Level: 10
Size: 4 Size: 4
- Level: 11
Size: 0
- Level: 12
Size: 0
- Level: 13
Size: 0
Interval: -1 Interval: -1
Flag: Flag:
PathCheck: true PathCheck: true
@ -15586,22 +15550,6 @@ Body:
Size: 2 Size: 2
- Level: 5 - Level: 5
Size: 3 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 Interval: 1000
Target: Enemy Target: Enemy
Flag: Flag:
@ -16233,12 +16181,6 @@ Body:
Size: 5 Size: 5
- Level: 10 - Level: 10
Size: 13 Size: 13
- Level: 11
Size: 0
- Level: 12
Size: 0
- Level: 13
Size: 0
Interval: 1000 Interval: 1000
Flag: Flag:
NoOverlap: true NoOverlap: true
@ -26494,22 +26436,6 @@ Body:
Size: 4 Size: 4
- Level: 5 - Level: 5
Size: 4 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 Interval: 1000
Target: Enemy Target: Enemy
Flag: Flag:
@ -26590,22 +26516,6 @@ Body:
Size: 4 Size: 4
- Level: 5 - Level: 5
Size: 4 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 Interval: 1000
Target: Enemy Target: Enemy
Flag: Flag:
@ -26747,22 +26657,6 @@ Body:
Size: 4 Size: 4
- Level: 5 - Level: 5
Size: 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 Interval: 500
Target: Enemy Target: Enemy
Flag: Flag:
@ -27022,22 +26916,6 @@ Body:
Size: 2 Size: 2
- Level: 5 - Level: 5
Size: 3 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 Interval: 500
Target: Enemy Target: Enemy
Flag: Flag:
@ -28767,22 +28645,6 @@ Body:
Size: 3 Size: 3
- Level: 5 - Level: 5
Size: 3 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 Interval: 500
Target: Enemy Target: Enemy
Flag: Flag:
@ -30811,12 +30673,6 @@ Body:
Size: 1 Size: 1
- Level: 10 - Level: 10
Size: 2 Size: 2
- Level: 11
Size: 0
- Level: 12
Size: 0
- Level: 13
Size: 0
Interval: 1000 Interval: 1000
Target: Enemy Target: Enemy
Flag: Flag:
@ -32393,22 +32249,6 @@ Body:
Size: 2 Size: 2
- Level: 5 - Level: 5
Size: 3 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 Interval: -1
Target: Enemy Target: Enemy
Flag: Flag:
@ -33077,22 +32917,6 @@ Body:
Size: 3 Size: 3
- Level: 5 - Level: 5
Size: 4 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 Interval: -1
Target: Enemy Target: Enemy
Flag: Flag:

View File

@ -3,7 +3,7 @@
//===== By: ================================================== //===== By: ==================================================
//= rAthena Dev Team //= rAthena Dev Team
//===== Last Updated: ======================================== //===== Last Updated: ========================================
//= 20160213 //= 20200104
//===== Description: ========================================= //===== Description: =========================================
//= Reference for monster level 10 skills. //= 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 normal player version. On rAthena we reflect this by giving the monster a skill
level above the maximum player level. level above the maximum player level.
The following lists explains the skill specialities and the corresponding 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 Skill | rAthena Lv | Explanation
------------------------------------------------------------------------------- -------------------------------------------------------------------------------

View File

@ -21707,6 +21707,8 @@ template<typename T, size_t S> bool SkillDatabase::parseNode(std::string nodeNam
for (size_t i = 0; i < S; i++) for (size_t i = 0; i < S; i++)
arr[i] = value; arr[i] = value;
} else { } else {
uint16 max_level = 0;
for (const YAML::Node &it : node[nodeName]) { for (const YAML::Node &it : node[nodeName]) {
uint16 skill_lv; uint16 skill_lv;
@ -21722,7 +21724,39 @@ template<typename T, size_t S> bool SkillDatabase::parseNode(std::string nodeNam
continue; continue;
arr[skill_lv - 1] = value; 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; return true;

View File

@ -2297,6 +2297,8 @@ static bool skill_parse_row_skilldb(char* split[], int columns, int current) {
body << YAML::BeginSeq; body << YAML::BeginSeq;
for (size_t i = 0; i < ARRAYLENGTH(it_unit->second.unit_layout_type); i++) { 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::BeginMap;
body << YAML::Key << "Level" << YAML::Value << i + 1; body << YAML::Key << "Level" << YAML::Value << i + 1;
body << YAML::Key << "Size" << YAML::Value << it_unit->second.unit_layout_type[i]; 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; body << YAML::BeginSeq;
for (size_t i = 0; i < ARRAYLENGTH(it_unit->second.unit_range); i++) { 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::BeginMap;
body << YAML::Key << "Level" << YAML::Value << i + 1; body << YAML::Key << "Level" << YAML::Value << i + 1;
body << YAML::Key << "Size" << YAML::Value << it_unit->second.unit_range[i]; body << YAML::Key << "Size" << YAML::Value << it_unit->second.unit_range[i];