feat(combat): refonte UI — tracker v14, handicap III, malus d'attaque, checkbox
Release Creation / build (release) Failing after 1m28s
Release Creation / build (release) Failing after 1m28s
- combat-tracker.hbs + fight.mjs : alignés sur le CSS core v14 (header/tracker/footer, boutons <button>), attitudes/couleurs PJ-PNJ conservées, menu contextuel combatant réparé - less/combat.less (nouveau) : styles custom tracker + footer sticky des dialogues - handicap des 3 dialogues de jet étendu jusqu'à III - dialogue d'attaque : champ « Malus temporaires » (malus sur les jets) - checkbox/radio : flex: 0 0 auto global (fin des icônes étirées — ex. « Deuxième action » 228px → 24px) - TEST_COMBAT.md : plan de test combat rejouable (S1-S8, tout PASS)
This commit is contained in:
+154
-159
@@ -1,200 +1,195 @@
|
||||
<section class="{{cssClass}} directory flexcol" id="{{cssId}}"
|
||||
data-tab="{{tabName}}">
|
||||
<header class="combat-tracker-header">
|
||||
|
||||
{{!-- Encounter Controls --}}
|
||||
{{#if user.isGM}}
|
||||
<nav class="encounters flexrow" aria-label="COMBAT.NavLabel">
|
||||
<a class="combat-button combat-create" data-tooltip="COMBAT.Create">
|
||||
<i class="fas fa-plus"></i>
|
||||
</a>
|
||||
{{#if combatCount}}
|
||||
<a class="combat-button combat-cycle"
|
||||
data-tooltip="COMBAT.EncounterPrevious"
|
||||
{{#if
|
||||
previousId}}data-document-id="{{previousId}}"{{else}}disabled{{/if}}>
|
||||
<i class="fas fa-caret-left"></i>
|
||||
</a>
|
||||
<h4 class="encounter">{{localize "COMBAT.Encounter"}}
|
||||
{{currentIndex}} / {{combatCount}}</h4>
|
||||
<a class="combat-button combat-cycle"
|
||||
data-tooltip="COMBAT.EncounterNext"
|
||||
{{#if
|
||||
nextId}}data-document-id="{{nextId}}"{{else}}disabled{{/if}}>
|
||||
<i class="fas fa-caret-right"></i>
|
||||
</a>
|
||||
<nav class="encounters {{css}}" aria-label="{{localize "COMBAT.NavLabel"}}">
|
||||
|
||||
{{!-- Cycle Display --}}
|
||||
{{#if displayCycle}}
|
||||
<button type="button" class="inline-control icon fa-solid fa-plus" data-action="createCombat"
|
||||
data-tooltip aria-label="{{localize "COMBAT.Create"}}"></button>
|
||||
<div class="cycle-combats">
|
||||
<button type="button" class="inline-control icon fa-solid fa-caret-left" data-action="cycleCombat"
|
||||
{{#if previousId}}data-combat-id="{{previousId}}"{{else}}disabled{{/if}}
|
||||
data-tooltip aria-label="{{localize "COMBAT.EncounterPrevious"}}"></button>
|
||||
<div class="encounter-count">
|
||||
<span class="value">{{currentIndex}}</span>
|
||||
<span class="separator">/</span>
|
||||
<span class="max">{{combats.length}}</span>
|
||||
</div>
|
||||
<button type="button" class="inline-control icon fa-solid fa-caret-right" data-action="cycleCombat"
|
||||
{{#if nextId}}data-combat-id="{{nextId}}"{{else}}disabled{{/if}}
|
||||
data-tooltip aria-label="{{localize "COMBAT.EncounterNext"}}"></button>
|
||||
</div>
|
||||
<button type="button" class="inline-control icon fa-solid fa-trash" data-action="deleteCombat"
|
||||
{{#unless combatCount}}disabled{{/unless}}
|
||||
data-tooltip aria-label="{{localize "COMBAT.Delete"}}"></button>
|
||||
|
||||
{{!-- Tabbed Display --}}
|
||||
{{else if combats.length}}
|
||||
<button type="button" class="inline-control icon fa-solid fa-plus" data-action="createCombat"
|
||||
data-tooltip aria-label="{{localize "COMBAT.Create"}}"></button>
|
||||
{{#each combats}}
|
||||
<button type="button" class="inline-control {{#if active}}active{{/if}}" data-action="cycleCombat"
|
||||
data-combat-id="{{id}}" {{#if name}}data-tooltip aria-label="{{name}}"{{/if}}>{{label}}</button>
|
||||
{{/each}}
|
||||
<button type="button" class="inline-control icon fa-solid fa-trash" data-action="deleteCombat"
|
||||
{{#unless combatCount}}disabled{{/unless}}
|
||||
data-tooltip aria-label="{{localize "COMBAT.Delete"}}"></button>
|
||||
|
||||
{{!-- No Combats --}}
|
||||
{{else}}
|
||||
<button type="button" class="combat-control-lg" data-action="createCombat">
|
||||
<i class="fa-solid fa-plus" inert></i>
|
||||
<span>{{localize "COMBAT.Create"}}</span>
|
||||
</button>
|
||||
{{/if}}
|
||||
<a class="combat-button combat-control" data-tooltip="COMBAT.Delete"
|
||||
data-action="endCombat" {{#unless
|
||||
combatCount}}disabled{{/unless}}>
|
||||
<i class="fas fa-trash"></i>
|
||||
</a>
|
||||
</nav>
|
||||
{{/if}}
|
||||
|
||||
<div class="encounter-controls flexrow {{#if hasCombat}}combat{{/if}}">
|
||||
{{#if user.isGM}}
|
||||
<a class="combat-button combat-control"
|
||||
data-tooltip="COMBAT.RollAll" data-action="rollAll" {{#unless
|
||||
turns}}disabled{{/unless}}>
|
||||
<i class="fas fa-users"></i>
|
||||
</a>
|
||||
<a class="combat-button combat-control"
|
||||
data-tooltip="COMBAT.RollNPC" data-action="rollNPC" {{#unless
|
||||
turns}}disabled{{/unless}}>
|
||||
<i class="fas fa-users-cog"></i>
|
||||
</a>
|
||||
{{/if}}
|
||||
{{!-- Encounter Name --}}
|
||||
{{#if combat.name}}
|
||||
<h2 class="encounter-name">{{combat.name}}</h2>
|
||||
{{/if}}
|
||||
|
||||
{{#if combatCount}}
|
||||
{{#if combat.round}}
|
||||
<h3 class="encounter-title noborder">{{localize 'COMBAT.Round'}}
|
||||
{{combat.round}}</h3>
|
||||
{{else}}
|
||||
<h3 class="encounter-title noborder">{{localize
|
||||
'COMBAT.NotStarted'}}</h3>
|
||||
{{/if}}
|
||||
{{else}}
|
||||
<h3 class="encounter-title noborder">{{localize "COMBAT.None"}}</h3>
|
||||
{{/if}}
|
||||
<div class="encounter-controls {{#if hasCombat}}combat{{/if}}">
|
||||
|
||||
{{!-- Bulk Rolls --}}
|
||||
<div class="control-buttons left flexrow">
|
||||
{{#if user.isGM}}
|
||||
<button type="button" class="inline-control combat-control icon fa-solid fa-users" data-action="rollAll"
|
||||
{{#unless turns.length}}disabled{{/unless}} data-tooltip="COMBAT.RollAll"
|
||||
aria-label="{{localize "COMBAT.RollAll"}}"></button>
|
||||
<button type="button" class="inline-control combat-control icon fa-solid fa-users-cog" data-action="rollNPC"
|
||||
{{#unless turns.length}}disabled{{/unless}} data-tooltip="COMBAT.RollNPC"
|
||||
aria-label="{{localize "COMBAT.RollNPC"}}"></button>
|
||||
{{else}}
|
||||
<div class="spacer"></div>
|
||||
<div class="spacer"></div>
|
||||
{{/if}}
|
||||
</div>
|
||||
|
||||
{{!-- Combat Status --}}
|
||||
<strong class="encounter-title">
|
||||
{{#if combats.length}}
|
||||
{{#if combat.round}}
|
||||
{{localize "COMBAT.Round" round=combat.round}}
|
||||
{{else}}
|
||||
{{localize "COMBAT.NotStarted"}}
|
||||
{{/if}}
|
||||
{{else}}
|
||||
{{localize "COMBAT.None"}}
|
||||
{{/if}}
|
||||
</strong>
|
||||
|
||||
{{!-- Combat Controls --}}
|
||||
<div class="control-buttons right flexrow">
|
||||
<div class="spacer"></div>
|
||||
<button type="button" class="encounter-context-menu inline-control combat-control icon fa-solid fa-ellipsis-vertical"
|
||||
{{#unless (and user.isGM hasCombat)}}disabled{{/unless}}></button>
|
||||
</div>
|
||||
|
||||
{{#if user.isGM}}
|
||||
<a class="combat-button combat-control"
|
||||
data-tooltip="COMBAT.InitiativeReset" data-action="resetAll"
|
||||
{{#unless hasCombat}}disabled{{/unless}}>
|
||||
<i class="fas fa-undo"></i>
|
||||
</a>
|
||||
<a class="combat-button combat-control"
|
||||
data-tooltip="{{labels.scope}}"
|
||||
data-action="toggleSceneLink" {{#unless
|
||||
hasCombat}}disabled{{/unless}}>
|
||||
<i class="fas fa-{{#unless linked}}un{{/unless}}link"></i>
|
||||
</a>
|
||||
<a class="combat-button combat-settings"
|
||||
data-tooltip="COMBAT.Settings" data-action="trackerSettings">
|
||||
<i class="fas fa-cog"></i>
|
||||
</a>
|
||||
{{/if}}
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<ol id="combat-tracker" class="directory-list">
|
||||
{{#each turns as |turn index|}}
|
||||
<li class="combatant actor directory-item flexrow {{turn.css}}"
|
||||
data-combatant-id="{{turn.id}}">
|
||||
<img class="token-image" data-src="{{turn.img}}"
|
||||
alt="{{turn.name}}" />
|
||||
<div class="token-name flexcol">
|
||||
<h4
|
||||
class="{{getCombatTrackerColor turn.isPlayer turn.isNpc}}">{{turn.name}}</h4>
|
||||
<div class="combatant-controls flexrow flex-between">
|
||||
<div class="flexrow flex-around">
|
||||
<a
|
||||
class="combatant-control {{#if turn.hidden}}active{{/if}}"
|
||||
data-tooltip="COMBAT.ToggleVis"
|
||||
data-action="toggleHidden">
|
||||
<i class="fas fa-eye-slash"></i>
|
||||
</a>
|
||||
<a
|
||||
class="combatant-control {{#if turn.defeated}}active{{/if}}"
|
||||
data-tooltip="COMBAT.ToggleDead"
|
||||
data-action="toggleDefeated">
|
||||
<i class="fas fa-skull"></i>
|
||||
</a>
|
||||
|
||||
{{#if turn.canPing}}
|
||||
<a class="combatant-control"
|
||||
data-tooltip="COMBAT.PingCombatant"
|
||||
data-action="pingCombatant">
|
||||
<i class="fa-solid fa-bullseye-arrow"></i>
|
||||
</a>
|
||||
{{/if}}
|
||||
</div>
|
||||
{{#if turn.owner }}
|
||||
|
||||
<div class="flexrow flex-around">
|
||||
<a class="combatant-control offensive status"
|
||||
data-tooltip="{{localize 'ATTITUDES.offensive.name'}}"
|
||||
data-attitude="offensive">
|
||||
<i
|
||||
class="fas fa-fist-raised"
|
||||
style="{{#if (eq turn.attitude "offensive")}}color:white
|
||||
{{else}}color:gray {{/if}}"></i>
|
||||
</a>
|
||||
<a class="combatant-control active status"
|
||||
data-tooltip="{{localize 'ATTITUDES.active.name'}}"
|
||||
data-attitude="active">
|
||||
<i
|
||||
class="fas fa-bow-arrow"
|
||||
style="{{#if (eq turn.attitude "active")}}color:white
|
||||
{{else}} color:gray
|
||||
{{/if}}"></i>
|
||||
</a>
|
||||
<a class="combatant-control passive status"
|
||||
data-tooltip="{{localize 'ATTITUDES.passive.name'}}"
|
||||
data-attitude="passive">
|
||||
<i class="fas fa-snooze"
|
||||
style="{{#if (eq turn.attitude "passive")}}color:white
|
||||
{{else}} color:gray{{/if}}"></i>
|
||||
</a>
|
||||
<ol class="combat-tracker plain">
|
||||
{{#each turns}}
|
||||
<li class="combatant {{css}}" data-combatant-id="{{id}}">
|
||||
<img class="token-image" src="{{img}}" alt="{{name}}" loading="lazy">
|
||||
<div class="token-name">
|
||||
<strong class="name {{getCombatTrackerColor isPlayer isNpc}}">{{name}}</strong>
|
||||
<div class="combatant-controls">
|
||||
{{#if @root.user.isGM}}
|
||||
<button type="button" class="inline-control combatant-control icon fa-solid fa-eye-slash {{#if hidden}}active{{/if}}"
|
||||
data-action="toggleHidden" data-tooltip
|
||||
aria-label="{{localize (ifThen hidden "COMBATANT.Show" "COMBATANT.Hide")}}"></button>
|
||||
<button type="button" class="inline-control combatant-control icon fa-solid fa-skull {{#if isDefeated}}active{{/if}}"
|
||||
data-action="toggleDefeated" data-tooltip
|
||||
aria-label="{{localize (ifThen isDefeated "COMBATANT.UnmarkDefeated" "COMBATANT.MarkDefeated")}}"></button>
|
||||
<button type="button" class="inline-control combatant-control icon fa-solid fa-trash"
|
||||
data-action="deleteCombatant" data-tooltip
|
||||
aria-label="{{localize "COMBATANT.ACTIONS.Remove"}}"></button>
|
||||
{{/if}}
|
||||
{{#if canPing}}
|
||||
<button type="button" class="inline-control combatant-control icon fa-solid fa-bullseye-arrow"
|
||||
data-action="pingCombatant" data-tooltip
|
||||
aria-label="{{localize "COMBATANT.Ping"}}"></button>
|
||||
{{/if}}
|
||||
{{#if owner}}
|
||||
<div class="combatant-attitudes">
|
||||
<button type="button" class="inline-control combatant-control status offensive {{#ife attitude "offensive"}}active{{/ife}}"
|
||||
data-attitude="offensive" data-tooltip
|
||||
aria-label="{{localize "ATTITUDES.offensive.name"}}"><i class="fa-solid fa-fist-raised"></i></button>
|
||||
<button type="button" class="inline-control combatant-control status active {{#ife attitude "active"}}active{{/ife}}"
|
||||
data-attitude="active" data-tooltip
|
||||
aria-label="{{localize "ATTITUDES.active.name"}}"><i class="fa-solid fa-bow-arrow"></i></button>
|
||||
<button type="button" class="inline-control combatant-control status passive {{#ife attitude "passive"}}active{{/ife}}"
|
||||
data-attitude="passive" data-tooltip
|
||||
aria-label="{{localize "ATTITUDES.passive.name"}}"><i class="fa-solid fa-snooze"></i></button>
|
||||
</div>
|
||||
{{/if}}
|
||||
|
||||
<div class="token-effects">
|
||||
{{#each turn.effects}}
|
||||
<img class="token-effect" src="{{this}}" />
|
||||
{{#each effects}}
|
||||
<img class="token-effect" src="{{this}}" alt="">
|
||||
{{/each}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{#if this.hasResource}}
|
||||
{{!-- Resource --}}
|
||||
{{#if hasResource}}
|
||||
<div class="token-resource">
|
||||
<span class="resource">{{this.resource}}</span>
|
||||
<span class="resource">{{resource}}</span>
|
||||
</div>
|
||||
{{/if}}
|
||||
|
||||
{{!-- Initiative --}}
|
||||
<div class="token-initiative">
|
||||
{{#if this.hasRolled}}
|
||||
<span class="initiative">{{this.initiative}}</span>
|
||||
{{else if this.owner}}
|
||||
<a class="combatant-control roll"
|
||||
data-tooltip="COMBAT.InitiativeRoll"
|
||||
data-action="rollInitiative"></a>
|
||||
{{#if hasRolled}}
|
||||
<span>{{initiative}}</span>
|
||||
{{else if isOwner}}
|
||||
<button type="button" class="combatant-control roll" data-action="rollInitiative" data-tooltip
|
||||
aria-label="{{localize "COMBAT.InitiativeRoll"}}"
|
||||
style="--initiative-icon: url('{{@root.initiativeIcon.icon}}'); --initiative-icon-hover: url('{{@root.initiativeIcon.hover}}');"></button>
|
||||
{{/if}}
|
||||
</div>
|
||||
</li>
|
||||
{{/each}}
|
||||
</ol>
|
||||
|
||||
<nav id="combat-controls" class="directory-footer flexrow"
|
||||
data-tooltip-direction="UP">
|
||||
<nav class="combat-controls" data-tooltip-direction="UP">
|
||||
{{#if hasCombat}}
|
||||
{{#if user.isGM}}
|
||||
{{#if round}}
|
||||
<a class="combat-control" data-tooltip="COMBAT.RoundPrev"
|
||||
data-action="previousRound"><i
|
||||
class="fas fa-step-backward"></i></a>
|
||||
<a class="combat-control" data-tooltip="COMBAT.TurnPrev"
|
||||
data-action="previousTurn"><i
|
||||
class="fas fa-arrow-left"></i></a>
|
||||
<a class="combat-control center" data-action="endCombat">{{localize
|
||||
'COMBAT.End'}}</a>
|
||||
<a class="combat-control" data-tooltip="COMBAT.TurnNext"
|
||||
data-action="nextTurn"><i class="fas fa-arrow-right"></i></a>
|
||||
<a class="combat-control" data-tooltip="COMBAT.RoundNext"
|
||||
data-action="nextRound"><i class="fas fa-step-forward"></i></a>
|
||||
<button type="button" class="inline-control combat-control icon fa-solid fa-backward-step" data-action="previousRound"
|
||||
data-tooltip aria-label="{{localize "COMBAT.RoundPrev"}}"></button>
|
||||
<button type="button" class="inline-control combat-control icon fa-solid fa-arrow-left" data-action="previousTurn"
|
||||
data-tooltip aria-label="{{localize "COMBAT.TurnPrev"}}"></button>
|
||||
<button type="button" class="combat-control combat-control-lg" data-action="endCombat">
|
||||
<i class="fa-solid fa-xmark" inert></i>
|
||||
<span>{{localize "COMBAT.End"}}</span>
|
||||
</button>
|
||||
<button type="button" class="inline-control combat-control icon fa-solid fa-arrow-right" data-action="nextTurn"
|
||||
data-tooltip aria-label="{{localize "COMBAT.TurnNext"}}"></button>
|
||||
<button type="button" class="inline-control combat-control icon fa-solid fa-forward-step" data-action="nextRound"
|
||||
data-tooltip aria-label="{{localize "COMBAT.RoundNext"}}"></button>
|
||||
{{else}}
|
||||
<a class="combat-control center"
|
||||
data-action="startCombat">{{localize
|
||||
'COMBAT.Begin'}}</a>
|
||||
<button type="button" class="combat-control combat-control-lg" data-action="startCombat">
|
||||
<i class="fa-solid fa-swords" inert></i>
|
||||
<span>{{localize "COMBAT.Begin"}}</span>
|
||||
</button>
|
||||
{{/if}}
|
||||
{{else if control}}
|
||||
<a class="combat-control" data-tooltip="COMBAT.TurnPrev"
|
||||
data-action="previousTurn"><i
|
||||
class="fas fa-arrow-left"></i></a>
|
||||
<a class="combat-control center" data-action="nextTurn">{{localize
|
||||
'COMBAT.TurnEnd'}}</a>
|
||||
<a class="combat-control" data-tooltip="COMBAT.TurnNext"
|
||||
data-action="nextTurn"><i class="fas fa-arrow-right"></i></a>
|
||||
<button type="button" class="inline-control combat-control icon fa-solid fa-arrow-left" data-action="previousTurn"
|
||||
data-tooltip aria-label="{{localize "COMBAT.TurnPrev"}}"></button>
|
||||
<button type="button" class="combat-control combat-control-lg" data-action="nextTurn">
|
||||
<i class="fa-solid fa-check" inert></i>
|
||||
<span>{{localize "COMBAT.TurnEnd"}}</span>
|
||||
</button>
|
||||
<button type="button" class="inline-control combat-control icon fa-solid fa-arrow-right" data-action="nextTurn"
|
||||
data-tooltip aria-label="{{localize "COMBAT.TurnNext"}}"></button>
|
||||
{{/if}}
|
||||
{{/if}}
|
||||
</nav>
|
||||
|
||||
@@ -59,7 +59,7 @@
|
||||
<div class="flexcol skill-section">
|
||||
<label class="label">{{localize 'VERMINE.skill_title'}}</label>
|
||||
{{#if isCharacter}}
|
||||
<div class="locked-value">{{ smarttlk 'SKILLS' skillKey 'name' }} / {{ skillValue }}</div>
|
||||
<div class="locked-value">{{#if skillKey}}{{ smarttlk 'SKILLS' skillKey 'name' }}{{else}}{{ localize 'VERMINE.none' }}{{/if}} / {{ skillValue }}</div>
|
||||
{{else}}
|
||||
<div class="locked-value">{{localize 'VERMINE.pool_total'}}</div>
|
||||
{{/if}}
|
||||
@@ -112,10 +112,11 @@
|
||||
<div class="flexcol handicap-section">
|
||||
<label class="label" for="handicap">{{localize 'VERMINE.handicap'}}</label>
|
||||
<select class="info-value" data-roll="true" data-dtype="String" type="number"
|
||||
name="handicap" id="handicap" min="0" max="2">
|
||||
name="handicap" id="handicap" min="0" max="3">
|
||||
<option value="1" selected>{{localize 'VERMINE.none'}}</option>
|
||||
<option value="2">(I)</option>
|
||||
<option value="3">(II)</option>
|
||||
<option value="4">(III)</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
@@ -170,6 +171,13 @@
|
||||
<span>D</span>
|
||||
</div>
|
||||
|
||||
<div class="flexrow bonus-item full-width">
|
||||
<label class="label" for="temporary-malus">{{localize 'VERMINE.temporary_malus'}}</label>
|
||||
<input type="number" data-roll="true" class="numeric-entry" style="text-align: center;"
|
||||
name="temporary-malus" id="temporary-malus" min="0" max="5" value="0" />
|
||||
<span>D</span>
|
||||
</div>
|
||||
|
||||
{{#if isCharacter}}
|
||||
<div class="flexrow bonus-item full-width">
|
||||
<label class="label" for="self_control">
|
||||
|
||||
@@ -50,11 +50,12 @@
|
||||
name="handicap"
|
||||
id="handicap"
|
||||
min="0"
|
||||
max="2"
|
||||
max="3"
|
||||
>
|
||||
<option value="1" selected>{{localize 'VERMINE.none'}}</option>
|
||||
<option value="2">(I)</option>
|
||||
<option value="3">(II)</option>
|
||||
<option value="4">(III)</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
|
||||
@@ -169,11 +169,12 @@
|
||||
name="handicap"
|
||||
id="handicap"
|
||||
min="0"
|
||||
max="2"
|
||||
max="3"
|
||||
>
|
||||
<option value="1" selected>{{localize 'VERMINE.none'}}</option>
|
||||
<option value="2">(I)</option>
|
||||
<option value="3">(II)</option>
|
||||
<option value="4">(III)</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user