Browse Source

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!
Aleos 5 years ago
parent
commit
af8dd8b28d
5 changed files with 45 additions and 354 deletions
  1. 0 176
      db/pre-re/skill_db.yml
  2. 0 176
      db/re/skill_db.yml
  3. 7 2
      doc/mob_skill_db_powerskill.txt
  4. 34 0
      src/map/skill.cpp
  5. 4 0
      src/tool/csv2yaml.cpp

+ 0 - 176
db/pre-re/skill_db.yml

@@ -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:

+ 0 - 176
db/re/skill_db.yml

@@ -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:

+ 7 - 2
doc/mob_skill_db_powerskill.txt

@@ -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
 -------------------------------------------------------------------------------
 -------------------------------------------------------------------------------

+ 34 - 0
src/map/skill.cpp

@@ -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;

+ 4 - 0
src/tool/csv2yaml.cpp

@@ -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];