diff --git a/lang/fr.json b/lang/fr.json index 7933834..0fdeebf 100644 --- a/lang/fr.json +++ b/lang/fr.json @@ -103,6 +103,10 @@ "DNC.Warn.SpellInsufficientResources": "Le lanceur ne dispose pas d'assez de PV et de focus pour payer ce sort.", "DNC.Warn.ChaosUnavailable": "Le Chaos n'est pas disponible pour ce sort.", "DNC.Warn.TrainingExhausted": "Cet entrainement est epuise pour aujourd'hui. Reinitialisez son delta quotidien pour le lendemain.", + "DNC.Settings.MissionPackMode.Name": "Mode de paquetage de mission", + "DNC.Settings.MissionPackMode.Hint": "Choisit entre le tirage classique rapide et la regle optionnelle de campagne avec allocation des des par les joueurs.", + "DNC.Settings.MissionPackMode.Classic": "Classique", + "DNC.Settings.MissionPackMode.Campaign": "Campagne", "DNC.Macro.MissionPack.Title": "Paquetage de debut de mission", "DNC.Macro.MissionPack.ItemsAdded": "Objets ajoutes", "DNC.Macro.MissionPack.ItemsMissing": "Objets manquants", @@ -121,13 +125,46 @@ "DNC.Macro.MissionPack.Partial": "{actor} recoit {count} objet(s), mais {missing} entree(s) du paquetage sont introuvables.", "DNC.Macro.MissionPack.DialogTitle": "Paquetage de mission", "DNC.Macro.MissionPack.DialogIntro": "Selectionnez l'employe qui recevra le paquetage de debut de mission, puis lancez le tirage.", + "DNC.Macro.MissionPack.ActiveMode": "Mode :", + "DNC.Macro.MissionPack.ModeClassic": "Classique", + "DNC.Macro.MissionPack.ModeClassicHint": "Le systeme tire directement les 4 tables d equipement, comme dans les one-shots.", + "DNC.Macro.MissionPack.ModeCampaign": "Campagne", + "DNC.Macro.MissionPack.ModeCampaignHint": "Le joueur alloue 1d20, 1d12, 1d10 et 1d8 aux 4 categories, puis l anciennete est ajoutee a chaque resultat.", "DNC.Macro.MissionPack.DialogActor": "Employe", - "DNC.Macro.MissionPack.DialogAction": "Generer le paquetage", - "DNC.Macro.MissionPack.SidebarButton": "Paquetage", - "DNC.Macro.MissionPack.melee": "Arme de corps a corps", - "DNC.Macro.MissionPack.ranged": "Arme a distance", - "DNC.Macro.MissionPack.armor": "Armure", - "DNC.Macro.MissionPack.misc": "Encas et equipement divers", + "DNC.Macro.MissionPack.DialogAction": "Generer le paquetage", + "DNC.Macro.MissionPack.SidebarButton": "Paquetage", + "DNC.Macro.MissionPack.CampaignDialogLead": "En mode campagne, le joueur proprietaire choisira l affectation de ses des dans un dialogue dedie.", + "DNC.Macro.MissionPack.CampaignDialogTitle": "Paquetage de campagne", + "DNC.Macro.MissionPack.CampaignDialogSubtitle": "Repartition logistique", + "DNC.Macro.MissionPack.CampaignDialogIntro": "{actor} prepare son paquetage de campagne. Repartissez les des entre les categories, puis indiquez la relation a l econome.", + "DNC.Macro.MissionPack.CampaignDialogAction": "Valider l allocation", + "DNC.Macro.MissionPack.CampaignDialogPlayer": "Joueur", + "DNC.Macro.MissionPack.CampaignDialogRequester": "Demande de", + "DNC.Macro.MissionPack.CampaignDialogRank": "Anciennete", + "DNC.Macro.MissionPack.CampaignDialogRelation": "Relation a l econome", + "DNC.Macro.MissionPack.CampaignDialogAssignHelp": "Attribuez un de different a chaque categorie de paquetage.", + "DNC.Macro.MissionPack.CampaignDialogHelp": "Le d20 alloue servira aussi pour verifier l equipement unique. L anciennete est ajoutee a chaque jet apres avantage ou desavantage.", + "DNC.Macro.MissionPack.CampaignController": "Choix joueur :", + "DNC.Macro.MissionPack.CampaignRelation": "Relation :", + "DNC.Macro.MissionPack.CampaignRequestCanceled": "Le paquetage de campagne pour {actor} n a pas ete valide par {player}.", + "DNC.Macro.MissionPack.WarnDiceRequired": "Attribuez un de a chacune des 4 categories du paquetage.", + "DNC.Macro.MissionPack.WarnDiceUnique": "Chaque de ne peut etre utilise qu une seule fois.", + "DNC.Macro.MissionPack.Relation.positive": "Positive", + "DNC.Macro.MissionPack.Relation.neutral": "Neutre", + "DNC.Macro.MissionPack.Relation.negative": "Negative", + "DNC.Macro.MissionPack.RollDetail": "{die} · {mode} · lancers {values} · garde {kept} · + anciennete {rank} = {total}", + "DNC.Macro.MissionPack.TotalClamped": "Total retenu sur la table : {clamped} (au lieu de {total}).", + "DNC.Macro.MissionPack.melee": "Arme de corps a corps", + "DNC.Macro.MissionPack.ranged": "Arme a distance", + "DNC.Macro.MissionPack.armor": "Armure", + "DNC.Macro.MissionPack.misc": "Encas et equipement divers", + "DNC.Macro.MissionPack.UniqueReference": "d20 de reference", + "DNC.Macro.MissionPack.UniqueActorRoll": "d20 du joueur", + "DNC.Macro.MissionPack.UniqueMatch": "Objet unique", + "DNC.Macro.MissionPack.UniqueMiss": "Pas d objet unique", + "DNC.Macro.MissionPack.UniqueGranted": "Objet unique ajoute :", + "DNC.Macro.MissionPack.UniqueTableRoll": "tirage d objet unique", + "DNC.Macro.MissionPack.UniqueRuleReminder": "Aucun objet unique supplementaire cette fois ci.", "DNC.Welcome.Kicker": "Accueil", "DNC.Welcome.Title": "Bienvenue dans Donjon & Cie", "DNC.Welcome.Subtitle": "Systeme FoundryVTT · version {version}", diff --git a/less/dialogs.less b/less/dialogs.less index 02c9fc1..087bfcc 100644 --- a/less/dialogs.less +++ b/less/dialogs.less @@ -34,3 +34,149 @@ .dnc-roll-dialog .window-content { background: linear-gradient(180deg, #f7efe0 0%, #e3d0b1 100%); } + +.dnc-mission-pack-mode, +.dnc-mission-pack-note { + font-size: 0.9rem; +} + +.dnc-mission-pack-campaign { + gap: @spacing-lg; +} + +.dnc-mission-pack-hero { + padding: @spacing-lg; + border: 1px solid fade(@color-border, 35%); + border-radius: @radius-md; + background: + linear-gradient(180deg, fade(#ffffff, 65%) 0%, fade(@color-panel, 68%) 100%), + linear-gradient(135deg, fade(@color-accent, 8%) 0%, fade(@color-accent, 0%) 100%); + box-shadow: 0 8px 18px fade(@color-shadow, 10%); +} + +.dnc-mission-pack-kicker { + margin: 0 0 0.25rem; + font-size: 0.72rem; + font-weight: 700; + letter-spacing: 0.14em; + text-transform: uppercase; + color: fade(@color-accent, 82%); +} + +.dnc-mission-pack-hero h2 { + margin: 0; + font-family: @font-display; + font-size: 1.4rem; + line-height: 1.1; + color: @color-accent; +} + +.dnc-mission-pack-subtitle { + margin-top: 0.2rem; + font-size: 0.78rem; + font-weight: 700; + letter-spacing: 0.16em; + text-transform: uppercase; + color: fade(@color-border, 78%); +} + +.dnc-mission-pack-intro { + margin-top: @spacing-sm; + color: @color-muted; +} + +.dnc-mission-pack-meta-grid { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: @spacing-md; +} + +.dnc-mission-pack-meta-card { + display: grid; + gap: 0.2rem; + padding: @spacing-md; + border: 1px solid fade(@color-border, 30%); + border-radius: @radius-md; + background: fade(#ffffff, 42%); +} + +.dnc-mission-pack-meta-card span { + font-size: 0.72rem; + font-weight: 700; + letter-spacing: 0.08em; + text-transform: uppercase; + color: @color-muted; +} + +.dnc-mission-pack-meta-card strong { + font-size: 1rem; +} + +.dnc-mission-pack-section { + display: grid; + gap: @spacing-md; +} + +.dnc-mission-pack-select { + padding: @spacing-md; + border: 1px solid fade(@color-border, 32%); + border-radius: @radius-md; + background: fade(#ffffff, 36%); +} + +.dnc-mission-pack-assignments { + display: grid; + gap: @spacing-md; + grid-template-columns: repeat(2, minmax(0, 1fr)); +} + +.dnc-mission-pack-assignment { + display: grid; + gap: @spacing-sm; + padding: @spacing-md; + border: 1px solid fade(@color-border, 35%); + border-radius: @radius-md; + background: fade(#ffffff, 38%); + box-shadow: inset 0 1px 0 fade(#ffffff, 55%); +} + +.dnc-mission-pack-assignment span { + font-size: 0.82rem; + font-weight: 700; + letter-spacing: 0.04em; + text-transform: uppercase; +} + +.dnc-mission-pack-note { + color: @color-muted; +} + +.dnc-mission-pack-note-foot { + padding: @spacing-md; + border-top: 1px solid fade(@color-border, 24%); +} + +.dnc-mission-pack-dialog .window-header { + background: + linear-gradient(180deg, fade(#fdf6e7, 96%) 0%, fade(#ead4aa, 96%) 100%), + linear-gradient(90deg, fade(@color-accent, 12%) 0%, fade(@color-accent, 0%) 100%); + border-bottom: 1px solid fade(@color-border, 35%); +} + +.dnc-mission-pack-dialog .window-title { + color: @color-accent; + font-family: @font-display; + letter-spacing: 0.03em; + text-shadow: none; +} + +.dnc-mission-pack-dialog .window-header button { + color: @color-ink; +} + +@media (max-width: 640px) { + .dnc-mission-pack-meta-grid, + .dnc-mission-pack-assignments { + grid-template-columns: 1fr; + } +} diff --git a/modules/donjon-et-cie-macros.mjs b/modules/donjon-et-cie-macros.mjs index ee644c4..02f37d8 100644 --- a/modules/donjon-et-cie-macros.mjs +++ b/modules/donjon-et-cie-macros.mjs @@ -13,6 +13,18 @@ import { DonjonEtCieUtility } from "./donjon-et-cie-utility.mjs"; export class DonjonEtCieMacros { + static MISSION_PACK_MODE_SETTING = "missionPackMode"; + static MISSION_PACK_SOCKET_SCOPE = "missionPackCampaign"; + static MISSION_PACK_REQUEST_TIMEOUT = 300000; + static MISSION_PACK_CAMPAIGN_DICE = [20, 12, 10, 8]; + static MISSION_PACK_STEWARD_MODES = { + positive: "avantage", + neutral: "normal", + negative: "desavantage" + }; + static #campaignRequests = new Map(); + static #socketRegistered = false; + static MISSION_PACK_TABLES = [ { key: "melee", name: "Armes de corps a corps", multiple: false }, { key: "ranged", name: "Armes a distance", multiple: false }, @@ -20,6 +32,132 @@ export class DonjonEtCieMacros { { key: "misc", name: "Encas et equipement divers", multiple: true } ]; + static MISSION_PACK_UNIQUE_ITEMS = [ + { + name: "L epee de Monsieur Noir", + type: "arme", + system: { + categorie: "melee", + caracteristique: "force", + degats: "1d6", + portee: "", + mains: 1, + equipee: false, + description: "

Elle n a rien de particulier mais confere un prestige important.

Avantage a tous les jets d interaction avec les employes de Donjon & Cie.

", + notes: "" + } + }, + { + name: "Fil a plomb d Arnezon", + type: "equipement", + system: { + quantite: 1, + equipee: false, + emplacement: "", + description: "

Il oscille de maniere clairement etrange en presence d un passage secret.

", + notes: "" + } + }, + { + name: "Boussole de Drize Durban", + type: "equipement", + system: { + quantite: 1, + equipee: false, + emplacement: "", + description: "

Trois reglages : pointe vers le client, le resident ou l employe le plus proche.

", + notes: "" + } + }, + { + name: "Boule de cristal de la supervision", + type: "equipement", + system: { + quantite: 1, + equipee: false, + emplacement: "", + description: "

Permet de voir toute personne ou lieu qu on connait deja.

Jet de SAG pour la controler. La plupart des huiles sentent quand on les observe.

", + notes: "" + } + }, + { + name: "Dent du dragon Leogradonardicus III", + type: "equipement", + system: { + quantite: 1, + equipee: false, + emplacement: "", + description: "

Un jet de CHA reussi permet de controler les reptiles inintelligents et de charmer les humanoides reptiliens.

", + notes: "" + } + }, + { + name: "Doigt d Aarcarcerax", + type: "consommable", + system: { + quantite: 1, + delta: 4, + effet: "Tue la creature vers qui on pointe le doigt.", + description: "

Tue la creature vers qui on pointe le doigt.

La liche sait instantanement qu on a retrouve son doigt.

", + notes: "" + } + }, + { + name: "Cape de Vlad von Drakovitch", + type: "consommable", + system: { + quantite: 1, + delta: 6, + effet: "Permet de se transformer en 1-3 rats, 4-5 chauve-souris, 6 forme gazeuse.", + description: "

Delta 6 charges.

Permet de se transformer en 1-3 rats, 4-5 chauve-souris, 6 forme gazeuse.

", + notes: "" + } + }, + { + name: "Vieux carnet de notes d Affalella", + type: "consommable", + system: { + quantite: 1, + delta: 6, + effet: "Fonctionne comme des faveurs de la Mercatique utilisables uniquement dans les aires client.", + description: "

Vieux carnet de notes d Affalella, directrice de la Mercatique.

Fonctionne comme Delta 6 faveurs de la Mercatique utilisables uniquement dans les aires client.

", + notes: "" + } + }, + { + name: "Ancienne cle universelle de Paiji", + type: "consommable", + system: { + quantite: 1, + delta: 8, + effet: "Ouvre tous les coffres, portes, armoires et autres serrures du Donjon.", + description: "

Ancienne cle universelle de Paiji, directeur de la Maintenance.

Delta 8 usages. Ouvre tous les coffres, portes, armoires et autres serrures du Donjon.

", + notes: "" + } + }, + { + name: "Baguette d urgence", + type: "equipement", + system: { + quantite: 1, + equipee: false, + emplacement: "", + description: "

Teleporte l utilisateur au palier des huiles lorsque la baguette est brisee.

", + notes: "" + } + } + ]; + + static registerSocketListeners() { + if (this.#socketRegistered || !game.socket) return; + + game.socket.on(`system.${game.system.id}`, (payload) => { + void this.#handleSocketMessage(payload); + }); + + this.#socketRegistered = true; + } + static #normalizeName(value) { return String(value ?? "") .normalize("NFD") @@ -34,6 +172,50 @@ export class DonjonEtCieMacros { return game.i18n.localize(`DNC.Macro.MissionPack.${key}`); } + static #getModeLabel(mode) { + if (mode === "avantage") return game.i18n.localize("DNC.UI.ModeAdvantage"); + if (mode === "desavantage") return game.i18n.localize("DNC.UI.ModeDisadvantage"); + return game.i18n.localize("DNC.UI.ModeNormal"); + } + + static #getMissionPackMode() { + return String(game.settings.get("fvtt-donjon-et-cie", this.MISSION_PACK_MODE_SETTING) ?? "classic"); + } + + static #getMissionPackModeLabel(mode) { + return game.i18n.localize(mode === "campaign" + ? "DNC.Macro.MissionPack.ModeCampaign" + : "DNC.Macro.MissionPack.ModeClassic"); + } + + static #getMissionPackModeDescription(mode) { + return game.i18n.localize(mode === "campaign" + ? "DNC.Macro.MissionPack.ModeCampaignHint" + : "DNC.Macro.MissionPack.ModeClassicHint"); + } + + static #getStewardRelationLabel(relation) { + return game.i18n.localize(`DNC.Macro.MissionPack.Relation.${relation ?? "neutral"}`); + } + + static #getStewardRelationOptions() { + return ["positive", "neutral", "negative"].map((relation) => ({ + value: relation, + label: this.#getStewardRelationLabel(relation) + })); + } + + static #getCampaignDiceOptions() { + return this.MISSION_PACK_CAMPAIGN_DICE.map((sides) => ({ + value: String(sides), + label: `1d${sides}` + })); + } + + static #getDefaultCampaignAssignments() { + return Object.fromEntries(this.MISSION_PACK_TABLES.map((spec, index) => [spec.key, String(this.MISSION_PACK_CAMPAIGN_DICE[index])])); + } + static #getDefaultMissionPackActorId(actors) { const controlledActor = canvas?.tokens?.controlled?.[0]?.actor ?? null; if (controlledActor?.type === "employe") return controlledActor.id; @@ -50,6 +232,16 @@ export class DonjonEtCieMacros { })); } + static #getMissionPackOwnerUsers(actor) { + return game.users + .filter((user) => !user.isGM && actor.testUserPermission(user, CONST.DOCUMENT_OWNERSHIP_LEVELS.OWNER)) + .sort((a, b) => Number(b.active) - Number(a.active) || a.name.localeCompare(b.name, "fr", { sensitivity: "base" })); + } + + static #getCampaignTargetUser(actor) { + return this.#getMissionPackOwnerUsers(actor).find((user) => user.active) ?? null; + } + static async #resolveMissionPackActor(target = null) { if (target?.documentName === "Actor") return target; if (target?.actor?.documentName === "Actor") return target.actor; @@ -121,6 +313,127 @@ export class DonjonEtCieMacros { .filter((entry) => !/^dotation\s+\d+$/i.test(entry)); } + static async #evaluateRoll(formula) { + const roll = await (new Roll(formula)).evaluate(); + const values = roll.dice + .flatMap((die) => die.results.map((result) => Number(result.result ?? result.count ?? 0))) + .filter((value) => Number.isFinite(value)); + + return { + roll, + total: Number(roll.total ?? 0), + values + }; + } + + static #formatRollValues(values, kept) { + if (!values.length) return String(kept ?? 0); + if (values.length === 1) return String(values[0]); + return `${values.join(" / ")} -> ${kept}`; + } + + static async #rollPackDie(sides, { mode = "normal" } = {}) { + const formula = mode === "avantage" + ? `2d${sides}kh` + : mode === "desavantage" + ? `2d${sides}kl` + : `1d${sides}`; + const evaluated = await this.#evaluateRoll(formula); + + return { + sides: Number(sides), + dieLabel: `1d${sides}`, + roll: evaluated.roll, + values: evaluated.values, + valuesLabel: this.#formatRollValues(evaluated.values, evaluated.total), + kept: evaluated.total, + mode, + modeLabel: this.#getModeLabel(mode) + }; + } + + static #createInlineItemData(spec) { + return { + name: spec.name, + type: spec.type, + img: DonjonEtCieUtility.getDefaultItemIcon(spec.type), + system: foundry.utils.deepClone(spec.system) + }; + } + + static #getTableResults(table) { + return table?.results?.contents ?? []; + } + + static #getTableRange(result) { + const rawRange = Array.isArray(result?.range) + ? result.range + : result?._source?.range ?? []; + return [Number(rawRange[0] ?? 0), Number(rawRange[1] ?? 0)]; + } + + static #findTableResultByTotal(table, total) { + const entries = this.#getTableResults(table) + .map((result) => ({ + result, + range: this.#getTableRange(result) + })) + .filter(({ range }) => Number.isFinite(range[0]) && Number.isFinite(range[1]) && range[1] >= range[0]) + .sort((a, b) => a.range[0] - b.range[0]); + + if (!entries.length) { + return { + result: null, + clampedTotal: total, + range: null + }; + } + + const minimum = entries[0].range[0]; + const maximum = entries.at(-1).range[1]; + const clampedTotal = Math.max(minimum, Math.min(maximum, total)); + const match = entries.find(({ range }) => clampedTotal >= range[0] && clampedTotal <= range[1]) ?? entries.at(-1); + + return { + result: match.result, + clampedTotal, + range: match.range + }; + } + + static async #resolveUniqueMissionPackEntry({ comparisonRoll = null } = {}) { + const reference = await this.#rollPackDie(20); + const actorEvaluation = comparisonRoll == null ? await this.#rollPackDie(20) : null; + const actorRoll = Number(comparisonRoll ?? actorEvaluation?.kept ?? 0); + + if (reference.kept !== actorRoll) { + return { + matched: false, + referenceRoll: reference.kept, + actorRoll, + uniqueRoll: null, + itemName: "", + itemData: null, + rolls: [reference.roll, ...(actorEvaluation ? [actorEvaluation.roll] : [])] + }; + } + + const uniqueRoll = await this.#rollPackDie(this.MISSION_PACK_UNIQUE_ITEMS.length); + const spec = this.MISSION_PACK_UNIQUE_ITEMS[Math.max(0, uniqueRoll.kept - 1)] ?? this.MISSION_PACK_UNIQUE_ITEMS[0]; + const document = await this.#findItemByName(spec.name); + const itemData = document ? this.#toEmbeddedItemData(document) : this.#createInlineItemData(spec); + + return { + matched: true, + referenceRoll: reference.kept, + actorRoll, + uniqueRoll: uniqueRoll.kept, + itemName: document?.name ?? spec.name, + itemData, + rolls: [reference.roll, ...(actorEvaluation ? [actorEvaluation.roll] : []), uniqueRoll.roll] + }; + } + static async #resolveTableResultEntries(result, { multiple = false } = {}) { if (!result) { return { @@ -129,19 +442,27 @@ export class DonjonEtCieMacros { }; } - if (result.type === "document" && result.documentCollection && result.documentId) { - const uuid = result.documentCollection.includes(".") - ? `Compendium.${result.documentCollection}.Item.${result.documentId}` - : `Item.${result.documentId}`; - const document = await fromUuid(uuid); - const label = document?.name ?? result.text ?? ""; + const source = result._source ?? {}; + const resultName = String(result.name ?? source.name ?? "").trim(); + const resultDescription = String(result.description ?? source.description ?? "").trim(); + const resultText = String(source.text ?? "").trim(); + const resultLabel = resultName || resultDescription || resultText; + + const documentUuid = result.type === "document" + ? result.documentUuid ?? source.documentUuid ?? null + : null; + + if (documentUuid) { + const document = await fromUuid(documentUuid); + const label = document?.name ?? resultLabel; return { display: label, entries: label ? [{ name: label, document }] : [] }; } - const uuidTargets = this.#extractUuidTargets(result.text); + const sourceText = resultDescription || resultText || resultLabel; + const uuidTargets = this.#extractUuidTargets(sourceText); if (uuidTargets.length) { const entries = []; for (const target of uuidTargets) { @@ -158,8 +479,8 @@ export class DonjonEtCieMacros { } const names = multiple - ? this.#extractPlainTextEntries(result.text) - : [result.text].map((entry) => String(entry ?? "").trim()).filter(Boolean); + ? this.#extractPlainTextEntries(sourceText || resultLabel) + : [resultLabel].filter(Boolean); return { display: names.join(", "), @@ -175,6 +496,353 @@ export class DonjonEtCieMacros { return data; } + static async #materializeMissionPackEntries(entries) { + const embeddedItems = []; + const addedNames = []; + const missingNames = []; + + for (const entry of entries) { + const item = entry.document ?? await this.#findItemByName(entry.name); + if (!item) { + missingNames.push(entry.name); + continue; + } + + embeddedItems.push(this.#toEmbeddedItemData(item)); + addedNames.push(item.name); + } + + return { + embeddedItems, + addedNames, + missingNames + }; + } + + static async #openCampaignAllocationDialog(actor, { playerName = "", requesterName = "" } = {}) { + const content = await foundry.applications.handlebars.renderTemplate( + "systems/fvtt-donjon-et-cie/templates/dialogs/mission-pack-campaign-dialog.hbs", + { + actorName: actor.name, + playerName, + requesterName, + rank: Number(actor.system.anciennete?.rang ?? actor.system.sante?.dv ?? 0), + assignments: this.MISSION_PACK_TABLES.map((spec) => ({ + key: spec.key, + label: this.#getMissionPackLabel(spec.key), + fieldName: `${spec.key}Die`, + selectedDie: this.#getDefaultCampaignAssignments()[spec.key] + })), + diceOptions: this.#getCampaignDiceOptions(), + relationOptions: this.#getStewardRelationOptions(), + selectedRelation: "neutral" + } + ); + + return foundry.applications.api.DialogV2.wait({ + window: { + title: game.i18n.localize("DNC.Macro.MissionPack.CampaignDialogTitle"), + icon: "fa-solid fa-dice" + }, + classes: ["dnc-roll-dialog", "dnc-mission-pack-dialog"], + content, + modal: true, + buttons: [ + { + action: "confirm", + label: game.i18n.localize("DNC.Macro.MissionPack.CampaignDialogAction"), + icon: "fa-solid fa-check", + default: true, + callback: async (event, button) => { + const assignments = Object.fromEntries(this.MISSION_PACK_TABLES.map((spec) => [ + spec.key, + Number(button.form.elements[`${spec.key}Die`]?.value ?? 0) + ])); + const selectedDice = Object.values(assignments).filter((value) => value > 0); + + if (selectedDice.length !== this.MISSION_PACK_TABLES.length) { + ui.notifications.warn(game.i18n.localize("DNC.Macro.MissionPack.WarnDiceRequired")); + return null; + } + + if (new Set(selectedDice).size !== selectedDice.length) { + ui.notifications.warn(game.i18n.localize("DNC.Macro.MissionPack.WarnDiceUnique")); + return null; + } + + return { + assignments, + stewardRelation: button.form.elements.stewardRelation?.value ?? "neutral" + }; + } + } + ], + rejectClose: false + }); + } + + static async #handleSocketMessage(payload) { + if (payload?.scope !== this.MISSION_PACK_SOCKET_SCOPE) return; + + if (payload.type === "campaign-response") { + const pending = this.#campaignRequests.get(payload.requestId); + if (!pending) return; + clearTimeout(pending.timeoutId); + this.#campaignRequests.delete(payload.requestId); + pending.resolve(payload.result ?? null); + return; + } + + if (payload.type !== "campaign-request" || payload.targetUserId !== game.user.id) return; + + const actor = await fromUuid(payload.actorUuid); + const allocation = actor + ? await this.#openCampaignAllocationDialog(actor, { + playerName: game.user.name, + requesterName: payload.requesterName ?? "" + }) + : null; + + game.socket.emit(`system.${game.system.id}`, { + scope: this.MISSION_PACK_SOCKET_SCOPE, + type: "campaign-response", + requestId: payload.requestId, + result: allocation + ? { + allocation, + responderUserId: game.user.id, + responderName: game.user.name + } + : { + allocation: null, + responderUserId: game.user.id, + responderName: game.user.name + } + }); + } + + static async #requestCampaignAllocation(actor, targetUser) { + if (!targetUser || targetUser.id === game.user.id) { + const allocation = await this.#openCampaignAllocationDialog(actor, { + playerName: game.user.name, + requesterName: game.user.name + }); + return allocation ? { allocation, responderName: game.user.name } : null; + } + + const requestId = foundry.utils.randomID(); + const responsePromise = new Promise((resolve) => { + const timeoutId = globalThis.setTimeout(() => { + this.#campaignRequests.delete(requestId); + resolve(null); + }, this.MISSION_PACK_REQUEST_TIMEOUT); + this.#campaignRequests.set(requestId, { resolve, timeoutId }); + }); + + game.socket.emit(`system.${game.system.id}`, { + scope: this.MISSION_PACK_SOCKET_SCOPE, + type: "campaign-request", + requestId, + targetUserId: targetUser.id, + actorUuid: actor.uuid, + requesterName: game.user.name + }); + + const response = await responsePromise; + if (!response?.allocation) { + ui.notifications.warn(game.i18n.format("DNC.Macro.MissionPack.CampaignRequestCanceled", { + actor: actor.name, + player: targetUser.name + })); + return null; + } + + return { + allocation: response.allocation, + responderName: response.responderName ?? targetUser.name + }; + } + + static async #finalizeMissionPack(actor, drawPlans, { + generationMode = "classic", + controllerName = "", + stewardRelation = "neutral", + uniqueComparisonRoll = null + } = {}) { + const draws = []; + const embeddedItems = []; + const rolls = []; + let missingCount = 0; + + for (const plan of drawPlans) { + rolls.push(...(plan.rolls ?? []).filter((roll) => roll instanceof Roll)); + + if (plan.failed || !plan.resolved) { + draws.push({ + label: this.#getMissionPackLabel(plan.spec.key), + display: game.i18n.format("DNC.Macro.MissionPack.TableMissing", { table: plan.spec.name }), + addedNames: [], + addedSummary: "", + missingNames: [], + missingSummary: "", + failed: true + }); + continue; + } + + const materialized = await this.#materializeMissionPackEntries(plan.resolved.entries); + embeddedItems.push(...materialized.embeddedItems); + missingCount += materialized.missingNames.length; + + draws.push({ + label: this.#getMissionPackLabel(plan.spec.key), + display: plan.resolved.display || game.i18n.localize("DNC.Macro.MissionPack.NoResult"), + addedNames: materialized.addedNames, + addedSummary: materialized.addedNames.join(", "), + missingNames: materialized.missingNames, + missingSummary: materialized.missingNames.join(", "), + failed: false, + ...plan.detail + }); + } + + const uniqueEntry = await this.#resolveUniqueMissionPackEntry({ comparisonRoll: uniqueComparisonRoll }); + rolls.push(...(uniqueEntry.rolls ?? []).filter((roll) => roll instanceof Roll)); + if (uniqueEntry.itemData) { + embeddedItems.push(uniqueEntry.itemData); + } + + const createdItems = embeddedItems.length + ? await actor.createEmbeddedDocuments("Item", embeddedItems, { renderSheet: false }) + : []; + + const content = await foundry.applications.handlebars.renderTemplate( + "systems/fvtt-donjon-et-cie/templates/chat/mission-pack-card.hbs", + { + title: game.i18n.localize("DNC.Macro.MissionPack.Title"), + actorName: actor.name, + createdCount: createdItems.length, + missingCount, + draws, + uniqueEntry, + isCampaign: generationMode === "campaign", + generationModeLabel: this.#getMissionPackModeLabel(generationMode), + controllerName, + stewardRelationLabel: generationMode === "campaign" ? this.#getStewardRelationLabel(stewardRelation) : "" + } + ); + + await ChatMessage.create({ + speaker: ChatMessage.getSpeaker({ actor }), + user: game.user.id, + content, + rolls + }); + + if (createdItems.length && !missingCount) { + ui.notifications.info(game.i18n.format("DNC.Macro.MissionPack.Success", { + actor: actor.name, + count: createdItems.length + })); + } else if (createdItems.length) { + ui.notifications.warn(game.i18n.format("DNC.Macro.MissionPack.Partial", { + actor: actor.name, + count: createdItems.length, + missing: missingCount + })); + } else { + ui.notifications.warn(game.i18n.localize("DNC.Macro.MissionPack.WarnNothingAdded")); + } + + return { + actor, + createdItems, + missingCount, + draws, + uniqueEntry, + generationMode, + controllerName, + stewardRelation + }; + } + + static async #grantClassicMissionPack(actor) { + const drawPlans = []; + + for (const spec of this.MISSION_PACK_TABLES) { + const table = await this.#findRollTableByName(spec.name); + if (!table) { + drawPlans.push({ spec, failed: true, resolved: null, rolls: [] }); + continue; + } + + const draw = await table.draw({ displayChat: false }); + const result = draw.results?.[0] ?? null; + drawPlans.push({ + spec, + failed: false, + resolved: await this.#resolveTableResultEntries(result, { multiple: spec.multiple }), + detail: null, + rolls: draw.roll instanceof Roll ? [draw.roll] : [] + }); + } + + return this.#finalizeMissionPack(actor, drawPlans, { + generationMode: "classic" + }); + } + + static async #grantCampaignMissionPack(actor) { + const targetUser = this.#getCampaignTargetUser(actor); + const allocationResult = await this.#requestCampaignAllocation(actor, targetUser); + if (!allocationResult?.allocation) return null; + + const rankBonus = Number(actor.system.anciennete?.rang ?? actor.system.sante?.dv ?? 0); + const stewardRelation = allocationResult.allocation.stewardRelation ?? "neutral"; + const mode = this.MISSION_PACK_STEWARD_MODES[stewardRelation] ?? "normal"; + const drawPlans = []; + let uniqueComparisonRoll = null; + + for (const spec of this.MISSION_PACK_TABLES) { + const table = await this.#findRollTableByName(spec.name); + if (!table) { + drawPlans.push({ spec, failed: true, resolved: null, rolls: [] }); + continue; + } + + const sides = Number(allocationResult.allocation.assignments?.[spec.key] ?? 0); + const rollData = await this.#rollPackDie(sides, { mode }); + if (sides === 20) uniqueComparisonRoll = rollData.kept; + + const total = rollData.kept + rankBonus; + const tableResult = this.#findTableResultByTotal(table, total); + + drawPlans.push({ + spec, + failed: false, + resolved: await this.#resolveTableResultEntries(tableResult.result, { multiple: spec.multiple }), + detail: { + dieLabel: rollData.dieLabel, + modeLabel: rollData.modeLabel, + rollValuesLabel: rollData.valuesLabel, + kept: rollData.kept, + rankBonus, + total, + resolvedTotal: tableResult.clampedTotal, + clamped: tableResult.clampedTotal !== total + }, + rolls: [rollData.roll] + }); + } + + return this.#finalizeMissionPack(actor, drawPlans, { + generationMode: "campaign", + controllerName: allocationResult.responderName ?? targetUser?.name ?? game.user.name, + stewardRelation, + uniqueComparisonRoll + }); + } + /** * Open the GM-only mission pack dialog. * @returns {Promise} @@ -191,12 +859,16 @@ export class DonjonEtCieMacros { return null; } + const mode = this.#getMissionPackMode(); const selectedActorId = this.#getDefaultMissionPackActorId(actorOptions.map((option) => game.actors.get(option.value)).filter(Boolean)); const content = await foundry.applications.handlebars.renderTemplate( "systems/fvtt-donjon-et-cie/templates/dialogs/mission-pack-dialog.hbs", { actorOptions, - selectedActorId + selectedActorId, + modeLabel: this.#getMissionPackModeLabel(mode), + modeDescription: this.#getMissionPackModeDescription(mode), + isCampaign: mode === "campaign" } ); @@ -246,95 +918,8 @@ export class DonjonEtCieMacros { return null; } - const draws = []; - const embeddedItems = []; - let missingCount = 0; - - for (const spec of this.MISSION_PACK_TABLES) { - const table = await this.#findRollTableByName(spec.name); - if (!table) { - draws.push({ - label: this.#getMissionPackLabel(spec.key), - display: game.i18n.format("DNC.Macro.MissionPack.TableMissing", { table: spec.name }), - addedNames: [], - addedSummary: "", - missingNames: [], - missingSummary: "", - failed: true - }); - continue; - } - - const draw = await table.draw({ displayChat: false }); - const result = draw.results?.[0] ?? null; - const resolved = await this.#resolveTableResultEntries(result, { multiple: spec.multiple }); - const addedNames = []; - const missingNames = []; - - for (const entry of resolved.entries) { - const item = entry.document ?? await this.#findItemByName(entry.name); - if (!item) { - missingNames.push(entry.name); - missingCount += 1; - continue; - } - - embeddedItems.push(this.#toEmbeddedItemData(item)); - addedNames.push(item.name); - } - - draws.push({ - label: this.#getMissionPackLabel(spec.key), - display: resolved.display || game.i18n.localize("DNC.Macro.MissionPack.NoResult"), - addedNames, - addedSummary: addedNames.join(", "), - missingNames, - missingSummary: missingNames.join(", "), - failed: false - }); - } - - const createdItems = embeddedItems.length - ? await actor.createEmbeddedDocuments("Item", embeddedItems, { renderSheet: false }) - : []; - - const content = await foundry.applications.handlebars.renderTemplate( - "systems/fvtt-donjon-et-cie/templates/chat/mission-pack-card.hbs", - { - title: game.i18n.localize("DNC.Macro.MissionPack.Title"), - actorName: actor.name, - createdCount: createdItems.length, - missingCount, - draws - } - ); - - await ChatMessage.create({ - speaker: ChatMessage.getSpeaker({ actor }), - user: game.user.id, - content - }); - - if (createdItems.length && !missingCount) { - ui.notifications.info(game.i18n.format("DNC.Macro.MissionPack.Success", { - actor: actor.name, - count: createdItems.length - })); - } else if (createdItems.length) { - ui.notifications.warn(game.i18n.format("DNC.Macro.MissionPack.Partial", { - actor: actor.name, - count: createdItems.length, - missing: missingCount - })); - } else { - ui.notifications.warn(game.i18n.localize("DNC.Macro.MissionPack.WarnNothingAdded")); - } - - return { - actor, - createdItems, - missingCount, - draws - }; + return this.#getMissionPackMode() === "campaign" + ? this.#grantCampaignMissionPack(actor) + : this.#grantClassicMissionPack(actor); } } diff --git a/modules/donjon-et-cie-main.mjs b/modules/donjon-et-cie-main.mjs index ec65bce..855a484 100644 --- a/modules/donjon-et-cie-main.mjs +++ b/modules/donjon-et-cie-main.mjs @@ -98,6 +98,19 @@ function registerSystemSettings() { type: String, default: "" }); + + game.settings.register("fvtt-donjon-et-cie", DonjonEtCieMacros.MISSION_PACK_MODE_SETTING, { + name: "Mode de paquetage de mission", + hint: "Choisit entre le tirage classique rapide et la regle optionnelle de campagne avec allocation des des par les joueurs.", + scope: "world", + config: true, + type: String, + default: "classic", + choices: { + classic: "Classique", + campaign: "Campagne" + } + }); } async function getHelpJournalLink() { @@ -215,6 +228,7 @@ Hooks.once("init", async () => { }); Hooks.once("ready", () => { + DonjonEtCieMacros.registerSocketListeners(); document.addEventListener("click", onChatActionClick); void maybeCreateWelcomeMessage(); }); diff --git a/modules/donjon-et-cie-rolls.mjs b/modules/donjon-et-cie-rolls.mjs index 7a72553..994f269 100644 --- a/modules/donjon-et-cie-rolls.mjs +++ b/modules/donjon-et-cie-rolls.mjs @@ -14,12 +14,14 @@ import { DonjonEtCieUtility } from "./donjon-et-cie-utility.mjs"; import { DONJON_ET_CIE } from "./donjon-et-cie-config.mjs"; export class DonjonEtCieRolls { - static async #createChatCard(actor, template, context) { + static async #createChatCard(actor, template, context, { rolls = [] } = {}) { const content = await foundry.applications.handlebars.renderTemplate(template, context); + const validRolls = rolls.filter((roll) => roll instanceof Roll); await ChatMessage.create({ speaker: ChatMessage.getSpeaker({ actor }), user: game.user.id, - content + content, + rolls: validRolls }); } @@ -68,7 +70,7 @@ export class DonjonEtCieRolls { const kept = this.#selectKeptValue(values, mode, "low"); const success = kept <= target; - return { characteristic, characteristicKey, target, values, kept, success, mode, isNaturalOne: kept === 1, isNaturalTwenty: kept === 20 }; + return { characteristic, characteristicKey, target, values, kept, success, mode, roll, isNaturalOne: kept === 1, isNaturalTwenty: kept === 20 }; } static async #resolveFavorBoost(actor, favorKey, mode = "normal") { @@ -101,6 +103,7 @@ export class DonjonEtCieRolls { effectiveMode: this.#applyFavorMode(mode), modeBefore: mode, modeAfter: this.#applyFavorMode(mode), + rolls: resolved.rolls, note: degraded ? "Le coup de pouce reste anonyme : un collegue du departement a donne l'info utile." : "Le coup de pouce tient bon : nommez le collegue, ses trois traits et la relation pour le trombinoscope." @@ -129,7 +132,7 @@ export class DonjonEtCieRolls { after: DonjonEtCieUtility.formatUsageDie(after), autoSpent: true, note: "La faveur est brulee pour obtenir directement l'aide souhaitee, a la discretion du MJ." - }); + }, { rolls: [] }); return { key: favorKey, label, before, after }; } @@ -172,6 +175,7 @@ export class DonjonEtCieRolls { before: focusDelta, after, degraded, + rolls: resolved.rolls, values: resolved.values }; } @@ -208,7 +212,7 @@ export class DonjonEtCieRolls { { label: game.i18n.localize("DNC.Chat.After"), value: DonjonEtCieUtility.formatUsageDie(favor.after) } ] : []) ] - }); + }, { rolls: [...(favor?.rolls ?? []), result.roll] }); return { ...result, favor, mode: effectiveMode }; } @@ -246,7 +250,7 @@ export class DonjonEtCieRolls { mode: result.mode, modeLabel: this.#getModeLabel(result.mode), syncedCombat - }); + }, { rolls: result.rolls }); return { total: result.kept, die, dieValues, dex, bonus: sheetBonus, mode: result.mode, syncedCombat }; } @@ -271,7 +275,7 @@ export class DonjonEtCieRolls { formula: roll.formula, total: roll.total, dieValues - }); + }, { rolls: [roll] }); return { formula: roll.formula, total: roll.total, dieValues }; } @@ -318,7 +322,7 @@ export class DonjonEtCieRolls { { label: game.i18n.localize("DNC.Chat.After"), value: DonjonEtCieUtility.formatUsageDie(favor.after) } ] : []) ] - }); + }, { rolls: [...(favor?.rolls ?? []), result.roll] }); return { ...result, favor, mode: effectiveMode }; } @@ -351,7 +355,7 @@ export class DonjonEtCieRolls { sourceLabel: item.name, targets, hasTargets: targets.length > 0 - }); + }, { rolls: result.rolls }); return { total: result.kept, formula: result.formula, bonus: totalBonus, values: result.values, mode: result.mode }; } @@ -483,7 +487,7 @@ export class DonjonEtCieRolls { focusDegraded: focus.degraded, spentPv, remainingPv - }); + }, { rolls: [...(favor?.rolls ?? []), ...(focus.rolls ?? []), result.roll] }); return { ...result, success, spentPv, remainingPv, cost, focus, focusSpent, focusRemaining, favor, mode: effectiveMode }; } @@ -514,7 +518,7 @@ export class DonjonEtCieRolls { degraded, exhausted: after < 4, itemName: item.name - }); + }, { rolls: resolved.rolls }); return { result, before, after, degraded, chaosEntry }; } @@ -552,7 +556,7 @@ export class DonjonEtCieRolls { protectionStored: item.type === "armure" ? result : null, degraded, exhausted: after === 0 - }); + }, { rolls: resolved.rolls }); return { result, values: resolved.values, mode: resolved.mode, before, after, degraded }; } diff --git a/modules/donjon-et-cie-utility.mjs b/modules/donjon-et-cie-utility.mjs index 13ce90a..aa5b296 100644 --- a/modules/donjon-et-cie-utility.mjs +++ b/modules/donjon-et-cie-utility.mjs @@ -35,6 +35,7 @@ export class DonjonEtCieUtility { "systems/fvtt-donjon-et-cie/templates/dialogs/spell-roll.hbs", "systems/fvtt-donjon-et-cie/templates/dialogs/usage-roll.hbs", "systems/fvtt-donjon-et-cie/templates/dialogs/mission-pack-dialog.hbs", + "systems/fvtt-donjon-et-cie/templates/dialogs/mission-pack-campaign-dialog.hbs", "systems/fvtt-donjon-et-cie/templates/chat/roll-card.hbs", "systems/fvtt-donjon-et-cie/templates/chat/spell-card.hbs", "systems/fvtt-donjon-et-cie/templates/chat/chaos-card.hbs", diff --git a/packs/equipment/000063.log b/packs/equipment/000071.log similarity index 100% rename from packs/equipment/000063.log rename to packs/equipment/000071.log diff --git a/packs/equipment/CURRENT b/packs/equipment/CURRENT index ebafc63..5893b8f 100644 --- a/packs/equipment/CURRENT +++ b/packs/equipment/CURRENT @@ -1 +1 @@ -MANIFEST-000061 +MANIFEST-000069 diff --git a/packs/equipment/LOG b/packs/equipment/LOG index 815004e..96291a9 100644 --- a/packs/equipment/LOG +++ b/packs/equipment/LOG @@ -1,7 +1,7 @@ -2026/05/01-09:12:26.343249 7f3f34bfd6c0 Recovering log #59 -2026/05/01-09:12:26.359113 7f3f34bfd6c0 Delete type=3 #57 -2026/05/01-09:12:26.359184 7f3f34bfd6c0 Delete type=0 #59 -2026/05/01-09:12:52.776973 7f3ee77fe6c0 Level-0 table #64: started -2026/05/01-09:12:52.777005 7f3ee77fe6c0 Level-0 table #64: 0 bytes OK -2026/05/01-09:12:52.786696 7f3ee77fe6c0 Delete type=0 #62 -2026/05/01-09:12:52.798282 7f3ee77fe6c0 Manual compaction at level-0 from '!folders!K9aiFu0dE6UYiXBd' @ 72057594037927935 : 1 .. '!items!zyqLzmpbHxK3jt5q' @ 0 : 0; will stop at (end) +2026/05/03-21:07:42.001613 7f8452bfd6c0 Recovering log #67 +2026/05/03-21:07:42.055968 7f8452bfd6c0 Delete type=3 #65 +2026/05/03-21:07:42.056020 7f8452bfd6c0 Delete type=0 #67 +2026/05/03-21:51:13.488361 7f8451bfb6c0 Level-0 table #72: started +2026/05/03-21:51:13.488402 7f8451bfb6c0 Level-0 table #72: 0 bytes OK +2026/05/03-21:51:13.495004 7f8451bfb6c0 Delete type=0 #70 +2026/05/03-21:51:13.509020 7f8451bfb6c0 Manual compaction at level-0 from '!folders!K9aiFu0dE6UYiXBd' @ 72057594037927935 : 1 .. '!items!zyqLzmpbHxK3jt5q' @ 0 : 0; will stop at (end) diff --git a/packs/equipment/LOG.old b/packs/equipment/LOG.old index f7e8157..f3c6ff0 100644 --- a/packs/equipment/LOG.old +++ b/packs/equipment/LOG.old @@ -1,7 +1,7 @@ -2026/05/01-00:45:47.927508 7f3f34bfd6c0 Recovering log #55 -2026/05/01-00:45:47.937371 7f3f34bfd6c0 Delete type=3 #53 -2026/05/01-00:45:47.937437 7f3f34bfd6c0 Delete type=0 #55 -2026/05/01-00:49:08.816625 7f3ee77fe6c0 Level-0 table #60: started -2026/05/01-00:49:08.816656 7f3ee77fe6c0 Level-0 table #60: 0 bytes OK -2026/05/01-00:49:08.823102 7f3ee77fe6c0 Delete type=0 #58 -2026/05/01-00:49:08.830613 7f3ee77fe6c0 Manual compaction at level-0 from '!folders!K9aiFu0dE6UYiXBd' @ 72057594037927935 : 1 .. '!items!zyqLzmpbHxK3jt5q' @ 0 : 0; will stop at (end) +2026/05/03-20:39:13.226386 7f8452bfd6c0 Recovering log #63 +2026/05/03-20:39:13.322551 7f8452bfd6c0 Delete type=3 #61 +2026/05/03-20:39:13.322644 7f8452bfd6c0 Delete type=0 #63 +2026/05/03-21:07:35.303136 7f8451bfb6c0 Level-0 table #68: started +2026/05/03-21:07:35.303190 7f8451bfb6c0 Level-0 table #68: 0 bytes OK +2026/05/03-21:07:35.343678 7f8451bfb6c0 Delete type=0 #66 +2026/05/03-21:07:35.450352 7f8451bfb6c0 Manual compaction at level-0 from '!folders!K9aiFu0dE6UYiXBd' @ 72057594037927935 : 1 .. '!items!zyqLzmpbHxK3jt5q' @ 0 : 0; will stop at (end) diff --git a/packs/equipment/MANIFEST-000061 b/packs/equipment/MANIFEST-000069 similarity index 73% rename from packs/equipment/MANIFEST-000061 rename to packs/equipment/MANIFEST-000069 index 7a5673c..06cdb87 100644 Binary files a/packs/equipment/MANIFEST-000061 and b/packs/equipment/MANIFEST-000069 differ diff --git a/packs/random-tables/000050.log b/packs/random-tables/000058.log similarity index 100% rename from packs/random-tables/000050.log rename to packs/random-tables/000058.log diff --git a/packs/random-tables/CURRENT b/packs/random-tables/CURRENT index a9ebced..80d9de0 100644 --- a/packs/random-tables/CURRENT +++ b/packs/random-tables/CURRENT @@ -1 +1 @@ -MANIFEST-000048 +MANIFEST-000056 diff --git a/packs/random-tables/LOG b/packs/random-tables/LOG index 5e4ec6a..4590ddf 100644 --- a/packs/random-tables/LOG +++ b/packs/random-tables/LOG @@ -1,7 +1,7 @@ -2026/05/01-09:12:26.362764 7f3ee7fff6c0 Recovering log #46 -2026/05/01-09:12:26.377202 7f3ee7fff6c0 Delete type=3 #44 -2026/05/01-09:12:26.377270 7f3ee7fff6c0 Delete type=0 #46 -2026/05/01-09:12:52.767020 7f3ee77fe6c0 Level-0 table #51: started -2026/05/01-09:12:52.767054 7f3ee77fe6c0 Level-0 table #51: 0 bytes OK -2026/05/01-09:12:52.776818 7f3ee77fe6c0 Delete type=0 #49 -2026/05/01-09:12:52.798270 7f3ee77fe6c0 Manual compaction at level-0 from '!tables!PPsxQgHwLCQ2gjSW' @ 72057594037927935 : 1 .. '!tables.results!wJZXUo4q5b5vE3Dy.zFTPLMc9zOl5hISV' @ 0 : 0; will stop at (end) +2026/05/03-21:07:42.063619 7f84523fc6c0 Recovering log #54 +2026/05/03-21:07:42.117857 7f84523fc6c0 Delete type=3 #52 +2026/05/03-21:07:42.117936 7f84523fc6c0 Delete type=0 #54 +2026/05/03-21:51:13.495113 7f8451bfb6c0 Level-0 table #59: started +2026/05/03-21:51:13.495141 7f8451bfb6c0 Level-0 table #59: 0 bytes OK +2026/05/03-21:51:13.501454 7f8451bfb6c0 Delete type=0 #57 +2026/05/03-21:51:13.509034 7f8451bfb6c0 Manual compaction at level-0 from '!tables!PPsxQgHwLCQ2gjSW' @ 72057594037927935 : 1 .. '!tables.results!wJZXUo4q5b5vE3Dy.zFTPLMc9zOl5hISV' @ 0 : 0; will stop at (end) diff --git a/packs/random-tables/LOG.old b/packs/random-tables/LOG.old index d8bd906..7acd152 100644 --- a/packs/random-tables/LOG.old +++ b/packs/random-tables/LOG.old @@ -1,7 +1,7 @@ -2026/05/01-00:45:47.940542 7f3f35bff6c0 Recovering log #42 -2026/05/01-00:45:47.951337 7f3f35bff6c0 Delete type=3 #40 -2026/05/01-00:45:47.951402 7f3f35bff6c0 Delete type=0 #42 -2026/05/01-00:49:08.810118 7f3ee77fe6c0 Level-0 table #47: started -2026/05/01-00:49:08.810197 7f3ee77fe6c0 Level-0 table #47: 0 bytes OK -2026/05/01-00:49:08.816466 7f3ee77fe6c0 Delete type=0 #45 -2026/05/01-00:49:08.830594 7f3ee77fe6c0 Manual compaction at level-0 from '!tables!PPsxQgHwLCQ2gjSW' @ 72057594037927935 : 1 .. '!tables.results!wJZXUo4q5b5vE3Dy.zFTPLMc9zOl5hISV' @ 0 : 0; will stop at (end) +2026/05/03-20:39:13.341074 7f84533fe6c0 Recovering log #50 +2026/05/03-20:39:13.422540 7f84533fe6c0 Delete type=3 #48 +2026/05/03-20:39:13.422627 7f84533fe6c0 Delete type=0 #50 +2026/05/03-21:07:35.413322 7f8451bfb6c0 Level-0 table #55: started +2026/05/03-21:07:35.413362 7f8451bfb6c0 Level-0 table #55: 0 bytes OK +2026/05/03-21:07:35.450232 7f8451bfb6c0 Delete type=0 #53 +2026/05/03-21:07:35.450384 7f8451bfb6c0 Manual compaction at level-0 from '!tables!PPsxQgHwLCQ2gjSW' @ 72057594037927935 : 1 .. '!tables.results!wJZXUo4q5b5vE3Dy.zFTPLMc9zOl5hISV' @ 0 : 0; will stop at (end) diff --git a/packs/random-tables/MANIFEST-000048 b/packs/random-tables/MANIFEST-000056 similarity index 85% rename from packs/random-tables/MANIFEST-000048 rename to packs/random-tables/MANIFEST-000056 index 7b1b16a..30f1a94 100644 Binary files a/packs/random-tables/MANIFEST-000048 and b/packs/random-tables/MANIFEST-000056 differ diff --git a/packs/system-help/000032.log b/packs/system-help/000040.log similarity index 100% rename from packs/system-help/000032.log rename to packs/system-help/000040.log diff --git a/packs/system-help/CURRENT b/packs/system-help/CURRENT index caa721a..1a84852 100644 --- a/packs/system-help/CURRENT +++ b/packs/system-help/CURRENT @@ -1 +1 @@ -MANIFEST-000030 +MANIFEST-000002 diff --git a/packs/system-help/LOG b/packs/system-help/LOG index 043b829..bedbd32 100644 --- a/packs/system-help/LOG +++ b/packs/system-help/LOG @@ -1,7 +1,5 @@ -2026/05/01-09:12:26.379797 7f3f353fe6c0 Recovering log #28 -2026/05/01-09:12:26.395236 7f3f353fe6c0 Delete type=3 #26 -2026/05/01-09:12:26.395290 7f3f353fe6c0 Delete type=0 #28 -2026/05/01-09:12:52.786838 7f3ee77fe6c0 Level-0 table #33: started -2026/05/01-09:12:52.786863 7f3ee77fe6c0 Level-0 table #33: 0 bytes OK -2026/05/01-09:12:52.798150 7f3ee77fe6c0 Delete type=0 #31 -2026/05/01-09:12:52.798293 7f3ee77fe6c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end) +2026/05/03-21:49:37.907525 7f8d8a3ff6c0 Delete type=3 #1 +2026/05/03-21:49:37.915375 7f8d6bfff6c0 Level-0 table #5: started +2026/05/03-21:49:37.919396 7f8d6bfff6c0 Level-0 table #5: 3056 bytes OK +2026/05/03-21:49:37.925768 7f8d6bfff6c0 Delete type=0 #3 +2026/05/03-21:49:37.926041 7f8d6bfff6c0 Manual compaction at level-0 from '!journal!69Da9YvF9BfOV7oK' @ 72057594037927935 : 1 .. '!journal.pages!69Da9YvF9BfOV7oK.XM0eLkgKXPyskV65' @ 0 : 0; will stop at (end) diff --git a/packs/system-help/LOG.old b/packs/system-help/LOG.old deleted file mode 100644 index 1d2918b..0000000 --- a/packs/system-help/LOG.old +++ /dev/null @@ -1,5 +0,0 @@ -2026/05/01-00:45:48.110687 7f3f35bff6c0 Delete type=3 #1 -2026/05/01-00:49:08.823197 7f3ee77fe6c0 Level-0 table #29: started -2026/05/01-00:49:08.823234 7f3ee77fe6c0 Level-0 table #29: 0 bytes OK -2026/05/01-00:49:08.830411 7f3ee77fe6c0 Delete type=0 #27 -2026/05/01-00:49:08.830628 7f3ee77fe6c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end) diff --git a/packs/system-help/MANIFEST-000030 b/packs/system-help/MANIFEST-000030 deleted file mode 100644 index cfed94e..0000000 Binary files a/packs/system-help/MANIFEST-000030 and /dev/null differ diff --git a/packs/system-help/lost/000024.log b/packs/system-help/lost/000024.log deleted file mode 100644 index e69de29..0000000 diff --git a/styles/donjon-et-cie.css b/styles/donjon-et-cie.css index d5e8b6d..20c69bd 100644 --- a/styles/donjon-et-cie.css +++ b/styles/donjon-et-cie.css @@ -556,6 +556,126 @@ .dnc-roll-dialog .window-content { background: linear-gradient(180deg, #f7efe0 0%, #e3d0b1 100%); } +.dnc-mission-pack-mode, +.dnc-mission-pack-note { + font-size: 0.9rem; +} +.dnc-mission-pack-campaign { + gap: 1rem; +} +.dnc-mission-pack-hero { + padding: 1rem; + border: 1px solid rgba(91, 70, 52, 0.35); + border-radius: 10px; + background: linear-gradient(180deg, rgba(255, 255, 255, 0.65) 0%, rgba(241, 229, 208, 0.68) 100%), linear-gradient(135deg, rgba(139, 46, 23, 0.08) 0%, rgba(139, 46, 23, 0) 100%); + box-shadow: 0 8px 18px rgba(0, 0, 0, 0.1); +} +.dnc-mission-pack-kicker { + margin: 0 0 0.25rem; + font-size: 0.72rem; + font-weight: 700; + letter-spacing: 0.14em; + text-transform: uppercase; + color: rgba(139, 46, 23, 0.82); +} +.dnc-mission-pack-hero h2 { + margin: 0; + font-family: "IM Fell English SC", "Palatino Linotype", "Book Antiqua", Palatino, serif; + font-size: 1.4rem; + line-height: 1.1; + color: #8b2e17; +} +.dnc-mission-pack-subtitle { + margin-top: 0.2rem; + font-size: 0.78rem; + font-weight: 700; + letter-spacing: 0.16em; + text-transform: uppercase; + color: rgba(91, 70, 52, 0.78); +} +.dnc-mission-pack-intro { + margin-top: 0.4rem; + color: #6d5a4f; +} +.dnc-mission-pack-meta-grid { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 0.75rem; +} +.dnc-mission-pack-meta-card { + display: grid; + gap: 0.2rem; + padding: 0.75rem; + border: 1px solid rgba(91, 70, 52, 0.3); + border-radius: 10px; + background: rgba(255, 255, 255, 0.42); +} +.dnc-mission-pack-meta-card span { + font-size: 0.72rem; + font-weight: 700; + letter-spacing: 0.08em; + text-transform: uppercase; + color: #6d5a4f; +} +.dnc-mission-pack-meta-card strong { + font-size: 1rem; +} +.dnc-mission-pack-section { + display: grid; + gap: 0.75rem; +} +.dnc-mission-pack-select { + padding: 0.75rem; + border: 1px solid rgba(91, 70, 52, 0.32); + border-radius: 10px; + background: rgba(255, 255, 255, 0.36); +} +.dnc-mission-pack-assignments { + display: grid; + gap: 0.75rem; + grid-template-columns: repeat(2, minmax(0, 1fr)); +} +.dnc-mission-pack-assignment { + display: grid; + gap: 0.4rem; + padding: 0.75rem; + border: 1px solid rgba(91, 70, 52, 0.35); + border-radius: 10px; + background: rgba(255, 255, 255, 0.38); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.55); +} +.dnc-mission-pack-assignment span { + font-size: 0.82rem; + font-weight: 700; + letter-spacing: 0.04em; + text-transform: uppercase; +} +.dnc-mission-pack-note { + color: #6d5a4f; +} +.dnc-mission-pack-note-foot { + padding: 0.75rem; + border-top: 1px solid rgba(91, 70, 52, 0.24); +} +.dnc-mission-pack-dialog .window-header { + background: linear-gradient(180deg, rgba(253, 246, 231, 0.96) 0%, rgba(234, 212, 170, 0.96) 100%), linear-gradient(90deg, rgba(139, 46, 23, 0.12) 0%, rgba(139, 46, 23, 0) 100%); + border-bottom: 1px solid rgba(91, 70, 52, 0.35); +} +.dnc-mission-pack-dialog .window-title { + color: #8b2e17; + font-family: "IM Fell English SC", "Palatino Linotype", "Book Antiqua", Palatino, serif; + letter-spacing: 0.03em; + text-shadow: none; +} +.dnc-mission-pack-dialog .window-header button { + color: #221b18; +} +@media (max-width: 640px) { + .dnc-mission-pack-meta-grid, + .dnc-mission-pack-assignments { + grid-template-columns: 1fr; + } +} .dnc-chat-card { position: relative; border: 2px solid #5b4634; diff --git a/styles/donjon-et-cie.css.map b/styles/donjon-et-cie.css.map index f9c2fe6..3cdd0cf 100644 --- a/styles/donjon-et-cie.css.map +++ b/styles/donjon-et-cie.css.map @@ -1 +1 @@ -{"version":3,"sources":["../variables.less","../base.less","../components.less","../actor-sheet.less","../item-sheet.less","../dialogs.less","../chat.less"],"names":[],"mappings":"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","file":"donjon-et-cie.css","sourcesContent":[]} \ No newline at end of file +{"version":3,"sources":["../variables.less","../base.less","../components.less","../actor-sheet.less","../item-sheet.less","../dialogs.less","../chat.less"],"names":[],"mappings":"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","file":"donjon-et-cie.css","sourcesContent":[]} \ No newline at end of file diff --git a/templates/chat/mission-pack-card.hbs b/templates/chat/mission-pack-card.hbs index 2ef6544..993fd55 100644 --- a/templates/chat/mission-pack-card.hbs +++ b/templates/chat/mission-pack-card.hbs @@ -11,6 +11,9 @@
+ {{localize "DNC.Macro.MissionPack.ActiveMode"}} {{generationModeLabel}} + {{#if isCampaign}}{{localize "DNC.Macro.MissionPack.CampaignController"}} {{controllerName}}{{/if}} + {{#if isCampaign}}{{localize "DNC.Macro.MissionPack.CampaignRelation"}} {{stewardRelationLabel}}{{/if}} {{localize "DNC.Macro.MissionPack.ItemsAdded"}} {{createdCount}} {{#if missingCount}}{{localize "DNC.Macro.MissionPack.ItemsMissing"}} {{missingCount}}{{/if}}
@@ -27,8 +30,33 @@ {{#each draws}}
  • {{this.label}} : {{this.display}} + {{#if this.dieLabel}} +
    {{localize "DNC.Macro.MissionPack.RollDetail" die=this.dieLabel mode=this.modeLabel values=this.rollValuesLabel kept=this.kept rank=this.rankBonus total=this.total}} + {{#if this.clamped}}
    {{localize "DNC.Macro.MissionPack.TotalClamped" total=this.total clamped=this.resolvedTotal}}{{/if}} + {{/if}} {{#if this.missingSummary}}
    {{localize "DNC.Macro.MissionPack.Missing"}} : {{this.missingSummary}}{{/if}}
  • {{/each}} + +
    + {{localize "DNC.Macro.MissionPack.UniqueReference"}} {{uniqueEntry.referenceRoll}} + {{localize "DNC.Macro.MissionPack.UniqueActorRoll"}} {{uniqueEntry.actorRoll}} + + {{#if uniqueEntry.matched}} + {{localize "DNC.Macro.MissionPack.UniqueMatch"}} + {{else}} + {{localize "DNC.Macro.MissionPack.UniqueMiss"}} + {{/if}} + +
    + + {{#if uniqueEntry.matched}} +

    + {{localize "DNC.Macro.MissionPack.UniqueGranted"}} {{uniqueEntry.itemName}} + {{#if uniqueEntry.uniqueRoll}}({{localize "DNC.Macro.MissionPack.UniqueTableRoll"}} {{uniqueEntry.uniqueRoll}}){{/if}} +

    + {{else}} +

    {{localize "DNC.Macro.MissionPack.UniqueRuleReminder"}}

    + {{/if}} diff --git a/templates/dialogs/mission-pack-campaign-dialog.hbs b/templates/dialogs/mission-pack-campaign-dialog.hbs new file mode 100644 index 0000000..c600e25 --- /dev/null +++ b/templates/dialogs/mission-pack-campaign-dialog.hbs @@ -0,0 +1,54 @@ +
    +
    +

    {{localize "DNC.Chat.Kicker.Logistics"}}

    +

    {{localize "DNC.Macro.MissionPack.CampaignDialogTitle"}}

    +

    {{localize "DNC.Macro.MissionPack.CampaignDialogSubtitle"}}

    +

    {{localize "DNC.Macro.MissionPack.CampaignDialogIntro" actor=actorName}}

    +
    + +
    +
    + {{localize "DNC.Macro.MissionPack.DialogActor"}} + {{actorName}} +
    +
    + {{localize "DNC.Macro.MissionPack.CampaignDialogPlayer"}} + {{playerName}} +
    + {{#if requesterName}} +
    + {{localize "DNC.Macro.MissionPack.CampaignDialogRequester"}} + {{requesterName}} +
    + {{/if}} +
    + {{localize "DNC.Macro.MissionPack.CampaignDialogRank"}} + +{{rank}} +
    +
    + +
    + +
    + +
    +

    {{localize "DNC.Macro.MissionPack.CampaignDialogAssignHelp"}}

    +
    + {{#each assignments}} + + {{/each}} +
    +
    + +

    {{localize "DNC.Macro.MissionPack.CampaignDialogHelp"}}

    +
    diff --git a/templates/dialogs/mission-pack-dialog.hbs b/templates/dialogs/mission-pack-dialog.hbs index d4e7d21..bea2f3a 100644 --- a/templates/dialogs/mission-pack-dialog.hbs +++ b/templates/dialogs/mission-pack-dialog.hbs @@ -1,9 +1,14 @@

    {{localize "DNC.Macro.MissionPack.DialogIntro"}}

    +

    {{localize "DNC.Macro.MissionPack.ActiveMode"}} {{modeLabel}}

    +

    {{modeDescription}}

    + {{#if isCampaign}} +

    {{localize "DNC.Macro.MissionPack.CampaignDialogLead"}}

    + {{/if}}