Files
vermine2047/templates/actor/appv2/character-combat.hbs
T
uberwald ef01651b1d 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
2026-08-07 15:30:41 +02:00

301 lines
10 KiB
Handlebars

<div class="tab combat sheet-part {{#if @root.tabs.combat.active}}active{{/if}}" data-group="sheet" data-tab="combat">
<div class="align-center">
<div class="shadow">
<h4>situation de combat par défaut</h4>
<div class="flexrow align-center combat-status">
{{#each config.combatStatus as |dif label|}}
<div>
<label for="combat-status-{{diff}}">{{label}}</label>
<input
id="combat-status-{{diff}}"
type="radio"
name="system.combatStatus.difficulty"
value="{{dif}}"
data-action="clickRadio"
{{#ife @root.system.combatStatus.difficulty dif}}checked
{{/ife}}
>
</div>
{{/each}}
</div>
</div>
</div>
{{> "systems/vermine2047/templates/actor/parts/actor-equipped-gear.hbs"}}
{{#if fetiche}}
<div class="fetiche-block flexrow align-center">
<div class="fetiche-info flexcol">
<h4 class="align-center"><i class="fas fa-heart"></i> {{ localize "VERMINE.fetiche" }} : {{fetiche.name}}</h4>
<p class="fetiche-bonus">{{ localize "VERMINE.fetiche_bonus" }}</p>
{{#if feticheMultiple}}
<p class="fetiche-warning"><i class="fas fa-triangle-exclamation"></i> {{ localize "VERMINE.fetiche_multiple" }}</p>
{{/if}}
{{#if feticheLost}}
<p class="fetiche-warning"><i class="fas fa-triangle-exclamation"></i> {{ localize "VERMINE.fetiche_lost_penalty" }}</p>
{{/if}}
</div>
<button type="button" data-action="loseFetiche" title="{{ localize 'VERMINE.lose_fetiche' }}"><i class="fas fa-unlink"></i> {{ localize "VERMINE.lose_fetiche" }}</button>
</div>
{{/if}}
<div class="flexrow">
<div class="self-control-container flexcol align-center">
<h4 class="align-center">
{{ localize "VERMINE.self_control"}} :
{{@root.system.attributes.self_control.value}}/
{{@root.system.attributes.self_control.max}}
</h4>
{{setVar "SCIndex" 1}}
<div class="reserve-grid">
{{#repeat 4 1 "row"}}
<div class="flexrow">
{{#repeat @row @root.SCIndex "case"}}
<div class="hexa
{{#iflteq @case @root.system.attributes.self_control.value }}
checked
{{/iflteq}}
{{#ifgt @case @root.system.attributes.self_control.max }}
unavailable
{{/ifgt}}">
{{#iflteq @row @root.system.attributes.self_control.max }}
<input
type="radio"
data-dtype="Number"
name="system.attributes.self_control.value"
value="{{@case}}"
data-action="clickRadio"
class="
{{#iflteq @case @root.system.attributes.self_control.max }}
checked
{{/iflteq}}
"
/>
{{/iflteq}}
</div>
{{setVar "SCIndex" (math_add @root.SCIndex 1)}}
{{/repeat}}
</div>
{{/repeat}}
</div>
</div>
<div class="effort-container flexcol align-center">
<h4 class="align-center">
{{ localize "VERMINE.effort"}} :
{{@root.system.attributes.effort.value}}/
{{@root.system.attributes.effort.max}}
</h4>
{{setVar "EffIndex" 1}}
<div class="reserve-grid">
{{#repeat 4 1 "row"}}
<div class="flexrow">
{{#repeat @row @root.EffIndex "case"}}
<div class="hexa
{{#iflteq @case @root.system.attributes.effort.value }}
checked
{{/iflteq}}
{{#ifgt @case @root.system.attributes.effort.max }}
unavailable
{{/ifgt}}">
{{#iflteq @row @root.system.attributes.effort.max }}
<input
type="radio"
data-dtype="Number"
name="system.attributes.effort.value"
value="{{@case}}"
data-action="clickRadio"
class="
{{#iflteq @case @root.system.attributes.effort.max }}
checked
{{/iflteq}}
"
/>
{{/iflteq}}
</div>
{{setVar "EffIndex" (math_add @root.EffIndex 1)}}
{{/repeat}}
</div>
{{/repeat}}
</div>
</div>
<div class="blessure-container flexlarge flexcol align-center">
<h4 class="item-name flexrow">{{ localize
"VERMINE.wounds.name"}}</h4>
<ul class="unstyled">
<li class="row mdb align-center">{{ localize
'VERMINE.wounds.light'}} <span data-tooltip="seuil">({{
system.minorWound.threshold }})</span>
<div class="flexrow align-center">
{{#repeat system.minorWound.max 1 "minorwoundmax"}}
<div class="hexa ability{{#iflteq @minorwoundmax @root.system.minorWound.value }}
checked
{{/iflteq}}">
<input
type="radio"
data-dtype="Number"
name="system.minorWound.value"
value="{{@minorwoundmax}}"
data-wound="minorWound"
data-action="clickWound"
class="
{{#iflteq @minorwoundmax @root.system.minorWound.value }}
checked
{{/iflteq}}
"
{{#ife @minorwoundmax @root.system.minorWound.value }}
checked="true"
{{/ife}}
/>
</div>
{{/repeat}}
</div>
</li>
<li class="row mdb align-center">{{ localize
'VERMINE.wounds.heavy'}}
<span>({{
system.majorWound.threshold }})</span>
<div class="flexrow align-center">
{{#repeat system.majorWound.max 1 "majourwoundmax"}}
<div class="hexa ability{{#iflteq @majourwoundmax @root.system.majorWound.value }}
checked
{{/iflteq}}">
<input
type="radio"
data-dtype="Number"
name="system.majorWound.value"
value="{{@majourwoundmax}}"
data-wound="majorWound"
data-action="clickWound"
class="
{{#iflteq @majourwoundmax @root.system.majorWound.value }}
checked
{{/iflteq}}
"
{{#ife @majourwoundmax @root.system.majorWound.value }}
checked="true"
{{/ife}}
/>
</div>
{{/repeat}}
</div>
</li>
<li class="row mdb align-center">{{ localize
'VERMINE.wounds.deadly'}}
<span>({{
system.deadlyWound.threshold }})</span>
<div class="flexrow align-center">
{{#repeat system.deadlyWound.max 1 "deadlywoundmax"}}
<div class="hexa ability{{#iflteq @deadlywoundmax @root.system.deadlyWound.value }}
checked
{{/iflteq}}">
<input
type="radio"
data-dtype="Number"
name="system.deadlyWound.value"
value="{{@deadlywoundmax}}"
data-wound="deadlyWound"
data-action="clickWound"
class=" {{#iflteq @deadlywoundmax @root.system.deadlyWound.value }}
checked
{{/iflteq}}
"
{{#ife @deadlywoundmax @root.system.deadlyWound.value }}
checked="true"
{{/ife}}
/>
</div>
{{/repeat}}
</div>
</li>
</ul>
</div>
</div>
<h4 class="item-name effect-name flexrow">{{ localize "UI.effects.name"}}</h4>
<ol class="items-list effects-list">
{{#each effects as |section sid|}}
<li
class="items-header flexrow"
data-effect-type="{{section.type}}"
>
<p class="item-name effect-name flexrow">{{#if (eq section.type
'temporary')}}
{{localize "UI.effects.temporary" }}
{{else if (eq section.type 'passive')}}
{{localize "UI.effects.passive" }}
{{else if (eq section.type 'inactive')}}
{{localize "UI.effects.inactive" }}
{{/if}}
</p>
<div class="effect-source">{{localize 'UI.source'}}</div>
<div class="effect-source">{{localize 'UI.duration'}}</div>
<div class="item-controls effect-controls flexrow">
{{#if @root.isEditMode}}
<a
class="effect-control"
data-action="create"
title="{{localize 'UI.effect_create'}}"
>
<i class="fas fa-plus"></i> {{localize "UI.add"}}
</a>
{{/if}}
</div>
</li>
<ol class="item-list">
{{#each section.effects as |effect|}}
<li
class="item effect flexrow"
data-effect-id="{{effect.id}}"
>
<div class="item-name effect-name">
<a
class="effect-control flexrow flex-group-center items-center"
class="effect-control" data-effect-op="edit"
title="{{localize 'UI.effect_edit'}}"
>
<img
class="item-image"
src="{{effect.icon}}"
/>
<span>{{effect.label}}</span>
</a>
</div>
<div class="effect-source">{{effect.sourceName}}</div>
<div class="effect-duration">{{effect.duration.label}}</div>
<div class="item-controls effect-controls flexrow">
{{#if @root.isEditMode}}
<a
class="effect-control"
class="effect-control" data-effect-op="toggle"
title="{{localize 'UI.effect_toggle'}}"
>
<i class="fas {{#if effect.disabled}}fa-check{{else}}fa-times{{/if}}"></i>
</a>
<a
class="effect-control"
class="effect-control" data-effect-op="delete"
title="{{localize 'UI.effect_delete'}}"
>
<i class="fas fa-trash"></i>
</a>
{{/if}}
</div>
</li>
{{/each}}
</ol>
{{/each}}
</ol>
</div>