Compare commits

..

No commits in common. "main" and "12.0.57" have entirely different histories.

87 changed files with 510 additions and 1046 deletions

View File

@ -1,20 +1,6 @@
## Lethal Fantasy RPG for Foundry Virtual TableTop
<h2><em>Lethal Fantasy RPG</em> for Foundry Virtual TableTop</h2>
The Official game system for playing Lethal Fantasy TTRPG: The Role Playing Game on FoundryVTT. This fully functional system is the foundational framework to build your game.
<div align="center">
This product's format, programming code, and presentation is copyrighted by Lethal Fantasy Games LLC.
This system & product are used with permission granted as part of the partnership agreement between Foundry Gaming LLC and Lethal Fantasy Games LLC. It uses the following trademarks and/or copyrights:
© 2025 Lethal Fantasy Games. Content copyright Ted McClintock, Lethal Fantasy Games LLC. All Rights Reserved. Lethal Fantasy® is a Registered Trademark of Lethal Fantasy Games LLC. All Rights Reserved.
Lethal Fantasy Games is ©2025 Lethal Fantasy Games, LLC. All rights reserved. Lethal Fantasy, Lethal Fantasy Games, and their associated logos are trademarks of Lethal Fantasy Games, LLC. https://lethalfantasy.com/
For inquiries on developing content for this ruleset please contact Lethalted@lethalfantasy.com
## Community
Please join our Discord server Lethal Fantasy games https://discord.gg/UDvnnyvreV
It's the place to ask questions on how to use the system, make feature request and follow the development of the system.
</div>

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,6 @@
{
"COMBAT": {
"Round": "Second {round}",
"Round": "Second",
"Rounds": "Seconds",
"RoundNext": "Next second"
},

View File

@ -55,20 +55,20 @@ Hooks.once("init", function () {
}
// Register sheet application classes
foundry.documents.collections.Actors.unregisterSheet("core", foundry.appv1.sheets.ActorSheet)
foundry.documents.collections.Actors.registerSheet("lethalFantasy", applications.LethalFantasyCharacterSheet, { types: ["character"], makeDefault: true })
foundry.documents.collections.Actors.registerSheet("lethalFantasy", applications.LethalFantasyMonsterSheet, { types: ["monster"], makeDefault: true })
Actors.unregisterSheet("core", ActorSheet)
Actors.registerSheet("lethalFantasy", applications.LethalFantasyCharacterSheet, { types: ["character"], makeDefault: true })
Actors.registerSheet("lethalFantasy", applications.LethalFantasyMonsterSheet, { types: ["monster"], makeDefault: true })
foundry.documents.collections.Items.unregisterSheet("core", foundry.appv1.sheets.ActorSheet)
foundry.documents.collections.Items.registerSheet("lethalFantasy", applications.LethalFantasySkillSheet, { types: ["skill"], makeDefault: true })
foundry.documents.collections.Items.registerSheet("lethalFantasy", applications.LethalFantasyGiftSheet, { types: ["gift"], makeDefault: true })
foundry.documents.collections.Items.registerSheet("lethalFantasy", applications.LethalFantasyVulnerabilitySheet, { types: ["vulnerability"], makeDefault: true })
foundry.documents.collections.Items.registerSheet("lethalFantasy", applications.LethalFantasyWeaponSheet, { types: ["weapon"], makeDefault: true })
foundry.documents.collections.Items.registerSheet("lethalFantasy", applications.LethalFantasySpellSheet, { types: ["spell"], makeDefault: true })
foundry.documents.collections.Items.registerSheet("lethalFantasy", applications.LethalFantasyArmorSheet, { types: ["armor"], makeDefault: true })
foundry.documents.collections.Items.registerSheet("lethalFantasy", applications.LethalFantasyShieldSheet, { types: ["shield"], makeDefault: true })
foundry.documents.collections.Items.registerSheet("lethalFantasy", applications.LethalFantasyEquipmentSheet, { types: ["equipment"], makeDefault: true })
foundry.documents.collections.Items.registerSheet("lethalFantasy", applications.LethalFantasyMiracleSheet, { types: ["miracle"], makeDefault: true })
Items.unregisterSheet("core", ItemSheet)
Items.registerSheet("lethalFantasy", applications.LethalFantasySkillSheet, { types: ["skill"], makeDefault: true })
Items.registerSheet("lethalFantasy", applications.LethalFantasyGiftSheet, { types: ["gift"], makeDefault: true })
Items.registerSheet("lethalFantasy", applications.LethalFantasyVulnerabilitySheet, { types: ["vulnerability"], makeDefault: true })
Items.registerSheet("lethalFantasy", applications.LethalFantasyWeaponSheet, { types: ["weapon"], makeDefault: true })
Items.registerSheet("lethalFantasy", applications.LethalFantasySpellSheet, { types: ["spell"], makeDefault: true })
Items.registerSheet("lethalFantasy", applications.LethalFantasyArmorSheet, { types: ["armor"], makeDefault: true })
Items.registerSheet("lethalFantasy", applications.LethalFantasyShieldSheet, { types: ["shield"], makeDefault: true })
Items.registerSheet("lethalFantasy", applications.LethalFantasyEquipmentSheet, { types: ["equipment"], makeDefault: true })
Items.registerSheet("lethalFantasy", applications.LethalFantasyMiracleSheet, { types: ["miracle"], makeDefault: true })
// Other Document Configuration
CONFIG.ChatMessage.documentClass = documents.LethalFantasyChatMessage
@ -95,7 +95,7 @@ Hooks.once("init", function () {
})
/**
* Perform one-time configuration of system configuration objects.f
* Perform one-time configuration of system configuration objects.
*/
function preLocalizeConfig() {
const localizeConfigObject = (obj, keys) => {
@ -105,6 +105,11 @@ function preLocalizeConfig() {
}
}
}
// CONFIG.Dice.rollModes = Object.fromEntries(Object.entries(CONFIG.Dice.rollModes).map(([key, value]) => [key, game.i18n.localize(value)]))
// localizeConfigObject(SYSTEM.ACTION.TAG_CATEGORIES, ["label"])
// localizeConfigObject(CONFIG.Dice.rollModes, ["label"])
}
Hooks.once("ready", function () {
@ -126,12 +131,7 @@ Hooks.once("ready", function () {
}
})
// Test if version below 13
let hookName = "renderChatMessage"
if (foundry.utils.isNewerVersion(game.version, "12.0",)) {
hookName = "renderChatMessageHTML"
}
Hooks.on(hookName, (message, html, data) => {
Hooks.on("renderChatMessage", (message, html, data) => {
const typeMessage = data.message.flags.lethalFantasy?.typeMessage
// Message de demande de jet de dés
if (typeMessage === "askRoll") {

View File

@ -1,54 +1,18 @@
/* -------------------------------------------- */
export class LethalFantasyCombatTracker extends foundry.applications.sidebar.tabs.CombatTracker {
export class LethalFantasyCombatTracker extends CombatTracker {
static PARTS = {
"header": {
"template": "systems/fvtt-lethal-fantasy/templates/combat-tracker-header-v2.hbs"
},
"tracker": {
"template": "systems/fvtt-lethal-fantasy/templates/combat-tracker-v2.hbs"
},
"footer": {
"template": "systems/fvtt-lethal-fantasy/templates/combat-tracker-footer-v2.hbs"
}
}
static DEFAULT_OPTIONS = foundry.utils.mergeObject(super.DEFAULT_OPTIONS, {
actions: {
initiativePlus: LethalFantasyCombatTracker.#initiativePlus,
initiativeMinus: LethalFantasyCombatTracker.#initiativeMinus,
},
});
async _prepareContext(options) {
let data = await super._prepareContext(options);
console?.log("Combat Tracker Data", data);
/*for (let u of data.turns) {
async getData(options) {
let data = await super.getData(options);
for (let u of data.turns) {
let c = game.combat.combatants.get(u.id);
u.progressionCount = c.system.progressionCount
u.isMonster = c.actor.type === "monster"
}
console.log("Combat Data", data);*/
console.log("Combat Data", data);
return data;
}
static #initiativePlus(ev) {
ev.preventDefault();
let cId = ev.target.closest(".combatant").dataset.combatantId;
let c = game.combat.combatants.get(cId);
c.update({ 'initiative': c.initiative + 1 });
console.log("Initiative Plus");
}
static #initiativeMinus(ev) {
ev.preventDefault();
let cId = ev.target.closest(".combatant").dataset.combatantId;
let c = game.combat.combatants.get(cId);
let newInit = Math.max(c.initiative - 1, 0);
c.update({ 'initiative': newInit });
}
activateListeners(html) {
super.activateListeners(html);
// Display Combat settings
@ -57,6 +21,7 @@ export class LethalFantasyCombatTracker extends foundry.applications.sidebar.tab
let cId = ev.currentTarget.closest(".combatant").dataset.combatantId;
let c = game.combat.combatants.get(cId);
c.update({ 'initiative': c.initiative + 1 });
console.log("Initiative Plus");
});
html.find(".initiative-minus").click(ev => {

View File

@ -23,7 +23,7 @@ export default class LethalFantasyArmorSheet extends LethalFantasyItemSheet {
/** @override */
async _prepareContext() {
const context = await super._prepareContext()
context.enrichedDescription = await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.document.system.description, { async: true })
context.enrichedDescription = await TextEditor.enrichHTML(this.document.system.description, { async: true })
return context
}

View File

@ -67,7 +67,7 @@ export default class LethalFantasyActorSheet extends HandlebarsApplicationMixin(
actor: this.document,
system: this.document.system,
source: this.document.toObject(),
enrichedDescription: await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.document.system.description, { async: true }),
enrichedDescription: await TextEditor.enrichHTML(this.document.system.description, { async: true }),
isEditMode: this.isEditMode,
isPlayMode: this.isPlayMode,
isEditable: this.isEditable,
@ -100,7 +100,7 @@ export default class LethalFantasyActorSheet extends HandlebarsApplicationMixin(
dragover: this._onDragOver.bind(this),
drop: this._onDrop.bind(this),
}
return new foundry.applications.ux.DragDrop.implementation(d)
return new DragDrop(d)
})
}

View File

@ -58,22 +58,22 @@ export default class LethalFantasyItemSheet extends HandlebarsApplicationMixin(f
/** @override */
async _prepareContext() {
let context = await super._prepareContext()
context.fields = this.document.schema.fields
context.systemFields = this.document.system.schema.fields
context.item = this.document
context.system = this.document.system
context.source = this.document.toObject()
context.enrichedDescription = await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.document.system.description, { async: true })
context.isEditMode = this.isEditMode
context.isPlayMode = this.isPlayMode
context.isEditable = this.isEditable
const context = {
fields: this.document.schema.fields,
systemFields: this.document.system.schema.fields,
item: this.document,
system: this.document.system,
source: this.document.toObject(),
enrichedDescription: await TextEditor.enrichHTML(this.document.system.description, { async: true }),
isEditMode: this.isEditMode,
isPlayMode: this.isPlayMode,
isEditable: this.isEditable,
}
return context
}
/** @override */
_onRender(context, options) {
super._onRender(context, options)
this.#dragDrop.forEach((d) => d.bind(this.element))
}
@ -94,7 +94,7 @@ export default class LethalFantasyItemSheet extends HandlebarsApplicationMixin(f
dragover: this._onDragOver.bind(this),
drop: this._onDrop.bind(this),
}
return new foundry.applications.ux.DragDrop.implementation(d)
return new DragDrop(d)
})
}

View File

@ -90,6 +90,9 @@ export default class LethalFantasyCharacterSheet extends LethalFantasyActorSheet
return context
}
_generateTooltip(type, target) {
}
/** @override */
async _preparePartContext(partId, context) {
const doc = this.document
@ -124,8 +127,8 @@ export default class LethalFantasyCharacterSheet extends LethalFantasyActorSheet
break
case "biography":
context.tab = context.tabs.biography
context.enrichedDescription = await foundry.applications.ux.TextEditor.implementation.enrichHTML(doc.system.description, { async: true })
context.enrichedNotes = await foundry.applications.ux.TextEditor.implementation.enrichHTML(doc.system.notes, { async: true })
context.enrichedDescription = await TextEditor.enrichHTML(doc.system.description, { async: true })
context.enrichedNotes = await TextEditor.enrichHTML(doc.system.notes, { async: true })
break
}
return context
@ -140,17 +143,18 @@ export default class LethalFantasyCharacterSheet extends LethalFantasyActorSheet
*/
async _onDrop(event) {
if (!this.isEditable || !this.isEditMode) return
const data = foundry.applications.ux.TextEditor.implementation.getDragEventData(event)
const data = TextEditor.getDragEventData(event)
// Handle different data types
if (data.type === "Item") {
switch (data.type) {
case "Item":
const item = await fromUuid(data.uuid)
return this._onDropItem(item)
}
}
static async #onRangedAttackDefense(event, target) {
// Future use : const hasTarget = false
const hasTarget = false
let roll = await LethalFantasyRoll.promptRangedDefense({
actorId: this.actor.id,
@ -246,7 +250,6 @@ export default class LethalFantasyCharacterSheet extends LethalFantasyActorSheet
async _onRoll(event, target) {
if (this.isEditMode) return
console.log("Roll event", event)
const rollType = event.target.dataset.rollType
let rollKey = event.target.dataset.rollKey;
let rollDice = event.target.dataset?.rollDice;

View File

@ -22,7 +22,7 @@ export default class LethalFantasyEquipmentSheet extends LethalFantasyItemSheet
/** @override */
async _prepareContext() {
const context = await super._prepareContext()
context.enrichedDescription = await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.document.system.description, { async: true })
context.enrichedDescription = await TextEditor.enrichHTML(this.document.system.description, { async: true })
return context
}
}

View File

@ -19,4 +19,10 @@ export default class LethalFantasyGiftSheet extends LethalFantasyItemSheet {
},
}
/** @override */
async _prepareContext() {
const context = await super._prepareContext()
context.enrichedDescription = await TextEditor.enrichHTML(this.document.system.description, { async: true })
return context
}
}

View File

@ -22,7 +22,7 @@ export default class LethalFantasyMiracleSheet extends LethalFantasyItemSheet {
/** @override */
async _prepareContext() {
const context = await super._prepareContext()
context.enrichedDescription = await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.document.system.description, { async: true })
context.enrichedDescription = await TextEditor.enrichHTML(this.document.system.description, { async: true })
return context
}

View File

@ -63,6 +63,9 @@ export default class LethalFantasyMonsterSheet extends LethalFantasyActorSheet {
return context
}
_generateTooltip(type, target) {
}
/** @override */
async _preparePartContext(partId, context) {
const doc = this.document
@ -75,8 +78,8 @@ export default class LethalFantasyMonsterSheet extends LethalFantasyActorSheet {
break
case "biography":
context.tab = context.tabs.biography
context.enrichedDescription = await foundry.applications.ux.TextEditor.implementation.enrichHTML(doc.system.description, { async: true })
context.enrichedNotes = await foundry.applications.ux.TextEditor.implementation.enrichHTML(doc.system.notes, { async: true })
context.enrichedDescription = await TextEditor.enrichHTML(doc.system.description, { async: true })
context.enrichedNotes = await TextEditor.enrichHTML(doc.system.notes, { async: true })
break
}
return context

View File

@ -22,7 +22,7 @@ export default class LethalFantasyShieldSheet extends LethalFantasyItemSheet {
/** @override */
async _prepareContext() {
const context = await super._prepareContext()
context.enrichedDescription = await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.document.system.description, { async: true })
context.enrichedDescription = await TextEditor.enrichHTML(this.document.system.description, { async: true })
return context
}
}

View File

@ -22,7 +22,7 @@ export default class LethalFantasySkillSheet extends LethalFantasyItemSheet {
/** @override */
async _prepareContext() {
const context = await super._prepareContext()
context.enrichedDescription = await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.document.system.description, { async: true })
context.enrichedDescription = await TextEditor.enrichHTML(this.document.system.description, { async: true })
return context
}
}

View File

@ -22,7 +22,7 @@ export default class LethalFantasySpellSheet extends LethalFantasyItemSheet {
/** @override */
async _prepareContext() {
const context = await super._prepareContext()
context.enrichedDescription = await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.document.system.description, { async: true })
context.enrichedDescription = await TextEditor.enrichHTML(this.document.system.description, { async: true })
return context
}

View File

@ -22,7 +22,7 @@ export default class LethalFantasyVulnerabilitySheet extends LethalFantasyItemSh
/** @override */
async _prepareContext() {
const context = await super._prepareContext()
context.enrichedDescription = await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.document.system.description, { async: true })
context.enrichedDescription = await TextEditor.enrichHTML(this.document.system.description, { async: true })
return context
}
}

View File

@ -22,7 +22,7 @@ export default class LethalFantasyWeaponSheet extends LethalFantasyItemSheet {
/** @override */
async _prepareContext() {
const context = await super._prepareContext()
context.enrichedDescription = await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.document.system.description, { async: true })
context.enrichedDescription = await TextEditor.enrichHTML(this.document.system.description, { async: true })
return context
}

View File

@ -44,13 +44,22 @@ export const MONEY = {
}
export const MORTAL_CHOICES = {
"mankind": {label: "Mankind", id: "mankind", defenseBonus: 0},
"elf": {label: "Elf", id: "elf", defenseBonus: 0},
"dwarf": {label: "Dwarf", id: "dwarf", defenseBonus: 0},
"halfelf": {label: "Half-Elf", id: "halfelf", defenseBonus: 0},
"halforc": {label: "Half-Orc", id: "halforc", defenseBonus: 0},
"gnome": {label: "Gnome", id: "gnome", defenseBonus: 2},
"halflings": {label: "Halflings", id: "halflings", defenseBonus: 2}
"mankind": {label: "Mankind", value: "Mankind", defenseBonus: 0},
"elf": {label: "Elf", value: "Elf", defenseBonus: 0},
"dwarf": {label: "Dwarf", value: "Dwarf", defenseBonus: 0},
"halfelf": {label: "Half-Elf", value: "Half-Elf", defenseBonus: 0},
"halforc": {label: "Half-Orc", value: "Half-Orc", defenseBonus: 0},
"gnome": {label: "Gnome", value: "Gnome", defenseBonus: 2},
"shirefolk": {label: "Shire Folk", value: "Shire Folk", defenseBonus: 2},
"Elf": {label: "Elf", value: "Elf", defenseBonus: 0},
"Half-orc": {label: "Half-Orc", value: "Half-Orc", defenseBonus: 0},
"Half-Orc": {label: "Half-Orc", value: "Half-Orc", defenseBonus: 0},
"Dwarf": {label: "Dwarf", value: "Dwarf", defenseBonus: 0},
"Half-elf": {label: "Half-Elf", value: "Half-Elf", defenseBonus: 0},
"Gnome": {label: "Gnome", value: "Gnome", defenseBonus: 2},
"Shire Folk": {label: "Shire Folk", value: "Shire Folk", defenseBonus: 2},
"Shire folk": {label: "Shire Folk", value: "Shire Folk", defenseBonus: 2},
"Mankind": {label: "Human", value: "Human", defenseBonus: 0},
}
export const FAVOR_CHOICES = {
@ -60,16 +69,17 @@ export const FAVOR_CHOICES = {
}
export const MOVEMENT_CHOICES = {
"none": {label: "None (D20E Disfavor)", disfavor: true, value: "2D20kl"},
"walk": {label: "Walk (D20E Disfavor)", disfavor: true, value: "2D20kl"},
"run": {label: "Jog/Run/Sprint (D20E Favor)", favor: true, value: "2D20kh"},
"incombat": {label: "In Combat (D20E)", favor: false, value: "D20"}
"none": {label: "None (D8E)", value: "D8"},
"walk": {label: "Walk (D10E)", value: "D10"},
"jog": {label: "Jog (D12E)", value: "D12"},
"run": {label: "Run (D20E)", value: "D20"},
"incombat": {label: "In Combat (D12E)", value: "D12"}
}
export const MOVE_DIRECTION_CHOICES = {
"none": {label: "None (+0)", value: "0"},
"away": {label: "Away (+4)", value: "+4"},
"toward": {label: "Toward (-5)", value: "-5"},
"toward": {label: "Toward (+0)", value: "0"},
"lateral": {label: "Lateral (+10)", value: "+10"}
}

View File

@ -292,9 +292,7 @@ export default class LethalFantasyRoll extends Roll {
hasModifier = false
}
const rollModes = foundry.utils.duplicate(CONFIG.Dice.rollModes); // v12 : Object.fromEntries(Object.entries(CONFIG.Dice.rollModes).map(([key, value]) => [key, game.i18n.localize(value)]))
console.log("Roll mode", rollModes)
const rollModes = Object.fromEntries(Object.entries(CONFIG.Dice.rollModes).map(([key, value]) => [key, game.i18n.localize(value)]))
const fieldRollMode = new foundry.data.fields.StringField({
choices: rollModes,
blank: false,
@ -331,7 +329,7 @@ export default class LethalFantasyRoll extends Roll {
favor: "none",
targetName
}
const content = await foundry.applications.handlebars.renderTemplate("systems/fvtt-lethal-fantasy/templates/roll-dialog.hbs", dialogContext)
const content = await renderTemplate("systems/fvtt-lethal-fantasy/templates/roll-dialog.hbs", dialogContext)
let position = game.user.getFlag(SYSTEM.id, "roll-dialog-pos") || { top: -1, left: -1 }
const label = game.i18n.localize("LETHALFANTASY.Roll.roll")
@ -344,8 +342,7 @@ export default class LethalFantasyRoll extends Roll {
{
label: label,
callback: (event, button, dialog) => {
console.log("Roll context", event, button, dialog)
let position = dialog.position
let position = $(dialog).position()
game.user.setFlag(SYSTEM.id, "roll-dialog-pos", foundry.utils.duplicate(position))
const output = Array.from(button.form.elements).reduce((obj, input) => {
if (input.name) obj[input.name] = input.value
@ -569,7 +566,7 @@ export default class LethalFantasyRoll extends Roll {
/* ***********************************************************/
static async promptInitiative(options = {}) {
const rollModes = foundry.utils.duplicate(CONFIG.Dice.rollModes); // v12 : Object.fromEntries(Object.entries(CONFIG.Dice.rollModes).map(([key, value]) => [key, game.i18n.localize(value)]))
const rollModes = Object.fromEntries(Object.entries(CONFIG.Dice.rollModes).map(([key, value]) => [key, game.i18n.localize(value)]))
const fieldRollMode = new foundry.data.fields.StringField({
choices: rollModes,
blank: false,
@ -592,7 +589,7 @@ export default class LethalFantasyRoll extends Roll {
}
console.log("CTX", dialogContext)
const content = await foundry.applications.handlebars.renderTemplate("systems/fvtt-lethal-fantasy/templates/roll-initiative-dialog.hbs", dialogContext)
const content = await renderTemplate("systems/fvtt-lethal-fantasy/templates/roll-initiative-dialog.hbs", dialogContext)
const label = game.i18n.localize("LETHALFANTASY.Label.initiative")
const rollContext = await foundry.applications.api.DialogV2.wait({
@ -631,7 +628,7 @@ export default class LethalFantasyRoll extends Roll {
/* ***********************************************************/
static async promptCombatAction(options = {}) {
const rollModes = foundry.utils.duplicate(CONFIG.Dice.rollModes); // v12 : Object.fromEntries(Object.entries(CONFIG.Dice.rollModes).map(([key, value]) => [key, game.i18n.localize(value)]))
const rollModes = Object.fromEntries(Object.entries(CONFIG.Dice.rollModes).map(([key, value]) => [key, game.i18n.localize(value)]))
const fieldRollMode = new foundry.data.fields.StringField({
choices: rollModes,
blank: false,
@ -655,7 +652,7 @@ export default class LethalFantasyRoll extends Roll {
...options
}
const content = await foundry.applications.handlebars.renderTemplate("systems/fvtt-lethal-fantasy/templates/combat-action-dialog.hbs", dialogContext)
const content = await renderTemplate("systems/fvtt-lethal-fantasy/templates/combat-action-dialog.hbs", dialogContext)
let buttons = []
if (currentAction) {
@ -890,7 +887,7 @@ export default class LethalFantasyRoll extends Roll {
/* ***********************************************************/
static async promptRangedDefense(rollTarget) {
const rollModes = foundry.utils.duplicate(CONFIG.Dice.rollModes); // v12 : Object.fromEntries(Object.entries(CONFIG.Dice.rollModes).map(([key, value]) => [key, game.i18n.localize(value)]))
const rollModes = Object.fromEntries(Object.entries(CONFIG.Dice.rollModes).map(([key, value]) => [key, game.i18n.localize(value)]))
const fieldRollMode = new foundry.data.fields.StringField({
choices: rollModes,
blank: false,
@ -913,7 +910,7 @@ export default class LethalFantasyRoll extends Roll {
}
console.log("CTX", dialogContext)
const content = await foundry.applications.handlebars.renderTemplate("systems/fvtt-lethal-fantasy/templates/range-defense-dialog.hbs", dialogContext)
const content = await renderTemplate("systems/fvtt-lethal-fantasy/templates/range-defense-dialog.hbs", dialogContext)
const label = game.i18n.localize("LETHALFANTASY.Label.rangeDefenseRoll")
const rollContext = await foundry.applications.api.DialogV2.wait({
@ -966,7 +963,7 @@ export default class LethalFantasyRoll extends Roll {
options.D30result = rollD30.total
let dice = rollContext.movement
let maxValue = 20 // As per latest changes (was : Number(dice.match(/\d+$/)[0])
let maxValue = Number(dice.match(/\d+$/)[0]) // Update the max value agains
let rollTotal = -1
let diceResults = []
let resultType
@ -1053,7 +1050,7 @@ export default class LethalFantasyRoll extends Roll {
async render(chatOptions = {}) {
let chatData = await this._getChatCardData(chatOptions.isPrivate)
console.log("ChatData", chatData)
return await foundry.applications.handlebars.renderTemplate(this.constructor.CHAT_TEMPLATE, chatData)
return await renderTemplate(this.constructor.CHAT_TEMPLATE, chatData)
}
/*

View File

@ -174,31 +174,6 @@ export default class LethalFantasyCharacter extends foundry.abstract.TypeDataMod
/** @override */
static LOCALIZATION_PREFIXES = ["LETHALFANTASY.Character"]
static migrateData(data) {
if (data?.biodata?.mortal) {
if (!SYSTEM.MORTAL_CHOICES[data.biodata.mortal]) {
for (let key in SYSTEM.MORTAL_CHOICES) {
let mortal = SYSTEM.MORTAL_CHOICES[key]
if ( mortal.label.toLowerCase() === data.biodata.mortal.toLowerCase()) {
data.biodata.mortal = mortal.id
}
if ( data.biodata.mortal.toLowerCase().includes("shire")) {
data.biodata.mortal = "halflings"
}
if ( data.biodata.mortal.toLowerCase().includes("human")) {
data.biodata.mortal = "mankind"
}
}
}
if (!SYSTEM.MORTAL_CHOICES[data.biodata.mortal]) {
console.warn("Lethal Fantasy | Migrate data: Mortal not found, forced to mankind", data.biodata.mortal)
data.biodata.mortal = "mankind"
}
}
return super.migrateData(data)
}
prepareDerivedData() {
super.prepareDerivedData();
let grit = 0

View File

@ -238,7 +238,7 @@ export default class LethalFantasyMonster extends foundry.abstract.TypeDataModel
async rollProgressionDice(combatId, combatantId) {
const rollModes = foundry.utils.duplicate(CONFIG.Dice.rollModes)
const rollModes = Object.fromEntries(Object.entries(CONFIG.Dice.rollModes).map(([key, value]) => [key, game.i18n.localize(value)]))
const fieldRollMode = new foundry.data.fields.StringField({
choices: rollModes,
blank: false,

View File

@ -22,28 +22,28 @@ export default class LethalFantasyUtils {
static setHookListeners() {
Hooks.on('renderTokenHUD', async (hud, html, token) => {
const lossHPButton = await foundry.applications.handlebars.renderTemplate('systems/fvtt-lethal-fantasy/templates/loss-hp-hud.hbs', {} )
$(html).find('div.left').append(lossHPButton);
$(html).find('img.lethal-hp-loss-hud').click((event) => {
const lossHPButton = await renderTemplate('systems/fvtt-lethal-fantasy/templates/loss-hp-hud.hbs', {} )
html.find('div.left').append(lossHPButton);
html.find('img.lethal-hp-loss-hud').click((event) => {
event.preventDefault();
let hpMenu = $(html).find('.hp-loss-wrap')[0]
let hpMenu = html.find('.hp-loss-wrap')[0]
if (hpMenu.classList.contains("hp-loss-hud-disabled")) {
$(html).find('.hp-loss-wrap')[0].classList.add('hp-loss-hud-active');
$(html).find('.hp-loss-wrap')[0].classList.remove('hp-loss-hud-disabled');
$(html).find('.hp-loss-wrap')[1].classList.add('hp-loss-hud-active');
$(html).find('.hp-loss-wrap')[1].classList.remove('hp-loss-hud-disabled');
$(html).find('.hp-loss-wrap')[2].classList.add('hp-loss-hud-active');
$(html).find('.hp-loss-wrap')[2].classList.remove('hp-loss-hud-disabled');
html.find('.hp-loss-wrap')[0].classList.add('hp-loss-hud-active');
html.find('.hp-loss-wrap')[0].classList.remove('hp-loss-hud-disabled');
html.find('.hp-loss-wrap')[1].classList.add('hp-loss-hud-active');
html.find('.hp-loss-wrap')[1].classList.remove('hp-loss-hud-disabled');
html.find('.hp-loss-wrap')[2].classList.add('hp-loss-hud-active');
html.find('.hp-loss-wrap')[2].classList.remove('hp-loss-hud-disabled');
} else {
$(html).find('.hp-loss-wrap')[0].classList.remove('hp-loss-hud-active');
$(html).find('.hp-loss-wrap')[0].classList.add('hp-loss-hud-disabled');
$(html).find('.hp-loss-wrap')[1].classList.remove('hp-loss-hud-active');
$(html).find('.hp-loss-wrap')[1].classList.add('hp-loss-hud-disabled');
$(html).find('.hp-loss-wrap')[2].classList.remove('hp-loss-hud-active');
$(html).find('.hp-loss-wrap')[2].classList.add('hp-loss-hud-disabled');
html.find('.hp-loss-wrap')[0].classList.remove('hp-loss-hud-active');
html.find('.hp-loss-wrap')[0].classList.add('hp-loss-hud-disabled');
html.find('.hp-loss-wrap')[1].classList.remove('hp-loss-hud-active');
html.find('.hp-loss-wrap')[1].classList.add('hp-loss-hud-disabled');
html.find('.hp-loss-wrap')[2].classList.remove('hp-loss-hud-active');
html.find('.hp-loss-wrap')[2].classList.add('hp-loss-hud-disabled');
}
})
$(html).find('.loss-hp-hud-click').click((event) => {
html.find('.loss-hp-hud-click').click((event) => {
event.preventDefault();
let hpLoss = event.currentTarget.dataset.hpValue;
if (token) {
@ -51,12 +51,12 @@ export default class LethalFantasyUtils {
console.log(tokenFull, token)
let actor = tokenFull.actor;
actor.applyDamage(Number(hpLoss));
$(html).find('.hp-loss-wrap')[0].classList.remove('hp-loss-hud-active');
$(html).find('.hp-loss-wrap')[0].classList.add('hp-loss-hud-disabled');
$(html).find('.hp-loss-wrap')[1].classList.remove('hp-loss-hud-active');
$(html).find('.hp-loss-wrap')[1].classList.add('hp-loss-hud-disabled');
$(html).find('.hp-loss-wrap')[2].classList.remove('hp-loss-hud-active');
$(html).find('.hp-loss-wrap')[2].classList.add('hp-loss-hud-disabled');
html.find('.hp-loss-wrap')[0].classList.remove('hp-loss-hud-active');
html.find('.hp-loss-wrap')[0].classList.add('hp-loss-hud-disabled');
html.find('.hp-loss-wrap')[1].classList.remove('hp-loss-hud-active');
html.find('.hp-loss-wrap')[1].classList.add('hp-loss-hud-disabled');
html.find('.hp-loss-wrap')[2].classList.remove('hp-loss-hud-active');
html.find('.hp-loss-wrap')[2].classList.add('hp-loss-hud-disabled');
}
})
})

Binary file not shown.

Binary file not shown.

View File

@ -1 +1 @@
MANIFEST-000368
MANIFEST-000281

View File

@ -1,8 +1,8 @@
2025/06/05-15:50:28.883020 7ff25bfff6c0 Recovering log #366
2025/06/05-15:50:28.892731 7ff25bfff6c0 Delete type=3 #364
2025/06/05-15:50:28.892781 7ff25bfff6c0 Delete type=0 #366
2025/06/05-16:13:09.126587 7ff25a3ff6c0 Level-0 table #371: started
2025/06/05-16:13:09.126654 7ff25a3ff6c0 Level-0 table #371: 0 bytes OK
2025/06/05-16:13:09.133473 7ff25a3ff6c0 Delete type=0 #369
2025/06/05-16:13:09.133695 7ff25a3ff6c0 Manual compaction at level-0 from '!folders!ATr9wZhg5uTVTksM' @ 72057594037927935 : 1 .. '!items!zw9RQocTdz3HRjZK' @ 0 : 0; will stop at (end)
2025/06/05-16:13:09.133722 7ff25a3ff6c0 Manual compaction at level-1 from '!folders!ATr9wZhg5uTVTksM' @ 72057594037927935 : 1 .. '!items!zw9RQocTdz3HRjZK' @ 0 : 0; will stop at (end)
2025/05/02-18:08:30.093606 7fc4edbfa6c0 Recovering log #279
2025/05/02-18:08:30.104455 7fc4edbfa6c0 Delete type=3 #277
2025/05/02-18:08:30.104565 7fc4edbfa6c0 Delete type=0 #279
2025/05/02-18:21:55.109498 7fc4e73ff6c0 Level-0 table #284: started
2025/05/02-18:21:55.109535 7fc4e73ff6c0 Level-0 table #284: 0 bytes OK
2025/05/02-18:21:55.116187 7fc4e73ff6c0 Delete type=0 #282
2025/05/02-18:21:55.129360 7fc4e73ff6c0 Manual compaction at level-0 from '!folders!ATr9wZhg5uTVTksM' @ 72057594037927935 : 1 .. '!items!znm6T1ef4qQI8BX7' @ 0 : 0; will stop at (end)
2025/05/02-18:21:55.129430 7fc4e73ff6c0 Manual compaction at level-1 from '!folders!ATr9wZhg5uTVTksM' @ 72057594037927935 : 1 .. '!items!znm6T1ef4qQI8BX7' @ 0 : 0; will stop at (end)

View File

@ -1,8 +1,8 @@
2025/06/05-15:38:54.440152 7ff2609fa6c0 Recovering log #362
2025/06/05-15:38:54.499643 7ff2609fa6c0 Delete type=3 #360
2025/06/05-15:38:54.499716 7ff2609fa6c0 Delete type=0 #362
2025/06/05-15:45:21.522661 7ff25a3ff6c0 Level-0 table #367: started
2025/06/05-15:45:21.522692 7ff25a3ff6c0 Level-0 table #367: 0 bytes OK
2025/06/05-15:45:21.550994 7ff25a3ff6c0 Delete type=0 #365
2025/06/05-15:45:21.618228 7ff25a3ff6c0 Manual compaction at level-0 from '!folders!ATr9wZhg5uTVTksM' @ 72057594037927935 : 1 .. '!items!zw9RQocTdz3HRjZK' @ 0 : 0; will stop at (end)
2025/06/05-15:45:21.618272 7ff25a3ff6c0 Manual compaction at level-1 from '!folders!ATr9wZhg5uTVTksM' @ 72057594037927935 : 1 .. '!items!zw9RQocTdz3HRjZK' @ 0 : 0; will stop at (end)
2025/04/28-21:05:33.969865 7fa7f49f96c0 Recovering log #275
2025/04/28-21:05:33.982957 7fa7f49f96c0 Delete type=3 #273
2025/04/28-21:05:33.983066 7fa7f49f96c0 Delete type=0 #275
2025/04/29-00:08:44.421059 7fa7eebff6c0 Level-0 table #280: started
2025/04/29-00:08:44.421086 7fa7eebff6c0 Level-0 table #280: 0 bytes OK
2025/04/29-00:08:44.492658 7fa7eebff6c0 Delete type=0 #278
2025/04/29-00:08:44.570180 7fa7eebff6c0 Manual compaction at level-0 from '!folders!ATr9wZhg5uTVTksM' @ 72057594037927935 : 1 .. '!items!znm6T1ef4qQI8BX7' @ 0 : 0; will stop at (end)
2025/04/29-00:08:44.570235 7fa7eebff6c0 Manual compaction at level-1 from '!folders!ATr9wZhg5uTVTksM' @ 72057594037927935 : 1 .. '!items!znm6T1ef4qQI8BX7' @ 0 : 0; will stop at (end)

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -1 +1 @@
MANIFEST-000367
MANIFEST-000280

View File

@ -1,8 +1,8 @@
2025/06/05-15:50:28.899788 7ff25affd6c0 Recovering log #365
2025/06/05-15:50:28.910099 7ff25affd6c0 Delete type=3 #363
2025/06/05-15:50:28.910166 7ff25affd6c0 Delete type=0 #365
2025/06/05-16:13:09.075458 7ff25a3ff6c0 Level-0 table #370: started
2025/06/05-16:13:09.075508 7ff25a3ff6c0 Level-0 table #370: 0 bytes OK
2025/06/05-16:13:09.082149 7ff25a3ff6c0 Delete type=0 #368
2025/06/05-16:13:09.102903 7ff25a3ff6c0 Manual compaction at level-0 from '!folders!yPWGvxHJbDNHVSnY' @ 72057594037927935 : 1 .. '!items!zjvGljrLk5SshC9D' @ 0 : 0; will stop at (end)
2025/06/05-16:13:09.102950 7ff25a3ff6c0 Manual compaction at level-1 from '!folders!yPWGvxHJbDNHVSnY' @ 72057594037927935 : 1 .. '!items!zjvGljrLk5SshC9D' @ 0 : 0; will stop at (end)
2025/05/02-18:08:30.109165 7fc4ecbf86c0 Recovering log #278
2025/05/02-18:08:30.121216 7fc4ecbf86c0 Delete type=3 #276
2025/05/02-18:08:30.121310 7fc4ecbf86c0 Delete type=0 #278
2025/05/02-18:21:55.122892 7fc4e73ff6c0 Level-0 table #283: started
2025/05/02-18:21:55.122930 7fc4e73ff6c0 Level-0 table #283: 0 bytes OK
2025/05/02-18:21:55.129027 7fc4e73ff6c0 Delete type=0 #281
2025/05/02-18:21:55.129407 7fc4e73ff6c0 Manual compaction at level-0 from '!folders!yPWGvxHJbDNHVSnY' @ 72057594037927935 : 1 .. '!items!zjvGljrLk5SshC9D' @ 0 : 0; will stop at (end)
2025/05/02-18:21:55.129496 7fc4e73ff6c0 Manual compaction at level-1 from '!folders!yPWGvxHJbDNHVSnY' @ 72057594037927935 : 1 .. '!items!zjvGljrLk5SshC9D' @ 0 : 0; will stop at (end)

View File

@ -1,8 +1,8 @@
2025/06/05-15:38:54.508921 7ff25bfff6c0 Recovering log #361
2025/06/05-15:38:54.560400 7ff25bfff6c0 Delete type=3 #359
2025/06/05-15:38:54.560496 7ff25bfff6c0 Delete type=0 #361
2025/06/05-15:45:21.580332 7ff25a3ff6c0 Level-0 table #366: started
2025/06/05-15:45:21.580366 7ff25a3ff6c0 Level-0 table #366: 0 bytes OK
2025/06/05-15:45:21.618059 7ff25a3ff6c0 Delete type=0 #364
2025/06/05-15:45:21.618252 7ff25a3ff6c0 Manual compaction at level-0 from '!folders!yPWGvxHJbDNHVSnY' @ 72057594037927935 : 1 .. '!items!zjvGljrLk5SshC9D' @ 0 : 0; will stop at (end)
2025/06/05-15:45:21.618291 7ff25a3ff6c0 Manual compaction at level-1 from '!folders!yPWGvxHJbDNHVSnY' @ 72057594037927935 : 1 .. '!items!zjvGljrLk5SshC9D' @ 0 : 0; will stop at (end)
2025/04/28-21:05:33.988908 7fa7ef7fe6c0 Recovering log #274
2025/04/28-21:05:34.005200 7fa7ef7fe6c0 Delete type=3 #272
2025/04/28-21:05:34.005349 7fa7ef7fe6c0 Delete type=0 #274
2025/04/29-00:08:44.365001 7fa7eebff6c0 Level-0 table #279: started
2025/04/29-00:08:44.365047 7fa7eebff6c0 Level-0 table #279: 0 bytes OK
2025/04/29-00:08:44.420965 7fa7eebff6c0 Delete type=0 #277
2025/04/29-00:08:44.570160 7fa7eebff6c0 Manual compaction at level-0 from '!folders!yPWGvxHJbDNHVSnY' @ 72057594037927935 : 1 .. '!items!zjvGljrLk5SshC9D' @ 0 : 0; will stop at (end)
2025/04/29-00:08:44.570222 7fa7eebff6c0 Manual compaction at level-1 from '!folders!yPWGvxHJbDNHVSnY' @ 72057594037927935 : 1 .. '!items!zjvGljrLk5SshC9D' @ 0 : 0; will stop at (end)

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -1 +1 @@
MANIFEST-000367
MANIFEST-000280

View File

@ -1,8 +1,8 @@
2025/06/05-15:50:28.868698 7ff2609fa6c0 Recovering log #365
2025/06/05-15:50:28.879202 7ff2609fa6c0 Delete type=3 #363
2025/06/05-15:50:28.879260 7ff2609fa6c0 Delete type=0 #365
2025/06/05-16:13:09.089330 7ff25a3ff6c0 Level-0 table #370: started
2025/06/05-16:13:09.089359 7ff25a3ff6c0 Level-0 table #370: 0 bytes OK
2025/06/05-16:13:09.096545 7ff25a3ff6c0 Delete type=0 #368
2025/06/05-16:13:09.102932 7ff25a3ff6c0 Manual compaction at level-0 from '!folders!7j8H7DbmBb9Uza2X' @ 72057594037927935 : 1 .. '!items!zt8s7564ep1La4XQ' @ 0 : 0; will stop at (end)
2025/06/05-16:13:09.102971 7ff25a3ff6c0 Manual compaction at level-1 from '!folders!7j8H7DbmBb9Uza2X' @ 72057594037927935 : 1 .. '!items!zt8s7564ep1La4XQ' @ 0 : 0; will stop at (end)
2025/05/02-18:08:30.076028 7fc4edbfa6c0 Recovering log #278
2025/05/02-18:08:30.087953 7fc4edbfa6c0 Delete type=3 #276
2025/05/02-18:08:30.088039 7fc4edbfa6c0 Delete type=0 #278
2025/05/02-18:21:55.116367 7fc4e73ff6c0 Level-0 table #283: started
2025/05/02-18:21:55.116408 7fc4e73ff6c0 Level-0 table #283: 0 bytes OK
2025/05/02-18:21:55.122719 7fc4e73ff6c0 Delete type=0 #281
2025/05/02-18:21:55.129386 7fc4e73ff6c0 Manual compaction at level-0 from '!folders!7j8H7DbmBb9Uza2X' @ 72057594037927935 : 1 .. '!items!zt8s7564ep1La4XQ' @ 0 : 0; will stop at (end)
2025/05/02-18:21:55.129477 7fc4e73ff6c0 Manual compaction at level-1 from '!folders!7j8H7DbmBb9Uza2X' @ 72057594037927935 : 1 .. '!items!zt8s7564ep1La4XQ' @ 0 : 0; will stop at (end)

View File

@ -1,8 +1,8 @@
2025/06/05-15:38:54.356422 7ff25b7fe6c0 Recovering log #361
2025/06/05-15:38:54.437204 7ff25b7fe6c0 Delete type=3 #359
2025/06/05-15:38:54.437267 7ff25b7fe6c0 Delete type=0 #361
2025/06/05-15:45:21.482142 7ff25a3ff6c0 Level-0 table #366: started
2025/06/05-15:45:21.482216 7ff25a3ff6c0 Level-0 table #366: 0 bytes OK
2025/06/05-15:45:21.522507 7ff25a3ff6c0 Delete type=0 #364
2025/06/05-15:45:21.618214 7ff25a3ff6c0 Manual compaction at level-0 from '!folders!7j8H7DbmBb9Uza2X' @ 72057594037927935 : 1 .. '!items!zt8s7564ep1La4XQ' @ 0 : 0; will stop at (end)
2025/06/05-15:45:21.618263 7ff25a3ff6c0 Manual compaction at level-1 from '!folders!7j8H7DbmBb9Uza2X' @ 72057594037927935 : 1 .. '!items!zt8s7564ep1La4XQ' @ 0 : 0; will stop at (end)
2025/04/28-21:05:33.953840 7fa7effff6c0 Recovering log #274
2025/04/28-21:05:33.964089 7fa7effff6c0 Delete type=3 #272
2025/04/28-21:05:33.964167 7fa7effff6c0 Delete type=0 #274
2025/04/29-00:08:44.318603 7fa7eebff6c0 Level-0 table #279: started
2025/04/29-00:08:44.318649 7fa7eebff6c0 Level-0 table #279: 0 bytes OK
2025/04/29-00:08:44.364829 7fa7eebff6c0 Delete type=0 #277
2025/04/29-00:08:44.570130 7fa7eebff6c0 Manual compaction at level-0 from '!folders!7j8H7DbmBb9Uza2X' @ 72057594037927935 : 1 .. '!items!zt8s7564ep1La4XQ' @ 0 : 0; will stop at (end)
2025/04/29-00:08:44.570209 7fa7eebff6c0 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 +0,0 @@
MANIFEST-000067

View File

@ -1,8 +0,0 @@
2025/06/05-15:50:28.926119 7ff2609fa6c0 Recovering log #65
2025/06/05-15:50:28.936828 7ff2609fa6c0 Delete type=3 #63
2025/06/05-15:50:28.936884 7ff2609fa6c0 Delete type=0 #65
2025/06/05-16:13:09.082352 7ff25a3ff6c0 Level-0 table #70: started
2025/06/05-16:13:09.082382 7ff25a3ff6c0 Level-0 table #70: 0 bytes OK
2025/06/05-16:13:09.089177 7ff25a3ff6c0 Delete type=0 #68
2025/06/05-16:13:09.102923 7ff25a3ff6c0 Manual compaction at level-0 from '!folders!37mu4dxsSuftlnmP' @ 72057594037927935 : 1 .. '!items!zKOpU34oLziGJW6y' @ 0 : 0; will stop at (end)
2025/06/05-16:13:09.102957 7ff25a3ff6c0 Manual compaction at level-1 from '!folders!37mu4dxsSuftlnmP' @ 72057594037927935 : 1 .. '!items!zKOpU34oLziGJW6y' @ 0 : 0; will stop at (end)

View File

@ -1,8 +0,0 @@
2025/06/05-15:38:54.623832 7ff25affd6c0 Recovering log #61
2025/06/05-15:38:54.686829 7ff25affd6c0 Delete type=3 #59
2025/06/05-15:38:54.686886 7ff25affd6c0 Delete type=0 #61
2025/06/05-15:45:21.746826 7ff25a3ff6c0 Level-0 table #66: started
2025/06/05-15:45:21.746885 7ff25a3ff6c0 Level-0 table #66: 0 bytes OK
2025/06/05-15:45:21.784562 7ff25a3ff6c0 Delete type=0 #64
2025/06/05-15:45:21.784803 7ff25a3ff6c0 Manual compaction at level-0 from '!folders!37mu4dxsSuftlnmP' @ 72057594037927935 : 1 .. '!items!zKOpU34oLziGJW6y' @ 0 : 0; will stop at (end)
2025/06/05-15:45:21.839859 7ff25a3ff6c0 Manual compaction at level-1 from '!folders!37mu4dxsSuftlnmP' @ 72057594037927935 : 1 .. '!items!zKOpU34oLziGJW6y' @ 0 : 0; will stop at (end)

Binary file not shown.

View File

@ -1 +1 @@
MANIFEST-000367
MANIFEST-000280

View File

@ -1,8 +1,8 @@
2025/06/05-15:50:28.913563 7ff25b7fe6c0 Recovering log #365
2025/06/05-15:50:28.923236 7ff25b7fe6c0 Delete type=3 #363
2025/06/05-15:50:28.923301 7ff25b7fe6c0 Delete type=0 #365
2025/06/05-16:13:09.096673 7ff25a3ff6c0 Level-0 table #370: started
2025/06/05-16:13:09.096704 7ff25a3ff6c0 Level-0 table #370: 0 bytes OK
2025/06/05-16:13:09.102790 7ff25a3ff6c0 Delete type=0 #368
2025/06/05-16:13:09.102942 7ff25a3ff6c0 Manual compaction at level-0 from '!folders!mnO9OzE7BEE2KDfh' @ 72057594037927935 : 1 .. '!items!zkK6ixtCsCw3RH9X' @ 0 : 0; will stop at (end)
2025/06/05-16:13:09.102964 7ff25a3ff6c0 Manual compaction at level-1 from '!folders!mnO9OzE7BEE2KDfh' @ 72057594037927935 : 1 .. '!items!zkK6ixtCsCw3RH9X' @ 0 : 0; will stop at (end)
2025/05/02-18:08:30.126416 7fc4e7fff6c0 Recovering log #278
2025/05/02-18:08:30.137455 7fc4e7fff6c0 Delete type=3 #276
2025/05/02-18:08:30.137553 7fc4e7fff6c0 Delete type=0 #278
2025/05/02-18:21:55.102804 7fc4e73ff6c0 Level-0 table #283: started
2025/05/02-18:21:55.102870 7fc4e73ff6c0 Level-0 table #283: 0 bytes OK
2025/05/02-18:21:55.109338 7fc4e73ff6c0 Delete type=0 #281
2025/05/02-18:21:55.129316 7fc4e73ff6c0 Manual compaction at level-0 from '!folders!mnO9OzE7BEE2KDfh' @ 72057594037927935 : 1 .. '!items!zkK6ixtCsCw3RH9X' @ 0 : 0; will stop at (end)
2025/05/02-18:21:55.129455 7fc4e73ff6c0 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/06/05-15:38:54.562778 7ff25b7fe6c0 Recovering log #361
2025/06/05-15:38:54.621024 7ff25b7fe6c0 Delete type=3 #359
2025/06/05-15:38:54.621100 7ff25b7fe6c0 Delete type=0 #361
2025/06/05-15:45:21.551139 7ff25a3ff6c0 Level-0 table #366: started
2025/06/05-15:45:21.551169 7ff25a3ff6c0 Level-0 table #366: 0 bytes OK
2025/06/05-15:45:21.580145 7ff25a3ff6c0 Delete type=0 #364
2025/06/05-15:45:21.618241 7ff25a3ff6c0 Manual compaction at level-0 from '!folders!mnO9OzE7BEE2KDfh' @ 72057594037927935 : 1 .. '!items!zkK6ixtCsCw3RH9X' @ 0 : 0; will stop at (end)
2025/06/05-15:45:21.618280 7ff25a3ff6c0 Manual compaction at level-1 from '!folders!mnO9OzE7BEE2KDfh' @ 72057594037927935 : 1 .. '!items!zkK6ixtCsCw3RH9X' @ 0 : 0; will stop at (end)
2025/04/28-21:05:34.008354 7fa7f51fa6c0 Recovering log #274
2025/04/28-21:05:34.023701 7fa7f51fa6c0 Delete type=3 #272
2025/04/28-21:05:34.023772 7fa7f51fa6c0 Delete type=0 #274
2025/04/29-00:08:44.492763 7fa7eebff6c0 Level-0 table #279: started
2025/04/29-00:08:44.492793 7fa7eebff6c0 Level-0 table #279: 0 bytes OK
2025/04/29-00:08:44.569850 7fa7eebff6c0 Delete type=0 #277
2025/04/29-00:08:44.570197 7fa7eebff6c0 Manual compaction at level-0 from '!folders!mnO9OzE7BEE2KDfh' @ 72057594037927935 : 1 .. '!items!zkK6ixtCsCw3RH9X' @ 0 : 0; will stop at (end)
2025/04/29-00:08:44.570247 7fa7eebff6c0 Manual compaction at level-1 from '!folders!mnO9OzE7BEE2KDfh' @ 72057594037927935 : 1 .. '!items!zkK6ixtCsCw3RH9X' @ 0 : 0; will stop at (end)

Binary file not shown.

View File

@ -4,7 +4,6 @@
overflow: scroll;
}
.character-main {
display: flex;
@ -94,10 +93,6 @@
.character-characteristic {
display: flex;
align-items: center;
span {
min-width: 2.2rem;
max-width: 2.2rem;
}
.rollable:hover,
.rollable:focus {
text-shadow: 0 0 8px var(--color-shadow-primary);
@ -223,7 +218,7 @@
}
}
.tab.character-biography .main-div{
.tab.character-biography {
.biodata {
display: grid;
grid-template-columns: repeat(4, 1fr);
@ -253,7 +248,7 @@
}
}
.tab.character-skills .main-div{
.tab.character-skills {
display: grid;
grid-template-columns: 1fr;
legend {
@ -315,7 +310,7 @@
}
}
.tab.character-equipment .main-div {
.tab.character-equipment {
display: grid;
grid-template-columns: 1fr;
legend {
@ -354,7 +349,7 @@
}
}
.tab.character-combat .main-div {
.tab.character-combat {
display: grid;
grid-template-columns: 1fr;
legend {
@ -502,7 +497,7 @@
}
.tab.character-spells .main-div {
.tab.character-spells {
display: grid;
grid-template-columns: 1fr;
legend {
@ -563,7 +558,7 @@
}
}
.tab.character-miracles .main-div {
.tab.character-miracles {
display: grid;
grid-template-columns: 1fr;
legend {

View File

@ -5,5 +5,6 @@
@font-face {
font-family: "BaskervilleBold";
src: url("../assets/fonts/baskerville-bold.ttf") format("truetype");
src: url("../fonts/baskerville-bold.ttf") format("truetype");
}

View File

@ -6,17 +6,6 @@
--logo-standard: url("../assets/ui/lf_logo_small_02.webp");
}
.initiative-area {
min-width: 8rem;
max-width: 8rem;
display: flex;
flex-direction: row;
input {
min-width: 3rem;
max-width: 3rem;
}
}
#logo {
content: var(--logo-standard);
width: 50px;

View File

@ -35,10 +35,9 @@
padding-bottom: 0;
width: max-content;
margin: 0;
color:#252424;
}
#token-hud .hp-loss-wrap .hud-loss-hp-button-select {
padding-left: 8px;
font-size: 0.9rem;
font-size: 0.7rem;
}

View File

@ -6,14 +6,6 @@
background-repeat: no-repeat;
background-size: 100% 100%;
nav.tabs [data-tab] {
color: #636060;
}
nav.tabs [data-tab].active {
color: #252424;
}
input:disabled,
select:disabled {
background-color: rgba(0, 0, 0, 0.2);
@ -47,11 +39,11 @@
input,
select {
text-align: center;
font-size: calc(var(--font-size-standard) * 1);
font-size: calc(var(--font-size-standard) * 1.0);
}
select {
font-family: var(--font-secondary);
font-size: calc(var(--font-size-standard) * 1);
font-size: calc(var(--font-size-standard) * 1.0);
}
}
@ -75,33 +67,9 @@
padding-top: 4px;
}
overflow: auto;
.form-group {
display: flex;
flex: 1;
flex-direction: row;
label {
align-content: center;
min-width: 10rem;
max-width: 10rem;
}
select,
input {
text-align: left;
min-width: 12rem;
max-width: 12rem;
}
input[type="checkbox"] {
min-width: 1.2rem;
max-width: 1.2rem;
margin-right: 0.5rem;
}
}
label {
font-family: var(--font-secondary);
font-size: calc(var(--font-size-standard) * 1);
font-size: calc(var(--font-size-standard) * 1.0);
flex: 50%;
}
@ -109,6 +77,10 @@
align-self: flex-start;
padding: 0.1rem;
margin-right: 0.2rem;
/*border-color: black;
border-width: 1px;
border-style: solid;
border-radius: 2%;*/
}
.shift-right {

View File

@ -99,10 +99,6 @@
text-shadow: 0 0 8px var(--color-shadow-primary);
cursor: pointer;
}
span {
min-width: 2.2rem;
max-width: 2.2rem;
}
.form-group {
flex: 1;
padding-left: 4px;
@ -227,7 +223,7 @@
}
}
.tab.monster-biography .main-div {
.tab.monster-biography {
.biodata {
display: grid;
grid-template-columns: repeat(4, 1fr);
@ -252,7 +248,7 @@
}
}
.tab.monster-skills .main-div{
.tab.monster-skills {
display: grid;
grid-template-columns: 1fr;
legend {
@ -466,3 +462,4 @@
min-height: 150px;
}
}

View File

@ -6,7 +6,7 @@
"download": "#{DOWNLOAD}#",
"url": "#{URL}#",
"license": "LICENSE",
"version": "13.0.0",
"version": "12.0.35",
"authors": [
{
"name": "Uberwald",
@ -14,8 +14,8 @@
}
],
"compatibility": {
"minimum": "13",
"verified": "13"
"minimum": "12",
"verified": "12"
},
"esmodules": ["lethal-fantasy.mjs"],
"styles": ["css/fvtt-lethal-fantasy.css"],
@ -82,14 +82,6 @@
"system": "fvtt-lethal-fantasy",
"path": "packs-system/lf-vulnerabilities",
"type": "Item"
},
{
"name": "lf-spells-miracles",
"banner": "",
"label": "Spells & Miracles",
"system": "fvtt-lethal-fantasy",
"path": "packs-system/lf-spells-miracles",
"type": "Item"
}
],
"flags": {

View File

@ -1,5 +1,4 @@
<section class="tab character-{{tab.id}} {{tab.cssClass}}" data-tab="{{tab.id}}" data-group="{{tab.group}}">
<div class="main-div">
<fieldset>
<legend>{{localize "LETHALFANTASY.Label.biodata"}}</legend>
@ -93,5 +92,5 @@
<legend>{{localize "LETHALFANTASY.Label.notes"}}</legend>
{{formInput systemFields.notes enriched=enrichedNotes value=system.notes name="system.notes" toggled=true}}
</fieldset>
</div>
</section>

View File

@ -1,5 +1,4 @@
<section class="tab character-{{tab.id}} {{tab.cssClass}}" data-tab="combat" data-group="sheet">
<div class="main-div">
<section class="tab character-{{tab.id}} {{tab.cssClass}}" data-tab="{{tab.id}}" data-group="{{tab.group}}">
<fieldset>
<legend>{{localize "LETHALFANTASY.Label.combatDetails"}}</legend>
@ -156,6 +155,5 @@
{{/each}}
</div>
</fieldset>
<div>
</section>

View File

@ -1,5 +1,4 @@
<section class="tab character-{{tab.id}} {{tab.cssClass}}" data-tab="{{tab.id}}" data-group="{{tab.group}}">
<div class="main-div">
<fieldset>
<legend>{{localize "LETHALFANTASY.Label.money"}}</legend>
@ -32,5 +31,5 @@
</div>
</fieldset>
</div>
</section>

View File

@ -174,14 +174,14 @@
<fieldset class="character-characteristics character-characteristics-{{ifThen isPlayMode 'play' 'edit'}}">
<legend>{{localize "LETHALFANTASY.Label.characteristics"}}</legend>
<div class="character-characteristic">
<span>{{localize "LETHALFANTASY.Label.str"}}</span>
{{localize "LETHALFANTASY.Label.str"}}
{{formField systemFields.characteristics.fields.str.fields.value value=system.characteristics.str.value
disabled=isPlayMode data-char-id="str" }}
{{formField systemFields.characteristics.fields.str.fields.percent value=system.characteristics.str.percent
disabled=isPlayMode type="number"}}
</div>
<div class="character-characteristic">
<span>{{localize "LETHALFANTASY.Label.int"}}</span>
{{localize "LETHALFANTASY.Label.int"}}
{{formField systemFields.characteristics.fields.int.fields.value value=system.characteristics.int.value
disabled=isPlayMode data-char-id="int" }}
@ -189,7 +189,7 @@
disabled=isPlayMode type="number" }}
</div>
<div class="character-characteristic">
<span>{{localize "LETHALFANTASY.Label.wis"}}</span>
{{localize "LETHALFANTASY.Label.wis"}}
{{formField systemFields.characteristics.fields.wis.fields.value value=system.characteristics.wis.value
disabled=isPlayMode data-char-id="wis" }}
@ -197,7 +197,7 @@
disabled=isPlayMode type="number"}}
</div>
<div class="character-characteristic">
<span>{{localize "LETHALFANTASY.Label.dex"}}</span>
{{localize "LETHALFANTASY.Label.dex"}}
{{formField systemFields.characteristics.fields.dex.fields.value value=system.characteristics.dex.value
disabled=isPlayMode data-char-id="wis" }}
@ -205,7 +205,7 @@
disabled=isPlayMode type="number" }}
</div>
<div class="character-characteristic">
<span>{{localize "LETHALFANTASY.Label.con"}}</span>
{{localize "LETHALFANTASY.Label.con"}}
{{formField systemFields.characteristics.fields.con.fields.value value=system.characteristics.con.value
disabled=isPlayMode data-char-id="con" }}
@ -213,7 +213,7 @@
disabled=isPlayMode type="number"}}
</div>
<div class="character-characteristic">
<span>{{localize "LETHALFANTASY.Label.cha"}}</span>
{{localize "LETHALFANTASY.Label.cha"}}
{{formField systemFields.characteristics.fields.cha.fields.value value=system.characteristics.cha.value
disabled=isPlayMode data-char-id="cha" }}
@ -221,7 +221,7 @@
disabled=isPlayMode type="number"}}
</div>
<div class="character-characteristic">
<span>{{localize "LETHALFANTASY.Label.luc"}}</span>
{{localize "LETHALFANTASY.Label.luc"}}
{{formField systemFields.characteristics.fields.luc.fields.value value=system.characteristics.luc.value
disabled=isPlayMode data-char-id="luc" }}
@ -229,7 +229,7 @@
disabled=isPlayMode type="number"}}
</div>
<div class="character-characteristic">
<span>{{localize "LETHALFANTASY.Label.app"}}</span>
{{localize "LETHALFANTASY.Label.app"}}
{{formField systemFields.characteristics.fields.app.fields.value value=system.characteristics.app.value
disabled=isPlayMode data-char-id="app" }}

View File

@ -1,5 +1,4 @@
<section class="tab character-{{tab.id}} {{tab.cssClass}}" data-tab="{{tab.id}}" data-group="{{tab.group}}">
<div class="main-div">
<fieldset>
<legend>{{localize "LETHALFANTASY.Label.divinityPoints"}}</legend>
@ -47,6 +46,5 @@
{{/each}}
</div>
</fieldset>
</div>
</section>

View File

@ -1,5 +1,4 @@
<section class="tab character-{{tab.id}} {{tab.cssClass}}" data-tab="skills" data-group="sheet">
<div class="main-div">
<section class="tab character-{{tab.id}} {{tab.cssClass}}" data-tab="{{tab.id}}" data-group="{{tab.group}}">
<fieldset>
<legend data-tooltip="{{localize " LETHALFANTASY.Tooltip.skills"}}" data-tooltip-direction="UP">{{localize
@ -69,5 +68,5 @@
{{/each}}
</div>
</fieldset>
</div>
</section>

View File

@ -1,5 +1,4 @@
<section class="tab character-{{tab.id}} {{tab.cssClass}}" data-tab="{{tab.id}}" data-group="{{tab.group}}">
<div class="main-div">
<fieldset>
<legend>{{localize "LETHALFANTASY.Label.aetherPoints"}}</legend>
@ -11,8 +10,7 @@
<a data-action="aetherPointsMinus"><i class="fa-solid fa-hexagon-minus"></i></a>
<span >Max</span>
{{formField systemFields.aetherPoints.fields.max value=system.aetherPoints.max localize=true
disabled=isPlayMode}}
{{formField systemFields.aetherPoints.fields.max value=system.aetherPoints.max localize=true disabled=isPlayMode}}
</div>
</div>
</div>
@ -48,5 +46,5 @@
{{/each}}
</div>
</fieldset>
</div>
</section>

View File

@ -6,7 +6,7 @@
</div>
<div class="intro-right">
<span>{{actingCharName}} - {{upperFirst rollName}}</span>
<span>{{upperFirst rollName}}</span>
{{#if (match rollType "attack")}}
<span>Attack roll !</span>

View File

@ -18,7 +18,7 @@
<fieldSet>
<legend>{{localize "LETHALFANTASY.Roll.visibility"}}</legend>
<select name="visibility">
{{selectOptions rollModes selected=visibility localize=true}}
{{selectOptions rollModes selected=visibility}}
</select>
</fieldSet>

View File

@ -1,39 +0,0 @@
<nav class="combat-controls" data-tooltip-direction="UP">
{{~#if hasCombat~}}
{{!-- GM Controls --}}
{{#if user.isGM}}
{{#if combat.round}}
<!-- <button type="button" class="inline-control combat-control icon fa-solid fa-backward-step"
data-action="previousRound" data-tooltip aria-label="{{ localize "COMBAT.RoundPrev" }}"></button>
<button type="button" class="inline-control combat-control icon fa-solid fa-arrow-left" data-action="previousTurn"
data-tooltip aria-label="{{ localize "COMBAT.TurnPrev" }}"></button> -->
<button type="button" class="combat-control combat-control-lg" data-action="endCombat">
<i class="fa-solid fa-xmark" inert></i>
<span>{{ localize "COMBAT.End" }}</span>
</button>
<!-- <button type="button" class="inline-control combat-control icon fa-solid fa-arrow-right" data-action="nextTurn"
data-tooltip aria-label="{{ localize "COMBAT.TurnNext" }}"></button> -->
<button type="button" class="inline-control combat-control icon fa-solid fa-forward-step" data-action="nextRound"
data-tooltip aria-label="{{ localize "COMBAT.RoundNext" }}"></button>
{{else}}
<button type="button" class="combat-control combat-control-lg" data-action="startCombat">
<i class="fa-solid fa-swords" inert></i>
<span>{{ localize "COMBAT.Begin" }}</span>
</button>
{{/if}}
{{!-- Active Player Controls --}}
{{else if control}}
<!-- <button type="button" class="inline-control combat-control icon fa-solid fa-arrow-left" data-action="previousTurn"
data-tooltip aria-label="{{ localize "COMBAT.TurnPrev" }}"></button>
<button type="button" class="combat-control combat-control-lg" data-action="nextTurn">
<i class="fa-solid fa-check"></i>
<span>{{ localize "COMBAT.TurnEnd" }}</span>
</button>
<button type="button" class="inline-control combat-control icon fa-solid fa-arrow-right" data-action="nextTurn"
data-tooltip aria-label="{{ localize "COMBAT.TurnNext" }}"></button> -->
{{/if}}
{{/if}}
</nav>

View File

@ -1,92 +0,0 @@
<header class="combat-tracker-header">
{{!-- Encounter Controls --}}
{{#if user.isGM}}
<nav class="encounters {{ css }}" aria-label="{{ localize "COMBAT.NavLabel" }}">
{{!-- Cycle Display --}}
{{#if displayCycle}}
<button type="button" class="inline-control icon fa-solid fa-plus" data-action="createCombat"
data-tooltip aria-label="{{ localize "COMBAT.Create" }}"></button>
<div class="cycle-combats">
<button type="button" class="inline-control icon fa-solid fa-caret-left" data-action="cycleCombat"
{{#if previousId}}data-combat-id="{{ previousId }}" {{else}}disabled{{/if}}
data-tooltip aria-label="{{ localize "COMBAT.EncounterPrevious" }}"></button>
<div class="encounter-count">
<span class="value">{{ currentIndex }}</span>
<span class="separator">&sol;</span>
<span class="max">{{ combats.length }}</span>
</div>
<button type="button" class="inline-control icon fa-solid fa-caret-right" data-action="cycleCombat"
{{#if nextId}}data-combat-id="{{ nextId }}" {{else}}disabled{{/if}}
data-tooltip aria-label="{{ localize "COMBAT.EncounterNext" }}"></button>
</div>
<button type="button" class="inline-control icon fa-solid fa-gear" data-action="trackerSettings"
data-tooltip aria-label="{{ localize "COMBAT.Settings" }}"></button>
{{!-- Tabbed Display --}}
{{else if combats.length}}
<button type="button" class="inline-control icon fa-solid fa-plus" data-action="createCombat"
data-tooltip aria-label="{{ localize "COMBAT.Create" }}"></button>
{{#each combats}}
<button type="button" class="inline-control {{#if active}}active{{/if}}" data-action="cycleCombat"
data-combat-id="{{ id }}">
{{ label }}
</button>
{{/each}}
<button type="button" class="inline-control icon fa-solid fa-gear" data-action="trackerSettings"
data-tooltip aria-label="{{ localize "COMBAT.Settings" }}"></button>
{{!-- No Combats --}}
{{else}}
<button type="button" class="combat-control-lg" data-action="createCombat">
<i class="fa-solid fa-plus" inert></i>
<span>{{ localize "COMBAT.Create" }}</span>
</button>
{{/if}}
</nav>
{{/if}}
<div class="encounter-controls {{#if hasCombat}}combat{{/if}}">
{{!-- Bulk Rolls --}}
<div class="control-buttons left flexrow">
{{#if user.isGM}}
<button type="button" class="inline-control combat-control icon fa-solid fa-users" data-action="rollAll"
{{#unless combat.turns.length}}disabled{{/unless}} data-tooltip="COMBAT.RollAll"
aria-label="{{ localize "COMBAT.RollAll" }}"></button>
<button type="button" class="inline-control combat-control icon fa-solid fa-users-cog" data-action="rollNPC"
{{#unless combat.turns.length}}disabled{{/unless}} data-tooltip="COMBAT.RollNPC"
aria-label="{{ localize "COMBAT.RollNPC" }}"></button>
{{else}}
<div class="spacer"></div>
<div class="spacer"></div>
{{/if}}
</div>
{{!-- Combat Status --}}
<strong class="encounter-title">
{{#if combats.length}}
{{#if combat.round}}
{{ localize "COMBAT.Round" round=combat.round }}
{{else}}
{{ localize "COMBAT.NotStarted" }}
{{/if}}
{{else}}
{{ localize "COMBAT.None" }}
{{/if}}
</strong>
{{!-- Combat Controls --}}
<div class="control-buttons right flexrow">
<div class="spacer"></div>
<button type="button" class="encounter-context-menu inline-control combat-control icon fa-solid fa-ellipsis-vertical"
{{#unless (and user.isGM hasCombat)}}disabled{{/unless}}></button>
</div>
</div>
</header>

View File

@ -1,81 +0,0 @@
<ol class="combat-tracker plain">
{{#each turns}}
<li class="combatant {{ css }}" data-combatant-id="{{ id }}" data-action="activateCombatant">
{{!-- TODO: Targets --}}
{{!-- Image --}}
<img class="token-image" src="{{ img }}" alt="{{ name }}" loading="lazy">
{{!-- Name & Controls --}}
<div class="token-name">
<strong class="name">{{ name }}</strong>
<div class="combatant-controls">
{{#if @root.user.isGM}}
<button type="button" class="inline-control combatant-control icon fa-solid fa-eye-slash {{#if hidden}}active{{/if}}"
data-action="toggleHidden" data-tooltip aria-label="{{ localize "COMBAT.ToggleVis" }}"></button>
<button type="button" class="inline-control combatant-control icon fa-solid fa-skull {{#if isDefeated}}active{{/if}}"
data-action="toggleDefeated" data-tooltip
aria-label="{{ localize "COMBAT.ToggleDead" }}"></button>
{{/if}}
{{#if canPing}}
<button type="button" class="inline-control combatant-control icon fa-solid fa-bullseye-arrow"
data-action="pingCombatant" data-tooltip
aria-label="{{ localize "COMBAT.PingCombatant" }}"></button>
{{/if}}
{{#unless @root.user.isGM}}
<button type="button" class="inline-control combatant-control icon fa-solid fa-arrows-to-eye"
data-action="panToCombatant" data-tooltip
aria-label="{{ localize "COMBAT.PanToCombatant" }}"></button>
{{/unless}}
{{!-- TODO: Target Control --}}
<div class="token-effects" data-tooltip-html="{{ effects.tooltip }}">
{{#each effects.icons}}
<img class="token-effect" src="{{ img }}" alt="{{ name }}">
{{/each}}
</div>
</div>
</div>
{{!-- Resource --}}
{{#if resource includeZero=true}}
<div class="token-resource">
<span class="resource">{{ resource }}</span>
</div>
{{/if}}
{{!-- Initiative --}}
<div class="token-initiative initiative-area">
{{#if initiative includeZero=true}}
{{!-- Decimal Initiative --}}
{{#if @root.hasDecimals}}
<span>{{ initiative }}</span>
{{!-- Simple Initiative --}}
{{else}}
<input type="text" class="initiative-input" inputmode="numeric" pattern="^[+=\-]?\d*" value="{{ initiative }}"
aria-label="{{ localize "COMBAT.InitiativeScore" }}" {{#unless @root.user.isGM}}readonly{{/unless}}>
{{/if}}
{{#if isOwner}}
<a data-action="initiativePlus" class="initiative-plus" data-combatant-id="{{this.id}}"><i class="fa-solid fa-hexagon-plus"></i></a>
<a data-action="initiativeMinus" class="initiative-minus" data-combatant-id="{{this.id}}"><i class="fa-solid fa-hexagon-minus"></i></a>
{{/if}}
{{#if isMonster}}
<span class="initiative">-</span>
{{else}}
<span class="initiative" data-tooltip="Current max. progression counter">{{progressionCount}}</span>
{{/if}}
{{!-- Roll Initiative --}}
{{else if isOwner}}
<button type="button" class="combatant-control roll" data-action="rollInitiative" data-tooltip
aria-label="{{ localize "COMBAT.InitiativeRoll" }}"
style="--initiative-icon: url('{{ @root.initiativeIcon.icon }}'); --initiative-icon-hover: url('{{ @root.initiativeIcon.hover }}');"></button>
{{/if}}
</div>
</li>
{{/each}}
</ol>

View File

@ -157,7 +157,7 @@
<fieldset class="monster-characteristics monster-characteristics-{{ifThen isPlayMode 'play' 'edit'}}">
<legend>{{localize "LETHALFANTASY.Label.characteristics"}}</legend>
<div class="monster-characteristic">
<span>x{{localize "LETHALFANTASY.Label.int"}}</span>
{{localize "LETHALFANTASY.Label.int"}}
{{formField systemFields.characteristics.fields.int.fields.value value=system.characteristics.int.value
disabled=isPlayMode data-char-id="int" }}
@ -165,7 +165,7 @@
disabled=isPlayMode type="number" }}
</div>
<div class="monster-characteristic">
<span>{{localize "LETHALFANTASY.Label.dex"}}</span>
{{localize "LETHALFANTASY.Label.dex"}}
{{formField systemFields.characteristics.fields.dex.fields.value value=system.characteristics.dex.value
disabled=isPlayMode data-char-id="wis" }}

79
templates/opponent.hbs Normal file
View File

@ -0,0 +1,79 @@
<section>
{{!log "opponent sheet" this}}
<div class="opponent-header">
<img class="opponent-img" src="{{actor.img}}" data-edit="img" data-action="editImage" data-tooltip="{{actor.name}}" />
{{formInput fields.name value=source.name}}
<a class="control" data-action="toggleSheet" data-tooltip="TENEBRIS.ToggleSheet" data-tooltip-direction="UP">
<i class="fa-solid fa-user-{{ifThen isPlayMode 'lock' 'pen'}}"></i>
</a>
</div>
<div class="opponent-main">
<div class="opponent-gauche">
<fieldset class="opponent-caracteristiques">
<legend>{{localize "TENEBRIS.Character.Label.caracteristiques"}}</legend>
{{formField systemFields.dv value=system.dv disabled=isPlayMode}}
{{formField systemFields.pv.fields.value value=system.pv.value}}
{{formField systemFields.pv.fields.max value=system.pv.max disabled=isPlayMode}}
{{formField systemFields.armure value=system.armure disabled=isPlayMode}}
{{formField systemFields.malus value=system.malus disabled=isPlayMode}}
{{formField systemFields.actions value=system.actions disabled=isPlayMode}}
</fieldset>
<fieldset class="opponent-attacks">
<legend>{{localize "TENEBRIS.Character.Label.attaques"}}
{{#if isEditMode}}<a class="action" data-tooltip="{{localize 'TENEBRIS.Tooltip.addAttack'}}" data-tooltip-direction="UP"><i
class="fas fa-plus"
data-action="createAttack"
></i></a>{{/if}}</legend>
{{#each attacks as |attack|}}
<div class="opponent-attack" data-drag="true" data-drag-type="attack" data-roll-value="{{attack.system.degats}}" data-roll-target="{{attack.name}}">
<div class="attack-name">
<a
class="rollable"
data-item-id="{{attack.id}}"
data-item-name="{{attack.name}}"
data-action="roll"
data-roll-type="attack"
data-roll-value="{{attack.system.degats}}"
>{{attack.system.degats}}</a>
(<span data-tooltip="{{attack.system.toolTip}}">{{attack.name}}</span>)
</div>
{{#if @root.isEditMode}}
<div class="controls">
<a data-tooltip="{{localize 'TENEBRIS.Edit'}}" data-action="edit" data-item-id="{{attack.id}}" data-item-uuid="{{attack.uuid}}"><i class="fas fa-edit"></i></a>
<a data-tooltip="{{localize 'TENEBRIS.Delete'}}" data-action="delete" data-item-id="{{attack.id}}" data-item-uuid="{{attack.uuid}}"><i class="fas fa-trash"></i></a>
</div>
{{/if}}
</div>
{{/each}}
</fieldset>
{{#if (or isEditMode (and isPlayMode hasSpells))}}
<fieldset class="opponent-spells">
<legend>{{localize "TENEBRIS.Label.spells"}}{{#if isEditMode}}<a class="action" data-tooltip="{{localize "TENEBRIS.Tooltip.addSpell"}}" data-tooltip-direction="UP"><i class="fas fa-plus" data-action="createSpell"></i></a>{{/if}}</legend>
{{#each spells as |spell|}}
<div class="opponent-spell">
<div class="name" data-tooltip="{{{spell.system.description}}}">
{{spell.name}}
</div>
{{#if @root.isEditMode}}
<div class="controls">
<a data-tooltip="{{localize 'TENEBRIS.Edit'}}" data-action="edit" data-item-id="{{spell.id}}" data-item-uuid="{{spell.uuid}}"><i class="fas fa-edit"></i></a>
<a data-tooltip="{{localize 'TENEBRIS.Delete'}}" data-action="delete" data-item-id="{{spell.id}}" data-item-uuid="{{spell.uuid}}"><i class="fas fa-trash"></i></a>
</div>
{{/if}}
</div>
{{/each}}
</fieldset>
{{/if}}
</div>
<div class="opponent-droite">
<fieldset class="opponent-description">
<legend>{{localize "TENEBRIS.Label.description"}}</legend>
{{formInput systemFields.description enriched=enrichedDescription value=system.description name="system.description" toggled=true compact=true}}
</fieldset>
</div>
</div>
</section>

View File

@ -45,7 +45,7 @@
<fieldSet>
<legend>{{localize "LETHALFANTASY.Roll.visibility"}}</legend>
<select name="visibility">
{{selectOptions rollModes selected=visibility localize=true}}
{{selectOptions rollModes selected=visibility}}
</select>
</fieldSet>

View File

@ -90,7 +90,7 @@
<fieldSet>
<legend>{{localize "LETHALFANTASY.Roll.visibility"}}</legend>
<select name="visibility">
{{selectOptions rollModes selected=visibility localize=true}}
{{selectOptions rollModes selected=visibility}}
</select>
</fieldSet>

View File

@ -13,7 +13,7 @@
<fieldSet>
<legend>{{localize "LETHALFANTASY.Roll.visibility"}}</legend>
<select name="visibility">
{{selectOptions rollModes selected=visibility localize=true}}
{{selectOptions rollModes selected=visibility}}
</select>
</fieldSet>

View File

@ -13,7 +13,7 @@
<fieldSet>
<legend>{{localize "LETHALFANTASY.Roll.visibility"}}</legend>
<select name="visibility">
{{selectOptions rollModes selected=visibility localize=true}}
{{selectOptions rollModes selected=visibility}}
</select>
</fieldSet>