New combat management and various improvments
All checks were successful
Release Creation / build (release) Successful in 48s

This commit is contained in:
2026-01-19 23:22:32 +01:00
parent a06dfa0ae9
commit 52877e3a68
46 changed files with 4655 additions and 475 deletions

View File

@@ -1,193 +1,291 @@
{{!log 'chat-message' this}}
{{!log 'weaponDamageOptions' weaponDamageOptions}}
<div class="{{cssClass}}">
<div class="intro-chat">
<div class="intro-img">
<img src="{{actingCharImg}}" data-tooltip="{{actingCharName}}" />
</div>
<div class="intro-right">
<span><STRONG>{{actingCharName}} - {{upperFirst rollName}}</STRONG></span>
{{#if (match rollType "attack")}}
<span>Attack roll !</span>
{{/if}}
{{#if (match rollType "defense")}}
<span>Defense roll !</span>
{{/if}}
{{#if (eq rollData.favor "favor")}}
<span><strong>Favor roll</strong></span>
{{/if}}
{{#if (eq rollData.favor "disfavor")}}
<span><strong>Disfavor roll</strong></span>
{{/if}}
{{#if badResult}}
<span><strong>{{localize "LETHALFANTASY.Label.otherResult"}}</strong>
:
{{badResult}}</span>
{{/if}}
{{#if rollTarget.weapon}}
<span>{{rollTarget.weapon.name}}</span>
{{/if}}
{{#if rollData.isDamage}}
<span><strong>Damage Roll</strong></span>
{{/if}}
{{#if rollData.damageSmall}}
<span><strong>{{localize
"LETHALFANTASY.Label.weapon-damage-small"
}}</strong></span>
{{/if}}
{{#if rollData.damageMedium}}
<span><strong>{{localize
"LETHALFANTASY.Label.weapon-damage-medium"
}}</strong></span>
{{/if}}
{{#if rollData.letItFly}}
<span>Let It Fly attack ! </span>
{{/if}}
{{#if rollData.pointBlank}}
<span>Point Blank Range Attack !</span>
{{/if}}
{{#if rollData.beyondSkill}}
<span>Beyond Skill Range Attack !</span>
{{/if}}
<span><strong>Formula</strong> : {{titleFormula}}</span>
{{#each diceResults as |result|}}
<span>{{result.dice}} : {{result.value}}</span>
{{/each}}
<!-- Header with character info -->
<div class="chat-header">
<div class="character-info">
<div class="character-avatar">
<img src="{{actingCharImg}}" data-tooltip="{{actingCharName}}" />
</div>
<div class="character-details">
<div class="character-name">{{actingCharName}}</div>
<div class="roll-type-badge">
{{#if (match rollType "attack")}}
<i class="fa-solid fa-swords"></i>
{{/if}}
{{#if (match rollType "defense")}}
<i class="fa-solid fa-shield"></i>
{{/if}}
{{#if rollData.isDamage}}
<i class="fa-solid fa-burst"></i>
{{/if}}
{{#if (eq rollType "skill")}}
<i class="fa-solid fa-hand-sparkles"></i>
{{/if}}
{{upperFirst rollName}}
</div>
</div>
</div>
</div>
{{#if isSave}}
<div class="result">
{{#if (eq resultType "success")}}
{{#if isPrivate}}?{{else}}{{localize
"LETHALFANTASY.Roll.success"
}}{{/if}}
{{else}}
{{#if isPrivate}}?{{else}}{{localize
"LETHALFANTASY.Roll.failure"
}}{{/if}}
{{/if}}
</div>
{{/if}}
{{#if isResource}}
<div class="result">
{{#if (eq resultType "success")}}
{{#if isPrivate}}?{{else}}{{localize
"LETHALFANTASY.Roll.success"
}}{{/if}}
{{else}}
{{#if isPrivate}}?{{else}}{{localize "LETHALFANTASY.Roll.failure"}}{{#if
isFailure
}} ({{localize "LETHALFANTASY.Roll.resourceLost"}}){{/if}}{{/if}}
{{/if}}
</div>
{{/if}}
{{#if isDamage}}
<div>
{{#if (and isGM hasTarget)}}
{{{localize
"LETHALFANTASY.Roll.displayArmor"
targetName=targetName
targetArmor=targetArmor
realDamage=realDamage
}}}
{{/if}}
</div>
{{/if}}
{{#unless isPrivate}}
<div class="dice-result">
<h4 class="dice-total">{{total}}</h4>
</div>
{{#if D30result}}
<div class="dice-result">
<h4 class="dice-total">D30 result: {{D30result}}</h4>
<!-- Roll details and modifiers -->
<div class="roll-details">
{{#if rollTarget.weapon}}
<div class="detail-item weapon-name">
<i class="fa-solid fa-sword"></i>
<span>{{rollTarget.weapon.name}}</span>
</div>
{{/if}}
{{/unless}}
{{#if (eq rollData.favor "favor")}}
<div class="detail-badge favor-badge">
<i class="fa-solid fa-sparkles"></i>
<span>Favor</span>
</div>
{{/if}}
{{#if (eq rollData.favor "disfavor")}}
<div class="detail-badge disfavor-badge">
<i class="fa-solid fa-skull"></i>
<span>Disfavor</span>
</div>
{{/if}}
{{#if weaponDamageOptions}}
<div class="damage-buttons">
<div class="damage-buttons-title">{{localize
"LETHALFANTASY.Label.rollDamage"
}}</div>
<div class="damage-buttons-grid {{#if weaponDamageOptions.isMonster}}monster-damage{{/if}}">
{{#if weaponDamageOptions.isMonster}}
<button
class="damage-roll-btn"
data-weapon-id="{{weaponDamageOptions.weaponId}}"
data-damage-type="monster"
data-damage-formula="{{weaponDamageOptions.damageFormula}}"
data-damage-modifier="{{weaponDamageOptions.damageModifier}}"
data-is-monster="true"
title="{{weaponDamageOptions.weaponName}}"
>
<i class="fa-solid fa-dice"></i>
Damage:
{{weaponDamageOptions.damageFormula}}{{#if
weaponDamageOptions.damageModifier
}}+{{weaponDamageOptions.damageModifier}}{{/if}}
</button>
{{else}}
{{#if weaponDamageOptions.damageS}}
<button
class="damage-roll-btn"
data-weapon-id="{{weaponDamageOptions.weaponId}}"
data-damage-type="small"
data-damage-formula="{{weaponDamageOptions.damageS}}"
data-is-monster="false"
title="{{localize 'LETHALFANTASY.Label.weapon-damage-small'}}"
>
<i class="fa-solid fa-dice-d6"></i>
{{localize "LETHALFANTASY.Label.weapon-damage-small"}}
</button>
{{#if rollData.letItFly}}
<div class="detail-badge special-badge">
<i class="fa-solid fa-bow-arrow"></i>
<span>Let It Fly!</span>
</div>
{{/if}}
{{#if rollData.pointBlank}}
<div class="detail-badge special-badge">
<i class="fa-solid fa-bullseye-arrow"></i>
<span>Point Blank</span>
</div>
{{/if}}
{{#if rollData.beyondSkill}}
<div class="detail-badge special-badge">
<i class="fa-solid fa-target-lock"></i>
<span>Beyond Skill</span>
</div>
{{/if}}
{{#if rollData.damageSmall}}
<div class="detail-badge damage-badge">
<i class="fa-solid fa-dice-d6"></i>
<span>{{localize "LETHALFANTASY.Label.weapon-damage-small"}}</span>
</div>
{{/if}}
{{#if rollData.damageMedium}}
<div class="detail-badge damage-badge">
<i class="fa-solid fa-dice-d20"></i>
<span>{{localize "LETHALFANTASY.Label.weapon-damage-medium"}}</span>
</div>
{{/if}}
{{#if badResult}}
<div class="detail-item other-result">
<strong>{{localize "LETHALFANTASY.Label.otherResult"}}</strong>: {{badResult}}
</div>
{{/if}}
</div>
<!-- Formula and dice results -->
<div class="formula-section">
<div class="formula-display">
<i class="fa-solid fa-dice-d20"></i>
<span class="formula-text">{{titleFormula}}</span>
</div>
{{#if diceResults}}
<div class="dice-breakdown">
{{#each diceResults as |result|}}
<div class="dice-item">
<span class="dice-type">{{result.dice}}</span>
<span class="dice-separator">→</span>
<span class="dice-value">{{result.value}}</span>
</div>
{{/each}}
</div>
{{/if}}
</div>
<!-- Result section -->
{{#unless isPrivate}}
<div class="result-section">
<div class="main-result">
<div class="result-label">Total</div>
<div class="result-value {{#if (eq resultType 'success')}}success{{else}}failure{{/if}}">
{{total}}
</div>
</div>
{{#if D30result}}
<div class="d30-result">
<div class="d30-header">
<i class="fa-solid fa-dice-d20"></i>
<span class="d30-label">D30 Special</span>
<span class="d30-value">{{D30result}}</span>
</div>
{{#if D30message}}
<div class="d30-message">
<i class="fa-solid fa-wand-magic-sparkles"></i>
<span>{{D30message}}</span>
</div>
{{/if}}
{{#if weaponDamageOptions.damageM}}
<button
class="damage-roll-btn"
data-weapon-id="{{weaponDamageOptions.weaponId}}"
data-damage-type="medium"
data-damage-formula="{{weaponDamageOptions.damageM}}"
data-is-monster="false"
title="{{localize 'LETHALFANTASY.Label.weapon-damage-medium'}}"
>
<i class="fa-solid fa-dice-d20"></i>
{{localize "LETHALFANTASY.Label.weapon-damage-medium"}}
</button>
</div>
{{/if}}
</div>
{{#if isSave}}
<div class="outcome-badge {{#if (eq resultType 'success')}}success-outcome{{else}}failure-outcome{{/if}}">
{{#if (eq resultType "success")}}
<i class="fa-solid fa-circle-check"></i>
{{localize "LETHALFANTASY.Roll.success"}}
{{else}}
<i class="fa-solid fa-circle-xmark"></i>
{{localize "LETHALFANTASY.Roll.failure"}}
{{/if}}
</div>
{{/if}}
{{#if isResource}}
<div class="outcome-badge {{#if (eq resultType 'success')}}success-outcome{{else}}failure-outcome{{/if}}">
{{#if (eq resultType "success")}}
<i class="fa-solid fa-circle-check"></i>
{{localize "LETHALFANTASY.Roll.success"}}
{{else}}
<i class="fa-solid fa-circle-xmark"></i>
{{localize "LETHALFANTASY.Roll.failure"}}
{{#if isFailure}}
<span class="resource-lost">({{localize "LETHALFANTASY.Roll.resourceLost"}})</span>
{{/if}}
{{/if}}
</div>
{{/if}}
{{#if isDamage}}
{{#if (and isGM hasTarget)}}
<div class="target-info">
<i class="fa-solid fa-crosshairs"></i>
{{{localize
"LETHALFANTASY.Roll.displayArmor"
targetName=targetName
targetArmor=targetArmor
realDamage=realDamage
}}}
</div>
{{/if}}
{{/if}}
{{else}}
<div class="private-result">
<i class="fa-solid fa-eye-slash"></i>
<span>Private Roll</span>
</div>
{{/unless}}
{{#if weaponDamageOptions}}
{{#if canSelectTarget}}
<div class="damage-buttons">
<div class="damage-buttons-grid {{#if weaponDamageOptions.isMonster}}monster-damage{{/if}}">
{{#if weaponDamageOptions.isMonster}}
<button
class="damage-roll-btn"
data-weapon-id="{{weaponDamageOptions.weaponId}}"
data-damage-type="monster"
data-damage-formula="{{weaponDamageOptions.damageFormula}}"
data-damage-modifier="{{weaponDamageOptions.damageModifier}}"
data-is-monster="true"
title="{{localize 'LETHALFANTASY.Label.rollDamage'}} - {{weaponDamageOptions.weaponName}}"
>
<i class="fa-solid fa-dice"></i>
Damage:
{{weaponDamageOptions.damageFormula}}{{#if
weaponDamageOptions.damageModifier
}}+{{weaponDamageOptions.damageModifier}}{{/if}}
</button>
{{else}}
{{#if weaponDamageOptions.damageS}}
<button
class="damage-roll-btn"
data-weapon-id="{{weaponDamageOptions.weaponId}}"
data-damage-type="small"
data-damage-formula="{{weaponDamageOptions.damageS}}"
data-is-monster="false"
title="{{localize 'LETHALFANTASY.Label.rollDamage'}}"
>
<i class="fa-solid fa-dice-d6"></i>
Damage Small
</button>
{{/if}}
{{#if weaponDamageOptions.damageM}}
<button
class="damage-roll-btn"
data-weapon-id="{{weaponDamageOptions.weaponId}}"
data-damage-type="medium"
data-damage-formula="{{weaponDamageOptions.damageM}}"
data-is-monster="false"
title="{{localize 'LETHALFANTASY.Label.rollDamage'}}"
>
<i class="fa-solid fa-dice-d20"></i>
Damage Medium
</button>
{{/if}}
{{/if}}
</div>
</div>
{{/if}}
{{/if}}
{{#if rollData.isDamage}}
<div class="damage-result">
<ul>
<li class="li-apply-wounds">
<div>{{localize "LETHALFANTASY.Label.applyDamage"}}</div>
<div class="combatants-grid">
{{#each combatants}}
<button
class="apply-wounds-btn"
data-combatant-id="{{this.id}}"
title="{{this.name}}"
>
{{this.name}}
</button>
{{/each}}
</div>
</li>
</ul>
</div>
{{#if defenderId}}
<div class="damage-result auto-applied">
<div class="auto-damage-notice">
<i class="fa-solid fa-check-circle"></i>
<span>Damage automatically applied to defender (with Armor DR)</span>
</div>
</div>
{{else}}
<div class="damage-result">
<ul>
<li class="li-apply-wounds">
<div>{{localize "LETHALFANTASY.Label.applyDamage"}}</div>
<div class="combatants-grid">
{{#each combatants}}
<button
class="apply-wounds-btn"
data-combatant-id="{{this.id}}"
title="{{this.name}}"
>
{{this.name}}
</button>
{{/each}}
</div>
</li>
</ul>
</div>
{{/if}}
{{/if}}
{{#if isAttack}}
{{#if canSelectTarget}}
<div class="attack-targets">
<ul>
<li class="li-select-target">
<div>{{localize "LETHALFANTASY.Label.selectTarget"}}</div>
<div class="combatants-grid">
{{#each combatants}}
<button
class="request-defense-btn"
data-combatant-id="{{this.id}}"
data-token-id="{{this.tokenId}}"
title="{{this.name}}"
>
{{this.name}}
</button>
{{/each}}
</div>
</li>
</ul>
</div>
{{/if}}
{{/if}}
</div>