Enhance rolls and fix dialog position

This commit is contained in:
LeRatierBretonnien 2025-04-25 21:28:02 +02:00
parent 2ce5088471
commit 791a7d6b67
28 changed files with 122 additions and 249 deletions

View File

@ -1951,6 +1951,18 @@ i.lethalfantasy {
.lethalfantasy-roll-dialog fieldset {
padding: 4px;
}
.lethalfantasy-roll-dialog .goto-token-button {
justify-content: center;
align-items: center;
align-content: center;
margin-left: 0.5rem;
max-width: 8rem;
background-color: var(--color-dark-6);
color: var(--color-dark-2);
border: none;
border-radius: 4px;
padding: 0.5rem;
}
.lethalfantasy-range-defense-dialog {
width: 18rem;
}

View File

@ -281,6 +281,7 @@
}
},
"Label": {
"gotoToken": "Go to token",
"combatAction": "Combat action",
"currentAction": "Current ongoing action",
"selectAction": "Select an action",

View File

@ -223,7 +223,7 @@ export default class LethalFantasyRoll extends Roll {
options.rollTarget.charModifier = options.rollTarget.actorModifiers.intSpellModifier
hasStaticModifier = options.rollType === "spell-power"
//hasModifier = options.rollType !== "spell-attack"
if ( hasStaticModifier ) {
if (hasStaticModifier) {
options.rollTarget.staticModifier = options.rollTarget.actorLevel
} else {
options.rollTarget.staticModifier = 0
@ -240,7 +240,7 @@ export default class LethalFantasyRoll extends Roll {
options.rollTarget.charModifier = options.rollTarget.actorModifiers.chaMiracleModifier
hasStaticModifier = options.rollType === "miracle-power"
//hasModifier = options.rollType !== "miracle-attack"
if ( hasStaticModifier ) {
if (hasStaticModifier) {
options.rollTarget.staticModifier = options.rollTarget.actorLevel
} else {
options.rollTarget.staticModifier = 0
@ -331,16 +331,19 @@ export default class LethalFantasyRoll extends Roll {
}
const content = await renderTemplate("systems/fvtt-lethal-fantasy/templates/roll-dialog.hbs", dialogContext)
const title = LethalFantasyRoll.createTitle(options.rollType, options.rollTarget)
let position = game.user.getFlag(SYSTEM.id, "roll-dialog-pos") || { top: -1, left: -1 }
const label = game.i18n.localize("LETHALFANTASY.Roll.roll")
const rollContext = await foundry.applications.api.DialogV2.wait({
window: { title: title },
window: { title: "Roll dialog" },
classes: ["lethalfantasy"],
content,
position,
buttons: [
{
label: label,
callback: (event, button, dialog) => {
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
return obj
@ -352,6 +355,15 @@ export default class LethalFantasyRoll extends Roll {
actions: {
"selectGranted": (event, button, dialog) => {
hasGrantedDice = true
},
"gotoToken" : (event, button, dialog) => {
let tokenId = $(button).data("tokenId")
let token = canvas.tokens?.get(tokenId)
if (token) {
canvas.animatePan({ x: token.x, y: token.y, duration: 200 })
canvas.tokens.releaseAll();
token.control({ releaseOthers: true });
}
}
},
rejectClose: false // Click on Close button will not launch an error
@ -630,6 +642,8 @@ export default class LethalFantasyRoll extends Roll {
}
let currentAction = combatant.getFlag(SYSTEM.id, "currentAction")
let position = game.user.getFlag(SYSTEM.id, "combat-action-dialog-pos") || { top: -1, left: -1 }
let dialogContext = {
progressionDiceId: "",
fieldRollMode,
@ -647,24 +661,34 @@ export default class LethalFantasyRoll extends Roll {
action: "roll",
label: "Roll progression dice",
callback: (event, button, dialog) => {
let pos = $('#combat-action-dialog').position()
game.user.setFlag(SYSTEM.id, "combat-action-dialog-pos", pos)
return "rollProgressionDice"
},
})
} else if (currentAction.type === "spell" || currentAction.type === "miracle") {
let label = ""
if (currentAction.spellStatus === "castingTime") {
let pos = $('#combat-action-dialog').position()
game.user.setFlag(SYSTEM.id, "combat-action-dialog-pos", pos)
label = "Wait casting time"
}
if (currentAction.spellStatus === "toBeCasted") {
let pos = $('#combat-action-dialog').position()
game.user.setFlag(SYSTEM.id, "combat-action-dialog-pos", pos)
label = "Cast spell/miracle"
}
if (currentAction.spellStatus === "lethargy") {
let pos = $('#combat-action-dialog').position()
game.user.setFlag(SYSTEM.id, "combat-action-dialog-pos", pos)
label = "Roll lethargy dice"
}
buttons.push({
action: "roll",
label: label,
callback: (event, button, dialog) => {
let pos = $('#combat-action-dialog').position()
game.user.setFlag(SYSTEM.id, "combat-action-dialog-pos", foundry.utils.duplicate(pos))
return "rollLethargyDice"
},
})
@ -674,6 +698,8 @@ export default class LethalFantasyRoll extends Roll {
action: "roll",
label: "Select action",
callback: (event, button, dialog) => {
let pos = $('#combat-action-dialog').position()
game.user.setFlag(SYSTEM.id, "combat-action-dialog-pos", foundry.utils.duplicate(pos))
const output = Array.from(button.form.elements).reduce((obj, input) => {
if (input.name) obj[input.name] = input.value
return obj
@ -687,13 +713,17 @@ export default class LethalFantasyRoll extends Roll {
action: "cancel",
label: "Other action, not listed here",
callback: (event, button, dialog) => {
let pos = $('#combat-action-dialog').position()
game.user.setFlag(SYSTEM.id, "combat-action-dialog-pos", foundry.utils.duplicate(pos))
return null;
}
})
let rollContext = await foundry.applications.api.DialogV2.wait({
window: { title: "Combat Action Dialog" },
id: "combat-action-dialog",
classes: ["lethalfantasy"],
position,
content,
buttons,
rejectClose: false // Click on Close button will not launch an error
@ -854,178 +884,6 @@ export default class LethalFantasyRoll extends Roll {
}
}
/* ***********************************************************/
static async promptProgressionDice(options = {}) {
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,
default: "public",
})
let dialogContext = {
progressionDiceId: "",
fieldRollMode,
rollModes,
...options
}
const content = await renderTemplate("systems/fvtt-lethal-fantasy/templates/roll-progression-dice-dialog.hbs", dialogContext)
const label = game.i18n.localize("LETHALFANTASY.Label.rollProgressionDice")
const rollContext = await foundry.applications.api.DialogV2.wait({
window: { title: "Progression Roll" },
classes: ["lethalfantasy"],
content,
buttons: [
{
action: "roll",
label: "Roll Progression Dice or Continue Loading",
callback: (event, button, dialog) => {
const output = Array.from(button.form.elements).reduce((obj, input) => {
if (input.name) obj[input.name] = input.value
return obj
}, {})
return output
},
},
{
action: "cast",
label: "Cast a spell/Miracle",
callback: (event, button, dialog) => {
return "casting"
},
},
{
action: "cancel",
label: "Other action, no progression dice",
callback: (event, button, dialog) => {
return null;
}
}
],
rejectClose: false // Click on Close button will not launch an error
})
console.log("RollContext", dialogContext, rollContext)
let combat = game.combats.get(options.combatId)
let actor = game.actors.get(options.actorId)
if (rollContext === "casting") {
combat.setCasting(options.combatantId)
let message = `Starting casting a spell !`
ChatMessage.create({ content: message, speaker: ChatMessage.getSpeaker({ actor: actor }) })
return
}
if (rollContext === null || !rollContext?.progressionDiceId) {
c.resetCasting(options.combatantId)
combat.resetProgression(options.combatantId)
let message = `${actor.name} : Other action, progression reset`
ChatMessage.create({ content: message, speaker: ChatMessage.getSpeaker({ actor: actor }) })
return
}
// Get the weapons from the actor items
let rangedMode
let searchId = rollContext.progressionDiceId
if (searchId.match("simpleAim")) {
searchId = searchId.replace("simpleAim", "")
rangedMode = "simpleAim"
}
if (searchId.match("carefulAim")) {
searchId = searchId.replace("carefulAim", "")
rangedMode = "carefulAim"
}
if (searchId.match("focusedAim")) {
searchId = searchId.replace("focusedAim", "")
rangedMode = "focusedAim"
}
if (searchId.match("spell")) {
searchId = searchId.replace("spell", "")
let spell = actor.items.find(i => i.type === "spell" && i.id === searchId)
let dice = LethalFantasyUtils.getLethargyDice(spell.system.level)
if (combat.isCasting(options.combatantId)) {
if (options.rollProgressionCount <= spell.system.castingTime) {
let message = `Spell casting time : ${spell.name}, count : ${options.rollProgressionCount}/${spell.system.castingTime}`
ChatMessage.create({ content: message, speaker: ChatMessage.getSpeaker({ actor: actor }) })
return
}
if (options.rollProgressionCount > spell.system.castingTime) {
let message = `Spell ${spell.name} has been cast !`
ChatMessage.create({ content: message, speaker: ChatMessage.getSpeaker({ actor: actor }) })
combat.resetCasting(options.combatantId)
combat.resetProgression(options.combatantId)
return
}
} else {
let formula = dice
let roll = new Roll(formula)
await roll.evaluate()
let max = roll.dice[0].faces - 1
let toCompare = Math.min(options.rollProgressionCount, max)
let message
if (roll.total > toCompare) {
message = `Spell Lethargy ongoing ... (${roll.total}/${toCompare}, spell level ${spell.system.level})`
} else {
combat.resetProgression(options.combatantId)
message = `Spell Lethargy ended ! (${roll.total}/${toCompare}, spell level ${spell.system.level})<br>${actor.name} can return to normal actions.`
}
let msg = await roll.toMessage({ flavor: message }, { rollMode: rollContext.visibility })
if (game?.dice3d) {
await game.dice3d.waitFor3DAnimationByMessageID(msg.id)
}
}
return
}
let weapon = actor.items.find(i => i.type === "weapon" && i.id === searchId)
let formula = weapon.system.combatProgressionDice
let rangedLoad
if (rangedMode) {
let toSplit = weapon.system.speed[rangedMode]
let split = toSplit.split("+")
rangedLoad = Number(split[0]) || 0
formula = split[1]
console.log("Ranged Mode", rangedMode, rangedLoad, formula, options.rollProgressionCount)
}
if (rangedLoad && options.rollProgressionCount <= rangedLoad) {
let message = `Ranged weapon ${weapon.name} is loading, loading count : ${options.rollProgressionCount}/${rangedLoad}`
ChatMessage.create({ content: message, speaker: ChatMessage.getSpeaker({ actor: actor }) })
return
}
let isMonster = actor.type === "monster"
// Get the dice and roll it if
let roll = new Roll(formula)
await roll.evaluate()
let max = roll.dice[0].faces - 1
max = Math.min(options.rollProgressionCount, max)
let msg = await roll.toMessage({ flavor: `Progression Roll for ${weapon.name}, progression count : ${options.rollProgressionCount}/${max}` }, { rollMode: rollContext.visibility })
if (game?.dice3d) {
await game.dice3d.waitFor3DAnimationByMessageID(msg.id)
}
if (roll.total <= max) {
// Notify that the player can act now with a chat message
let message = game.i18n.format("LETHALFANTASY.Notifications.messageProgressionOK", { isMonster, name: actor.name, weapon: weapon.name, roll: roll.total })
ChatMessage.create({ content: message, speaker: ChatMessage.getSpeaker({ actor: actor }) })
// Update the combatant progression count
let combat = game.combats.get(options.combatId)
let combatant = combat.combatants.get(options.combatantId)
combatant.update({ 'system.progressionCount': 0 })
} else {
// Notify that the player cannot act now with a chat message
let message = game.i18n.format("LETHALFANTASY.Notifications.messageProgressionKO", { isMonster, name: actor.name, weapon: weapon.name, roll: roll.total })
ChatMessage.create({ content: message, speaker: ChatMessage.getSpeaker({ actor: actor }) })
}
}
/* ***********************************************************/
static async promptRangedDefense(rollTarget) {

View File

@ -149,7 +149,7 @@ export default class LethalFantasyMonster extends foundry.abstract.TypeDataModel
await roll.toMessage({}, { rollMode: roll.options.rollMode })
}
async prepareMonsterRoll(rollType, rollKey, rollDice) {
async prepareMonsterRoll(rollType, rollKey, rollDice = undefined, tokenId = undefined) {
let rollTarget
switch (rollType) {
case "monster-attack":
@ -212,6 +212,7 @@ export default class LethalFantasyMonster extends foundry.abstract.TypeDataModel
}
// In all cases
rollTarget.tokenId = tokenId
console.log(rollTarget)
await this.roll(rollType, rollTarget)
}
@ -260,8 +261,8 @@ export default class LethalFantasyMonster extends foundry.abstract.TypeDataModel
hasAttack = true
let message = game.i18n.format("LETHALFANTASY.Notifications.messageProgressionOKMonster", { isMonster: true, name: this.parent.name, weapon: attack.name, roll: roll.total })
ChatMessage.create({ content: message, speaker: ChatMessage.getSpeaker({ actor: this.parent }) })
this.prepareMonsterRoll("monster-attack", key)
let token = combatant?.token
this.prepareMonsterRoll("monster-attack", key, undefined, token?.id)
if ( token?.object ) {
token.object?.control({releaseOthers: true});
return canvas.animatePan(token.object.center);

View File

@ -1 +1 @@
MANIFEST-000243
MANIFEST-000261

View File

@ -1,8 +1,3 @@
2025/04/23-16:02:07.087054 7f3145ffb6c0 Recovering log #241
2025/04/23-16:02:07.096981 7f3145ffb6c0 Delete type=3 #239
2025/04/23-16:02:07.097039 7f3145ffb6c0 Delete type=0 #241
2025/04/23-16:04:44.893831 7f2ea7fff6c0 Level-0 table #246: started
2025/04/23-16:04:44.893889 7f2ea7fff6c0 Level-0 table #246: 0 bytes OK
2025/04/23-16:04:44.900365 7f2ea7fff6c0 Delete type=0 #244
2025/04/23-16:04:44.921865 7f2ea7fff6c0 Manual compaction at level-0 from '!folders!ATr9wZhg5uTVTksM' @ 72057594037927935 : 1 .. '!items!znm6T1ef4qQI8BX7' @ 0 : 0; will stop at (end)
2025/04/23-16:04:44.921936 7f2ea7fff6c0 Manual compaction at level-1 from '!folders!ATr9wZhg5uTVTksM' @ 72057594037927935 : 1 .. '!items!znm6T1ef4qQI8BX7' @ 0 : 0; will stop at (end)
2025/04/25-21:22:26.619523 7fa7f51fa6c0 Recovering log #259
2025/04/25-21:22:26.629405 7fa7f51fa6c0 Delete type=3 #257
2025/04/25-21:22:26.629471 7fa7f51fa6c0 Delete type=0 #259

View File

@ -1,8 +1,8 @@
2025/04/22-23:31:24.238771 7f31457fa6c0 Recovering log #237
2025/04/22-23:31:24.249942 7f31457fa6c0 Delete type=3 #235
2025/04/22-23:31:24.250077 7f31457fa6c0 Delete type=0 #237
2025/04/22-23:43:44.737443 7f2ea7fff6c0 Level-0 table #242: started
2025/04/22-23:43:44.737479 7f2ea7fff6c0 Level-0 table #242: 0 bytes OK
2025/04/22-23:43:44.744412 7f2ea7fff6c0 Delete type=0 #240
2025/04/22-23:43:44.750880 7f2ea7fff6c0 Manual compaction at level-0 from '!folders!ATr9wZhg5uTVTksM' @ 72057594037927935 : 1 .. '!items!znm6T1ef4qQI8BX7' @ 0 : 0; will stop at (end)
2025/04/22-23:43:44.750915 7f2ea7fff6c0 Manual compaction at level-1 from '!folders!ATr9wZhg5uTVTksM' @ 72057594037927935 : 1 .. '!items!znm6T1ef4qQI8BX7' @ 0 : 0; will stop at (end)
2025/04/25-21:12:25.063567 7fa7f49f96c0 Recovering log #255
2025/04/25-21:12:25.123483 7fa7f49f96c0 Delete type=3 #253
2025/04/25-21:12:25.123549 7fa7f49f96c0 Delete type=0 #255
2025/04/25-21:21:41.663813 7fa7eebff6c0 Level-0 table #260: started
2025/04/25-21:21:41.663837 7fa7eebff6c0 Level-0 table #260: 0 bytes OK
2025/04/25-21:21:41.670063 7fa7eebff6c0 Delete type=0 #258
2025/04/25-21:21:41.683068 7fa7eebff6c0 Manual compaction at level-0 from '!folders!ATr9wZhg5uTVTksM' @ 72057594037927935 : 1 .. '!items!znm6T1ef4qQI8BX7' @ 0 : 0; will stop at (end)
2025/04/25-21:21:41.683094 7fa7eebff6c0 Manual compaction at level-1 from '!folders!ATr9wZhg5uTVTksM' @ 72057594037927935 : 1 .. '!items!znm6T1ef4qQI8BX7' @ 0 : 0; will stop at (end)

View File

@ -1 +1 @@
MANIFEST-000242
MANIFEST-000260

View File

@ -1,8 +1,3 @@
2025/04/23-16:02:07.100445 7f3144ff96c0 Recovering log #240
2025/04/23-16:02:07.110685 7f3144ff96c0 Delete type=3 #238
2025/04/23-16:02:07.110874 7f3144ff96c0 Delete type=0 #240
2025/04/23-16:04:44.900471 7f2ea7fff6c0 Level-0 table #245: started
2025/04/23-16:04:44.900493 7f2ea7fff6c0 Level-0 table #245: 0 bytes OK
2025/04/23-16:04:44.907623 7f2ea7fff6c0 Delete type=0 #243
2025/04/23-16:04:44.921891 7f2ea7fff6c0 Manual compaction at level-0 from '!folders!yPWGvxHJbDNHVSnY' @ 72057594037927935 : 1 .. '!items!zjvGljrLk5SshC9D' @ 0 : 0; will stop at (end)
2025/04/23-16:04:44.921950 7f2ea7fff6c0 Manual compaction at level-1 from '!folders!yPWGvxHJbDNHVSnY' @ 72057594037927935 : 1 .. '!items!zjvGljrLk5SshC9D' @ 0 : 0; will stop at (end)
2025/04/25-21:22:26.632055 7fa7ef7fe6c0 Recovering log #258
2025/04/25-21:22:26.642442 7fa7ef7fe6c0 Delete type=3 #256
2025/04/25-21:22:26.642504 7fa7ef7fe6c0 Delete type=0 #258

View File

@ -1,8 +1,8 @@
2025/04/22-23:31:24.253009 7f3144ff96c0 Recovering log #236
2025/04/22-23:31:24.263050 7f3144ff96c0 Delete type=3 #234
2025/04/22-23:31:24.263096 7f3144ff96c0 Delete type=0 #236
2025/04/22-23:43:44.744546 7f2ea7fff6c0 Level-0 table #241: started
2025/04/22-23:43:44.744578 7f2ea7fff6c0 Level-0 table #241: 0 bytes OK
2025/04/22-23:43:44.750735 7f2ea7fff6c0 Delete type=0 #239
2025/04/22-23:43:44.750897 7f2ea7fff6c0 Manual compaction at level-0 from '!folders!yPWGvxHJbDNHVSnY' @ 72057594037927935 : 1 .. '!items!zjvGljrLk5SshC9D' @ 0 : 0; will stop at (end)
2025/04/22-23:43:44.750924 7f2ea7fff6c0 Manual compaction at level-1 from '!folders!yPWGvxHJbDNHVSnY' @ 72057594037927935 : 1 .. '!items!zjvGljrLk5SshC9D' @ 0 : 0; will stop at (end)
2025/04/25-21:12:25.126076 7fa7ef7fe6c0 Recovering log #254
2025/04/25-21:12:25.194012 7fa7ef7fe6c0 Delete type=3 #252
2025/04/25-21:12:25.194129 7fa7ef7fe6c0 Delete type=0 #254
2025/04/25-21:21:41.677033 7fa7eebff6c0 Level-0 table #259: started
2025/04/25-21:21:41.677055 7fa7eebff6c0 Level-0 table #259: 0 bytes OK
2025/04/25-21:21:41.682956 7fa7eebff6c0 Delete type=0 #257
2025/04/25-21:21:41.683087 7fa7eebff6c0 Manual compaction at level-0 from '!folders!yPWGvxHJbDNHVSnY' @ 72057594037927935 : 1 .. '!items!zjvGljrLk5SshC9D' @ 0 : 0; will stop at (end)
2025/04/25-21:21:41.683125 7fa7eebff6c0 Manual compaction at level-1 from '!folders!yPWGvxHJbDNHVSnY' @ 72057594037927935 : 1 .. '!items!zjvGljrLk5SshC9D' @ 0 : 0; will stop at (end)

Binary file not shown.

View File

@ -1 +1 @@
MANIFEST-000242
MANIFEST-000260

View File

@ -1,8 +1,3 @@
2025/04/23-16:02:07.071305 7f31457fa6c0 Recovering log #240
2025/04/23-16:02:07.081459 7f31457fa6c0 Delete type=3 #238
2025/04/23-16:02:07.081639 7f31457fa6c0 Delete type=0 #240
2025/04/23-16:04:44.907842 7f2ea7fff6c0 Level-0 table #245: started
2025/04/23-16:04:44.907895 7f2ea7fff6c0 Level-0 table #245: 0 bytes OK
2025/04/23-16:04:44.913971 7f2ea7fff6c0 Delete type=0 #243
2025/04/23-16:04:44.921908 7f2ea7fff6c0 Manual compaction at level-0 from '!folders!7j8H7DbmBb9Uza2X' @ 72057594037927935 : 1 .. '!items!zt8s7564ep1La4XQ' @ 0 : 0; will stop at (end)
2025/04/23-16:04:44.921963 7f2ea7fff6c0 Manual compaction at level-1 from '!folders!7j8H7DbmBb9Uza2X' @ 72057594037927935 : 1 .. '!items!zt8s7564ep1La4XQ' @ 0 : 0; will stop at (end)
2025/04/25-21:22:26.603891 7fa7f49f96c0 Recovering log #258
2025/04/25-21:22:26.613982 7fa7f49f96c0 Delete type=3 #256
2025/04/25-21:22:26.614103 7fa7f49f96c0 Delete type=0 #258

View File

@ -1,8 +1,8 @@
2025/04/22-23:31:24.225117 7f31467fc6c0 Recovering log #236
2025/04/22-23:31:24.235493 7f31467fc6c0 Delete type=3 #234
2025/04/22-23:31:24.235550 7f31467fc6c0 Delete type=0 #236
2025/04/22-23:43:44.724728 7f2ea7fff6c0 Level-0 table #241: started
2025/04/22-23:43:44.724783 7f2ea7fff6c0 Level-0 table #241: 0 bytes OK
2025/04/22-23:43:44.730920 7f2ea7fff6c0 Delete type=0 #239
2025/04/22-23:43:44.750847 7f2ea7fff6c0 Manual compaction at level-0 from '!folders!7j8H7DbmBb9Uza2X' @ 72057594037927935 : 1 .. '!items!zt8s7564ep1La4XQ' @ 0 : 0; will stop at (end)
2025/04/22-23:43:44.750890 7f2ea7fff6c0 Manual compaction at level-1 from '!folders!7j8H7DbmBb9Uza2X' @ 72057594037927935 : 1 .. '!items!zt8s7564ep1La4XQ' @ 0 : 0; will stop at (end)
2025/04/25-21:12:25.004274 7fa7f51fa6c0 Recovering log #254
2025/04/25-21:12:25.060536 7fa7f51fa6c0 Delete type=3 #252
2025/04/25-21:12:25.060709 7fa7f51fa6c0 Delete type=0 #254
2025/04/25-21:21:41.670183 7fa7eebff6c0 Level-0 table #259: started
2025/04/25-21:21:41.670208 7fa7eebff6c0 Level-0 table #259: 0 bytes OK
2025/04/25-21:21:41.676916 7fa7eebff6c0 Delete type=0 #257
2025/04/25-21:21:41.683078 7fa7eebff6c0 Manual compaction at level-0 from '!folders!7j8H7DbmBb9Uza2X' @ 72057594037927935 : 1 .. '!items!zt8s7564ep1La4XQ' @ 0 : 0; will stop at (end)
2025/04/25-21:21:41.683166 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 +1 @@
MANIFEST-000242
MANIFEST-000260

View File

@ -1,8 +1,3 @@
2025/04/23-16:02:07.114345 7f31467fc6c0 Recovering log #240
2025/04/23-16:02:07.124115 7f31467fc6c0 Delete type=3 #238
2025/04/23-16:02:07.124180 7f31467fc6c0 Delete type=0 #240
2025/04/23-16:04:44.931650 7f2ea7fff6c0 Level-0 table #245: started
2025/04/23-16:04:44.931686 7f2ea7fff6c0 Level-0 table #245: 0 bytes OK
2025/04/23-16:04:44.938777 7f2ea7fff6c0 Delete type=0 #243
2025/04/23-16:04:44.971323 7f2ea7fff6c0 Manual compaction at level-0 from '!folders!mnO9OzE7BEE2KDfh' @ 72057594037927935 : 1 .. '!items!zkK6ixtCsCw3RH9X' @ 0 : 0; will stop at (end)
2025/04/23-16:04:44.971357 7f2ea7fff6c0 Manual compaction at level-1 from '!folders!mnO9OzE7BEE2KDfh' @ 72057594037927935 : 1 .. '!items!zkK6ixtCsCw3RH9X' @ 0 : 0; will stop at (end)
2025/04/25-21:22:26.644388 7fa7effff6c0 Recovering log #258
2025/04/25-21:22:26.654206 7fa7effff6c0 Delete type=3 #256
2025/04/25-21:22:26.654257 7fa7effff6c0 Delete type=0 #258

View File

@ -1,8 +1,8 @@
2025/04/22-23:31:24.265717 7f3145ffb6c0 Recovering log #236
2025/04/22-23:31:24.276539 7f3145ffb6c0 Delete type=3 #234
2025/04/22-23:31:24.276606 7f3145ffb6c0 Delete type=0 #236
2025/04/22-23:43:44.731066 7f2ea7fff6c0 Level-0 table #241: started
2025/04/22-23:43:44.731099 7f2ea7fff6c0 Level-0 table #241: 0 bytes OK
2025/04/22-23:43:44.737300 7f2ea7fff6c0 Delete type=0 #239
2025/04/22-23:43:44.750866 7f2ea7fff6c0 Manual compaction at level-0 from '!folders!mnO9OzE7BEE2KDfh' @ 72057594037927935 : 1 .. '!items!zkK6ixtCsCw3RH9X' @ 0 : 0; will stop at (end)
2025/04/22-23:43:44.750946 7f2ea7fff6c0 Manual compaction at level-1 from '!folders!mnO9OzE7BEE2KDfh' @ 72057594037927935 : 1 .. '!items!zkK6ixtCsCw3RH9X' @ 0 : 0; will stop at (end)
2025/04/25-21:12:25.197251 7fa7effff6c0 Recovering log #254
2025/04/25-21:12:25.252610 7fa7effff6c0 Delete type=3 #252
2025/04/25-21:12:25.252672 7fa7effff6c0 Delete type=0 #254
2025/04/25-21:21:41.657695 7fa7eebff6c0 Level-0 table #259: started
2025/04/25-21:21:41.657740 7fa7eebff6c0 Level-0 table #259: 0 bytes OK
2025/04/25-21:21:41.663703 7fa7eebff6c0 Delete type=0 #257
2025/04/25-21:21:41.683056 7fa7eebff6c0 Manual compaction at level-0 from '!folders!mnO9OzE7BEE2KDfh' @ 72057594037927935 : 1 .. '!items!zkK6ixtCsCw3RH9X' @ 0 : 0; will stop at (end)
2025/04/25-21:21:41.683109 7fa7eebff6c0 Manual compaction at level-1 from '!folders!mnO9OzE7BEE2KDfh' @ 72057594037927935 : 1 .. '!items!zkK6ixtCsCw3RH9X' @ 0 : 0; will stop at (end)

View File

@ -13,6 +13,19 @@
fieldset {
padding: 4px;
}
.goto-token-button {
justify-content: center;
align-items: center;
align-content: center;
margin-left: 0.5rem;
max-width: 8rem;
background-color: var(--color-dark-6);
color: var(--color-dark-2);
border: none;
border-radius: 4px;
padding: 0.5rem;
}
}
.lethalfantasy-range-defense-dialog {
@ -24,7 +37,7 @@
select {
margin-left: 0.5rem;
min-width: 10rem;
max-width: 10rem;
max-width: 10rem;
}
.field-section {
display: flex;
@ -34,13 +47,13 @@
.field-name {
width:4rem;
min-width: 4rem;
max-width: 4rem;
max-width: 4rem;
}
}
.dialog-form {
.form-footer {
.form-footer {
button {
min-width: 14rem;
min-height: 3.2rem;

View File

@ -3,6 +3,12 @@
<fieldSet class="">
<legend>{{localize (concat "LETHALFANTASY.Label." rollType)}} - {{actorName}}</legend>
{{#if rollTarget.tokenId}}
<div class="dialog-save">
<a class="goto-token-button" data-action="gotoToken" data-token-id="{{rollTarget.tokenId}}">{{localize "LETHALFANTASY.Label.gotoToken"}} </a>
</div>
{{/if}}
{{#if (match rollType "attack")}}
<div class="dialog-save">Attack roll ! - {{rollTarget.name}}</div>
{{/if}}
@ -87,4 +93,6 @@
{{selectOptions rollModes selected=visibility}}
</select>
</fieldSet>
</div>