// Import Modules import { AcksItemSheet } from "./module/item/item-sheet.js"; import { AcksActorSheetCharacter } from "./module/actor/character-sheet.js"; import { AcksActorSheetMonster } from "./module/actor/monster-sheet.js"; import { preloadHandlebarsTemplates } from "./module/preloadTemplates.js"; import { AcksActor } from "./module/actor/entity.js"; import { AcksItem } from "./module/item/entity.js"; import { ACKS } from "./module/config.js"; import { registerSettings } from "./module/settings.js"; import { registerHelpers } from "./module/helpers.js"; import * as chat from "./module/chat.js"; import * as treasure from "./module/treasure.js"; import * as macros from "./module/macros.js"; import * as party from "./module/party.js"; import { AcksCombat } from "./module/combat.js"; /* -------------------------------------------- */ /* Foundry VTT Initialization */ /* -------------------------------------------- */ Hooks.once("init", async function () { /** * Set an initiative formula for the system * @type {String} */ CONFIG.Combat.initiative = { formula: "1d6 + @initiative.value", decimals: 0, }; CONFIG.ACKS = ACKS; game.acks = { rollItemMacro: macros.rollItemMacro, }; // Custom Handlebars helpers registerHelpers(); // Register custom system settings registerSettings(); CONFIG.Actor.entityClass = AcksActor; CONFIG.Item.entityClass = AcksItem; // Register sheet application classes Actors.unregisterSheet("core", ActorSheet); Actors.registerSheet("acks", AcksActorSheetCharacter, { types: ["character"], makeDefault: true, }); Actors.registerSheet("acks", AcksActorSheetMonster, { types: ["monster"], makeDefault: true, }); Items.unregisterSheet("core", ItemSheet); Items.registerSheet("acks", AcksItemSheet, { makeDefault: true }); await preloadHandlebarsTemplates(); }); /** * This function runs after game data has been requested and loaded from the servers, so entities exist */ Hooks.once("setup", function () { // Localize CONFIG objects once up-front const toLocalize = ["saves_short", "saves_long", "scores", "armor", "colors", "tags"]; for (let o of toLocalize) { CONFIG.ACKS[o] = Object.entries(CONFIG.ACKS[o]).reduce((obj, e) => { obj[e[0]] = game.i18n.localize(e[1]); return obj; }, {}); } for (let l of CONFIG.ACKS.languages) { CONFIG.ACKS.languages[l] = game.i18n.localize(CONFIG.ACKS.languages[l]); } }); Hooks.once("ready", async () => { Hooks.on("hotbarDrop", (bar, data, slot) => macros.createAcksMacro(data, slot) ); }); // License and KOFI infos Hooks.on("renderSidebarTab", async (object, html) => { if (object instanceof ActorDirectory) { party.addControl(object, html); } if (object instanceof Settings) { let gamesystem = html.find(".game-system"); // SRD Link let acks = gamesystem.find('h4').last(); acks.append(` SRD`); // License text const template = "systems/acks/templates/chat/license.html"; const rendered = await renderTemplate(template); gamesystem.append(rendered); // User guide let docs = html.find("button[data-action='docs']"); const styling = "border:none;margin-right:2px;vertical-align:middle;margin-bottom:5px"; $(``).insertAfter(docs); html.find('button[data-action="userguide"]').click(ev => { new FrameViewer('https://mesfoliesludiques.gitlab.io/foundryvtt-ose', {resizable: true}).render(true); }); } }); Hooks.on("preCreateCombatant", (combat, data, options, id) => { let init = game.settings.get("acks", "initiative"); if (init == "group") { AcksCombat.addCombatant(combat, data, options, id); } }); Hooks.on("preUpdateCombatant", (combat, combatant, data) => { AcksCombat.updateCombatant(combat, combatant, data); }); Hooks.on("renderCombatTracker", (object, html, data) => { AcksCombat.format(object, html, data); }); Hooks.on("preUpdateCombat", async (combat, data, diff, id) => { let init = game.settings.get("acks", "initiative"); let reroll = game.settings.get("acks", "rerollInitiative"); if (!data.round) { return; } if (data.round !== 1) { if (reroll === "reset") { OseCombat.resetInitiative(combat, data, diff, id); return; } else if (reroll === "keep") { return; } } if (init === "group") { AcksCombat.rollInitiative(combat, data, diff, id); } else if (init === "individual") { AcksCombat.individualInitiative(combat, data, diff, id); } }); Hooks.on("renderChatLog", (app, html, data) => AcksItem.chatListeners(html)); Hooks.on("getChatLogEntryContext", chat.addChatMessageContextOptions); Hooks.on("renderChatMessage", chat.addChatMessageButtons); Hooks.on("renderRollTableConfig", treasure.augmentTable); Hooks.on("updateActor", party.update);