11 Commits

Author SHA1 Message Date
a06dfa0ae9 Update skills/shield DR
All checks were successful
Release Creation / build (release) Successful in 1m8s
2026-01-12 14:27:29 +01:00
0836cada75 Re-org folders and enhance minor CSS stuff 2026-01-04 09:21:21 +01:00
61ed1597e7 Add damage management and DR for monsters also
All checks were successful
Release Creation / build (release) Successful in 1m48s
2025-12-19 15:41:27 +01:00
96062c6fd9 Roll damages and so on
All checks were successful
Release Creation / build (release) Successful in 56s
2025-12-14 21:18:00 +01:00
f6b35536de Manage DR and damage roll 2025-12-14 20:48:33 +01:00
7d27562bb4 Fix DR and defense values
All checks were successful
Release Creation / build (release) Successful in 1m7s
2025-12-08 11:54:36 +01:00
64f2efdcb9 Fix last HD Roll
All checks were successful
Release Creation / build (release) Successful in 1m35s
2025-11-07 07:58:58 +01:00
66f7aade25 Fix jog + update compendiums
All checks were successful
Release Creation / build (release) Successful in 52s
2025-10-17 20:06:49 +02:00
8f682a1458 Auto-publish package on releas 2025-10-01 17:26:29 +02:00
fa3054f24b Some granted dice/favor fixes
All checks were successful
Release Creation / build (release) Successful in 2m48s
2025-10-01 17:17:33 +02:00
59a891630e Fix tooltip
All checks were successful
Release Creation / build (release) Successful in 38s
2025-09-20 09:34:13 +02:00
59 changed files with 2400 additions and 893 deletions

View File

@@ -23,7 +23,7 @@ jobs:
id: sub_manifest_link_version id: sub_manifest_link_version
uses: microsoft/variable-substitution@v1 uses: microsoft/variable-substitution@v1
with: with:
files: 'system.json' files: "system.json"
env: env:
version: ${{steps.get_version.outputs.version-without-v}} version: ${{steps.get_version.outputs.version-without-v}}
url: https://www.uberwald.me/gitea/${{gitea.repository}} url: https://www.uberwald.me/gitea/${{gitea.repository}}
@@ -40,7 +40,7 @@ jobs:
- name: setup go - name: setup go
uses: https://github.com/actions/setup-go@v4 uses: https://github.com/actions/setup-go@v4
with: with:
go-version: '>=1.20.1' go-version: ">=1.20.1"
- name: Use Go Action - name: Use Go Action
id: use-go-action id: use-go-action
@@ -49,4 +49,15 @@ jobs:
files: |- files: |-
./fvtt-lethal-fantasy-${{github.event.release.tag_name}}.zip ./fvtt-lethal-fantasy-${{github.event.release.tag_name}}.zip
system.json system.json
api_key: '${{secrets.ALLOW_PUSH_RELEASE}}' api_key: "${{secrets.ALLOW_PUSH_RELEASE}}"
- name: Publish to Foundry server
uses: djlechuck/foundryvtt-publish-package-action@v1
with:
token: ${{ secrets.FOUNDRY_PUBLISH_KEY }}
id: "fvtt-lethal-fantasy"
version: ${{github.event.release.tag_name}}
manifest: "https://www.uberwald.me/gitea/${{gitea.repository}}/releases/download/${{github.event.release.tag_name}}/system.json"
notes: "https://www.uberwald.me/gitea/public/fvtt-lethal-fantasy/raw/branch/main/changelog.md"
compatibility-minimum: "13"
compatibility-verified: "13"

5
changelog.md Normal file
View File

@@ -0,0 +1,5 @@
## v13.0.12
- Fix favor/disfavor
- Fix granted dice
- Cosmetic fixes

View File

@@ -521,6 +521,9 @@ i.lethalfantasy {
min-width: 2.5rem; min-width: 2.5rem;
max-width: 2.5rem; max-width: 2.5rem;
} }
.lethalfantasy .tab.character-combat .main-div .combat-details .combat-detail .ranged-attack-button {
font-size: 0.8rem;
}
.lethalfantasy .tab.character-combat .main-div .combat-details .combat-detail button { .lethalfantasy .tab.character-combat .main-div .combat-details .combat-detail button {
min-width: 9rem; min-width: 9rem;
} }
@@ -914,9 +917,10 @@ i.lethalfantasy {
flex: 1; flex: 1;
} }
.lethalfantasy .monster-main .monster-skills .monster-skill { .lethalfantasy .monster-main .monster-skills .monster-skill {
display: flex; display: grid;
grid-template-columns: repeat(3, auto 2.5rem);
gap: 0.5rem;
align-items: center; align-items: center;
margin-right: 0.5rem;
} }
.lethalfantasy .monster-main .monster-skills .monster-skill .rollable:hover, .lethalfantasy .monster-main .monster-skills .monster-skill .rollable:hover,
.lethalfantasy .monster-main .monster-skills .monster-skill .rollable:focus { .lethalfantasy .monster-main .monster-skills .monster-skill .rollable:focus {
@@ -928,12 +932,9 @@ i.lethalfantasy {
max-width: 2.5rem; max-width: 2.5rem;
} }
.lethalfantasy .monster-main .monster-skills .monster-skill .name { .lethalfantasy .monster-main .monster-skills .monster-skill .name {
flex: 1;
min-width: 3.2rem;
margin-left: 4px; margin-left: 4px;
} }
.lethalfantasy .monster-main .monster-skills .monster-skill .form-group { .lethalfantasy .monster-main .monster-skills .monster-skill .form-group {
flex: 1;
padding-left: 4px; padding-left: 4px;
} }
.lethalfantasy .monster-main .monster-skills .monster-skill .form-group .form-fields { .lethalfantasy .monster-main .monster-skills .monster-skill .form-group .form-fields {
@@ -948,8 +949,8 @@ i.lethalfantasy {
} }
.lethalfantasy .monster-main .monster-movements .monster-movement { .lethalfantasy .monster-main .monster-movements .monster-movement {
display: flex; display: flex;
align-items: center; flex-direction: column;
margin-right: 0.5rem; gap: 4px;
} }
.lethalfantasy .monster-main .monster-movements .monster-movement .rollable:hover, .lethalfantasy .monster-main .monster-movements .monster-movement .rollable:hover,
.lethalfantasy .monster-main .monster-movements .monster-movement .rollable:focus { .lethalfantasy .monster-main .monster-movements .monster-movement .rollable:focus {
@@ -2215,6 +2216,54 @@ i.lethalfantasy {
border-color: var(--color-dark-6); border-color: var(--color-dark-6);
color: var(--color-dark-2); color: var(--color-dark-2);
} }
.application.dialog.lethalfantasy .apply-damage-dialog .dialog-content {
padding: 6px;
font-size: calc(var(--font-size-standard) * 1);
}
.application.dialog.lethalfantasy .apply-damage-dialog .dialog-content .header {
text-align: center;
padding: 4px;
margin-bottom: 6px;
background-color: rgba(0, 0, 0, 0.1);
border-radius: 3px;
}
.application.dialog.lethalfantasy .apply-damage-dialog .dialog-content .damage-summary {
display: flex;
justify-content: space-between;
align-items: center;
padding: 4px 6px;
margin-bottom: 6px;
background-color: rgba(139, 0, 0, 0.1);
border-radius: 3px;
}
.application.dialog.lethalfantasy .apply-damage-dialog .dialog-content .damage-summary .damage-value {
color: var(--color-level-error);
font-size: calc(var(--font-size-standard) * 1.2);
font-weight: bold;
}
.application.dialog.lethalfantasy .apply-damage-dialog .dialog-content .dr-summary {
display: flex;
justify-content: space-around;
gap: 4px;
padding: 3px;
margin-bottom: 6px;
font-size: calc(var(--font-size-standard) * 0.85);
background-color: rgba(0, 0, 0, 0.05);
border-radius: 3px;
}
.application.dialog.lethalfantasy .apply-damage-dialog .dialog-content .damage-options .option-line {
display: flex;
justify-content: space-between;
align-items: center;
padding: 3px 6px;
margin: 2px 0;
background-color: rgba(0, 0, 0, 0.05);
border-radius: 3px;
}
.application.dialog.lethalfantasy .apply-damage-dialog .dialog-content .damage-options .option-line strong {
color: var(--color-dark-1);
font-size: calc(var(--font-size-standard) * 1.05);
}
.lethalfantasy-roll-dialog fieldset { .lethalfantasy-roll-dialog fieldset {
padding: 4px; padding: 4px;
} }
@@ -2258,9 +2307,16 @@ i.lethalfantasy {
min-width: 5rem; min-width: 5rem;
max-width: 5em; max-width: 5em;
} }
.dialog-form .form-footer {
padding: 4px;
gap: 4px;
}
.dialog-form .form-footer button { .dialog-form .form-footer button {
min-width: 14rem; min-width: 8rem;
min-height: 3.2rem; min-height: 2rem;
padding: 2px 6px;
margin: 0;
font-size: calc(var(--font-size-standard) * 0.9);
} }
.dialog-modifier { .dialog-modifier {
display: flex; display: flex;
@@ -2353,6 +2409,115 @@ i.lethalfantasy {
font-size: calc(var(--font-size-standard) * 1); font-size: calc(var(--font-size-standard) * 1);
text-shadow: 0 0 10px var(--color-shadow-primary); text-shadow: 0 0 10px var(--color-shadow-primary);
} }
.dice-roll .damage-buttons {
width: 100%;
padding: 8px;
margin-top: 8px;
}
.dice-roll .damage-buttons .damage-buttons-title {
font-weight: bold;
margin-bottom: 8px;
font-size: calc(var(--font-size-standard) * 0.95);
text-align: center;
}
.dice-roll .damage-buttons .damage-buttons-grid {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 6px;
padding: 8px;
background-color: rgba(0, 0, 0, 0.1);
border-radius: 5px;
}
.dice-roll .damage-buttons .damage-buttons-grid.monster-damage {
grid-template-columns: 1fr;
justify-items: center;
}
.dice-roll .damage-buttons .damage-buttons-grid .damage-roll-btn {
padding: 6px 10px;
background: linear-gradient(to bottom, #8b4513 0%, #6b3410 100%);
border: 1px solid #4b2408;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);
color: #f0f0e0;
cursor: pointer;
border-radius: 4px;
font-size: calc(var(--font-size-standard) * 0.85);
font-weight: 500;
text-align: center;
transition: all 0.2s ease;
display: flex;
align-items: center;
justify-content: center;
gap: 4px;
}
.dice-roll .damage-buttons .damage-buttons-grid .damage-roll-btn i {
font-size: calc(var(--font-size-standard) * 1);
}
.dice-roll .damage-buttons .damage-buttons-grid .damage-roll-btn:hover {
background: linear-gradient(to bottom, #9b5523 0%, #7b4420 100%);
box-shadow: 0 3px 6px rgba(0, 0, 0, 0.4);
transform: translateY(-1px);
border-color: #5b3418;
}
.dice-roll .damage-buttons .damage-buttons-grid .damage-roll-btn:active {
transform: translateY(0);
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);
}
.dice-roll .damage-result {
width: 100%;
padding: 8px;
}
.dice-roll .damage-result ul {
padding: 0;
margin: 0;
}
.dice-roll .damage-result .li-apply-wounds {
list-style: none;
margin-top: 10px;
padding: 0;
display: none;
}
.dice-roll .damage-result .li-apply-wounds > div:first-child {
font-weight: bold;
margin-bottom: 8px;
font-size: calc(var(--font-size-standard) * 0.95);
text-align: center;
}
.dice-roll .damage-result .li-apply-wounds .combatants-grid {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 6px;
margin-top: 5px;
padding: 8px;
background-color: rgba(0, 0, 0, 0.1);
border-radius: 5px;
}
.dice-roll .damage-result .li-apply-wounds .combatants-grid .apply-wounds-btn {
padding: 6px 10px;
background: linear-gradient(to bottom, #5a5850 0%, #4b4a44 100%);
border: 1px solid #2b2a24;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);
color: #f0f0e0;
cursor: pointer;
border-radius: 4px;
font-size: calc(var(--font-size-standard) * 0.85);
font-weight: 500;
text-align: center;
transition: all 0.2s ease;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
max-width: 100%;
}
.dice-roll .damage-result .li-apply-wounds .combatants-grid .apply-wounds-btn:hover {
background: linear-gradient(to bottom, #6a6860 0%, #5a5850 100%);
box-shadow: 0 3px 6px rgba(0, 0, 0, 0.4);
transform: translateY(-1px);
border-color: #3b3a34;
}
.dice-roll .damage-result .li-apply-wounds .combatants-grid .apply-wounds-btn:active {
transform: translateY(0);
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);
}
#token-hud .hp-loss-wrap { #token-hud .hp-loss-wrap {
position: absolute; position: absolute;
left: 75px; left: 75px;

View File

@@ -282,6 +282,8 @@
}, },
"Label": { "Label": {
"agility": "Dexterity", "agility": "Dexterity",
"applyDamage": "Apply damage to:",
"rollDamage": "Roll Damage",
"gotoToken": "Go to token", "gotoToken": "Go to token",
"combatAction": "Combat action", "combatAction": "Combat action",
"currentAction": "Current ongoing action", "currentAction": "Current ongoing action",
@@ -304,8 +306,10 @@
"grantedAttackDice": "Granted attack", "grantedAttackDice": "Granted attack",
"grantedDamageDice": "Granted damage", "grantedDamageDice": "Granted damage",
"grantedDefenseDice": "Granted defense", "grantedDefenseDice": "Granted defense",
"damageResistance": "Damage resistance", "damageResistance": "DR",
"damageResistanceShort": "DR", "damageResistanceShort": "DR",
"shieldDamageReduction": "Shield DR",
"shieldDefenseDice": "Shield dice",
"stealth": "Stealth", "stealth": "Stealth",
"progressionDice": "Progression/Lethargy dice", "progressionDice": "Progression/Lethargy dice",
"rollProgressionCount": "Roll progression count", "rollProgressionCount": "Roll progression count",
@@ -421,7 +425,9 @@
"monster-damage": "Monster damage", "monster-damage": "Monster damage",
"monster-defense": "Monster defense", "monster-defense": "Monster defense",
"weapons": "Weapons", "weapons": "Weapons",
"wis": "WIS" "wis": "WIS",
"weapon-damage-medium": "Weapon damage medium",
"weapon-damage-small": "Weapon damage small"
}, },
"Miracle": { "Miracle": {
"FIELDS": { "FIELDS": {
@@ -553,7 +559,7 @@
"label": "Min" "label": "Min"
} }
}, },
"damagereduction": { "damageReduction": {
"label": "Damage reduction" "label": "Damage reduction"
}, },
"defense": { "defense": {
@@ -856,6 +862,20 @@
"melee": "Melee", "melee": "Melee",
"ranged": "Ranged" "ranged": "Ranged"
} }
},
"Dialog": {
"applyDamageTo": "Apply damage to",
"weapon": "Weapon",
"totalDamage": "Total Damage",
"damageReduction": "Damage Reduction",
"armorDR": "Armor DR",
"shieldDR": "Shield DR",
"totalDR": "Total DR",
"selectOption": "Select damage application option",
"noDR": "No DR",
"withArmor": "With Armor DR only",
"withAll": "With Armor + Shield DR",
"damage": "damage"
} }
}, },
"TYPES": { "TYPES": {

View File

@@ -152,6 +152,73 @@ Hooks.on(hookName, (message, html, data) => {
}) })
} }
} }
// Gestion du survol et du clic sur les boutons de dégâts pour les GMs
if (game.user.isGM) {
// Show damage buttons only for GM
$(html).find(".li-apply-wounds").each((i, btn) => {
btn.style.display = "block"
})
$(html).find(".apply-wounds-btn").hover(
function (event) {
// Mouse enter - select the token and pan to it
let combatantId = $(this).data("combatant-id")
if (combatantId && game.combat) {
let combatant = game.combat.combatants.get(combatantId)
if (combatant?.token) {
let token = canvas.tokens.get(combatant.token.id)
if (token) {
token.control({ releaseOthers: true })
canvas.animatePan(token.center)
}
}
}
},
function (event) {
// Mouse leave - release selection
canvas.tokens.releaseAll()
}
)
$(html).find(".apply-wounds-btn").click((event) => {
LethalFantasyUtils.applyDamage(message, event)
})
}
// Gestionnaire pour les boutons de jet de dégâts
$(html).find(".damage-roll-btn").click(async (event) => {
const button = $(event.currentTarget)
const weaponId = button.data("weapon-id")
const damageType = button.data("damage-type")
const damageFormula = button.data("damage-formula")
const damageModifier = button.data("damage-modifier")
const isMonster = button.data("is-monster")
// Récupérer l'acteur qui a fait le jet initial
const actor = game.actors.get(message.rolls[0]?.actorId)
if (!actor) {
ui.notifications.error("Actor not found")
return
}
// Pour les monstres, utiliser prepareMonsterRoll
if (isMonster || actor.type === "monster") {
await actor.system.prepareMonsterRoll("monster-damage", weaponId, undefined, undefined, damageModifier)
return
}
// Pour les personnages, récupérer l'arme
const weapon = actor.items.get(weaponId)
if (!weapon) {
ui.notifications.error("Weapon not found")
return
}
// Lancer les dégâts avec la bonne méthode
const rollType = damageType === "small" ? "weapon-damage-small" : "weapon-damage-medium"
await actor.prepareRoll(rollType, weaponId)
})
}) })
Hooks.on("getCombatTrackerEntryContext", (html, options) => { Hooks.on("getCombatTrackerEntryContext", (html, options) => {

View File

@@ -95,13 +95,26 @@ export default class LethalFantasyCharacterSheet extends LethalFantasyActorSheet
const doc = this.document const doc = this.document
switch (partId) { switch (partId) {
case "main": case "main":
context.armorDR = this.actor.getArmorDR()
context.damageReduction = this.actor.computeDamageReduction()
context.damageReductionShield = this.actor.getShieldDR()
break break
case "skills": case "skills": {
context.tab = context.tabs.skills context.tab = context.tabs.skills
context.skills = doc.itemTypes.skill context.skills = doc.itemTypes.skill
// Organiser les skills par catégorie
const categories = ['layperson', 'professional', 'weapon', 'armor', 'resist']
context.skillsByCategory = categories.map(cat => {
return {
category: cat,
label: `LETHALFANTASY.Skill.Category.${cat}`,
skills: context.skills.filter(s => s.system.category === cat)
}
}).filter(catData => catData.skills.length > 0)
context.gifts = doc.itemTypes.gift context.gifts = doc.itemTypes.gift
context.vulnerabilities = doc.itemTypes.vulnerability context.vulnerabilities = doc.itemTypes.vulnerability
break break
}
case "spells": case "spells":
context.tab = context.tabs.spells context.tab = context.tabs.spells
context.spells = doc.itemTypes.spell context.spells = doc.itemTypes.spell
@@ -246,7 +259,6 @@ export default class LethalFantasyCharacterSheet extends LethalFantasyActorSheet
async _onRoll(event, target) { async _onRoll(event, target) {
if (this.isEditMode) return if (this.isEditMode) return
console.log("Roll event", event)
const rollType = event.target.dataset.rollType const rollType = event.target.dataset.rollType
let rollKey = event.target.dataset.rollKey; let rollKey = event.target.dataset.rollKey;
let rollDice = event.target.dataset?.rollDice; let rollDice = event.target.dataset?.rollDice;

View File

@@ -162,9 +162,11 @@ export default class LethalFantasyMonsterSheet extends LethalFantasyActorSheet {
async _onRoll(event, target) { async _onRoll(event, target) {
if (this.isEditMode) return if (this.isEditMode) return
const rollType = event.target.dataset.rollType const rollable = event.target.closest('.rollable')
let rollKey = event.target.dataset.rollKey if (!rollable) return
let rollDice = event.target.dataset?.rollDice || "0" const rollType = rollable.dataset.rollType
let rollKey = rollable.dataset.rollKey
let rollDice = rollable.dataset?.rollDice || "0"
this.actor.system.prepareMonsterRoll(rollType, rollKey, rollDice) this.actor.system.prepareMonsterRoll(rollType, rollKey, rollDice)
} }
} }

View File

@@ -104,6 +104,18 @@ export const SPELL_LETHARGY_DICE = [
{ dice: "D20", value: "20", level: "21-25", maxLevel: 25 } { dice: "D20", value: "20", level: "21-25", maxLevel: 25 }
] ]
export const GRANTED_DICE_CHOICES = {
"0": { label: "None", value: "0" },
"D2": { label: "D2", value: "D2" },
"D3": { label: "D3", value: "D3" },
"D4": { label: "D4", value: "D4" },
"D6": { label: "D6", value: "D6" },
"D8": { label: "D8", value: "D8" },
"D10": { label: "D10", value: "D10" },
"D12": { label: "D12", value: "D12" },
"D20": { label: "D20", value: "D20" }
}
export const INITIATIVE_DICE_CHOICES_PER_CLASS = { export const INITIATIVE_DICE_CHOICES_PER_CLASS = {
"untrained": [ "untrained": [
{ "name": "Asleep or totally distracted (2D12)", "value": "2D12" }, { "name": "Asleep or totally distracted (2D12)", "value": "2D12" },
@@ -310,5 +322,6 @@ export const SYSTEM = {
MORTAL_CHOICES, MORTAL_CHOICES,
SPELL_CRITICAL, SPELL_CRITICAL,
MIRACLE_TYPES, MIRACLE_TYPES,
SPELL_LETHARGY_DICE SPELL_LETHARGY_DICE,
GRANTED_DICE_CHOICES
} }

View File

@@ -65,7 +65,7 @@ export default class LethalFantasyActor extends Actor {
} }
} }
} }
goodSkill.weaponSkillModifier = maxValue * multiplier goodSkill.weaponSkillModifier = Math.ceil(maxValue * multiplier)
return goodSkill return goodSkill
} }
@@ -78,6 +78,80 @@ export default class LethalFantasyActor extends Actor {
this.update({ "system.hp.value": hp }) this.update({ "system.hp.value": hp })
} }
/* *************************************************/
computeDamageReduction() {
// Pour les monstres, utiliser hp.damageResistance et combat.damageReduction
if (this.type === "monster") {
let hpDR = Number(this.system.hp?.damageResistance) || 0
let combatDR = Number(this.system.combat?.damageReduction) || 0
return hpDR + combatDR
}
// Pour les personnages, utiliser biodata et items
let naturalDR = Number(this.system.biodata?.naturalDR) || 0
let magicDR = Number(this.system.biodata?.magicDR) || 0
let armorDR = this.getArmorDR()
return naturalDR + magicDR + armorDR
}
/* *************************************************/
getShieldDR() {
// Pour les monstres, utiliser combat.shieldDamageReduction
if (this.type === "monster") {
return Number(this.system.combat?.shieldDamageReduction) || 0
}
// Pour les personnages, utiliser les items de type shield
let dr = 0
for (let item of this.items) {
if (item.type === "shield" && item.system.equipped) {
dr += Number(item.system.damageReduction)
}
}
return dr
}
/* *************************************************/
getArmorDR() {
let dr = 0
for (let item of this.items) {
if (item.type === "armor" && item.system.equipped) {
dr += Number(item.system.damageReduction)
}
}
return dr
}
/* *************************************************/
getArmorDefenseValue() {
let defenseValue = 0
for (let item of this.items) {
if (item.type === "armor" && item.system.equipped) {
defenseValue += Number(item.system.defense)
}
}
return defenseValue
}
/* *************************************************/
fuzzyNameSearchWeaponSkills(weaponName, weaponClass = null) {
// Get all weapon skills without the " skill" suffix
let skills = this.items.filter((i) => i.type === "skill" && i.system.weaponClass === weaponClass && i.system.category === "weapon")
// Remove parenthesis in the weapon name for better matching
weaponName = weaponName.replace(/\(.*?\)/g, "").trim()
// Now search if we find all the words of the weapon name in the skill name
skills = skills.filter((s) => {
let skillName = s.name.toLowerCase().replace(" skill", "").trim()
let wName = weaponName.toLowerCase().trim()
let wWords = wName.split(" ")
for (let w of wWords) {
if (!skillName.includes(w)) {
return false
}
}
return true
})
return skills
}
/* *************************************************/ /* *************************************************/
async prepareRoll(rollType, rollKey, rollDice) { async prepareRoll(rollType, rollKey, rollDice) {
console.log("Preparing roll", rollType, rollKey, rollDice) console.log("Preparing roll", rollType, rollKey, rollDice)
@@ -138,19 +212,19 @@ export default class LethalFantasyActor extends Actor {
case "weapon-defense": { case "weapon-defense": {
let weapon = this.items.find((i) => i.type === "weapon" && i.id === rollKey) let weapon = this.items.find((i) => i.type === "weapon" && i.id === rollKey)
let skill let skill
let skills = this.items.filter((i) => i.type === "skill" && i.name.toLowerCase() === weapon.name.toLowerCase()) let skills = this.items.filter((i) => i.type === "skill" && i.system.category === "weapon" && i.name.toLowerCase() === weapon.name.toLowerCase())
if (skills.length > 0) { if (skills.length > 0) {
skill = this.getBestWeaponClassSkill(skills, rollType, 1.0) skill = this.getBestWeaponClassSkill(skills, rollType, 1.0)
} else { } else {
skills = this.items.filter((i) => i.type === "skill" && i.name.toLowerCase().replace(" skill", "") === weapon.name.toLowerCase()) skills = this.fuzzyNameSearchWeaponSkills(weapon.name, weapon.system.weaponClass)
if (skills.length > 0) { if (skills.length > 0) {
skill = this.getBestWeaponClassSkill(skills, rollType, 1.0) skill = this.getBestWeaponClassSkill(skills, rollType, 1.0)
} else { } else {
skills = this.items.filter((i) => i.type === "skill" && i.system.weaponClass === weapon.system.weaponClass) skills = this.items.filter((i) => i.type === "skill" && i.system.category === "weapon" && i.system.weaponClass === weapon.system.weaponClass)
if (skills.length > 0) { if (skills.length > 0) {
skill = this.getBestWeaponClassSkill(skills, rollType, 0.5) skill = this.getBestWeaponClassSkill(skills, rollType, 0.5)
} else { } else {
skills = this.items.filter((i) => i.type === "skill" && i.system.weaponClass.includes(SYSTEM.WEAPON_CATEGORIES[weapon.system.weaponClass])) skills = this.items.filter((i) => i.type === "skill" && i.system.category === "weapon" && i.system.weaponClass.includes(SYSTEM.WEAPON_CATEGORIES[weapon.system.weaponClass]))
if (skills.length > 0) { if (skills.length > 0) {
skill = this.getBestWeaponClassSkill(skills, rollType, 0.25) skill = this.getBestWeaponClassSkill(skills, rollType, 0.25)
} else { } else {
@@ -165,11 +239,14 @@ export default class LethalFantasyActor extends Actor {
ui.notifications.warn(game.i18n.localize("LETHALFANTASY.Notifications.skillNotFound")) ui.notifications.warn(game.i18n.localize("LETHALFANTASY.Notifications.skillNotFound"))
return return
} }
rollTarget = skill // Créer un objet plain au lieu de modifier directement le skill
rollTarget.weapon = weapon rollTarget = {
rollTarget.weaponSkillModifier = skill.weaponSkillModifier ...skill,
rollTarget.rollKey = rollKey weapon: weapon,
rollTarget.combat = foundry.utils.duplicate(this.system.combat) weaponSkillModifier: skill.weaponSkillModifier,
rollKey: rollKey,
combat: foundry.utils.duplicate(this.system.combat)
}
if (rollType === "weapon-damage-small" || rollType === "weapon-damage-medium") { if (rollType === "weapon-damage-small" || rollType === "weapon-damage-medium") {
rollTarget.grantedDice = this.system.granted.damageDice rollTarget.grantedDice = this.system.granted.damageDice
} }
@@ -177,6 +254,7 @@ export default class LethalFantasyActor extends Actor {
rollTarget.grantedDice = this.system.granted.attackDice rollTarget.grantedDice = this.system.granted.attackDice
} }
if (rollType === "weapon-defense") { if (rollType === "weapon-defense") {
rollTarget.armorDefense = this.getArmorDefenseValue()
rollTarget.grantedDice = this.system.granted.defenseDice rollTarget.grantedDice = this.system.granted.defenseDice
} }
} }

View File

@@ -134,6 +134,7 @@ export default class LethalFantasyRoll extends Roll {
let beyondSkill = false let beyondSkill = false
let hasStaticModifier = false let hasStaticModifier = false
let hasExplode = true let hasExplode = true
let actor = game.actors.get(options.actorId)
if (options.rollType === "challenge" || options.rollType === "save") { if (options.rollType === "challenge" || options.rollType === "save") {
options.rollName = game.i18n.localize(`LETHALFANTASY.Label.${options.rollTarget.rollKey}`) options.rollName = game.i18n.localize(`LETHALFANTASY.Label.${options.rollTarget.rollKey}`)
@@ -209,7 +210,7 @@ export default class LethalFantasyRoll extends Roll {
options.rollTarget.charModifier = options.rollTarget.combat.rangedAttackModifier options.rollTarget.charModifier = options.rollTarget.combat.rangedAttackModifier
} }
} else { } else {
options.rollTarget.value = options.rollTarget.combat.defenseModifier + options.rollTarget.weaponSkillModifier + options.rollTarget.weapon.system.bonuses.defenseBonus options.rollTarget.value = options.rollTarget.combat.defenseModifier + options.rollTarget.weaponSkillModifier + options.rollTarget.weapon.system.bonuses.defenseBonus + options.rollTarget.armorDefense
options.rollTarget.charModifier = options.rollTarget.combat.defenseModifier options.rollTarget.charModifier = options.rollTarget.combat.defenseModifier
} }
@@ -259,14 +260,17 @@ export default class LethalFantasyRoll extends Roll {
} else if (options.rollType.includes("weapon-damage")) { } else if (options.rollType.includes("weapon-damage")) {
options.rollName = options.rollTarget.name options.rollName = options.rollTarget.name
options.isDamage = true
hasModifier = true hasModifier = true
hasChangeDice = false hasChangeDice = false
let damageBonus = (options.rollTarget.weapon.system.applyStrengthDamageBonus) ? options.rollTarget.combat.damageModifier : 0 let damageBonus = (options.rollTarget.weapon.system.applyStrengthDamageBonus) ? options.rollTarget.combat.damageModifier : 0
options.rollTarget.value = damageBonus + options.rollTarget.weaponSkillModifier + options.rollTarget.weapon.system.bonuses.damageBonus options.rollTarget.value = damageBonus + options.rollTarget.weaponSkillModifier + options.rollTarget.weapon.system.bonuses.damageBonus
options.rollTarget.charModifier = damageBonus options.rollTarget.charModifier = damageBonus
if (options.rollType.includes("small")) { if (options.rollType.includes("small")) {
options.damageSmall = true
dice = options.rollTarget.weapon.system.damage.damageS dice = options.rollTarget.weapon.system.damage.damageS
} else { } else {
options.damageMedium = true
dice = options.rollTarget.weapon.system.damage.damageM dice = options.rollTarget.weapon.system.damage.damageM
} }
dice = dice.replace("E", "") dice = dice.replace("E", "")
@@ -274,6 +278,7 @@ export default class LethalFantasyRoll extends Roll {
} else if (options.rollType.includes("monster-damage")) { } else if (options.rollType.includes("monster-damage")) {
options.rollName = options.rollTarget.name options.rollName = options.rollTarget.name
options.isDamage = true
hasModifier = true hasModifier = true
hasChangeDice = false hasChangeDice = false
options.rollTarget.value = options.rollTarget.damageModifier options.rollTarget.value = options.rollTarget.damageModifier
@@ -358,7 +363,7 @@ export default class LethalFantasyRoll extends Roll {
], ],
actions: { actions: {
"selectGranted": (event, button, dialog) => { "selectGranted": (event, button, dialog) => {
hasGrantedDice = true hasGrantedDice = event.target.checked
}, },
"selectBeyondSkill": (event, button, dialog) => { "selectBeyondSkill": (event, button, dialog) => {
beyondSkill = button.checked beyondSkill = button.checked
@@ -473,6 +478,9 @@ export default class LethalFantasyRoll extends Roll {
actorImage: options.actorImage, actorImage: options.actorImage,
rollMode: rollContext.visibility, rollMode: rollContext.visibility,
hasTarget: options.hasTarget, hasTarget: options.hasTarget,
isDamage: options.isDamage,
damageSmall: options.damageSmall,
damageMedium: options.damageMedium,
pointBlank, pointBlank,
beyondSkill, beyondSkill,
letItFly, letItFly,
@@ -502,15 +510,17 @@ export default class LethalFantasyRoll extends Roll {
if (rollContext.favor === "favor") { if (rollContext.favor === "favor") {
rollFavor = new this(baseFormula, options.data, rollData) rollFavor = new this(baseFormula, options.data, rollData)
await rollFavor.evaluate() await rollFavor.evaluate()
console.log("Rolling with favor", rollFavor)
if (game?.dice3d) { if (game?.dice3d) {
game.dice3d.showForRoll(rollFavor, game.user, true) game.dice3d.showForRoll(rollFavor, game.user, true)
} }
if (rollFavor.result > rollBase.result) { if (Number(rollFavor.result) > Number(rollBase.result)) {
badResult = rollBase.result badResult = rollBase.result
rollBase = rollFavor rollBase = rollFavor
} else { } else {
badResult = rollFavor.result badResult = rollFavor.result
} }
rollFavor = null
} }
if (rollContext.favor === "disfavor") { if (rollContext.favor === "disfavor") {
@@ -519,12 +529,13 @@ export default class LethalFantasyRoll extends Roll {
if (game?.dice3d) { if (game?.dice3d) {
game.dice3d.showForRoll(rollFavor, game.user, true) game.dice3d.showForRoll(rollFavor, game.user, true)
} }
if (rollFavor.result < rollBase.result) { if (Number(rollFavor.result) < Number(rollBase.result)) {
badResult = rollBase.result badResult = rollBase.result
rollBase = rollFavor rollBase = rollFavor
} else { } else {
badResult = rollFavor.result badResult = rollFavor.result
} }
rollFavor = null
} }
if (hasD30) { if (hasD30) {
@@ -535,7 +546,7 @@ export default class LethalFantasyRoll extends Roll {
options.D30result = rollD30.total options.D30result = rollD30.total
} }
let rollTotal = -1 let rollTotal = 0
let diceResults = [] let diceResults = []
let resultType let resultType
let diceSum = 0 let diceSum = 0
@@ -560,7 +571,8 @@ export default class LethalFantasyRoll extends Roll {
} }
} }
if (hasGrantedDice) { if (hasGrantedDice && options.rollTarget.grantedDice && options.rollTarget.grantedDice !== "") {
titleFormula += ` + ${options.rollTarget.grantedDice.toUpperCase()}`
let grantedRoll = new Roll(options.rollTarget.grantedDice) let grantedRoll = new Roll(options.rollTarget.grantedDice)
await grantedRoll.evaluate() await grantedRoll.evaluate()
if (game?.dice3d) { if (game?.dice3d) {
@@ -573,12 +585,12 @@ export default class LethalFantasyRoll extends Roll {
if (fullModifier !== 0) { if (fullModifier !== 0) {
diceResults.push({ dice: `${rollModifier.formula.toUpperCase()}`, value: rollModifier.total }) diceResults.push({ dice: `${rollModifier.formula.toUpperCase()}`, value: rollModifier.total })
if (fullModifier < 0) { if (fullModifier < 0) {
rollTotal = Math.max(diceSum - rollModifier.total, 0) rollTotal += Math.max(diceSum - rollModifier.total, 0)
} else { } else {
rollTotal = diceSum + rollModifier.total rollTotal += diceSum + rollModifier.total
} }
} else { } else {
rollTotal = diceSum rollTotal += diceSum
} }
rollBase.options.resultType = resultType rollBase.options.resultType = resultType
@@ -1118,6 +1130,39 @@ export default class LethalFantasyRoll extends Roll {
* Generates the data required for rendering a roll chat card. * Generates the data required for rendering a roll chat card.
*/ */
async _getChatCardData(isPrivate) { async _getChatCardData(isPrivate) {
// Générer la liste des combatants de la scène
let combatants = []
if (game?.combat?.combatants && this.rollData?.isDamage) {
for (let c of game.combat.combatants) {
if (c.actorId !== this.actorId) {
combatants.push({ id: c.id, name: c.name })
}
}
}
// Récupérer les informations de l'arme pour les attaques réussies
let weaponDamageOptions = null
console.log("Roll type:", this.type, "rollTarget:", this.rollTarget, "Has weapon:", !!this.rollTarget?.weapon)
if (this.type === "weapon-attack" && this.rollTarget?.weapon) {
const weapon = this.rollTarget.weapon
weaponDamageOptions = {
weaponId: weapon._id || weapon.id,
weaponName: weapon.name,
damageS: weapon.system?.damage?.damageS,
damageM: weapon.system?.damage?.damageM
}
console.log("Weapon damage options:", weaponDamageOptions)
} else if (this.type === "monster-attack" && this.rollTarget) {
weaponDamageOptions = {
weaponId: this.rollTarget.rollKey,
weaponName: this.rollTarget.name,
damageFormula: this.rollTarget.damageDice,
damageModifier: this.rollTarget.damageModifier,
isMonster: true
}
console.log("Monster damage options:", weaponDamageOptions)
}
const cardData = { const cardData = {
css: [SYSTEM.id, "dice-roll"], css: [SYSTEM.id, "dice-roll"],
data: this.data, data: this.data,
@@ -1141,7 +1186,9 @@ export default class LethalFantasyRoll extends Roll {
D30result: this.D30result, D30result: this.D30result,
badResult: this.badResult, badResult: this.badResult,
rollData: this.rollData, rollData: this.rollData,
isPrivate: isPrivate isPrivate: isPrivate,
combatants: combatants,
weaponDamageOptions: weaponDamageOptions
} }
cardData.cssClass = cardData.css.join(" ") cardData.cssClass = cardData.css.join(" ")
cardData.tooltip = isPrivate ? "" : await this.getTooltip() cardData.tooltip = isPrivate ? "" : await this.getTooltip()

View File

@@ -90,9 +90,9 @@ export default class LethalFantasyCharacter extends foundry.abstract.TypeDataMod
current: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }) current: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 })
}) })
schema.granted = new fields.SchemaField({ schema.granted = new fields.SchemaField({
attackDice: new fields.StringField({ required: true, nullable: false, initial: "" }), attackDice: new fields.StringField({ required: true, nullable: false, initial: "0", choices: SYSTEM.GRANTED_DICE_CHOICES }),
defenseDice: new fields.StringField({ required: true, nullable: false, initial: "" }), defenseDice: new fields.StringField({ required: true, nullable: false, initial: "0", choices: SYSTEM.GRANTED_DICE_CHOICES }),
damageDice: new fields.StringField({ required: true, nullable: false, initial: "" }) damageDice: new fields.StringField({ required: true, nullable: false, initial: "0", choices: SYSTEM.GRANTED_DICE_CHOICES })
}) })
schema.movement = new fields.SchemaField({ schema.movement = new fields.SchemaField({
@@ -120,6 +120,8 @@ export default class LethalFantasyCharacter extends foundry.abstract.TypeDataMod
magicUser: new fields.BooleanField({ initial: false }), magicUser: new fields.BooleanField({ initial: false }),
clericUser: new fields.BooleanField({ initial: false }), clericUser: new fields.BooleanField({ initial: false }),
hpPerLevel: new fields.StringField({ required: true, nullable: false, initial: "" }), hpPerLevel: new fields.StringField({ required: true, nullable: false, initial: "" }),
naturalDR: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }),
magicDR: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }),
}) })
schema.modifiers = new fields.SchemaField({ schema.modifiers = new fields.SchemaField({
@@ -293,7 +295,6 @@ export default class LethalFantasyCharacter extends foundry.abstract.TypeDataMod
let wisDef = SYSTEM.CHARACTERISTICS_TABLES.wis.find((c) => c.value === this.characteristics.wis.value) let wisDef = SYSTEM.CHARACTERISTICS_TABLES.wis.find((c) => c.value === this.characteristics.wis.value)
let maxInit = Number(wisDef.init_cap) || 1000 let maxInit = Number(wisDef.init_cap) || 1000
console.log("Rolling initiative for", this)
let roll = await LethalFantasyRoll.promptInitiative({ let roll = await LethalFantasyRoll.promptInitiative({
actorId: this.parent.id, actorId: this.parent.id,

View File

@@ -118,6 +118,9 @@ export default class LethalFantasyMonster extends foundry.abstract.TypeDataModel
defenseModifier: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }), defenseModifier: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }),
damageModifier: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }), damageModifier: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }),
armorHitPoints: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }), armorHitPoints: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }),
damageReduction: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }),
shieldDamageReduction: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }),
shieldDefenseDice: new fields.StringField({ required: true, nullable: false, initial: "d4" })
}) })
@@ -150,7 +153,7 @@ export default class LethalFantasyMonster extends foundry.abstract.TypeDataModel
await roll.toMessage({}, { rollMode: roll.options.rollMode }) await roll.toMessage({}, { rollMode: roll.options.rollMode })
} }
async prepareMonsterRoll(rollType, rollKey, rollDice = undefined, tokenId = undefined) { async prepareMonsterRoll(rollType, rollKey, rollDice = undefined, tokenId = undefined, damageModifier = undefined) {
let rollTarget let rollTarget
switch (rollType) { switch (rollType) {
case "monster-attack": case "monster-attack":
@@ -158,6 +161,10 @@ export default class LethalFantasyMonster extends foundry.abstract.TypeDataModel
case "monster-damage": case "monster-damage":
rollTarget = foundry.utils.duplicate(this.attacks[rollKey]) rollTarget = foundry.utils.duplicate(this.attacks[rollKey])
rollTarget.rollKey = rollKey rollTarget.rollKey = rollKey
// Si damageModifier est fourni (depuis le chat), l'utiliser au lieu de celui de la fiche
if (damageModifier !== undefined && rollType === "monster-damage") {
rollTarget.damageModifier = damageModifier
}
break break
case "monster-skill": case "monster-skill":
rollTarget = foundry.utils.duplicate(this.resists[rollKey]) rollTarget = foundry.utils.duplicate(this.resists[rollKey])
@@ -168,6 +175,19 @@ export default class LethalFantasyMonster extends foundry.abstract.TypeDataModel
rollTarget.rollKey = rollKey rollTarget.rollKey = rollKey
rollTarget.rollDice = rollDice rollTarget.rollDice = rollDice
break break
case "shield-defense": {
// Lance directement le dé de défense du bouclier
const formula = rollDice || this.combat.shieldDefenseDice
const roll = new Roll(formula)
await roll.evaluate()
const flavor = game.i18n.localize("LETHALFANTASY.Label.shieldDefenseDice")
await roll.toMessage({
flavor,
speaker: ChatMessage.getSpeaker({ actor: this.parent })
})
return
}
case "weapon-damage-small": case "weapon-damage-small":
case "weapon-damage-medium": case "weapon-damage-medium":
case "weapon-attack": case "weapon-attack":
@@ -210,14 +230,16 @@ export default class LethalFantasyMonster extends foundry.abstract.TypeDataModel
break break
default: default:
ui.notifications.error(game.i18n.localize("LETHALFANTASY.Notifications.rollTypeNotFound") + String(rollType)) ui.notifications.error(game.i18n.localize("LETHALFANTASY.Notifications.rollTypeNotFound") + String(rollType))
break return
} }
// In all cases // In all cases
if (rollTarget) {
rollTarget.tokenId = tokenId rollTarget.tokenId = tokenId
console.log(rollTarget) console.log(rollTarget)
await this.roll(rollType, rollTarget) await this.roll(rollType, rollTarget)
} }
}
async rollInitiative(combatId = undefined, combatantId = undefined) { async rollInitiative(combatId = undefined, combatantId = undefined) {
const hasTarget = false const hasTarget = false

View File

@@ -9,6 +9,7 @@ export default class LethalFantasyShield extends foundry.abstract.TypeDataModel
schema.defense = new fields.StringField({ required: true, initial: "d4", choices: SYSTEM.SHIELD_DEFENSE_DICE }) schema.defense = new fields.StringField({ required: true, initial: "d4", choices: SYSTEM.SHIELD_DEFENSE_DICE })
schema.movementreduction = new fields.NumberField({ ...requiredInteger, required: true, initial: 0, min: 0 }) schema.movementreduction = new fields.NumberField({ ...requiredInteger, required: true, initial: 0, min: 0 })
schema.hascover = new fields.BooleanField({ required: true, initial: false }) schema.hascover = new fields.BooleanField({ required: true, initial: false })
schema.damageReduction = new fields.NumberField({ ...requiredInteger, required: true, initial: 0, min: 0 })
schema.standing = new fields.SchemaField({ schema.standing = new fields.SchemaField({
min: new fields.NumberField({ ...requiredInteger, required: true, initial: 0, min: 0 }), min: new fields.NumberField({ ...requiredInteger, required: true, initial: 0, min: 0 }),

View File

@@ -246,4 +246,100 @@ export default class LethalFantasyUtils {
} }
} }
/* -------------------------------------------- */
static async applyDamage(message, event) {
// Récupérer les données du message
let combatantId = event.currentTarget.dataset.combatantId
if (!combatantId || !game.combat) {
ui.notifications.error("No combatant selected")
return
}
let combatant = game.combat.combatants.get(combatantId)
if (!combatant) {
ui.notifications.error("Combatant not found")
return
}
let targetActor = combatant.token?.actor || game.actors.get(combatant.actorId)
if (!targetActor) {
ui.notifications.error("Target actor not found")
return
}
// Récupérer les données de dégâts du message
let damageTotal = message.rolls[0]?.total || 0
let weaponName = message.rolls[0]?.options?.rollName || "Unknown Weapon"
// Calculer les DR
let armorDR = targetActor.computeDamageReduction() || 0
let shieldDR = targetActor.getShieldDR() || 0
let totalDR = armorDR + shieldDR
// Créer le dialogue
const content = await foundry.applications.handlebars.renderTemplate(
"systems/fvtt-lethal-fantasy/templates/apply-damage-dialog.hbs",
{
targetName: targetActor.name,
weaponName: weaponName,
damageTotal: damageTotal,
armorDR: armorDR,
shieldDR: shieldDR,
totalDR: totalDR,
damageNoDR: damageTotal,
damageWithArmor: Math.max(0, damageTotal - armorDR),
damageWithAll: Math.max(0, damageTotal - totalDR)
}
)
const result = await foundry.applications.api.DialogV2.wait({
window: { title: "Apply Damage" },
classes: ["lethalfantasy"],
position: { width: 280 },
content,
buttons: [
{
action: "noDR",
label: "No DR",
callback: () => ({ drType: "none", damage: damageTotal })
},
{
action: "armorDR",
label: "With Armor DR",
callback: () => ({ drType: "armor", damage: Math.max(0, damageTotal - armorDR) })
},
{
action: "allDR",
label: "With Armor + Shield DR",
callback: () => ({ drType: "all", damage: Math.max(0, damageTotal - totalDR) })
},
{
action: "cancel",
label: "Cancel",
callback: () => null
}
],
rejectClose: false
})
if (result && result.damage !== undefined) {
await targetActor.applyDamage(-result.damage)
// Message de confirmation
let drText = ""
if (result.drType === "armor") {
drText = ` (Armor DR: ${armorDR})`
} else if (result.drType === "all") {
drText = ` (Total DR: ${totalDR})`
}
ChatMessage.create({
user: game.user.id,
speaker: { alias: targetActor.name },
rollMode: "gmroll",
content: `${targetActor.name} takes ${result.damage} damage${drText} from ${weaponName}`
})
}
}
} }

View File

@@ -1 +1 @@
MANIFEST-000420 MANIFEST-000498

View File

@@ -1,8 +1,15 @@
2025/09/19-21:01:58.948341 7f7cfaffd6c0 Recovering log #418 2026/01/12-14:22:56.040680 7fd462ffd6c0 Recovering log #496
2025/09/19-21:01:58.990053 7f7cfaffd6c0 Delete type=3 #416 2026/01/12-14:22:56.051263 7fd462ffd6c0 Delete type=3 #494
2025/09/19-21:01:58.990118 7f7cfaffd6c0 Delete type=0 #418 2026/01/12-14:22:56.051335 7fd462ffd6c0 Delete type=0 #496
2025/09/19-22:28:27.055322 7f7cf9fff6c0 Level-0 table #423: started 2026/01/12-14:27:05.789368 7fd4627fc6c0 Level-0 table #501: started
2025/09/19-22:28:27.055429 7f7cf9fff6c0 Level-0 table #423: 0 bytes OK 2026/01/12-14:27:05.793070 7fd4627fc6c0 Level-0 table #501: 26835 bytes OK
2025/09/19-22:28:27.062766 7f7cf9fff6c0 Delete type=0 #421 2026/01/12-14:27:05.799160 7fd4627fc6c0 Delete type=0 #499
2025/09/19-22:28:27.082558 7f7cf9fff6c0 Manual compaction at level-0 from '!folders!ATr9wZhg5uTVTksM' @ 72057594037927935 : 1 .. '!items!zw9RQocTdz3HRjZK' @ 0 : 0; will stop at (end) 2026/01/12-14:27:05.815143 7fd4627fc6c0 Manual compaction at level-0 from '!folders!ATr9wZhg5uTVTksM' @ 72057594037927935 : 1 .. '!items!zw9RQocTdz3HRjZK' @ 0 : 0; will stop at (end)
2025/09/19-22:28:27.082605 7f7cf9fff6c0 Manual compaction at level-1 from '!folders!ATr9wZhg5uTVTksM' @ 72057594037927935 : 1 .. '!items!zw9RQocTdz3HRjZK' @ 0 : 0; will stop at (end) 2026/01/12-14:27:05.815173 7fd4627fc6c0 Manual compaction at level-1 from '!folders!ATr9wZhg5uTVTksM' @ 72057594037927935 : 1 .. '!items!zw9RQocTdz3HRjZK' @ 0 : 0; will stop at '!items!zFrygJ2TnrxchBai' @ 1178 : 1
2026/01/12-14:27:05.815179 7fd4627fc6c0 Compacting 1@1 + 1@2 files
2026/01/12-14:27:05.821137 7fd4627fc6c0 Generated table #502@1: 486 keys, 220368 bytes
2026/01/12-14:27:05.821151 7fd4627fc6c0 Compacted 1@1 + 1@2 files => 220368 bytes
2026/01/12-14:27:05.827440 7fd4627fc6c0 compacted to: files[ 0 0 1 0 0 0 0 ]
2026/01/12-14:27:05.827535 7fd4627fc6c0 Delete type=2 #489
2026/01/12-14:27:05.828221 7fd4627fc6c0 Delete type=2 #501
2026/01/12-14:27:05.839529 7fd4627fc6c0 Manual compaction at level-1 from '!items!zFrygJ2TnrxchBai' @ 1178 : 1 .. '!items!zw9RQocTdz3HRjZK' @ 0 : 0; will stop at (end)

View File

@@ -1,8 +1,8 @@
2025/09/17-07:46:03.118742 7f3080dfa6c0 Recovering log #414 2026/01/04-22:23:04.765915 7f93ebfff6c0 Recovering log #492
2025/09/17-07:46:03.213578 7f3080dfa6c0 Delete type=3 #412 2026/01/04-22:23:04.775983 7f93ebfff6c0 Delete type=3 #490
2025/09/17-07:46:03.213653 7f3080dfa6c0 Delete type=0 #414 2026/01/04-22:23:04.776035 7f93ebfff6c0 Delete type=0 #492
2025/09/17-07:46:49.420076 7f307a7fc6c0 Level-0 table #419: started 2026/01/04-22:40:50.964348 7f93e9ffb6c0 Level-0 table #497: started
2025/09/17-07:46:49.420100 7f307a7fc6c0 Level-0 table #419: 0 bytes OK 2026/01/04-22:40:50.964370 7f93e9ffb6c0 Level-0 table #497: 0 bytes OK
2025/09/17-07:46:49.429915 7f307a7fc6c0 Delete type=0 #417 2026/01/04-22:40:50.975783 7f93e9ffb6c0 Delete type=0 #495
2025/09/17-07:46:49.430201 7f307a7fc6c0 Manual compaction at level-0 from '!folders!ATr9wZhg5uTVTksM' @ 72057594037927935 : 1 .. '!items!zw9RQocTdz3HRjZK' @ 0 : 0; will stop at (end) 2026/01/04-22:40:50.986019 7f93e9ffb6c0 Manual compaction at level-0 from '!folders!ATr9wZhg5uTVTksM' @ 72057594037927935 : 1 .. '!items!zw9RQocTdz3HRjZK' @ 0 : 0; will stop at (end)
2025/09/17-07:46:49.430227 7f307a7fc6c0 Manual compaction at level-1 from '!folders!ATr9wZhg5uTVTksM' @ 72057594037927935 : 1 .. '!items!zw9RQocTdz3HRjZK' @ 0 : 0; will stop at (end) 2026/01/04-22:40:50.986046 7f93e9ffb6c0 Manual compaction at level-1 from '!folders!ATr9wZhg5uTVTksM' @ 72057594037927935 : 1 .. '!items!zw9RQocTdz3HRjZK' @ 0 : 0; will stop at (end)

Binary file not shown.

Binary file not shown.

View File

@@ -1 +1 @@
MANIFEST-000420 MANIFEST-000496

View File

@@ -1,8 +1,8 @@
2025/09/19-21:01:58.995284 7f7cfbfff6c0 Recovering log #418 2026/01/12-14:22:56.057091 7fd4637fe6c0 Recovering log #494
2025/09/19-21:01:59.036400 7f7cfbfff6c0 Delete type=3 #416 2026/01/12-14:22:56.067553 7fd4637fe6c0 Delete type=3 #492
2025/09/19-21:01:59.036480 7f7cfbfff6c0 Delete type=0 #418 2026/01/12-14:22:56.067610 7fd4637fe6c0 Delete type=0 #494
2025/09/19-22:28:27.076046 7f7cf9fff6c0 Level-0 table #423: started 2026/01/12-14:27:05.799253 7fd4627fc6c0 Level-0 table #499: started
2025/09/19-22:28:27.076085 7f7cf9fff6c0 Level-0 table #423: 0 bytes OK 2026/01/12-14:27:05.799272 7fd4627fc6c0 Level-0 table #499: 0 bytes OK
2025/09/19-22:28:27.082428 7f7cf9fff6c0 Delete type=0 #421 2026/01/12-14:27:05.805798 7fd4627fc6c0 Delete type=0 #497
2025/09/19-22:28:27.082612 7f7cf9fff6c0 Manual compaction at level-0 from '!folders!yPWGvxHJbDNHVSnY' @ 72057594037927935 : 1 .. '!items!zjvGljrLk5SshC9D' @ 0 : 0; will stop at (end) 2026/01/12-14:27:05.815153 7fd4627fc6c0 Manual compaction at level-0 from '!folders!yPWGvxHJbDNHVSnY' @ 72057594037927935 : 1 .. '!items!x5gLtqlW4sdDmHTd' @ 0 : 0; will stop at (end)
2025/09/19-22:28:27.082639 7f7cf9fff6c0 Manual compaction at level-1 from '!folders!yPWGvxHJbDNHVSnY' @ 72057594037927935 : 1 .. '!items!zjvGljrLk5SshC9D' @ 0 : 0; will stop at (end) 2026/01/12-14:27:05.828314 7fd4627fc6c0 Manual compaction at level-1 from '!folders!yPWGvxHJbDNHVSnY' @ 72057594037927935 : 1 .. '!items!x5gLtqlW4sdDmHTd' @ 0 : 0; will stop at (end)

View File

@@ -1,8 +1,8 @@
2025/09/17-07:46:03.218339 7f307bfff6c0 Recovering log #414 2026/01/04-22:23:04.780744 7f93eb7fe6c0 Recovering log #490
2025/09/17-07:46:03.309130 7f307bfff6c0 Delete type=3 #412 2026/01/04-22:23:04.790510 7f93eb7fe6c0 Delete type=3 #488
2025/09/17-07:46:03.309200 7f307bfff6c0 Delete type=0 #414 2026/01/04-22:23:04.790582 7f93eb7fe6c0 Delete type=0 #490
2025/09/17-07:46:49.410790 7f307a7fc6c0 Level-0 table #419: started 2026/01/04-22:40:50.951234 7f93e9ffb6c0 Level-0 table #495: started
2025/09/17-07:46:49.410814 7f307a7fc6c0 Level-0 table #419: 0 bytes OK 2026/01/04-22:40:50.951256 7f93e9ffb6c0 Level-0 table #495: 0 bytes OK
2025/09/17-07:46:49.419958 7f307a7fc6c0 Delete type=0 #417 2026/01/04-22:40:50.964192 7f93e9ffb6c0 Delete type=0 #493
2025/09/17-07:46:49.430187 7f307a7fc6c0 Manual compaction at level-0 from '!folders!yPWGvxHJbDNHVSnY' @ 72057594037927935 : 1 .. '!items!zjvGljrLk5SshC9D' @ 0 : 0; will stop at (end) 2026/01/04-22:40:50.986007 7f93e9ffb6c0 Manual compaction at level-0 from '!folders!yPWGvxHJbDNHVSnY' @ 72057594037927935 : 1 .. '!items!x5gLtqlW4sdDmHTd' @ 0 : 0; will stop at (end)
2025/09/17-07:46:49.430218 7f307a7fc6c0 Manual compaction at level-1 from '!folders!yPWGvxHJbDNHVSnY' @ 72057594037927935 : 1 .. '!items!zjvGljrLk5SshC9D' @ 0 : 0; will stop at (end) 2026/01/04-22:40:50.986038 7f93e9ffb6c0 Manual compaction at level-1 from '!folders!yPWGvxHJbDNHVSnY' @ 72057594037927935 : 1 .. '!items!x5gLtqlW4sdDmHTd' @ 0 : 0; will stop at (end)

Binary file not shown.

View File

@@ -1 +1 @@
MANIFEST-000420 MANIFEST-000499

View File

@@ -1,8 +1,15 @@
2025/09/19-21:01:58.905694 7f7d00dfa6c0 Recovering log #418 2026/01/12-14:22:56.026652 7fd478fff6c0 Recovering log #497
2025/09/19-21:01:58.943958 7f7d00dfa6c0 Delete type=3 #416 2026/01/12-14:22:56.036317 7fd478fff6c0 Delete type=3 #495
2025/09/19-21:01:58.944064 7f7d00dfa6c0 Delete type=0 #418 2026/01/12-14:22:56.036373 7fd478fff6c0 Delete type=0 #497
2025/09/19-22:28:27.069590 7f7cf9fff6c0 Level-0 table #423: started 2026/01/12-14:27:05.805895 7fd4627fc6c0 Level-0 table #502: started
2025/09/19-22:28:27.069620 7f7cf9fff6c0 Level-0 table #423: 0 bytes OK 2026/01/12-14:27:05.809094 7fd4627fc6c0 Level-0 table #502: 1650 bytes OK
2025/09/19-22:28:27.075890 7f7cf9fff6c0 Delete type=0 #421 2026/01/12-14:27:05.815051 7fd4627fc6c0 Delete type=0 #500
2025/09/19-22:28:27.082581 7f7cf9fff6c0 Manual compaction at level-0 from '!folders!7j8H7DbmBb9Uza2X' @ 72057594037927935 : 1 .. '!items!zt8s7564ep1La4XQ' @ 0 : 0; will stop at (end) 2026/01/12-14:27:05.815162 7fd4627fc6c0 Manual compaction at level-0 from '!folders!7j8H7DbmBb9Uza2X' @ 72057594037927935 : 1 .. '!items!zt8s7564ep1La4XQ' @ 0 : 0; will stop at (end)
2025/09/19-22:28:27.082657 7f7cf9fff6c0 Manual compaction at level-1 from '!folders!7j8H7DbmBb9Uza2X' @ 72057594037927935 : 1 .. '!items!zt8s7564ep1La4XQ' @ 0 : 0; will stop at (end) 2026/01/12-14:27:05.828330 7fd4627fc6c0 Manual compaction at level-1 from '!folders!7j8H7DbmBb9Uza2X' @ 72057594037927935 : 1 .. '!items!zt8s7564ep1La4XQ' @ 0 : 0; will stop at '!items!3cU5wW47VwlEPNqj' @ 736 : 1
2026/01/12-14:27:05.828340 7fd4627fc6c0 Compacting 1@1 + 1@2 files
2026/01/12-14:27:05.833408 7fd4627fc6c0 Generated table #503@1: 91 keys, 118712 bytes
2026/01/12-14:27:05.833433 7fd4627fc6c0 Compacted 1@1 + 1@2 files => 118712 bytes
2026/01/12-14:27:05.839289 7fd4627fc6c0 compacted to: files[ 0 0 1 0 0 0 0 ]
2026/01/12-14:27:05.839370 7fd4627fc6c0 Delete type=2 #494
2026/01/12-14:27:05.839480 7fd4627fc6c0 Delete type=2 #502
2026/01/12-14:27:05.852151 7fd4627fc6c0 Manual compaction at level-1 from '!items!3cU5wW47VwlEPNqj' @ 736 : 1 .. '!items!zt8s7564ep1La4XQ' @ 0 : 0; will stop at (end)

View File

@@ -1,8 +1,8 @@
2025/09/17-07:46:03.016134 7f307affd6c0 Recovering log #414 2026/01/04-22:23:04.753572 7f93ea7fc6c0 Recovering log #492
2025/09/17-07:46:03.115017 7f307affd6c0 Delete type=3 #412 2026/01/04-22:23:04.763198 7f93ea7fc6c0 Delete type=3 #490
2025/09/17-07:46:03.115113 7f307affd6c0 Delete type=0 #414 2026/01/04-22:23:04.763251 7f93ea7fc6c0 Delete type=0 #492
2025/09/17-07:46:49.400823 7f307a7fc6c0 Level-0 table #419: started 2026/01/04-22:40:50.941164 7f93e9ffb6c0 Level-0 table #498: started
2025/09/17-07:46:49.400858 7f307a7fc6c0 Level-0 table #419: 0 bytes OK 2026/01/04-22:40:50.941212 7f93e9ffb6c0 Level-0 table #498: 0 bytes OK
2025/09/17-07:46:49.410679 7f307a7fc6c0 Delete type=0 #417 2026/01/04-22:40:50.951122 7f93e9ffb6c0 Delete type=0 #496
2025/09/17-07:46:49.430172 7f307a7fc6c0 Manual compaction at level-0 from '!folders!7j8H7DbmBb9Uza2X' @ 72057594037927935 : 1 .. '!items!zt8s7564ep1La4XQ' @ 0 : 0; will stop at (end) 2026/01/04-22:40:50.985987 7f93e9ffb6c0 Manual compaction at level-0 from '!folders!7j8H7DbmBb9Uza2X' @ 72057594037927935 : 1 .. '!items!zt8s7564ep1La4XQ' @ 0 : 0; will stop at (end)
2025/09/17-07:46:49.430210 7f307a7fc6c0 Manual compaction at level-1 from '!folders!7j8H7DbmBb9Uza2X' @ 72057594037927935 : 1 .. '!items!zt8s7564ep1La4XQ' @ 0 : 0; will stop at (end) 2026/01/04-22:40:50.986053 7f93e9ffb6c0 Manual compaction at level-1 from '!folders!7j8H7DbmBb9Uza2X' @ 72057594037927935 : 1 .. '!items!zt8s7564ep1La4XQ' @ 0 : 0; will stop at (end)

Binary file not shown.

View File

@@ -1 +1 @@
MANIFEST-000120 MANIFEST-000196

View File

@@ -1,8 +1,8 @@
2025/09/19-21:01:59.113262 7f7cfaffd6c0 Recovering log #118 2026/01/12-14:22:56.089280 7fd478fff6c0 Recovering log #194
2025/09/19-21:01:59.152822 7f7cfaffd6c0 Delete type=3 #116 2026/01/12-14:22:56.099242 7fd478fff6c0 Delete type=3 #192
2025/09/19-21:01:59.152924 7f7cfaffd6c0 Delete type=0 #118 2026/01/12-14:22:56.099341 7fd478fff6c0 Delete type=0 #194
2025/09/19-22:28:27.089546 7f7cf9fff6c0 Level-0 table #123: started 2026/01/12-14:27:05.839539 7fd4627fc6c0 Level-0 table #199: started
2025/09/19-22:28:27.089602 7f7cf9fff6c0 Level-0 table #123: 0 bytes OK 2026/01/12-14:27:05.839559 7fd4627fc6c0 Level-0 table #199: 0 bytes OK
2025/09/19-22:28:27.095855 7f7cf9fff6c0 Delete type=0 #121 2026/01/12-14:27:05.845408 7fd4627fc6c0 Delete type=0 #197
2025/09/19-22:28:27.116632 7f7cf9fff6c0 Manual compaction at level-0 from '!folders!37mu4dxsSuftlnmP' @ 72057594037927935 : 1 .. '!items!zKOpU34oLziGJW6y' @ 0 : 0; will stop at (end) 2026/01/12-14:27:05.858412 7fd4627fc6c0 Manual compaction at level-0 from '!folders!37mu4dxsSuftlnmP' @ 72057594037927935 : 1 .. '!items!zKOpU34oLziGJW6y' @ 0 : 0; will stop at (end)
2025/09/19-22:28:27.145745 7f7cf9fff6c0 Manual compaction at level-1 from '!folders!37mu4dxsSuftlnmP' @ 72057594037927935 : 1 .. '!items!zKOpU34oLziGJW6y' @ 0 : 0; will stop at (end) 2026/01/12-14:27:05.864408 7fd4627fc6c0 Manual compaction at level-1 from '!folders!37mu4dxsSuftlnmP' @ 72057594037927935 : 1 .. '!items!zKOpU34oLziGJW6y' @ 0 : 0; will stop at (end)

View File

@@ -1,8 +1,8 @@
2025/09/17-07:46:03.403212 7f307affd6c0 Recovering log #114 2026/01/04-22:23:04.807684 7f93ebfff6c0 Recovering log #190
2025/09/17-07:46:03.504394 7f307affd6c0 Delete type=3 #112 2026/01/04-22:23:04.818050 7f93ebfff6c0 Delete type=3 #188
2025/09/17-07:46:03.504449 7f307affd6c0 Delete type=0 #114 2026/01/04-22:23:04.818118 7f93ebfff6c0 Delete type=0 #190
2025/09/17-07:46:49.470775 7f307a7fc6c0 Level-0 table #119: started 2026/01/04-22:40:51.016662 7f93e9ffb6c0 Level-0 table #195: started
2025/09/17-07:46:49.470837 7f307a7fc6c0 Level-0 table #119: 0 bytes OK 2026/01/04-22:40:51.016694 7f93e9ffb6c0 Level-0 table #195: 0 bytes OK
2025/09/17-07:46:49.482316 7f307a7fc6c0 Delete type=0 #117 2026/01/04-22:40:51.026652 7f93e9ffb6c0 Delete type=0 #193
2025/09/17-07:46:49.503080 7f307a7fc6c0 Manual compaction at level-0 from '!folders!37mu4dxsSuftlnmP' @ 72057594037927935 : 1 .. '!items!zKOpU34oLziGJW6y' @ 0 : 0; will stop at (end) 2026/01/04-22:40:51.026790 7f93e9ffb6c0 Manual compaction at level-0 from '!folders!37mu4dxsSuftlnmP' @ 72057594037927935 : 1 .. '!items!zKOpU34oLziGJW6y' @ 0 : 0; will stop at (end)
2025/09/17-07:46:49.523511 7f307a7fc6c0 Manual compaction at level-1 from '!folders!37mu4dxsSuftlnmP' @ 72057594037927935 : 1 .. '!items!zKOpU34oLziGJW6y' @ 0 : 0; will stop at (end) 2026/01/04-22:40:51.026806 7f93e9ffb6c0 Manual compaction at level-1 from '!folders!37mu4dxsSuftlnmP' @ 72057594037927935 : 1 .. '!items!zKOpU34oLziGJW6y' @ 0 : 0; will stop at (end)

View File

@@ -1 +1 @@
MANIFEST-000419 MANIFEST-000495

View File

@@ -1,8 +1,8 @@
2025/09/19-21:01:59.044069 7f7cfb7fe6c0 Recovering log #417 2026/01/12-14:22:56.075339 7fd463fff6c0 Recovering log #493
2025/09/19-21:01:59.110180 7f7cfb7fe6c0 Delete type=3 #415 2026/01/12-14:22:56.084731 7fd463fff6c0 Delete type=3 #491
2025/09/19-21:01:59.110282 7f7cfb7fe6c0 Delete type=0 #417 2026/01/12-14:22:56.084798 7fd463fff6c0 Delete type=0 #493
2025/09/19-22:28:27.062900 7f7cf9fff6c0 Level-0 table #422: started 2026/01/12-14:27:05.782342 7fd4627fc6c0 Level-0 table #498: started
2025/09/19-22:28:27.062937 7f7cf9fff6c0 Level-0 table #422: 0 bytes OK 2026/01/12-14:27:05.782393 7fd4627fc6c0 Level-0 table #498: 0 bytes OK
2025/09/19-22:28:27.069460 7f7cf9fff6c0 Delete type=0 #420 2026/01/12-14:27:05.789274 7fd4627fc6c0 Delete type=0 #496
2025/09/19-22:28:27.082570 7f7cf9fff6c0 Manual compaction at level-0 from '!folders!mnO9OzE7BEE2KDfh' @ 72057594037927935 : 1 .. '!items!zkK6ixtCsCw3RH9X' @ 0 : 0; will stop at (end) 2026/01/12-14:27:05.815132 7fd4627fc6c0 Manual compaction at level-0 from '!folders!mnO9OzE7BEE2KDfh' @ 72057594037927935 : 1 .. '!items!zkK6ixtCsCw3RH9X' @ 0 : 0; will stop at (end)
2025/09/19-22:28:27.082620 7f7cf9fff6c0 Manual compaction at level-1 from '!folders!mnO9OzE7BEE2KDfh' @ 72057594037927935 : 1 .. '!items!zkK6ixtCsCw3RH9X' @ 0 : 0; will stop at (end) 2026/01/12-14:27:05.828301 7fd4627fc6c0 Manual compaction at level-1 from '!folders!mnO9OzE7BEE2KDfh' @ 72057594037927935 : 1 .. '!items!zkK6ixtCsCw3RH9X' @ 0 : 0; will stop at (end)

View File

@@ -1,8 +1,8 @@
2025/09/17-07:46:03.312040 7f307b7fe6c0 Recovering log #413 2026/01/04-22:23:04.794525 7f93ea7fc6c0 Recovering log #489
2025/09/17-07:46:03.400421 7f307b7fe6c0 Delete type=3 #411 2026/01/04-22:23:04.804229 7f93ea7fc6c0 Delete type=3 #487
2025/09/17-07:46:03.400487 7f307b7fe6c0 Delete type=0 #413 2026/01/04-22:23:04.804296 7f93ea7fc6c0 Delete type=0 #489
2025/09/17-07:46:49.390955 7f307a7fc6c0 Level-0 table #418: started 2026/01/04-22:40:50.975950 7f93e9ffb6c0 Level-0 table #494: started
2025/09/17-07:46:49.391029 7f307a7fc6c0 Level-0 table #418: 0 bytes OK 2026/01/04-22:40:50.975985 7f93e9ffb6c0 Level-0 table #494: 0 bytes OK
2025/09/17-07:46:49.400683 7f307a7fc6c0 Delete type=0 #416 2026/01/04-22:40:50.985836 7f93e9ffb6c0 Delete type=0 #492
2025/09/17-07:46:49.430144 7f307a7fc6c0 Manual compaction at level-0 from '!folders!mnO9OzE7BEE2KDfh' @ 72057594037927935 : 1 .. '!items!zkK6ixtCsCw3RH9X' @ 0 : 0; will stop at (end) 2026/01/04-22:40:50.986029 7f93e9ffb6c0 Manual compaction at level-0 from '!folders!mnO9OzE7BEE2KDfh' @ 72057594037927935 : 1 .. '!items!zkK6ixtCsCw3RH9X' @ 0 : 0; will stop at (end)
2025/09/17-07:46:49.430391 7f307a7fc6c0 Manual compaction at level-1 from '!folders!mnO9OzE7BEE2KDfh' @ 72057594037927935 : 1 .. '!items!zkK6ixtCsCw3RH9X' @ 0 : 0; will stop at (end) 2026/01/04-22:40:50.986073 7f93e9ffb6c0 Manual compaction at level-1 from '!folders!mnO9OzE7BEE2KDfh' @ 72057594037927935 : 1 .. '!items!zkK6ixtCsCw3RH9X' @ 0 : 0; will stop at (end)

View File

@@ -375,6 +375,9 @@
min-width: 2.5rem; min-width: 2.5rem;
max-width: 2.5rem; max-width: 2.5rem;
} }
.ranged-attack-button {
font-size: 0.8rem;
}
button { button {
min-width: 9rem; min-width: 9rem;
} }

View File

@@ -22,7 +22,8 @@
} }
} }
} }
.button.control, .fortune-accepted { .button.control,
.fortune-accepted {
display: flex; display: flex;
justify-content: center; justify-content: center;
align-items: center; align-items: center;

View File

@@ -47,7 +47,7 @@ i.lethalfantasy {
.application.dialog.lethalfantasy { .application.dialog.lethalfantasy {
font-family: var(--font-primary); font-family: var(--font-primary);
font-size: calc(var(--font-size-standard) * 1.0); font-size: calc(var(--font-size-standard) * 1);
background-image: var(--background-image-base); background-image: var(--background-image-base);
button:hover { button:hover {
background: var(--color-dark-6); background: var(--color-dark-6);

View File

@@ -25,7 +25,6 @@
gap: 10px; gap: 10px;
flex: 1; flex: 1;
.monster-hp { .monster-hp {
display: flex; display: flex;
gap: 4px; gap: 4px;
@@ -46,7 +45,7 @@
min-width: 2.2rem; min-width: 2.2rem;
max-width: 2.2rem; max-width: 2.2rem;
margin-left: 4px; margin-left: 4px;
font-size: calc(var(--font-size-standard) * 1.0); font-size: calc(var(--font-size-standard) * 1);
} }
.character-hp-max { .character-hp-max {
clear: both; clear: both;
@@ -58,7 +57,7 @@
input { input {
width: 3.2rem; width: 3.2rem;
text-align: center; text-align: center;
font-size: calc(var(--font-size-standard) * 1.0); font-size: calc(var(--font-size-standard) * 1);
} }
} }
} }
@@ -121,9 +120,11 @@
flex: 1; flex: 1;
.monster-skill { .monster-skill {
display: flex; display: grid;
grid-template-columns: repeat(3, auto 2.5rem);
gap: 0.5rem;
align-items: center; align-items: center;
margin-right: 0.5rem;
.rollable:hover, .rollable:hover,
.rollable:focus { .rollable:focus {
text-shadow: 0 0 8px var(--color-shadow-primary); text-shadow: 0 0 8px var(--color-shadow-primary);
@@ -134,12 +135,9 @@
max-width: 2.5rem; max-width: 2.5rem;
} }
.name { .name {
flex: 1;
min-width: 3.2rem;
margin-left: 4px; margin-left: 4px;
} }
.form-group { .form-group {
flex: 1;
padding-left: 4px; padding-left: 4px;
.form-fields { .form-fields {
flex: none; flex: none;
@@ -157,8 +155,9 @@
.monster-movement { .monster-movement {
display: flex; display: flex;
align-items: center; flex-direction: column;
margin-right: 0.5rem; gap: 4px;
.rollable:hover, .rollable:hover,
.rollable:focus { .rollable:focus {
text-shadow: 0 0 8px var(--color-shadow-primary); text-shadow: 0 0 8px var(--color-shadow-primary);

View File

@@ -7,6 +7,65 @@
border-color: var(--color-dark-6); border-color: var(--color-dark-6);
color: var(--color-dark-2); color: var(--color-dark-2);
} }
.apply-damage-dialog {
.dialog-content {
padding: 6px;
font-size: calc(var(--font-size-standard) * 1);
.header {
text-align: center;
padding: 4px;
margin-bottom: 6px;
background-color: rgba(0, 0, 0, 0.1);
border-radius: 3px;
}
.damage-summary {
display: flex;
justify-content: space-between;
align-items: center;
padding: 4px 6px;
margin-bottom: 6px;
background-color: rgba(139, 0, 0, 0.1);
border-radius: 3px;
.damage-value {
color: var(--color-level-error);
font-size: calc(var(--font-size-standard) * 1.2);
font-weight: bold;
}
}
.dr-summary {
display: flex;
justify-content: space-around;
gap: 4px;
padding: 3px;
margin-bottom: 6px;
font-size: calc(var(--font-size-standard) * 0.85);
background-color: rgba(0, 0, 0, 0.05);
border-radius: 3px;
}
.damage-options {
.option-line {
display: flex;
justify-content: space-between;
align-items: center;
padding: 3px 6px;
margin: 2px 0;
background-color: rgba(0, 0, 0, 0.05);
border-radius: 3px;
strong {
color: var(--color-dark-1);
font-size: calc(var(--font-size-standard) * 1.05);
}
}
}
}
}
} }
.lethalfantasy-roll-dialog { .lethalfantasy-roll-dialog {
@@ -59,9 +118,14 @@
.dialog-form { .dialog-form {
.form-footer { .form-footer {
padding: 4px;
gap: 4px;
button { button {
min-width: 14rem; min-width: 8rem;
min-height: 3.2rem; min-height: 2rem;
padding: 2px 6px;
margin: 0;
font-size: calc(var(--font-size-standard) * 0.9);
} }
} }
} }
@@ -156,4 +220,129 @@
font-size: calc(var(--font-size-standard) * 1); font-size: calc(var(--font-size-standard) * 1);
text-shadow: 0 0 10px var(--color-shadow-primary); text-shadow: 0 0 10px var(--color-shadow-primary);
} }
.damage-buttons {
width: 100%;
padding: 8px;
margin-top: 8px;
.damage-buttons-title {
font-weight: bold;
margin-bottom: 8px;
font-size: calc(var(--font-size-standard) * 0.95);
text-align: center;
}
.damage-buttons-grid {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 6px;
padding: 8px;
background-color: rgba(0, 0, 0, 0.1);
border-radius: 5px;
&.monster-damage {
grid-template-columns: 1fr;
justify-items: center;
}
.damage-roll-btn {
padding: 6px 10px;
background: linear-gradient(to bottom, #8b4513 0%, #6b3410 100%);
border: 1px solid #4b2408;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);
color: #f0f0e0;
cursor: pointer;
border-radius: 4px;
font-size: calc(var(--font-size-standard) * 0.85);
font-weight: 500;
text-align: center;
transition: all 0.2s ease;
display: flex;
align-items: center;
justify-content: center;
gap: 4px;
i {
font-size: calc(var(--font-size-standard) * 1);
}
&:hover {
background: linear-gradient(to bottom, #9b5523 0%, #7b4420 100%);
box-shadow: 0 3px 6px rgba(0, 0, 0, 0.4);
transform: translateY(-1px);
border-color: #5b3418;
}
&:active {
transform: translateY(0);
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);
}
}
}
}
.damage-result {
width: 100%;
padding: 8px;
ul {
padding: 0;
margin: 0;
}
.li-apply-wounds {
list-style: none;
margin-top: 10px;
padding: 0;
display: none;
> div:first-child {
font-weight: bold;
margin-bottom: 8px;
font-size: calc(var(--font-size-standard) * 0.95);
text-align: center;
}
.combatants-grid {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 6px;
margin-top: 5px;
padding: 8px;
background-color: rgba(0, 0, 0, 0.1);
border-radius: 5px;
.apply-wounds-btn {
padding: 6px 10px;
background: linear-gradient(to bottom, #5a5850 0%, #4b4a44 100%);
border: 1px solid #2b2a24;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);
color: #f0f0e0;
cursor: pointer;
border-radius: 4px;
font-size: calc(var(--font-size-standard) * 0.85);
font-weight: 500;
text-align: center;
transition: all 0.2s ease;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
max-width: 100%;
&:hover {
background: linear-gradient(to bottom, #6a6860 0%, #5a5850 100%);
box-shadow: 0 3px 6px rgba(0, 0, 0, 0.4);
transform: translateY(-1px);
border-color: #3b3a34;
}
&:active {
transform: translateY(0);
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);
}
}
}
}
}
} }

View File

@@ -0,0 +1,37 @@
<div class="apply-damage-dialog">
<div class="dialog-content">
<div class="header">
<strong>{{targetName}}</strong>
-
{{weaponName}}
</div>
<div class="damage-summary">
<span class="label">{{localize
"LETHALFANTASY.Dialog.totalDamage"
}}:</span>
<span class="damage-value">{{damageTotal}}</span>
</div>
<div class="dr-summary">
<span>{{localize "LETHALFANTASY.Dialog.armorDR"}}: {{armorDR}}</span>
<span>{{localize "LETHALFANTASY.Dialog.shieldDR"}}: {{shieldDR}}</span>
<span class="total">DR: <strong>{{totalDR}}</strong></span>
</div>
<div class="damage-options">
<div class="option-line">
<span>{{localize "LETHALFANTASY.Dialog.noDR"}}</span>
<strong>{{damageNoDR}}</strong>
</div>
<div class="option-line">
<span>{{localize "LETHALFANTASY.Dialog.withArmor"}}</span>
<strong>{{damageWithArmor}}</strong>
</div>
<div class="option-line">
<span>{{localize "LETHALFANTASY.Dialog.withAll"}}</span>
<strong>{{damageWithAll}}</strong>
</div>
</div>
</div>
</div>

View File

@@ -1,4 +1,8 @@
<section class="tab character-{{tab.id}} {{tab.cssClass}}" data-tab="{{tab.id}}" data-group="{{tab.group}}"> <section
class="tab character-{{tab.id}} {{tab.cssClass}}"
data-tab="{{tab.id}}"
data-group="{{tab.group}}"
>
<div class="main-div"> <div class="main-div">
<fieldset> <fieldset>
@@ -6,19 +10,31 @@
<div class="biodata"> <div class="biodata">
<div class="biodata-elem"> <div class="biodata-elem">
<span class="name">Class</span> <span class="name">Class</span>
{{formInput systemFields.biodata.fields.class value=system.biodata.class }} {{formInput
systemFields.biodata.fields.class
value=system.biodata.class
}}
</div> </div>
<div class="biodata-elem"> <div class="biodata-elem">
<span class="name">Level</span> <span class="name">Level</span>
{{formInput systemFields.biodata.fields.level value=system.biodata.level }} {{formInput
systemFields.biodata.fields.level
value=system.biodata.level
}}
</div> </div>
<div class="biodata-elem"> <div class="biodata-elem">
<span class="name">Mortal</span> <span class="name">Mortal</span>
{{formInput systemFields.biodata.fields.mortal value=system.biodata.mortal }} {{formInput
systemFields.biodata.fields.mortal
value=system.biodata.mortal
}}
</div> </div>
<div class="biodata-elem"> <div class="biodata-elem">
<span class="name">Alignment</span> <span class="name">Alignment</span>
{{formInput systemFields.biodata.fields.alignment value=system.biodata.alignment }} {{formInput
systemFields.biodata.fields.alignment
value=system.biodata.alignment
}}
</div> </div>
<div class="biodata-elem"> <div class="biodata-elem">
<span class="name">Age</span> <span class="name">Age</span>
@@ -26,72 +42,139 @@
</div> </div>
<div class="biodata-elem"> <div class="biodata-elem">
<span class="name">Height</span> <span class="name">Height</span>
{{formInput systemFields.biodata.fields.height value=system.biodata.height }} {{formInput
systemFields.biodata.fields.height
value=system.biodata.height
}}
</div> </div>
<div class="biodata-elem"> <div class="biodata-elem">
<span class="name">Weight</span> <span class="name">Weight</span>
{{formInput systemFields.biodata.fields.weight value=system.biodata.weight }} {{formInput
systemFields.biodata.fields.weight
value=system.biodata.weight
}}
</div> </div>
<div class="biodata-elem"> <div class="biodata-elem">
<span class="name">Eyes</span> <span class="name">Eyes</span>
{{formInput systemFields.biodata.fields.eyes value=system.biodata.eyes }} {{formInput
systemFields.biodata.fields.eyes
value=system.biodata.eyes
}}
</div> </div>
<div class="biodata-elem"> <div class="biodata-elem">
<span class="name">Hair</span> <span class="name">Hair</span>
{{formInput systemFields.biodata.fields.hair value=system.biodata.hair }} {{formInput
systemFields.biodata.fields.hair
value=system.biodata.hair
}}
</div> </div>
<div class="biodata-elem"> <div class="biodata-elem">
<span class="name">Dev. Points (Total)</span> <span class="name">Dev. Points (Total)</span>
{{formInput systemFields.developmentPoints.fields.total value=system.developmentPoints.total }} {{formInput
systemFields.developmentPoints.fields.total
value=system.developmentPoints.total
}}
</div> </div>
<div class="biodata-elem"> <div class="biodata-elem">
<span class="name">Dev. Points (Rem.)</span> <span class="name">Dev. Points (Rem.)</span>
{{formInput systemFields.developmentPoints.fields.remaining value=system.developmentPoints.remaining }} {{formInput
systemFields.developmentPoints.fields.remaining
value=system.developmentPoints.remaining
}}
</div> </div>
<div class="biodata-elem"> <div class="biodata-elem">
<span class="name">Magic User</span> <span class="name">Magic User</span>
{{formInput systemFields.biodata.fields.magicUser value=system.biodata.magicUser }} {{formInput
systemFields.biodata.fields.magicUser
value=system.biodata.magicUser
}}
</div> </div>
<div class="biodata-elem"> <div class="biodata-elem">
<span class="name">Cleric User</span> <span class="name">Cleric User</span>
{{formInput systemFields.biodata.fields.clericUser value=system.biodata.clericUser }} {{formInput
systemFields.biodata.fields.clericUser
value=system.biodata.clericUser
}}
</div> </div>
<div class="biodata-elem"> <div class="biodata-elem">
<span class="name">Save bonus (1/5levels)</span> <span class="name">Save bonus (1/5levels)</span>
{{formInput systemFields.modifiers.fields.saveModifier value=system.modifiers.saveModifier disabled=true}} {{formInput
systemFields.modifiers.fields.saveModifier
value=system.modifiers.saveModifier
disabled=true
}}
</div> </div>
{{#if system.biodata.magicUser}} {{#if system.biodata.magicUser}}
<div class="biodata-elem"> <div class="biodata-elem">
<span class="name">Spell bonus (1/5levels)</span> <span class="name">Spell bonus (1/5levels)</span>
{{formInput systemFields.modifiers.fields.levelSpellModifier value=system.modifiers.levelSpellModifier disabled=true}} {{formInput
systemFields.modifiers.fields.levelSpellModifier
value=system.modifiers.levelSpellModifier
disabled=true
}}
</div> </div>
{{/if}} {{/if}}
{{#if system.biodata.clericUser}} {{#if system.biodata.clericUser}}
<div class="biodata-elem"> <div class="biodata-elem">
<span class="name">Miracle bonus (1/5levels)</span> <span class="name">Miracle bonus (1/5levels)</span>
{{formInput systemFields.modifiers.fields.levelMiracleModifier value=system.modifiers.levelMiracleModifier disabled=true}} {{formInput
systemFields.modifiers.fields.levelMiracleModifier
value=system.modifiers.levelMiracleModifier
disabled=true
}}
</div> </div>
{{/if}} {{/if}}
<div class="biodata-elem"> <div class="biodata-elem">
<span class="name">Last HD roll</span> <span class="name">Last HD roll</span>
{{formInput systemFields.biodata.fields.hpPerLevel value=system.biodata.hpPerLevel disabled=true}} {{formInput
systemFields.biodata.fields.hpPerLevel
value=system.biodata.hpPerLevel
disabled=isPlayMode
}}
</div> </div>
<div class="biodata-elem">
<span class="name">Natural DR</span>
{{formInput
systemFields.biodata.fields.naturalDR
value=system.biodata.naturalDR
disabled=isPlayMode
}}
</div> </div>
<div class="biodata-elem">
<span class="name">Magical DR</span>
{{formInput
systemFields.biodata.fields.magicDR
value=system.biodata.magicDR
disabled=isPlayMode
}}
</div>
</fieldset> </fieldset>
<fieldset> <fieldset>
<legend>{{localize "LETHALFANTASY.Label.description"}}</legend> <legend>{{localize "LETHALFANTASY.Label.description"}}</legend>
{{formInput systemFields.description enriched=enrichedDescription value=system.description name="system.description" {{formInput
toggled=true}} systemFields.description
enriched=enrichedDescription
value=system.description
name="system.description"
toggled=true
}}
</fieldset> </fieldset>
<fieldset> <fieldset>
<legend>{{localize "LETHALFANTASY.Label.notes"}}</legend> <legend>{{localize "LETHALFANTASY.Label.notes"}}</legend>
{{formInput systemFields.notes enriched=enrichedNotes value=system.notes name="system.notes" toggled=true}} {{formInput
systemFields.notes
enriched=enrichedNotes
value=system.notes
name="system.notes"
toggled=true
}}
</fieldset> </fieldset>
</div> </div>
</section> </section>

View File

@@ -6,11 +6,11 @@
<div class="combat-details"> <div class="combat-details">
<div class="combat-detail"> <div class="combat-detail">
<button class="action" data-action="rangedAttackDefense"> <button class="action ranged-attack-button" data-action="rangedAttackDefense">
{{localize "LETHALFANTASY.Label.rangedAttackDefense"}} {{localize "LETHALFANTASY.Label.rangedAttackDefense"}}
</button> </button>
<button class="action" data-action="rollInitiative"> <button class="action ranged-attack-button" data-action="rollInitiative">
{{localize "LETHALFANTASY.Label.rollInitiative"}} {{localize "LETHALFANTASY.Label.rollInitiative"}}
</button> </button>
@@ -22,20 +22,20 @@
</div> </div>
<div class="flexrow granted"> <div class="flexrow granted">
<span class=""><a class="rollable" data-roll-type="granted" data-roll-key="attackDice"><i <span class="">{{localize
class="lf-roll-small fa-solid fa-dice-d20"></i>{{localize "LETHALFANTASY.Label.grantedAttackDice"}}</a></span> "LETHALFANTASY.Label.grantedAttackDice"}}</a></span>
{{formInput systemFields.granted.fields.attackDice value=system.granted.attackDice disabled=isPlayMode }} {{formInput systemFields.granted.fields.attackDice value=system.granted.attackDice disabled=isPlayMode }}
</div> </div>
<div class="flexrow granted "> <div class="flexrow granted ">
<span class=""><a class="rollable" data-roll-type="granted" data-roll-key="defenseDice"><i <span class="">{{localize
class="lf-roll-small fa-solid fa-dice-d20"></i>{{localize "LETHALFANTASY.Label.grantedDefenseDice"}}</a></span> "LETHALFANTASY.Label.grantedDefenseDice"}}</a></span>
{{formInput systemFields.granted.fields.defenseDice value=system.granted.defenseDice disabled=isPlayMode }} {{formInput systemFields.granted.fields.defenseDice value=system.granted.defenseDice disabled=isPlayMode }}
</div> </div>
<div class="flexrow granted"> <div class="flexrow granted">
<span class=""><a class="rollable" data-roll-type="granted" data-roll-key="damageDice"><i <span class="">{{localize
class="lf-roll-small fa-solid fa-dice-d20"></i>{{localize "LETHALFANTASY.Label.grantedDamageDice"}}</a></span> "LETHALFANTASY.Label.grantedDamageDice"}}</a></span>
{{formInput systemFields.granted.fields.damageDice value=system.granted.damageDice disabled=isPlayMode }} {{formInput systemFields.granted.fields.damageDice value=system.granted.damageDice disabled=isPlayMode }}
</div> </div>
@@ -48,9 +48,12 @@
<div class="wounds"> <div class="wounds">
{{#each system.hp.wounds as |wound idx|}} {{#each system.hp.wounds as |wound idx|}}
<div class="wound"> <div class="wound">
Name:<input class="wound-description wound-data" type="text" data-type="String" data-index="{{@index}}" value="{{wound.description}}" data-name="description" > Name:<input class="wound-description wound-data" type="text" data-type="String" data-index="{{@index}}"
Duration:<input class="wound-duration wound-data" type="text" data-type="Number" data-index="{{@index}}" value="{{wound.duration}}" data-name="duration" > value="{{wound.description}}" data-name="description">
HP:<input class="wound-value wound-data" type="text" data-type="Number" data-index="{{@index}}" value="{{wound.value}}" data-name="value" > Duration:<input class="wound-duration wound-data" type="text" data-type="Number" data-index="{{@index}}"
value="{{wound.duration}}" data-name="duration">
HP:<input class="wound-value wound-data" type="text" data-type="Number" data-index="{{@index}}"
value="{{wound.value}}" data-name="value">
</div> </div>
{{/each}} {{/each}}
</div> </div>
@@ -65,13 +68,14 @@
{{#if (ne item.img "icons/svg/item-bag.svg")}} {{#if (ne item.img "icons/svg/item-bag.svg")}}
<img class="item-img" src="{{item.img}}" data-tooltip="{{item.name}}" /> <img class="item-img" src="{{item.img}}" data-tooltip="{{item.name}}" />
{{/if}} {{/if}}
<div class="name"> <div class="name" data-tooltip="{{item.system.description}}">
{{item.name}} {{item.name}}
</div> </div>
<div class="attack-icons"> <div class="attack-icons">
<a class="rollable" data-roll-type="weapon-attack" data-roll-key="{{item.id}}" data-tooltip="Roll Attack"> <a class="rollable" data-roll-type="weapon-attack" data-roll-key="{{item.id}}" data-tooltip="Roll Attack">
<i class="lf-roll-small fa-solid fa-swords" data-roll-type="weapon-attack" data-roll-key="{{item.id}}"></i> <i class="lf-roll-small fa-solid fa-swords" data-roll-type="weapon-attack"
data-roll-key="{{item.id}}"></i>
</a> </a>
<a class="rollable" data-roll-type="weapon-defense" data-roll-key="{{item.id}}" data-tooltip="Roll Defense"> <a class="rollable" data-roll-type="weapon-defense" data-roll-key="{{item.id}}" data-tooltip="Roll Defense">
@@ -109,13 +113,14 @@
{{#each armors as |item|}} {{#each armors as |item|}}
<div class="armor" data-item-id="{{item.id}}" data-item-uuid="{{item.uuid}}"> <div class="armor" data-item-id="{{item.id}}" data-item-uuid="{{item.uuid}}">
<img class="item-img" src="{{item.img}}" data-tooltip="{{item.name}}" /> <img class="item-img" src="{{item.img}}" data-tooltip="{{item.name}}" />
<div class="name" data-tooltip="{{{item.system.description}}}"> <div class="name" data-tooltip="{{item.system.description}}">
{{item.name}} {{item.name}}
</div> </div>
<div class="item-detail" data-tooltip="Defense">{{item.system.defense}}</div> <div class="item-detail" data-tooltip="Defense">{{item.system.defense}}</div>
<div class="item-detail" data-tooltip="Maximum movement">{{item.system.maximumMovement}}</div> <div class="item-detail" data-tooltip="Maximum movement">{{item.system.maximumMovement}}</div>
<div class="item-detail" data-tooltip="HP">{{item.system.hp}}</div> <div class="item-detail" data-tooltip="HP">{{item.system.hp}}</div>
<div class="item-detail" data-tooltip="Damage Reduction">{{item.system.damageReduction}}</div> <div class="item-detail" data-tooltip="Damage Reduction">{{item.system.damageReduction}}</div>
<div class="item-detail" data-tooltip={{#if item.system.equipped}}"Equipped"{{else}}"Not Equipped"{{/if}}>{{#if item.system.equipped}}<i class="fas fa-check"></i>{{else}}<i class="fas fa-times"></i>{{/if}}</div>
<div class="controls"> <div class="controls">
<a data-tooltip="{{localize 'LETHALFANTASY.Edit'}}" data-action="edit" data-item-id="{{item.id}}" <a data-tooltip="{{localize 'LETHALFANTASY.Edit'}}" data-action="edit" data-item-id="{{item.id}}"
data-item-uuid="{{item.uuid}}"><i class="fas fa-edit"></i></a> data-item-uuid="{{item.uuid}}"><i class="fas fa-edit"></i></a>
@@ -133,7 +138,7 @@
{{#each shields as |item|}} {{#each shields as |item|}}
<div class="shield" data-item-id="{{item.id}}" data-item-uuid="{{item.uuid}}"> <div class="shield" data-item-id="{{item.id}}" data-item-uuid="{{item.uuid}}">
<img class="item-img" src="{{item.img}}" data-tooltip="{{item.name}}" /> <img class="item-img" src="{{item.img}}" data-tooltip="{{item.name}}" />
<div class="name" data-tooltip="{{{item.system.description}}}"> <div class="name" data-tooltip="{{item.system.description}}">
{{item.name}} {{item.name}}
</div> </div>
<div class="item-detail" data-tooltip="Defense"> <div class="item-detail" data-tooltip="Defense">
@@ -145,7 +150,7 @@
</div> </div>
<div class="item-detail" data-tooltip="Movement reduction">{{item.system.movementreduction}}</div> <div class="item-detail" data-tooltip="Movement reduction">{{item.system.movementreduction}}</div>
<div class="item-detail" data-tooltip="Has cover">{{#if item.system.hascover}}Cover{{/if}}</div> <div class="item-detail" data-tooltip="Has cover">{{#if item.system.hascover}}Cover{{/if}}</div>
<div class="item-detail" data-tooltip={{#if item.system.equipped}}"Equipped"{{else}}"Not Equipped"{{/if}}>{{#if item.system.equipped}}<i class="fas fa-check"></i>{{else}}<i class="fas fa-times"></i>{{/if}}</div>
<div class="controls"> <div class="controls">
<a data-tooltip="{{localize 'LETHALFANTASY.Edit'}}" data-action="edit" data-item-id="{{item.id}}" <a data-tooltip="{{localize 'LETHALFANTASY.Edit'}}" data-action="edit" data-item-id="{{item.id}}"
data-item-uuid="{{item.uuid}}"><i class="fas fa-edit"></i></a> data-item-uuid="{{item.uuid}}"><i class="fas fa-edit"></i></a>
@@ -156,6 +161,5 @@
{{/each}} {{/each}}
</div> </div>
</fieldset> </fieldset>
<div> </div>
</section> </section>

View File

@@ -1,4 +1,6 @@
<section class="character-main character-main-{{ifThen isPlayMode 'play' 'edit'}}"> <section
class="character-main character-main-{{ifThen isPlayMode 'play' 'edit'}}"
>
{{log "character-main" this}} {{log "character-main" this}}
<fieldset> <fieldset>
@@ -6,99 +8,189 @@
<div class="character-pc character-pc-{{ifThen isPlayMode 'play' 'edit'}}"> <div class="character-pc character-pc-{{ifThen isPlayMode 'play' 'edit'}}">
<div class="character-left"> <div class="character-left">
<div class="character-left-image"> <div class="character-left-image">
<img class="character-img" src="{{actor.img}}" data-edit="img" data-action="editImage" <img
data-tooltip="{{actor.name}}" /> class="character-img"
src="{{actor.img}}"
data-edit="img"
data-action="editImage"
data-tooltip="{{actor.name}}"
/>
</div> </div>
<fieldset class=""> <fieldset class="">
<div class="flexrow character-hp"> <div class="flexrow character-hp">
<span class="name">{{localize "LETHALFANTASY.Label.HP"}}</span> <span class="name">{{localize "LETHALFANTASY.Label.HP"}}</span>
{{formInput systemFields.hp.fields.value value=system.hp.value disabled=isPlayMode {{formInput
classes="character-hp-value"}} systemFields.hp.fields.value
value=system.hp.value
disabled=isPlayMode
classes="character-hp-value"
}}
&nbsp;/&nbsp; &nbsp;/&nbsp;
{{formInput systemFields.hp.fields.max value=system.hp.max disabled=isPlayMode {{formInput
classes="character-hp-value"}} systemFields.hp.fields.max
value=system.hp.max
disabled=isPlayMode
classes="character-hp-value"
}}
</div> </div>
<div class="flexrow character-hp"> <div class="flexrow character-hp">
<span class="name">{{localize "LETHALFANTASY.Label.grit"}}</span> <span class="name">{{localize "LETHALFANTASY.Label.grit"}}</span>
{{formInput systemFields.grit.fields.current value=system.grit.current disabled=isPlayMode {{formInput
classes="character-hp"}} systemFields.grit.fields.current
value=system.grit.current
disabled=isPlayMode
classes="character-hp"
}}
<span class="name">{{localize "LETHALFANTASY.Label.earned"}}</span> <span class="name">{{localize "LETHALFANTASY.Label.earned"}}</span>
{{formInput systemFields.grit.fields.earned value=system.grit.earned disabled=isPlayMode {{formInput
classes="character-hp"}} systemFields.grit.fields.earned
value=system.grit.earned
disabled=isPlayMode
classes="character-hp"
}}
</div> </div>
<div class="flexrow character-hp"> <div class="flexrow character-hp">
<span class="name">{{localize "LETHALFANTASY.Label.luck"}}</span> <span class="name">{{localize "LETHALFANTASY.Label.luck"}}</span>
{{formInput systemFields.luck.fields.current value=system.luck.current disabled=isPlayMode {{formInput
classes="character-hp"}} systemFields.luck.fields.current
value=system.luck.current
disabled=isPlayMode
classes="character-hp"
}}
<span class="name">{{localize "LETHALFANTASY.Label.earned"}}</span> <span class="name">{{localize "LETHALFANTASY.Label.earned"}}</span>
{{formInput systemFields.luck.fields.earned value=system.luck.earned disabled=isPlayMode {{formInput
classes="character-hp"}} systemFields.luck.fields.earned
value=system.luck.earned
disabled=isPlayMode
classes="character-hp"
}}
</div> </div>
<div class="flexrow"> <div class="flexrow">
<span class="">{{localize "LETHALFANTASY.Label.damageResistanceShort"}}</span> <span class="" data-tooltip="Damage reduction">{{localize
{{formInput systemFields.hp.fields.damageResistance value=system.hp.fields.damageResistance "LETHALFANTASY.Label.damageResistanceShort"
disabled=isPlayMode classes="character-hp"}} }}
</div> </span>
<input
type="text"
class="character-damage-reduction"
data-tooltip="DR (armor+natural+magical)"
disabled
value={{damageReduction}}
/>
<input
type="text"
class="character-damage-reduction"
data-tooltip="DR (shield)"
disabled
value={{damageReductionShield}}
/>
</div>
</fieldset> </fieldset>
</div> </div>
<div class="character-right"> <div class="character-right">
<div class="character-name"> <div class="character-name">
{{formInput fields.name value=source.name rootId=partId disabled=isPlayMode}} {{formInput
<a class="control" data-action="toggleSheet" data-tooltip="LETHALFANTASY.ToggleSheet" fields.name
data-tooltip-direction="UP"> value=source.name
rootId=partId
disabled=isPlayMode
}}
<a
class="control"
data-action="toggleSheet"
data-tooltip="LETHALFANTASY.ToggleSheet"
data-tooltip-direction="UP"
>
<i class="fa-solid fa-user-{{ifThen isPlayMode 'lock' 'pen'}}"></i> <i class="fa-solid fa-user-{{ifThen isPlayMode 'lock' 'pen'}}"></i>
</a> </a>
</div> </div>
<fieldset class="character-characteristics character-characteristics-{{ifThen isPlayMode 'play' 'edit'}}"> <fieldset
class="character-characteristics character-characteristics-{{ifThen
isPlayMode
'play'
'edit'
}}"
>
<legend>{{localize "LETHALFANTASY.Label.Saves"}}</legend> <legend>{{localize "LETHALFANTASY.Label.Saves"}}</legend>
<div class="character-saves"> <div class="character-saves">
<div class="character-save"> <div class="character-save">
<span class="name"><a class="rollable" data-roll-type="save" data-roll-key="will"><i <span class="name"><a
class="lf-roll-small fa-solid fa-dice-d20"></i> class="rollable"
data-roll-type="save"
data-roll-key="will"
><i class="lf-roll-small fa-solid fa-dice-d20"></i>
{{localize "LETHALFANTASY.Label.saves.will"}} {{localize "LETHALFANTASY.Label.saves.will"}}
</a></span> </a></span>
{{formField systemFields.saves.fields.will.fields.value value=system.saves.will.value disabled=true}} {{formField
systemFields.saves.fields.will.fields.value
value=system.saves.will.value
disabled=true
}}
<span class="name"> <span class="name">
<a class="rollable" data-roll-type="save" data-roll-key="dodge"><i <a
class="lf-roll-small fa-solid fa-dice-d20"></i> class="rollable"
data-roll-type="save"
data-roll-key="dodge"
><i class="lf-roll-small fa-solid fa-dice-d20"></i>
{{localize "LETHALFANTASY.Label.saves.dodge"}} {{localize "LETHALFANTASY.Label.saves.dodge"}}
</a> </a>
</span> </span>
{{formField systemFields.saves.fields.dodge.fields.value value=system.saves.dodge.value {{formField
disabled=true}} systemFields.saves.fields.dodge.fields.value
value=system.saves.dodge.value
disabled=true
}}
<span class="name"> <span class="name">
<a class="rollable" data-roll-type="save" data-roll-key="toughness"><i <a
class="lf-roll-small fa-solid fa-dice-d20"></i> class="rollable"
data-roll-type="save"
data-roll-key="toughness"
><i class="lf-roll-small fa-solid fa-dice-d20"></i>
{{localize "LETHALFANTASY.Label.saves.toughness"}} {{localize "LETHALFANTASY.Label.saves.toughness"}}
</a> </a>
</span> </span>
{{formField systemFields.saves.fields.toughness.fields.value value=system.saves.toughness.value {{formField
disabled=true}} systemFields.saves.fields.toughness.fields.value
value=system.saves.toughness.value
disabled=true
}}
</div> </div>
<div class="character-save"> <div class="character-save">
<span class="name"> <span class="name">
<a class="rollable" data-roll-type="save" data-roll-key="contagion"><i <a
class="lf-roll-small fa-solid fa-dice-d20"></i> class="rollable"
data-roll-type="save"
data-roll-key="contagion"
><i class="lf-roll-small fa-solid fa-dice-d20"></i>
{{localize "LETHALFANTASY.Label.saves.contagion"}} {{localize "LETHALFANTASY.Label.saves.contagion"}}
</a> </a>
</span> </span>
{{formField systemFields.saves.fields.contagion.fields.value value=system.saves.contagion.value {{formField
disabled=true}} systemFields.saves.fields.contagion.fields.value
value=system.saves.contagion.value
disabled=true
}}
<span class="name"> <span class="name">
<a class="rollable" data-roll-type="save" data-roll-key="poison"><i <a
class="lf-roll-small fa-solid fa-dice-d20"></i> class="rollable"
data-roll-type="save"
data-roll-key="poison"
><i class="lf-roll-small fa-solid fa-dice-d20"></i>
{{localize "LETHALFANTASY.Label.saves.poison"}} {{localize "LETHALFANTASY.Label.saves.poison"}}
</a> </a>
</span> </span>
{{formField systemFields.saves.fields.poison.fields.value value=system.saves.poison.value {{formField
disabled=true }} systemFields.saves.fields.poison.fields.value
value=system.saves.poison.value
disabled=true
}}
<!-- <!--
<span class="name-pain"> <span class="name-pain">
@@ -125,51 +217,124 @@
</div> </div>
</fieldset> </fieldset>
<fieldset class="character-characteristics character-characteristics-{{ifThen isPlayMode 'play' 'edit'}}"> <fieldset
class="character-characteristics character-characteristics-{{ifThen
isPlayMode
'play'
'edit'
}}"
>
<legend>{{localize "LETHALFANTASY.Label.Challenges"}}</legend> <legend>{{localize "LETHALFANTASY.Label.Challenges"}}</legend>
<div class="character-challenges"> <div class="character-challenges">
<div class="character-challenge"> <div class="character-challenge">
<span class="name"><a class="rollable" data-roll-type="challenge" data-roll-key="str"><i <span class="name"><a
class="lf-roll-small fa-solid fa-dice-d20"></i>{{localize class="rollable"
"LETHALFANTASY.Label.challenges.strength"}}</a></span> data-roll-type="challenge"
{{formField systemFields.challenges.fields.str.fields.value value=system.challenges.str.value data-roll-key="str"
><i class="lf-roll-small fa-solid fa-dice-d20"></i>{{localize
"LETHALFANTASY.Label.challenges.strength"
}}</a></span>
{{formField
systemFields.challenges.fields.str.fields.value
value=system.challenges.str.value
disabled=true disabled=true
}} }}
<span class="name"><a class="rollable" data-roll-type="challenge" data-roll-key="agility"><i <span class="name"><a
class="lf-roll-small fa-solid fa-dice-d20"></i>{{localize class="rollable"
"LETHALFANTASY.Label.challenges.agility"}}</a></span> data-roll-type="challenge"
{{formField systemFields.challenges.fields.agility.fields.value value=system.challenges.agility.value data-roll-key="agility"
><i class="lf-roll-small fa-solid fa-dice-d20"></i>{{localize
"LETHALFANTASY.Label.challenges.agility"
}}</a></span>
{{formField
systemFields.challenges.fields.agility.fields.value
value=system.challenges.agility.value
disabled=true
}}
<span class="name"><a
class="rollable"
data-roll-type="challenge"
data-roll-key="dying"
><i class="lf-roll-small fa-solid fa-dice-d20"></i>{{localize
"LETHALFANTASY.Label.challenges.dying"
}}</a></span>
{{formField
systemFields.challenges.fields.dying.fields.value
value=system.challenges.dying.value
disabled=true disabled=true
}} }}
<span class="name"><a class="rollable" data-roll-type="challenge" data-roll-key="dying"><i
class="lf-roll-small fa-solid fa-dice-d20"></i>{{localize
"LETHALFANTASY.Label.challenges.dying"}}</a></span>
{{formField systemFields.challenges.fields.dying.fields.value value=system.challenges.dying.value
disabled=true }}
</div> </div>
</div> </div>
</fieldset> </fieldset>
<fieldset class="character-characteristics character-characteristics-{{ifThen isPlayMode 'play' 'edit'}}"> <fieldset
class="character-characteristics character-characteristics-{{ifThen
isPlayMode
'play'
'edit'
}}"
>
<legend>{{localize "LETHALFANTASY.Label.Movement"}}</legend> <legend>{{localize "LETHALFANTASY.Label.Movement"}}</legend>
<div class="character-movements"> <div class="character-movements">
<div class="character-movement"> <div class="character-movement">
<span class="name">{{localize "LETHALFANTASY.Label.movement.walk"}}</span> <span class="name">{{localize
{{formField systemFields.movement.fields.walk value=system.movement.walk disabled=isPlayMode}} "LETHALFANTASY.Label.movement.walk"
<span class="name">{{localize "LETHALFANTASY.Label.movement.jog"}}</span> }}</span>
{{formField systemFields.movement.fields.jog value=system.movement.jog disabled=isPlayMode}} {{formField
<span class="name">{{localize "LETHALFANTASY.Label.movement.run"}}</span> systemFields.movement.fields.walk
{{formField systemFields.movement.fields.run value=system.movement.run disabled=isPlayMode}} value=system.movement.walk
<span class="name">{{localize "LETHALFANTASY.Label.movement.sprint"}}</span> disabled=isPlayMode
{{formField systemFields.movement.fields.sprint value=system.movement.sprint disabled=isPlayMode}} }}
<span class="name">{{localize
"LETHALFANTASY.Label.movement.jog"
}}</span>
{{formField
systemFields.movement.fields.jog
value=system.movement.jog
disabled=isPlayMode
}}
<span class="name">{{localize
"LETHALFANTASY.Label.movement.run"
}}</span>
{{formField
systemFields.movement.fields.run
value=system.movement.run
disabled=isPlayMode
}}
<span class="name">{{localize
"LETHALFANTASY.Label.movement.sprint"
}}</span>
{{formField
systemFields.movement.fields.sprint
value=system.movement.sprint
disabled=isPlayMode
}}
</div> </div>
<div class="character-movement"> <div class="character-movement">
<span class="name">{{localize "LETHALFANTASY.Label.movement.jumpBroad"}}</span> <span class="name">{{localize
{{formField systemFields.jump.fields.broad value=system.jump.broad disabled=isPlayMode}} "LETHALFANTASY.Label.movement.jumpBroad"
<span class="name">{{localize "LETHALFANTASY.Label.movement.jumpRunning"}}</span> }}</span>
{{formField systemFields.jump.fields.running value=system.jump.running disabled=isPlayMode}} {{formField
<span class="name">{{localize "LETHALFANTASY.Label.movement.jumpVertical"}}</span> systemFields.jump.fields.broad
{{formField systemFields.jump.fields.vertical value=system.jump.vertical disabled=isPlayMode}} value=system.jump.broad
disabled=isPlayMode
}}
<span class="name">{{localize
"LETHALFANTASY.Label.movement.jumpRunning"
}}</span>
{{formField
systemFields.jump.fields.running
value=system.jump.running
disabled=isPlayMode
}}
<span class="name">{{localize
"LETHALFANTASY.Label.movement.jumpVertical"
}}</span>
{{formField
systemFields.jump.fields.vertical
value=system.jump.vertical
disabled=isPlayMode
}}
</div> </div>
</div> </div>
</fieldset> </fieldset>
@@ -178,62 +343,124 @@
</div> </div>
</fieldset> </fieldset>
<fieldset class="character-characteristics character-characteristics-{{ifThen isPlayMode 'play' 'edit'}}"> <fieldset
class="character-characteristics character-characteristics-{{ifThen
isPlayMode
'play'
'edit'
}}"
>
<legend>{{localize "LETHALFANTASY.Label.characteristics"}}</legend> <legend>{{localize "LETHALFANTASY.Label.characteristics"}}</legend>
<div class="character-characteristic"> <div class="character-characteristic">
<span>{{localize "LETHALFANTASY.Label.str"}}</span> <span>{{localize "LETHALFANTASY.Label.str"}}</span>
{{formField systemFields.characteristics.fields.str.fields.value value=system.characteristics.str.value {{formField
disabled=isPlayMode data-char-id="str" }} systemFields.characteristics.fields.str.fields.value
{{formField systemFields.characteristics.fields.str.fields.percent value=system.characteristics.str.percent value=system.characteristics.str.value
disabled=isPlayMode type="number"}} disabled=isPlayMode
data-char-id="str"
}}
{{formField
systemFields.characteristics.fields.str.fields.percent
value=system.characteristics.str.percent
disabled=isPlayMode
type="number"
}}
</div> </div>
<div class="character-characteristic"> <div class="character-characteristic">
<span>{{localize "LETHALFANTASY.Label.int"}}</span> <span>{{localize "LETHALFANTASY.Label.int"}}</span>
{{formField systemFields.characteristics.fields.int.fields.value value=system.characteristics.int.value {{formField
disabled=isPlayMode data-char-id="int" }} systemFields.characteristics.fields.int.fields.value
value=system.characteristics.int.value
disabled=isPlayMode
data-char-id="int"
}}
{{formField systemFields.characteristics.fields.int.fields.percent value=system.characteristics.int.percent {{formField
disabled=isPlayMode type="number" }} systemFields.characteristics.fields.int.fields.percent
value=system.characteristics.int.percent
disabled=isPlayMode
type="number"
}}
</div> </div>
<div class="character-characteristic"> <div class="character-characteristic">
<span>{{localize "LETHALFANTASY.Label.wis"}}</span> <span>{{localize "LETHALFANTASY.Label.wis"}}</span>
{{formField systemFields.characteristics.fields.wis.fields.value value=system.characteristics.wis.value {{formField
disabled=isPlayMode data-char-id="wis" }} systemFields.characteristics.fields.wis.fields.value
value=system.characteristics.wis.value
disabled=isPlayMode
data-char-id="wis"
}}
{{formField systemFields.characteristics.fields.wis.fields.percent value=system.characteristics.wis.percent {{formField
disabled=isPlayMode type="number"}} systemFields.characteristics.fields.wis.fields.percent
value=system.characteristics.wis.percent
disabled=isPlayMode
type="number"
}}
</div> </div>
<div class="character-characteristic"> <div class="character-characteristic">
<span>{{localize "LETHALFANTASY.Label.dex"}}</span> <span>{{localize "LETHALFANTASY.Label.dex"}}</span>
{{formField systemFields.characteristics.fields.dex.fields.value value=system.characteristics.dex.value {{formField
disabled=isPlayMode data-char-id="wis" }} systemFields.characteristics.fields.dex.fields.value
value=system.characteristics.dex.value
disabled=isPlayMode
data-char-id="wis"
}}
{{formField systemFields.characteristics.fields.dex.fields.percent value=system.characteristics.dex.percent {{formField
disabled=isPlayMode type="number" }} systemFields.characteristics.fields.dex.fields.percent
value=system.characteristics.dex.percent
disabled=isPlayMode
type="number"
}}
</div> </div>
<div class="character-characteristic"> <div class="character-characteristic">
<span>{{localize "LETHALFANTASY.Label.con"}}</span> <span>{{localize "LETHALFANTASY.Label.con"}}</span>
{{formField systemFields.characteristics.fields.con.fields.value value=system.characteristics.con.value {{formField
disabled=isPlayMode data-char-id="con" }} systemFields.characteristics.fields.con.fields.value
value=system.characteristics.con.value
disabled=isPlayMode
data-char-id="con"
}}
{{formField systemFields.characteristics.fields.con.fields.percent value=system.characteristics.con.percent {{formField
disabled=isPlayMode type="number"}} systemFields.characteristics.fields.con.fields.percent
value=system.characteristics.con.percent
disabled=isPlayMode
type="number"
}}
</div> </div>
<div class="character-characteristic"> <div class="character-characteristic">
<span>{{localize "LETHALFANTASY.Label.cha"}}</span> <span>{{localize "LETHALFANTASY.Label.cha"}}</span>
{{formField systemFields.characteristics.fields.cha.fields.value value=system.characteristics.cha.value {{formField
disabled=isPlayMode data-char-id="cha" }} systemFields.characteristics.fields.cha.fields.value
value=system.characteristics.cha.value
disabled=isPlayMode
data-char-id="cha"
}}
{{formField systemFields.characteristics.fields.cha.fields.percent value=system.characteristics.cha.percent {{formField
disabled=isPlayMode type="number"}} systemFields.characteristics.fields.cha.fields.percent
value=system.characteristics.cha.percent
disabled=isPlayMode
type="number"
}}
</div> </div>
<div class="character-characteristic"> <div class="character-characteristic">
<span>{{localize "LETHALFANTASY.Label.luc"}}</span> <span>{{localize "LETHALFANTASY.Label.luc"}}</span>
{{formField systemFields.characteristics.fields.luc.fields.value value=system.characteristics.luc.value {{formField
disabled=isPlayMode data-char-id="luc" }} systemFields.characteristics.fields.luc.fields.value
value=system.characteristics.luc.value
disabled=isPlayMode
data-char-id="luc"
}}
{{formField systemFields.characteristics.fields.luc.fields.percent value=system.characteristics.luc.percent {{formField
disabled=isPlayMode type="number"}} systemFields.characteristics.fields.luc.fields.percent
value=system.characteristics.luc.percent
disabled=isPlayMode
type="number"
}}
</div> </div>
</fieldset> </fieldset>

View File

@@ -1,15 +1,34 @@
<section class="tab character-{{tab.id}} {{tab.cssClass}}" data-tab="skills" data-group="sheet"> <section
class="tab character-{{tab.id}} {{tab.cssClass}}"
data-tab="skills"
data-group="sheet"
>
<div class="main-div"> <div class="main-div">
{{#each skillsByCategory as |categoryData|}}
<fieldset> <fieldset>
<legend data-tooltip="{{localize " LETHALFANTASY.Tooltip.skills"}}" data-tooltip-direction="UP">{{localize <legend
"LETHALFANTASY.Label.skills"}}</legend> data-tooltip="{{localize ' LETHALFANTASY.Tooltip.skills'}}"
data-tooltip-direction="UP"
>{{localize categoryData.label}}</legend>
<div class="skills"> <div class="skills">
{{#each skills as |item|}} {{#each categoryData.skills as |item|}}
<div class="skill " data-item-id="{{item.id}}" data-item-uuid="{{item.uuid}}"> <div
<img class="item-img" src="{{item.img}}" data-tooltip="{{item.name}}" /> class="skill"
data-item-id="{{item.id}}"
data-item-uuid="{{item.uuid}}"
>
<img
class="item-img"
src="{{item.img}}"
data-tooltip="{{item.name}}"
/>
<div class="name"> <div class="name">
<a class="rollable" data-roll-type="skill" data-roll-key="{{item.id}}"> <a
class="rollable"
data-roll-type="skill"
data-roll-key="{{item.id}}"
>
<i class="lf-roll-small fa-duotone fa-solid fa-dice-d10"></i> <i class="lf-roll-small fa-duotone fa-solid fa-dice-d10"></i>
{{item.name}} {{item.name}}
</a> </a>
@@ -18,31 +37,62 @@
+{{item.system.skillTotal}} +{{item.system.skillTotal}}
</div> </div>
<div class="controls"> <div class="controls">
<a data-tooltip="{{localize 'LETHALFANTASY.Edit'}}" data-action="edit" data-item-id="{{item.id}}" <a
data-item-uuid="{{item.uuid}}"><i class="fas fa-edit"></i></a> data-tooltip="{{localize 'LETHALFANTASY.Edit'}}"
<a data-tooltip="{{localize 'LETHALFANTASY.Delete'}}" data-action="delete" data-item-id="{{item.id}}" data-action="edit"
data-item-uuid="{{item.uuid}}"><i class="fas fa-trash"></i></a> data-item-id="{{item.id}}"
data-item-uuid="{{item.uuid}}"
><i class="fas fa-edit"></i></a>
<a
data-tooltip="{{localize 'LETHALFANTASY.Delete'}}"
data-action="delete"
data-item-id="{{item.id}}"
data-item-uuid="{{item.uuid}}"
><i class="fas fa-trash"></i></a>
</div> </div>
</div> </div>
{{/each}} {{/each}}
</div> </div>
</fieldset> </fieldset>
{{/each}}
<fieldset> <fieldset>
<legend data-tooltip="{{localize " LETHALFANTASY.Tooltip.gifts"}}" data-tooltip-direction="UP">{{localize <legend
"LETHALFANTASY.Label.gifts"}}</legend> data-tooltip="{{localize ' LETHALFANTASY.Tooltip.gifts'}}"
data-tooltip-direction="UP"
>{{localize "LETHALFANTASY.Label.gifts"}}</legend>
<div class="gifts"> <div class="gifts">
{{#each gifts as |item|}} {{#each gifts as |item|}}
<div class="gift " data-item-id="{{item.id}}" data-item-uuid="{{item.uuid}}"> <div
<img class="item-img" src="{{item.img}}" data-tooltip="{{item.name}}" /> class="gift"
<div class="name" data-tooltip="{{{item.description}}}<br><br>{{item.path}}" data-tooltip-direction="UP"> data-item-id="{{item.id}}"
data-item-uuid="{{item.uuid}}"
>
<img
class="item-img"
src="{{item.img}}"
data-tooltip="{{item.name}}"
/>
<div
class="name"
data-tooltip="{{{item.description}}}<br><br>{{item.path}}"
data-tooltip-direction="UP"
>
{{item.name}} {{item.name}}
</div> </div>
<div class="controls"> <div class="controls">
<a data-tooltip="{{localize 'LETHALFANTASY.Edit'}}" data-action="edit" data-item-id="{{item.id}}" <a
data-item-uuid="{{item.uuid}}"><i class="fas fa-edit"></i></a> data-tooltip="{{localize 'LETHALFANTASY.Edit'}}"
<a data-tooltip="{{localize 'LETHALFANTASY.Delete'}}" data-action="delete" data-item-id="{{item.id}}" data-action="edit"
data-item-uuid="{{item.uuid}}"><i class="fas fa-trash"></i></a> data-item-id="{{item.id}}"
data-item-uuid="{{item.uuid}}"
><i class="fas fa-edit"></i></a>
<a
data-tooltip="{{localize 'LETHALFANTASY.Delete'}}"
data-action="delete"
data-item-id="{{item.id}}"
data-item-uuid="{{item.uuid}}"
><i class="fas fa-trash"></i></a>
</div> </div>
</div> </div>
{{/each}} {{/each}}
@@ -50,20 +100,42 @@
</fieldset> </fieldset>
<fieldset> <fieldset>
<legend data-tooltip="{{localize " LETHALFANTASY.Tooltip.vulnerabilities"}}" data-tooltip-direction="UP">{{localize <legend
"LETHALFANTASY.Label.vulnerabilities"}}</legend> data-tooltip="{{localize ' LETHALFANTASY.Tooltip.vulnerabilities'}}"
data-tooltip-direction="UP"
>{{localize "LETHALFANTASY.Label.vulnerabilities"}}</legend>
<div class="vulnerabilities"> <div class="vulnerabilities">
{{#each vulnerabilities as |item|}} {{#each vulnerabilities as |item|}}
<div class="vulnerability " data-item-id="{{item.id}}" data-item-uuid="{{item.uuid}}"> <div
<img class="item-img" src="{{item.img}}" data-tooltip="{{item.name}}" /> class="vulnerability"
<div class="name" data-tooltip="{{{item.description}}}<br><br>{{item.path}}" data-tooltip-direction="UP"> data-item-id="{{item.id}}"
data-item-uuid="{{item.uuid}}"
>
<img
class="item-img"
src="{{item.img}}"
data-tooltip="{{item.name}}"
/>
<div
class="name"
data-tooltip="{{{item.description}}}<br><br>{{item.path}}"
data-tooltip-direction="UP"
>
{{item.name}} {{item.name}}
</div> </div>
<div class="controls"> <div class="controls">
<a data-tooltip="{{localize 'LETHALFANTASY.Edit'}}" data-action="edit" data-item-id="{{item.id}}" <a
data-item-uuid="{{item.uuid}}"><i class="fas fa-edit"></i></a> data-tooltip="{{localize 'LETHALFANTASY.Edit'}}"
<a data-tooltip="{{localize 'LETHALFANTASY.Delete'}}" data-action="delete" data-item-id="{{item.id}}" data-action="edit"
data-item-uuid="{{item.uuid}}"><i class="fas fa-trash"></i></a> data-item-id="{{item.id}}"
data-item-uuid="{{item.uuid}}"
><i class="fas fa-edit"></i></a>
<a
data-tooltip="{{localize 'LETHALFANTASY.Delete'}}"
data-action="delete"
data-item-id="{{item.id}}"
data-item-uuid="{{item.uuid}}"
><i class="fas fa-trash"></i></a>
</div> </div>
</div> </div>
{{/each}} {{/each}}

View File

@@ -1,4 +1,5 @@
{{!log 'chat-message' this}} {{!log 'chat-message' this}}
{{!log 'weaponDamageOptions' weaponDamageOptions}}
<div class="{{cssClass}}"> <div class="{{cssClass}}">
<div class="intro-chat"> <div class="intro-chat">
<div class="intro-img"> <div class="intro-img">
@@ -22,13 +23,29 @@
<span><strong>Disfavor roll</strong></span> <span><strong>Disfavor roll</strong></span>
{{/if}} {{/if}}
{{#if badResult}} {{#if badResult}}
<span><strong>{{localize "LETHALFANTASY.Label.otherResult"}}</strong> : {{badResult}}</span> <span><strong>{{localize "LETHALFANTASY.Label.otherResult"}}</strong>
:
{{badResult}}</span>
{{/if}} {{/if}}
{{#if rollTarget.weapon}} {{#if rollTarget.weapon}}
<span>{{rollTarget.weapon.name}}</span> <span>{{rollTarget.weapon.name}}</span>
{{/if}} {{/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}} {{#if rollData.letItFly}}
<span>Let It Fly attack ! </span> <span>Let It Fly attack ! </span>
{{/if}} {{/if}}
@@ -50,26 +67,38 @@
{{#if isSave}} {{#if isSave}}
<div class="result"> <div class="result">
{{#if (eq resultType "success")}} {{#if (eq resultType "success")}}
{{#if isPrivate}}?{{else}}{{localize "LETHALFANTASY.Roll.success"}}{{/if}} {{#if isPrivate}}?{{else}}{{localize
"LETHALFANTASY.Roll.success"
}}{{/if}}
{{else}} {{else}}
{{#if isPrivate}}?{{else}}{{localize "LETHALFANTASY.Roll.failure"}}{{/if}} {{#if isPrivate}}?{{else}}{{localize
"LETHALFANTASY.Roll.failure"
}}{{/if}}
{{/if}} {{/if}}
</div> </div>
{{/if}} {{/if}}
{{#if isResource}} {{#if isResource}}
<div class="result"> <div class="result">
{{#if (eq resultType "success")}} {{#if (eq resultType "success")}}
{{#if isPrivate}}?{{else}}{{localize "LETHALFANTASY.Roll.success"}}{{/if}} {{#if isPrivate}}?{{else}}{{localize
"LETHALFANTASY.Roll.success"
}}{{/if}}
{{else}} {{else}}
{{#if isPrivate}}?{{else}}{{localize "LETHALFANTASY.Roll.failure"}}{{#if isFailure}} ({{localize {{#if isPrivate}}?{{else}}{{localize "LETHALFANTASY.Roll.failure"}}{{#if
"LETHALFANTASY.Roll.resourceLost"}}){{/if}}{{/if}} isFailure
}} ({{localize "LETHALFANTASY.Roll.resourceLost"}}){{/if}}{{/if}}
{{/if}} {{/if}}
</div> </div>
{{/if}} {{/if}}
{{#if isDamage}} {{#if isDamage}}
<div> <div>
{{#if (and isGM hasTarget)}} {{#if (and isGM hasTarget)}}
{{{localize "LETHALFANTASY.Roll.displayArmor" targetName=targetName targetArmor=targetArmor realDamage=realDamage}}} {{{localize
"LETHALFANTASY.Roll.displayArmor"
targetName=targetName
targetArmor=targetArmor
realDamage=realDamage
}}}
{{/if}} {{/if}}
</div> </div>
{{/if}} {{/if}}
@@ -85,4 +114,80 @@
{{/if}} {{/if}}
{{/unless}} {{/unless}}
{{#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}}
{{#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>
{{/if}}
{{/if}}
</div>
</div>
{{/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}}
</div> </div>

View File

@@ -6,80 +6,175 @@
<div class="monster-pc monster-pc-{{ifThen isPlayMode 'play' 'edit'}}"> <div class="monster-pc monster-pc-{{ifThen isPlayMode 'play' 'edit'}}">
<div class="monster-left"> <div class="monster-left">
<div class="monster-left-image"> <div class="monster-left-image">
<img class="monster-img" src="{{actor.img}}" data-edit="img" data-action="editImage" <img
data-tooltip="{{actor.name}}" /> class="monster-img"
src="{{actor.img}}"
data-edit="img"
data-action="editImage"
data-tooltip="{{actor.name}}"
/>
</div> </div>
<fieldset class="monster-characteristics monster-characteristics-{{ifThen isPlayMode 'play' 'edit'}}"> <fieldset
class="monster-characteristics monster-characteristics-{{ifThen
isPlayMode
'play'
'edit'
}}"
>
<div class="flexrow monster-hp"> <div class="flexrow monster-hp">
<span class="name">{{localize "LETHALFANTASY.Label.HP"}}</span> <span class="name">{{localize "LETHALFANTASY.Label.HP"}}</span>
{{formInput systemFields.hp.fields.value value=system.hp.value disabled=isPlayMode {{formInput
classes="monster-hp-value"}} systemFields.hp.fields.value
value=system.hp.value
disabled=isPlayMode
classes="monster-hp-value"
}}
&nbsp;/&nbsp; &nbsp;/&nbsp;
{{formInput systemFields.hp.fields.max value=system.hp.max disabled=isPlayMode classes="monster-hp-value"}} {{formInput
systemFields.hp.fields.max
value=system.hp.max
disabled=isPlayMode
classes="monster-hp-value"
}}
</div> </div>
<div class="flexrow monster-hp"> <div class="flexrow monster-hp">
<span class="damage-resistance">{{localize "LETHALFANTASY.Label.damageResistance"}}</span> <span class="name">{{localize
{{formInput systemFields.hp.fields.damageResistance value=system.hp.damageResistance disabled=isPlayMode "LETHALFANTASY.Label.damageResistance"
classes="monster-hp-value"}} }}</span>
{{formInput
systemFields.hp.fields.damageResistance
value=system.hp.damageResistance
disabled=isPlayMode
classes="monster-hp-value"
}}
<span class="name">{{localize
"LETHALFANTASY.Label.shieldDamageReduction"
}}</span>
{{formInput
systemFields.combat.fields.shieldDamageReduction
value=system.combat.shieldDamageReduction
disabled=isPlayMode
classes="monster-hp-value"
}}
</div>
<div class="flexrow monster-hp">
<span class="name"><a
class="rollable"
data-roll-type="shield-defense"
data-roll-dice={{system.combat.shieldDefenseDice}}
><i class="lf-roll-small fa-solid fa-dice-d20"></i>{{localize
"LETHALFANTASY.Label.shieldDefenseDice"
}}</a></span>
{{formInput
systemFields.combat.fields.shieldDefenseDice
value=system.combat.shieldDefenseDice
disabled=isPlayMode
classes="monster-hp-value"
}}
</div> </div>
</fieldset> </fieldset>
</div> </div>
<div class="monster-right"> <div class="monster-right">
<div class="monster-name"> <div class="monster-name">
{{formInput fields.name value=source.name rootId=partId disabled=isPlayMode}} {{formInput
<a class="control" data-action="toggleSheet" data-tooltip="LETHALFANTASY.ToggleSheet" fields.name
data-tooltip-direction="UP"> value=source.name
rootId=partId
disabled=isPlayMode
}}
<a
class="control"
data-action="toggleSheet"
data-tooltip="LETHALFANTASY.ToggleSheet"
data-tooltip-direction="UP"
>
<i class="fa-solid fa-user-{{ifThen isPlayMode 'lock' 'pen'}}"></i> <i class="fa-solid fa-user-{{ifThen isPlayMode 'lock' 'pen'}}"></i>
</a> </a>
</div> </div>
<fieldset class="monster-characteristics monster-characteristics-{{ifThen isPlayMode 'play' 'edit'}}"> <fieldset
class="monster-characteristics monster-characteristics-{{ifThen
isPlayMode
'play'
'edit'
}}"
>
<legend>{{localize "LETHALFANTASY.Label.Saves"}}</legend> <legend>{{localize "LETHALFANTASY.Label.Saves"}}</legend>
<div class="monster-saves"> <div class="monster-saves">
<div class="monster-save"> <div class="monster-save">
<span class="name"><a class="rollable" data-roll-type="save" data-roll-key="will"><i <span class="name"><a
class="lf-roll-small fa-solid fa-dice-d20"></i> class="rollable"
data-roll-type="save"
data-roll-key="will"
><i class="lf-roll-small fa-solid fa-dice-d20"></i>
{{localize "LETHALFANTASY.Label.saves.will"}} {{localize "LETHALFANTASY.Label.saves.will"}}
</a></span> </a></span>
{{formField systemFields.saves.fields.will.fields.value value=system.saves.will.value disabled=isPlayMode {{formField
systemFields.saves.fields.will.fields.value
value=system.saves.will.value
disabled=isPlayMode
}} }}
<span class="name"> <span class="name">
<a class="rollable" data-roll-type="save" data-roll-key="dodge"><i <a
class="lf-roll-small fa-solid fa-dice-d20"></i> class="rollable"
data-roll-type="save"
data-roll-key="dodge"
><i class="lf-roll-small fa-solid fa-dice-d20"></i>
{{localize "LETHALFANTASY.Label.saves.dodge"}} {{localize "LETHALFANTASY.Label.saves.dodge"}}
</a> </a>
</span> </span>
{{formField systemFields.saves.fields.dodge.fields.value value=system.saves.dodge.value {{formField
disabled=isPlayMode}} systemFields.saves.fields.dodge.fields.value
value=system.saves.dodge.value
disabled=isPlayMode
}}
<span class="name"> <span class="name">
<a class="rollable" data-roll-type="save" data-roll-key="toughness"><i <a
class="lf-roll-small fa-solid fa-dice-d20"></i> class="rollable"
data-roll-type="save"
data-roll-key="toughness"
><i class="lf-roll-small fa-solid fa-dice-d20"></i>
{{localize "LETHALFANTASY.Label.saves.toughness"}} {{localize "LETHALFANTASY.Label.saves.toughness"}}
</a> </a>
</span> </span>
{{formField systemFields.saves.fields.toughness.fields.value value=system.saves.toughness.value {{formField
disabled=isPlayMode}} systemFields.saves.fields.toughness.fields.value
value=system.saves.toughness.value
disabled=isPlayMode
}}
</div> </div>
<div class="monster-save"> <div class="monster-save">
<span class="name"> <span class="name">
<a class="rollable" data-roll-type="save" data-roll-key="contagion"><i <a
class="lf-roll-small fa-solid fa-dice-d20"></i> class="rollable"
data-roll-type="save"
data-roll-key="contagion"
><i class="lf-roll-small fa-solid fa-dice-d20"></i>
{{localize "LETHALFANTASY.Label.saves.contagion"}} {{localize "LETHALFANTASY.Label.saves.contagion"}}
</a> </a>
</span> </span>
{{formField systemFields.saves.fields.contagion.fields.value value=system.saves.contagion.value {{formField
disabled=isPlayMode}} systemFields.saves.fields.contagion.fields.value
value=system.saves.contagion.value
disabled=isPlayMode
}}
<span class="name"> <span class="name">
<a class="rollable" data-roll-type="save" data-roll-key="poison"><i <a
class="lf-roll-small fa-solid fa-dice-d20"></i> class="rollable"
data-roll-type="save"
data-roll-key="poison"
><i class="lf-roll-small fa-solid fa-dice-d20"></i>
{{localize "LETHALFANTASY.Label.saves.poison"}} {{localize "LETHALFANTASY.Label.saves.poison"}}
</a> </a>
</span> </span>
{{formField systemFields.saves.fields.poison.fields.value value=system.saves.poison.value {{formField
disabled=isPlayMode }} systemFields.saves.fields.poison.fields.value
value=system.saves.poison.value
disabled=isPlayMode
}}
<!-- <span class="name"> <!-- <span class="name">
<a class="rollable" data-roll-type="save" data-roll-key="paincourage" data-roll-dice="D20" data-tooltip="Pain/Courage check on wound of..."><i <a class="rollable" data-roll-type="save" data-roll-key="paincourage" data-roll-dice="D20" data-tooltip="Pain/Courage check on wound of..."><i
@@ -98,61 +193,81 @@
</div> </div>
</fieldset> </fieldset>
<fieldset class="monster-characteristics monster-characteristics-{{ifThen isPlayMode 'play' 'edit'}}"> <fieldset
class="monster-characteristics monster-characteristics-{{ifThen
isPlayMode
'play'
'edit'
}}"
>
<legend>{{localize "LETHALFANTASY.Label.skills"}}</legend> <legend>{{localize "LETHALFANTASY.Label.skills"}}</legend>
<div class="monster-skills"> <div class="monster-skills">
<div class="monster-skill"> <div class="monster-skill">
<span class="name"><a class="rollable" data-roll-type="monster-skill" data-roll-key="resistTorture"><i <span class="name"><a
class="lf-roll-small fa-solid fa-dice-d20"></i>{{localize class="rollable"
"LETHALFANTASY.Label.resistTorture"}}</a></span> data-roll-type="monster-skill"
{{formField systemFields.resists.fields.resistTorture.fields.value data-roll-key="resistTorture"
><i class="lf-roll-small fa-solid fa-dice-d20"></i>{{localize
"LETHALFANTASY.Label.resistTorture"
}}</a></span>
{{formField
systemFields.resists.fields.resistTorture.fields.value
value=system.resists.resistTorture.value value=system.resists.resistTorture.value
disabled=isPlayMode disabled=isPlayMode
}} }}
<span class="name"><a class="rollable" data-roll-type="monster-skill" data-roll-key="resistPerformance"><i <span class="name"><a
class="lf-roll-small fa-solid fa-dice-d20"></i>{{localize class="rollable"
"LETHALFANTASY.Label.resistPerformance"}}</a></span> data-roll-type="monster-skill"
{{formField systemFields.resists.fields.resistPerformance.fields.value data-roll-key="resistPerformance"
><i class="lf-roll-small fa-solid fa-dice-d20"></i>{{localize
"LETHALFANTASY.Label.resistPerformance"
}}</a></span>
{{formField
systemFields.resists.fields.resistPerformance.fields.value
value=system.resists.resistPerformance.value value=system.resists.resistPerformance.value
disabled=isPlayMode disabled=isPlayMode
}} }}
<span class="name"><a class="rollable" data-roll-type="monster-skill" <span class="name"><a
data-roll-key="resistIntimidation"><i class="lf-roll-small fa-solid fa-dice-d20"></i>{{localize class="rollable"
"LETHALFANTASY.Label.resistIntimidation"}}</a></span> data-roll-type="monster-skill"
{{formField systemFields.resists.fields.resistIntimidation.fields.value data-roll-key="resistIntimidation"
><i class="lf-roll-small fa-solid fa-dice-d20"></i>{{localize
"LETHALFANTASY.Label.resistIntimidation"
}}</a></span>
{{formField
systemFields.resists.fields.resistIntimidation.fields.value
value=system.resists.resistIntimidation.value value=system.resists.resistIntimidation.value
disabled=isPlayMode }} disabled=isPlayMode
}}
<span class="name"><a class="rollable" data-roll-type="monster-skill" data-roll-key="perception"><i
class="lf-roll-small fa-solid fa-dice-d20"></i>{{localize
"LETHALFANTASY.Label.perception"}}</a></span>
{{formField systemFields.resists.fields.perception.fields.value value=system.resists.perception.value
disabled=isPlayMode }}
<span class="name"><a class="rollable" data-roll-type="monster-skill" data-roll-key="stealth"><i
class="lf-roll-small fa-solid fa-dice-d20"></i>{{localize
"LETHALFANTASY.Label.stealth"}}</a></span>
{{formField systemFields.resists.fields.stealth.fields.value value=system.resists.stealth.value
disabled=isPlayMode }}
</div> </div>
</div> <div class="monster-skill">
</fieldset> <span class="name"><a
class="rollable"
data-roll-type="monster-skill"
data-roll-key="perception"
><i class="lf-roll-small fa-solid fa-dice-d20"></i>{{localize
"LETHALFANTASY.Label.perception"
}}</a></span>
{{formField
systemFields.resists.fields.perception.fields.value
value=system.resists.perception.value
disabled=isPlayMode
}}
<span class="name"><a
<fieldset class="monster-characteristics monster-characteristics-{{ifThen isPlayMode 'play' 'edit'}}"> class="rollable"
<legend>{{localize "LETHALFANTASY.Label.Movement"}}</legend> data-roll-type="monster-skill"
<div class="monster-movements"> data-roll-key="stealth"
<div class="monster-movement"> ><i class="lf-roll-small fa-solid fa-dice-d20"></i>{{localize
<span class="name">{{localize "LETHALFANTASY.Label.movement.walk"}}</span> "LETHALFANTASY.Label.stealth"
{{formField systemFields.movement.fields.walk value=system.movement.walk disabled=isPlayMode}} }}</a></span>
<span class="name">{{localize "LETHALFANTASY.Label.movement.jog"}}</span> {{formField
{{formField systemFields.movement.fields.jog value=system.challenges.movement.jog disabled=isPlayMode}} systemFields.resists.fields.stealth.fields.value
<span class="name">{{localize "LETHALFANTASY.Label.movement.run"}}</span> value=system.resists.stealth.value
{{formField systemFields.movement.fields.run value=system.movement.run disabled=isPlayMode}} disabled=isPlayMode
<span class="name">{{localize "LETHALFANTASY.Label.movement.sprint"}}</span> }}
{{formField systemFields.movement.fields.sprint value=system.movement.sprint disabled=isPlayMode}}
</div> </div>
</div> </div>
</fieldset> </fieldset>
@@ -160,23 +275,91 @@
</div> </div>
</fieldset> </fieldset>
<fieldset class="monster-characteristics monster-characteristics-{{ifThen isPlayMode 'play' 'edit'}}"> <fieldset
class="monster-characteristics monster-characteristics-{{ifThen
isPlayMode
'play'
'edit'
}}"
>
<legend>{{localize "LETHALFANTASY.Label.characteristics"}}</legend> <legend>{{localize "LETHALFANTASY.Label.characteristics"}}</legend>
<div class="monster-characteristic"> <div class="monster-characteristic">
<span>{{localize "LETHALFANTASY.Label.int"}}</span> <span>{{localize "LETHALFANTASY.Label.int"}}</span>
{{formField systemFields.characteristics.fields.int.fields.value value=system.characteristics.int.value {{formField
disabled=isPlayMode data-char-id="int" }} systemFields.characteristics.fields.int.fields.value
value=system.characteristics.int.value
disabled=isPlayMode
data-char-id="int"
}}
{{formField systemFields.characteristics.fields.int.fields.percent value=system.characteristics.int.percent {{formField
disabled=isPlayMode type="number" }} systemFields.characteristics.fields.int.fields.percent
value=system.characteristics.int.percent
disabled=isPlayMode
type="number"
}}
</div> </div>
<div class="monster-characteristic"> <div class="monster-characteristic">
<span>{{localize "LETHALFANTASY.Label.dex"}}</span> <span>{{localize "LETHALFANTASY.Label.dex"}}</span>
{{formField systemFields.characteristics.fields.dex.fields.value value=system.characteristics.dex.value {{formField
disabled=isPlayMode data-char-id="wis" }} systemFields.characteristics.fields.dex.fields.value
value=system.characteristics.dex.value
disabled=isPlayMode
data-char-id="wis"
}}
{{formField systemFields.characteristics.fields.dex.fields.percent value=system.characteristics.dex.percent {{formField
disabled=isPlayMode type="number" }} systemFields.characteristics.fields.dex.fields.percent
value=system.characteristics.dex.percent
disabled=isPlayMode
type="number"
}}
</div>
<legend>{{localize "LETHALFANTASY.Label.Movement"}}</legend>
<div class="monster-movements">
<div class="monster-movement">
<div class="flexrow monster-hp">
<span class="name">{{localize
"LETHALFANTASY.Label.movement.walk"
}}</span>
{{formField
systemFields.movement.fields.walk
value=system.movement.walk
disabled=isPlayMode
}}
</div>
<div class="flexrow monster-hp">
<span class="name">{{localize
"LETHALFANTASY.Label.movement.jog"
}}</span>
{{formField
systemFields.movement.fields.jog
value=system.movement.jog
disabled=isPlayMode
}}
</div>
<div class="flexrow monster-hp">
<span class="name">{{localize
"LETHALFANTASY.Label.movement.run"
}}</span>
{{formField
systemFields.movement.fields.run
value=system.movement.run
disabled=isPlayMode
}}
</div>
<div class="flexrow monster-hp">
<span class="name">{{localize
"LETHALFANTASY.Label.movement.sprint"
}}</span>
{{formField
systemFields.movement.fields.sprint
value=system.movement.sprint
disabled=isPlayMode
}}
</div>
</div>
</div> </div>
</fieldset> </fieldset>

View File

@@ -1,12 +1,17 @@
<div class="lethalfantasy-roll-dialog"> <div class="lethalfantasy-roll-dialog">
<fieldSet class=""> <fieldSet class="">
<legend>{{localize (concat "LETHALFANTASY.Label." rollType)}} - {{actorName}}</legend> <legend>{{localize (concat "LETHALFANTASY.Label." rollType)}}
-
{{actorName}}</legend>
{{#if rollTarget.tokenId}} {{#if rollTarget.tokenId}}
<div class="dialog-save"> <div class="dialog-save">
<a class="goto-token-button" data-action="gotoToken" data-token-id="{{rollTarget.tokenId}}">{{localize <a
"LETHALFANTASY.Label.gotoToken"}} </a> class="goto-token-button"
data-action="gotoToken"
data-token-id="{{rollTarget.tokenId}}"
>{{localize "LETHALFANTASY.Label.gotoToken"}} </a>
</div> </div>
{{/if}} {{/if}}
@@ -18,32 +23,60 @@
{{/if}} {{/if}}
{{#if hasModifier}} {{#if hasModifier}}
<div class="dialog-save">{{upperFirst rollName}} : {{baseFormula}} + {{baseValue}}</div> <div class="dialog-save">{{upperFirst rollName}}
:
{{baseFormula}}
+
{{baseValue}}</div>
{{else}} {{else}}
<div class="dialog-save">{{upperFirst rollName}} : {{baseFormula}}</div> <div class="dialog-save">{{upperFirst rollName}} : {{baseFormula}}</div>
{{/if}} {{/if}}
{{#if rollTarget.weapon}} {{#if rollTarget.weapon}}
<div class="dialog-save">{{localize "LETHALFANTASY.Label.baseModifier"}} : {{rollTarget.charModifier}}</div> <div class="dialog-save">{{localize "LETHALFANTASY.Label.baseModifier"}}
<div class="dialog-save">{{localize "LETHALFANTASY.Label.weapon"}} : {{rollTarget.weapon.name}}</div> :
<div class="dialog-save">{{localize "LETHALFANTASY.Label.skill"}} : {{rollTarget.name}}</div> {{rollTarget.charModifier}}</div>
<div class="dialog-save">{{localize "LETHALFANTASY.Label.skillBonus"}} : {{rollTarget.weaponSkillModifier}}</div> {{#if (match rollType "defense")}}
<div class="dialog-save">Armor defense modifier :
{{rollTarget.armorDefense}}</div>
{{/if}}
<div class="dialog-save">{{localize "LETHALFANTASY.Label.weapon"}}
:
{{rollTarget.weapon.name}}</div>
<div class="dialog-save">{{localize "LETHALFANTASY.Label.skill"}}
:
{{rollTarget.name}}</div>
<div class="dialog-save">{{localize "LETHALFANTASY.Label.skillBonus"}}
:
{{rollTarget.weaponSkillModifier}}</div>
{{/if}} {{/if}}
{{#if (match rollType "attack")}} {{#if (match rollType "attack")}}
<div class="dialog-save">Add Granted Attack Dice <div class="dialog-save">Add Granted Attack Dice
<input type="checkbox" data-action="selectGranted" name="granted"> <input type="checkbox" data-action="selectGranted" name="granted" />
</div> </div>
{{#if rollTarget.weapon}} {{#if rollTarget.weapon}}
{{#if (eq rollTarget.weapon.system.weaponType "melee")}} {{#if (eq rollTarget.weapon.system.weaponType "melee")}}{{else}}
{{else}}
<div class="dialog-save">Point Blank Range Attack <div class="dialog-save">Point Blank Range Attack
<input type="checkbox" data-action="selectPointBlank" name="pointBlankV"> <input
type="checkbox"
data-action="selectPointBlank"
name="pointBlankV"
/>
</div> </div>
<div class="dialog-save">Beyond Skill Range Attack <div class="dialog-save">Beyond Skill Range Attack
<input type="checkbox" data-action="selectBeyondSkill" name="beyondSkillV"> <input
type="checkbox"
data-action="selectBeyondSkill"
name="beyondSkillV"
/>
</div> </div>
<div class="dialog-save">Let it Fly (Pure D20E) <div class="dialog-save">Let it Fly (Pure D20E)
<input type="checkbox" data-action="selectLetItFly" name="letItFlyV"> <input
type="checkbox"
data-action="selectLetItFly"
name="letItFlyV"
/>
</div> </div>
<div class="dialog-save">Aiming <div class="dialog-save">Aiming
<select name="attackerAim" data-tooltip-direction="UP"> <select name="attackerAim" data-tooltip-direction="UP">
@@ -56,12 +89,12 @@
{{/if}} {{/if}}
{{#if (match rollType "defense")}} {{#if (match rollType "defense")}}
<div class="dialog-save">Add Granted Defense Dice <div class="dialog-save">Add Granted Defense Dice
<input type="checkbox" data-action="selectGranted" name="granted"> <input type="checkbox" data-action="selectGranted" name="granted" />
</div> </div>
{{/if}} {{/if}}
{{#if (match rollType "damage")}} {{#if (match rollType "damage")}}
<div class="dialog-save">Add Granted Damage Dice <div class="dialog-save">Add Granted Damage Dice
<input type="checkbox" data-action="selectGranted" name="granted"> <input type="checkbox" data-action="selectGranted" name="granted" />
</div> </div>
{{/if}} {{/if}}
@@ -71,7 +104,6 @@
</fieldSet> </fieldSet>
{{#if hasFavor}} {{#if hasFavor}}
<fieldSet class="dialog-favor"> <fieldSet class="dialog-favor">
<legend>{{localize "LETHALFANTASY.Roll.favorDisfavor"}}</legend> <legend>{{localize "LETHALFANTASY.Roll.favorDisfavor"}}</legend>
@@ -91,8 +123,13 @@
{{#if (eq rollType "save")}} {{#if (eq rollType "save")}}
{{#if rollTarget.magicUser}} {{#if rollTarget.magicUser}}
<div> <div>
<span>Save against spell (+{{rollTarget.actorModifiers.saveModifier}}) ?</span> <span>Save against spell (+{{rollTarget.actorModifiers.saveModifier}})
<input type="checkbox" name="saveSpellCheck" data-action="saveSpellCheck"> ?</span>
<input
type="checkbox"
name="saveSpellCheck"
data-action="saveSpellCheck"
/>
</div> </div>
{{/if}} {{/if}}
{{/if}} {{/if}}
@@ -115,5 +152,4 @@
</select> </select>
</fieldSet> </fieldSet>
</div> </div>

View File

@@ -1,6 +1,12 @@
<section> <section>
<div class="header"> <div class="header">
<img class="item-img" src="{{item.img}}" data-edit="img" data-action="editImage" data-tooltip="{{item.name}}" /> <img
class="item-img"
src="{{item.img}}"
data-edit="img"
data-action="editImage"
data-tooltip="{{item.name}}"
/>
{{formInput fields.name value=source.name}} {{formInput fields.name value=source.name}}
</div> </div>
@@ -8,6 +14,8 @@
<div class="align-top"> <div class="align-top">
{{formField systemFields.defense value=system.defense}} {{formField systemFields.defense value=system.defense}}
{{formField systemFields.damageReduction value=system.damageReduction}}
<div class="shift-right">&nbsp; <div class="shift-right">&nbsp;
</div> </div>
@@ -17,12 +25,19 @@
<label>Cover vs ranged attacks</label> <label>Cover vs ranged attacks</label>
<div class="shift-right"> <div class="shift-right">
<label>Standing </label> <label>Standing </label>
<div class="flexrow">{{formField systemFields.standing.fields.min value=system.standing.min}} &nbsp;...&nbsp;30 <div class="flexrow">{{formField
systemFields.standing.fields.min
value=system.standing.min
}}
&nbsp;...&nbsp;30
</div> </div>
</div> </div>
<div class="shift-right"> <div class="shift-right">
<label>Crouching</label> <label>Crouching</label>
<div class="flexrow">{{formField systemFields.crouching.fields.min value=system.crouching.min}} <div class="flexrow">{{formField
systemFields.crouching.fields.min
value=system.crouching.min
}}
&nbsp;...&nbsp;30</div> &nbsp;...&nbsp;30</div>
</div> </div>
{{/if}} {{/if}}
@@ -53,7 +68,6 @@
</div> </div>
</div> </div>
<fieldset> <fieldset>
<legend>{{localize "LETHALFANTASY.Label.description"}}</legend> <legend>{{localize "LETHALFANTASY.Label.description"}}</legend>
{{formInput {{formInput