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:
@@ -12,7 +12,8 @@ export default class VermineCharacterSheetV2 extends VermineBaseActorSheet {
|
||||
openLearning: VermineCharacterSheetV2.#onOpenLearning,
|
||||
validatePhase: VermineCharacterSheetV2.#onValidatePhase,
|
||||
buyEvolution: VermineCharacterSheetV2.#onBuyEvolution,
|
||||
openTotemDice: VermineCharacterSheetV2.#onOpenTotemDice
|
||||
openTotemDice: VermineCharacterSheetV2.#onOpenTotemDice,
|
||||
loseFetiche: VermineCharacterSheetV2.#onLoseFetiche
|
||||
}
|
||||
}
|
||||
|
||||
@@ -80,13 +81,21 @@ export default class VermineCharacterSheetV2 extends VermineBaseActorSheet {
|
||||
case "stories":
|
||||
context.tab = context.tabs.stories
|
||||
break
|
||||
case "combat":
|
||||
case "combat": {
|
||||
context.tab = context.tabs.combat
|
||||
context.equippedWeapons = doc.itemTypes.weapon.filter(i => i.system.equipped)
|
||||
context.equippedDefenses = doc.itemTypes.defense.filter(i => i.system.equipped)
|
||||
const { prepareActiveEffectCategories } = await import("../../system/effects.mjs")
|
||||
context.effects = prepareActiveEffectCategories(doc.effects)
|
||||
const { VermineTraits } = await import("../../system/traits.mjs")
|
||||
const feticheItems = VermineTraits.equippedItems(doc, 'fetiche')
|
||||
context.feticheItems = feticheItems
|
||||
context.fetiche = feticheItems[0] ?? null
|
||||
context.feticheMultiple = feticheItems.length > 1
|
||||
const loss = doc.system.experience?.feticheLoss
|
||||
context.feticheLost = Boolean(loss?.self_control || loss?.effort)
|
||||
break
|
||||
}
|
||||
case "experience":
|
||||
context.tab = context.tabs.experience
|
||||
context.specialtyCount = doc.itemTypes.specialty.length
|
||||
@@ -149,4 +158,35 @@ export default class VermineCharacterSheetV2 extends VermineBaseActorSheet {
|
||||
const dialog = await TotemDiceDialog.create({ actorId: this.document.id })
|
||||
if (dialog) dialog.render(true)
|
||||
}
|
||||
|
||||
/**
|
||||
* Action « Perdre le fétiche » : applique -2D dans chaque Réserve et
|
||||
* -1D de max persistant (expérience.feticheLoss), puis retire le Trait
|
||||
* Fétiche de l'objet équipé.
|
||||
*/
|
||||
static async #onLoseFetiche() {
|
||||
const doc = this.document
|
||||
if (!game.user.isGM && !doc.isOwner) {
|
||||
ui.notifications.warn(game.i18n.localize("VERMINE.error_no_permission"))
|
||||
return
|
||||
}
|
||||
const { VermineTraits } = await import("../../system/traits.mjs")
|
||||
const items = VermineTraits.equippedItems(doc, 'fetiche')
|
||||
if (!items.length) {
|
||||
ui.notifications.warn(game.i18n.localize("VERMINE.fetiche_none"))
|
||||
return
|
||||
}
|
||||
const loss = doc.system.experience?.feticheLoss
|
||||
const sc = Math.max(0, (doc.system.attributes.self_control.value || 0) - 2)
|
||||
const ef = Math.max(0, (doc.system.attributes.effort.value || 0) - 2)
|
||||
await doc.update({
|
||||
"system.attributes.self_control.value": sc,
|
||||
"system.attributes.effort.value": ef,
|
||||
"system.experience.feticheLoss.self_control": (loss?.self_control || 0) + 1,
|
||||
"system.experience.feticheLoss.effort": (loss?.effort || 0) + 1
|
||||
})
|
||||
await items[0].update({ "system.traits.fetiche": null })
|
||||
ui.notifications.info(game.i18n.localize("VERMINE.fetiche_lost"))
|
||||
this.render()
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user