3 Commits
13.3.2 ... main

Author SHA1 Message Date
8d9cc1045c Fix licence 2025-10-01 15:14:58 +02:00
4af277d8a2 Fight helper ! 2025-10-01 11:24:41 +02:00
bc9f397755 Fix initiative 2025-09-30 17:44:39 +02:00
27 changed files with 233 additions and 108 deletions

View File

@@ -0,0 +1,6 @@
Code license :
Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International
This license requires that reusers give credit to the creator. It allows reusers to distribute, remix, adapt, and build upon the material in any medium or format, for noncommercial purposes only. If others modify or adapt the material, they must license the modified material under identical terms.

View File

@@ -3041,6 +3041,9 @@ i.fvtt-cthulhu-eternal {
font-size: calc(var(--font-size-standard) * 2); font-size: calc(var(--font-size-standard) * 2);
color: var(--color-dark-1); color: var(--color-dark-1);
} }
.li-apply-wounds {
display: none;
}
.dice-roll { .dice-roll {
flex-direction: column; flex-direction: column;
} }

View File

@@ -29,6 +29,12 @@ Hooks.once("init", function () {
models, models,
documents, documents,
} }
// Set an initiative formula for the system
CONFIG.Combat.initiative = {
formula: "@characteristics.dex.value",
decimals: 1
};
CONFIG.Actor.documentClass = documents.CthulhuEternalActor CONFIG.Actor.documentClass = documents.CthulhuEternalActor
CONFIG.Actor.dataModels = { CONFIG.Actor.dataModels = {
@@ -93,14 +99,14 @@ Hooks.once("init", function () {
CthulhuEternalUtils.registerSettings() CthulhuEternalUtils.registerSettings()
CthulhuEternalUtils.registerHandlebarsHelpers() CthulhuEternalUtils.registerHandlebarsHelpers()
CthulhuEternalUtils.setupCSSRootVariables() CthulhuEternalUtils.setupCSSRootVariables()
CONFIG.debug.hooks = false;
console.info("CTHULHU ETERNAL | System Initialized") console.info("CTHULHU ETERNAL | System Initialized")
}) })
Hooks.once('babele.init', (babele) => { Hooks.once('babele.init', (babele) => {
babele.setSystemTranslationsDir("compendiums"); babele.setSystemTranslationsDir("compendiums");
CthulhuEternalUtils.registerBabeleTranslations(babele); CthulhuEternalUtils.registerBabeleTranslations(babele);
}); });
/** /**
@@ -165,6 +171,15 @@ Hooks.on("renderChatMessageHTML", (message, html, data) => {
CthulhuEternalUtils.applySANType(message, event) CthulhuEternalUtils.applySANType(message, event)
}) })
} }
if (game.user.isGM) {
$(html).find(".li-apply-wounds").each((i, btn) => {
btn.style.display = "inline"
})
$(html).find(".li-apply-wounds-select").click((event) => {
CthulhuEternalUtils.applyWounds(message, event)
})
}
}) })
/** /**

View File

@@ -730,7 +730,8 @@
"visibility": "Visibility", "visibility": "Visibility",
"rangedRange": "Range", "rangedRange": "Range",
"aimingLastRound": "Aiming Last Round (+20)", "aimingLastRound": "Aiming Last Round (+20)",
"aimingWithSight": "Aiming with Sight (+20)" "aimingWithSight": "Aiming with Sight (+20)",
"applyWounds": "Apply To"
}, },
"ChatMessage": { "ChatMessage": {
"exhausted": "Your protagonist is exhausted. He loses [[/r 1d6]] Willpower Points." "exhausted": "Your protagonist is exhausted. He loses [[/r 1d6]] Willpower Points."
@@ -755,6 +756,9 @@
"rollDamage": "Roll Damage" "rollDamage": "Roll Damage"
}, },
"Chat": { "Chat": {
"noArmor": "No armor absorbed damage.",
"armorAbsorbed": "Armor absorbed {armor} damage.",
"woundsApplied": "Wounds applied to {name}: {effectiveWounds} (armor absorbed : {armorText})"
}, },
"Notifications": { "Notifications": {
"NoWeaponSkill": "No weapon skill found for this weapon. Check Weapon definition or available skills/era", "NoWeaponSkill": "No weapon skill found for this weapon. Check Weapon definition or available skills/era",

View File

@@ -751,7 +751,8 @@
"visibility": "Visibilité", "visibility": "Visibilité",
"rangedRange": "Portée", "rangedRange": "Portée",
"aimingLastRound": "Visée lors du dernier round (+20)", "aimingLastRound": "Visée lors du dernier round (+20)",
"aimingWithSight": "Visée avec lunette (+20)" "aimingWithSight": "Visée avec lunette (+20)",
"applyWounds": "Appliquer à"
}, },
"ChatMessage": { "ChatMessage": {
"exhausted": "Votre protagoniste est épuisé. Il perd [[/r 1d6]] Points de Volonté." "exhausted": "Votre protagoniste est épuisé. Il perd [[/r 1d6]] Points de Volonté."
@@ -776,6 +777,9 @@
"rollDamage": "Lancer les dégâts" "rollDamage": "Lancer les dégâts"
}, },
"Chat": { "Chat": {
"armorAbsorbed": "L'armure a absorbé {armor} points de dégâts.",
"noArmor": "Pas d'armure.",
"woundsApplied": "Blessures appliquées à {name} : {effectiveWounds} (armure absorbée : {armorText})"
}, },
"Notifications": { "Notifications": {
"NoWeaponSkill": "Aucune compétence associée n'a été trouvé pour cette arme. Vérifier la définition de l'arme ainsi que l'époque configurée.", "NoWeaponSkill": "Aucune compétence associée n'a été trouvé pour cette arme. Vérifier la définition de l'arme ainsi que l'époque configurée.",

View File

@@ -23,8 +23,10 @@ export default class CthulhuEternalActor extends Actor {
data.items.push(skill.toObject()) data.items.push(skill.toObject())
} }
} }
data.items.push({ type:"weapon", img: "systems/fvtt-cthulhu-eternal/assets/icons/icon_fist.svg", data.items.push({
name: game.i18n.localize("CTHULHUETERNAL.Label.Unarmed"), system: { damage: "1d4-1", weaponType: "unarmed" } }) type: "weapon", img: "systems/fvtt-cthulhu-eternal/assets/icons/icon_fist.svg",
name: game.i18n.localize("CTHULHUETERNAL.Label.Unarmed"), system: { damage: "1d4-1", weaponType: "unarmed" }
})
} }
return super.create(data, options); return super.create(data, options);
@@ -43,6 +45,39 @@ export default class CthulhuEternalActor extends Actor {
return super._onUpdate(changed, options, userId) return super._onUpdate(changed, options, userId)
} }
applyWounds(woundData) {
let updates = {}
// Get available armor
let armors = this.items.filter(i => i.type === "armor" && i.system.equipped)
let totalArmor = 0
for (let armor of armors) {
totalArmor += armor.system.protection
}
let effectiveWounds = Math.max(woundData.rollResult - totalArmor, 0)
if (woundData.isLethal) {
effectiveWounds = this.system.hp.value // Killed!
}
// Apply armor reduction
let hp = Math.max(this.system.hp.value - effectiveWounds, 0)
if (this.system.hp.value !== hp) {
updates[`system.hp.value`] = hp
}
if (Object.keys(updates).length > 0) {
this.update(updates)
}
// Chat message for GM only
if (game.user.isGM) {
let armorText = totalArmor > 0 ? game.i18n.format("CTHULHUETERNAL.Chat.armorAbsorbed", { armor: totalArmor }) : game.i18n.localize("CTHULHUETERNAL.Chat.noArmor")
ChatMessage.create({
user: game.user.id,
speaker: { alias: this.name },
rollMode: "gmroll",
content: game.i18n.format("CTHULHUETERNAL.Chat.woundsApplied", { name: this.name, effectiveWounds, armorText }),
})
}
}
async createEmbeddedDocuments(embeddedName, data, operation) { async createEmbeddedDocuments(embeddedName, data, operation) {
let newData = [] let newData = []
if (embeddedName === "Item") { if (embeddedName === "Item") {
@@ -71,18 +106,18 @@ export default class CthulhuEternalActor extends Actor {
} }
async _preCreate(data, options, user) { async _preCreate(data, options, user) {
await super._preCreate(data, options, user) await super._preCreate(data, options, user)
// Configure prototype token settings // Configure prototype token settings
const prototypeToken = {} const prototypeToken = {}
if (this.type === "protagonist") { if (this.type === "protagonist") {
Object.assign(prototypeToken, { Object.assign(prototypeToken, {
sight: { enabled: true }, sight: { enabled: true },
actorLink: true, actorLink: true,
disposition: CONST.TOKEN_DISPOSITIONS.FRIENDLY, disposition: CONST.TOKEN_DISPOSITIONS.FRIENDLY,
}) })
this.updateSource({ prototypeToken }) this.updateSource({ prototypeToken })
}
} }
}
} }

View File

@@ -146,6 +146,15 @@ export default class CthulhuEternalRoll extends Roll {
ammoUsed = Number(ammoUsed) ammoUsed = Number(ammoUsed)
let combatants = []
if (game?.combat?.combatants) {
for (let c of game.combat.combatants) {
if (c.actor.id !== actor.id) {
combatants.push({ id: c.actor.id, name: c.name })
}
}
}
if (weapon.system.lethality > 0) { if (weapon.system.lethality > 0) {
let lethalityRoll = new Roll("1d100") let lethalityRoll = new Roll("1d100")
await lethalityRoll.evaluate() await lethalityRoll.evaluate()
@@ -159,20 +168,22 @@ export default class CthulhuEternalRoll extends Roll {
} }
let wounds = Math.floor(lethalityRoll.total / 10) + (lethalityRoll.total % 10) let wounds = Math.floor(lethalityRoll.total / 10) + (lethalityRoll.total % 10)
let msgData = { let msgData = {
actorId: actor.id,
weapon, weapon,
wounds, wounds,
lethalScore, lethalScore,
isLethal, isLethal,
ammoUsed, ammoUsed,
rollResult: lethalityRoll.total, rollResult: lethalityRoll.total,
combatants: combatants
} }
let flavor = await foundry.applications.handlebars.renderTemplate("systems/fvtt-cthulhu-eternal/templates/chat-lethal-damage.hbs", msgData) let flavor = await foundry.applications.handlebars.renderTemplate("systems/fvtt-cthulhu-eternal/templates/chat-lethal-damage.hbs", msgData)
ChatMessage.create({ let msg = await ChatMessage.create({
user: game.user.id, user: game.user.id,
content: flavor, content: flavor,
speaker: ChatMessage.getSpeaker({ actor: actor }), speaker: ChatMessage.getSpeaker({ actor: actor }),
}, { rollMode: options.rollMode, create: true }) }, { rollMode: options.rollMode, create: true })
await msg.setFlag("fvtt-cthulhu-eternal", "woundData", msgData)
return return
} }
@@ -190,21 +201,24 @@ export default class CthulhuEternalRoll extends Roll {
"system.ammo.value": Math.max(0, weapon.system.ammo.value - ammoUsed) "system.ammo.value": Math.max(0, weapon.system.ammo.value - ammoUsed)
}]) }])
} }
console.log("Weapon damage formula", formula, weapon, ammoUsed)
let damageRoll = new Roll(formula) let damageRoll = new Roll(formula)
await damageRoll.evaluate() await damageRoll.evaluate()
let msgData = { let msgData = {
weapon, actorId: actor.id,
formula, weapon,
ammoUsed, formula,
rollResult: damageRoll.total, ammoUsed,
} rollResult: damageRoll.total,
let flavor = await foundry.applications.handlebars.renderTemplate("systems/fvtt-cthulhu-eternal/templates/chat-regular-damage.hbs", msgData) combatants: combatants
ChatMessage.create({ }
user: game.user.id, let flavor = await foundry.applications.handlebars.renderTemplate("systems/fvtt-cthulhu-eternal/templates/chat-regular-damage.hbs", msgData)
content: flavor, let msg = await ChatMessage.create({
speaker: ChatMessage.getSpeaker({ actor: actor }), user: game.user.id,
}, { rollMode: options.rollMode, create: true }) content: flavor,
speaker: ChatMessage.getSpeaker({ actor: actor }),
}, { rollMode: options.rollMode, create: true })
await msg.setFlag("fvtt-cthulhu-eternal", "woundData", msgData)
} }

View File

@@ -229,7 +229,7 @@ export default class CthulhuEternalUtils {
let healingFormula = rollData.rollItem.system.healingFormula let healingFormula = rollData.rollItem.system.healingFormula
let healingMsg = "CTHULHUETERNAL.Label.healingRoll" let healingMsg = "CTHULHUETERNAL.Label.healingRoll"
if (rollData.resultType === "successCritical") { if (rollData.resultType === "successCritical") {
healingFormula += " * 2" healingFormula += " * 2"
} }
if (rollData.resultType === "failureCritical") { if (rollData.resultType === "failureCritical") {
healingMsg = "CTHULHUETERNAL.Label.healingRollFailure" healingMsg = "CTHULHUETERNAL.Label.healingRollFailure"
@@ -268,11 +268,11 @@ export default class CthulhuEternalUtils {
} }
static async registerBabeleTranslations(babele) { static async registerBabeleTranslations(babele) {
babele.registerConverters( { babele.registerConverters({
'translateRangeUnit': (originalValue) => { 'translateRangeUnit': (originalValue) => {
return CthulhuEternalUtils.translateRangeUnit(originalValue) return CthulhuEternalUtils.translateRangeUnit(originalValue)
}, },
'translateRange' : (originalValue) => { 'translateRange': (originalValue) => {
return CthulhuEternalUtils.translateRange(originalValue) return CthulhuEternalUtils.translateRange(originalValue)
} }
}) })
@@ -280,7 +280,7 @@ export default class CthulhuEternalUtils {
static async damageRoll(rollMessage, formula = null) { static async damageRoll(rollMessage, formula = null) {
let rollData = rollMessage.rolls[0]?.options?.rollData let rollData = rollMessage.rolls[0]?.options?.rollData
let actor = game.actors.get(rollData.actorId) let actor = game.actors.get(rollData.actorId)
if (!actor) { if (!actor) {
ui.notifications.error(game.i18n.localize("CTHULHUETERNAL.Label.noActorFound")) ui.notifications.error(game.i18n.localize("CTHULHUETERNAL.Label.noActorFound"))
return return
@@ -336,8 +336,8 @@ export default class CthulhuEternalUtils {
rejectClose: false, // Click on Close button will not launch an error rejectClose: false, // Click on Close button will not launch an error
render: (event, dialog) => { render: (event, dialog) => {
$(".nudged-score-select").change(event => { $(".nudged-score-select").change(event => {
dialogContext.nudgedValue = Number(event.target.value)+1 dialogContext.nudgedValue = Number(event.target.value) + 1
dialogContext.wpCost = Math.ceil(Math.abs(rollMessage.rolls[0].total - dialogContext.nudgedValue) / 5) dialogContext.wpCost = Math.ceil(Math.abs(rollMessage.rolls[0].total - dialogContext.nudgedValue) / 5)
$("#nudged-wp-cost").val(dialogContext.wpCost) $("#nudged-wp-cost").val(dialogContext.wpCost)
}) })
} }
@@ -375,4 +375,24 @@ export default class CthulhuEternalUtils {
document.documentElement.style.setProperty('--background-image-base', `linear-gradient(rgba(255, 255, 255, 0.8), rgba(255, 255, 255, 0.8)), url("../assets/ui/${era}_background_main.webp")`); document.documentElement.style.setProperty('--background-image-base', `linear-gradient(rgba(255, 255, 255, 0.8), rgba(255, 255, 255, 0.8)), url("../assets/ui/${era}_background_main.webp")`);
} }
static applyWounds(message, event) {
let woundData = message.getFlag("fvtt-cthulhu-eternal", "woundData")
if (!woundData) {
ui.notifications.error(game.i18n.localize("CTHULHUETERNAL.Notifications.noRollDataFound"))
return
}
let actor = game.actors.get(woundData.actorId)
if (!actor) {
ui.notifications.error(game.i18n.localize("CTHULHUETERNAL.Notifications.noActorFound"))
return
}
// Get the targetted actorId from the HTML select event
let targetActorId = event.target.value
let targetActor = game.actors.get(targetActorId)
if (!targetActor) {
ui.notifications.error(game.i18n.localize("CTHULHUETERNAL.Notifications.noTargetActorFound") + targetActorId)
return
}
targetActor.applyWounds(woundData)
}
} }

Binary file not shown.

View File

@@ -1 +1 @@
MANIFEST-000230 MANIFEST-000249

View File

@@ -1,7 +1,7 @@
2025/07/29-18:28:11.485462 7fbfdeffd6c0 Recovering log #227 2025/10/01-10:24:47.689741 7fc4987f86c0 Recovering log #246
2025/07/29-18:28:11.542963 7fbfdeffd6c0 Delete type=3 #225 2025/10/01-10:24:47.787870 7fc4987f86c0 Delete type=3 #244
2025/07/29-18:28:11.543020 7fbfdeffd6c0 Delete type=0 #227 2025/10/01-10:24:47.787986 7fc4987f86c0 Delete type=0 #246
2025/07/29-18:28:25.939648 7fbd3ffff6c0 Level-0 table #233: started 2025/10/01-11:24:12.555415 7fc497ff76c0 Level-0 table #252: started
2025/07/29-18:28:25.939685 7fbd3ffff6c0 Level-0 table #233: 0 bytes OK 2025/10/01-11:24:12.555461 7fc497ff76c0 Level-0 table #252: 0 bytes OK
2025/07/29-18:28:25.996353 7fbd3ffff6c0 Delete type=0 #231 2025/10/01-11:24:12.565317 7fc497ff76c0 Delete type=0 #250
2025/07/29-18:28:25.996608 7fbd3ffff6c0 Manual compaction at level-0 from '!items!4oyPRBWPBWAChrJP' @ 72057594037927935 : 1 .. '!items!zVFfp3o0G0Zg3Ia4' @ 0 : 0; will stop at (end) 2025/10/01-11:24:12.577205 7fc497ff76c0 Manual compaction at level-0 from '!items!4oyPRBWPBWAChrJP' @ 72057594037927935 : 1 .. '!items!zVFfp3o0G0Zg3Ia4' @ 0 : 0; will stop at (end)

View File

@@ -1,11 +1,11 @@
2025/07/29-17:56:07.304105 7fbfddffb6c0 Delete type=3 #1 2025/10/01-09:23:25.493413 7fc499ffb6c0 Delete type=3 #1
2025/07/29-18:20:36.901079 7fbd3ffff6c0 Level-0 table #228: started 2025/10/01-09:24:30.037985 7fc497ff76c0 Level-0 table #247: started
2025/07/29-18:20:36.901119 7fbd3ffff6c0 Level-0 table #228: 0 bytes OK 2025/10/01-09:24:30.038031 7fc497ff76c0 Level-0 table #247: 0 bytes OK
2025/07/29-18:20:36.907068 7fbd3ffff6c0 Delete type=0 #226 2025/10/01-09:24:30.044462 7fc497ff76c0 Delete type=0 #245
2025/07/29-18:20:36.913035 7fbd3ffff6c0 Manual compaction at level-0 from '!items!4oyPRBWPBWAChrJP' @ 72057594037927935 : 1 .. '!items!zVFfp3o0G0Zg3Ia4' @ 0 : 0; will stop at '!items!zVFfp3o0G0Zg3Ia4' @ 52 : 1 2025/10/01-09:24:30.069660 7fc497ff76c0 Manual compaction at level-0 from '!items!4oyPRBWPBWAChrJP' @ 72057594037927935 : 1 .. '!items!zVFfp3o0G0Zg3Ia4' @ 0 : 0; will stop at '!items!zVFfp3o0G0Zg3Ia4' @ 52 : 1
2025/07/29-18:20:36.913051 7fbd3ffff6c0 Compacting 1@0 + 0@1 files 2025/10/01-09:24:30.069672 7fc497ff76c0 Compacting 1@0 + 0@1 files
2025/07/29-18:20:36.917150 7fbd3ffff6c0 Generated table #229@0: 26 keys, 60964 bytes 2025/10/01-09:24:30.073695 7fc497ff76c0 Generated table #248@0: 26 keys, 60964 bytes
2025/07/29-18:20:36.917172 7fbd3ffff6c0 Compacted 1@0 + 0@1 files => 60964 bytes 2025/10/01-09:24:30.073722 7fc497ff76c0 Compacted 1@0 + 0@1 files => 60964 bytes
2025/07/29-18:20:36.923988 7fbd3ffff6c0 compacted to: files[ 0 1 0 0 0 0 0 ] 2025/10/01-09:24:30.080151 7fc497ff76c0 compacted to: files[ 0 1 0 0 0 0 0 ]
2025/07/29-18:20:36.924086 7fbd3ffff6c0 Delete type=2 #60 2025/10/01-09:24:30.080234 7fc497ff76c0 Delete type=2 #242
2025/07/29-18:20:36.941818 7fbd3ffff6c0 Manual compaction at level-0 from '!items!zVFfp3o0G0Zg3Ia4' @ 52 : 1 .. '!items!zVFfp3o0G0Zg3Ia4' @ 0 : 0; will stop at (end) 2025/10/01-09:24:30.086925 7fc497ff76c0 Manual compaction at level-0 from '!items!zVFfp3o0G0Zg3Ia4' @ 52 : 1 .. '!items!zVFfp3o0G0Zg3Ia4' @ 0 : 0; will stop at (end)

Binary file not shown.

View File

@@ -1 +1 @@
MANIFEST-000399 MANIFEST-000418

View File

@@ -1,7 +1,7 @@
2025/07/29-18:28:11.326583 7fbfdd7fa6c0 Recovering log #396 2025/10/01-10:24:47.499257 7fc4997fa6c0 Recovering log #415
2025/07/29-18:28:11.422544 7fbfdd7fa6c0 Delete type=3 #394 2025/10/01-10:24:47.596647 7fc4997fa6c0 Delete type=3 #413
2025/07/29-18:28:11.422600 7fbfdd7fa6c0 Delete type=0 #396 2025/10/01-10:24:47.596724 7fc4997fa6c0 Delete type=0 #415
2025/07/29-18:28:25.859630 7fbd3ffff6c0 Level-0 table #402: started 2025/10/01-11:24:12.545465 7fc497ff76c0 Level-0 table #421: started
2025/07/29-18:28:25.859675 7fbd3ffff6c0 Level-0 table #402: 0 bytes OK 2025/10/01-11:24:12.545499 7fc497ff76c0 Level-0 table #421: 0 bytes OK
2025/07/29-18:28:25.902834 7fbd3ffff6c0 Delete type=0 #400 2025/10/01-11:24:12.555310 7fc497ff76c0 Delete type=0 #419
2025/07/29-18:28:25.996583 7fbd3ffff6c0 Manual compaction at level-0 from '!folders!5PrT9QmN1cFPzDFP' @ 72057594037927935 : 1 .. '!items!zvoUByzWSWZ87fxA' @ 0 : 0; will stop at (end) 2025/10/01-11:24:12.577192 7fc497ff76c0 Manual compaction at level-0 from '!folders!5PrT9QmN1cFPzDFP' @ 72057594037927935 : 1 .. '!items!zvoUByzWSWZ87fxA' @ 0 : 0; will stop at (end)

View File

@@ -1,11 +1,11 @@
2025/07/29-17:56:07.265693 7fbfddffb6c0 Delete type=3 #1 2025/10/01-09:23:25.444068 7fc499ffb6c0 Delete type=3 #1
2025/07/29-18:20:36.941849 7fbd3ffff6c0 Level-0 table #397: started 2025/10/01-09:24:30.024822 7fc497ff76c0 Level-0 table #416: started
2025/07/29-18:20:36.941895 7fbd3ffff6c0 Level-0 table #397: 0 bytes OK 2025/10/01-09:24:30.024870 7fc497ff76c0 Level-0 table #416: 0 bytes OK
2025/07/29-18:20:36.948373 7fbd3ffff6c0 Delete type=0 #395 2025/10/01-09:24:30.030665 7fc497ff76c0 Delete type=0 #414
2025/07/29-18:20:36.960564 7fbd3ffff6c0 Manual compaction at level-0 from '!folders!5PrT9QmN1cFPzDFP' @ 72057594037927935 : 1 .. '!items!zvoUByzWSWZ87fxA' @ 0 : 0; will stop at '!items!zvoUByzWSWZ87fxA' @ 1281 : 1 2025/10/01-09:24:30.044587 7fc497ff76c0 Manual compaction at level-0 from '!folders!5PrT9QmN1cFPzDFP' @ 72057594037927935 : 1 .. '!items!zvoUByzWSWZ87fxA' @ 0 : 0; will stop at '!items!zvoUByzWSWZ87fxA' @ 1281 : 1
2025/07/29-18:20:36.960577 7fbd3ffff6c0 Compacting 1@0 + 0@1 files 2025/10/01-09:24:30.044598 7fc497ff76c0 Compacting 1@0 + 0@1 files
2025/07/29-18:20:36.968003 7fbd3ffff6c0 Generated table #398@0: 556 keys, 320457 bytes 2025/10/01-09:24:30.051264 7fc497ff76c0 Generated table #417@0: 556 keys, 320457 bytes
2025/07/29-18:20:36.968044 7fbd3ffff6c0 Compacted 1@0 + 0@1 files => 320457 bytes 2025/10/01-09:24:30.051285 7fc497ff76c0 Compacted 1@0 + 0@1 files => 320457 bytes
2025/07/29-18:20:36.974076 7fbd3ffff6c0 compacted to: files[ 0 1 0 0 0 0 0 ] 2025/10/01-09:24:30.058278 7fc497ff76c0 compacted to: files[ 0 1 0 0 0 0 0 ]
2025/07/29-18:20:36.974209 7fbd3ffff6c0 Delete type=2 #277 2025/10/01-09:24:30.058439 7fc497ff76c0 Delete type=2 #411
2025/07/29-18:20:36.980862 7fbd3ffff6c0 Manual compaction at level-0 from '!items!zvoUByzWSWZ87fxA' @ 1281 : 1 .. '!items!zvoUByzWSWZ87fxA' @ 0 : 0; will stop at (end) 2025/10/01-09:24:30.086897 7fc497ff76c0 Manual compaction at level-0 from '!items!zvoUByzWSWZ87fxA' @ 1281 : 1 .. '!items!zvoUByzWSWZ87fxA' @ 0 : 0; will stop at (end)

Binary file not shown.

View File

@@ -1 +1 @@
MANIFEST-000045 MANIFEST-000064

View File

@@ -1,7 +1,7 @@
2025/07/29-18:28:11.426069 7fbfde7fc6c0 Recovering log #42 2025/10/01-10:24:47.601344 7fc499ffb6c0 Recovering log #61
2025/07/29-18:28:11.482529 7fbfde7fc6c0 Delete type=3 #40 2025/10/01-10:24:47.686801 7fc499ffb6c0 Delete type=3 #59
2025/07/29-18:28:11.482582 7fbfde7fc6c0 Delete type=0 #42 2025/10/01-10:24:47.686869 7fc499ffb6c0 Delete type=0 #61
2025/07/29-18:28:25.996691 7fbd3ffff6c0 Level-0 table #48: started 2025/10/01-11:24:12.535658 7fc497ff76c0 Level-0 table #67: started
2025/07/29-18:28:25.996717 7fbd3ffff6c0 Level-0 table #48: 0 bytes OK 2025/10/01-11:24:12.535725 7fc497ff76c0 Level-0 table #67: 0 bytes OK
2025/07/29-18:28:26.032508 7fbd3ffff6c0 Delete type=0 #46 2025/10/01-11:24:12.545352 7fc497ff76c0 Delete type=0 #65
2025/07/29-18:28:26.140428 7fbd3ffff6c0 Manual compaction at level-0 from '!folders!0DI3T2jve3nsmsfZ' @ 72057594037927935 : 1 .. '!items!zyxA9DhO36t5OBDv' @ 0 : 0; will stop at (end) 2025/10/01-11:24:12.577171 7fc497ff76c0 Manual compaction at level-0 from '!folders!0DI3T2jve3nsmsfZ' @ 72057594037927935 : 1 .. '!items!zyxA9DhO36t5OBDv' @ 0 : 0; will stop at (end)

View File

@@ -1,11 +1,11 @@
2025/07/29-17:56:07.286370 7fbfdeffd6c0 Delete type=3 #1 2025/10/01-09:23:25.469063 7fc499ffb6c0 Delete type=3 #1
2025/07/29-18:20:36.907148 7fbd3ffff6c0 Level-0 table #43: started 2025/10/01-09:24:30.030754 7fc497ff76c0 Level-0 table #62: started
2025/07/29-18:20:36.907174 7fbd3ffff6c0 Level-0 table #43: 0 bytes OK 2025/10/01-09:24:30.030783 7fc497ff76c0 Level-0 table #62: 0 bytes OK
2025/07/29-18:20:36.912933 7fbd3ffff6c0 Delete type=0 #41 2025/10/01-09:24:30.037809 7fc497ff76c0 Delete type=0 #60
2025/07/29-18:20:36.924240 7fbd3ffff6c0 Manual compaction at level-0 from '!folders!0DI3T2jve3nsmsfZ' @ 72057594037927935 : 1 .. '!items!zyxA9DhO36t5OBDv' @ 0 : 0; will stop at '!items!zyxA9DhO36t5OBDv' @ 55 : 1 2025/10/01-09:24:30.058634 7fc497ff76c0 Manual compaction at level-0 from '!folders!0DI3T2jve3nsmsfZ' @ 72057594037927935 : 1 .. '!items!zyxA9DhO36t5OBDv' @ 0 : 0; will stop at '!items!zyxA9DhO36t5OBDv' @ 55 : 1
2025/07/29-18:20:36.924252 7fbd3ffff6c0 Compacting 1@0 + 0@1 files 2025/10/01-09:24:30.058646 7fc497ff76c0 Compacting 1@0 + 0@1 files
2025/07/29-18:20:36.928859 7fbd3ffff6c0 Generated table #44@0: 362 keys, 93592 bytes 2025/10/01-09:24:30.063565 7fc497ff76c0 Generated table #63@0: 362 keys, 93592 bytes
2025/07/29-18:20:36.928870 7fbd3ffff6c0 Compacted 1@0 + 0@1 files => 93592 bytes 2025/10/01-09:24:30.063591 7fc497ff76c0 Compacted 1@0 + 0@1 files => 93592 bytes
2025/07/29-18:20:36.935549 7fbd3ffff6c0 compacted to: files[ 0 1 0 0 0 0 0 ] 2025/10/01-09:24:30.069446 7fc497ff76c0 compacted to: files[ 0 1 0 0 0 0 0 ]
2025/07/29-18:20:36.935675 7fbd3ffff6c0 Delete type=2 #35 2025/10/01-09:24:30.069529 7fc497ff76c0 Delete type=2 #57
2025/07/29-18:20:36.941835 7fbd3ffff6c0 Manual compaction at level-0 from '!items!zyxA9DhO36t5OBDv' @ 55 : 1 .. '!items!zyxA9DhO36t5OBDv' @ 0 : 0; will stop at (end) 2025/10/01-09:24:30.086915 7fc497ff76c0 Manual compaction at level-0 from '!items!zyxA9DhO36t5OBDv' @ 55 : 1 .. '!items!zyxA9DhO36t5OBDv' @ 0 : 0; will stop at (end)

View File

@@ -11,8 +11,8 @@
@import "weapon.less"; @import "weapon.less";
@import "armor.less"; @import "armor.less";
@import "motivation.less"; @import "motivation.less";
@import "mentaldisorder.less"; @import "mentaldisorder.less";
@import "bond.less"; @import "bond.less";
@import "chat.less"; @import "chat.less";
@import "gear.less"; @import "gear.less";
@import "arcane.less"; @import "arcane.less";
@@ -21,4 +21,4 @@
@import "tome.less"; @import "tome.less";
} }
@import "roll.less"; @import "roll.less";

View File

@@ -53,6 +53,10 @@
color: var(--color-dark-1); color: var(--color-dark-1);
} }
.li-apply-wounds {
display: none;
}
&.dice-roll { &.dice-roll {
flex-direction: column; flex-direction: column;
@@ -70,7 +74,7 @@
border: 0px; border: 0px;
} }
.intro-chat { .intro-chat {
color:var(--color-dark-1); color: var(--color-dark-1);
border-radius: 20px; border-radius: 20px;
display: flex; display: flex;
flex-direction: row; flex-direction: row;
@@ -91,20 +95,20 @@
li { li {
margin: 0 10px; margin: 0 10px;
font-family: var(--font-primary); font-family: var(--font-primary);
font-size: calc(var(--font-size-standard) * 1.0); font-size: calc(var(--font-size-standard) * 1);
} }
.nudge-roll { .nudge-roll {
font-size: calc(var(--font-size-standard) * 1.0); font-size: calc(var(--font-size-standard) * 1);
margin-left: 2rem; margin-left: 2rem;
display: none; display: none;
} }
.healing-roll { .healing-roll {
font-size: calc(var(--font-size-standard) * 1.0); font-size: calc(var(--font-size-standard) * 1);
margin-left: 2rem; margin-left: 2rem;
display: none; display: none;
} }
.roll-damage { .roll-damage {
font-size: calc(var(--font-size-standard) * 1.0); font-size: calc(var(--font-size-standard) * 1);
margin-left: 2rem; margin-left: 2rem;
display: none; display: none;
} }

View File

@@ -2,7 +2,7 @@
<div class="chat-lethal-damage"> <div class="chat-lethal-damage">
<ul> <ul>
<li><strong>{{weapon.name}} : {{localize "CTHULHUETERNAL.Label.lethalityRoll"}}</strong></li> <li><strong>{{weapon.name}} : {{localize "CTHULHUETERNAL.Label.lethalityRoll"}}</strong></li>
<li>{{localize "CTHULHUETERNAL.Label.result"}} :{{rollResult}} ({{lethalScore}})</li> <li>{{localize "CTHULHUETERNAL.Label.result"}} :{{rollResult}} ({{lethalScore}})</li>
{{#if weapon.system.selectiveFireChoice}} {{#if weapon.system.selectiveFireChoice}}
@@ -21,12 +21,20 @@
<li>{{localize "CTHULHUETERNAL.Label.ammoUsed"}}: {{ammoUsed}} / {{weapon.system.ammo.value}}</li> <li>{{localize "CTHULHUETERNAL.Label.ammoUsed"}}: {{ammoUsed}} / {{weapon.system.ammo.value}}</li>
{{/if}} {{/if}}
<li class="li-apply-wounds">
<button type="button" class="apply-wounds">{{localize "CTHULHUETERNAL.Label.applyWounds"}}</button>
<select name="combatant" class="roll-skill-modifier">
{{selectOptions combatants valueAttr="id" labelAttr="name"}}
</select>
</li>
{{#if isLethal}} {{#if isLethal}}
<li class="result-lethal">{{localize "CTHULHUETERNAL.Label.lethalityLethal"}}</li> <li class="result-lethal">{{localize "CTHULHUETERNAL.Label.lethalityLethal"}}</li>
<li class="result-lethal">{{localize "CTHULHUETERNAL.Label.lethalityWounded"}}</li> <li class="result-lethal">{{localize "CTHULHUETERNAL.Label.lethalityWounded"}}</li>
{{else}} {{else}}
<li class="result-non-lethal">{{localize "CTHULHUETERNAL.Label.lethalityNotLethal"}}</li> <li class="result-non-lethal">{{localize "CTHULHUETERNAL.Label.lethalityNotLethal"}}</li>
<li class="result-non-lethal">{{localize "CTHULHUETERNAL.Label.lethalityNotWounded"}}: <strong>{{wounds}}</strong></li> <li class="result-non-lethal">{{localize "CTHULHUETERNAL.Label.lethalityNotWounded"}}: <strong>{{wounds}}</strong>
</li>
{{/if}} {{/if}}
</ul> </ul>

View File

@@ -2,7 +2,7 @@
<div class="chat-lethal-damage"> <div class="chat-lethal-damage">
<ul> <ul>
<li><strong>{{weapon.name}} : {{localize "CTHULHUETERNAL.Label.damageRoll"}}</strong></li> <li><strong>{{weapon.name}} : {{localize "CTHULHUETERNAL.Label.damageRoll"}}</strong></li>
<li>{{localize "CTHULHUETERNAL.Label.result"}} :{{rollResult}} ({{formula}})</li> <li>{{localize "CTHULHUETERNAL.Label.result"}} :{{rollResult}} ({{formula}})</li>
{{#if (gt weapon.system.killRadius 0)}} {{#if (gt weapon.system.killRadius 0)}}
<li>{{localize "CTHULHUETERNAL.Label.killRadius"}} : {{weapon.system.killRadius}} {{weapon.system.rangeUnit}}</li> <li>{{localize "CTHULHUETERNAL.Label.killRadius"}} : {{weapon.system.killRadius}} {{weapon.system.rangeUnit}}</li>
@@ -12,11 +12,23 @@
{{#if (gt weapon.system.armorPiercing 0)}} {{#if (gt weapon.system.armorPiercing 0)}}
<li>{{localize "CTHULHUETERNAL.Label.armorPiercing"}} : {{weapon.system.armorPiercing}}</li> <li>{{localize "CTHULHUETERNAL.Label.armorPiercing"}} : {{weapon.system.armorPiercing}}</li>
{{/if}} {{/if}}
{{#if (gt weapon.system.penetration 0)}}
<li>{{localize "CTHULHUETERNAL.Label.penetration"}} : {{weapon.system.penetration}}</li>
{{/if}}
{{#if ammoUsed}} {{#if ammoUsed}}
<li>{{localize "CTHULHUETERNAL.Label.ammoUsed"}}: {{ammoUsed}} / {{weapon.system.ammo.value}}</li> <li>{{localize "CTHULHUETERNAL.Label.ammoUsed"}}: {{ammoUsed}} / {{weapon.system.ammo.value}}</li>
{{/if}} {{/if}}
<li class="result-non-lethal">{{localize "CTHULHUETERNAL.Label.damageMessage"}}: <strong>{{rollResult}}</strong></li>
<li class="li-apply-wounds">
{{localize "CTHULHUETERNAL.Label.applyWounds"}}
<select name="combatant" class="li-apply-wounds-select">
{{selectOptions combatants valueAttr="id" labelAttr="name"}}
</select>
</li>
<li class="result-non-lethal">{{localize "CTHULHUETERNAL.Label.damageMessage"}}: <strong>{{rollResult}}</strong>
</li>
</ul> </ul>