import "../styles/style.scss"; import {moduleId} from "./constants"; import {DiceTower} from "./types"; import {Customization} from "./apps/customization"; import {DiceSocket} from "./apps/diceSocket"; import {getSetting, registerSetting, setSetting} from "./apps/utils"; import {Service} from "./apps/service"; import {Overlays} from "./apps/overlays"; let module: DiceTower; Hooks.once("init", async () => { module = (game as Game).modules.get(moduleId) as unknown as DiceTower; module.log = (message) => console.log(`Dice-Tower | `, message) module.log("Initialized") module.customization = new Customization() module.overlays = new Overlays() module.diceSocket = new DiceSocket() module.service = new Service() registerSettings() }); Hooks.on("renderChatLog", async (_: Application, _html: JQuery): Promise => { module.log("Rendering Controls") module.controls = $(await renderTemplate(`modules/${moduleId}/templates/dice-tower-controls.hbs`, {})) await renderDiceTowerControls(new Map([ ...(new Map( ["d4", "d6", "d8", "d10", "d12", "d20", "d100"] .map(dice => [`dice-tower-roll-${dice}`, (controls: JQuery) => { roll(controls.find(`#dice-tower-amount`), dice) }]))), ...(new Map([ ["dice-tower-sheet", (_: JQuery) => { openSheet() }], ["dice-tower-customize", (_: JQuery) => { module.customization.render(true) }], ["dice-tower-urls", (_: JQuery) => { module.overlays.render(true) }], ["dice-tower-remove-dice", (controls: JQuery) => { removeDice(controls.find("#dice-tower-amount")) }], ["dice-tower-add-dice", (controls: JQuery) => { addDice(controls.find("#dice-tower-amount")) }, ]] ))] )); module.log("Render complete") }); Hooks.once("ready", () => { fillActors(); module.service.register() }) Hooks.on("preCreateChatMessage", (message: ChatMessage): void => { if (message.isRoll && getSetting("sendToDiceTower") as Boolean) { let results = [] let command = ""; message.rolls.forEach(roll => { let sides let modifier = 0 let modifierMultiplikator = 1 let rolls: {value: number}[] = [] roll.terms.forEach(term => { if (term instanceof foundry.dice.terms.Die) { let t = term as foundry.dice.terms.Die; sides = t.faces let c = t.number + 'd' + sides; if (command.length > 0) { command = [command, c].join(" ") } else { command = c } t.results.map(it => { return {value: it.result} }).forEach(it => rolls.push(it)) } if (term instanceof foundry.dice.terms.OperatorTerm ) { let t = term as foundry.dice.terms.OperatorTerm if (t.operator === '+') { modifierMultiplikator = 1 } else if (t.operator === '-') { modifierMultiplikator = -1 } } if (term instanceof foundry.dice.terms.NumericTerm) { let t = term as foundry.dice.terms.NumericTerm modifier += t.number * modifierMultiplikator } }); results.push({ sides: sides, modifier: modifier, value: roll.total, rolls: rolls }) module.service.roll({ name: message.alias, command: command, results: results }) }) } }) Hooks.on("updateUser", (_user, _character: {character: string}, _time, _id) => { fillActors(); }) function registerSettings() { game.settings?.registerMenu(moduleId, "overlays", { name: "DICETOWER.overlaysTitle", label: "DICETOWER.overlaysTitle", type: Overlays, icon: "fas fa-link" }) setSetting("default-dice", { theme: 'none', faceColor: '#8d8981', numberColor: '#000000' }, true) registerSetting("sendToDiceTower", false, {scope: "world", config: true}) registerSetting("diceTowerUrl", "https://dice-tower.com", {scope: "world", config: true}) registerSetting("diceTowerRoom", "", {scope: "world", config: true}) } function openSheet() { let actorId = module.controls.find('#dice-tower-actor').val(); if (actorId) { let actor = game.actors?.get(actorId as string); if (actor) { Hotbar.toggleDocumentSheet(actor.uuid); } } } function fillActors() { let actors = module.controls.find("#dice-tower-actor"); actors.empty() if (game.user?.character) { actors.append($(``)); } else { actors.append($(``)); } if (game.user?.isGM) { let optionGroups = new Map game.actors?.forEach(e => { let actor = e as foundry.documents.BaseActor; if (actor.folder) { if (!optionGroups.has(actor.folder.uuid)) { optionGroups.set(actor.folder.uuid, $(``)); } optionGroups.get(actor.folder.uuid)?.append($(``)) } else { actors.append($(``)) } }); optionGroups.forEach(value => actors.append(value)) } } async function roll(diceAmount: JQuery, dice: string) { new Roll(diceAmount.text() + dice).evaluate().then(roll => roll.toMessage({speaker: {actor: module.controls.find('#dice-tower-actor').val() as string}})); } async function renderDiceTowerControls(actions: Map void>) { actions.forEach((value, key) => { module.controls.find(`#${key}`).on("click", () => value(module.controls))} ) module.controls.insertAfter("#chat-controls") } function addDice(diceAmount: JQuery) { let amount = +diceAmount.text() diceAmount.text(`${amount + 1}`) } function removeDice(diceAmount: JQuery) { let amount = +diceAmount.text() if (amount > 1) { diceAmount.text(`${amount - 1}`) } }