feat: gestion de l'expérience (XP)

- Schéma xp dans CelestopolCharacter : actuel (éditable), log[] ({montant, raison, date}), depense (calculé dans prepareDerivedData)
- Bouton 'Dépenser XP' → DialogV2 (montant + raison) : décrémente actuel, logge l'entrée
- Suppression d'entrée de log avec remboursement des points (mode édition)
- Section XP en haut de l'onglet Biographie : compteurs, tableau du log, référentiel des coûts
- i18n : section CELESTOPOL.XP.* complète
- CSS : .xp-section avec compteurs, tableau de log et accordéon de référence

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
2026-03-31 00:33:59 +02:00
parent 79a68ee9ab
commit 9dbd614c5a
40 changed files with 849 additions and 529 deletions

View File

@@ -95,29 +95,40 @@
"destin": "Destin",
"spleen": "Spleen",
"level": "Niveau",
"currentMalus": "Malus actuel"
"currentMalus": "Malus actuel",
"destinTooltip": "Usages du Destin :\n• Réaliser un test avec 3d8\n• Gagner l'initiative lors d'un combat\n• Trouver l'ensemble des indices\n• Éviter une blessure\n• Sortir de l'inconscience\n• Obtenir un Triomphe"
},
"Wound": {
"none": "Aucune blessure",
"anodin": "Anodin",
"derisoire": "Dérisoire",
"negligeable": "Négligeable",
"superficiel": "Superficiel",
"leger": "Léger",
"modere": "Modéré",
"grave": "Grave",
"dramatique": "Dramatique (hors combat)"
"none": "Aucune blessure",
"anodin": "Anodin",
"derisoire": "Dérisoire",
"negligeable": "Négligeable",
"superficiel": "Superficiel",
"leger": "Léger",
"modere": "Modéré",
"grave": "Grave",
"dramatique": "Dramatique (hors combat)",
"duration1min": "1 min",
"duration10min": "10 min",
"duration30min": "30 min",
"duration1jour": "1 journée",
"status": "État : "
},
"Combat": {
"attack": "Attaquer",
"corpsPnj": "Corps du PNJ",
"tie": "ÉGALITÉ",
"tieDesc": "Personne n'est blessé",
"successHit": "PNJ touché — 1 blessure",
"failureHit": "Joueur touché — 1 blessure (mêlée)",
"distanceNoWound": "Raté — pas de riposte",
"weaponDamage": "dégâts supplémentaires",
"playerWounded": "Blessure infligée au joueur (mêlée)"
"attack": "Attaquer",
"corpsPnj": "Corps du PNJ",
"tie": "ÉGALITÉ",
"tieDesc": "Personne n'est blessé",
"successHit": "PNJ touché — 1 blessure",
"failureHit": "Joueur touché — 1 blessure (mêlée)",
"distanceNoWound": "Raté — pas de riposte",
"weaponDamage": "dégâts supplémentaires",
"playerWounded": "Blessure infligée au joueur (mêlée)",
"rangedDefenseTitle": "Esquiver (Mobilité)",
"rangedDefenseTag": "Défense à distance",
"rangedDefenseSuccess": "Attaque esquivée — pas de blessure",
"rangedDefenseFailure": "Touché par le PNJ — 1 blessure",
"rangedDefensePlayerWounded":"Blessure infligée par attaque à distance"
},
"Tab": {
"main": "Principal",
@@ -294,6 +305,30 @@
},
"Aspect": {
"valeur": "Valeur"
},
"XP": {
"title": "Expérience",
"actuel": "XP disponible",
"depense": "XP dépensée",
"depenser": "Dépenser XP",
"confirmer": "Confirmer",
"montant": "Montant",
"raison": "Raison",
"raisonPlaceholder": "Ex : Augmentation Mobilité à 4",
"date": "Date",
"supprimer": "Annuler cette dépense",
"disponible": "{n} XP disponibles",
"insuffisant": "XP insuffisante — seulement {n} disponibles",
"montantInvalide": "Le montant doit être supérieur à 0",
"refTitle": "Tableau des coûts",
"refAmelioration": "Amélioration",
"refCout": "Coût (XP)",
"refAugmenterSpec": "Augmenter une Spécialisation",
"refCoutNiveau": "= niveau à atteindre",
"refAcquerirAspect": "Acquérir un nouvel Aspect",
"refAugmenterAspect":"Augmenter / Diminuer un Aspect",
"refAcquerirAttribut":"Acquérir ou augmenter un Attribut",
"refCoutAttributTotal":"= total des points × 10"
}
}
}