/** * Donjon & Cie - Systeme FoundryVTT * * Donjon & Cie est un jeu de role edite par John Doe. * Ce systeme FoundryVTT est une implementation independante et n'est pas * affilie a John Doe. * * @author LeRatierBretonnien * @copyright 2025–2026 LeRatierBretonnien * @license CC BY-NC-SA 4.0 – https://creativecommons.org/licenses/by-nc-sa/4.0/ */ import { DONJON_ET_CIE } from "./donjon-et-cie-config.mjs"; import { DonjonEtCieUtility } from "./donjon-et-cie-utility.mjs"; import { DonjonEtCieActor } from "./donjon-et-cie-actor.mjs"; import { DonjonEtCieItem } from "./donjon-et-cie-item.mjs"; import * as models from "./models/index.mjs"; import * as sheets from "./applications/sheets/_module.mjs"; import { DonjonEtCieRollDialog } from "./applications/donjon-et-cie-roll-dialog.mjs"; import { DonjonEtCieRolls } from "./donjon-et-cie-rolls.mjs"; function onChatActionClick(event) { const button = event.target.closest("[data-action='rollChatDamage'], [data-action='rollSpellChaos'], [data-action='applyDamage']"); if (!(button instanceof HTMLElement)) return; event.preventDefault(); void (async () => { if (button.dataset.action === "rollSpellChaos") { const actorUuid = button.dataset.actorUuid; const itemUuid = button.dataset.itemUuid; if (!actorUuid || !itemUuid) return; const [actor, item] = await Promise.all([fromUuid(actorUuid), fromUuid(itemUuid)]); return DonjonEtCieRolls.rollSpellChaos(actor, item); } if (button.dataset.action === "applyDamage") { const card = button.closest(".dnc-chat-card-damage"); const select = card?.querySelector("[data-role='damage-target']"); const targetUuid = select instanceof HTMLSelectElement ? select.value : ""; if (!targetUuid) { ui.notifications.warn(game.i18n.localize("DNC.Chat.SelectTarget")); return null; } const target = await fromUuid(targetUuid); if (!target) { ui.notifications.warn(game.i18n.localize("DNC.Chat.TargetUnavailable")); return null; } return DonjonEtCieRolls.applyDamage(target, { damage: Number(button.dataset.damage ?? 0), useArmor: button.dataset.useArmor === "true", sourceLabel: button.dataset.sourceLabel ?? "" }); } const itemUuid = button.dataset.itemUuid; if (!itemUuid) return; const item = await fromUuid(itemUuid); return item?.rollDamage?.(); })(); } Hooks.once("init", async () => { const startupBanner = `▗▄▄▄ ▗▄▖ ▗▖ ▗▖ ▗▖ ▗▄▖ ▗▖ ▗▖ ▗▄▄▄▖▗▄▄▄▖ ▗▄▄▖▗▄▄▄▖▗▞▀▚▖ ▐▌ █ ▐▌ ▐▌▐▛▚▖▐▌ ▐▌▐▌ ▐▌▐▛▚▖▐▌ ▐▌ █ ▐▌ █ ▐▛▀▀▘ ▐▌ █ ▐▌ ▐▌▐▌ ▝▜▌ ▐▌▐▌ ▐▌▐▌ ▝▜▌ ▐▛▀▀▘ █ ▐▌ █ ▝▚▄▄▖ ▐▙▄▄▀ ▝▚▄▞▘▐▌ ▐▌▗▄▄▞▘▝▚▄▞▘▐▌ ▐▌ ▐▙▄▄▖ █ ▝▚▄▄▖▗▄█▄▖ `; console.log(`%c${startupBanner}`, "font-family: monospace; white-space: pre; line-height: 1.1;"); console.log("Initialisation du systeme Donjon & Cie"); await DonjonEtCieUtility.preloadHandlebarsTemplates(); CONFIG.Combat.initiative = { formula: "1d20 + @system.caracteristiques.dexterite.value + @system.combat.initiativeBonus", decimals: 0 }; CONFIG.Actor.documentClass = DonjonEtCieActor; CONFIG.Actor.dataModels = { employe: models.EmployeDataModel, pnj: models.PnjDataModel }; CONFIG.Item.documentClass = DonjonEtCieItem; CONFIG.Item.dataModels = { trait: models.TraitDataModel, langue: models.LangueDataModel, capacite: models.CapaciteDataModel, sortilege: models.SortilegeDataModel, arme: models.ArmeDataModel, armure: models.ArmureDataModel, equipement: models.EquipementDataModel, consommable: models.ConsommableDataModel }; game.system.donjonEtCie = { config: DONJON_ET_CIE, models, sheets, rolls: DonjonEtCieRolls, dialogs: DonjonEtCieRollDialog, utility: DonjonEtCieUtility }; foundry.documents.collections.Actors.unregisterSheet("core", foundry.appv1.sheets.ActorSheet); foundry.documents.collections.Actors.registerSheet("fvtt-donjon-et-cie", sheets.DonjonEtCieEmployeSheet, { types: ["employe"], makeDefault: true }); foundry.documents.collections.Actors.registerSheet("fvtt-donjon-et-cie", sheets.DonjonEtCiePNJSheet, { types: ["pnj"], makeDefault: true }); foundry.documents.collections.Items.unregisterSheet("core", foundry.appv1.sheets.ItemSheet); for (const type of ["trait", "langue", "capacite", "sortilege", "arme", "armure", "equipement", "consommable"]) { foundry.documents.collections.Items.registerSheet("fvtt-donjon-et-cie", sheets.DonjonEtCieItemSheet, { types: [type], makeDefault: true }); } }); Hooks.once("ready", () => { document.addEventListener("click", onChatActionClick); });