125 lines
4.9 KiB
JavaScript
125 lines
4.9 KiB
JavaScript
/**
|
||
* 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);
|
||
});
|