feat: gestion des Dés de Totems (influence, instincts, interdits)
Release Creation / build (release) Failing after 1m32s
Release Creation / build (release) Failing after 1m32s
- VermineTotemDice : influence Humain/Adapté (+1D/-1D par domaine, règles p. 121), gains/pertes via Instincts/Interdits avec limites (3D/totem, 5D total) et règles d'échange. - roll.mjs applique l'influence selon le Totem dominant (au lieu de l'ancienne logique basée sur identity.totem). - Dialogue TotemDiceDialog (instinct Humain/autre totem, interdit Humain, acte grave ±2D) + bouton et ligne d'influence sur la fiche personnage. - Dés de Totem gagnés en cas d'échec à l'apprentissage Dé d'Évolution (dés dépensés, garde capacité vide). - Couleur de texte @color-text-light-2 assombrie (#c9e0c0 → #3f9b55) pour la lisibilité dans tous les dialogues. fix: robustesse et visibilité des évolutions - buyEvolutionDialog : n'efface les Dés d'Évolution que si l'item est créé. - Flag mutation éditable sur la fiche item evolution + badge Adaptation/Mutation dans la liste du personnage. - loseDie : applique aussi la limite totale de 5 dés au gain Adapté. - Case "acte grave" conservée entre les rendus du dialogue.
This commit is contained in:
@@ -233,4 +233,62 @@ export class VermineExperience {
|
||||
}
|
||||
if (Object.keys(update).length) await actor.update(update)
|
||||
}
|
||||
|
||||
/**
|
||||
* Mode de jeu actif (1=Survie, 2=Cauchemar, 3=Apocalypse).
|
||||
* @returns {number}
|
||||
*/
|
||||
static gameMode() {
|
||||
return parseInt(game.settings.get("vermine2047", "game-mode"), 10) || 1
|
||||
}
|
||||
|
||||
/**
|
||||
* Total de Dés d'Évolution maximum selon le Mode de jeu.
|
||||
* @param {number} mode 1=Survie, 2=Cauchemar, 3=Apocalypse
|
||||
* @returns {number}
|
||||
*/
|
||||
static evolutionMaxForMode(mode) {
|
||||
switch (parseInt(mode, 10)) {
|
||||
case 2: return 6
|
||||
case 3: return 7
|
||||
default: return 5
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Somme des niveaux des Adaptations/Mutations déjà possédées.
|
||||
* @param {foundry.abstract.Document} actor personnage
|
||||
* @returns {number}
|
||||
*/
|
||||
static evolutionTotalLevels(actor) {
|
||||
return (actor?.itemTypes?.evolution || []).reduce((sum, item) => sum + (item.system?.level?.value || 0), 0)
|
||||
}
|
||||
|
||||
/**
|
||||
* Valide l'achat d'une Adaptation/Mutation contre les Dés d'Évolution
|
||||
* accumulés. Retourne une clé i18n d'erreur, ou null si l'achat est permis.
|
||||
* Règles p. 116-117 : coût = niveau ; total limité par le Mode ; Mutations
|
||||
* 3D/4D interdites en Mode Survie ; une seule Mutation à 4D.
|
||||
* @param {foundry.abstract.Document} actor personnage
|
||||
* @param {number} cost niveau de l'Adaptation/Mutation (1-4)
|
||||
* @param {boolean} mutation vrai si c'est une Mutation
|
||||
* @returns {string|null}
|
||||
*/
|
||||
static validateEvolutionPurchase(actor, cost, mutation) {
|
||||
const level = parseInt(cost, 10) || 0
|
||||
const accumulated = actor.system?.experience?.evolution || 0
|
||||
const mode = this.gameMode()
|
||||
if (accumulated < level) return "VERMINE.error_evolution_not_enough_dice"
|
||||
if (level < 1 || level > 4) return "VERMINE.error_evolution_invalid_level"
|
||||
const total = this.evolutionTotalLevels(actor) + level
|
||||
if (total > this.evolutionMaxForMode(mode)) return "VERMINE.error_evolution_mode_limit"
|
||||
if (mutation && level >= 3 && mode < 2) return "VERMINE.error_evolution_mutation_mode"
|
||||
if (mutation && level === 4) {
|
||||
const hasFourDMutation = (actor?.itemTypes?.evolution || []).some(
|
||||
(item) => item.system?.mutation && (item.system?.level?.value || 0) === 4
|
||||
)
|
||||
if (hasFourDMutation) return "VERMINE.error_evolution_mutation_4d"
|
||||
}
|
||||
return null
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user