foundryacks/src/acks.js

151 lines
5.0 KiB
JavaScript

// 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(` <sub><a href="https://oldschoolessentials.necroticgnome.com/srd/index.php">SRD<a></sub>`);
// 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";
$(`<button data-action="userguide"><img src='/systems/acks/assets/dragon.png' width='16' height='16' style='${styling}'/>Old School Guide</button>`).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);