feat: portée armes, récupération 3T, socket loksyu, import batch

Portée des armes
- Suppression des malus de portée (mediane/longue/extreme)
- Sélecteur filtré : seules les portées <= portée max de l'arme

Récupération (3 Trésors)
- Nouveau bouton dans l'onglet Trésors
- Jet basé sur l'aspect du Gardien Céleste
- Dé pair : +1 Hei Yang, +1 San
- Dé impair : +1 Hei Yin, +1 Zing
- Fenêtre de bonus dice pour les pouvoirs (Acupuncture...)
- Ignore les malus de palier San/Zing

Socket Loksyu/TinJi
- Les joueurs peuvent mettre à jour Loksyu/TinJi via socket
- Le MJ proxy les écritures (game.settings world = GM only)
- Opérations atomiques pour éviter les races conditions (roll simultanés)

Import batch
- 4 nouveaux migrators item (weapon/armor/sanhei/ingredient)
- magicOrder dans la migration character
- Confirmation en 2 clics avant l'import
- Détection des doublons avec le monde
- Progression en direct pendant l'import
- Dédoublonnage non-silencieux + flag _duplicate calculé en direct

UI
- Noms d'items en Signika (plus lisible qu'Averia)
- ASCII art au lancement dans la console
- Clés i18n manquantes ajoutées (BonusMalus, EnablePrompt, Material, Roll, ThrowType)

Fix divers
- Calcul puissance sort : utilise l'élément de la spécialité, pas celui de l'école
- preLocalizeConfig préserve labelelementkey pour la résolution d'aspect
- combat.js: guard undefined ids dans rollInitiative
This commit is contained in:
2026-06-28 19:18:03 +02:00
parent 9c4f5948fd
commit 6b2ead8fbb
10 changed files with 497 additions and 38 deletions
@@ -1,3 +1,10 @@
{{!-- Recovery button --}}
<div class="cde-recovery-bar">
<button type="button" class="cde-recovery-btn" data-action="recovery">
<i class="fas fa-heartbeat"></i> {{ localize "CDE.Recovery" }}
</button>
</div>
{{!-- HEI — Essence --}}
<div class="tab-sous-titre">{{ localize "CDE.HEI" }} — {{ localize "CDE.Essence2" }}</div>
<div class="cde-tt-block">
+13
View File
@@ -0,0 +1,13 @@
<div class="cde-roll-prompt cde-recovery-prompt {{cssClass}}">
<div class="cde-roll-header">
<span class="cde-roll-title">{{ localize "CDE.Recovery" }}</span>
<span class="cde-roll-dice-count">{{basedice}}<span class="cde-roll-dice-label">d10</span></span>
</div>
<div class="cde-roll-section">
<div class="cde-roll-field">
<label>{{ localize "CDE.RecoveryBaseDice" }}</label>
<input type="number" name="bonusdice" value="0" min="0" max="20" />
</div>
</div>
</div>
+3 -5
View File
@@ -41,11 +41,9 @@
<div class="cde-roll-field">
<label>{{ localize "CDE.EffectiveRange" }}</label>
<select name="effectiverange">
<option value="contact" {{#if (eq effectiverange "contact")}}selected{{/if}}>{{ localize "CDE.RangeContact" }} (±0)</option>
<option value="courte" {{#if (eq effectiverange "courte") }}selected{{/if}}>{{ localize "CDE.RangeCourte" }} (±0)</option>
<option value="mediane" {{#if (eq effectiverange "mediane")}}selected{{/if}}>{{ localize "CDE.RangeMediane" }} (1)</option>
<option value="longue" {{#if (eq effectiverange "longue") }}selected{{/if}}>{{ localize "CDE.RangeLongue" }} (2)</option>
<option value="extreme" {{#if (eq effectiverange "extreme")}}selected{{/if}}>{{ localize "CDE.RangeExtreme" }} (3)</option>
{{#each validRanges}}
<option value="{{value}}" {{#if selected}}selected{{/if}}>{{ localize label }}</option>
{{/each}}
</select>
</div>
<div class="cde-roll-field">