Commit edd0d5

2026-10-23 17:28:29 iociveteres: feat(gamedata): export power rating by the pr it buys Power Rating has no level, so its one experience entry left the sheet to guess what it buys. It is now exported as Power Rating PR 2 to PR 10, each with the PR as its level: picking one sets the level, and the sheet prices it by the table of the talent for the class.
.scripts/gamedata/build.py ..
@@ 65,7 65,8 @@
advancements = character.characteristics(report)
for s in skill_list:
advancements += s.advancements()
- advancements += [t.advancement() for t in talent_list]
+ for t in talent_list:
+ advancements += t.advancements()
advancements += [a.advancement() for a in art_list]
advancements += [s.advancement() for s in spell_list]
advancements += [el.advancement() for el in elites if el.entry is not None]
.scripts/gamedata/character.py ..
@@ 71,6 71,17 @@
"requirements": self.requirements,
}
+ def advancements(self):
+ """Записи опыта: одна, у Power Rating — по записи на каждый PR, до которого его покупают."""
+ rec = self.advancement()
+ if self.entry.title.en != pf.POWER_RATING:
+ return [rec]
+ out = []
+ for pr in pf.POWER_RATING_LEVELS:
+ names = {k: f"{rec[k]} PR {pr}" for k in ("name", "name_ru") if k in rec}
+ out.append({**rec, **names, "level": pr})
+ return out
+
def parse_level(e, f, report):
"""Уровень таланта; «—» — талант без уровня (Sound Constitution, Power Rating)."""
.scripts/gamedata/pf.py ..
@@ 12,6 12,11 @@
CHARACTERISTIC_LEVELS = ("+0 -> +5", "+5 -> +10", "+10 -> +15", "+15 -> +20", "+20 -> +25")
TALENT_LEVELS = (1, 2, 3)
+# Power Rating — талант без уровня; в опыте его покупают до PR 2–10, уровень записи — этот PR
+# (`POWER_RATING_LEVELS` листа: лист считает цену по таблице таланта). PR 1 не покупается.
+POWER_RATING = "Power Rating"
+POWER_RATING_LEVELS = range(2, 11)
+
# Класс Искусств по файлу списка: англ. для типа `Arts (X)`, рус. для имени.
ARTS_CLASSES = {
"искусства барда": ("Bard", "Бард"),
.scripts/gamedata/test_wiki.py ..
@@ 318,6 318,21 @@
self.assertEqual(lore.aptitudes, "Gen, Gen")
self.assertEqual(dict(r.items), {})
+ def test_power_rating_by_pr(self):
+ [pr] = [character.parse_talent(e, Report()) for e in wiki.entries(doc("""
+ # Магия
+ #### Power Rating / Рейтинг Силы
+ **Уровень:** -, **Скл.:** Gen
+ **Требования:** PR 0
+ """))]
+ recs = pr.advancements()
+ self.assertEqual([(a["name"], a["name_ru"], a["level"]) for a in (recs[0], recs[-1])], [
+ ("Power Rating PR 2", "Рейтинг Силы PR 2", 2),
+ ("Power Rating PR 10", "Рейтинг Силы PR 10", 10),
+ ])
+ self.assertEqual(len(recs), 9)
+ self.assertEqual((recs[0]["type"], recs[0]["aptitudes"]), ("talent", "Gen"))
+
class ReportTest(unittest.TestCase):
def test_collapses_groups(self):
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9