Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| bb6a6248f2 | |||
| 7dc2492c96 |
@@ -60,4 +60,4 @@ jobs:
|
||||
manifest: 'https://www.uberwald.me/gitea/public/fvtt-cthulhu-eternal/releases/download/latest/system.json'
|
||||
notes: 'https://www.uberwald.me/gitea/${{gitea.repository}}/releases/download/${{github.event.release.tag_name}}/fvtt-cthulhu-eternal.zip'
|
||||
compatibility-minimum: '13'
|
||||
compatibility-verified: '13'
|
||||
compatibility-verified: '14'
|
||||
@@ -232,6 +232,32 @@ i.fvtt-cthulhu-eternal {
|
||||
font-family: var(--font-primary);
|
||||
font-size: calc(var(--font-size-standard) * 1.02);
|
||||
}
|
||||
.chat-san-request ul .combatants-grid,
|
||||
.chat-lethal-damage ul .combatants-grid {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 1fr 1fr;
|
||||
gap: 4px;
|
||||
margin: 8px 0;
|
||||
}
|
||||
.chat-san-request ul .combatants-grid button.apply-wounds-btn,
|
||||
.chat-lethal-damage ul .combatants-grid button.apply-wounds-btn {
|
||||
font-family: var(--font-primary);
|
||||
font-size: calc(var(--font-size-standard) * 0.7);
|
||||
border: 1px solid #4b4a44;
|
||||
padding: 4px 6px;
|
||||
cursor: pointer;
|
||||
transition: background-color 0.3s;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
background-color: #f0f0e0;
|
||||
color: #1c1c1c;
|
||||
}
|
||||
.chat-san-request ul .combatants-grid button.apply-wounds-btn:hover,
|
||||
.chat-lethal-damage ul .combatants-grid button.apply-wounds-btn:hover {
|
||||
background-color: #d5d5c5;
|
||||
border-color: #2d2d2a;
|
||||
}
|
||||
.fvtt-cthulhu-eternal .protagonist-sheet-common label {
|
||||
font-family: var(--font-secondary);
|
||||
font-size: calc(var(--font-size-standard) * 1);
|
||||
|
||||
@@ -170,6 +170,9 @@ Hooks.on("renderChatMessageHTML", (message, html, data) => {
|
||||
$(html).find(".healing-roll").each((i, btn) => {
|
||||
btn.style.display = "inline"
|
||||
})
|
||||
$(html).find(".worn-weapon-check").each((i, btn) => {
|
||||
btn.style.display = "inline"
|
||||
})
|
||||
if (game.user.isGM) {
|
||||
$(html).find(".opposed-roll").each((i, btn) => {
|
||||
btn.style.display = "inline"
|
||||
@@ -185,6 +188,9 @@ Hooks.on("renderChatMessageHTML", (message, html, data) => {
|
||||
$(html).find(".healing-roll").click((event) => {
|
||||
CthulhuEternalUtils.healingRoll(message)
|
||||
})
|
||||
$(html).find(".worn-weapon-check").click((event) => {
|
||||
CthulhuEternalUtils.wornWeaponCheck(message)
|
||||
})
|
||||
$(html).find(".san-loose").click((event) => {
|
||||
CthulhuEternalUtils.applySANLoss(message, event)
|
||||
})
|
||||
@@ -197,11 +203,30 @@ Hooks.on("renderChatMessageHTML", (message, html, data) => {
|
||||
}
|
||||
if (game.user.isGM) {
|
||||
$(html).find(".li-apply-wounds").each((i, btn) => {
|
||||
btn.style.display = "inline"
|
||||
btn.style.display = "block"
|
||||
})
|
||||
$(html).find(".li-apply-wounds-select").click((event) => {
|
||||
$(html).find(".apply-wounds-btn").click((event) => {
|
||||
CthulhuEternalUtils.applyWounds(message, event)
|
||||
})
|
||||
$(html).find(".apply-wounds-btn").hover(
|
||||
function (event) {
|
||||
// Mouse enter - select the token
|
||||
let combatantId = $(this).data("combatant-id")
|
||||
if (combatantId && game.combat) {
|
||||
let combatant = game.combat.combatants.get(combatantId)
|
||||
if (combatant?.token) {
|
||||
let token = canvas.tokens.get(combatant.token.id)
|
||||
if (token) {
|
||||
token.control({ releaseOthers: true })
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
function (event) {
|
||||
// Mouse leave - release selection
|
||||
canvas.tokens.releaseAll()
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
})
|
||||
|
||||
@@ -571,6 +571,8 @@
|
||||
}
|
||||
},
|
||||
"Label": {
|
||||
"JunkWeapon": "This weapon is in 'Junk' state, -20% applied. Critical failure on a roll of 96-100",
|
||||
"WornWeapon": "This weapon is 'Worn', a Luck roll will be performed.",
|
||||
"noTarget": "No target selected",
|
||||
"noDefenseRoll": "No defense roll available",
|
||||
"opposedRoll": "Opposed Roll",
|
||||
@@ -606,6 +608,10 @@
|
||||
"rollNudge": "Roll Nudge",
|
||||
"rollDamage": "Roll Damage",
|
||||
"rollHealing": "Roll Healing",
|
||||
"wornWeaponCheck": "Check Weapon Condition",
|
||||
"wornWeaponCheckTitle": "Worn Weapon Condition Check",
|
||||
"wornWeaponCheckSuccess": "{weapon}: Luck roll succeeded ({roll}/50) - Weapon remains worn.",
|
||||
"wornWeaponCheckFailure": "{weapon}: Luck roll failed ({roll}/50) - Weapon became junk!",
|
||||
"result": "Result",
|
||||
"damageMessage": "Damage to apply",
|
||||
"lethalityRoll": "Lethality Roll",
|
||||
@@ -617,6 +623,7 @@
|
||||
"ZeroWP": "Zero WP : Automatic failure (ie 0%)",
|
||||
"LowWP": "Low WP",
|
||||
"Exhausted": "Exhausted",
|
||||
"wornWeaponWarning": "Worn weapon: Don't forget to make the luck roll after the attack!",
|
||||
"creature": "Creature",
|
||||
"Rituals": "Rituals",
|
||||
"Tomes": "Tomes",
|
||||
@@ -814,6 +821,8 @@
|
||||
"WrongEra": "The era of the item does not match the ear of the system",
|
||||
"NoSelectiveFireChoices": "Not enough ammo fo Selective Fire choices for this weapon.",
|
||||
"NoAmmo": "No more ammo for this weapon. ",
|
||||
"WeaponBecameJunk": "Weapon {weapon} became junk!",
|
||||
"noWeaponFound": "No weapon found.",
|
||||
"noRollDataFound": "No roll data found",
|
||||
"noActorFound": "No actor found for this item.",
|
||||
"noSanLossFound": "No SAN loss value found.",
|
||||
|
||||
11
lang/fr.json
11
lang/fr.json
@@ -565,6 +565,8 @@
|
||||
}
|
||||
},
|
||||
"Label": {
|
||||
"JunkWeapon": "Cette arme est 'Défectueuse'', -20% appliqué. Échec critique sur un jet de 96-100",
|
||||
"WornWeapon": "Cette arme est 'Usée', un jet de Chance sera effectué.",
|
||||
"noTarget": "Aucune cible sélectionnée",
|
||||
"noDefenseRoll": "Aucun jet de défense existant",
|
||||
"opposedRoll": "Jet opposé",
|
||||
@@ -600,6 +602,10 @@
|
||||
"rollNudge": "Modifier le jet",
|
||||
"rollDamage": "Jet de dégâts",
|
||||
"rollHealing": "Jet de soin",
|
||||
"wornWeaponCheck": "Vérifier l'état de l'arme",
|
||||
"wornWeaponCheckTitle": "Vérification d'état d'arme usée",
|
||||
"wornWeaponCheckSuccess": "{weapon} : Jet de chance réussi ({roll}/50) - L'arme reste usée.",
|
||||
"wornWeaponCheckFailure": "{weapon} : Jet de chance échoué ({roll}/50) - L'arme devient défectueuse !",
|
||||
"result": "Resultat",
|
||||
"damageMessage": "Dégâts à appliquer",
|
||||
"lethalityRoll": "Jet de Létalité",
|
||||
@@ -610,8 +616,7 @@
|
||||
"Weapon": "Arme",
|
||||
"ZeroWP": "PVO à 0 : Echec automatique (ie 0%)",
|
||||
"LowWP": "PVO faibles",
|
||||
"Exhausted": "Epuisé",
|
||||
"creature": "Créature",
|
||||
"Exhausted": "Epuisé", "wornWeaponWarning": "Arme usée : N'oubliez pas de faire le jet de chance après l'attaque !", "creature": "Créature",
|
||||
"Rituals": "Rituels",
|
||||
"Tomes": "Ouvrages",
|
||||
"otherBenefits": "Autres avantages",
|
||||
@@ -810,6 +815,8 @@
|
||||
"WrongEra": "L'époque de l'item ne correspond pas à celle du jeu en cours.",
|
||||
"NoSelectiveFireChoices": "Aucune option de tir sélectif n'est disponible pour cette arme : pas assez de munitions.",
|
||||
"NoAmmo": "Aucune munition disponible pour cette arme.",
|
||||
"WeaponBecameJunk": "L'arme {weapon} est devenue défectueuse !",
|
||||
"noWeaponFound": "Aucune arme trouvée.",
|
||||
"noRollDataFound": "Aucune donnée de jet trouvée.",
|
||||
"noActorFound": "Aucun protagoniste trouvé.",
|
||||
"noSanLossFound": "Aucune valeur de perte de SAN trouvée.",
|
||||
|
||||
@@ -203,7 +203,7 @@ Hooks.once('tokenActionHudCoreApiReady', async (coreModule) => {
|
||||
skills = skills.sort((a, b) => a.name.localeCompare(b.name))
|
||||
console.log('Building skills actions for skills:', skills)
|
||||
for (const skill of skills) {
|
||||
console.log('Processing skill item:', skill)
|
||||
//console.log('Processing skill item:', skill)
|
||||
if (skill.system.skillTotal > 0) {
|
||||
const tooltip = {
|
||||
content: String(skill.system.skillTotal),
|
||||
|
||||
@@ -310,7 +310,13 @@ export default class CthulhuEternalRoll extends Roll {
|
||||
|
||||
options.rollItem = CthulhuEternalUtils.getWeaponSkill(actor, options.rollItem, era)
|
||||
options.initialScore = options.rollItem.system.skillTotal
|
||||
console.log("WEAPON", era, options.rollItem)
|
||||
if (options.weapon.system.state === "junk") {
|
||||
options.isJunk = true
|
||||
options.initialScore = Math.max(0, options.initialScore - 20) // -20% for junk weapons
|
||||
}
|
||||
if (options.weapon.system.state === "worn") {
|
||||
options.isWorn = true
|
||||
}
|
||||
}
|
||||
break
|
||||
default:
|
||||
@@ -341,6 +347,8 @@ export default class CthulhuEternalRoll extends Roll {
|
||||
targetScore: options.initialScore,
|
||||
isLowWP: options.isLowWP,
|
||||
isZeroWP: options.isZeroWP,
|
||||
isJunk: options.isJunk,
|
||||
isWorn: options.isWorn,
|
||||
isExhausted: options.isExhausted,
|
||||
enableHand: options.rollItem.enableHand,
|
||||
enableStowed: options.rollItem.enableStowed,
|
||||
@@ -464,14 +472,15 @@ export default class CthulhuEternalRoll extends Roll {
|
||||
const roll = new this(formula, options.data, rollData)
|
||||
await roll.evaluate()
|
||||
|
||||
roll.displayRollResult(roll, options, rollData)
|
||||
await roll.displayRollResult(roll, options, rollData)
|
||||
|
||||
if (Hooks.call("fvtt-cthulhu-eternal.Roll", options, rollData, roll) === false) return
|
||||
|
||||
|
||||
return roll
|
||||
}
|
||||
|
||||
displayRollResult(formula, options, rollData) {
|
||||
async displayRollResult(formula, options, rollData) {
|
||||
|
||||
// Compute the result quality
|
||||
let resultType = "failure"
|
||||
@@ -489,6 +498,11 @@ export default class CthulhuEternalRoll extends Roll {
|
||||
resultType = "failureCritical"
|
||||
}
|
||||
}
|
||||
if (rollData.weapon?.system?.state === "junk" && this.total > 95) {
|
||||
this.options.isDestroyed = true
|
||||
rollData.isDestroyed = true
|
||||
resultType = "failureCritical"
|
||||
}
|
||||
// As per the rules, a roll of 100 is always a failure, even if the target is above 100
|
||||
if (this.total === 100) {
|
||||
resultType = "failureCritical"
|
||||
|
||||
@@ -127,6 +127,8 @@ export default class CthulhuEternalProtagonist extends foundry.abstract.TypeData
|
||||
dmgBonus = -2
|
||||
} else if (this.characteristics.str.value <= 8) {
|
||||
dmgBonus = -1
|
||||
} else if (this.characteristics.str.value <= 12) {
|
||||
dmgBonus = 0
|
||||
} else if (this.characteristics.str.value <= 16) {
|
||||
dmgBonus = 1
|
||||
} else if (this.characteristics.str.value <= 40) {
|
||||
|
||||
@@ -483,6 +483,66 @@ export default class CthulhuEternalUtils {
|
||||
actor.system.roll("damage", rollData.weapon)
|
||||
}
|
||||
|
||||
static async wornWeaponCheck(rollMessage) {
|
||||
let rollData = rollMessage.rolls[0]?.options?.rollData
|
||||
if (!rollData) {
|
||||
rollData = rollMessage.getFlag("fvtt-cthulhu-eternal", "rollData")
|
||||
}
|
||||
if (!rollData) {
|
||||
ui.notifications.error(game.i18n.localize("CTHULHUETERNAL.Label.noRollDataFound"))
|
||||
return
|
||||
}
|
||||
let actor = game.actors.get(rollData.actorId)
|
||||
if (!actor) {
|
||||
ui.notifications.error(game.i18n.localize("CTHULHUETERNAL.Label.noActorFound"))
|
||||
return
|
||||
}
|
||||
let weapon = rollData.weapon
|
||||
if (!weapon) {
|
||||
ui.notifications.error(game.i18n.localize("CTHULHUETERNAL.Label.noWeaponFound"))
|
||||
return
|
||||
}
|
||||
|
||||
// Lance un jet de chance (50%)
|
||||
let luckRoll = new Roll("1d100")
|
||||
await luckRoll.evaluate()
|
||||
|
||||
let isSuccess = luckRoll.total <= 50
|
||||
let resultMsg = ""
|
||||
|
||||
if (isSuccess) {
|
||||
// Succès - l'arme reste worn
|
||||
resultMsg = game.i18n.format("CTHULHUETERNAL.Label.wornWeaponCheckSuccess", {
|
||||
weapon: weapon.name,
|
||||
roll: luckRoll.total
|
||||
})
|
||||
} else {
|
||||
// Échec - l'arme devient junk
|
||||
resultMsg = game.i18n.format("CTHULHUETERNAL.Label.wornWeaponCheckFailure", {
|
||||
weapon: weapon.name,
|
||||
roll: luckRoll.total
|
||||
})
|
||||
|
||||
// Mettre à jour l'état de l'arme
|
||||
await actor.updateEmbeddedDocuments("Item", [{
|
||||
_id: weapon._id,
|
||||
"system.state": "junk"
|
||||
}])
|
||||
|
||||
ui.notifications.warn(game.i18n.format("CTHULHUETERNAL.Notifications.WeaponBecameJunk", { weapon: weapon.name }))
|
||||
}
|
||||
|
||||
// Créer un message de chat avec le résultat
|
||||
await ChatMessage.create({
|
||||
user: game.user.id,
|
||||
content: `<div class="cthulhu-eternal-roll">
|
||||
<h4>${game.i18n.localize("CTHULHUETERNAL.Label.wornWeaponCheckTitle")}</h4>
|
||||
<p>${resultMsg}</p>
|
||||
</div>`,
|
||||
speaker: ChatMessage.getSpeaker({ actor: actor }),
|
||||
})
|
||||
}
|
||||
|
||||
static async nudgeRoll(rollMessage) {
|
||||
|
||||
let dialogContext = rollMessage.rolls[0]?.options
|
||||
@@ -594,8 +654,8 @@ export default class CthulhuEternalUtils {
|
||||
// Remove the chat message
|
||||
this.removeChatMessageId(message.id)
|
||||
|
||||
// Get the targetted actorId from the HTML select event
|
||||
let targetCombatantId = event.target.value
|
||||
// Get the targetted actorId from the button's data attribute
|
||||
let targetCombatantId = event.currentTarget.dataset.combatantId
|
||||
let combatant = game.combat.combatants.get(targetCombatantId)
|
||||
let targetActor = combatant.token?.actor || game.actors.get(combatant.actorId)
|
||||
if (!targetActor) {
|
||||
|
||||
@@ -1 +1 @@
|
||||
MANIFEST-000269
|
||||
MANIFEST-000281
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
2025/11/12-23:48:30.686758 7f4781ffb6c0 Recovering log #267
|
||||
2025/11/12-23:48:30.697449 7f4781ffb6c0 Delete type=3 #265
|
||||
2025/11/12-23:48:30.697507 7f4781ffb6c0 Delete type=0 #267
|
||||
2025/11/13-13:58:42.410831 7f4780bff6c0 Level-0 table #272: started
|
||||
2025/11/13-13:58:42.410865 7f4780bff6c0 Level-0 table #272: 0 bytes OK
|
||||
2025/11/13-13:58:42.417362 7f4780bff6c0 Delete type=0 #270
|
||||
2025/11/13-13:58:42.434870 7f4780bff6c0 Manual compaction at level-0 from '!items!4oyPRBWPBWAChrJP' @ 72057594037927935 : 1 .. '!items!zVFfp3o0G0Zg3Ia4' @ 0 : 0; will stop at (end)
|
||||
2026/04/01-22:53:01.206674 7fcc60fed6c0 Recovering log #279
|
||||
2026/04/01-22:53:01.217456 7fcc60fed6c0 Delete type=3 #277
|
||||
2026/04/01-22:53:01.217537 7fcc60fed6c0 Delete type=0 #279
|
||||
2026/04/01-22:56:08.533863 7fcc4affd6c0 Level-0 table #284: started
|
||||
2026/04/01-22:56:08.533906 7fcc4affd6c0 Level-0 table #284: 0 bytes OK
|
||||
2026/04/01-22:56:08.586584 7fcc4affd6c0 Delete type=0 #282
|
||||
2026/04/01-22:56:08.586750 7fcc4affd6c0 Manual compaction at level-0 from '!items!4oyPRBWPBWAChrJP' @ 72057594037927935 : 1 .. '!items!zVFfp3o0G0Zg3Ia4' @ 0 : 0; will stop at (end)
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
2025/11/12-23:40:11.531092 7f47827fc6c0 Recovering log #263
|
||||
2025/11/12-23:40:11.541025 7f47827fc6c0 Delete type=0 #263
|
||||
2025/11/12-23:40:11.541091 7f47827fc6c0 Delete type=3 #261
|
||||
2025/11/12-23:40:47.861546 7f4780bff6c0 Level-0 table #268: started
|
||||
2025/11/12-23:40:47.861580 7f4780bff6c0 Level-0 table #268: 0 bytes OK
|
||||
2025/11/12-23:40:47.867844 7f4780bff6c0 Delete type=0 #266
|
||||
2025/11/12-23:40:47.874806 7f4780bff6c0 Manual compaction at level-0 from '!items!4oyPRBWPBWAChrJP' @ 72057594037927935 : 1 .. '!items!zVFfp3o0G0Zg3Ia4' @ 0 : 0; will stop at (end)
|
||||
2025/12/23-21:58:00.777018 7f1118ff96c0 Recovering log #275
|
||||
2025/12/23-21:58:00.909461 7f1118ff96c0 Delete type=3 #273
|
||||
2025/12/23-21:58:00.909547 7f1118ff96c0 Delete type=0 #275
|
||||
2025/12/23-22:36:20.406495 7f0e7bfff6c0 Level-0 table #280: started
|
||||
2025/12/23-22:36:20.406537 7f0e7bfff6c0 Level-0 table #280: 0 bytes OK
|
||||
2025/12/23-22:36:20.412428 7f0e7bfff6c0 Delete type=0 #278
|
||||
2025/12/23-22:36:20.419890 7f0e7bfff6c0 Manual compaction at level-0 from '!items!4oyPRBWPBWAChrJP' @ 72057594037927935 : 1 .. '!items!zVFfp3o0G0Zg3Ia4' @ 0 : 0; will stop at (end)
|
||||
|
||||
Binary file not shown.
@@ -1 +1 @@
|
||||
MANIFEST-000438
|
||||
MANIFEST-000450
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
2025/11/12-23:48:30.659183 7f47817fa6c0 Recovering log #436
|
||||
2025/11/12-23:48:30.670042 7f47817fa6c0 Delete type=3 #434
|
||||
2025/11/12-23:48:30.670124 7f47817fa6c0 Delete type=0 #436
|
||||
2025/11/13-13:58:42.417482 7f4780bff6c0 Level-0 table #441: started
|
||||
2025/11/13-13:58:42.417509 7f4780bff6c0 Level-0 table #441: 0 bytes OK
|
||||
2025/11/13-13:58:42.423396 7f4780bff6c0 Delete type=0 #439
|
||||
2025/11/13-13:58:42.434882 7f4780bff6c0 Manual compaction at level-0 from '!folders!5PrT9QmN1cFPzDFP' @ 72057594037927935 : 1 .. '!items!zvoUByzWSWZ87fxA' @ 0 : 0; will stop at (end)
|
||||
2026/04/01-22:53:01.173017 7fcc60fed6c0 Recovering log #448
|
||||
2026/04/01-22:53:01.184049 7fcc60fed6c0 Delete type=3 #446
|
||||
2026/04/01-22:53:01.184114 7fcc60fed6c0 Delete type=0 #448
|
||||
2026/04/01-22:56:08.365689 7fcc4affd6c0 Level-0 table #453: started
|
||||
2026/04/01-22:56:08.365761 7fcc4affd6c0 Level-0 table #453: 0 bytes OK
|
||||
2026/04/01-22:56:08.421424 7fcc4affd6c0 Delete type=0 #451
|
||||
2026/04/01-22:56:08.586720 7fcc4affd6c0 Manual compaction at level-0 from '!folders!5PrT9QmN1cFPzDFP' @ 72057594037927935 : 1 .. '!items!zvoUByzWSWZ87fxA' @ 0 : 0; will stop at (end)
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
2025/11/12-23:40:11.502931 7f4781ffb6c0 Recovering log #432
|
||||
2025/11/12-23:40:11.512928 7f4781ffb6c0 Delete type=0 #432
|
||||
2025/11/12-23:40:11.512984 7f4781ffb6c0 Delete type=3 #430
|
||||
2025/11/12-23:40:47.855365 7f4780bff6c0 Level-0 table #437: started
|
||||
2025/11/12-23:40:47.855411 7f4780bff6c0 Level-0 table #437: 0 bytes OK
|
||||
2025/11/12-23:40:47.861414 7f4780bff6c0 Delete type=0 #435
|
||||
2025/11/12-23:40:47.874794 7f4780bff6c0 Manual compaction at level-0 from '!folders!5PrT9QmN1cFPzDFP' @ 72057594037927935 : 1 .. '!items!zvoUByzWSWZ87fxA' @ 0 : 0; will stop at (end)
|
||||
2025/12/23-21:58:00.532068 7f1119ffb6c0 Recovering log #444
|
||||
2025/12/23-21:58:00.647819 7f1119ffb6c0 Delete type=3 #442
|
||||
2025/12/23-21:58:00.647954 7f1119ffb6c0 Delete type=0 #444
|
||||
2025/12/23-22:36:20.355345 7f0e7bfff6c0 Level-0 table #449: started
|
||||
2025/12/23-22:36:20.355397 7f0e7bfff6c0 Level-0 table #449: 0 bytes OK
|
||||
2025/12/23-22:36:20.362045 7f0e7bfff6c0 Delete type=0 #447
|
||||
2025/12/23-22:36:20.385891 7f0e7bfff6c0 Manual compaction at level-0 from '!folders!5PrT9QmN1cFPzDFP' @ 72057594037927935 : 1 .. '!items!zvoUByzWSWZ87fxA' @ 0 : 0; will stop at (end)
|
||||
|
||||
Binary file not shown.
@@ -1 +1 @@
|
||||
MANIFEST-000084
|
||||
MANIFEST-000096
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
2025/11/12-23:48:30.674156 7f4781ffb6c0 Recovering log #82
|
||||
2025/11/12-23:48:30.683495 7f4781ffb6c0 Delete type=3 #80
|
||||
2025/11/12-23:48:30.683546 7f4781ffb6c0 Delete type=0 #82
|
||||
2025/11/13-13:58:42.404378 7f4780bff6c0 Level-0 table #87: started
|
||||
2025/11/13-13:58:42.404437 7f4780bff6c0 Level-0 table #87: 0 bytes OK
|
||||
2025/11/13-13:58:42.410719 7f4780bff6c0 Delete type=0 #85
|
||||
2025/11/13-13:58:42.434856 7f4780bff6c0 Manual compaction at level-0 from '!folders!0DI3T2jve3nsmsfZ' @ 72057594037927935 : 1 .. '!items!zyxA9DhO36t5OBDv' @ 0 : 0; will stop at (end)
|
||||
2026/04/01-22:53:01.192292 7fcc4b7fe6c0 Recovering log #94
|
||||
2026/04/01-22:53:01.202349 7fcc4b7fe6c0 Delete type=3 #92
|
||||
2026/04/01-22:53:01.202397 7fcc4b7fe6c0 Delete type=0 #94
|
||||
2026/04/01-22:56:08.421577 7fcc4affd6c0 Level-0 table #99: started
|
||||
2026/04/01-22:56:08.421606 7fcc4affd6c0 Level-0 table #99: 0 bytes OK
|
||||
2026/04/01-22:56:08.475595 7fcc4affd6c0 Delete type=0 #97
|
||||
2026/04/01-22:56:08.586731 7fcc4affd6c0 Manual compaction at level-0 from '!folders!0DI3T2jve3nsmsfZ' @ 72057594037927935 : 1 .. '!items!zyxA9DhO36t5OBDv' @ 0 : 0; will stop at (end)
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
2025/11/12-23:40:11.517421 7f4782ffd6c0 Recovering log #78
|
||||
2025/11/12-23:40:11.527038 7f4782ffd6c0 Delete type=0 #78
|
||||
2025/11/12-23:40:11.527106 7f4782ffd6c0 Delete type=3 #76
|
||||
2025/11/12-23:40:47.867960 7f4780bff6c0 Level-0 table #83: started
|
||||
2025/11/12-23:40:47.867984 7f4780bff6c0 Level-0 table #83: 0 bytes OK
|
||||
2025/11/12-23:40:47.874660 7f4780bff6c0 Delete type=0 #81
|
||||
2025/11/12-23:40:47.874816 7f4780bff6c0 Manual compaction at level-0 from '!folders!0DI3T2jve3nsmsfZ' @ 72057594037927935 : 1 .. '!items!zyxA9DhO36t5OBDv' @ 0 : 0; will stop at (end)
|
||||
2025/12/23-21:58:00.654695 7f1119ffb6c0 Recovering log #90
|
||||
2025/12/23-21:58:00.773269 7f1119ffb6c0 Delete type=3 #88
|
||||
2025/12/23-21:58:00.773360 7f1119ffb6c0 Delete type=0 #90
|
||||
2025/12/23-22:36:20.362172 7f0e7bfff6c0 Level-0 table #95: started
|
||||
2025/12/23-22:36:20.362202 7f0e7bfff6c0 Level-0 table #95: 0 bytes OK
|
||||
2025/12/23-22:36:20.368698 7f0e7bfff6c0 Delete type=0 #93
|
||||
2025/12/23-22:36:20.385910 7f0e7bfff6c0 Manual compaction at level-0 from '!folders!0DI3T2jve3nsmsfZ' @ 72057594037927935 : 1 .. '!items!zyxA9DhO36t5OBDv' @ 0 : 0; will stop at (end)
|
||||
|
||||
Binary file not shown.
@@ -111,8 +111,8 @@ i.fvtt-cthulhu-eternal {
|
||||
padding: 2px 2px;
|
||||
cursor: pointer;
|
||||
transition: background-color 0.3s;
|
||||
min-width: 6.0rem;
|
||||
max-width: 6.0rem;
|
||||
min-width: 6rem;
|
||||
max-width: 6rem;
|
||||
}
|
||||
}
|
||||
.san-loose-buttons {
|
||||
@@ -128,8 +128,8 @@ i.fvtt-cthulhu-eternal {
|
||||
padding: 2px 2px;
|
||||
cursor: pointer;
|
||||
transition: background-color 0.3s;
|
||||
min-width: 3.0rem;
|
||||
max-width: 3.0rem;
|
||||
min-width: 3rem;
|
||||
max-width: 3rem;
|
||||
}
|
||||
}
|
||||
.result-non-lethal {
|
||||
@@ -141,5 +141,28 @@ i.fvtt-cthulhu-eternal {
|
||||
font-family: var(--font-primary);
|
||||
font-size: calc(var(--font-size-standard) * 1.02);
|
||||
}
|
||||
.combatants-grid {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 1fr 1fr;
|
||||
gap: 4px;
|
||||
margin: 8px 0;
|
||||
button.apply-wounds-btn {
|
||||
font-family: var(--font-primary);
|
||||
font-size: calc(var(--font-size-standard) * 0.7);
|
||||
border: 1px solid #4b4a44;
|
||||
padding: 4px 6px;
|
||||
cursor: pointer;
|
||||
transition: background-color 0.3s;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
background-color: #f0f0e0;
|
||||
color: #1c1c1c;
|
||||
&:hover {
|
||||
background-color: #d5d5c5;
|
||||
border-color: #2d2d2a;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
},
|
||||
"compatibility": {
|
||||
"minimum": "13",
|
||||
"verified": "13"
|
||||
"verified": "14"
|
||||
},
|
||||
"esmodules": [
|
||||
"cthulhu-eternal.mjs"
|
||||
|
||||
@@ -54,6 +54,13 @@
|
||||
: -20%</li>
|
||||
{{/if}}
|
||||
|
||||
{{#if isWorn}}
|
||||
<li class="orange-warning"><i
|
||||
class="fa-solid fa-triangle-exclamation"
|
||||
></i>
|
||||
{{localize "CTHULHUETERNAL.Label.wornWeaponWarning"}}</li>
|
||||
{{/if}}
|
||||
|
||||
{{#if (eq rollType "resource")}}
|
||||
<li>{{localize "CTHULHUETERNAL.Label.multiplier"}}
|
||||
:
|
||||
@@ -206,6 +213,18 @@
|
||||
{{/if}}
|
||||
{{/if}}
|
||||
|
||||
{{#if (eq rollType "weapon")}}
|
||||
{{#if isWorn}}
|
||||
<a
|
||||
class="worn-weapon-check chat-action-button"
|
||||
data-weapon-id="{{weapon.id}}"
|
||||
data-tooltip="{{localize 'CTHULHUETERNAL.Label.wornWeaponCheck'}}"
|
||||
>
|
||||
<i class="fa-solid fa-dice"></i>
|
||||
</a>
|
||||
{{/if}}
|
||||
{{/if}}
|
||||
|
||||
{{#if isFailure}}
|
||||
{{#if isNudge}}
|
||||
<a
|
||||
|
||||
@@ -1,34 +1,58 @@
|
||||
<div class="{{cssClass}}">
|
||||
<div class="chat-lethal-damage">
|
||||
<ul>
|
||||
<li><strong>{{weapon.name}} : {{localize "CTHULHUETERNAL.Label.damageRoll"}}</strong></li>
|
||||
<li>{{localize "CTHULHUETERNAL.Label.result"}} :{{rollResult}} ({{formula}})</li>
|
||||
<li><strong>{{weapon.name}}
|
||||
:
|
||||
{{localize "CTHULHUETERNAL.Label.damageRoll"}}</strong></li>
|
||||
<li>{{localize "CTHULHUETERNAL.Label.result"}}
|
||||
:{{rollResult}}
|
||||
({{formula}})</li>
|
||||
|
||||
{{#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>
|
||||
<li>{{localize "CTHULHUETERNAL.Label.killRadiusInfo"}}</li>
|
||||
{{/if}}
|
||||
|
||||
{{#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 (gt weapon.system.penetration 0)}}
|
||||
<li>{{localize "CTHULHUETERNAL.Label.penetration"}} : {{weapon.system.penetration}}</li>
|
||||
<li>{{localize "CTHULHUETERNAL.Label.penetration"}}
|
||||
:
|
||||
{{weapon.system.penetration}}</li>
|
||||
{{/if}}
|
||||
|
||||
{{#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}}
|
||||
|
||||
<li class="li-apply-wounds">
|
||||
{{localize "CTHULHUETERNAL.Label.applyWounds"}}
|
||||
<select name="combatant" class="li-apply-wounds-select">
|
||||
<option value="none"></option>
|
||||
{{selectOptions combatants valueAttr="id" labelAttr="name"}}
|
||||
</select>
|
||||
<div>{{localize "CTHULHUETERNAL.Label.applyWounds"}}</div>
|
||||
<div class="combatants-grid">
|
||||
{{#each combatants}}
|
||||
<button
|
||||
class="apply-wounds-btn"
|
||||
data-combatant-id="{{this.id}}"
|
||||
title="{{this.name}}"
|
||||
>
|
||||
{{this.name}}
|
||||
</button>
|
||||
{{/each}}
|
||||
</div>
|
||||
</li>
|
||||
|
||||
<li class="result-non-lethal">{{localize "CTHULHUETERNAL.Label.damageMessage"}}: <strong>{{rollResult}}</strong>
|
||||
<li class="result-non-lethal">{{localize
|
||||
"CTHULHUETERNAL.Label.damageMessage"
|
||||
}}:
|
||||
<strong>{{rollResult}}</strong>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
|
||||
@@ -44,6 +44,16 @@
|
||||
{{/if}}
|
||||
|
||||
{{#if weapon}}
|
||||
{{#if isJunk}}
|
||||
<div class="dialog-skill red-warning">{{localize
|
||||
"CTHULHUETERNAL.Label.JunkWeapon"
|
||||
}}</div>
|
||||
{{/if}}
|
||||
{{#if isWorn}}
|
||||
<div class="dialog-skill orange-warning">{{localize
|
||||
"CTHULHUETERNAL.Label.WornWeapon"
|
||||
}}</div>
|
||||
{{/if}}
|
||||
<div class="dialog-skill">{{localize "CTHULHUETERNAL.Label.Weapon"}}
|
||||
:
|
||||
{{weapon.name}}</div>
|
||||
|
||||
Reference in New Issue
Block a user