Files
fvtt-donjon-et-cie/modules/donjon-et-cie-main.mjs

104 lines
3.9 KiB
JavaScript

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 () => {
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);
});