Load rune skill reqs from rune_skill_grant instead of static_skill_skillreq

SkillReq.getSkillReqsForRune builds each rune's list from the RUNE JSON
on first use and caches it: skill_value is the grant level and
skill_granted_skills are the prereqs. The prereq amounts (80, Warrior 50,
Sun Dancer 60) are loaded but not yet read; CharacterSkill keeps its
hard-coded 80 and validForWarrior.
Parity (scripts/p29.py): 47 of 79 DB runes match. Value changes (JSON
wins, Task 2.9 decisions):
- Thief Dagger Mastery, Throwing, Unarmed Combat Mastery: level 15 -> 20
- Sentinel Axe/Great Axe/Hammer/Great Hammer/Sword Mastery: 20 -> 15;
  gains Great Sword Mastery (15, Sword); loses Wear Armor, Medium
- Channeler loses Sword; Storm Lord loses Stormcalling
- Blood Horn gains Hammer Mastery (20, Hammer)
- No weapon prereq any more on Archer Archery, Blade Weaver Blade Weaving,
  Sun Dancer Sun Dancing and the 11 Master of X talents
- No effect: Druid/Prelate Sword and Fury Spear 10 -> 1 (promotion is at
  10), discipline/talent level changes (they need level 20), Throwing
  prereqs (always granted), Blade Master Sword prereq (granted at 1)
- JSON-only runes (Archon, Duelist, War Correspondent, Pet, mob/guard
  races) gain lists; Archon resistances and Duelist Dueling are not
  skills and are skipped with a warning

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
MagicBotandClaude Opus 5.5 committed 2026-10-22 09:19:38 -04:00
1 parent d6df01f8f3
commit 4170749a59
6 files changed
+84 -12

No files matched your search

+3 -3
View File
@@ -33,7 +33,7 @@ public class NPCRune extends AbstractGameObject {
this.runeBase = runeBase;
this.player = characterID;
if (this.runeBase != null)
this.skillsGranted = DbManager.SkillReqQueries.GET_REQS_FOR_RUNE(this.runeBase.getObjectUUID());
this.skillsGranted = SkillReq.getSkillReqsForRune(this.runeBase.getObjectUUID());
else
this.skillsGranted = new ArrayList<>();
this.effectsGranted = new ArrayList<>();
@@ -47,7 +47,7 @@ public class NPCRune extends AbstractGameObject {
this.runeBase = runeBase;
this.player = characterID;
if (this.runeBase == null)
this.skillsGranted = DbManager.SkillReqQueries.GET_REQS_FOR_RUNE(this.runeBase.getObjectUUID());
this.skillsGranted = SkillReq.getSkillReqsForRune(this.runeBase.getObjectUUID());
else
this.skillsGranted = new ArrayList<>();
this.effectsGranted = new ArrayList<>();
@@ -62,7 +62,7 @@ public class NPCRune extends AbstractGameObject {
this.runeBase = RuneBase.getRuneBase(rs.getInt("RuneBaseID"));
this.player = rs.getInt("NpcID");
if (this.runeBase != null) {
this.skillsGranted = DbManager.SkillReqQueries.GET_REQS_FOR_RUNE(this.runeBase.getObjectUUID());
this.skillsGranted = SkillReq.getSkillReqsForRune(this.runeBase.getObjectUUID());
this.effectsGranted = DbManager.RuneBaseEffectQueries.GET_EFFECTS_FOR_RUNEBASE(this.runeBase.getObjectUUID());
} else {
Logger.error("Failed to find RuneBase for NPCRune " + this.getObjectUUID());