Roll and styles update
Some checks failed
Release Creation / build (release) Failing after 1m17s

This commit is contained in:
2026-04-15 02:16:51 +02:00
parent b3cf0b0aa1
commit 49996104ce
35 changed files with 498 additions and 197 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.6 KiB

View File

Before

Width:  |  Height:  |  Size: 7.8 KiB

After

Width:  |  Height:  |  Size: 7.8 KiB

View File

@@ -39,6 +39,7 @@ import {
} from "./module/applications/_module.mjs"
const DAMAGE_APPLICATION_FLAG = "damageApplication"
const MOON_EFFECT_FLAG = "moonEffectApplied"
const FACTION_ASPECT_STATE_SETTING = "factionAspectState"
const PREGENS_IMPORTED_SETTING = "pregensImported"
const WELCOME_SCENE_IMPORTED_SETTING = "welcomeSceneImported"
@@ -173,6 +174,9 @@ Hooks.once("ready", async () => {
if (foundry.utils.hasProperty(changed, `flags.${SYSTEM_ID}.${DAMAGE_APPLICATION_FLAG}`)) {
_updateRenderedChatMessageState(message)
}
if (foundry.utils.hasProperty(changed, `flags.${SYSTEM_ID}.${MOON_EFFECT_FLAG}`)) {
_updateRenderedMoonEffectState(message)
}
})
_activateExistingChatCards()
@@ -548,8 +552,9 @@ function _activateExistingChatCards() {
document.querySelectorAll(".message[data-message-id]").forEach(messageEl => {
const messageId = messageEl.dataset.messageId
const message = game.messages.get(messageId)
const root = messageEl.querySelector(".celestopol.chat-roll")
if (!message || !root) return
if (!message) return
const root = messageEl.querySelector(".celestopol.chat-roll, .celestopol-roll.moon-standalone-card")
if (!root) return
_activateChatCardListeners(message, root)
})
}
@@ -559,12 +564,19 @@ function _activateChatCardListeners(message, html) {
if (!root) return
_renderWeaponDamageState(message, root)
_renderMoonEffectState(message, root)
root.querySelectorAll('[data-action="apply-weapon-damage"]').forEach(button => {
if (button.dataset.bound === "true") return
button.dataset.bound = "true"
button.addEventListener("click", event => _onApplyWeaponDamageClick(event, message))
})
root.querySelectorAll('[data-action="apply-moon-effect"]').forEach(button => {
if (button.dataset.bound === "true") return
button.dataset.bound = "true"
button.addEventListener("click", event => _onApplyMoonEffectClick(event, message))
})
}
async function _onApplyWeaponDamageClick(event, message) {
@@ -746,6 +758,126 @@ async function _applyWeaponDamage({ actorId, actorUuid = null, incomingWounds, c
return { actorName: actor.name, appliedWounds, armorProtection }
}
/* ─── Dé de la Lune — contreparties ─────────────────────────────────────── */
function _getMoonEffectState(message) {
return message?.getFlag(SYSTEM_ID, MOON_EFFECT_FLAG) ?? null
}
function _renderMoonEffectState(message, root) {
const state = _getMoonEffectState(message)
const actionsDiv = root.querySelector(".moon-effect-actions")
if (!actionsDiv) return
if (!state?.applied) return
const NEGATIVE_EFFECTS = new Set(["lose-anomaly", "gain-spleen", "lose-destin"])
// Désactiver tous les boutons et afficher le statut
actionsDiv.querySelectorAll(".moon-effect-btn").forEach(btn => { btn.disabled = true })
let statusEl = actionsDiv.querySelector(".moon-effect-applied-status")
if (!statusEl) {
statusEl = document.createElement("span")
actionsDiv.append(statusEl)
}
statusEl.className = "moon-effect-applied-status" + (NEGATIVE_EFFECTS.has(state.effect) ? " is-negative" : "")
statusEl.textContent = state.effectLabel
? game.i18n.format("CELESTOPOL.Moon.effectApplied", { label: state.effectLabel })
: game.i18n.localize("CELESTOPOL.Moon.effectApplied")
}
function _updateRenderedMoonEffectState(message) {
const msgEl = document.querySelector(`.message[data-message-id="${message.id}"]`)
if (!msgEl) return
const root = msgEl.querySelector(".celestopol.chat-roll, .celestopol-roll.moon-standalone-card")
if (!root) return
_renderMoonEffectState(message, root)
}
async function _onApplyMoonEffectClick(event, message) {
event.preventDefault()
const state = _getMoonEffectState(message)
if (state?.applied) return
const button = event.currentTarget
const effect = button.dataset.effect
const actionsDiv = button.closest(".moon-effect-actions")
const actorId = actionsDiv?.dataset.moonActorId ?? ""
const actorUuid = actionsDiv?.dataset.moonActorUuid ?? ""
// Désactiver immédiatement pour éviter les double-clics
actionsDiv?.querySelectorAll(".moon-effect-btn").forEach(btn => { btn.disabled = true })
const actor = await CelestopolRoll.resolveActor({ actorId, actorUuid })
if (!actor) {
ui.notifications.warn(game.i18n.localize("CELESTOPOL.Moon.actorNotFound"))
actionsDiv?.querySelectorAll(".moon-effect-btn").forEach(btn => { btn.disabled = false })
return
}
const effectLabel = await _applyMoonEffect(actor, effect)
if (effectLabel === null) {
actionsDiv?.querySelectorAll(".moon-effect-btn").forEach(btn => { btn.disabled = false })
return
}
await message.setFlag(SYSTEM_ID, MOON_EFFECT_FLAG, { applied: true, effect, effectLabel })
}
async function _applyMoonEffect(actor, effect) {
const i18n = key => game.i18n.localize(`CELESTOPOL.Moon.${key}`)
const anomaly = actor.items.find(i => i.type === "anomaly")
switch (effect) {
case "regain-anomaly": {
if (!anomaly) { ui.notifications.warn(i18n("noAnomaly")); return null }
const max = anomaly.system?.level ?? 0
const cur = anomaly.system?.usesRemaining ?? 0
if (cur >= max) { ui.notifications.warn(i18n("anomalyFull")); return null }
await anomaly.update({ "system.usesRemaining": Math.min(max, cur + 1) })
ui.notifications.info(game.i18n.format("CELESTOPOL.Moon.effectApplied", { label: i18n("effectRegainAnomaly") }))
return i18n("effectRegainAnomaly")
}
case "lose-spleen": {
const cur = actor.system?.spleen?.lvl ?? 0
if (cur <= 0) { ui.notifications.warn(i18n("spleenEmpty")); return null }
await actor.update({ "system.spleen.lvl": Math.max(0, cur - 1) })
ui.notifications.info(game.i18n.format("CELESTOPOL.Moon.effectApplied", { label: i18n("effectLoseSpleen") }))
return i18n("effectLoseSpleen")
}
case "gain-destin": {
const cur = actor.system?.destin?.lvl ?? 0
await actor.update({ "system.destin.lvl": Math.min(8, cur + 2) })
ui.notifications.info(game.i18n.format("CELESTOPOL.Moon.effectApplied", { label: i18n("effectGainDestin") }))
return i18n("effectGainDestin")
}
case "lose-destin": {
const cur = actor.system?.destin?.lvl ?? 0
await actor.update({ "system.destin.lvl": Math.max(0, cur - 2) })
ui.notifications.info(game.i18n.format("CELESTOPOL.Moon.effectApplied", { label: i18n("effectLoseDestin") }))
return i18n("effectLoseDestin")
}
case "lose-anomaly": {
if (!anomaly) { ui.notifications.warn(i18n("noAnomaly")); return null }
const cur = anomaly.system?.usesRemaining ?? 0
if (cur <= 0) { ui.notifications.warn(i18n("anomalyEmpty")); return null }
await anomaly.update({ "system.usesRemaining": Math.max(0, cur - 1) })
ui.notifications.info(game.i18n.format("CELESTOPOL.Moon.effectApplied", { label: i18n("effectLoseAnomaly") }))
return i18n("effectLoseAnomaly")
}
case "gain-spleen": {
const cur = actor.system?.spleen?.lvl ?? 0
if (cur >= 8) { ui.notifications.warn(i18n("spleenFull")); return null }
await actor.update({ "system.spleen.lvl": Math.min(8, cur + 1) })
ui.notifications.info(game.i18n.format("CELESTOPOL.Moon.effectApplied", { label: i18n("effectGainSpleen") }))
return i18n("effectGainSpleen")
}
default:
return null
}
}
function _getDefaultFactionAspectState() {
return {
pointsMax: 8,

View File

@@ -350,7 +350,22 @@
"mauvaiseFortune": "🔴 Mauvaise Fortune",
"chanceInterpret": "Chance",
"narrativeInterpret": "Narratif",
"quantiteHint": "Valeur"
"quantiteHint": "Valeur",
"applyChoose": "Choisissez la contrepartie :",
"effectNarrativeOnly": "(Narratif — sans effet mécanique)",
"effectRegainAnomaly": "🌟 Regain d'1 Anomalie",
"effectLoseSpleen": "💚 Perte d'1 Spleen",
"effectGainDestin": "⭐ Gain de 2 Destin",
"effectLoseDestin": "⭐ Perte de 2 Destin",
"effectLoseAnomaly": "❌ Perte d'1 Anomalie",
"effectGainSpleen": "💔 Gain d'1 Spleen",
"effectApplied": "Contrepartie appliquée : {label}",
"noAnomaly": "Ce personnage n'a pas d'anomalie",
"anomalyFull": "L'anomalie est déjà au maximum d'utilisations",
"anomalyEmpty": "L'anomalie n'a plus d'utilisation disponible",
"spleenEmpty": "Le Spleen est déjà à 0",
"spleenFull": "Le Spleen est déjà au maximum",
"actorNotFound": "Personnage introuvable"
},
"Difficulty": {
"unknown": "Aucun seuil",

View File

@@ -632,13 +632,17 @@ export class CelestopolRoll extends Roll {
selectedTargetAppliedWounds,
availableTargets,
// Dé de lune
hasMoonDie: moonDieResult !== null,
hasMoonDie: moonDieResult !== null,
moonDieResult,
moonFaceSymbol: moonFace?.symbol ?? "",
moonFaceLabel: moonFace ? game.i18n.localize(moonFace.label) : "",
moonResultClass: moonResultType?.cssClass ?? "",
moonResultLabel: moonResultType ? game.i18n.localize(moonResultType.label) : "",
moonResultDesc: moonResultType ? game.i18n.localize(moonResultType.desc) : "",
moonFaceSymbol: moonFace?.symbol ?? "",
moonFaceLabel: moonFace ? game.i18n.localize(moonFace.label) : "",
moonResultClass: moonResultType?.cssClass ?? "",
moonResultLabel: moonResultType ? game.i18n.localize(moonResultType.label) : "",
moonResultDesc: moonResultType ? game.i18n.localize(moonResultType.desc) : "",
moonResultTypeId: moonResultType?.id ?? null,
moonActorId: (actorType === "character") ? (this.options.actorId ?? null) : null,
moonActorUuid: (actorType === "character") ? (this.options.actorUuid ?? null) : null,
moonActorIsCharacter: actorType === "character",
isPrivate,
tooltip: isPrivate ? "" : await this.getTooltip(),
}
@@ -698,15 +702,20 @@ export class CelestopolRoll extends Roll {
const resultType = face ? SYSTEM.MOON_RESULT_TYPES[face.result] ?? null : null
const isGoodFortune = result <= 4
const actorIsCharacter = actor?.type === "character"
const templateData = {
result,
moonFaceSymbol: face?.symbol ?? "",
moonFaceLabel: face ? game.i18n.localize(face.label) : "",
moonResultLabel: resultType ? game.i18n.localize(resultType.label) : "",
moonResultDesc: resultType ? game.i18n.localize(resultType.desc) : "",
moonResultClass: resultType?.cssClass ?? "",
moonFaceSymbol: face?.symbol ?? "",
moonFaceLabel: face ? game.i18n.localize(face.label) : "",
moonResultLabel: resultType ? game.i18n.localize(resultType.label) : "",
moonResultDesc: resultType ? game.i18n.localize(resultType.desc) : "",
moonResultClass: resultType?.cssClass ?? "",
moonResultTypeId: resultType?.id ?? null,
isGoodFortune,
actorName: actor?.name ?? null,
actorName: actor?.name ?? null,
moonActorIsCharacter: actorIsCharacter,
moonActorId: actorIsCharacter ? (actor.id ?? null) : null,
moonActorUuid: actorIsCharacter ? (actor.uuid ?? null) : null,
}
const content = await foundry.applications.handlebars.renderTemplate(
@@ -721,7 +730,6 @@ export class CelestopolRoll extends Roll {
await ChatMessage.create({
content,
speaker,
rolls: [roll],
style: CONST.CHAT_MESSAGE_STYLES.OTHER,
})
}

View File

@@ -1 +1 @@
MANIFEST-000074
MANIFEST-000076

View File

@@ -1,3 +1,8 @@
2026/04/14-10:43:54.304360 7fddcbfff6c0 Recovering log #72
2026/04/14-10:43:54.314599 7fddcbfff6c0 Delete type=3 #70
2026/04/14-10:43:54.314647 7fddcbfff6c0 Delete type=0 #72
2026/04/14-21:45:17.258246 7fc1d9fbd6c0 Recovering log #75
2026/04/14-21:45:17.274015 7fc1d9fbd6c0 Delete type=0 #75
2026/04/14-21:45:17.274077 7fc1d9fbd6c0 Delete type=3 #74
2026/04/15-02:16:16.676658 7fc1d8fbb6c0 Level-0 table #79: started
2026/04/15-02:16:16.676686 7fc1d8fbb6c0 Level-0 table #79: 0 bytes OK
2026/04/15-02:16:16.720642 7fc1d8fbb6c0 Delete type=0 #77
2026/04/15-02:16:16.819908 7fc1d8fbb6c0 Manual compaction at level-0 from '!journal!eNYstmPK0mMmVJYC' @ 72057594037927935 : 1 .. '!journal.pages!eNYstmPK0mMmVJYC.r9h1ggd3G9hiqYJX' @ 0 : 0; will stop at (end)
2026/04/15-02:16:16.881523 7fc1d8fbb6c0 Manual compaction at level-1 from '!journal!eNYstmPK0mMmVJYC' @ 72057594037927935 : 1 .. '!journal.pages!eNYstmPK0mMmVJYC.r9h1ggd3G9hiqYJX' @ 0 : 0; will stop at (end)

View File

@@ -1,8 +1,3 @@
2026/04/14-00:55:24.427256 7f68497ed6c0 Recovering log #68
2026/04/14-00:55:24.442232 7f68497ed6c0 Delete type=3 #66
2026/04/14-00:55:24.442302 7f68497ed6c0 Delete type=0 #68
2026/04/14-00:56:01.490011 7f6833fff6c0 Level-0 table #73: started
2026/04/14-00:56:01.490050 7f6833fff6c0 Level-0 table #73: 0 bytes OK
2026/04/14-00:56:01.496026 7f6833fff6c0 Delete type=0 #71
2026/04/14-00:56:01.502797 7f6833fff6c0 Manual compaction at level-0 from '!journal!eNYstmPK0mMmVJYC' @ 72057594037927935 : 1 .. '!journal.pages!eNYstmPK0mMmVJYC.r9h1ggd3G9hiqYJX' @ 0 : 0; will stop at (end)
2026/04/14-00:56:01.513341 7f6833fff6c0 Manual compaction at level-1 from '!journal!eNYstmPK0mMmVJYC' @ 72057594037927935 : 1 .. '!journal.pages!eNYstmPK0mMmVJYC.r9h1ggd3G9hiqYJX' @ 0 : 0; will stop at (end)
2026/04/14-10:43:54.304360 7fddcbfff6c0 Recovering log #72
2026/04/14-10:43:54.314599 7fddcbfff6c0 Delete type=3 #70
2026/04/14-10:43:54.314647 7fddcbfff6c0 Delete type=0 #72

Binary file not shown.

View File

@@ -1 +1 @@
MANIFEST-000127
MANIFEST-000129

View File

@@ -1,3 +1,24 @@
2026/04/14-10:43:54.279048 7fddd97be6c0 Recovering log #124
2026/04/14-10:43:54.288686 7fddd97be6c0 Delete type=3 #122
2026/04/14-10:43:54.288755 7fddd97be6c0 Delete type=0 #124
2026/04/14-21:45:17.210322 7fc1dafbf6c0 Recovering log #128
2026/04/14-21:45:17.212264 7fc1dafbf6c0 Level-0 table #130: started
2026/04/14-21:45:17.217282 7fc1dafbf6c0 Level-0 table #130: 3524 bytes OK
2026/04/14-21:45:17.232642 7fc1dafbf6c0 Delete type=0 #128
2026/04/14-21:45:17.232776 7fc1dafbf6c0 Delete type=3 #127
2026/04/15-02:16:16.615618 7fc1d8fbb6c0 Level-0 table #133: started
2026/04/15-02:16:16.640160 7fc1d8fbb6c0 Level-0 table #133: 3524 bytes OK
2026/04/15-02:16:16.676484 7fc1d8fbb6c0 Delete type=0 #131
2026/04/15-02:16:16.763469 7fc1d8fbb6c0 Manual compaction at level-0 from '!items!anomCommMorts001' @ 72057594037927935 : 1 .. '!items!null' @ 0 : 0; will stop at '!items!null' @ 109 : 1
2026/04/15-02:16:16.763478 7fc1d8fbb6c0 Compacting 2@0 + 0@1 files
2026/04/15-02:16:16.781648 7fc1d8fbb6c0 Generated table #134@0: 1 keys, 1363 bytes
2026/04/15-02:16:16.781712 7fc1d8fbb6c0 Compacted 2@0 + 0@1 files => 1363 bytes
2026/04/15-02:16:16.819583 7fc1d8fbb6c0 compacted to: files[ 0 1 1 0 0 0 0 ]
2026/04/15-02:16:16.819716 7fc1d8fbb6c0 Delete type=2 #130
2026/04/15-02:16:16.819841 7fc1d8fbb6c0 Delete type=2 #133
2026/04/15-02:16:16.881505 7fc1d8fbb6c0 Manual compaction at level-0 from '!items!null' @ 109 : 1 .. '!items!null' @ 0 : 0; will stop at (end)
2026/04/15-02:16:16.881561 7fc1d8fbb6c0 Manual compaction at level-1 from '!items!anomCommMorts001' @ 72057594037927935 : 1 .. '!items!null' @ 0 : 0; will stop at '!items!null' @ 116 : 1
2026/04/15-02:16:16.881568 7fc1d8fbb6c0 Compacting 1@1 + 1@2 files
2026/04/15-02:16:16.899721 7fc1d8fbb6c0 Generated table #135@1: 9 keys, 6617 bytes
2026/04/15-02:16:16.899762 7fc1d8fbb6c0 Compacted 1@1 + 1@2 files => 6617 bytes
2026/04/15-02:16:16.937990 7fc1d8fbb6c0 compacted to: files[ 0 0 1 0 0 0 0 ]
2026/04/15-02:16:16.938116 7fc1d8fbb6c0 Delete type=2 #126
2026/04/15-02:16:16.938278 7fc1d8fbb6c0 Delete type=2 #134
2026/04/15-02:16:17.092334 7fc1d8fbb6c0 Manual compaction at level-1 from '!items!null' @ 116 : 1 .. '!items!null' @ 0 : 0; will stop at (end)

View File

@@ -1,15 +1,3 @@
2026/04/14-00:55:24.391968 7f6848fec6c0 Recovering log #119
2026/04/14-00:55:24.406978 7f6848fec6c0 Delete type=3 #117
2026/04/14-00:55:24.407044 7f6848fec6c0 Delete type=0 #119
2026/04/14-00:56:01.480723 7f6833fff6c0 Level-0 table #125: started
2026/04/14-00:56:01.483872 7f6833fff6c0 Level-0 table #125: 3524 bytes OK
2026/04/14-00:56:01.489828 7f6833fff6c0 Delete type=0 #123
2026/04/14-00:56:01.502786 7f6833fff6c0 Manual compaction at level-0 from '!items!anomCommMorts001' @ 72057594037927935 : 1 .. '!items!null' @ 0 : 0; will stop at (end)
2026/04/14-00:56:01.502828 7f6833fff6c0 Manual compaction at level-1 from '!items!anomCommMorts001' @ 72057594037927935 : 1 .. '!items!null' @ 0 : 0; will stop at '!items!null' @ 105 : 1
2026/04/14-00:56:01.502835 7f6833fff6c0 Compacting 1@1 + 1@2 files
2026/04/14-00:56:01.506551 7f6833fff6c0 Generated table #126@1: 9 keys, 6617 bytes
2026/04/14-00:56:01.506586 7f6833fff6c0 Compacted 1@1 + 1@2 files => 6617 bytes
2026/04/14-00:56:01.512723 7f6833fff6c0 compacted to: files[ 0 0 1 0 0 0 0 ]
2026/04/14-00:56:01.513072 7f6833fff6c0 Delete type=2 #121
2026/04/14-00:56:01.513274 7f6833fff6c0 Delete type=2 #125
2026/04/14-00:56:01.519560 7f6833fff6c0 Manual compaction at level-1 from '!items!null' @ 105 : 1 .. '!items!null' @ 0 : 0; will stop at (end)
2026/04/14-10:43:54.279048 7fddd97be6c0 Recovering log #124
2026/04/14-10:43:54.288686 7fddd97be6c0 Delete type=3 #122
2026/04/14-10:43:54.288755 7fddd97be6c0 Delete type=0 #124

Binary file not shown.

View File

@@ -1 +1 @@
MANIFEST-000035
MANIFEST-000037

View File

@@ -1,3 +1,8 @@
2026/04/14-10:43:54.291004 7fddd8fbd6c0 Recovering log #33
2026/04/14-10:43:54.301929 7fddd8fbd6c0 Delete type=3 #31
2026/04/14-10:43:54.301981 7fddd8fbd6c0 Delete type=0 #33
2026/04/14-21:45:17.237698 7fc1da7be6c0 Recovering log #36
2026/04/14-21:45:17.253057 7fc1da7be6c0 Delete type=0 #36
2026/04/14-21:45:17.253185 7fc1da7be6c0 Delete type=3 #35
2026/04/15-02:16:16.720764 7fc1d8fbb6c0 Level-0 table #40: started
2026/04/15-02:16:16.720792 7fc1d8fbb6c0 Level-0 table #40: 0 bytes OK
2026/04/15-02:16:16.763312 7fc1d8fbb6c0 Delete type=0 #38
2026/04/15-02:16:16.819920 7fc1d8fbb6c0 Manual compaction at level-0 from '!actors!6RZ6IzJUHm4dB5Ut' @ 72057594037927935 : 1 .. '!folders!MbFQgPdF6Gtbj5AU' @ 0 : 0; will stop at (end)
2026/04/15-02:16:16.881536 7fc1d8fbb6c0 Manual compaction at level-1 from '!actors!6RZ6IzJUHm4dB5Ut' @ 72057594037927935 : 1 .. '!folders!MbFQgPdF6Gtbj5AU' @ 0 : 0; will stop at (end)

View File

@@ -1,8 +1,3 @@
2026/04/14-00:55:24.409141 7f68497ed6c0 Recovering log #29
2026/04/14-00:55:24.424702 7f68497ed6c0 Delete type=3 #27
2026/04/14-00:55:24.424755 7f68497ed6c0 Delete type=0 #29
2026/04/14-00:56:01.473754 7f6833fff6c0 Level-0 table #34: started
2026/04/14-00:56:01.473797 7f6833fff6c0 Level-0 table #34: 0 bytes OK
2026/04/14-00:56:01.480607 7f6833fff6c0 Delete type=0 #32
2026/04/14-00:56:01.502772 7f6833fff6c0 Manual compaction at level-0 from '!actors!6RZ6IzJUHm4dB5Ut' @ 72057594037927935 : 1 .. '!folders!MbFQgPdF6Gtbj5AU' @ 0 : 0; will stop at (end)
2026/04/14-00:56:01.502817 7f6833fff6c0 Manual compaction at level-1 from '!actors!6RZ6IzJUHm4dB5Ut' @ 72057594037927935 : 1 .. '!folders!MbFQgPdF6Gtbj5AU' @ 0 : 0; will stop at (end)
2026/04/14-10:43:54.291004 7fddd8fbd6c0 Recovering log #33
2026/04/14-10:43:54.301929 7fddd8fbd6c0 Delete type=3 #31
2026/04/14-10:43:54.301981 7fddd8fbd6c0 Delete type=0 #33

Binary file not shown.

View File

Binary file not shown.

View File

@@ -1 +1 @@
MANIFEST-000074
MANIFEST-000076

View File

@@ -1,3 +1,15 @@
2026/04/14-10:43:54.317254 7fddd9fbf6c0 Recovering log #72
2026/04/14-10:43:54.326872 7fddd9fbf6c0 Delete type=3 #70
2026/04/14-10:43:54.326932 7fddd9fbf6c0 Delete type=0 #72
2026/04/14-21:45:17.278141 7fc1d97bc6c0 Recovering log #75
2026/04/14-21:45:17.294441 7fc1d97bc6c0 Delete type=0 #75
2026/04/14-21:45:17.294490 7fc1d97bc6c0 Delete type=3 #74
2026/04/15-02:16:16.819929 7fc1d8fbb6c0 Level-0 table #79: started
2026/04/15-02:16:16.847375 7fc1d8fbb6c0 Level-0 table #79: 3342 bytes OK
2026/04/15-02:16:16.881351 7fc1d8fbb6c0 Delete type=0 #77
2026/04/15-02:16:16.881546 7fc1d8fbb6c0 Manual compaction at level-0 from '!scenes!0iGCRqkdJKjmmbl4' @ 72057594037927935 : 1 .. '!scenes.levels!Jr7lGxYk2RETlXRv.defaultLevel0000' @ 0 : 0; will stop at (end)
2026/04/15-02:16:16.938347 7fc1d8fbb6c0 Manual compaction at level-1 from '!scenes!0iGCRqkdJKjmmbl4' @ 72057594037927935 : 1 .. '!scenes.levels!Jr7lGxYk2RETlXRv.defaultLevel0000' @ 0 : 0; will stop at '!scenes.tokens.delta.items!Jr7lGxYk2RETlXRv.6urwC5SVcou6UOAG.CTg4yBE12iMee1RU.BYT1CrA37R3Og0nu' @ 49 : 0
2026/04/15-02:16:16.938354 7fc1d8fbb6c0 Compacting 1@1 + 1@2 files
2026/04/15-02:16:16.955205 7fc1d8fbb6c0 Generated table #80@1: 3 keys, 1810 bytes
2026/04/15-02:16:16.955236 7fc1d8fbb6c0 Compacted 1@1 + 1@2 files => 1810 bytes
2026/04/15-02:16:16.986128 7fc1d8fbb6c0 compacted to: files[ 0 0 1 0 0 0 0 ]
2026/04/15-02:16:16.986229 7fc1d8fbb6c0 Delete type=2 #57
2026/04/15-02:16:16.986351 7fc1d8fbb6c0 Delete type=2 #79
2026/04/15-02:16:17.092360 7fc1d8fbb6c0 Manual compaction at level-1 from '!scenes.tokens.delta.items!Jr7lGxYk2RETlXRv.6urwC5SVcou6UOAG.CTg4yBE12iMee1RU.BYT1CrA37R3Og0nu' @ 49 : 0 .. '!scenes.levels!Jr7lGxYk2RETlXRv.defaultLevel0000' @ 0 : 0; will stop at (end)

View File

@@ -1,8 +1,3 @@
2026/04/14-00:55:24.444791 7f684a7ef6c0 Recovering log #68
2026/04/14-00:55:24.460229 7f684a7ef6c0 Delete type=3 #66
2026/04/14-00:55:24.460280 7f684a7ef6c0 Delete type=0 #68
2026/04/14-00:56:01.496164 7f6833fff6c0 Level-0 table #73: started
2026/04/14-00:56:01.496194 7f6833fff6c0 Level-0 table #73: 0 bytes OK
2026/04/14-00:56:01.502678 7f6833fff6c0 Delete type=0 #71
2026/04/14-00:56:01.502807 7f6833fff6c0 Manual compaction at level-0 from '!scenes!Jr7lGxYk2RETlXRv' @ 72057594037927935 : 1 .. '!scenes.tokens.delta.items!Jr7lGxYk2RETlXRv.6urwC5SVcou6UOAG.CTg4yBE12iMee1RU.BYT1CrA37R3Og0nu' @ 0 : 0; will stop at (end)
2026/04/14-00:56:01.513358 7f6833fff6c0 Manual compaction at level-1 from '!scenes!Jr7lGxYk2RETlXRv' @ 72057594037927935 : 1 .. '!scenes.tokens.delta.items!Jr7lGxYk2RETlXRv.6urwC5SVcou6UOAG.CTg4yBE12iMee1RU.BYT1CrA37R3Og0nu' @ 0 : 0; will stop at (end)
2026/04/14-10:43:54.317254 7fddd9fbf6c0 Recovering log #72
2026/04/14-10:43:54.326872 7fddd9fbf6c0 Delete type=3 #70
2026/04/14-10:43:54.326932 7fddd9fbf6c0 Delete type=0 #72

Binary file not shown.

Binary file not shown.

View File

@@ -16,6 +16,7 @@
--cel-border: #7a5c20; // bordure dorée
--cel-accent: #6b1e28; // bordeaux profond (échecs, accents)
--cel-text: #2f2413; // texte de corps sur fond clair (parchemin)
--cel-shadow: rgba(10,15,10,0.5);

View File

@@ -30,7 +30,7 @@
.roll-actor {
font-family: var(--cel-font-title, "CopaseticNF", serif);
color: var(--cel-orange-light, #ddb84a);
font-size: 0.78em;
font-size: 0.82em;
letter-spacing: 0.07em;
text-transform: uppercase;
opacity: 0.9;
@@ -38,7 +38,7 @@
.roll-skill-line {
font-family: var(--cel-font-title, "CopaseticNF", serif);
font-size: 1.25em;
font-size: 1.31em;
color: var(--cel-cream, #f0e8d4);
margin-top: 2px;
@@ -58,24 +58,24 @@
justify-content: center;
flex-wrap: wrap;
gap: 4px;
font-size: 0.82em;
font-size: 0.86em;
color: var(--cel-cream, #f0e8d4);
.dval, .nb-dice {
font-family: var(--cel-font-title, "CopaseticNF", serif);
font-size: 1.7em;
font-size: 1.78em;
color: var(--cel-orange, #e07b00);
font-weight: bold;
line-height: 1;
}
.dlabel { font-size: 0.78em; text-transform: uppercase; letter-spacing: 0.04em; opacity: 0.75; }
.dlabel { font-size: 0.82em; text-transform: uppercase; letter-spacing: 0.04em; opacity: 0.75; }
.dminus { color: #f0a0a0; font-weight: bold; }
.deq { opacity: 0.55; }
.ddice { color: var(--cel-orange, #e07b00); }
}
.wound-info {
font-size: 0.73em;
font-size: 0.77em;
color: #f0a0a0;
margin-top: 3px;
}
@@ -117,17 +117,17 @@
display: flex;
align-items: center;
justify-content: center;
font-size: 0.65em;
font-size: 0.68em;
color: white;
}
}
}
.moon-icon { font-size: 1.2em; flex-shrink: 0; }
.moon-icon { font-size: 1.26em; flex-shrink: 0; }
.moon-text {
font-family: var(--cel-font-title, "CopaseticNF", serif);
font-size: 0.88em;
font-size: 0.92em;
color: var(--cel-green, #0c4c0c);
}
}
@@ -152,7 +152,7 @@
label {
flex: 0 0 110px;
font-size: 0.78em;
font-size: 0.82em;
text-transform: uppercase;
letter-spacing: 0.04em;
color: var(--cel-border, #7a5c20);
@@ -165,8 +165,8 @@
padding: 3px 7px;
background: rgba(255,255,255,0.85);
font-family: inherit;
font-size: 0.85em;
color: #333;
font-size: 0.89em;
color: var(--cel-text, #2f2413);
&:focus { outline: 1px solid var(--cel-orange, #e07b00); }
}
@@ -233,7 +233,7 @@
display: flex;
align-items: center;
justify-content: center;
font-size: 0.65em;
font-size: 0.68em;
color: white;
}
}
@@ -242,7 +242,7 @@
}
.destin-icon {
font-size: 1.1em;
font-size: 1.16em;
color: var(--cel-orange, #e07b00);
flex-shrink: 0;
}
@@ -252,20 +252,20 @@
.destin-main {
font-family: var(--cel-font-title, "CopaseticNF", serif);
font-size: 0.9em;
font-size: 0.95em;
color: var(--cel-green, #0c4c0c);
display: block;
}
.destin-bonus {
font-size: 0.72em;
font-size: 0.76em;
color: var(--cel-border, #7a5c20);
font-style: italic;
}
}
.destin-count {
font-size: 0.75em;
font-size: 0.79em;
font-weight: bold;
color: var(--cel-green, #0c4c0c);
background: rgba(196,154,26,0.2);
@@ -275,7 +275,7 @@
white-space: nowrap;
&.no-destin {
color: #888;
color: rgba(0,0,0,0.45);
background: rgba(0,0,0,0.05);
border-color: rgba(0,0,0,0.1);
}
@@ -283,7 +283,7 @@
}
}
.form-visibility label { color: #888; }
.form-visibility label { color: rgba(0,0,0,0.45); }
.form-faction-aspect select {
font-weight: bold;
@@ -326,7 +326,7 @@
display: flex;
align-items: center;
justify-content: center;
font-size: 0.75em;
font-size: 0.79em;
color: white;
}
}
@@ -338,19 +338,19 @@
flex: 1;
.puiser-main {
font-family: var(--cel-font-title, "CopaseticNF", serif);
font-size: 0.9em;
font-size: 0.95em;
color: var(--cel-accent, #6b1e28);
display: block;
}
.puiser-sub {
font-size: 0.7em;
color: #888;
font-size: 0.73em;
color: rgba(0,0,0,0.45);
font-style: italic;
}
}
.puiser-cost {
font-size: 0.8em;
font-size: 0.84em;
font-weight: bold;
color: var(--cel-accent, #6b1e28);
background: rgba(107,30,40,0.1);
@@ -398,14 +398,14 @@
display: flex;
align-items: center;
justify-content: center;
font-size: 0.6em;
font-size: 0.63em;
color: white;
}
}
}
.fortune-icon {
font-size: 1.1em;
font-size: 1.16em;
color: var(--cel-green, #0c4c0c);
flex-shrink: 0;
}
@@ -414,19 +414,19 @@
flex: 1;
.fortune-main {
font-family: var(--cel-font-title, "CopaseticNF", serif);
font-size: 0.9em;
font-size: 0.95em;
color: var(--cel-green, #0c4c0c);
display: block;
}
.fortune-bonus {
font-size: 0.72em;
font-size: 0.76em;
color: var(--cel-border, #7a5c20);
font-style: italic;
}
}
.fortune-badge {
font-size: 0.8em;
font-size: 0.84em;
font-weight: bold;
color: var(--cel-green, #0c4c0c);
background: rgba(12,76,12,0.12);
@@ -450,7 +450,7 @@
gap: 10px;
.preview-label {
font-size: 0.7em;
font-size: 0.73em;
text-transform: uppercase;
letter-spacing: 0.07em;
color: var(--cel-border, #7a5c20);
@@ -459,7 +459,7 @@
.preview-formula {
font-family: var(--cel-font-title, "CopaseticNF", serif);
font-size: 1.6em;
font-size: 1.68em;
color: var(--cel-orange, #e07b00);
font-weight: bold;
letter-spacing: 0.04em;
@@ -469,6 +469,90 @@
// ─── Chat message ─────────────────────────────────────────────────────────────
// ── Contreparties dé de lune (partagé : chat-roll + moon-standalone-card) ──
.celestopol.chat-roll,
.celestopol-roll.moon-standalone-card {
.moon-effect-actions {
padding: 6px 10px 8px;
border-top: 2px solid rgba(122,92,32,0.18);
background: rgba(12,76,12,0.04);
border-radius: 0 0 3px 3px;
.moon-effect-label {
display: block;
font-family: var(--cel-font-title);
font-size: 0.76em;
font-weight: bold;
color: var(--cel-border, #7a5c20);
text-transform: uppercase;
letter-spacing: 0.07em;
margin-bottom: 6px;
}
.moon-effect-buttons {
display: flex;
flex-wrap: wrap;
gap: 5px;
align-items: center;
}
.moon-effect-btn {
font-family: var(--cel-font-title);
font-size: 0.82em;
font-weight: bold;
padding: 4px 11px;
border-radius: 4px;
cursor: pointer;
transition: filter 0.12s, opacity 0.12s;
line-height: 1.4;
letter-spacing: 0.02em;
// Positif par défaut : vert jade / or
background: var(--cel-green, #1b3828);
color: var(--cel-orange-light, #ddb84a);
border: 1px solid rgba(196,154,26,0.35);
&:hover:not(:disabled) { filter: brightness(1.18); }
&:disabled { opacity: 0.55; cursor: not-allowed; }
&.moon-effect-negative {
background: var(--cel-accent, #6b1e28);
color: var(--cel-cream, #f0e8d4);
border-color: rgba(139,30,46,0.4);
&:hover:not(:disabled) { filter: brightness(1.12); }
}
}
.moon-effect-narrative {
font-size: 0.76em;
color: var(--cel-border, #7a5c20);
font-style: italic;
align-self: center;
padding-left: 2px;
}
.moon-effect-applied-status {
display: inline-flex;
align-items: center;
gap: 4px;
margin-top: 6px;
font-size: 0.8em;
font-family: var(--cel-font-title);
font-style: italic;
padding: 3px 9px;
border-radius: 3px;
color: var(--cel-green, #1b3828);
background: rgba(12,76,12,0.09);
border: 1px solid rgba(12,76,12,0.22);
&.is-negative {
color: var(--cel-accent, #6b1e28);
background: rgba(107,30,40,0.09);
border-color: rgba(107,30,40,0.25);
}
}
}
}
.celestopol.chat-roll {
border: 1px solid var(--cel-border, #7a5c20);
border-radius: 3px;
@@ -506,16 +590,16 @@
color: var(--cel-orange, #e07b00);
font-weight: bold;
letter-spacing: 0.05em;
font-size: 0.92em;
font-size: 0.97em;
}
.skill-info {
color: var(--cel-cream, #f0e8d4);
font-size: 0.77em;
font-size: 0.81em;
font-style: italic;
.stat-lbl { color: var(--cel-orange-light, #ddb84a); }
.sep { margin: 0 2px; opacity: 0.5; }
}
.wound-info { font-size: 0.7em; color: #f0a0a0; }
.wound-info { font-size: 0.73em; color: #f0a0a0; }
}
.moon-badge { display: none; }
@@ -540,10 +624,10 @@
border-radius: 4px;
background: white;
font-weight: bold;
font-size: 1.05em;
font-size: 1.1em;
font-family: var(--cel-font-title, "CopaseticNF", serif);
box-shadow: 1px 1px 2px rgba(0,0,0,0.12);
color: #222;
color: var(--cel-text, #2f2413);
&.max {
background: var(--cel-green, #0c4c0c);
@@ -569,15 +653,15 @@
padding: 5px 10px 4px;
background: var(--cel-cream, #f0e8d4);
border-top: 1px solid rgba(122,92,32,0.2);
font-size: 0.83em;
font-size: 0.87em;
color: #555;
.fl-label { color: #999; font-size: 0.88em; text-transform: uppercase; letter-spacing: 0.04em; margin-right: 2px; }
.fl-label { color: rgba(0,0,0,0.4); font-size: 0.92em; text-transform: uppercase; letter-spacing: 0.04em; margin-right: 2px; }
.fl-ndice { color: var(--cel-green, #0c4c0c); font-weight: bold; }
.fl-sum { font-weight: bold; color: #333; }
.fl-sum { font-weight: bold; color: var(--cel-text, #2f2413); }
.fl-total {
font-family: var(--cel-font-title, "CopaseticNF", serif);
font-size: 1.5em;
font-size: 1.58em;
color: var(--cel-orange, #e07b00);
font-weight: bold;
line-height: 1;
@@ -588,8 +672,8 @@
.fl-asp { color: var(--cel-orange, #e07b00); font-weight: bold; }
.fl-faction { color: var(--cel-green, #0c4c0c); font-weight: bold; }
.fl-sep { font-weight: bold; color: var(--cel-border, #7a5c20); margin: 0 2px; }
.fl-eq { color: #aaa; }
.fl-op { color: #aaa; }
.fl-eq { color: rgba(0,0,0,0.35); }
.fl-op { color: rgba(0,0,0,0.35); }
}
// ── Seuil et marge ──
@@ -600,22 +684,22 @@
padding: 5px 12px 6px;
background: var(--cel-cream, #f0e8d4);
border-top: 1px solid rgba(122,92,32,0.2);
font-size: 0.82em;
font-size: 0.86em;
.vs-wrap {
display: flex;
align-items: baseline;
gap: 5px;
}
.vs-label { color: #aaa; text-transform: uppercase; font-size: 0.8em; }
.vs-label { color: rgba(0,0,0,0.35); text-transform: uppercase; font-size: 0.84em; }
.diff-label{ font-style: italic; color: var(--cel-green, #0c4c0c); }
.diff-val { color: #888; }
.diff-val { color: rgba(0,0,0,0.45); }
.margin-badge {
padding: 2px 10px;
border-radius: 12px;
font-weight: bold;
font-size: 1.05em;
font-size: 1.1em;
font-family: var(--cel-font-title, "CopaseticNF", serif);
letter-spacing: 0.05em;
@@ -635,7 +719,7 @@
// ── Destin utilisé ──
.used-info {
text-align: center;
font-size: 0.77em;
font-size: 0.81em;
color: var(--cel-orange, #e07b00);
padding: 3px 8px;
background: rgba(196,154,26,0.1);
@@ -673,7 +757,7 @@
}
.damage-header {
font-size: 0.72em;
font-size: 0.76em;
text-transform: uppercase;
letter-spacing: 0.08em;
color: var(--cel-border, #7a5c20);
@@ -690,13 +774,13 @@
.damage-value {
font-family: var(--cel-font-title, "CopaseticNF", serif);
font-size: 1.9em;
font-size: 1.99em;
line-height: 1;
color: var(--cel-orange, #e07b00);
}
.damage-unit {
font-size: 0.82em;
font-size: 0.86em;
color: var(--cel-green, #0c4c0c);
font-weight: bold;
}
@@ -704,7 +788,7 @@
.damage-breakdown,
.damage-note {
margin-top: 6px;
font-size: 0.76em;
font-size: 0.8em;
line-height: 1.4;
color: #5c4630;
}
@@ -730,7 +814,7 @@
background: var(--cel-green, #0c4c0c);
color: var(--cel-orange-light, #ddb84a);
padding: 4px 10px;
font-size: 0.78em;
font-size: 0.82em;
font-weight: bold;
cursor: pointer;
@@ -745,7 +829,7 @@
margin-top: 8px;
padding: 6px 8px;
border-radius: 4px;
font-size: 0.76em;
font-size: 0.8em;
line-height: 1.4;
&.is-applied {
@@ -774,7 +858,7 @@
background: rgba(12,76,12,0.1);
color: var(--cel-green, #0c4c0c);
font-weight: bold;
font-size: 0.9em;
font-size: 0.95em;
}
// ── Résultat dé de lune ──
@@ -787,7 +871,7 @@
font-family: var(--cel-font-body, serif);
.moon-die-face {
font-size: 1.8em;
font-size: 1.89em;
line-height: 1;
flex-shrink: 0;
}
@@ -800,7 +884,7 @@
}
.moon-die-phase {
font-size: 0.72em;
font-size: 0.76em;
opacity: 0.75;
text-transform: uppercase;
letter-spacing: 0.05em;
@@ -815,7 +899,7 @@
}
.moon-die-desc {
font-size: 0.72em;
font-size: 0.76em;
font-style: italic;
opacity: 0.85;
line-height: 1.3;
@@ -852,13 +936,13 @@
border-top: 2px solid rgba(0,0,0,0.1);
.result-icon {
font-size: 0.85em;
font-size: 0.89em;
opacity: 0.85;
letter-spacing: 0.15em;
}
.result-label { font-size: 1.2em; line-height: 1.2; }
.result-label { font-size: 1.26em; line-height: 1.2; }
.result-desc {
font-size: 0.65em;
font-size: 0.68em;
letter-spacing: 0.08em;
margin-top: 2px;
opacity: 0.8;
@@ -919,22 +1003,22 @@
.welcome-mark {
color: var(--cel-orange, #e07b00);
font-size: 1.05em;
font-size: 1.1em;
line-height: 1;
}
.welcome-title {
font-family: var(--cel-font-title, "CopaseticNF", serif);
color: var(--cel-orange, #e07b00);
font-size: 0.98em;
font-size: 1.03em;
letter-spacing: 0.05em;
text-transform: uppercase;
}
.welcome-body {
padding: 9px 11px 10px;
color: #3f3623;
font-size: 0.84em;
color: var(--cel-text, #2f2413);
font-size: 0.88em;
line-height: 1.45;
p {
@@ -954,7 +1038,7 @@
display: block;
margin-bottom: 2px;
color: var(--cel-border, #7a5c20);
font-size: 0.72em;
font-size: 0.76em;
font-weight: bold;
letter-spacing: 0.05em;
text-transform: uppercase;
@@ -997,27 +1081,27 @@
.portrait-message-mark {
color: var(--cel-orange, #e07b00);
font-size: 1.05em;
font-size: 1.1em;
line-height: 1;
}
.portrait-message-title {
font-family: var(--cel-font-title, "CopaseticNF", serif);
color: var(--cel-orange, #e07b00);
font-size: 0.98em;
font-size: 1.03em;
letter-spacing: 0.05em;
text-transform: uppercase;
}
.portrait-message-body {
padding: 9px 11px 10px;
color: #3f3623;
color: var(--cel-text, #2f2413);
}
.portrait-message-name {
margin-bottom: 8px;
color: var(--cel-green, #0c4c0c);
font-size: 0.84em;
font-size: 0.88em;
font-weight: bold;
letter-spacing: 0.04em;
text-transform: uppercase;
@@ -1100,7 +1184,7 @@
&:hover {
border-color: var(--cel-orange, #e07b00);
background: linear-gradient(180deg, rgba(224,123,0,0.18), rgba(224,123,0,0.06));
color: #7a3e00;
color: var(--cel-border, #7a5c20);
}
}
}
@@ -1124,7 +1208,7 @@
font-family: var(--cel-font-title, "CopaseticNF", serif);
text-transform: uppercase;
letter-spacing: 0.05em;
font-size: 0.88em;
font-size: 0.92em;
}
.faction-aspect-points {
@@ -1132,7 +1216,7 @@
flex-wrap: wrap;
gap: 5px;
margin-bottom: 4px;
font-size: 0.8em;
font-size: 0.84em;
}
.faction-aspect-point-card {
@@ -1146,7 +1230,7 @@
border: 1px solid rgba(122,92,32,0.18);
strong {
font-size: 0.72em;
font-size: 0.76em;
text-transform: uppercase;
letter-spacing: 0.04em;
color: var(--cel-border, #7a5c20);
@@ -1155,14 +1239,14 @@
em {
font-style: normal;
font-family: var(--cel-font-title, "CopaseticNF", serif);
font-size: 1.05em;
font-size: 1.1em;
color: var(--cel-orange, #e07b00);
line-height: 1;
}
}
.faction-aspect-source-line {
font-size: 0.78em;
font-size: 0.82em;
color: var(--cel-border, #7a5c20);
}
@@ -1171,8 +1255,8 @@
border-left: 3px solid #b84a2e;
border-radius: 4px;
background: rgba(184, 74, 46, 0.08);
color: #8b3e2b;
font-size: 0.8em;
color: var(--cel-accent, #6b1e28);
font-size: 0.84em;
}
.faction-aspect-tag-list,
@@ -1190,7 +1274,7 @@
background: rgba(12, 76, 12, 0.08);
border: 1px solid rgba(12, 76, 12, 0.18);
color: var(--cel-green, #0c4c0c);
font-size: 0.72em;
font-size: 0.76em;
font-weight: bold;
}
@@ -1204,7 +1288,7 @@
label {
display: block;
margin-bottom: 2px;
font-size: 0.68em;
font-size: 0.71em;
text-transform: uppercase;
letter-spacing: 0.04em;
color: var(--cel-border, #7a5c20);
@@ -1219,13 +1303,13 @@
border-radius: 3px;
padding: 2px 6px;
background: rgba(255,255,255,0.9);
font-size: 0.78em;
color: #2f2413;
font-size: 0.82em;
color: var(--cel-text, #2f2413);
box-sizing: border-box;
}
select option {
color: #2f2413;
color: var(--cel-text, #2f2413);
background: #fffaf0;
}
}
@@ -1251,7 +1335,7 @@
background: rgba(224,123,0,0.12);
color: var(--cel-orange, #e07b00);
font-family: var(--cel-font-title, "CopaseticNF", serif);
font-size: 0.72em;
font-size: 0.76em;
line-height: 1;
cursor: help;
vertical-align: middle;
@@ -1273,7 +1357,7 @@
color: var(--cel-orange, #e07b00);
font-family: var(--cel-font-title, "CopaseticNF", serif);
margin-bottom: 4px;
font-size: 0.82em;
font-size: 0.86em;
}
}
@@ -1281,7 +1365,7 @@
display: flex;
align-items: center;
gap: 4px;
font-size: 0.74em;
font-size: 0.78em;
}
.faction-aspect-active-list {
@@ -1298,8 +1382,8 @@
padding: 3px 6px;
border-radius: 4px;
background: rgba(255,255,255,0.7);
color: #2f2413;
font-size: 0.76em;
color: var(--cel-text, #2f2413);
font-size: 0.8em;
&.is-relevant {
border-left: 3px solid var(--cel-green, #0c4c0c);
@@ -1307,20 +1391,20 @@
}
.faction-aspect-active-name {
color: #2f2413;
color: var(--cel-text, #2f2413);
font-weight: 600;
}
.faction-aspect-active-value {
color: var(--cel-orange, #e07b00);
font-family: var(--cel-font-title, "CopaseticNF", serif);
font-size: 0.92em;
font-size: 0.97em;
}
.faction-aspect-empty {
color: #666;
color: rgba(0,0,0,0.5);
font-style: italic;
font-size: 0.74em;
font-size: 0.78em;
}
.faction-aspect-remove-block {
@@ -1349,7 +1433,7 @@
border-left: 3px solid #c0392b;
border-radius: 4px;
color: #f0c0c0;
font-size: 0.85em;
font-size: 0.89em;
.wound-icon { font-size: 1em; }
}
}
@@ -1358,7 +1442,7 @@
.celestopol.chat-roll {
.roll-result-banner.tie {
background: #3a2e1a;
color: #d4b870;
color: var(--cel-orange-light, #ddb84a);
border-top: 2px solid #7a6230;
border-bottom: 2px solid #7a6230;
text-shadow: 0 1px 2px rgba(0,0,0,0.6);
@@ -1369,12 +1453,12 @@
align-items: center;
gap: 0.3em;
margin-bottom: 1px;
font-size: 0.85em;
font-size: 0.89em;
color: var(--cel-orange, #e07b00);
.weapon-icon-small { font-size: 0.9em; }
.weapon-icon-small { font-size: 0.95em; }
.weapon-degats-small {
font-weight: bold;
color: #f0c060;
color: var(--cel-border, #7a5c20);
}
}
}
@@ -1386,20 +1470,20 @@
align-items: center;
gap: 0.4em;
margin-bottom: 2px;
font-size: 0.9em;
font-size: 0.95em;
color: var(--cel-orange, #e07b00);
.weapon-icon { font-size: 1em; }
.weapon-degats {
font-weight: bold;
color: #f0c060;
font-size: 0.85em;
color: var(--cel-border, #7a5c20);
font-size: 0.89em;
}
}
.form-corps-pnj {
.corps-pnj-input {
width: 70px;
font-size: 1.1em;
font-size: 1.16em;
font-weight: bold;
text-align: center;
font-family: var(--cel-font-title, "CopaseticNF", serif);
@@ -1420,7 +1504,7 @@
label {
color: var(--cel-orange, #e07b00);
font-weight: bold;
font-size: 0.85em;
font-size: 0.89em;
display: flex;
align-items: center;
gap: 5px;
@@ -1435,7 +1519,7 @@
border: 1px solid rgba(196, 154, 26, 0.5);
border-radius: 3px;
padding: 2px 4px;
font-size: 0.85em;
font-size: 0.89em;
max-width: 200px;
}
}
@@ -1451,7 +1535,7 @@
align-items: center;
gap: 6px;
color: var(--cel-orange, #e07b00);
font-size: 0.88em;
font-size: 0.92em;
font-style: italic;
i { opacity: 0.8; }
@@ -1465,14 +1549,14 @@
padding: 4px 8px;
label {
color: #e08060;
font-size: 0.85em;
color: var(--cel-accent, #6b1e28);
font-size: 0.89em;
font-weight: bold;
display: flex;
align-items: center;
gap: 5px;
i { color: #e08060; }
i { color: var(--cel-accent, #6b1e28); }
}
select {
@@ -1482,13 +1566,13 @@
border: 1px solid rgba(200, 100, 60, 0.4);
border-radius: 3px;
padding: 2px 4px;
font-size: 0.85em;
font-size: 0.89em;
}
}
.form-threshold-fixed {
.threshold-value {
font-size: 1.2em;
font-size: 1.26em;
font-weight: bold;
font-family: var(--cel-font-title, "CopaseticNF", serif);
color: var(--cel-orange, #e07b00);
@@ -1514,7 +1598,7 @@
input[type="checkbox"] { flex-shrink: 0; }
.opposition-icon {
font-size: 1.2em;
font-size: 1.26em;
color: var(--cel-orange, #e07b00);
}
@@ -1525,13 +1609,13 @@
.opposition-main {
font-weight: bold;
font-size: 0.9em;
font-size: 0.95em;
font-family: var(--cel-font-title, "CopaseticNF", serif);
color: var(--cel-orange, #e07b00);
}
.opposition-sub {
font-size: 0.75em;
font-size: 0.79em;
opacity: 0.7;
font-style: italic;
}
@@ -1575,7 +1659,7 @@
}
.moon-standalone-actor {
font-size: 0.85em;
font-size: 0.89em;
color: var(--cel-text, #333);
font-style: italic;
}
@@ -1604,21 +1688,21 @@
.moon-standalone-phase {
font-family: var(--cel-font-title);
font-size: 0.95em;
font-size: 1.0em;
font-weight: bold;
color: var(--cel-text, #333);
}
.moon-standalone-value {
font-size: 0.8em;
font-size: 0.84em;
color: var(--cel-text-light, #666);
font-style: italic;
}
&.moon-triomphe { border-left-color: var(--cel-green, #0c4c0c); }
&.moon-brio { border-left-color: var(--cel-border, #7a5c20); }
&.moon-contrecoup { border-left-color: #c07800; }
&.moon-catastrophe{ border-left-color: #8b1e2e; }
&.moon-contrecoup { border-left-color: var(--cel-orange, #c49a1a); }
&.moon-catastrophe{ border-left-color: var(--cel-accent, #6b1e28); }
}
.moon-interpret-row {
@@ -1627,15 +1711,15 @@
gap: 8px;
.moon-interpret-label {
font-size: 0.72em;
font-size: 0.76em;
text-transform: uppercase;
letter-spacing: 0.07em;
color: #888;
color: rgba(0,0,0,0.45);
white-space: nowrap;
}
.moon-fortune {
font-size: 0.85em;
font-size: 0.89em;
font-weight: bold;
border-radius: 3px;
padding: 1px 8px;
@@ -1648,7 +1732,7 @@
&.mauvaise-fortune {
background: rgba(139, 30, 46, 0.1);
color: #8b1e2e;
color: var(--cel-accent, #6b1e28);
border: 1px solid rgba(139,30,46,0.3);
}
}
@@ -1659,6 +1743,7 @@
margin-top: 2px;
padding: 6px 8px;
}
}
// ── Message d'initiative ──────────────────────────────────────────────────────
@@ -1698,11 +1783,11 @@
color: var(--cel-orange, #e07b00);
font-weight: bold;
letter-spacing: 0.05em;
font-size: 0.92em;
font-size: 0.97em;
}
.skill-info {
color: var(--cel-cream, #f0e8d4);
font-size: 0.77em;
font-size: 0.81em;
font-style: italic;
}
}
@@ -1730,19 +1815,19 @@
}
.initiative-icon {
font-size: 1.1em;
font-size: 1.16em;
opacity: 0.9;
font-style: normal;
}
.initiative-score {
font-size: 2.4em;
font-size: 2.52em;
font-weight: bold;
line-height: 1;
}
.initiative-detail {
font-size: 0.65em;
font-size: 0.68em;
opacity: 0.75;
font-style: italic;
font-family: var(--cel-font-body, serif);

View File

@@ -122,7 +122,7 @@
</div>
{{/if}}
{{!-- Résultat du Dé de la Lune (narratif) --}}
{{!-- Résultat du Dé de la Lune (narratif + choix de contrepartie) --}}
{{#if hasMoonDie}}
<div class="moon-die-result {{moonResultClass}}">
<span class="moon-die-face">{{moonFaceSymbol}}</span>
@@ -132,6 +132,27 @@
<span class="moon-die-desc">{{moonResultDesc}}</span>
</div>
</div>
{{#if moonActorIsCharacter}}
<div class="moon-effect-actions" data-moon-actor-id="{{moonActorId}}" data-moon-actor-uuid="{{moonActorUuid}}">
<span class="moon-effect-label">{{localize "CELESTOPOL.Moon.applyChoose"}}</span>
<div class="moon-effect-buttons">
{{#if (eq moonResultTypeId "triomphe")}}
<button type="button" class="moon-effect-btn" data-action="apply-moon-effect" data-effect="regain-anomaly">{{localize "CELESTOPOL.Moon.effectRegainAnomaly"}}</button>
<button type="button" class="moon-effect-btn" data-action="apply-moon-effect" data-effect="lose-spleen">{{localize "CELESTOPOL.Moon.effectLoseSpleen"}}</button>
{{else if (eq moonResultTypeId "brio")}}
<button type="button" class="moon-effect-btn" data-action="apply-moon-effect" data-effect="gain-destin">{{localize "CELESTOPOL.Moon.effectGainDestin"}}</button>
<span class="moon-effect-narrative">{{localize "CELESTOPOL.Moon.effectNarrativeOnly"}}</span>
{{else if (eq moonResultTypeId "contrecoup")}}
<button type="button" class="moon-effect-btn moon-effect-negative" data-action="apply-moon-effect" data-effect="lose-destin">{{localize "CELESTOPOL.Moon.effectLoseDestin"}}</button>
<span class="moon-effect-narrative">{{localize "CELESTOPOL.Moon.effectNarrativeOnly"}}</span>
{{else if (eq moonResultTypeId "catastrophe")}}
<button type="button" class="moon-effect-btn moon-effect-negative" data-action="apply-moon-effect" data-effect="lose-anomaly">{{localize "CELESTOPOL.Moon.effectLoseAnomaly"}}</button>
<button type="button" class="moon-effect-btn moon-effect-negative" data-action="apply-moon-effect" data-effect="gain-spleen">{{localize "CELESTOPOL.Moon.effectGainSpleen"}}</button>
<span class="moon-effect-narrative">{{localize "CELESTOPOL.Moon.effectNarrativeOnly"}}</span>
{{/if}}
</div>
</div>
{{/if}}
{{/if}}
{{!-- Bandeau résultat --}}

View File

@@ -36,4 +36,27 @@
</div>
</div>
{{!-- Choix de la contrepartie --}}
{{#if moonActorIsCharacter}}
<div class="moon-effect-actions" data-moon-actor-id="{{moonActorId}}" data-moon-actor-uuid="{{moonActorUuid}}">
<span class="moon-effect-label">{{localize "CELESTOPOL.Moon.applyChoose"}}</span>
<div class="moon-effect-buttons">
{{#if (eq moonResultTypeId "triomphe")}}
<button type="button" class="moon-effect-btn" data-action="apply-moon-effect" data-effect="regain-anomaly">{{localize "CELESTOPOL.Moon.effectRegainAnomaly"}}</button>
<button type="button" class="moon-effect-btn" data-action="apply-moon-effect" data-effect="lose-spleen">{{localize "CELESTOPOL.Moon.effectLoseSpleen"}}</button>
{{else if (eq moonResultTypeId "brio")}}
<button type="button" class="moon-effect-btn" data-action="apply-moon-effect" data-effect="gain-destin">{{localize "CELESTOPOL.Moon.effectGainDestin"}}</button>
<span class="moon-effect-narrative">{{localize "CELESTOPOL.Moon.effectNarrativeOnly"}}</span>
{{else if (eq moonResultTypeId "contrecoup")}}
<button type="button" class="moon-effect-btn moon-effect-negative" data-action="apply-moon-effect" data-effect="lose-destin">{{localize "CELESTOPOL.Moon.effectLoseDestin"}}</button>
<span class="moon-effect-narrative">{{localize "CELESTOPOL.Moon.effectNarrativeOnly"}}</span>
{{else if (eq moonResultTypeId "catastrophe")}}
<button type="button" class="moon-effect-btn moon-effect-negative" data-action="apply-moon-effect" data-effect="lose-anomaly">{{localize "CELESTOPOL.Moon.effectLoseAnomaly"}}</button>
<button type="button" class="moon-effect-btn moon-effect-negative" data-action="apply-moon-effect" data-effect="gain-spleen">{{localize "CELESTOPOL.Moon.effectGainSpleen"}}</button>
<span class="moon-effect-narrative">{{localize "CELESTOPOL.Moon.effectNarrativeOnly"}}</span>
{{/if}}
</div>
</div>
{{/if}}
</div>