Various enhancements + fixes

This commit is contained in:
2025-01-09 20:21:02 +01:00
parent b3a7f7380b
commit 3dcfc30fb6
38 changed files with 732 additions and 603 deletions

View File

@@ -490,6 +490,16 @@ i.lethalfantasy {
font-size: calc(var(--font-size-standard) * 1.4); font-size: calc(var(--font-size-standard) * 1.4);
padding-left: 5px; padding-left: 5px;
} }
.lethalfantasy .tab.character-weapons .combat-details {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 10px;
}
.lethalfantasy .tab.character-weapons .combat-details .combat-detail {
display: flex;
align-items: center;
gap: 10px;
}
.lethalfantasy .tab.character-weapons .weapons { .lethalfantasy .tab.character-weapons .weapons {
display: grid; display: grid;
grid-template-columns: repeat(2, 1fr); grid-template-columns: repeat(2, 1fr);
@@ -576,32 +586,43 @@ i.lethalfantasy {
.lethalfantasy .tab.character-spells .spells .spell .name { .lethalfantasy .tab.character-spells .spells .spell .name {
min-width: 12rem; min-width: 12rem;
} }
.lethalfantasy .tab.character-spells .miracles {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 10px;
}
.lethalfantasy .tab.character-spells .miracles .miracle {
display: flex;
align-items: center;
gap: 10px;
}
.lethalfantasy .tab.character-spells .miracles .miracle .item-img {
width: 32px;
height: 32px;
}
.lethalfantasy .tab.character-spells .miracles .miracle .name {
min-width: 12rem;
}
.lethalfantasy .tab.character-spells .appris {
font-weight: bold;
}
.lethalfantasy .tab.character-spells prose-mirror.inactive { .lethalfantasy .tab.character-spells prose-mirror.inactive {
min-height: 40px; min-height: 40px;
} }
.lethalfantasy .tab.character-spells prose-mirror.active { .lethalfantasy .tab.character-spells prose-mirror.active {
min-height: 150px; min-height: 150px;
} }
.lethalfantasy .tab.character-miracles {
display: grid;
grid-template-columns: 1fr;
}
.lethalfantasy .tab.character-miracles legend a {
font-size: calc(var(--font-size-standard) * 1.4);
padding-left: 5px;
}
.lethalfantasy .tab.character-miracles .miracles {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 10px;
}
.lethalfantasy .tab.character-miracles .miracles .miracle {
display: flex;
align-items: center;
gap: 10px;
}
.lethalfantasy .tab.character-miracles .miracles .miracle .item-img {
width: 32px;
height: 32px;
}
.lethalfantasy .tab.character-miracles .miracles .miracle .name {
min-width: 12rem;
}
.lethalfantasy .tab.character-miracles prose-mirror.inactive {
min-height: 40px;
}
.lethalfantasy .tab.character-miracles prose-mirror.active {
min-height: 150px;
}
.lethalfantasy .opponent-content { .lethalfantasy .opponent-content {
font-family: var(--font-primary); font-family: var(--font-primary);
font-size: calc(var(--font-size-standard) * 1); font-size: calc(var(--font-size-standard) * 1);

File diff suppressed because it is too large Load Diff

View File

@@ -35,6 +35,9 @@ export default class LethalFantasyCharacterSheet extends LethalFantasyActorSheet
spells: { spells: {
template: "systems/fvtt-lethal-fantasy/templates/character-spells.hbs", template: "systems/fvtt-lethal-fantasy/templates/character-spells.hbs",
}, },
miracles: {
template: "systems/fvtt-lethal-fantasy/templates/character-miracles.hbs",
},
biography: { biography: {
template: "systems/fvtt-lethal-fantasy/templates/character-biography.hbs", template: "systems/fvtt-lethal-fantasy/templates/character-biography.hbs",
}, },
@@ -58,7 +61,9 @@ export default class LethalFantasyCharacterSheet extends LethalFantasyActorSheet
if (this.actor.system.biodata.magicUser) { if (this.actor.system.biodata.magicUser) {
tabs.spells = { id: "spells", group: "sheet", icon: "fa-sharp-duotone fa-solid fa-wand-magic-sparkles", label: "LETHALFANTASY.Label.spells" } tabs.spells = { id: "spells", group: "sheet", icon: "fa-sharp-duotone fa-solid fa-wand-magic-sparkles", label: "LETHALFANTASY.Label.spells" }
} }
if (this.actor.system.biodata.clericUser) {
tabs.miracles = { id: "miracles", group: "sheet", icon: "fa-sharp-duotone fa-solid fa-hands-praying", label: "LETHALFANTASY.Label.miracles" }
}
for (const v of Object.values(tabs)) { for (const v of Object.values(tabs)) {
v.active = this.tabGroups[v.group] === v.id v.active = this.tabGroups[v.group] === v.id
v.cssClass = v.active ? "active" : "" v.cssClass = v.active ? "active" : ""
@@ -71,14 +76,6 @@ export default class LethalFantasyCharacterSheet extends LethalFantasyActorSheet
const context = await super._prepareContext() const context = await super._prepareContext()
context.tabs = this.#getTabs() context.tabs = this.#getTabs()
context.tooltipsCaracteristiques = {
}
context.tooltipsRessources = {
}
context.rollType = {
}
return context return context
} }
@@ -100,9 +97,13 @@ export default class LethalFantasyCharacterSheet extends LethalFantasyActorSheet
case "spells": case "spells":
context.tab = context.tabs.spells context.tab = context.tabs.spells
context.spells = doc.itemTypes.spell context.spells = doc.itemTypes.spell
context.miracles = doc.itemTypes.miracle
context.hasSpells = context.spells.length > 0 context.hasSpells = context.spells.length > 0
break break
case "miracles":
context.tab = context.tabs.miracles
context.miracles = doc.itemTypes.miracle
context.hasMiracles = context.miracles.length > 0
break
case "weapons": case "weapons":
context.tab = context.tabs.weapons context.tab = context.tabs.weapons
context.weapons = doc.itemTypes.weapon context.weapons = doc.itemTypes.weapon

View File

@@ -282,6 +282,7 @@ export default class LethalFantasyRoll extends Roll {
titleFormula = `${dice}E` titleFormula = `${dice}E`
} }
// Specific pain case
if (options.rollType === "save" && options.rollTarget.rollKey === "pain") { if (options.rollType === "save" && options.rollTarget.rollKey === "pain") {
baseFormula = options.rollTarget.rollDice baseFormula = options.rollTarget.rollDice
titleFormula = `${dice}` titleFormula = `${dice}`
@@ -289,6 +290,11 @@ export default class LethalFantasyRoll extends Roll {
fullModifier = 0 fullModifier = 0
} }
// Specific pain/poison/contagion case
if (options.rollType === "save" && options.rollTarget.rollKey.includes(["pain", "poison", "contagion"])) {
hasD30 = false
}
maxValue = Number(baseFormula.match(/\d+$/)[0]) // Update the max value agains maxValue = Number(baseFormula.match(/\d+$/)[0]) // Update the max value agains
const rollData = { const rollData = {

View File

@@ -55,11 +55,20 @@ export default class LethalFantasyCharacter extends foundry.abstract.TypeDataMod
obj[save.id] = challengeField(save.label) obj[save.id] = challengeField(save.label)
return obj return obj
}, {}), }, {}),
) )
const woundFieldSchema = {
value: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }),
duration: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }),
description: new fields.StringField({ initial: "", required: false, nullable: true }),
}
schema.hp = new fields.SchemaField({ schema.hp = new fields.SchemaField({
value: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }), value: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }),
max: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }), max: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }),
painDamage: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }),
wounds: new fields.ArrayField(new fields.SchemaField(woundFieldSchema ) ),
}) })
schema.perception = new fields.SchemaField({ schema.perception = new fields.SchemaField({
@@ -92,6 +101,7 @@ export default class LethalFantasyCharacter extends foundry.abstract.TypeDataMod
eyes: new fields.StringField({ required: true, nullable: false, initial: "" }), eyes: new fields.StringField({ required: true, nullable: false, initial: "" }),
hair: new fields.StringField({ required: true, nullable: false, initial: "" }), hair: new fields.StringField({ required: true, nullable: false, initial: "" }),
magicUser: new fields.BooleanField({ initial: false }), magicUser: new fields.BooleanField({ initial: false }),
clericUser: new fields.BooleanField({ initial: false }),
}) })
schema.modifiers = new fields.SchemaField({ schema.modifiers = new fields.SchemaField({
@@ -114,6 +124,7 @@ export default class LethalFantasyCharacter extends foundry.abstract.TypeDataMod
attackModifier: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }), attackModifier: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }),
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 }),
}) })
const moneyField = (label) => { const moneyField = (label) => {

View File

@@ -29,6 +29,8 @@ export default class LethalFantasyMiracle extends foundry.abstract.TypeDataModel
schema.areaAffected = new fields.StringField({ required: true, initial: "" }) schema.areaAffected = new fields.StringField({ required: true, initial: "" })
schema.duration = new fields.StringField({ required: true, initial: "" }) schema.duration = new fields.StringField({ required: true, initial: "" })
schema.savingThrow = new fields.StringField({ required: true, initial: "" }) schema.savingThrow = new fields.StringField({ required: true, initial: "" })
schema.materialComponent = new fields.StringField({ required: true, initial: "" })
schema.catalyst = new fields.StringField({ required: true, initial: "" })
return schema return schema
} }

View File

@@ -30,6 +30,7 @@ export default class LethalFantasySpell extends foundry.abstract.TypeDataModel {
schema.duration = new fields.StringField({ required: true, initial: "" }) schema.duration = new fields.StringField({ required: true, initial: "" })
schema.savingThrow = new fields.StringField({ required: true, initial: "" }) schema.savingThrow = new fields.StringField({ required: true, initial: "" })
schema.extraAetherPoints = new fields.StringField({ required: true, initial: "" }) schema.extraAetherPoints = new fields.StringField({ required: true, initial: "" })
schema.materialComponent = new fields.StringField({ required: true, initial: "" })
return schema return schema
} }

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
packs/lf-gifts/MANIFEST-000086 LFS Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
packs/lf-skills/MANIFEST-000090 LFS Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -397,6 +397,17 @@
} }
} }
.combat-details {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 10px;
.combat-detail {
display: flex;
align-items: center;
gap: 10px;
}
}
.weapons { .weapons {
display: grid; display: grid;
grid-template-columns: repeat(2, 1fr); grid-template-columns: repeat(2, 1fr);
@@ -488,6 +499,25 @@
} }
} }
prose-mirror.inactive {
min-height: 40px;
}
prose-mirror.active {
min-height: 150px;
}
}
.tab.character-miracles {
display: grid;
grid-template-columns: 1fr;
legend {
a {
font-size: calc(var(--font-size-standard) * 1.4);
padding-left: 5px;
}
}
.miracles { .miracles {
display: grid; display: grid;
grid-template-columns: repeat(3, 1fr); grid-template-columns: repeat(3, 1fr);
@@ -506,9 +536,6 @@
} }
} }
.appris {
font-weight: bold;
}
prose-mirror.inactive { prose-mirror.inactive {
min-height: 40px; min-height: 40px;
} }

View File

@@ -35,10 +35,22 @@
<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">
<span class="name">Dev. Points (Total)</span>
{{formInput systemFields.developmentPoints.fields.total value=system.developmentPoints.total }}
</div>
<div class="biodata-elem">
<span class="name">Dev. Points (Rem.)</span>
{{formInput systemFields.developmentPoints.fields.remaining value=system.developmentPoints.remaining }}
</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">
<span class="name">Cleric User</span>
{{formInput systemFields.biodata.fields.clericUser value=system.biodata.clericUser }}
</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}}
@@ -49,6 +61,8 @@
<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 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}}

View File

@@ -0,0 +1,28 @@
<section class="tab character-{{tab.id}} {{tab.cssClass}}" data-tab="{{tab.id}}" data-group="{{tab.group}}">
<fieldset>
<legend>{{localize "LETHALFANTASY.Label.miracles"}}{{#if isEditMode}}<a class="action" data-tooltip="{{localize "
LETHALFANTASY.Tooltip.addMiracle"}}" data-tooltip-direction="UP"><i class="fas fa-plus"
data-action="createMiracle"></i></a>{{/if}}</legend>
<div class="miracles">
{{#each miracles as |item|}}
<div class="miracle" data-item-id="{{item.id}}" data-item-uuid="{{item.uuid}}" data-drag="true" >
<img class="item-img" src="{{item.img}}" data-tooltip="{{item.name}}" />
<div class="name" >
<a class="rollable" data-roll-type="miracle" data-roll-key="{{item.id}}">
<i class="lf-roll-small fa-solid fa-dice-d20"></i>
{{item.name}}
</a>
</div>
<div class="controls">
<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>
<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>
{{/each}}
</div>
</fieldset>
</section>

View File

@@ -25,29 +25,4 @@
</div> </div>
</fieldset> </fieldset>
<fieldset>
<legend>{{localize "LETHALFANTASY.Label.miracles"}}{{#if isEditMode}}<a class="action" data-tooltip="{{localize "
LETHALFANTASY.Tooltip.addMiracle"}}" data-tooltip-direction="UP"><i class="fas fa-plus"
data-action="createMiracle"></i></a>{{/if}}</legend>
<div class="miracles">
{{#each miracles as |item|}}
<div class="miracle" data-item-id="{{item.id}}" data-item-uuid="{{item.uuid}}" data-drag="true" >
<img class="item-img" src="{{item.img}}" data-tooltip="{{item.name}}" />
<div class="name" >
<a class="rollable" data-roll-type="miracle" data-roll-key="{{item.id}}">
<i class="lf-roll-small fa-solid fa-dice-d20"></i>
{{item.name}}
</a>
</div>
<div class="controls">
<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>
<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>
{{/each}}
</div>
</fieldset>
</section> </section>

View File

@@ -1,6 +1,15 @@
<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}}">
<button class="action" data-action="rangedAttackDefense">{{localize "LETHALFANTASY.Label.rangedAttackDefense"}}</button> <fieldset>
<legend>{{localize "LETHALFANTASY.Label.combatDetails"}}</legend>
<div class="combat-details">
<div class="combat-detail">
<button class="action" data-action="rangedAttackDefense">{{localize
"LETHALFANTASY.Label.rangedAttackDefense"}}</button>
{{formField systemFields.combat.fields.armorHitPoints value=system.combat.armorHitPoints localize=true}}
</div>
</div>
</fieldset>
<fieldset> <fieldset>
<legend>{{localize "LETHALFANTASY.Label.weapons"}}</legend> <legend>{{localize "LETHALFANTASY.Label.weapons"}}</legend>
@@ -24,12 +33,16 @@
<i class="fa-solid fa-shield-halved" data-roll-type="weapon-defense" data-roll-key="{{item.id}}"></i> <i class="fa-solid fa-shield-halved" data-roll-type="weapon-defense" data-roll-key="{{item.id}}"></i>
</a> </a>
<a class="rollable" data-roll-type="weapon-damage-small" data-roll-key="{{item.id}}" data-tooltip="Roll Damage (Small)"> <a class="rollable" data-roll-type="weapon-damage-small" data-roll-key="{{item.id}}"
<i class="fa-regular fa-face-head-bandage" data-roll-type="weapon-damage-small" data-roll-key="{{item.id}}"></i>S data-tooltip="Roll Damage (Small)">
<i class="fa-regular fa-face-head-bandage" data-roll-type="weapon-damage-small"
data-roll-key="{{item.id}}"></i>S
</a> </a>
<a class="rollable" data-roll-type="weapon-damage-medium" data-roll-key="{{item.id}}" data-tooltip="Roll Damage (Medium)"> <a class="rollable" data-roll-type="weapon-damage-medium" data-roll-key="{{item.id}}"
<i class="fa-regular fa-face-head-bandage" data-roll-type="weapon-damage-medium" data-roll-key="{{item.id}}"></i>M data-tooltip="Roll Damage (Medium)">
<i class="fa-regular fa-face-head-bandage" data-roll-type="weapon-damage-medium"
data-roll-key="{{item.id}}"></i>M
</a> </a>
</div> </div>

View File

@@ -21,6 +21,10 @@
{{formField systemFields.duration value=system.duration}} {{formField systemFields.duration value=system.duration}}
{{formField systemFields.savingThrow value=system.savingThrow}} {{formField systemFields.savingThrow value=system.savingThrow}}
{{formField systemFields.materialComponent value=system.materialComponent}}
{{formField systemFields.catalyst value=system.catalyst}}
<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" toggled=true}} {{formInput systemFields.description enriched=enrichedDescription value=system.description name="system.description" toggled=true}}

View File

@@ -21,6 +21,8 @@
{{formField systemFields.savingThrow value=system.savingThrow}} {{formField systemFields.savingThrow value=system.savingThrow}}
{{formField systemFields.extraAetherPoints value=system.extraAetherPoints}} {{formField systemFields.extraAetherPoints value=system.extraAetherPoints}}
{{formField systemFields.materialComponent value=system.materialComponent}}
<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" toggled=true}} {{formInput systemFields.description enriched=enrichedDescription value=system.description name="system.description" toggled=true}}