feat: separate skill value/max (transcendence pool vs level)
Release Creation / build (release) Successful in 58s

- skill.value = spendable transcendence pool (editable select)
- skill.max = max level (locked by default, unlock btn)
- computeRollFormula/computeResults/confront use skill.max
- clamp transcendence spend to skill.value
- resetTranscendence button in Bio&Notes
- v14 compat: duplicate→deepClone, mergeObject→spread, socket fixes
- Dialog v1 removed, DragDrop dedup, await fixes
This commit is contained in:
2026-07-24 09:00:26 +02:00
parent 8c79e6f0ba
commit 31e2561797
63 changed files with 385 additions and 340 deletions
+5
View File
@@ -53,5 +53,10 @@
value=system.biodata.gmnotes name="system.biodata.gmnotes" toggled=true}}
</div>
<hr>
<div class="form-group">
<button type="button" data-action="resetTranscendence" title="{{localize "ECRY.ui.resetTranscendence"}}">
<i class="fas fa-undo-alt"></i> {{localize "ECRY.ui.resetTranscendence"}}
</button>
</div>
</section>
+17 -2
View File
@@ -13,10 +13,18 @@
{{localize skill.name}}
</a>
</span>
<select class="item-field-label-short"
name="system.cephaly.skilllist.{{skillkey}}.value">
<select class="item-field-skill-level"
name="system.cephaly.skilllist.{{skillkey}}.value"
title="{{localize "ECRY.ui.transcendenceCurrent"}}">
{{selectOptions @root.config.skillLevel selected=skill.value}}
</select>
<span class="skill-separator">/</span>
<select class="item-field-skill-level"
name="system.cephaly.skilllist.{{skillkey}}.max"
title="{{localize "ECRY.ui.transcendenceMax"}}"
{{#unless @root.editScore}}disabled{{/unless}}>
{{selectOptions @root.config.skillLevel selected=skill.max}}
</select>
</li>
{{/each}}
</ul>
@@ -39,4 +47,11 @@
</div>
<div class="skill-toolbar">
<a data-action="lockUnlock" title="{{localize "ECRY.ui.toggleEditMax"}}">
<i class="fas {{#if @root.editScore}}fa-lock-open{{else}}fa-lock{{/if}}"></i>
{{localize "ECRY.ui.toggleEditMax"}}
</a>
</div>
</section>
+39 -5
View File
@@ -116,11 +116,18 @@
<i class="fa-solid fa-dice-d6"></i>
{{localize skill.name}}
</a></span>
<select class="item-field-label-short" type="text"
name="system.skills.{{categkey}}.skilllist.{{skillkey}}.value" value="{{skill.value}}"
data-dtype="Number">
<select class="item-field-skill-level"
name="system.skills.{{categkey}}.skilllist.{{skillkey}}.value"
title="{{localize "ECRY.ui.transcendenceCurrent"}}">
{{selectOptions @root.config.skillLevel selected=skill.value}}
</select>
<span class="skill-separator">/</span>
<select class="item-field-skill-level"
name="system.skills.{{categkey}}.skilllist.{{skillkey}}.max"
title="{{localize "ECRY.ui.transcendenceMax"}}"
{{#unless editScore}}disabled{{/unless}}>
{{selectOptions @root.config.skillLevel selected=skill.max}}
</select>
</li>
<li class="item flexrow list-item">
<ul class="ul-level1">
@@ -147,6 +154,13 @@
{{/each}}
</div>
<div class="skill-toolbar">
<a class="lock-unlock-sheet" title="{{localize "ECRY.ui.toggleEditMax"}}">
<i class="fas {{#if editScore}}fa-lock-open{{else}}fa-lock{{/if}}"></i>
{{localize "ECRY.ui.toggleEditMax"}}
</a>
</div>
</div>
{{#if hasCephaly}}
@@ -166,10 +180,18 @@
<i class="fa-solid fa-dice-d6"></i>
{{localize skill.name}}
</a></span>
<select class="item-field-label-short" type="text" name="system.cephaly.skilllist.{{skillkey}}.value"
value="{{skill.value}}" data-dtype="Number">
<select class="item-field-skill-level"
name="system.cephaly.skilllist.{{skillkey}}.value"
title="{{localize "ECRY.ui.transcendenceCurrent"}}">
{{selectOptions @root.config.skillLevel selected=skill.value}}
</select>
<span class="skill-separator">/</span>
<select class="item-field-skill-level"
name="system.cephaly.skilllist.{{skillkey}}.max"
title="{{localize "ECRY.ui.transcendenceMax"}}"
{{#unless editScore}}disabled{{/unless}}>
{{selectOptions @root.config.skillLevel selected=skill.max}}
</select>
</li>
{{/each}}
</ul>
@@ -193,6 +215,13 @@
</div>
<div class="skill-toolbar">
<a class="lock-unlock-sheet" title="{{localize "ECRY.ui.toggleEditMax"}}">
<i class="fas {{#if editScore}}fa-lock-open{{else}}fa-lock{{/if}}"></i>
{{localize "ECRY.ui.toggleEditMax"}}
</a>
</div>
</div>
{{/if}}
@@ -399,6 +428,11 @@
{{editor notes target="system.biodata.notes" button=true owner=owner editable=editable}}
</div>
<hr>
<div class="form-group">
<button type="button" class="reset-transcendence" title="{{localize "ECRY.ui.resetTranscendence"}}">
<i class="fas fa-undo-alt"></i> {{localize "ECRY.ui.resetTranscendence"}}
</button>
</div>
</div>
+17 -2
View File
@@ -38,10 +38,18 @@
{{localize skill.name}}
</a>
</span>
<select class="item-field-label-short"
name="system.skills.{{categkey}}.skilllist.{{skillkey}}.value">
<select class="item-field-skill-level"
name="system.skills.{{categkey}}.skilllist.{{skillkey}}.value"
title="{{localize "ECRY.ui.transcendenceCurrent"}}">
{{selectOptions @root.config.skillLevel selected=skill.value}}
</select>
<span class="skill-separator">/</span>
<select class="item-field-skill-level"
name="system.skills.{{categkey}}.skilllist.{{skillkey}}.max"
title="{{localize "ECRY.ui.transcendenceMax"}}"
{{#unless @root.editScore}}disabled{{/unless}}>
{{selectOptions @root.config.skillLevel selected=skill.max}}
</select>
</li>
<li class="item flexrow list-item">
<ul class="ul-level1">
@@ -67,4 +75,11 @@
</div>
<div class="skill-toolbar">
<a data-action="lockUnlock" title="{{localize "ECRY.ui.toggleEditMax"}}">
<i class="fas {{#if @root.editScore}}fa-lock-open{{else}}fa-lock{{/if}}"></i>
{{localize "ECRY.ui.toggleEditMax"}}
</a>
</div>
</section>
@@ -20,7 +20,7 @@
<li>Confrontation : <strong>{{alias}}</strong></li>
{{/if}}
<li>{{localize skill.name}}: <strong>{{skill.value}}</strong></li>
<li>{{localize skill.name}}: <strong>{{skill.max}} ({{skill.value}})</strong></li>
{{#if spec}}
<li>{{localize "ECRY.chat.specialization"}} {{spec.name}} (+{{spec.system.bonus}})</li>
{{/if}}
+1 -1
View File
@@ -12,7 +12,7 @@
<ul>
<li><strong>Confrontation</strong> : {{rollData1.alias}} vs {{rollData2.alias}}</li>
<li>{{localize rollData1.skill.name}} ({{rollData1.skill.value}}) vs {{localize rollData2.skill.name}} ({{rollData2.skill.value}})</li>
<li>{{localize rollData1.skill.name}} ({{rollData1.skill.max}}/{{rollData1.skill.value}}) vs {{localize rollData2.skill.name}} ({{rollData2.skill.max}}/{{rollData2.skill.value}})</li>
<li>{{localize "ECRY.ui.execution"}} : {{rollData1.executionTotal}} vs {{rollData2.preservationTotal}} → <strong>{{marginExecution}}</strong></li>
<li>{{localize "ECRY.ui.preservation"}} : {{rollData1.preservationTotal}} vs {{rollData2.executionTotal}} → <strong>{{marginPreservation}}</strong></li>
+1 -1
View File
@@ -15,7 +15,7 @@
<ul>
{{#if skill}}
<li>{{localize skill.name}}: <strong>{{skill.value}}</strong></li>
<li>{{localize skill.name}}: <strong>{{skill.max}} ({{skill.value}})</strong></li>
{{#if spec}}
<li>{{localize "ECRY.chat.specialization"}} {{spec.name}} (+{{spec.system.bonus}})</li>
{{/if}}
+1 -1
View File
@@ -3,7 +3,7 @@
{{#if img}}
<img class="actor-icon" src="{{img}}" title="{{name}}" />
{{/if}}
<h1 class="dialog-roll-title roll-dialog-header">{{title}} ({{skill.value}})</h1>
<h1 class="dialog-roll-title roll-dialog-header">{{title}} ({{skill.max}})</h1>
</header>
<div class="flexcol">
@@ -1,7 +1,7 @@
{{#if skill}}
<div class="flexrow">
<span class="roll-dialog-label">{{localize skill.name}} : </span>
<span class="roll-dialog-label">{{skill.value}}</span>
<span class="roll-dialog-label">{{skill.max}} ({{skill.value}})</span>
</div>
{{#if impactMalus}}