Finalisation complète du système Vermine2047 pour FoundryVTT v14

Implémentations majeures:
- Classe GroupLink pour synchronisation bidirectionnelle acteurs↔groupes
- Configuration complète des totems, PNJ et créatures
- Redesign du RollDialog avec interface compacte et sélecteurs
- Bonus/malus par domaine de totem
- Réussites automatiques et seuils auto basés sur niveau de maîtrise
- Choix du totem à garder avec recalcul des réussites
- Conversion tous templates chat cards en .hbs
- Fiches PNJ et Créature avec sélecteurs pour tous les niveaux
- Documentation technique (ARCHITECTURE.md) et utilisateur (GUIDE_UTILISATEUR.md)
- Mise à jour system.json pour compatibilité v14
- Tous les TODOs du README.md complétés

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
This commit is contained in:
2026-06-04 11:46:40 +02:00
parent c35e93975b
commit 716c1b49ae
44 changed files with 4008 additions and 631 deletions
+149 -10
View File
@@ -10,30 +10,75 @@
</h1>
<div class="resource-content flexrow row text-right">
<label for="system.pack.value" class="resource-label">{{ localize 'ADVERSITY.pack'}}</label>
<input type="number" name="system.pack.value" value="{{system.pack.value}}" data-dtype="Number" min="0" max="3" />
<select
name="system.pack.value"
id="system.pack.value"
data-dtype="Number"
>
<option value="0">{{localize 'VERMINE.none'}}</option>
{{#each ../config.creaturePackLevels}}
{{#if @key}}
<option
value="{{@key}}"
{{#ife @key ../system.pack.value}}selected{{/ife}}
>{{@key}}</option>
{{/if}}
{{/each}}
</select>
</div>
</div>
<div class="resources grid grid-3col">
<div class="resource flex-group-center">
<label for="system.threat.value" class="resource-label">{{ localize 'ADVERSITY.pattern'}}</label>
<label for="system.pattern.value" class="resource-label">{{ localize 'ADVERSITY.pattern'}}</label>
<div class="resource-content">
<input type="number" name="system.pattern.value" value="{{system.pattern.value}}" data-dtype="Number" min="1" max="4" />
<span>({{ patternLevel "label" system.pattern.value }})</span>
<select
name="system.pattern.value"
id="system.pattern.value"
data-dtype="Number"
>
{{#each ../config.creaturePatternLevels}}
<option
value="{{@key}}"
{{#ife @key ../system.pattern.value}}selected{{/ife}}
>{{localize this.label}} ({{@key}})</option>
{{/each}}
</select>
</div>
</div>
<div class="resource flex-group-center">
<label for="system.experience.value" class="resource-label">{{ localize 'ADVERSITY.size'}}</label>
<label for="system.size.value" class="resource-label">{{ localize 'ADVERSITY.size'}}</label>
<div class="resource-content">
<input type="number" name="system.size.value" value="{{system.size.value}}" data-dtype="Number" min="0" max="3" />
<select
name="system.size.value"
id="system.size.value"
data-dtype="Number"
>
{{#each ../config.creatureSizeLevels}}
<option
value="{{@key}}"
{{#ife @key ../system.size.value}}selected{{/ife}}
>{{@key}}</option>
{{/each}}
</select>
</div>
</div>
<div class="resource flex-group-center">
<label for="system.cr" class="resource-label">{{ localize 'ADVERSITY.role'}}</label>
<label for="system.role.value" class="resource-label">{{ localize 'ADVERSITY.role'}}</label>
<div class="resource-content">
<input type="number" name="system.role.value" value="{{system.role.value }}" data-dtype="Number" min="1" max="3"/>
<span>({{ roleLevel "label" system.role.value }})</span>
<select
name="system.role.value"
id="system.role.value"
data-dtype="Number"
>
{{#each ../config.creatureRoleLevels}}
<option
value="{{@key}}"
{{#ife @key ../system.role.value}}selected{{/ife}}
>{{localize this.label}} ({{@key}})</option>
{{/each}}
</select>
</div>
</div>
@@ -53,6 +98,101 @@
{{!-- Biography Tab --}}
<div class="tab stats" data-group="primary" data-tab="description">
<section class="grid grid-3col gap-md">
<div class="mdb">
<h4 class="align-center">{{ localize 'ADVERSITY.pattern'}}</h4>
<ul class="unstyled">
<li>{{ localize 'ADVERSITY.attack'}} {{ creaturePatternLevel "attack" system.pattern.value }}</li>
<li>{{ localize 'ADVERSITY.damage'}} {{ creaturePatternLevel "damage" system.pattern.value }}</li>
<li>{{ localize 'ADVERSITY.wounds'}}
{{ creaturePatternLevel "minorWound" system.pattern.value }}/
{{ creaturePatternLevel "majorWound" system.pattern.value }}/
{{ creaturePatternLevel "deadlyWound" system.pattern.value }}
</li>
</ul>
</div>
<div class="mdb">
<h4 class="align-center">{{ localize 'ADVERSITY.size'}}</h4>
<ul class="unstyled">
<li>{{ localize 'ADVERSITY.attack'}} {{ creatureSizeLevel "attack" system.size.value }}</li>
<li>{{ localize 'ADVERSITY.vigor'}} {{ creatureSizeLevel "vigor" system.size.value }}</li>
<li>{{ localize 'ADVERSITY.wounds'}}
{{ creatureSizeLevel "minorWound" system.size.value }}/
{{ creatureSizeLevel "majorWound" system.size.value }}/
{{ creatureSizeLevel "deadlyWound" system.size.value }}
</li>
</ul>
</div>
<div class="mdb">
<h4 class="align-center">{{ localize 'ADVERSITY.role'}}</h4>
<ul class="unstyled">
<li>{{ localize 'ADVERSITY.reaction'}} {{ creatureRoleLevel "reaction" system.role.value }} + {{ creatureRoleLevel "reaction_bonus" system.role.value }}</li>
<li>{{ localize 'ADVERSITY.pools'}} {{ creatureRoleLevel "pools" system.role.value }}</li>
<li>{{ localize 'ADVERSITY.gear'}} {{ creatureRoleLevel "gear" system.role.value }}</li>
<li>{{ localize 'ADVERSITY.protection'}} {{ creatureRoleLevel "protection" system.role.value }}</li>
</ul>
</div>
</section>
<section class="grid grid-3col gap-md">
<div class="mdb">
<h4 class="align-center">{{ localize 'ADVERSITY.pack'}}</h4>
<ul class="unstyled">
<li>{{ localize 'ADVERSITY.attack'}} {{ creaturePackLevel "attack" system.pack.value }}</li>
<li>{{ localize 'ADVERSITY.damage'}} {{ creaturePackLevel "damage" system.pack.value }}</li>
<li>{{ localize 'ADVERSITY.wounds'}}
{{ creaturePackLevel "minorWound" system.pack.value }}/
{{ creaturePackLevel "majorWound" system.pack.value }}/
{{ creaturePackLevel "deadlyWound" system.pack.value }}
</li>
</ul>
</div>
<div class="mdb">
<h4 class="align-center">{{ localize 'ADVERSITY.skills'}}</h4>
<ul class="unstyled">
<li>
<input type="text" name="system.skills" value="{{ system.skills }}" data-dtype="String" placeholder="{{ localize 'ADVERSITY.skills' }}"/>
</li>
</ul>
</div>
<div class="mdb">
<h4 class="align-center">{{ localize 'VERMINE.modes'}}</h4>
<ul class="unstyled">
<li>
<label>
<input
type="checkbox"
name="system.modes.survival"
{{#if system.modes.survival}}checked{{/if}}
data-dtype="Boolean"
/>
{{ localize 'GAME_MODES.survival' }}
</label>
</li>
<li>
<label>
<input
type="checkbox"
name="system.modes.nightmare"
{{#if system.modes.nightmare}}checked{{/if}}
data-dtype="Boolean"
/>
{{ localize 'GAME_MODES.nightmare' }}
</label>
</li>
<li>
<label>
<input
type="checkbox"
name="system.modes.apocalypse"
{{#if system.modes.apocalypse}}checked{{/if}}
data-dtype="Boolean"
/>
{{ localize 'GAME_MODES.apocalypse' }}
</label>
</li>
</ul>
</div>
</section>
<section class="flexcol col gap-md">
<h4 class="align-center">{{ localize 'IDENTITY.notes'}}</h4>
{{editor system.biography target="system.biography" button=true owner=owner editable=editable}}
@@ -66,4 +206,3 @@
</section>
</form>
+52 -19
View File
@@ -9,24 +9,54 @@
<div class="resource flex-group-center">
<label for="system.threat.value" class="resource-label">{{ localize 'ADVERSITY.threat'}}</label>
<div class="resource-content">
<input type="number" name="system.threat.value" value="{{system.threat.value}}" data-dtype="Number" min="1" max="4" />
<span>({{ threatLevel "label" system.threat.value }})</span>
<select
name="system.threat.value"
id="system.threat.value"
data-dtype="Number"
>
{{#each ../config.npcThreatLevels}}
<option
value="{{@key}}"
{{#ife @key ../system.threat.value}}selected{{/ife}}
>{{localize this.label}} ({{@key}})</option>
{{/each}}
</select>
</div>
</div>
<div class="resource flex-group-center">
<label for="system.experience.value" class="resource-label">{{ localize 'ADVERSITY.experience'}}</label>
<div class="resource-content">
<input type="number" name="system.experience.value" value="{{system.experience.value}}" data-dtype="Number" min="1" max="4" />
<span>({{ experienceLevel "label" system.experience.value }})</span>
<select
name="system.experience.value"
id="system.experience.value"
data-dtype="Number"
>
{{#each ../config.npcExperienceLevels}}
<option
value="{{@key}}"
{{#ife @key ../system.experience.value}}selected{{/ife}}
>{{localize this.label}} ({{@key}})</option>
{{/each}}
</select>
</div>
</div>
<div class="resource flex-group-center">
<label for="system.cr" class="resource-label">{{ localize 'ADVERSITY.role'}}</label>
<label for="system.role.value" class="resource-label">{{ localize 'ADVERSITY.role'}}</label>
<div class="resource-content">
<input type="number" name="system.role.value" value="{{system.role.value }}" data-dtype="Number" min="1" max="4"/>
<span>({{ roleLevel "label" system.role.value }})</span>
<select
name="system.role.value"
id="system.role.value"
data-dtype="Number"
>
{{#each ../config.npcRoleLevels}}
<option
value="{{@key}}"
{{#ife @key ../system.role.value}}selected{{/ife}}
>{{localize this.label}} ({{@key}})</option>
{{/each}}
</select>
</div>
</div>
@@ -51,9 +81,13 @@
<div class="mdb">
<h4 class="align-center">{{ localize 'ADVERSITY.threat'}}</h4>
<ul class="unstyled">
<li>{{ localize 'ADVERSITY.attack'}} {{ threatLevel "attack" system.threat.value }}</li>
<li>{{ localize 'ADVERSITY.vigor'}} {{ threatLevel "vigor" system.threat.value }}</li>
<li>{{ localize 'ADVERSITY.wounds'}} {{ threatLevel "minorWound" system.threat.value }}/{{ threatLevel "majorWound" system.threat.value }}/{{ threatLevel "deadlyWound" system.threat.value }}</li>
<li>{{ localize 'ADVERSITY.attack'}} {{ npcThreatLevel "attack" system.threat.value }}</li>
<li>{{ localize 'ADVERSITY.vigor'}} {{ npcThreatLevel "vigor" system.threat.value }}</li>
<li>{{ localize 'ADVERSITY.wounds'}}
{{ npcThreatLevel "minorWound" system.threat.value }}/
{{ npcThreatLevel "majorWound" system.threat.value }}/
{{ npcThreatLevel "deadlyWound" system.threat.value }}
</li>
</ul>
</div>
@@ -64,19 +98,19 @@
<label for="system.skills" class="">{{ localize "ADVERSITY.skills" }}</label>
<input type="text" name="system.skills" value="{{ system.skills }}" data-dtype="String"/>
</li>
<li>{{ localize 'ADVERSITY.action'}} {{ experienceLevel "action" system.experience.value }}</li>
<li>{{ localize 'ADVERSITY.specialties'}} {{ experienceLevel "specialties" system.experience.value }}</li>
<li>{{ localize 'ADVERSITY.rerolls'}} {{ experienceLevel "rerolls" system.experience.value }}</li>
<li>{{ localize 'ADVERSITY.contact'}} {{ experienceLevel "contact" system.experience.value }}</li>
<li>{{ localize 'ADVERSITY.action'}} {{ npcExperienceLevel "action" system.experience.value }}</li>
<li>{{ localize 'ADVERSITY.specialties'}} {{ npcExperienceLevel "specialties" system.experience.value }}</li>
<li>{{ localize 'ADVERSITY.rerolls'}} {{ npcExperienceLevel "rerolls" system.experience.value }}</li>
<li>{{ localize 'ADVERSITY.contact'}} {{ npcExperienceLevel "contact" system.experience.value }}</li>
</ul>
</div>
<div class="mdb">
<h4 class="align-center">{{ localize 'ADVERSITY.role'}}</h4>
<ul class="unstyled">
<li>{{ localize 'ADVERSITY.reaction'}} {{ roleLevel "reaction" system.role.value }} + {{ roleLevel "reaction_bonus" system.role.value }}</li>
<li>{{ localize 'ADVERSITY.pools'}} {{ roleLevel "pools" system.role.value }}</li>
<li>{{ localize 'ADVERSITY.gear'}} {{ roleLevel "gear" system.role.value }}</li>
<li>{{ localize 'ADVERSITY.protection'}} {{ roleLevel "protection" system.role.value }}</li>
<li>{{ localize 'ADVERSITY.reaction'}} {{ npcRoleLevel "reaction" system.role.value }} + {{ npcRoleLevel "reaction_bonus" system.role.value }}</li>
<li>{{ localize 'ADVERSITY.pools'}} {{ npcRoleLevel "pools" system.role.value }}</li>
<li>{{ localize 'ADVERSITY.gear'}} {{ npcRoleLevel "gear" system.role.value }}</li>
<li>{{ localize 'ADVERSITY.protection'}} {{ npcRoleLevel "protection" system.role.value }}</li>
</ul>
</div>
</section>
@@ -98,4 +132,3 @@
</section>
</form>