feat(traits): tâche 0 + phases 2-4 — automatisation complète des Traits
Tâche 0 : - item.mjs : champ equipped sur items génériques + toggle fiche - nouveau module/system/traits.mjs (helpers partagés : equippedItems, lourdMalus, mobilityHandicap, feticheItem…) Phase 2 — Combat : - Lourd : malus cumulés auto (Vigueur < n) dans le dialogue + pool - Rapide : handicap (n) pré-rempli dans la défense (character + PNJ) + note carte - Rafale : case tir en rafale (+2 difficulté), +n réussites si réussi (bonusOnSuccess) - Portée : portée effective n × Vigueur affichée - Maniable/Mobilité : note de rappel (dialogue + carte) - Incapacitant : bouton « Jet de Santé (n) » sur la carte d'échange - getLabel() : libellés caractéristiques/compétences localisés Phase 3 — Jets d'action : - Ponctuel : annule jusqu'à n Handicaps, consommé au jet (Traits supprimé à 0) - Pratique : outil sélectionné +2D au lieu de +1D - Intimidant : case « Brandit » → -1D Psychologie ou Relance 1D - Malus : champ « Malus temporaires » manuel déduit du pool - Durée : note « n tours » sur la carte de jet d'arme - roll() : transmission effectiveRange/mobilityHandicap/ponctuelUsed/intimidant (corrige l'affichage Portée/Mobilité) Phase 4 — Acteur : - Fétiche : +1D Effort ET Sang-Froid (max dérivé, config corrigé), alerte 2+ fétiches, action « Perdre le fétiche » (-2D, max -1D persistant feticheLoss) - Zone : note + bouton « Appliquer aux cibles de la zone » (#onApplyZone) CSS : styles LESS pour les nouvelles classes (fetiche-block, exchange-reminder/zone, traits-reminder, tool-bonus/ponctuel, duree-note) i18n : 29 clés fr/en TRAITS_PLAN.md : plan complet cochée
This commit is contained in:
@@ -11,6 +11,7 @@ import {
|
||||
skillCategoriesSchema,
|
||||
skillsSchema
|
||||
} from "./_shared.mjs"
|
||||
import { VermineTraits } from "../system/traits.mjs"
|
||||
|
||||
export default class VermineCharacterData extends foundry.abstract.TypeDataModel {
|
||||
|
||||
@@ -99,6 +100,11 @@ export default class VermineCharacterData extends foundry.abstract.TypeDataModel
|
||||
self_control: new fields.NumberField({ required: true, nullable: false, integer: true, initial: 0, min: 0 }),
|
||||
effort: new fields.NumberField({ required: true, nullable: false, integer: true, initial: 0, min: 0 })
|
||||
}),
|
||||
// Perte de Réserves après perte du Fétiche : -1D de max persistant par Réserve
|
||||
feticheLoss: new fields.SchemaField({
|
||||
self_control: new fields.NumberField({ required: true, nullable: false, integer: true, initial: 0, min: 0 }),
|
||||
effort: new fields.NumberField({ required: true, nullable: false, integer: true, initial: 0, min: 0 })
|
||||
}),
|
||||
// Limites d'apprentissage par phase
|
||||
learned: new fields.SchemaField({
|
||||
phase: new fields.NumberField({ required: true, nullable: false, integer: true, initial: 0, min: 0 }),
|
||||
@@ -157,6 +163,7 @@ export default class VermineCharacterData extends foundry.abstract.TypeDataModel
|
||||
/**
|
||||
* Calcule le max de sang-froid :
|
||||
* somme des caractéristiques mentales + sociales + modificateur d'âge.
|
||||
* Un Fétiche équipé ajoute +1D ; une perte de Fétiche soustrait 1D.
|
||||
*/
|
||||
_setSelfControlMax() {
|
||||
const abilities = Object.values(this.abilities)
|
||||
@@ -165,12 +172,15 @@ export default class VermineCharacterData extends foundry.abstract.TypeDataModel
|
||||
.filter(a => a.category === "mental" || a.category === "social")
|
||||
.reduce((acc, a) => acc + a.value, 0)
|
||||
const bonus = this.experience?.reserveBonus?.self_control || 0
|
||||
this.attributes.self_control.max = Math.min(10, sum + modFromAge + bonus)
|
||||
const loss = this.experience?.feticheLoss?.self_control || 0
|
||||
const fetiche = VermineTraits.feticheItem(this.parent) ? 1 : 0
|
||||
this.attributes.self_control.max = Math.min(10, Math.max(0, sum + modFromAge + bonus + fetiche - loss))
|
||||
}
|
||||
|
||||
/**
|
||||
* Calcule le max d'effort :
|
||||
* somme des caractéristiques physiques + manuelles + modificateur d'âge.
|
||||
* Un Fétiche équipé ajoute +1D ; une perte de Fétiche soustrait 1D.
|
||||
*/
|
||||
_setEffortMax() {
|
||||
const abilities = Object.values(this.abilities)
|
||||
@@ -179,7 +189,9 @@ export default class VermineCharacterData extends foundry.abstract.TypeDataModel
|
||||
.filter(a => a.category === "physical" || a.category === "manual")
|
||||
.reduce((acc, a) => acc + a.value, 0)
|
||||
const bonus = this.experience?.reserveBonus?.effort || 0
|
||||
this.attributes.effort.max = Math.min(10, sum + modFromAge + bonus)
|
||||
const loss = this.experience?.feticheLoss?.effort || 0
|
||||
const fetiche = VermineTraits.feticheItem(this.parent) ? 1 : 0
|
||||
this.attributes.effort.max = Math.min(10, Math.max(0, sum + modFromAge + bonus + fetiche - loss))
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user