dnd5-scripts/generate_npc/ages.py
2026-06-17 22:32:48 +03:00

55 lines
1.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# ages.py
import random
# Каждый возраст: chance (%), explanation, модификатор способностей (dict с дельтами)
AGES = {
"Youth": {
"chance": 15.0,
"explanation": "equivalent to human 13 17",
"modifiers": {"Strength": -2, "Intelligence": -2, "Wisdom": -2},
},
"Adult": {
"chance": 50.0,
"explanation": "equivalent to human 18 35",
"modifiers": {},
},
"MiddleAged": {
"chance": 20.0,
"explanation": "equivalent to human 36 55",
"modifiers": {"Strength": -2, "Dexterity": -2, "Constitution": -2},
},
"Old": {
"chance": 10.0,
"explanation": "equivalent to human 56 75",
"modifiers": {"Strength": -4, "Dexterity": -4, "Constitution": -4, "Charisma": -2},
},
"Ancient": {
"chance": 5.0,
"explanation": "equivalent to human 76 95",
"modifiers": {"Strength": -6, "Dexterity": -6, "Constitution": -6, "Charisma": -4},
},
}
def get_age_and_modify_abilities(
ability_scores: dict[str, int],
) -> tuple[str, str, dict[str, int]]:
"""Выбирает возрастную категорию и применяет модификаторы к копии ability_scores."""
total = sum(v["chance"] for v in AGES.values())
r = random.random() * total
cumulative = 0.0
selected_key = None
for key, data in AGES.items():
cumulative += data["chance"]
if r <= cumulative:
selected_key = key
break
if selected_key is None:
selected_key = list(AGES.keys())[-1]
data = AGES[selected_key]
aged_scores = dict(ability_scores)
for stat, delta in data["modifiers"].items():
aged_scores[stat] = aged_scores.get(stat, 0) + delta
return selected_key, data["explanation"], aged_scores