瀏覽代碼

Convert hit rate skill storage to unordered_map
* This allows the option to store skill level for exact requirements.

aleos 1 年之前
父節點
當前提交
8f6740bbb0
共有 9 個文件被更改,包括 24 次插入20 次删除
  1. 1 1
      db/import-tmpl/skill_db.yml
  2. 2 2
      db/pre-re/skill_db.yml
  3. 2 2
      db/re/skill_db.yml
  4. 1 1
      db/skill_db.yml
  5. 4 4
      doc/skill_db.txt
  6. 1 1
      doc/yaml/db/skill_db.yml
  7. 2 2
      src/map/battle.cpp
  8. 10 6
      src/map/skill.cpp
  9. 1 1
      src/map/skill.hpp

+ 1 - 1
db/import-tmpl/skill_db.yml

@@ -38,7 +38,7 @@
 #     - Level                 Skill level.
 #       Count                 Number of hits at specific skill level.
 #   HitRate                   Skill hit rate.
-#     Rates:                  Rate. (Default: 100)
+#     Rates:                  Hit rate. (Default: 100)
 #       - Level               Skill level.
 #         Rate                Rate is a percent of hit rate added to hit rate.
 #     Skills:                 Skill flagged as a requirement (players only). (Optional)

+ 2 - 2
db/pre-re/skill_db.yml

@@ -38,7 +38,7 @@
 #     - Level                 Skill level.
 #       Count                 Number of hits at specific skill level.
 #   HitRate                   Skill hit rate.
-#     Rates:                  Rate. (Default: 100)
+#     Rates:                  Hit rate. (Default: 100)
 #       - Level               Skill level.
 #         Rate                Rate is a percent of hit rate added to hit rate.
 #     Skills:                 Skill flagged as a requirement (players only). (Optional)
@@ -4864,7 +4864,7 @@ Body:
         - Level: 10
           Rate: 50
       Skills:
-        AS_SONICACCEL: true
+        AS_SONICACCEL: 1
     Element: Weapon
     AfterCastActDelay: 2000
     AfterCastWalkDelay: 2000

+ 2 - 2
db/re/skill_db.yml

@@ -38,7 +38,7 @@
 #     - Level                 Skill level.
 #       Count                 Number of hits at specific skill level.
 #   HitRate                   Skill hit rate.
-#     Rates:                  Rate. (Default: 100)
+#     Rates:                  Hit rate. (Default: 100)
 #       - Level               Skill level.
 #         Rate                Rate is a percent of hit rate added to hit rate.
 #     Skills:                 Skill flagged as a requirement (players only). (Optional)
@@ -5109,7 +5109,7 @@ Body:
         - Level: 10
           Rate: 90
       Skills:
-        AS_SONICACCEL: true
+        AS_SONICACCEL: 1
     Element: Weapon
     Duration2: 4500
     Cooldown: 1000

+ 1 - 1
db/skill_db.yml

@@ -38,7 +38,7 @@
 #     - Level                 Skill level.
 #       Count                 Number of hits at specific skill level.
 #   HitRate                   Skill hit rate.
-#     Rates:                  Rate. (Default: 100)
+#     Rates:                  Hit rate. (Default: 100)
 #       - Level               Skill level.
 #         Rate                Rate is a percent of hit rate added to hit rate.
 #     Skills:                 Skill flagged as a requirement (players only). (Optional)

+ 4 - 4
doc/skill_db.txt

@@ -180,12 +180,12 @@ Sequence Map Form
       - Level: 5
         Count: 200
 
-Skills - If a skill is required to be learned, then the sequence map form is needed.
+Skills - List of skills required to be learned before hit rate is adjusted. Set skill level to 0 to disable.
 
 Skills: # Requires both NV_BASIC and SM_BASH to be learned. If skill check fails then default (100) value is used.
-  NV_BASIC: true # Requires Novice's Basic Skill to be learned.
-  SM_BASH: true # Requires Bash to be learned.
-  SM_MAGNUM: false # Remove Magnum Break from requirements. Useful for import.
+  NV_BASIC: 9 # Requires level 9 of Novice's Basic Skill to be learned.
+  SM_BASH: 5 # Requires level 5 of Bash to be learned.
+  SM_MAGNUM: 0 # Remove Magnum Break from requirements. Useful for import.
 
 ---------------------------------------
 

+ 1 - 1
doc/yaml/db/skill_db.yml

@@ -21,7 +21,7 @@
 #     - Level                 Skill level.
 #       Count                 Number of hits at specific skill level.
 #   HitRate                   Skill hit rate.
-#     Rates:                  Rate. (Default: 100)
+#     Rates:                  Hit rate. (Default: 100)
 #       - Level               Skill level.
 #         Rate                Rate is a percent of hit rate added to hit rate.
 #     Skills:                 Skill flagged as a requirement (players only). (Optional)

+ 2 - 2
src/map/battle.cpp

@@ -3130,8 +3130,8 @@ static bool is_attack_hitting(struct Damage* wd, struct block_list *src, struct
 					bool req_fail = false;
 
 					// List of skills required to be learned before adjusting hitrate (players only).
-					for (uint16 skill_req : skill_hitrate.skills) {
-						if (sd && pc_checkskill(sd, skill_req) == 0) {
+					for (const auto &skill_req : skill_hitrate.skills) {
+						if (sd && pc_checkskill(sd, skill_req.first) < skill_req.second) {
 							req_fail = true;
 							break;
 						}

+ 10 - 6
src/map/skill.cpp

@@ -23661,15 +23661,19 @@ uint64 SkillDatabase::parseBodyNode(const ryml::NodeRef& node) {
 					return 0;
 				}
 
-				bool active;
+				uint16 req_skill_lv;
 
-				if (!this->asBool(skillsNode, req_skill_name, active))
+				if (!this->asUInt16(skillsNode, req_skill_name, req_skill_lv))
 					return 0;
 
-				if (active)
-					skill->hitrate.skills.push_back(req_skill_id);
-				else
-					util::vector_erase_if_exists(skill->hitrate.skills, req_skill_id);
+				if (req_skill_lv > 0)
+					skill->hitrate.skills.insert({ req_skill_id, req_skill_lv });
+				else {
+					auto req_exists = util::umap_find(skill->hitrate.skills, req_skill_id);
+
+					if (req_exists)
+						skill->hitrate.skills.erase(req_skill_id);
+				}
 			}
 		}
 	} else {

+ 1 - 1
src/map/skill.hpp

@@ -249,7 +249,7 @@ struct s_skill_copyable { // [Cydh]
 /// Skill HitRate structure.
 struct s_skill_hitrate{
 	int32 rate[MAX_SKILL_LEVEL];
-	std::vector<uint16> skills;
+	std::unordered_map<uint16, uint16> skills;
 };
 
 /// Database skills