feat: équipement, échanges de coups et améliorations des fiches

- équipement des armes et protections (champ equipped, liste des équipés, toggle)
- échanges de coups automatisés (attaque/défense/résolution/blessures dans le chat)
- dialogue d'attaque par type (personnage/PNJ/créature), portées et difficultés
- conservation du scroll des fiches lors des modifs (option scrollable + classe active)
- verrouillage des compétences PNJ en mode jeu
- corrections review combat (défenseur, difficulté >10, multi-cibles, permissions)
This commit is contained in:
2026-08-04 14:14:03 +02:00
parent 31f2f4530c
commit f2c8cfe246
45 changed files with 2105 additions and 78 deletions
@@ -1,4 +1,4 @@
<div class="tab abilities sheet-part" data-group="sheet" data-tab="abilities">
<div class="tab abilities sheet-part {{#if @root.tabs.abilities.active}}active{{/if}}" data-group="sheet" data-tab="abilities">
{{!-- Character --}}
<h3>{{ localize 'VERMINE.abilities' }}</h3>
<div class="grid grid-4col">
+2 -11
View File
@@ -1,4 +1,4 @@
<div class="tab combat sheet-part" data-group="sheet" data-tab="combat">
<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>
@@ -20,6 +20,7 @@
</div>
</div>
</div>
{{> "systems/vermine2047/templates/actor/parts/actor-equipped-gear.hbs"}}
<div class="flexrow">
<div class="self-control-container flexcol align-center">
<h4 class="align-center">
@@ -42,7 +43,6 @@
unavailable
{{/ifgt}}">
{{#iflteq @row @root.system.attributes.self_control.max }}
{{#if @root.isEditMode}}
<input
type="radio"
data-dtype="Number"
@@ -56,7 +56,6 @@
"
/>
{{/if}}
{{/iflteq}}
</div>
@@ -88,7 +87,6 @@
unavailable
{{/ifgt}}">
{{#iflteq @row @root.system.attributes.effort.max }}
{{#if @root.isEditMode}}
<input
type="radio"
data-dtype="Number"
@@ -102,7 +100,6 @@
"
/>
{{/if}}
{{/iflteq}}
</div>
@@ -124,7 +121,6 @@
<div class="hexa ability{{#iflteq @minorwoundmax @root.system.minorWound.value }}
checked
{{/iflteq}}">
{{#if @root.isEditMode}}
<input
type="radio"
data-dtype="Number"
@@ -141,7 +137,6 @@
checked="true"
{{/ife}}
/>
{{/if}}
</div>
{{/repeat}}
</div>
@@ -155,7 +150,6 @@
<div class="hexa ability{{#iflteq @majourwoundmax @root.system.majorWound.value }}
checked
{{/iflteq}}">
{{#if @root.isEditMode}}
<input
type="radio"
data-dtype="Number"
@@ -173,7 +167,6 @@
checked="true"
{{/ife}}
/>
{{/if}}
</div>
{{/repeat}}
@@ -189,7 +182,6 @@
<div class="hexa ability{{#iflteq @deadlywoundmax @root.system.deadlyWound.value }}
checked
{{/iflteq}}">
{{#if @root.isEditMode}}
<input
type="radio"
data-dtype="Number"
@@ -206,7 +198,6 @@
checked="true"
{{/ife}}
/>
{{/if}}
</div>
{{/repeat}}
@@ -1,4 +1,4 @@
<div class="tab equipment sheet-part" data-group="sheet" data-tab="equipment">
<div class="tab equipment sheet-part {{#if @root.tabs.equipment.active}}active{{/if}}" data-group="sheet" data-tab="equipment">
<div class="weapons">
<h4>{{localize 'ITEMS.weapons'}}</h4>
{{> "systems/vermine2047/templates/actor/parts/actor-weapons.hbs"}}
+1 -1
View File
@@ -1,4 +1,4 @@
<div class="tab stories sheet-part" data-group="sheet" data-tab="stories">
<div class="tab stories sheet-part {{#if @root.tabs.stories.active}}active{{/if}}" data-group="sheet" data-tab="stories">
<section class="flexrow flex-group-left flex-align-left gap-md">
<div>
<h4>{{ localize 'IDENTITY.theme'}}</h4>
+1 -1
View File
@@ -1,4 +1,4 @@
<div class="tab totem sheet-part" data-group="sheet" data-tab="totem">
<div class="tab totem sheet-part {{#if @root.tabs.totem.active}}active{{/if}}" data-group="sheet" data-tab="totem">
{{#if system.identity.totem}}
<div class="totem-details">
<img
+1 -1
View File
@@ -1,4 +1,4 @@
<div class="tab combat sheet-part" data-group="sheet" data-tab="combat">
<div class="tab combat sheet-part {{#if @root.tabs.combat.active}}active{{/if}}" data-group="sheet" data-tab="combat">
<div class="grid grid-2col">
{{!-- Computed Values --}}
<div>
+1 -1
View File
@@ -1,4 +1,4 @@
<div class="tab effects sheet-part" data-group="sheet" data-tab="effects">
<div class="tab effects sheet-part {{#if @root.tabs.effects.active}}active{{/if}}" data-group="sheet" data-tab="effects">
<h4 class="item-name effect-name flexrow">{{ localize "UI.effects.name" }}</h4>
<ol class="items-list effects-list">
{{#each effects as |section sid|}}
+1 -1
View File
@@ -1,4 +1,4 @@
<div class="tab info sheet-part" data-group="sheet" data-tab="info">
<div class="tab info sheet-part {{#if @root.tabs.info.active}}active{{/if}}" data-group="sheet" data-tab="info">
<div class="grid grid-2col">
<div>
<h4>{{ localize 'IDENTITY.profile' }}</h4>
+1 -1
View File
@@ -1,4 +1,4 @@
<div class="tab stats sheet-part" data-group="sheet" data-tab="stats">
<div class="tab stats sheet-part {{#if @root.tabs.stats.active}}active{{/if}}" data-group="sheet" data-tab="stats">
<h3>{{ localize 'VERMINE.base_values' }}</h3>
{{!-- Total attaque (lancable) --}}
+1 -1
View File
@@ -1,4 +1,4 @@
<div class="tab gear sheet-part" data-group="sheet" data-tab="gear">
<div class="tab gear sheet-part {{#if @root.tabs.gear.active}}active{{/if}}" data-group="sheet" data-tab="gear">
<div class="grid grid-2col">
<div>
<ol class="items-list">
+1 -1
View File
@@ -1,4 +1,4 @@
<div class="tab info sheet-part" data-group="sheet" data-tab="info">
<div class="tab info sheet-part {{#if @root.tabs.info.active}}active{{/if}}" data-group="sheet" data-tab="info">
<div class="grid grid-2col">
{{!-- Group Identity --}}
+1 -1
View File
@@ -1,4 +1,4 @@
<div class="tab reserve sheet-part" data-group="sheet" data-tab="reserve">
<div class="tab reserve sheet-part {{#if @root.tabs.reserve.active}}active{{/if}}" data-group="sheet" data-tab="reserve">
<div class="grid grid-2col">
{{!-- Group Reserve and Morale --}}
<div class="grid-span-2">
+1 -1
View File
@@ -1,4 +1,4 @@
<div class="tab road sheet-part" data-group="sheet" data-tab="road">
<div class="tab road sheet-part {{#if @root.tabs.road.active}}active{{/if}}" data-group="sheet" data-tab="road">
<ol class="items-list">
<li class="item flexrow items-header">
<div class="item-name" style="flex:4;">{{ localize 'IDENTITY.name'}}</div>
@@ -1,4 +1,4 @@
<div class="tab characteristics sheet-part" data-group="sheet" data-tab="characteristics">
<div class="tab characteristics sheet-part {{#if @root.tabs.characteristics.active}}active{{/if}}" data-group="sheet" data-tab="characteristics">
<h3>{{ localize 'VERMINE.abilities' }}</h3>
{{!-- Caracteristiques physiques --}}
+2 -1
View File
@@ -1,4 +1,4 @@
<div class="tab combat sheet-part" data-group="sheet" data-tab="combat">
<div class="tab combat sheet-part {{#if @root.tabs.combat.active}}active{{/if}}" data-group="sheet" data-tab="combat">
<div class="grid grid-2col">
<div>
<h4 class="align-center">{{ localize "VERMINE.self_control"}}</h4>
@@ -27,6 +27,7 @@
</p>
</div>
</div>
{{> "systems/vermine2047/templates/actor/parts/actor-equipped-gear.hbs"}}
<h4 class="item-name effect-name flexrow">{{ localize
"VERMINE.wounds.name"}}</h4>
<ul class="unstyled">
+10
View File
@@ -0,0 +1,10 @@
<div class="tab equipment sheet-part {{#if @root.tabs.equipment.active}}active{{/if}}" data-group="sheet" data-tab="equipment">
<div class="weapons">
<h4>{{localize 'ITEMS.weapons'}}</h4>
{{> "systems/vermine2047/templates/actor/parts/actor-weapons.hbs"}}
</div>
<div class="protections">
<h4>{{localize 'ITEMS.defenses'}}</h4>
{{> "systems/vermine2047/templates/actor/parts/actor-defenses.hbs"}}
</div>
</div>
+1 -1
View File
@@ -1,4 +1,4 @@
<div class="tab notes sheet-part" data-group="sheet" data-tab="notes">
<div class="tab notes sheet-part {{#if @root.tabs.notes.active}}active{{/if}}" data-group="sheet" data-tab="notes">
<h3>{{ localize 'IDENTITY.notes' }}</h3>
<div class="grid grid-1col">
<div class="form-group">
+1 -1
View File
@@ -1,4 +1,4 @@
<div class="tab skills sheet-part" data-group="sheet" data-tab="skills">
<div class="tab skills sheet-part {{#if @root.tabs.skills.active}}active{{/if}}" data-group="sheet" data-tab="skills">
<h3>{{ localize 'VERMINE.skills' }}</h3>
{{!-- Category Selector --}}
+1 -1
View File
@@ -1,4 +1,4 @@
<div class="tab threat sheet-part" data-group="sheet" data-tab="threat">
<div class="tab threat sheet-part {{#if @root.tabs.threat.active}}active{{/if}}" data-group="sheet" data-tab="threat">
<h3>{{ localize 'ADVERSITY.threat_details' }}</h3>
<div class="grid grid-3col">
{{!-- Menace --}}
+8
View File
@@ -15,6 +15,7 @@
data-type="defense"
data-action="create"
><i class="fas fa-plus"></i></a>
<a style="visibility:hidden;" aria-hidden="true"><i class="fas fa-circle"></i></a>
<a style="visibility:hidden;" aria-hidden="true"><i class="fas fa-trash"></i></a>
</div>
</li>
@@ -42,6 +43,13 @@
<div><a data-action="edit" title="Edit Item">{{item.system.rarity.value}}</a></div>
<div><a data-action="edit" title="Edit Item">{{item.system.reliability}}</a></div>
<div class="item-controls">
<a
data-action="toggleEquip"
data-item-id="{{item._id}}"
title="{{#if item.system.equipped}}{{ localize 'VERMINE.unequip'}}{{else}}{{ localize 'VERMINE.equip'}}{{/if}}"
><i
class="fas {{#if item.system.equipped}}fa-circle-check{{else}}fa-circle{{/if}}"
></i></a>
<a
data-action="delete"
title="Delete Item"
@@ -0,0 +1,64 @@
{{#if equippedWeapons.length}}
<div class="equipped-gear">
<h4 class="item-name flexrow">{{ localize 'ITEMS.weapons'}}</h4>
<ol class="items-list">
{{#each equippedWeapons as |item|}}
<li
class="item flexrow flex-group-center align-center"
data-item-id="{{item._id}}"
>
<div class="item-name flexrow" style="flex:4;">
<div class="item-image">
<a data-action="roll"><img
src="{{item.img}}"
title="{{item.name}}"
width="24"
height="24"
/></a>
</div>
<a data-action="roll">{{item.name}}</a>
</div>
<div style="flex:1;"><a data-action="attack" title="{{ localize 'VERMINE.attack' }}"><i class="fas fa-crosshairs"></i></a></div>
<div style="flex:2;"><a data-action="edit" title="Edit Item">
{{#if item.system.damage.addVigor}}
{{localize 'VERMINE.vigor'}}+
{{/if}}
{{item.system.damage.value}}
({{item.system.damage.type}})
</a></div>
<div style="flex:2;">{{#if item.system.skill}}{{ smarttlk 'SKILLS' item.system.skill 'name' }}{{/if}}</div>
</li>
{{/each}}
</ol>
</div>
{{/if}}
{{#if equippedDefenses.length}}
<div class="equipped-gear">
<h4 class="item-name flexrow">{{ localize 'ITEMS.defenses'}}</h4>
<ol class="items-list">
{{#each equippedDefenses as |item|}}
<li
class="item flexrow flex-group-center align-center"
data-item-id="{{item._id}}"
>
<div class="item-name flexrow" style="flex:4;">
<div class="item-image">
<a data-action="roll"><img
src="{{item.img}}"
title="{{item.name}}"
width="24"
height="24"
/></a>
</div>
<a data-action="edit" title="Edit Item">{{item.name}}</a>
</div>
<div style="flex:2;"><a data-action="edit" title="Edit Item">{{item.system.level}}</a></div>
<div style="flex:2;"><a data-action="edit" title="Edit Item">
{{#if item.system.isShield}}{{ localize 'ITEMS.shield' }}{{/if}}
</a></div>
</li>
{{/each}}
</ol>
</div>
{{/if}}
+6
View File
@@ -9,6 +9,7 @@
<div class="item-controls">
<a class="item-control item-create" title="Create item"
data-type="weapon" data-action="create"><i class="fas fa-plus"></i></a>
<a style="visibility:hidden;" aria-hidden="true"><i class="fas fa-circle"></i></a>
<a style="visibility:hidden;" aria-hidden="true"><i class="fas fa-trash"></i></a>
<a style="visibility:hidden;" aria-hidden="true"><i class="fas fa-edit"></i></a>
</div>
@@ -37,10 +38,15 @@
<div style="flex:1;"><a data-action="edit" title="Edit Item">{{item.system.rarity.value}}</a></div>
<div style="flex:1;"><a data-action="edit" title="Edit Item">{{item.system.reliability}}</a></div>
<div class="item-controls">
<a data-action="toggleEquip" data-item-id="{{item._id}}"
title="{{#if item.system.equipped}}{{ localize 'VERMINE.unequip'}}{{else}}{{ localize 'VERMINE.equip'}}{{/if}}"><i
class="fas {{#if item.system.equipped}}fa-circle-check{{else}}fa-circle{{/if}}"></i></a>
<a data-action="delete" title="Delete Item"><i
class="fas fa-trash"></i></a>
<a data-action="edit" title="Edit Item"><i
class="fas fa-edit"></i></a>
<a data-action="attack" title="{{ localize 'VERMINE.attack' }}"><i
class="fas fa-crosshairs"></i></a>
<a data-action="roll" title="Roll Item"><i
class="fas fa-dice"></i></a>
</div>
+2
View File
@@ -8,6 +8,7 @@
{{/if}}
</label>
<div class="skill-control">
{{#if @root.isEditMode}}
<input
type="range"
name="system.skills.{{key}}.value"
@@ -16,6 +17,7 @@
max="{{skill.max}}"
data-dtype="Number"
/>
{{/if}}
<span class="skill-value">{{skill.value}}D</span>
</div>
</div>