fix: XP-Scaling über Level 20 — quadratisch statt 999999 cap

- D&D 5e Tabelle bis Level 20 (original)
- Level 21+: 355000 + (level-20)² * 50000 — quadratisches Wachstum
- Proficiency Bonus skaliert weiter über Level 20
- Max Level 999: ~48 Mrd XP (machbar aber dauert lange)
- Vorher: 999999 cap ab Level 20 → kein Level-Up möglich
This commit is contained in:
arch_agent
2026-07-26 08:49:38 +02:00
parent aa73891245
commit 7f9df50fcd
+10 -3
View File
@@ -168,7 +168,11 @@ class DnDCharacter:
return self.base_ac + self.armor_bonus + self.shield_bonus return self.base_ac + self.armor_bonus + self.shield_bonus
def _calc_prof_bonus(self) -> int: def _calc_prof_bonus(self) -> int:
# D&D 5e: +2 (1-4), +3 (5-8), +4 (9-12), +5 (13-16), +6 (17-20)
# Beyond 20: +6 + (level-20)//4
if self.level <= 20:
return 2 + ((self.level - 1) // 4) return 2 + ((self.level - 1) // 4)
return 6 + ((self.level - 20) // 4)
def _calc_spell_slots(self) -> int: def _calc_spell_slots(self) -> int:
if self.dnd_class in ("Magier", "Hexenmeister", "Barde", "Kleriker", "Druide"): if self.dnd_class in ("Magier", "Hexenmeister", "Barde", "Kleriker", "Druide"):
@@ -439,11 +443,14 @@ class DnDCharacter:
@property @property
def xp_to_next(self) -> int: def xp_to_next(self) -> int:
"""D&D 5e XP thresholds.""" """XP für nächstes Level. D&D 5e bis Level 20, danach polynomial."""
thresholds = [0, 300, 900, 2700, 6500, 14000, 23000, 34000, 48000, 64000, 85000, 100000, 120000, 140000, 165000, 195000, 225000, 265000, 305000, 355000] thresholds = [0, 300, 900, 2700, 6500, 14000, 23000, 34000, 48000, 64000,
85000, 100000, 120000, 140000, 165000, 195000, 225000, 265000, 305000, 355000]
if self.level < len(thresholds): if self.level < len(thresholds):
return thresholds[self.level] return thresholds[self.level]
return 999999 # Beyond level 20: quadratic scaling — steady growth, no explosion
# Formula: 355000 + (level-20)^2 * 50000
return int(355000 + ((self.level - 20) ** 2) * 50000)
def saving_throw(self, ability: str) -> dict: def saving_throw(self, ability: str) -> dict:
"""Saving Throw: d20 + ability mod + prof (if proficient).""" """Saving Throw: d20 + ability mod + prof (if proficient)."""