forked from MagicBane/Server
Adds PromotionClass(RuneTemplate): health/mana/stamina from rune_health/mana/ stamina, token = SBStringHash(rune_sub_type), description from rune_dsc, and allowedRunes = the sub type tokens of the race and base class runes named in item_race_req/item_class_req (all whitelists). Skills, powers and effects still load from the DB by rune id (tasks 2.8, 2.9, 2.10). isPromotionRune selects the non-creation CLASS runes that require a base class (skips 2500-2503 and Pet). A static_rune_promotion comparator checks every field against a JSON-built PromotionClass; rows 2901+ (TALENT runes in the JSON) report as missing. Offline parity (scripts/p22.py, 33 rows + 163 promotionrunereq rows vs 22 promotion runes): 0 differences in name, token, health, stamina and allowed rune tokens. Templar 2516 manaMod is 14 in the DB and 15 in the JSON. 2901-2911 have no promotion rune. description is NULL in the DB and the rune_dsc blurb in the JSON; nothing reads PromotionClass.getDescription(). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>