{"version":3,"file":"src-zQiQ00TS.js","names":["#request","#elements","#layer","#addLayer","e","t","e","e","t","n","r","t","r","i","n","e","t","e","n","t","i","r","n","e","r","t","n","t","r","e","t","e","n","e","#collectVisionerAVSSource","#collectOriginSources","#collectTargetSources","#collectMergedSources","#collectExtraConditions","#collectOriginSources","#collectAdditionalSources","#collectTargetSources","#sourcesToHighestCheck","#layer","#filter","#callbacks"],"sources":["../src/constants.ts","../src/shared/chat-button-handler.ts","../src/modules/base.ts","../src/utils.ts","../src/modules/delay/utils.ts","../src/modules/delay/query.ts","../src/modules/delay/delay.ts","../src/modules/delay/pf2e-hud.ts","../src/modules/delay/token-hud.ts","../src/modules/delay/tracker.ts","../src/modules/delay/index.ts","../src/modules/emanation/emanation-dialog.ts","../src/modules/emanation/emanation.ts","../src/modules/flat/light/utils.ts","../src/modules/flat/light/layer.ts","../src/modules/flat/constants.ts","../node_modules/.pnpm/remeda@2.34.1/node_modules/remeda/dist/lazyDataLastImpl-DtF3cihj.js","../node_modules/.pnpm/remeda@2.34.1/node_modules/remeda/dist/purry.js","../node_modules/.pnpm/remeda@2.34.1/node_modules/remeda/dist/utilityEvaluators-Cb8x6-JZ.js","../node_modules/.pnpm/remeda@2.34.1/node_modules/remeda/dist/pipe.js","../node_modules/.pnpm/remeda@2.34.1/node_modules/remeda/dist/hasAtLeast.js","../node_modules/.pnpm/remeda@2.34.1/node_modules/remeda/dist/purryOrderRules-BaB5mcHH.js","../node_modules/.pnpm/remeda@2.34.1/node_modules/remeda/dist/filter.js","../node_modules/.pnpm/remeda@2.34.1/node_modules/remeda/dist/firstBy.js","../node_modules/.pnpm/remeda@2.34.1/node_modules/remeda/dist/groupBy.js","../node_modules/.pnpm/remeda@2.34.1/node_modules/remeda/dist/map.js","../src/modules/flat/message-config.ts","../src/modules/flat/light/token.ts","../src/modules/flat/rules/options.ts","../src/modules/flat/rules/treat-as.ts","../src/modules/flat/rules/common.ts","../src/modules/flat/visioner.ts","../src/modules/flat/target.ts","../src/modules/flat/data.ts","../src/modules/flat/i18n.ts","../src/modules/flat/message.ts","../src/modules/flat/rules/fields.ts","../src/modules/flat/rules/add.ts","../src/modules/flat/rules/modify.ts","../src/modules/flat/rules/setup.ts","../src/modules/flat/target-marker.ts","../src/modules/life-link.ts","../src/modules/misc/alt-roll-breakdown.ts","../src/modules/misc/toggle-vision.ts","../src/settings.ts","../src/index.ts"],"sourcesContent":["export const MODULE_ID = \"pf2e-flatcheck-helper\"\n\nexport const QUERIES = {\n\tdelay: {\n\t\tgmMoveAfter: `${MODULE_ID}.gmMoveAfter`,\n\t},\n}\n","import type { ChatMessagePF2e } from \"@7h3laughingman/pf2e-types\"\n\nexport type ChatActionCallback = (\n\tmsg: ChatMessagePF2e,\n\thtml: HTMLElement,\n\ttarget: HTMLElement,\n) => any\nconst callbacks = new Map()\n\nconst clickHandler = (e: PointerEvent) => {\n\tconst target = e.target\n\tconst action = target instanceof HTMLElement && target.dataset.action\n\tif (!action) return\n\tconst callback = callbacks.get(action)\n\tif (!callback) return\n\n\tconst msgElement = target.closest(\"li.chat-message[data-message-id]\")\n\tconst msgDocument =\n\t\tmsgElement?.dataset.messageId && game.messages.get(msgElement.dataset.messageId)\n\tif (!msgDocument) return\n\n\te.preventDefault()\n\te.stopImmediatePropagation()\n\tcallback(msgDocument, msgElement, target)\n}\n\nexport const ChatActionHandler = {\n\tinit() {\n\t\tfor (const selector of [\"#ui-right #chat-notifications\", \"#sidebar-content #chat\"]) {\n\t\t\tdocument.body.querySelector(selector)?.addEventListener(\"click\", clickHandler)\n\t\t}\n\t},\n\tregister(id: string, callback: ChatActionCallback) {\n\t\tcallbacks.set(id, callback)\n\t},\n\tunregister(id: string) {\n\t\tcallbacks.delete(id)\n\t},\n}\n","import type { HookCallback } from \"@7h3laughingman/foundry-types/client/helpers/hooks.d.mts\"\nimport { MODULE_ID } from \"src/constants\"\nimport MODULE from \"src/index\"\nimport { type ChatActionCallback, ChatActionHandler } from \"src/shared/chat-button-handler\"\n\nexport abstract class BaseModule {\n\tenabled = false\n\thooks: Record = {}\n\twrappers: number[] = []\n\tsockets: string[] = []\n\tsettingListeners: string[] = []\n\tqueries: string[] = []\n\tchatActions: string[] = []\n\n\tabstract readonly settingsKey: string | null\n\n\t/** Assumes settingsKey is a boolean setting. Needs to be overriden if not */\n\thasSettingEnabled(): boolean {\n\t\tif (this.settingsKey == null) return true\n\t\treturn game.settings.get(MODULE_ID, this.settingsKey) as boolean\n\t}\n\n\tonReady() {}\n\n\tenable() {\n\t\tthis.enabled = true\n\t}\n\tdisable() {\n\t\tthis.enabled = false\n\n\t\tfor (const [hook, id] of Object.entries(this.hooks)) {\n\t\t\tHooks.off(hook, id)\n\t\t}\n\t\tthis.hooks = {}\n\n\t\tfor (const id of this.wrappers) {\n\t\t\tlibWrapper.unregister(MODULE_ID, id)\n\t\t}\n\t\tthis.wrappers = []\n\n\t\tfor (const type of this.sockets) {\n\t\t\tMODULE.socketHandler.unregister(type)\n\t\t}\n\t\tthis.sockets = []\n\n\t\tfor (const name of this.queries) {\n\t\t\tdelete CONFIG.queries[name]\n\t\t}\n\t\tthis.queries = []\n\n\t\tfor (const key of this.settingListeners) {\n\t\t\tMODULE.settings.removeListener(key)\n\t\t}\n\t\tthis.settingListeners = []\n\n\t\tfor (const key of this.chatActions) {\n\t\t\tChatActionHandler.unregister(key)\n\t\t}\n\t\tthis.chatActions = []\n\t}\n\n\tregisterHook(hook: string, callback: HookCallback) {\n\t\tthis.hooks[hook] = Hooks.on(hook, callback)\n\t}\n\n\tregisterWrapper(\n\t\ttarget: string,\n\t\tcallback: CallableFunction,\n\t\tmode: \"MIXED\" | \"WRAPPER\" | \"OVERRIDE\",\n\t) {\n\t\tthis.wrappers.push(libWrapper.register(MODULE_ID, target, callback, mode as any))\n\t}\n\n\tregisterSocket(type: string, callback: (data: any) => void) {\n\t\tthis.sockets.push(type)\n\t\tMODULE.socketHandler.register(type, callback)\n\t}\n\n\tregisterQuery(name: string, callback: (data: any) => Promise) {\n\t\tCONFIG.queries[name] = callback\n\t}\n\n\tregisterSettingListener(key: string, callback: (value: unknown) => void) {\n\t\tMODULE.settings.addListener(key, callback)\n\t}\n\n\tregisterChatAction(key: string, callback: ChatActionCallback) {\n\t\tthis.chatActions.push(key)\n\t\tChatActionHandler.register(key, callback)\n\t}\n}\n","import type { ActorPF2e, CombatantPF2e } from \"@7h3laughingman/pf2e-types\"\n\nexport function isJQuery(obj: unknown): obj is JQuery {\n\treturn obj instanceof jQuery\n}\n\nexport function actorEffectBySlug(actor: ActorPF2e, slug: string) {\n\treturn actor.itemTypes.effect.find((e) => e.slug === slug)\n}\n\nexport function actorHasEffect(actor: ActorPF2e, slug: string) {\n\treturn actor.itemTypes.effect.some((e) => e.slug === slug)\n}\n\nexport function combatantIsNext(c: CombatantPF2e) {\n\t// @ts-expect-error missing type def\n\treturn c.parent?.nextCombatant.tokenId === c.tokenId\n}\n\nexport function sleep(ms: number) {\n\treturn new Promise((resolve) => {\n\t\tsetTimeout(resolve, ms)\n\t})\n}\n\nexport function parseHTML(string: string) {\n\tconst template = document.createElement(\"template\")\n\ttemplate.innerHTML = string\n\treturn template.content\n}\n\nexport function translate(key: string, data?: Record) {\n\tif (!key.startsWith(\"pf2e-fc.\")) key = `pf2e-fc.${key}`\n\treturn data ? game.i18n.localize(key, data) : game.i18n.localize(key)\n}\n\ntype MissingOpts = {\n\tprefix?: string\n\tdata?: Record\n\tcase?: \"title\"\n}\nexport function translateHandleMissing(key: string, opts: MissingOpts) {\n\tconst fullKey = opts.prefix ? `${opts.prefix}${key}` : key\n\tconst translation = opts.data\n\t\t? game.i18n.localize(fullKey, opts.data)\n\t\t: game.i18n.localize(fullKey)\n\tif (fullKey !== translation) return translation\n\n\tif (opts.case === \"title\")\n\t\treturn key.replace(/\\w\\S*/g, (t) => {\n\t\t\treturn t.charAt(0).toUpperCase() + t.substring(1).toLowerCase()\n\t\t})\n\treturn key\n}\n\nexport const SYSTEM = {\n\tget id() {\n\t\treturn game.system.id as \"pf2e\"\n\t},\n\tfilePath(path: string) {\n\t\treturn `systems/${this.id}/${path}`\n\t},\n}\n","import type { ActorPF2e, EncounterPF2e, RolledCombatant } from \"@7h3laughingman/pf2e-types\"\nimport { SYSTEM } from \"src/utils\"\n\nexport function isDelaying(actor: ActorPF2e) {\n\treturn actor.items.some((e) => e.slug === \"x-delay\")\n}\n\n// https://github.com/foundryvtt/pf2e/blob/8ea3864e0394e944e6ccf5b65a8e31489c68505e/src/module/apps/sidebar/encounter-tracker.ts#L318\nexport function setInitiativeFromDrop(\n\tcombat: EncounterPF2e,\n\tnewOrder: RolledCombatant>[],\n\tdropped: RolledCombatant>,\n) {\n\tconst aboveDropped = newOrder.find((c) => newOrder.indexOf(c) === newOrder.indexOf(dropped) - 1)\n\tconst belowDropped = newOrder.find((c) => newOrder.indexOf(c) === newOrder.indexOf(dropped) + 1)\n\n\tconst hasAboveAndBelow = !!aboveDropped && !!belowDropped\n\tconst hasAboveAndNoBelow = !!aboveDropped && !belowDropped\n\tconst hasBelowAndNoAbove = !aboveDropped && !!belowDropped\n\tconst aboveIsHigherThanBelow =\n\t\thasAboveAndBelow && belowDropped.initiative < aboveDropped.initiative\n\tconst belowIsHigherThanAbove =\n\t\thasAboveAndBelow && belowDropped.initiative < aboveDropped.initiative\n\tconst wasDraggedUp =\n\t\t!!belowDropped && combat.getCombatantWithHigherInit(dropped, belowDropped) === belowDropped\n\tconst wasDraggedDown = !!aboveDropped && !wasDraggedUp\n\n\t// Set a new initiative intuitively, according to allegedly commonplace intuitions\n\tconst newInitiative =\n\t\thasBelowAndNoAbove || (aboveIsHigherThanBelow && wasDraggedUp)\n\t\t\t? belowDropped.initiative + 1\n\t\t\t: hasAboveAndNoBelow || (belowIsHigherThanAbove && wasDraggedDown)\n\t\t\t\t? aboveDropped.initiative - 1\n\t\t\t\t: hasAboveAndBelow\n\t\t\t\t\t? belowDropped.initiative\n\t\t\t\t\t: dropped.initiative\n\n\tconst updates: Record = {\n\t\t[dropped.id]: { initiative: newInitiative },\n\t}\n\n\tconst originalInit = dropped.initiative\n\tdropped.initiative = newInitiative\n\tconst withSameInitiative = newOrder.filter((c) => c.initiative === newInitiative)\n\tdropped.initiative = originalInit\n\n\tif (withSameInitiative.length > 1) {\n\t\tfor (let priority = 0; priority < withSameInitiative.length; priority++) {\n\t\t\tconst c = withSameInitiative[priority]\n\t\t\tupdates[c.id] ??= {}\n\t\t\tupdates[c.id].overridePriority = priority\n\t\t}\n\t}\n\n\treturn Object.entries(updates).map(([id, data]) => {\n\t\tconst updates: EmbeddedDocumentUpdateData = { _id: id }\n\t\tif (data.initiative !== undefined) updates.initiative = data.initiative\n\t\tif (data.overridePriority !== undefined)\n\t\t\tupdates[`flags.${SYSTEM.id}.overridePriority.${newInitiative}`] = data.overridePriority\n\t\treturn updates\n\t})\n}\n\nexport function nextCombatant(combat: EncounterPF2e) {\n\tconst turn = combat.turn ?? -1\n\n\tlet nextTurn: number | null = null\n\tif (combat.settings.skipDefeated) {\n\t\tfor (let i = turn + 1; i < combat.turns.length; i++) {\n\t\t\tif (!combat.turns[i].isDefeated) {\n\t\t\t\tnextTurn = i\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t} else nextTurn = turn + 1\n\n\tif (nextTurn != null && nextTurn >= combat.turns.length) nextTurn = 0\n\n\treturn nextTurn != null ? combat.turns[nextTurn] : null\n}\n\nexport function debugCombat(msg: string, data?: { afterId: string }) {\n\tconsole.group(msg)\n\tconst combat = game.combat\n\tif (combat) {\n\t\tconsole.log(`Round ${combat.round} Turn ${combat.turn}`)\n\t\tfor (const c of combat.turns) {\n\t\t\tlet label = \"\"\n\t\t\tif (c === combat.combatant) {\n\t\t\t\tlabel += \"*\"\n\t\t\t}\n\t\t\tif (data?.afterId === c.id) {\n\t\t\t\tlabel += \"↓\"\n\t\t\t}\n\n\t\t\tconst init = c.initiative\n\t\t\tconst tieBreak = (init && c.flags[SYSTEM.id].overridePriority[init]) ?? \"-\"\n\t\t\tconst lastTurn = c.flags[SYSTEM.id].roundOfLastTurn\n\t\t\tconst lastTurnEnd = c.flags[SYSTEM.id].roundOfLastTurnEnd\n\t\t\tconsole.log(\n\t\t\t\t`${label}${c.name} ${init} (${tieBreak}) lastTurn=${lastTurn} lastTurnEnd=${lastTurnEnd}`,\n\t\t\t)\n\t\t}\n\t}\n\n\tconsole.groupEnd()\n}\n","import type { EncounterPF2e, RolledCombatant } from \"@7h3laughingman/pf2e-types\"\nimport { QUERIES } from \"src/constants\"\nimport { SYSTEM, translate } from \"src/utils\"\nimport { nextCombatant, setInitiativeFromDrop } from \"./utils\"\n\ninterface GmMoveQueryData {\n\tcombatantUuid: string\n\tafterId: string\n\tadvanceTurn: boolean\n}\n\nexport async function sendGmMoveQuery(data: GmMoveQueryData) {\n\ttry {\n\t\tif (game.user.isGM) {\n\t\t\tawait handleGmMoveQuery(data)\n\t\t} else {\n\t\t\tif (!game.users.activeGM)\n\t\t\t\treturn ui.notifications.error(translate(\"delay.errors.no-active-gm\"))\n\t\t\tawait game.users.activeGM?.query(QUERIES.delay.gmMoveAfter, data)\n\t\t}\n\t} catch (e) {\n\t\tconst note = game.user.isGM ? \"\" : \" (gm and player)\"\n\t\tui.notifications.error(\n\t\t\t`Encounted error while updating initiative. Check console${note} for details.`,\n\t\t)\n\t\tconsole.error(e)\n\t}\n}\n\nexport async function handleGmMoveQuery(data: GmMoveQueryData) {\n\tconst combatant = fromUuidSync(data.combatantUuid) as RolledCombatant\n\tlet combat = combatant?.parent\n\tconst after = combat?.combatants.get(data.afterId)\n\n\tif (!combat || typeof combatant?.initiative !== \"number\" || typeof after?.initiative !== \"number\")\n\t\treturn\n\n\tconst { promise, resolve, reject } = Promise.withResolvers()\n\n\tlet hookId: number | null = null\n\tlet timeoutId: any = null\n\n\tconst cleanup = () => {\n\t\tif (hookId !== null) {\n\t\t\tHooks.off(\"updateCombatant\", hookId)\n\t\t\thookId = null\n\t\t}\n\t\tif (timeoutId !== null) {\n\t\t\tclearTimeout(timeoutId)\n\t\t\ttimeoutId = null\n\t\t}\n\t}\n\n\tlet executing = false\n\tconst executeMove = async () => {\n\t\tif (executing) return\n\t\texecuting = true\n\n\t\tcleanup()\n\n\t\ttry {\n\t\t\tif (combat.combatant === combatant) {\n\t\t\t\treturn reject(new Error(\"Combatant to move is the active combatant\"))\n\t\t\t}\n\n\t\t\tconst newOrder = combat.turns.filter(\n\t\t\t\t(c): c is RolledCombatant =>\n\t\t\t\t\ttypeof c.initiative === \"number\" && c !== combatant,\n\t\t\t)\n\t\t\tconst afterIndex = newOrder.findIndex((c) => c.id === data.afterId)\n\t\t\tnewOrder.splice(afterIndex + 1, 0, combatant)\n\n\t\t\tconst updates = setInitiativeFromDrop(combat, newOrder, combatant)\n\n\t\t\t// console.log(\"Updates\", updates)\n\t\t\t// console.log(\"Updating\")\n\t\t\tawait combat.updateEmbeddedDocuments(\"Combatant\", updates)\n\t\t\t// console.log(\"Done\")\n\n\t\t\t// debugCombat(\"After\")\n\t\t\tresolve()\n\t\t} catch (err) {\n\t\t\treject(err)\n\t\t}\n\t}\n\n\t// debugCombat(\"Before\", { afterId: data.afterId })\n\n\tlet waitingForTurnEnd = false\n\tlet waitingForTurnStart = false\n\n\tif (data.advanceTurn) {\n\t\tif (combat.combatant !== combatant) {\n\t\t\tconsole.error(\"Delay: Refusing to advance turn because the current combatant changed\")\n\t\t\treject(new Error(`Refusing to advance turn because the current combatant changed`))\n\t\t\treturn promise\n\t\t}\n\n\t\tif (combat.combatant.flags[SYSTEM.id].roundOfLastTurnEnd !== combat.round)\n\t\t\twaitingForTurnEnd = true\n\t\tif (nextCombatant(combat)?.flags[SYSTEM.id].roundOfLastTurn !== combat.round)\n\t\t\twaitingForTurnStart = true\n\n\t\tif (waitingForTurnEnd || waitingForTurnStart) {\n\t\t\tlet seenTurnEnd = false\n\t\t\tlet seenTurnStart = false\n\n\t\t\ttimeoutId = setTimeout(() => {\n\t\t\t\tif (!executing) {\n\t\t\t\t\tconsole.warn(\"handleGmMoveQuery timed out\")\n\t\t\t\t\tcleanup()\n\t\t\t\t\treject(new Error(\"Timeout\"))\n\t\t\t\t}\n\t\t\t}, 2000)\n\n\t\t\thookId = Hooks.on(\"updateCombatant\", (_: any, update: any) => {\n\t\t\t\ttry {\n\t\t\t\t\tif (typeof update?.flags?.[SYSTEM.id]?.roundOfLastTurnEnd === \"number\") {\n\t\t\t\t\t\t/* console.log(\"got turn end\")\n\t\t\t\t\t\tif (!waitingForTurnEnd) console.warn(\"did not expect turn end!\") */\n\t\t\t\t\t\tseenTurnEnd = true\n\t\t\t\t\t}\n\t\t\t\t\tif (typeof update?.flags?.[SYSTEM.id]?.roundOfLastTurn === \"number\") {\n\t\t\t\t\t\t/* console.log(\"got turn start\")\n\t\t\t\t\t\tif (!waitingForTurnStart) console.warn(\"did not expect turn start!\") */\n\t\t\t\t\t\tseenTurnStart = true\n\t\t\t\t\t}\n\n\t\t\t\t\tif (\n\t\t\t\t\t\t(seenTurnEnd && seenTurnStart) ||\n\t\t\t\t\t\t(!waitingForTurnStart && seenTurnEnd) ||\n\t\t\t\t\t\t(!waitingForTurnEnd && seenTurnStart)\n\t\t\t\t\t) {\n\t\t\t\t\t\t// console.log(\"Executing move\")\n\t\t\t\t\t\texecuteMove()\n\t\t\t\t\t}\n\t\t\t\t} catch (err) {\n\t\t\t\t\tcleanup()\n\t\t\t\t\treject(err)\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\n\t\tcombat = await combat.nextTurn()\n\t}\n\n\tconst isWaiting = waitingForTurnEnd || waitingForTurnStart\n\n\tif (!data.advanceTurn || !isWaiting) {\n\t\t// console.log(\"Executing move immediately!\")\n\t\texecuteMove()\n\t}\n\n\treturn promise\n}\n","import type { ActorPF2e, CombatantPF2e, TokenDocumentPF2e } from \"@7h3laughingman/pf2e-types\"\nimport MODULE from \"src\"\nimport { combatantIsNext, SYSTEM, translate } from \"src/utils\"\nimport { sendGmMoveQuery } from \"./query\"\nimport { isDelaying } from \"./utils\"\n\ninterface RequestOpts {\n\tcombatant: CombatantPF2e\n\tskipMessage?: true\n\ttype?: \"delay\" | \"return\"\n}\n\nexport async function handleRequest(opts: RequestOpts) {\n\tconst combatant = opts.combatant\n\tconst combat = opts.combatant.parent\n\tif (!combat?.started) return ui.notifications.error(translate(\"delay.errors.combat-not-started\"))\n\tif (!combatant.isOwner)\n\t\treturn ui.notifications.error(translate(\"delay.errors.combatant-not-owned\"))\n\n\tlet type = opts?.type\n\tif (!type) {\n\t\tif (combatant?.actor && isDelaying(combatant.actor)) type = \"return\"\n\t\telse if (combatant === combat.combatant) type = \"delay\"\n\t}\n\n\tif (type === \"delay\") tryDelay(opts)\n\telse if (type === \"return\") tryReturn(opts)\n}\n\nfunction tryDelay(opts: RequestOpts) {\n\tif (!MODULE.settings.delayShouldPrompt) {\n\t\tapplyDelay(opts)\n\t\topts.combatant.parent?.nextTurn()\n\t} else {\n\t\timport(\"./apps/index\").then((apps) => new apps.DelayPromptDialog(opts.combatant).render(true))\n\t}\n}\n\nexport function applyDelay({ combatant, skipMessage }: RequestOpts) {\n\tif (!skipMessage && combatant.token) createMessage(combatant.token, \"delay\")\n\tif (combatant.actor) applyDelayEffect(combatant.actor)\n}\n\nasync function tryReturn(opts: RequestOpts) {\n\tif (combatantIsNext(opts.combatant)) return\n\n\tconst currentCombatant = opts.combatant.parent?.combatant\n\tif (currentCombatant && opts.combatant.uuid) {\n\t\tawait sendGmMoveQuery({\n\t\t\tcombatantUuid: opts.combatant.uuid,\n\t\t\tadvanceTurn: false,\n\t\t\tafterId: currentCombatant.id,\n\t\t})\n\t\tif (opts.combatant.token) createMessage(opts.combatant.token, \"return\")\n\t}\n}\n\nexport function createMessage(token: TokenDocumentPF2e, type: \"delay\" | \"return\") {\n\tif (MODULE.settings.delayCreateMessage) {\n\t\tconst title = translate(`delay.actions.${type}`)\n\t\tChatMessage.create({\n\t\t\tspeaker: ChatMessage.getSpeaker({ token }),\n\t\t\tcontent: `
\n
\n\t\t\t\"${title}\"\n\t\t\t

${title} F

\n
\n\t\t\t
`,\n\t\t})\n\t}\n}\n\nasync function applyDelayEffect(actor: ActorPF2e) {\n\treturn actor.createEmbeddedDocuments(\"Item\", [\n\t\t{\n\t\t\ttype: \"effect\",\n\t\t\tname: translate(\"delay.delay\"),\n\t\t\timg: \"icons/svg/clockwork.svg\",\n\t\t\tsystem: {\n\t\t\t\ttokenIcon: { show: true },\n\t\t\t\tduration: {\n\t\t\t\t\tvalue: -1,\n\t\t\t\t\tunit: \"encounter\",\n\t\t\t\t\tsustained: false,\n\t\t\t\t\texpiry: \"turn-start\",\n\t\t\t\t},\n\t\t\t\tslug: \"x-delay\",\n\t\t\t},\n\t\t},\n\t])\n}\n\nexport async function removeDelayEffect(actor: ActorPF2e) {\n\tconst effects = actor.items.filter((e) => e.slug === \"x-delay\")\n\tif (effects.length)\n\t\tawait actor.deleteEmbeddedDocuments(\n\t\t\t\"Item\",\n\t\t\teffects.map((e) => e.id),\n\t\t)\n}\n","import type { EncounterPF2e } from \"@7h3laughingman/pf2e-types\"\nimport MODULE from \"src/index\"\nimport { parseHTML, translate } from \"src/utils\"\nimport { handleRequest } from \"./delay\"\nimport { isDelaying } from \"./utils\"\n\nexport function onRenderPF2eHudTracker(app, tracker: HTMLElement) {\n\tif (!MODULE.settings.modifyPF2eHud) return\n\n\tconst combat = app.viewed as EncounterPF2e\n\tif (!combat?.started) return\n\n\tfor (const el of tracker.querySelectorAll(\"ol.combatants li.combatant\")) {\n\t\tconst id = el.dataset.combatantId\n\t\tif (!id) continue\n\t\tconst c = combat.combatants.get(id)\n\t\tif (!c?.isOwner || c.initiative == null) continue\n\n\t\tlet delayElement: HTMLElement | null = null\n\t\tif (game.user.isGM) delayElement = el.querySelector(\"div.extras a.delay\")\n\t\telse {\n\t\t\tconst container = el.querySelector(\"div.extras span.entry.initiative\")\n\t\t\tif (!container) continue\n\t\t\tdelayElement =\n\t\t\t\tcontainer.querySelector(\"i.fa-solid.fa-hourglass-start\") ??\n\t\t\t\tcontainer.querySelector(\"i.fa-solid.fa-dice-d20\")\n\t\t}\n\n\t\tif (!delayElement) continue\n\n\t\tlet type: \"delay\" | \"return\" | null = null\n\n\t\tif (combat.combatant === c) {\n\t\t\ttype = \"delay\"\n\t\t} else if (c.actor && isDelaying(c.actor)) {\n\t\t\ttype = \"return\"\n\t\t}\n\n\t\tlet button: DocumentFragment | null = null\n\t\tif (type == null) {\n\t\t\tconst icon = document.createElement(\"i\")\n\t\t\ticon.classList.add(\"fa-solid\", \"fa-dice-d20\")\n\t\t\tdelayElement.replaceWith(icon)\n\t\t} else if (type === \"delay\") {\n\t\t\tbutton = parseHTML(`\n\t\t\t\t\n\t \t \n \t \t`)\n\t\t} else if (type === \"return\") {\n\t\t\tif (MODULE.settings.allowReturn) {\n\t\t\t\tbutton = parseHTML(`\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t`)\n\t\t\t} else {\n\t\t\t\tconst icon = parseHTML(\n\t\t\t\t\t``,\n\t\t\t\t)\n\t\t\t\tdelayElement.replaceWith(icon)\n\t\t\t}\n\t\t}\n\t\tif (button) {\n\t\t\tbutton.firstElementChild?.addEventListener(\"click\", () => {\n\t\t\t\thandleRequest({ combatant: c, type: type! })\n\t\t\t})\n\t\t\tdelayElement.replaceWith(button)\n\t\t}\n\t}\n}\n","import type TokenHUD from \"@7h3laughingman/foundry-types/client/applications/hud/token-hud.mjs\"\nimport type { TokenPF2e } from \"@7h3laughingman/pf2e-types\"\nimport MODULE from \"src\"\nimport { combatantIsNext, parseHTML, translate } from \"src/utils\"\nimport { handleRequest } from \"./delay\"\nimport { isDelaying } from \"./utils\"\n\nexport function onRenderTokenHUD(app: TokenHUD, html: HTMLElement) {\n\tif (MODULE.settings.showInTokenHUD) {\n\t\trenderDelayButton(app, html)\n\t}\n\n\tif (MODULE.settings.removeCombatToggle) {\n\t\tremoveCombatToggle(app, html)\n\t}\n}\n\nfunction renderDelayButton(app: TokenHUD, html: HTMLElement) {\n\tconst token = app.object as TokenPF2e\n\tconst combatant = token.combatant\n\tif (\n\t\tcombatant?.parent?.started &&\n\t\tcombatant.initiative != null &&\n\t\tcombatant.actor &&\n\t\tcombatant.isOwner\n\t) {\n\t\tconst column = html.querySelector(\"div.col.right\")\n\t\tif (!column) return\n\n\t\tlet data: { icon: string; title: string; type: \"delay\" | \"return\" } | null = null\n\t\tif (isDelaying(combatant.actor)) {\n\t\t\tif (!combatantIsNext(combatant) && MODULE.settings.allowReturn) {\n\t\t\t\tdata = { icon: \"fa-play\", title: translate(\"delay.return-to-initiative\"), type: \"return\" }\n\t\t\t}\n\t\t} else if (combatant.parent.combatant?.id === combatant.id) {\n\t\t\tdata = { icon: \"fa-hourglass\", title: translate(\"delay.delay\"), type: \"delay\" }\n\t\t}\n\n\t\tif (data) {\n\t\t\tconst buttonElement = parseHTML(`\n\t\t\t\t\t
\n\t\t\t\t\t\t\n\t\t\t\t\t
`)\n\n\t\t\tbuttonElement.firstElementChild?.addEventListener(\"click\", () => {\n\t\t\t\thandleRequest({ combatant, type: data.type })\n\t\t\t})\n\t\t\tcolumn.append(buttonElement)\n\t\t}\n\t}\n}\n\nfunction removeCombatToggle(app: TokenHUD, html: HTMLElement) {\n\tconst token = app.object as TokenPF2e\n\tconst combatant = token?.combatant\n\tif (combatant?.parent.started && combatant.initiative != null) {\n\t\tconst toggleCombatButton = html.querySelector(\n\t\t\t\"button.control-icon[data-action=combat]\",\n\t\t)\n\t\tif (toggleCombatButton) toggleCombatButton.style.display = \"none\"\n\t}\n}\n","import type { CombatantPF2e } from \"@7h3laughingman/pf2e-types\"\nimport MODULE from \"src/index\"\nimport { parseHTML, translate } from \"src/utils\"\nimport { handleRequest } from \"./delay\"\nimport { isDelaying } from \"./utils\"\n\nexport function onRenderCombatTracker(_tracker, html: HTMLElement, _data) {\n\tif (!MODULE.settings.showInCombatTracker) return\n\tconst combat = game.combat\n\tif (!combat?.started) return\n\n\tconst combatantElements = html.querySelectorAll(\"li.combatant\")\n\tfor (const el of combatantElements) {\n\t\tconst id = el.dataset.combatantId\n\t\tif (!id) continue\n\t\tconst combatant = combat.combatants.get(id)\n\t\tif (!combatant?.isOwner || combatant.initiative == null) continue\n\n\t\tif (combat.combatant?.id === combatant.id) drawButton(\"delay\", el, combatant)\n\t\telse if (combatant.actor && isDelaying(combatant.actor)) drawButton(\"return\", el, combatant)\n\t}\n}\n\nfunction drawButton(\n\ttype: \"delay\" | \"return\",\n\tcombatantHtml: HTMLElement,\n\tcombatant: CombatantPF2e,\n) {\n\tlet buttonHTML: DocumentFragment\n\tif (type === \"delay\") {\n\t\tbuttonHTML = parseHTML(`\n\t\t\t
\n \t\n\t\t\t
\n\t\t`)\n\t} else {\n\t\tconst title = MODULE.settings.allowReturn\n\t\t\t? translate(\"delay.return-to-initiative\")\n\t\t\t: translate(\"delay.delaying\")\n\t\tconst cls = MODULE.settings.allowReturn ? \"initiative-return\" : \"initiative-delay-indicator\"\n\t\tbuttonHTML = parseHTML(`\n
\n \n \n
\n `)\n\t}\n\n\tif (MODULE.settings.allowReturn)\n\t\tbuttonHTML.firstElementChild?.addEventListener(\"click\", (e) => {\n\t\t\te.stopPropagation()\n\t\t\thandleRequest({ combatant, type })\n\t\t})\n\n\tconst initiativeDiv = combatantHtml.querySelector(\".token-initiative\")\n\tif (initiativeDiv) initiativeDiv.style.display = \"none\"\n\tcombatantHtml.append(buttonHTML)\n}\n","import type { ChatMessagePF2e, EncounterPF2e } from \"@7h3laughingman/pf2e-types\"\nimport { QUERIES } from \"src/constants\"\nimport { BaseModule } from \"../base\"\nimport { handleRequest, removeDelayEffect } from \"./delay\"\nimport { onRenderPF2eHudTracker } from \"./pf2e-hud\"\nimport { handleGmMoveQuery } from \"./query\"\nimport { onRenderTokenHUD } from \"./token-hud\"\nimport { onRenderCombatTracker } from \"./tracker\"\n\nexport class DelayModule extends BaseModule {\n\tsettingsKey = null\n\n\tenable() {\n\t\tsuper.enable()\n\n\t\tthis.registerHook(\"renderEncounterTracker\", onRenderCombatTracker)\n\t\tthis.registerHook(\"renderTokenHUD\", onRenderTokenHUD)\n\t\tthis.registerHook(\"updateCombat\", onUpdateCombat)\n\t\tthis.registerHook(\"createChatMessage\", onCreateMessage)\n\t\tthis.registerHook(\"renderTrackerPF2eHUD\", onRenderPF2eHudTracker)\n\n\t\tthis.registerQuery(QUERIES.delay.gmMoveAfter, handleGmMoveQuery)\n\t}\n}\n\nfunction onUpdateCombat(combat: EncounterPF2e) {\n\tif (game.user && game.user.id !== game.users?.activeGM?.id) return\n\tif (!combat.combatant?.actor) return\n\tremoveDelayEffect(combat.combatant.actor)\n}\n\nfunction onCreateMessage(msg: ChatMessagePF2e) {\n\tif (msg?.author?.id !== game.user?.id) return\n\tif (!game.combat?.started) return\n\tconst item = msg?.item\n\tif (\n\t\titem?.actor?.isOwner &&\n\t\titem.actor.combatant &&\n\t\titem?.type === \"action\" &&\n\t\titem.slug === \"delay\"\n\t) {\n\t\thandleRequest({ combatant: item.actor.combatant, skipMessage: true })\n\t}\n}\n","import type { EffectPF2e, SpellPF2e, TokenDocumentPF2e } from \"@7h3laughingman/pf2e-types\"\nimport { MODULE_ID } from \"src/constants\"\nimport { translate } from \"src/utils\"\nimport { type EmanationRequestData, extractFlagData } from \"./emanation\"\n\nexport class EmanationRequestDialog extends foundry.appv1.api.Application {\n\t#request: EmanationRequestData\n\n\tcache?: {\n\t\tspell: SpellPF2e\n\t\teffect: EffectPF2e\n\t\ttargets: TokenDocumentPF2e[]\n\t\torigin: TokenDocumentPF2e\n\t\tdurationOverride: boolean\n\t}\n\n\tconstructor(data: EmanationRequestData) {\n\t\tsuper()\n\n\t\tthis.#request = data\n\t}\n\n\toverride async getData() {\n\t\tif (!this.cache) {\n\t\t\tconst [spell, effect, origin] = await Promise.all([\n\t\t\t\tfromUuid(this.#request.spellUuid),\n\t\t\t\tfromUuid(this.#request.effectUuid),\n\t\t\t\tfromUuid(this.#request.originToken),\n\t\t\t])\n\t\t\tif (!spell) throw new Error(\"resolving spell UUID failed\")\n\t\t\tif (!effect) throw new Error(\"resolving effect UUID failed\")\n\t\t\tif (!origin) throw new Error(\"resolving origin UUID failed\")\n\t\t\tif (!origin.actor) throw new Error(\"origin token has no actor\")\n\t\t\tconst options = extractFlagData(spell)\n\n\t\t\tconst allyAlliance = origin.actor.alliance\n\n\t\t\tconst targets = canvas.tokens.placeables.filter((t) => {\n\t\t\t\treturn (\n\t\t\t\t\t((options.emanationAllies && t.document.actor?.alliance === allyAlliance) ||\n\t\t\t\t\t\t(options.emanationEnemies && t.document.actor?.alliance !== allyAlliance)) &&\n\t\t\t\t\torigin.object &&\n\t\t\t\t\tt.distanceTo(origin.object) <= spell.system.area!.value &&\n\t\t\t\t\t!CONFIG.Canvas.polygonBackends.sight.testCollision(origin.object.center, t.center, {\n\t\t\t\t\t\tmode: \"any\",\n\t\t\t\t\t\ttype: \"sight\",\n\t\t\t\t\t})\n\t\t\t\t)\n\t\t\t})\n\n\t\t\tif (options.emanationExcludeSelf) {\n\t\t\t\tconst index = targets.findIndex((t) => t.actor?.id === origin.actor?.id)\n\t\t\t\tif (index !== -1) targets.splice(index, 1)\n\t\t\t}\n\n\t\t\tthis.cache = {\n\t\t\t\tspell,\n\t\t\t\teffect,\n\t\t\t\ttargets: targets.map((t) => t.document),\n\t\t\t\torigin,\n\t\t\t\tdurationOverride: options.emanationPromptDuration,\n\t\t\t}\n\t\t}\n\n\t\treturn { ...this.cache }\n\t}\n\n\toverride activateListeners(html: JQuery): void {\n\t\tsuper.activateListeners(html)\n\n\t\thtml.on(\"submit\", (e) => this.submit(e))\n\n\t\thtml.find(\"a.content-link\").on(\"click\", () => {\n\t\t\tthis.cache!.effect.sheet.render(true)\n\t\t})\n\n\t\thtml.find('button[data-action=\"cancel\"]').on(\"click\", () => this.close())\n\t}\n\n\tasync submit(e: JQuery.SubmitEvent) {\n\t\te.preventDefault()\n\n\t\tconst durationOverride = this.element.find('input[type=\"number\"]').val() as number | undefined\n\t\tconst excludedIds = new Set()\n\t\tthis.element.find('input[type=\"checkbox\"]').each((_i, el) => {\n\t\t\tif (!el.checked) excludedIds.add(el.dataset.id!)\n\t\t})\n\n\t\tconst data = {\n\t\t\t\"system.context.origin\": {\n\t\t\t\ttoken: this.cache!.origin.uuid,\n\t\t\t\tactor: this.cache!.origin.actor?.uuid,\n\t\t\t\titem: this.cache!.effect.uuid,\n\t\t\t},\n\t\t}\n\t\tif (durationOverride) data[\"system.duration.value\"] = durationOverride\n\n\t\tconst effectSource = foundry.utils.mergeObject(this.cache!.effect.toObject(), data)\n\t\tfor (const target of this.cache!.targets) {\n\t\t\tif (excludedIds.has(target.id)) continue\n\n\t\t\ttarget.actor?.createEmbeddedDocuments(\"Item\", [effectSource])\n\t\t}\n\t\tthis.close()\n\t}\n\n\tstatic override get defaultOptions(): foundry.appv1.api.ApplicationV1Options {\n\t\treturn {\n\t\t\t...super.defaultOptions,\n\t\t\ttitle: translate(\"emanation.dialog-effect-title\"),\n\t\t\ttemplate: `modules/${MODULE_ID}/templates/emanation-request.hbs`,\n\t\t\twidth: \"auto\",\n\t\t\theight: \"auto\",\n\t\t\tclasses: [\"fc-emanation\"],\n\t\t}\n\t}\n}\n","import type {\n\tChatMessagePF2e,\n\tItemPF2e,\n\tSpellPF2e,\n\tSpellSheetPF2e,\n} from \"@7h3laughingman/pf2e-types\"\nimport { MODULE_ID } from \"src/constants\"\nimport MODULE from \"src/index\"\nimport { parseHTML, translate } from \"src/utils\"\nimport { BaseModule } from \"../base\"\nimport { EmanationRequestDialog } from \"./emanation-dialog\"\n\nexport class EmanationModule extends BaseModule {\n\tsettingsKey = \"emanation-automation\"\n\n\tenable(): void {\n\t\tif (!game.modules.get(\"lib-wrapper\")?.active) return\n\n\t\tsuper.enable()\n\n\t\tthis.registerHook(\"renderChatMessageHTML\", onChatMessage)\n\t}\n\n\tonReady(): void {\n\t\tthis.registerWrapper(\n\t\t\t'CONFIG.Item.sheetClasses.spell[\"pf2e.SpellSheetPF2e\"].cls.prototype._renderInner',\n\t\t\tspellSheetRenderWrapper,\n\t\t\t\"WRAPPER\",\n\t\t)\n\n\t\tthis.registerWrapper(\n\t\t\t'CONFIG.Item.sheetClasses.spell[\"pf2e.SpellSheetPF2e\"].cls.prototype.activateListeners',\n\t\t\tspellSheetActivateListenersWrapper,\n\t\t\t\"WRAPPER\",\n\t\t)\n\t}\n}\n\nexport interface EmanationRequestData {\n\t/** Spell UUID */\n\tspellUuid: string\n\t/** Effect UUID */\n\teffectUuid: string\n\t/** Origin Token UUID */\n\toriginToken: string\n}\n\nexport function extractFlagData(item: SpellPF2e) {\n\tconst emanationAllies = item.getFlag(MODULE_ID, \"emanation-allies\") as boolean\n\tconst emanationEnemies = item.getFlag(MODULE_ID, \"emanation-enemies\") as boolean\n\tconst emanationExcludeSelf = item.getFlag(MODULE_ID, \"emanation-exclude-self\") as boolean\n\tconst emanationPromptDuration = item.getFlag(MODULE_ID, \"emanation-prompt-duration\") as boolean\n\n\treturn {\n\t\temanationAllies,\n\t\temanationEnemies,\n\t\temanationExcludeSelf,\n\t\temanationPromptDuration,\n\t}\n}\n\nfunction isValidSpell(item: SpellPF2e) {\n\treturn item.system.area?.type === \"emanation\" && item.system.area.value && !item.system.defense\n}\n\nfunction extractEffectUUIDs(item: SpellPF2e) {\n\tif (!isValidSpell(item)) return null\n\n\tconst matches = [...item.system.description.value.matchAll(/@UUID\\[(.+?)\\]/g)]\n\n\treturn matches.reduce((acc, match) => {\n\t\tconst id = match.at(1)\n\t\tid && acc.push(id)\n\t\treturn acc\n\t}, [])\n}\n\nasync function extractEffects(item: SpellPF2e) {\n\tconst uuids = extractEffectUUIDs(item)\n\tif (!uuids) return []\n\n\tconst effects = (await Promise.all(uuids.map((id) => fromUuid(id)))).filter(\n\t\t(e) => typeof e?.isOfType === \"function\" && e?.isOfType(\"effect\"),\n\t)\n\treturn effects\n}\n\nasync function onChatMessage(msg: ChatMessagePF2e, html: HTMLElement) {\n\tif (!MODULE.settings.emanationAutomation) return\n\tif (!game.user.isGM) return\n\tif (!msg.item?.isOfType(\"spell\")) return\n\tconst spell = msg.item\n\tconst range = spell.system.area?.type === \"emanation\" ? spell.system.area?.value : null\n\tconst token = msg.actor?.getActiveTokens().at(0)\n\tif (!token || !range) return\n\n\tconst options = extractFlagData(spell)\n\tconst effect = (await extractEffects(spell)).at(0)\n\n\tif (!effect || !(options.emanationAllies || options.emanationEnemies)) return\n\n\tconst buttonElement = parseHTML(`
\n\t\t\n\t
`)\n\tbuttonElement.querySelector(\"button\")?.addEventListener(\"click\", () => {\n\t\tnew EmanationRequestDialog({\n\t\t\tspellUuid: spell.uuid,\n\t\t\teffectUuid: effect.uuid,\n\t\t\toriginToken: token.document.uuid,\n\t\t}).render(true)\n\t})\n\n\thtml.querySelector(\"section.card-buttons\")?.append(buttonElement)\n}\n\nasync function spellSheetRenderInner(sheet: SpellSheetPF2e, $html: JQuery) {\n\tif (!isValidSpell(sheet.item)) return\n\tconst effects = await extractEffects(sheet.item)\n\tif (!effects) return\n\n\tconst { emanationAllies, emanationExcludeSelf, emanationEnemies, emanationPromptDuration } =\n\t\textractFlagData(sheet.item)\n\n\tconst checked = (value: boolean) => (value ? \"checked\" : \"\")\n\n\tconst content =\n\t\teffects.length === 1\n\t\t\t? `\n
\n \n
\n \n \n\n \n \n\n \n \n
\n
\n
\n \n
\n \n \n
\n
\n`\n\t\t\t: `

${translate(\"emanation.form-formatting-error\")}

`\n\n\t$html.find(\"fieldset.publication\").before(`\n
\n \n ${translate(\"emanation.form-fieldset-legend\")}\n (pf2e Utility Buttons)\n \n\n ${content}\n\n
\n `)\n}\n\nasync function spellSheetRenderWrapper(this: SpellSheetPF2e, wrapped, ...args) {\n\tconst $html = await wrapped(...args)\n\n\ttry {\n\t\tif (MODULE.settings.emanationAutomation) await spellSheetRenderInner(this, $html)\n\t} catch (e) {\n\t\tui.notifications.error(\"Could not insert emanation automation into spell sheet.\")\n\t\tconsole.error(e)\n\t}\n\n\treturn $html\n}\n\nfunction spellSheetActivateListenersWrapper(this: SpellSheetPF2e, wrapped, $html: JQuery) {\n\twrapped($html)\n\n\t$html.find(`input#field-${this.id}-emanation-allies`).on(\"change\", (e) => {\n\t\tthis.item.setFlag(MODULE_ID, \"emanation-allies\", e.target.checked)\n\t})\n\t$html.find(`input#field-${this.id}-emanation-enemies`).on(\"change\", (e) => {\n\t\tthis.item.setFlag(MODULE_ID, \"emanation-enemies\", e.target.checked)\n\t})\n\t$html\n\t\t.find(`input#field-${this.id}-emanation-exclude-self`)\n\t\t.on(\"change\", (e) => {\n\t\t\tthis.item.setFlag(MODULE_ID, \"emanation-exclude-self\", e.target.checked)\n\t\t})\n\t$html\n\t\t.find(`input#field-${this.id}-emanation-prompt-duration`)\n\t\t.on(\"change\", (e) => {\n\t\t\tthis.item.setFlag(MODULE_ID, \"emanation-prompt-duration\", e.target.checked)\n\t\t})\n\n\treturn $html\n}\n","import type { Token } from \"@7h3laughingman/foundry-types/client/canvas/placeables/_module.mjs\"\nimport type AmbientLight from \"@7h3laughingman/foundry-types/client/canvas/placeables/light.mjs\"\nimport type PointLightSource from \"@7h3laughingman/foundry-types/client/canvas/sources/point-light-source.mjs\"\n\nexport const Grid = class {\n\t#elements: Array\n\tconstructor(\n\t\tpublic width: number,\n\t\tpublic height: number,\n\t) {\n\t\tthis.#elements = new Array(width * height)\n\t}\n\n\tindex(x: number, y: number) {\n\t\treturn y * this.width + x\n\t}\n\n\tget(x: number, y: number) {\n\t\tconst el = this.#elements[this.index(x, y)]\n\t\treturn el\n\t}\n\n\tgetOrNull(x: number, y: number) {\n\t\tif (!this.isValid(x, y)) return null\n\t\treturn this.get(x, y)\n\t}\n\n\tset(x: number, y: number, value: T) {\n\t\tthis.#elements[this.index(x, y)] = value\n\t}\n\n\tisValid(x: number, y: number) {\n\t\treturn 0 <= x && x < this.width && 0 <= y && y < this.height\n\t}\n}\n\nexport const LightLevels = Object.freeze({\n\tDARK: { color: new PIXI.Color(0xff0000), darknessBreakpoint: 1 } as const,\n\tDIM: { color: new PIXI.Color(0xffff00), darknessBreakpoint: 0.75 } as const,\n\tBRIGHT: { color: new PIXI.Color(0x00ff00), darknessBreakpoint: 0.25 } as const,\n\n\tfromExposure(level: number) {\n\t\treturn level <= LightLevels.BRIGHT.darknessBreakpoint\n\t\t\t? LightLevels.BRIGHT\n\t\t\t: level < LightLevels.DIM.darknessBreakpoint\n\t\t\t\t? LightLevels.DIM\n\t\t\t\t: LightLevels.DARK\n\t},\n})\n\nexport const TargetColors = Object.freeze({\n\tUNKNOWN: new PIXI.Color(0xbb00ff),\n\tHIDDEN: new PIXI.Color(0xff0000),\n\tINBETWEEN: new PIXI.Color(0xff8000),\n\tCONCEALED: new PIXI.Color(0xffff00),\n\tBETTER: new PIXI.Color(0xd0ff00),\n\n\tfromDC(dc: number | null) {\n\t\tif (dc == null) return this.UNKNOWN\n\t\tif (dc < 5) return this.BETTER\n\t\tif (dc === 5) return this.CONCEALED\n\t\tif (dc < 11) return this.INBETWEEN\n\t\treturn this.HIDDEN\n\t},\n})\n\nexport type LightLevel = (typeof LightLevels)[\"DARK\" | \"BRIGHT\" | \"DIM\"]\n\nexport function darknessAtPoint(x: number, y: number): number {\n\tfor (const source of (canvas.effects as any).darknessSources as Collection<\n\t\tstring,\n\t\tPointLightSource\n\t>) {\n\t\tif (!source.shape.contains(x, y)) continue\n\t\treturn LightLevels.DARK.darknessBreakpoint\n\t}\n\n\tlet lightSourceLevel = LightLevels.DARK.darknessBreakpoint\n\tfor (const l of canvas.effects.lightSources) {\n\t\tif (!l.active || l instanceof foundry.canvas.sources.GlobalLightSource) continue\n\n\t\tif (!l.shape.contains(x, y)) continue\n\t\tconst d = Math.sqrt(Math.abs(l.x - x) ** 2 + Math.abs(l.y - y) ** 2)\n\n\t\t//@ts-expect-error\n\t\tif (d <= l.data.bright) return 0\n\t\t//@ts-expect-error\n\t\tif (d <= l.data.dim) lightSourceLevel = 0.5\n\t}\n\n\tconst globalIlluminationLevel = canvas.effects.getDarknessLevel({ x, y, elevation: 0 })\n\n\treturn Math.min(lightSourceLevel, globalIlluminationLevel)\n}\n","import { BaseModule } from \"src/modules/base\"\nimport { darknessAtPoint, Grid, type LightLevel, LightLevels } from \"./utils\"\n\ndeclare global {\n\tinterface CanvasPF2e {\n\t\tlightVis: LightVisLayer\n\t}\n}\n\nclass LightVisLayer extends foundry.canvas.layers.InteractionLayer {\n\tprotected _draw(options: object): Promise {\n\t\treturn super._draw(options)\n\t}\n\tstatic get layerOptions() {\n\t\treturn foundry.utils.mergeObject(super.layerOptions, {\n\t\t\tname: \"lightVis\",\n\t\t})\n\t}\n\n\tget sortLayer() {\n\t\treturn 501\n\t}\n}\n\nclass HighlightRenderer {\n\t#layer: PIXI.Graphics | null = null\n\t#addLayer() {\n\t\tthis.#layer = new PIXI.Graphics()\n\t\t;((canvas as any).lightVis as LightVisLayer).addChild(this.#layer)\n\t\treturn this.#layer\n\t}\n\tget layer() {\n\t\treturn this.#layer ?? this.#addLayer()\n\t}\n\tdestroy() {\n\t\tthis.#layer?.destroy()\n\t\tthis.#layer = null\n\t}\n\tclear() {\n\t\tthis.#layer?.clear()\n\t\tthis.#layer?.removeChildren()\n\t}\n\n\tdrawMesh() {\n\t\tconst gridSize = canvas.scene!.grid.size\n\t\tconst halfGrid = gridSize / 2\n\t\t// const { width, height } = canvas.scene!.dimensions\n\n\t\tconst width = Math.ceil(canvas.scene!.dimensions.width / gridSize)\n\t\tconst height = Math.ceil(canvas.scene!.dimensions.height / gridSize)\n\n\t\tconst highlightGraphics = new PIXI.Graphics()\n\n\t\tconst grid = new Grid(width, height)\n\t\tfor (let x = 0; x < width; x++) {\n\t\t\tfor (let y = 0; y < height; y++) {\n\t\t\t\tconst px = halfGrid + x * gridSize\n\t\t\t\tconst py = halfGrid + y * gridSize\n\n\t\t\t\tconst l = darknessAtPoint(px, py)\n\t\t\t\tgrid.set(x, y, LightLevels.fromExposure(l))\n\t\t\t}\n\t\t}\n\n\t\tfor (let x = 0; x < width; x++) {\n\t\t\tfor (let y = 0; y < height; y++) {\n\t\t\t\tconst px = x * gridSize\n\t\t\t\tconst py = y * gridSize\n\n\t\t\t\tconst l = grid.get(x, y)\n\n\t\t\t\t/* const lineWitdh = 1\n\t\t\t\tconst innerSize = gridSize - lineWitdh * 2\n\t\t\t\tconst left = px\n\t\t\t\tconst top = py\n\t\t\t\tconst right = left + gridSize\n\t\t\t\tconst bottom = top + gridSize\n\t\t\t\thighlightGraphics.lineStyle({\n\t\t\t\t\twidth: lineWitdh,\n\t\t\t\t\tcolor: 0x999999,\n\t\t\t\t\talpha: 1,\n\t\t\t\t})\n\t\t\t\tif (x < width - 1 && grid.getOrNull(x + 1, y) !== l)\n\t\t\t\t\thighlightGraphics.moveTo(right, top).lineTo(right, bottom)\n\t\t\t\tif (y < height - 1 && grid.getOrNull(x, y + 1) !== l)\n\t\t\t\t\thighlightGraphics.moveTo(left, bottom).lineTo(right, bottom) */\n\n\t\t\t\tif (l !== LightLevels.BRIGHT) {\n\t\t\t\t\tconst color = l.color\n\t\t\t\t\thighlightGraphics.lineStyle(0)\n\t\t\t\t\thighlightGraphics.beginFill(color, 0.25).drawRect(px, py, gridSize, gridSize).endFill()\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.layer.addChild(highlightGraphics)\n\t}\n\n\tdrawPoints() {\n\t\tconst gridSize = canvas.scene!.grid.size\n\t\tconst halfGrid = gridSize / 2\n\n\t\tconst width = Math.ceil(canvas.scene!.dimensions.width / gridSize) + 1\n\t\tconst height = Math.ceil(canvas.scene!.dimensions.height / gridSize) + 1\n\n\t\tconst g = new PIXI.Graphics()\n\n\t\tconst drawPoint = (px: number, py: number) => {\n\t\t\tconst exposure = darknessAtPoint(px, py)\n\t\t\tconst level = LightLevels.fromExposure(exposure)\n\t\t\tconst color = level.color\n\t\t\tg.beginFill(color, 1)\n\t\t\tif (level === LightLevels.BRIGHT) g.drawCircle(px, py, 5)\n\t\t\telse if (level === LightLevels.DIM) g.drawRect(px - 3, py - 3, 6, 6)\n\t\t\telse g.drawRoundedRect(px - 4, py - 4, 8, 8, 3)\n\t\t}\n\n\t\tfor (let x = 0; x < width; x++) {\n\t\t\tfor (let y = 0; y < height; y++) {\n\t\t\t\tconst px = x * gridSize\n\t\t\t\tconst py = y * gridSize\n\n\t\t\t\tdrawPoint(px, py)\n\t\t\t\tif (x < width - 1 && y < width - 1) drawPoint(px + halfGrid, py + halfGrid)\n\t\t\t}\n\t\t}\n\t\tthis.layer.addChild(g)\n\t}\n\n\tdrawText() {\n\t\tconst gridSize = canvas.scene!.grid.size\n\t\tconst { width, height } = canvas.scene!.dimensions\n\n\t\tfor (let x = gridSize / 2; x < width; x += gridSize) {\n\t\t\tfor (let y = gridSize / 2; y < height; y += gridSize) {\n\t\t\t\tconst l = darknessAtPoint(x, y)\n\t\t\t\tconst color =\n\t\t\t\t\tl <= LightLevels.BRIGHT.darknessBreakpoint\n\t\t\t\t\t\t? \"#00ff00\"\n\t\t\t\t\t\t: l <= LightLevels.DIM.darknessBreakpoint\n\t\t\t\t\t\t\t? \"#ffff00\"\n\t\t\t\t\t\t\t: \"#ff0000\"\n\n\t\t\t\tconst text = new PIXI.Text(\n\t\t\t\t\tl.toFixed(2).toLocaleLowerCase(),\n\t\t\t\t\tnew PIXI.TextStyle({\n\t\t\t\t\t\tfill: color,\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t\ttext.x = x\n\t\t\t\ttext.y = y\n\t\t\t\ttext.anchor.set(0.5)\n\t\t\t\tthis.layer.addChild(text)\n\t\t\t}\n\t\t}\n\t}\n\n\tdraw() {\n\t\tthis.destroy()\n\t\tthis.drawMesh()\n\t\t// this.drawPoints()\n\t}\n}\n\nexport class LightVisModule extends BaseModule {\n\tsettingsKey = \"light-level-vis\"\n\n\tlayerRenderer?: HighlightRenderer\n\n\tenable(): void {\n\t\t// @ts-expect-error\n\t\tCONFIG.Canvas.layers.lightVis = {\n\t\t\tlayerClass: LightVisLayer,\n\t\t\tgroup: \"primary\",\n\t\t}\n\t\tthis.layerRenderer = new HighlightRenderer()\n\n\t\tthis.registerHook(\"highlightObjects\", (state: boolean) => {\n\t\t\tif (state) this.layerRenderer?.draw()\n\t\t\telse this.layerRenderer?.destroy()\n\t\t})\n\t\t/* this.registerHook(\"lightingRefresh\", () => this.layerRenderer?.draw())\n\t\tthis.registerHook(\"canvasInit\", () => this.layerRenderer?.draw())\n\t\tthis.registerHook(\"canvasTearDown\", () => this.layerRenderer?.destroy()) */\n\t}\n}\n","export const VisiblityLevelPriorities = {\n\tobserved: 0,\n\tconcealed: 1,\n\thidden: 2,\n\tundetected: 4,\n\tunnoticed: 5,\n\tunknown: 6,\n} as const\n\nexport type VisibilityLevels = keyof typeof VisiblityLevelPriorities\n\nexport const OriginToTargetCondition = {\n\tdazzled: \"concealed\",\n\tblinded: \"hidden\",\n} as const\nexport type OriginConditionSlug = keyof typeof OriginToTargetCondition\n\nexport const TargetConditionToDC = {\n\tobserved: 0,\n\tconcealed: 5,\n\thidden: 11,\n\tundetected: 11,\n\tunnoticed: null,\n\tunknown: null,\n} as const\nexport type TargetConditionSlug = keyof typeof TargetConditionToDC\n\nexport const ActorTypesWithPerception = [\"army\", \"character\", \"familiar\", \"npc\"]\n","function e(e,t,n){let r=n=>e(n,...t);return n===void 0?r:Object.assign(r,{lazy:n,lazyArgs:t})}export{e as t};\n//# sourceMappingURL=lazyDataLastImpl-DtF3cihj.js.map","import{t as e}from\"./lazyDataLastImpl-DtF3cihj.js\";function t(t,n,r){let i=t.length-n.length;if(i===0)return t(...n);if(i===1)return e(t,n,r);throw Error(`Wrong number of arguments`)}export{t as purry};\n//# sourceMappingURL=purry.js.map","const e={done:!0,hasNext:!1},t={done:!1,hasNext:!1},n=()=>e,r=e=>({hasNext:!0,next:e,done:!1});export{n,r,t};\n//# sourceMappingURL=utilityEvaluators-Cb8x6-JZ.js.map","import{t as e}from\"./utilityEvaluators-Cb8x6-JZ.js\";function t(e,...t){let a=e,o=t.map(e=>`lazy`in e?r(e):void 0),s=0;for(;se.length>=t;export{t as hasAtLeast};\n//# sourceMappingURL=hasAtLeast.js.map","const e={asc:(e,t)=>e>t,desc:(e,t)=>ee(t,o)}function n(e,[n,r,...a]){let o,s;return i(r)?(o=n,s=[r,...a]):(o=r,s=[n,...a]),t((...t)=>e(...t,o),s)}function r(t,n,...i){let a=typeof t==`function`?t:t[0],o=typeof t==`function`?`asc`:t[1],{[o]:s}=e,c=n===void 0?void 0:r(n,...i);return(e,t)=>{let n=a(e),r=a(t);return s(n,r)?1:s(r,n)?-1:c?.(e,t)??0}}function i(t){if(a(t))return!0;if(typeof t!=`object`||!Array.isArray(t))return!1;let[n,r,...i]=t;return a(n)&&typeof r==`string`&&r in e&&i.length===0}const a=e=>typeof e==`function`&&e.length===1;export{n,t};\n//# sourceMappingURL=purryOrderRules-BaB5mcHH.js.map","import{purry as e}from\"./purry.js\";import{t}from\"./utilityEvaluators-Cb8x6-JZ.js\";function n(...t){return e(r,t,i)}const r=(e,t)=>e.filter(t),i=e=>(n,r,i)=>e(n,r,i)?{done:!1,hasNext:!0,next:n}:t;export{n as filter};\n//# sourceMappingURL=filter.js.map","import{hasAtLeast as e}from\"./hasAtLeast.js\";import{t}from\"./purryOrderRules-BaB5mcHH.js\";function n(...e){return t(r,e)}function r(t,n){if(!e(t,2))return t[0];let[r]=t,[,...i]=t;for(let e of i)n(e,r)<0&&(r=e);return r}export{n as firstBy};\n//# sourceMappingURL=firstBy.js.map","import{purry as e}from\"./purry.js\";function t(...t){return e(n,t)}const n=(e,t)=>{let n=Object.create(null);for(let r=0;re.map(t),r=e=>(t,n,r)=>({done:!1,hasNext:!0,next:e(t,n,r)});export{t as map};\n//# sourceMappingURL=map.js.map","import type { ApplicationRenderOptions } from \"@7h3laughingman/foundry-types/client/applications/_types.mjs\"\nimport type FormDataExtended from \"@7h3laughingman/foundry-types/client/applications/ux/form-data-extended.mjs\"\nimport { MODULE_ID } from \"src/constants\"\nimport { translate } from \"src/utils\"\n\nexport class FlatMessageConfigApplication extends foundry.applications.api.HandlebarsApplicationMixin(\n\tfoundry.applications.api.ApplicationV2,\n) {\n\tstatic PARTS = {\n\t\tform: {\n\t\t\ttemplate: \"modules/pf2e-flatcheck-helper/templates/message-config.hbs\",\n\t\t},\n\t\tfooter: {\n\t\t\ttemplate: \"templates/generic/form-footer.hbs\",\n\t\t},\n\t}\n\tstatic DEFAULT_OPTIONS = {\n\t\tid: \"fc-flat-check-config\",\n\t\ttag: \"form\",\n\t\twindow: {\n\t\t\ttitle: \"Flat Check Config\",\n\t\t},\n\t\tform: {\n\t\t\thandler: FlatMessageConfigApplication.onSubmit,\n\t\t\tsubmitOnChange: false,\n\t\t\tcloseOnSubmit: true,\n\t\t},\n\t}\n\n\tstatic async onSubmit(event: SubmitEvent | Event, form: HTMLFormElement, data: FormDataExtended) {\n\t\tconst ignoredCheckTypes: string[] = []\n\t\tconst experimentalCheckTypes: string[] = []\n\t\tfor (const [key, checked] of Object.entries(data.object)) {\n\t\t\tif (CHECK_TYPES.includes(key as any) && !checked) {\n\t\t\t\tignoredCheckTypes.push(key)\n\t\t\t}\n\t\t\tif (EXPERIMENTAL_CHECK_TYPES.includes(key as any) && checked) {\n\t\t\t\texperimentalCheckTypes.push(key)\n\t\t\t}\n\t\t}\n\n\t\tgame.settings.set(MODULE_ID, \"flat-check-config\", {\n\t\t\tignoredCheckTypes,\n\t\t\texperimentalCheckTypes,\n\t\t})\n\t}\n\n\tprotected async _prepareContext(options: ApplicationRenderOptions): Promise {\n\t\tconst { ignored, experimental } = flatMessageConfig.toSets()\n\t\treturn {\n\t\t\tbuttons: [{ type: \"submit\", icon: \"fa-solid fa-save\", label: \"SETTINGS.Save\" }],\n\t\t\ttypes: [\n\t\t\t\t...CHECK_TYPES.map((t) => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tkey: t,\n\t\t\t\t\t\tchecked: !ignored.has(t),\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t\t...EXPERIMENTAL_CHECK_TYPES.map((t) => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tkey: t,\n\t\t\t\t\t\tchecked: experimental.has(t),\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t],\n\t\t\ti18n: (key: string) => {\n\t\t\t\treturn translate(`flat-config.${key}`)\n\t\t\t},\n\t\t}\n\t}\n}\n\nconst CHECK_TYPES = [\n\t\"stupefied\",\n\t\"manipulate\",\n\t\"deafened\",\n\t\"deafened-spellcasting\",\n\t\"target\",\n] as const\n\nconst EXPERIMENTAL_CHECK_TYPES = [\"light-level\"] as const\n\ninterface ConfigJSON {\n\tignoredCheckTypes: typeof CHECK_TYPES\n\texperimentalCheckTypes: typeof EXPERIMENTAL_CHECK_TYPES\n}\n\nfunction getRawConfig() {\n\treturn game.settings.get(MODULE_ID, \"flat-check-config\") as ConfigJSON\n}\n\nexport const flatMessageConfig = {\n\tcheckTypes: CHECK_TYPES,\n\texperimentalTypes: EXPERIMENTAL_CHECK_TYPES,\n\n\ttoSets() {\n\t\tconst raw = getRawConfig()\n\t\treturn {\n\t\t\tignored: new Set(raw.ignoredCheckTypes),\n\t\t\texperimental: new Set(raw.experimentalCheckTypes),\n\t\t}\n\t},\n}\n","import type Token from \"@7h3laughingman/foundry-types/client/canvas/placeables/token.mjs\"\nimport type { HookCallback } from \"@7h3laughingman/foundry-types/client/helpers/hooks.mjs\"\nimport type { TokenDocumentPF2e, TokenPF2e } from \"@7h3laughingman/pf2e-types\"\nimport { darknessAtPoint, LightLevels } from \"./utils\"\n\nfunction tokenExposure(token: Token) {\n\tconst gridSize = token.scene!.grid.size\n\tconst halfGrid = gridSize / 2\n\tconst sceneDimensions = token.scene!.dimensions\n\n\tlet tokenExposure: number = LightLevels.DARK.darknessBreakpoint\n\n\tif (token.bounds.width < gridSize || token.bounds.height < gridSize) {\n\t\tconst x = token.bounds.width / 2\n\t\tconst y = token.bounds.height / 2\n\t\tconst exp = darknessAtPoint(x + token.x, y + token.y)\n\t\t// drawLightPoint(this.#graphics, x, y, exp)\n\t\ttokenExposure = Math.min(tokenExposure, exp)\n\t} else {\n\t\tfor (let x = halfGrid; x < token.bounds.width; x += gridSize) {\n\t\t\tfor (let y = halfGrid; y < token.bounds.height; y += gridSize) {\n\t\t\t\tconst gx = x + token.x\n\t\t\t\tconst gy = y + token.y\n\t\t\t\tif (gx >= 0 && gx <= sceneDimensions.width && gy >= 0 && gy <= sceneDimensions.height) {\n\t\t\t\t\tconst exp = darknessAtPoint(gx, gy)\n\t\t\t\t\t// drawLightPoint(this.#graphics, x, y, exp)\n\t\t\t\t\ttokenExposure = Math.min(tokenExposure, exp)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn tokenExposure\n}\n\nclass Cache {\n\tprivate map = new Map()\n\n\tprivate calculate(token: TokenDocumentPF2e) {\n\t\tconst exposure = token.object ? tokenExposure(token.object) : 0\n\t\tthis.map.set(token, exposure)\n\t\treturn exposure\n\t}\n\n\tget(token: TokenDocumentPF2e) {\n\t\tconst exposure = this.map.get(token)\n\t\tif (exposure == null) return this.calculate(token)\n\t\treturn exposure\n\t}\n\n\tinvalidate(token: TokenDocumentPF2e) {\n\t\tthis.map.delete(token)\n\t}\n\n\tinvalidateAll() {\n\t\tthis.map.clear()\n\t}\n\n\tprivate useCount = 0\n\tenable() {\n\t\tif (this.useCount === 0) {\n\t\t\tthis.registerHook(\"canvasTearDown\", () => this.invalidateAll())\n\t\t\tthis.registerHook(\n\t\t\t\t\"lightingRefresh\",\n\t\t\t\tfoundry.utils.debounce(() => this.invalidateAll(), 50),\n\t\t\t)\n\t\t\tthis.registerHook(\"updateToken\", (token: TokenDocumentPF2e, changes: any) => {\n\t\t\t\tif (\n\t\t\t\t\t\"x\" in changes ||\n\t\t\t\t\t\"y\" in changes ||\n\t\t\t\t\t\"elevation\" in changes ||\n\t\t\t\t\t\"width\" in changes ||\n\t\t\t\t\t\"height\" in changes\n\t\t\t\t) {\n\t\t\t\t\tthis.invalidate(token)\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\t\tthis.useCount++\n\t}\n\n\tdisable() {\n\t\tif (this.useCount === 1) {\n\t\t\tfor (const [k, v] of this.hooks.entries()) Hooks.off(k, v)\n\t\t\tthis.hooks.clear()\n\t\t}\n\t\tthis.useCount = Math.max(this.useCount - 1, 0)\n\t}\n\n\tprivate hooks = new Map()\n\tregisterHook(type: string, callback: HookCallback) {\n\t\tconst id = Hooks.on(type, callback)\n\t\tthis.hooks.set(type, id)\n\t}\n}\n\nexport const tokenExposureCache = new Cache()\n\nexport function tokenLightLevel(token: TokenPF2e) {\n\tconst exposure = token.document ? tokenExposureCache.get(token.document) : 0\n\treturn LightLevels.fromExposure(exposure)\n}\n","import type { ChatMessagePF2e, TokenDocumentPF2e, TokenPF2e } from \"@7h3laughingman/pf2e-types\"\nimport { SYSTEM } from \"src/utils\"\nimport type { FlatCheckSource } from \"../data\"\nimport { tokenLightLevel } from \"../light/token\"\nimport { LightLevels } from \"../light/utils\"\n\nfunction lightLevelForToken(prefix: string, token: TokenPF2e) {\n\tconst level = tokenLightLevel(token)\n\tconst slug = level === LightLevels.DARK ? \"dark\" : level === LightLevels.DIM ? \"dim\" : \"bright\"\n\treturn `${prefix}:fc-light:${slug}`\n}\n\nfunction forCheck(source: Partial) {\n\tconst options: string[] = []\n\tif (source.type) options.push(`fc:type:${source.type}`)\n\tif (source.baseDc != null) options.push(`fc:base-dc:${source.baseDc}`)\n\tif (source.origin) options.push(`fc:origin:${source.origin.slug}`)\n\n\treturn options\n}\n\nfunction forRollMessage(msg: ChatMessagePF2e) {\n\tconst options: Array = []\n\tconst context = msg.flags[SYSTEM.id].context\n\tif (context && \"contextualOptions\" in context && context.contextualOptions?.postRoll?.length) {\n\t\toptions.push(context.contextualOptions.postRoll)\n\t}\n\tif (context && \"options\" in context && context.options?.length) {\n\t\toptions.push(context.options)\n\t}\n\n\treturn options.flat()\n}\n\nfunction forMixed(data: {\n\tmsg?: ChatMessagePF2e\n\torigin?: TokenDocumentPF2e\n\ttarget?: TokenDocumentPF2e\n}) {\n\tconst options: Array = []\n\tif (data.msg?.item) options.push(data.msg.item.getRollOptions(\"item\"))\n\tif (data.origin?.actor) options.push(data.origin.actor.getRollOptions())\n\tif (data.target?.actor) options.push(data.target.actor.getSelfRollOptions(\"target\"))\n\n\tif (data.origin?.object && data.target?.object) {\n\t\tconst distance = data.origin.object.distanceTo(data.target.object)\n\t\tif (Number.isInteger(distance)) options.push(`target:distance:${distance}`)\n\t\toptions.push(\"target\")\n\t}\n\n\treturn options.flat()\n}\n\nfunction lightLevelOptions({\n\tself,\n\ttarget,\n\tmsg,\n}: {\n\tself?: TokenPF2e | null\n\ttarget?: TokenPF2e | null\n\tmsg?: ChatMessagePF2e\n}) {\n\tconst options: Array = []\n\n\tif (msg?.token?.object && msg.target?.token.object) {\n\t\tself = msg.token.object\n\t\ttarget = msg.target.token.object\n\t}\n\n\tif (self) options.push(lightLevelForToken(\"self\", self))\n\tif (target) options.push(lightLevelForToken(\"target\", target))\n\treturn options.flat()\n}\n\nexport const flatCheckRollOptions = {\n\tforCheck,\n\tforRollMessage,\n\tforMixed,\n\tlightLevelOptions,\n}\n","import type { ModelPropFromDataField } from \"@7h3laughingman/foundry-types/common/data/fields.mjs\"\n\nconst fields = foundry.data.fields\n\nconst schema = {\n\tcondition: new fields.StringField({\n\t\trequired: true,\n\t\tblank: false,\n\t\tchoices: [\"observed\", \"concealed\", \"hidden\", \"all\"],\n\t}),\n\ttreatAs: new fields.StringField({\n\t\trequired: true,\n\t\tblank: false,\n\t\tchoices: [\"observed\", \"concealed\", \"hidden\"],\n\t}),\n\tmode: new fields.StringField({\n\t\trequired: true,\n\t\tblank: false,\n\t\tinitial: undefined,\n\t\tchoices: [\"upgrade\", \"downgrade\", \"override\"],\n\t}),\n\taffects: new fields.StringField({\n\t\trequired: true,\n\t\tchoices: [\"origin\", \"self\"],\n\t\tinitial: \"self\",\n\t}),\n}\n\ntype SchemaType = typeof schema\ntype SchemaProps = {\n\t[k in keyof SchemaType]: ModelPropFromDataField\n}\n\nexport const TreatAsConditionPriorities = {\n\tobserved: 0,\n\tconcealed: 1,\n\thidden: 2,\n\tall: 3,\n} as const\n\nexport const TreatAsModePriorities: Record = {\n\tdowngrade: 30,\n\tupgrade: 40,\n\toverride: 50,\n}\nexport function buildTreatAsRuleElement() {\n\t// biome-ignore lint/correctness/noUnusedVariables: neccesary evil\n\tinterface TreatAsRuleElementImpl extends SchemaProps {\n\t\tkey: \"fc-TreatAs\"\n\t}\n\n\t// biome-ignore lint/suspicious/noUnsafeDeclarationMerging: this should be a crime\n\tclass TreatAsRuleElementImpl extends game.pf2e.RuleElement {\n\t\tstatic override validateJoint(data: any) {\n\t\t\tif (data.condition === data.treatAs) {\n\t\t\t\tthrow new Error(\"condition can't be the same as treatAs\")\n\t\t\t}\n\t\t\tif (data.condition === \"observed\" && data.slug == null && data.slug === \"\") {\n\t\t\t\tthrow new Error(\"slug is required when changing observed\")\n\t\t\t}\n\t\t}\n\n\t\tstatic override defineSchema() {\n\t\t\tconst base = super.defineSchema()\n\t\t\tbase.priority.initial = (d) => TreatAsModePriorities[String(d.mode)] ?? 50\n\t\t\treturn {\n\t\t\t\t...base,\n\t\t\t\t...schema,\n\t\t\t}\n\t\t}\n\n\t\tget tiebreakPriority() {\n\t\t\tconst p = TreatAsConditionPriorities[this.treatAs]\n\t\t\tif (this.mode === \"downgrade\") return -p\n\t\t\treturn p\n\t\t}\n\n\t\tgetData(options: string[]) {\n\t\t\tif (!this.test(options)) return null\n\n\t\t\treturn {\n\t\t\t\tslug: this.slug ?? \"null\",\n\t\t\t\tlabel: this.label,\n\t\t\t\taffects: this.affects,\n\t\t\t\tmode: this.mode,\n\t\t\t\tcondition: this.condition,\n\t\t\t\ttreatAs: this.treatAs,\n\t\t\t\tpriority: this.tiebreakPriority,\n\t\t\t}\n\t\t}\n\t}\n\n\treturn TreatAsRuleElementImpl\n}\n\nexport type TreatAsRuleElement = InstanceType>\n\nexport type TreatAsData = ReturnType\n","import type { ActorPF2e } from \"@7h3laughingman/pf2e-types\"\nimport * as R from \"remeda\"\nimport MODULE from \"src\"\nimport { type VisibilityLevels, VisiblityLevelPriorities } from \"../constants\"\nimport type { FlatCheckSource } from \"../data\"\nimport type { TargetFlatCheckSource } from \"../target\"\nimport type { AddCheckRuleElement } from \"./add\"\nimport type { ModifyFlatDCData, ModifyFlatDCRuleElement } from \"./modify\"\nimport { flatCheckRollOptions } from \"./options\"\nimport { TreatAsConditionPriorities, type TreatAsRuleElement } from \"./treat-as\"\n\nexport const PRIORITIES = {\n\tadd: 20,\n\tdowngrade: 30,\n\tupgrade: 40,\n\toverride: 50,\n} as const\n\nexport type FlatCheckRuleElements =\n\t| AddCheckRuleElement\n\t| ModifyFlatDCRuleElement\n\t| TreatAsRuleElement\n\nexport function sortRuleElements(a: T, b: T) {\n\tif (a.priority === b.priority) {\n\t\t// Use the default priority if for some reason two different modes have the same\n\t\tif (\"mode\" in a && \"mode\" in b && a.mode !== b.mode) {\n\t\t\treturn PRIORITIES[a.mode] - PRIORITIES[b.mode]\n\t\t}\n\n\t\t// Put the higher override last\n\t\tif (a.key === \"fc-ModifyFlatDC\" && b.key === \"fc-ModifyFlatDC\" && a.mode === \"override\") {\n\t\t\tconst delta = a.tiebreakPriority - b.tiebreakPriority\n\t\t\tif (delta) return delta\n\t\t}\n\n\t\tif (a.key === \"fc-TreatAs\" && b.key === \"fc-TreatAs\") {\n\t\t\tconst delta = a.tiebreakPriority - b.tiebreakPriority\n\t\t\tif (delta) return delta\n\t\t}\n\n\t\t// For anything else the order doesn't matter\n\t\t// Sort by label for a stable order\n\t\treturn a.label.localeCompare(b.label)\n\t}\n\treturn a.priority - b.priority\n}\n\nconst ruleShortNames = {\n\t\"fc-ModifyFlatDC\": \"modify\",\n\t\"fc-AddCheck\": \"add\",\n\t\"fc-TreatAs\": \"map\",\n} as const\nfunction collectRules(actor: ActorPF2e, affects: ModifyFlatDCRuleElement[\"affects\"]) {\n\tconst keys = Object.keys(ruleShortNames)\n\tconst rules = R.pipe(\n\t\tactor.rules,\n\t\tR.filter((r): r is ModifyFlatDCRuleElement | AddCheckRuleElement | TreatAsRuleElement =>\n\t\t\tkeys.includes(r.key),\n\t\t),\n\t\tR.filter((r) => r.affects === affects),\n\t\tR.groupBy((r) => ruleShortNames[r.key]),\n\t)\n\n\treturn rules as {\n\t\tmodify: ModifyFlatDCRuleElement[]\n\t\tadd: AddCheckRuleElement[]\n\t\tmap: TreatAsRuleElement[]\n\t}\n}\nexport type FlatCheckRules = ReturnType\n\nfunction mergeAndSort(origin?: T[], target?: T[]) {\n\treturn [origin, target]\n\t\t.filter((t) => t != null)\n\t\t.flat()\n\t\t.sort(sortRuleElements)\n}\n\nexport interface DcAdjustment {\n\tlabel: string\n\tvalue: string\n}\n\nexport interface TreatAsAdjustment {\n\told: VisibilityLevels\n\tnew: VisibilityLevels\n\tslug: string\n\tlabel: string\n}\n\nexport interface AdditionalFlatCheckSource extends FlatCheckSource {\n\tslot: string\n}\n\nexport class Adjustments {\n\tmodify: ModifyFlatDCRuleElement[]\n\tadd: AddCheckRuleElement[]\n\ttreatAs: TreatAsRuleElement[]\n\tconstructor(origin?: ActorPF2e | null, target?: ActorPF2e | null) {\n\t\tconst originRules = origin && collectRules(origin, \"self\")\n\t\tconst targetRules = target && collectRules(target, \"origin\")\n\n\t\tthis.modify = mergeAndSort(originRules?.modify, targetRules?.modify)\n\t\tthis.add = mergeAndSort(originRules?.add, targetRules?.add)\n\t\tthis.treatAs = mergeAndSort(originRules?.map, targetRules?.map)\n\t}\n\n\tgetDcAdjustment(type: string, rollOptions: string[], baseDc: number) {\n\t\tlogOptions(`fc-ModifyDC (${type})`, rollOptions)\n\t\tconst rules = this.modify.reduce((acc, rule) => {\n\t\t\tif (rule.type === type) {\n\t\t\t\tconst data = rule.getData(rollOptions)\n\t\t\t\tif (data) acc.push(data)\n\t\t\t}\n\t\t\treturn acc\n\t\t}, [])\n\n\t\tlet currentDc = baseDc\n\t\tlet adjustments: DcAdjustment[] = []\n\t\tfor (const rule of rules) {\n\t\t\tconst value = rule.value\n\t\t\tswitch (rule.mode) {\n\t\t\t\tcase \"add\":\n\t\t\t\t\tif (value === 0) continue\n\t\t\t\t\tcurrentDc += value\n\t\t\t\t\tadjustments.push({ label: rule.label, value: `${value > 0 ? \"+\" : \"\"}${value}` })\n\t\t\t\t\tbreak\n\t\t\t\tcase \"upgrade\":\n\t\t\t\t\tif (currentDc < value) {\n\t\t\t\t\t\tcurrentDc = value\n\t\t\t\t\t\tadjustments = [{ label: rule.label, value: value.toString() }]\n\t\t\t\t\t}\n\t\t\t\t\tbreak\n\t\t\t\tcase \"downgrade\":\n\t\t\t\t\tif (currentDc > value) {\n\t\t\t\t\t\tcurrentDc = value\n\t\t\t\t\t\tadjustments = [{ label: rule.label, value: value.toString() }]\n\t\t\t\t\t}\n\t\t\t\t\tbreak\n\t\t\t\tcase \"override\":\n\t\t\t\t\tcurrentDc = value\n\t\t\t\t\tadjustments = [{ label: rule.label, value: value.toString() }]\n\t\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\treturn { finalDc: currentDc, adjustments }\n\t}\n\n\tgetTreatAsAdjustments(\n\t\tcheck: TargetFlatCheckSource,\n\t\trollOptions: string[],\n\t): TreatAsAdjustment[] | null {\n\t\tif (!Object.keys(VisiblityLevelPriorities).includes(check.type)) return null\n\n\t\tconst checkOptions = [rollOptions, flatCheckRollOptions.forCheck(check)].flat()\n\t\tlogOptions(`fc-TreatAs (${check.type})`, checkOptions)\n\n\t\tconst rules = this.treatAs\n\t\t\t.map((rule) => rule.getData(checkOptions))\n\t\t\t.filter((rule) => rule != null)\n\n\t\tlet currentCondition = check.type\n\t\tconst adjustments: TreatAsAdjustment[] = []\n\n\t\tfor (const rule of rules) {\n\t\t\tif (rule.condition !== \"all\" && rule.condition !== currentCondition) continue\n\n\t\t\tif (\n\t\t\t\trule.condition !== \"all\" &&\n\t\t\t\t((rule.mode === \"downgrade\" &&\n\t\t\t\t\tTreatAsConditionPriorities[rule.treatAs] >\n\t\t\t\t\t\tTreatAsConditionPriorities[currentCondition]) ||\n\t\t\t\t\t(rule.mode === \"upgrade\" &&\n\t\t\t\t\t\tTreatAsConditionPriorities[rule.treatAs] <\n\t\t\t\t\t\t\tTreatAsConditionPriorities[currentCondition]))\n\t\t\t) {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tadjustments.push({\n\t\t\t\tlabel: rule.label,\n\t\t\t\tslug: rule.slug,\n\t\t\t\told: currentCondition,\n\t\t\t\tnew: rule.treatAs,\n\t\t\t})\n\t\t\tcurrentCondition = rule.treatAs\n\t\t}\n\t\tif (adjustments.length) return adjustments\n\t\treturn null\n\t}\n\n\ttreatObservedAs(rollOptions: string[]): TargetFlatCheckSource | null {\n\t\tconst checkOptions = [rollOptions, flatCheckRollOptions.forCheck({ type: \"observed\" })].flat()\n\t\tlogOptions(`fc-TreatAs (observed)`, checkOptions)\n\n\t\tconst rules = this.treatAs\n\t\t\t.map((rule) => rule.getData(checkOptions))\n\t\t\t.filter((rule) => rule?.condition === \"observed\")\n\n\t\tconst highest = rules.at(-1)\n\t\tif (highest)\n\t\t\treturn {\n\t\t\t\ttype: highest.treatAs,\n\t\t\t\tconditionAdjustments: [\n\t\t\t\t\t{ label: highest.label, old: \"observed\", new: highest.treatAs, slug: highest.slug },\n\t\t\t\t],\n\t\t\t\torigin: { label: highest.label, slug: highest.slug },\n\t\t\t}\n\n\t\treturn null\n\t}\n\n\tgetAdditionalSources(rollOptions: string[]) {\n\t\tlogOptions(\"fc-AddCheck\", rollOptions)\n\t\tconst sources: AdditionalFlatCheckSource[] = []\n\t\tfor (const rule of this.add) {\n\t\t\tconst source = rule.toSource(rollOptions)\n\t\t\tif (source) sources.push(source)\n\t\t}\n\t\treturn sources\n\t}\n}\n\nfunction logOptions(rule: string, options: string[]) {\n\tif (MODULE.debug.re) console.log(`RollOptions for ${rule} RE: `, options)\n}\n","import type { TokenDocumentPF2e } from \"@7h3laughingman/pf2e-types\"\nimport * as R from \"remeda\"\nimport { type TargetConditionSlug, TargetConditionToDC } from \"./constants\"\nimport type { TargetFlatCheckSource } from \"./target\"\n\nexport type VisibilityFactorSlug =\n\t| \"blinded\"\n\t| \"invisible\"\n\t| \"dazzled\"\n\t| \"undetected\"\n\t| \"hidden\"\n\t| \"concealed\"\n\t| \"magical-darkness\"\n\t| \"darkness\"\n\t| \"dim-light\"\n\t| \"lifesense\"\n\t| \"tremorsense\"\n\t| \"hearing\"\n\t| \"scent\"\n\t| \"bright-light\"\n\t| \"low-light-vision\"\n\t| \"darkvision\"\n\t| \"greater-darkvision\"\n\t| string\n\nconst importantSlugs = [\n\t\"invisible\",\n\t\"undetected\",\n\t\"magical-darkness\",\n\t\"blinded\",\n\t\"darkness\",\n\t\"hidden\",\n\t\"dazzled\",\n\t\"dim-light\",\n\t\"concealed\",\n] as const\n\nconst slugPriorities = new Map(importantSlugs.map((s, i) => [s, i]))\n\nexport interface VisibilityFactors {\n\tstate: \"observed\" | \"concealed\" | \"hidden\" | \"undetected\"\n\tlighting: \"bright\" | \"dim\" | \"darkness\" | \"magicalDarkness\" | \"greaterMagicalDarkness\" | string\n\treasons: string[]\n\tslugs: VisibilityFactorSlug[]\n}\n\nexport async function visionerAVSFlatCheck(\n\torigin: TokenDocumentPF2e,\n\ttarget: TokenDocumentPF2e,\n): Promise {\n\tconst factors: VisibilityFactors = await game.modules\n\t\t.get(\"pf2e-visioner\")\n\t\t// @ts-expect-error\n\t\t?.api.getVisibilityFactors(origin.id, target.id)\n\n\tif (factors && factors.state !== \"observed\") {\n\t\t// Visoner slugs are an array. Use highest priority slugs as origin\n\t\tconst sourceSlug = R.firstBy(factors.slugs, [(s) => slugPriorities.get(s) ?? Infinity, \"asc\"])\n\n\t\tconst source: TargetFlatCheckSource = {\n\t\t\ttype: factors.state,\n\t\t}\n\t\tif (sourceSlug) {\n\t\t\tsource.origin = { slug: sourceSlug }\n\t\t\tif (factors.reasons?.length) source.origin.reasons = factors.reasons\n\t\t}\n\n\t\treturn source\n\t}\n\n\treturn visionerVisibilityFlatCheck(origin, target)\n}\n\nexport function visionerVisibilityFlatCheck(\n\torigin: TokenDocumentPF2e,\n\ttarget: TokenDocumentPF2e,\n): TargetFlatCheckSource | null {\n\tconst visioneerApi:\n\t\t| { getVisibility: (observerId: string, targetId: string) => string | null }\n\t\t| undefined =\n\t\t// @ts-expect-error\n\t\tgame.modules.get(\"pf2e-visioner\")?.api\n\n\tif (visioneerApi) {\n\t\tconst condition = visioneerApi.getVisibility(origin.id, target.id)\n\n\t\tif (condition == null || condition === \"observed\" || !(condition in TargetConditionToDC))\n\t\t\treturn null\n\n\t\treturn { type: condition as TargetConditionSlug }\n\t}\n\treturn null\n}\n","import type { ActorPF2e, TokenDocumentPF2e, TokenPF2e } from \"@7h3laughingman/pf2e-types\"\nimport {\n\tActorTypesWithPerception,\n\tOriginToTargetCondition,\n\ttype TargetConditionSlug,\n\tTargetConditionToDC,\n} from \"./constants\"\nimport type { FlatCheckSource } from \"./data\"\nimport { tokenLightLevel } from \"./light/token\"\nimport { LightLevels } from \"./light/utils\"\nimport { flatMessageConfig } from \"./message-config\"\nimport type { Adjustments, TreatAsAdjustment } from \"./rules/common\"\nimport { visionerAVSFlatCheck, visionerVisibilityFlatCheck } from \"./visioner\"\n\nexport interface TargetFlatCheckSource extends Omit {\n\ttype: TargetConditionSlug\n\tconditionAdjustments?: TreatAsAdjustment[]\n}\n\nexport interface BaseTargetFlatCheck extends TargetFlatCheckSource {\n\tbaseDc: FlatCheckSource[\"baseDc\"]\n}\n\nexport function flatCheckDataForTarget(target: ActorPF2e): TargetFlatCheckSource | null {\n\tfor (const slug of [\"unnoticed\", \"undetected\", \"hidden\", \"concealed\"] as const) {\n\t\tif (target.conditions.bySlug(slug).length) return { type: slug }\n\t}\n\treturn null\n}\n\nexport function conditionFromLightLevel(\n\torigin: ActorPF2e | null,\n\ttoken: TokenPF2e,\n): TargetFlatCheckSource | null {\n\tlet hasDarkvision = false\n\tlet hasLowLightVision = false\n\tif (origin?.isOfType(\"creature\")) {\n\t\thasDarkvision = origin.hasDarkvision\n\t\tif (hasDarkvision) return null\n\n\t\thasLowLightVision = origin.hasLowLightVision\n\t}\n\n\tconst lightLevel = tokenLightLevel(token)\n\tif (lightLevel === LightLevels.DARK && !hasDarkvision)\n\t\treturn {\n\t\t\torigin: { slug: \"darkness\" },\n\t\t\ttype: \"hidden\",\n\t\t}\n\tif (lightLevel === LightLevels.DIM && !hasLowLightVision)\n\t\treturn {\n\t\t\torigin: { slug: \"dim-light\" },\n\t\t\ttype: \"concealed\",\n\t\t}\n\treturn null\n}\n\nexport function guessOrigin(): TokenDocumentPF2e | null {\n\tif (canvas.tokens.controlled.length === 1) {\n\t\tconst token = canvas.tokens.controlled[0]\n\t\treturn token.actor?.isOfType(\"creature\") ? token.document : null\n\t} else if (canvas.tokens.controlled.length > 1) {\n\t\treturn null\n\t}\n\tif (game.user.isGM) return null\n\n\t// If there is only one token on the scene the user owns, use that one\n\tlet token: TokenDocumentPF2e | null = null\n\tfor (const t of canvas.tokens.placeables) {\n\t\tif (!t.actor?.isOwner || !t.actor?.isOfType(\"creature\")) continue\n\t\tif (token) return null\n\t\ttoken = t.document\n\t}\n\treturn token\n}\n\nexport class TargetFlatCheckHelper {\n\tconstructor(\n\t\tprivate origin: TokenDocumentPF2e | null | undefined,\n\t\tprivate target: TokenDocumentPF2e,\n\t\tprivate adjustments: Adjustments,\n\t\tprivate rollOptions: string[],\n\t) {}\n\tstatic useVisionerAVS(): boolean {\n\t\treturn (\n\t\t\t// @ts-expect-error\n\t\t\ttypeof game.modules.get(\"pf2e-visioner\")?.api?.getVisibilityFactors === \"function\" &&\n\t\t\t(game.settings.get(\"pf2e-visioner\", \"autoVisibilityEnabled\") as boolean)\n\t\t)\n\t}\n\n\t#collectOriginSources() {\n\t\tconst sources: TargetFlatCheckSource[] = []\n\t\tfor (const slug of [\"blinded\", \"dazzled\"] as const) {\n\t\t\tif (this.origin?.actor?.conditions.bySlug(slug).length)\n\t\t\t\tsources.push({ type: OriginToTargetCondition[slug], origin: { slug } })\n\t\t}\n\n\t\treturn sources\n\t}\n\n\t#collectTargetSources() {\n\t\tconst sources: TargetFlatCheckSource[] = []\n\t\tfor (const slug of [\"unnoticed\", \"undetected\", \"hidden\", \"concealed\"] as const) {\n\t\t\tif (this.target.actor?.conditions.bySlug(slug).length) sources.push({ type: slug })\n\t\t}\n\n\t\tif (this.target.actor?.conditions.bySlug(\"invisible\").length) {\n\t\t\tsources.push({ type: \"hidden\", origin: { slug: \"invisible\" } })\n\t\t}\n\n\t\treturn sources\n\t}\n\n\t#collectMergedSources() {\n\t\tconst sources: TargetFlatCheckSource[] = []\n\n\t\tif (this.origin && this.target) {\n\t\t\tconst visioneerCheck = visionerVisibilityFlatCheck(this.origin, this.target)\n\t\t\tif (visioneerCheck) sources.push(visioneerCheck)\n\t\t}\n\n\t\tif (\n\t\t\tthis.origin?.actor &&\n\t\t\tthis.target.object &&\n\t\t\tflatMessageConfig.toSets().experimental.has(\"light-level\") &&\n\t\t\tActorTypesWithPerception.includes(this.origin.actor.type)\n\t\t) {\n\t\t\tconst lightCheck = conditionFromLightLevel(this.origin?.actor ?? null, this.target.object)\n\t\t\tif (lightCheck) sources.push(lightCheck)\n\n\t\t\tif (this.origin.level !== this.target.level) {\n\t\t\t\tsources.push({\n\t\t\t\t\ttype: \"unknown\",\n\t\t\t\t\torigin: {\n\t\t\t\t\t\tslug: \"scene-level\",\n\t\t\t\t\t\tlabel: \"Levels\",\n\t\t\t\t\t\twarning: \"warning.differentLevels\",\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\treturn sources\n\t}\n\n\t#collectExtraConditions(): TargetFlatCheckSource[] {\n\t\tconst treatObservedAs = this.adjustments.treatObservedAs(this.rollOptions)\n\t\treturn treatObservedAs ? [treatObservedAs] : []\n\t}\n\n\tasync #collectVisionerAVSSource(): Promise {\n\t\tconst origin = this.origin\n\t\tif (!origin) return []\n\n\t\tconst check = await visionerAVSFlatCheck(origin, this.target)\n\t\tif (!check) return []\n\t\treturn [check]\n\t}\n\n\tasync collectedSources() {\n\t\tif (flatMessageConfig.toSets().ignored.has(\"target\")) return []\n\n\t\tconst collectors = TargetFlatCheckHelper.useVisionerAVS()\n\t\t\t? [this.#collectVisionerAVSSource()]\n\t\t\t: [\n\t\t\t\t\tthis.#collectOriginSources(),\n\t\t\t\t\tthis.#collectTargetSources(),\n\t\t\t\t\tthis.#collectMergedSources(),\n\t\t\t\t\tthis.#collectExtraConditions(),\n\t\t\t\t]\n\n\t\tconst merged = (await Promise.all(collectors)).flat()\n\n\t\tconst sources: BaseTargetFlatCheck[] = []\n\n\t\tfor (const source of merged) {\n\t\t\tconst check: BaseTargetFlatCheck = {\n\t\t\t\t...source,\n\t\t\t\tbaseDc: TargetConditionToDC[source.type],\n\t\t\t}\n\t\t\tconst adjustments = this.adjustments.getTreatAsAdjustments(check, this.rollOptions)\n\t\t\tconst last = adjustments?.at(-1)\n\t\t\tif (last?.new === \"observed\") continue\n\n\t\t\tif (last) {\n\t\t\t\tcheck.type = last.new\n\t\t\t\tcheck.conditionAdjustments = [check.conditionAdjustments ?? [], adjustments!].flat()\n\t\t\t\tcheck.baseDc = TargetConditionToDC[check.type]\n\t\t\t}\n\n\t\t\tsources.push(check)\n\t\t}\n\n\t\treturn sources\n\t}\n}\n","import type { ActorPF2e, ChatMessagePF2e, TokenDocumentPF2e } from \"@7h3laughingman/pf2e-types\"\nimport * as R from \"remeda\"\nimport { SYSTEM } from \"src/utils\"\nimport type { MsgFlagData } from \"./message\"\nimport { flatMessageConfig } from \"./message-config\"\nimport { Adjustments, type DcAdjustment, type TreatAsAdjustment } from \"./rules/common\"\nimport { flatCheckRollOptions } from \"./rules/options\"\nimport { type BaseTargetFlatCheck, TargetFlatCheckHelper } from \"./target\"\n\nexport interface FlatCheckSource {\n\ttype: string\n\torigin?: { label?: string; slug: string; reasons?: string[]; warning?: string }\n\tbaseDc: number | null\n}\n\nexport interface FlatCheckData extends FlatCheckSource {\n\tfinalDc: number | null\n\tdcAdjustments?: DcAdjustment[]\n\tconditionAdjustments?: TreatAsAdjustment[]\n\tsecret?: true\n}\n\nexport type FlatCheckRecord = Record\n\nexport async function collectFlatChecks(msg: ChatMessagePF2e): Promise {\n\tif (!msg.author) return null\n\n\tif (msg.target?.token) {\n\t\treturn FlatCheckHelper.fromMessage(msg, msg.target.token)\n\t}\n\n\tconst checks = game.user.targets.size\n\t\t? [...game.user.targets].map((t) => FlatCheckHelper.fromMessage(msg, t.document))\n\t\t: [FlatCheckHelper.fromMessage(msg)]\n\tif (checks.length === 0) return null\n\tif (checks.length === 1) return checks[0]\n\n\tconst merged: MsgFlagData = {}\n\tlet targetCount = 0\n\tfor (const check of checks) {\n\t\tfor (const [key, slot] of Object.entries(await check)) {\n\t\t\tif (slot.finalDc == null || slot.finalDc <= 1) continue\n\t\t\tif (key === \"target\") {\n\t\t\t\ttargetCount++\n\t\t\t} else if ((merged[key]?.finalDc ?? 0) < slot.finalDc) {\n\t\t\t\tmerged[key] = slot\n\t\t\t}\n\t\t}\n\t}\n\n\tif (targetCount > 0) {\n\t\tmerged.target = { targetCount }\n\t}\n\n\treturn merged\n}\n\nexport class FlatCheckHelper {\n\tstatic fromMessage(msg: ChatMessagePF2e, target?: TokenDocumentPF2e) {\n\t\tif (!msg.actor) throw new Error(\"Message has no actor\")\n\n\t\tconst msgTarget = msg.target?.token\n\t\tif (msgTarget && target && msgTarget !== target)\n\t\t\tthrow new Error(\n\t\t\t\t`fromMessage called with a target (${target.uuid}) that doesn't match the message's target (${msgTarget.uuid})`,\n\t\t\t)\n\n\t\tconst checkTarget = msgTarget ?? target\n\n\t\tconst instance = new FlatCheckHelper(msg, checkTarget ?? null)\n\t\treturn instance.calculateChecks()\n\t}\n\n\tstatic fromTokens(origin: TokenDocumentPF2e | null, target: TokenDocumentPF2e | null) {\n\t\tconst instance = new FlatCheckHelper(origin, target)\n\t\treturn instance.calculateChecks()\n\t}\n\n\tprivate adjustments: Adjustments\n\tprivate msg?: ChatMessagePF2e\n\tprivate token?: TokenDocumentPF2e\n\tprivate actor?: ActorPF2e\n\n\tprivate rollOptions: string[]\n\tconstructor(\n\t\torigin: ChatMessagePF2e | TokenDocumentPF2e | null,\n\t\tprivate target: TokenDocumentPF2e | null,\n\t) {\n\t\tif (origin instanceof getDocumentClass(\"ChatMessage\")) {\n\t\t\tthis.msg = origin\n\t\t\tif (!origin.token) throw new Error(\"Message has no token\")\n\t\t\tthis.token = origin.token\n\t\t\tif (!this.token.actor) throw new Error(\"Token has no actor\")\n\t\t\tthis.actor = this.token.actor\n\t\t} else if (origin instanceof getDocumentClass(\"Token\")) {\n\t\t\tthis.token = origin\n\t\t\tif (!this.token.actor) throw new Error(\"Token has no actor\")\n\t\t\tthis.actor = this.token.actor\n\t\t}\n\n\t\tlet options: string[] = []\n\t\tif (this.msg) options = flatCheckRollOptions.forRollMessage(this.msg)\n\t\tif (options.length === 0)\n\t\t\toptions = flatCheckRollOptions.forMixed({\n\t\t\t\tmsg: this.msg,\n\t\t\t\torigin: this.token,\n\t\t\t\ttarget: this.target ?? undefined,\n\t\t\t})\n\n\t\toptions.push(\n\t\t\t...flatCheckRollOptions.lightLevelOptions({\n\t\t\t\tmsg: this.msg,\n\t\t\t\tself: this.token?.object,\n\t\t\t\ttarget: this.target?.object,\n\t\t\t}),\n\t\t)\n\n\t\tthis.rollOptions = options\n\n\t\tthis.adjustments = new Adjustments(this.actor ?? null, this.target?.actor ?? null)\n\t}\n\n\t#collectOriginSources() {\n\t\tconst sources: FlatCheckSource[] = []\n\n\t\tconst { ignored } = flatMessageConfig.toSets()\n\n\t\tif (this.actor && this.msg) {\n\t\t\tif (\n\t\t\t\t!ignored.has(\"manipulate\") &&\n\t\t\t\tthis.actor.conditions.stored.some((c) => c.slug === \"grabbed\") &&\n\t\t\t\tthis.msg.item?.system.traits.value?.some((t) => t === \"manipulate\")\n\t\t\t) {\n\t\t\t\tsources.push({ type: \"grabbed\", origin: { slug: \"manipulate\" }, baseDc: 5 })\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\t!ignored.has(\"deafened\") &&\n\t\t\t\tthis.actor.conditions.stored.some((c) => c.slug === \"deafened\") &&\n\t\t\t\tthis.msg.item?.system.traits.value?.some((t) => t === \"auditory\")\n\t\t\t) {\n\t\t\t\tsources.push({ type: \"deafened\", origin: { slug: \"auditory\" }, baseDc: 5 })\n\t\t\t}\n\t\t\tif (\n\t\t\t\t!ignored.has(\"deafened-spellcasting\") &&\n\t\t\t\tthis.actor.conditions.stored.some((c) => c.slug === \"deafened\") &&\n\t\t\t\tthis.msg.flags?.[SYSTEM.id]?.origin?.type === \"spell\" &&\n\t\t\t\t!this.msg.item?.system.traits.value?.some((t) => t === \"subtle\")\n\t\t\t) {\n\t\t\t\tsources.push({ type: \"deafened\", origin: { slug: \"spell\" }, baseDc: 5 })\n\t\t\t}\n\n\t\t\tif (!ignored.has(\"stupefied\") && this.msg.flags?.[SYSTEM.id]?.origin?.type === \"spell\") {\n\t\t\t\tconst stupefied = this.actor.conditions.stupefied?.value\n\t\t\t\tif (stupefied) {\n\t\t\t\t\tsources.push({ type: \"stupefied\", origin: { slug: \"spell\" }, baseDc: 5 + stupefied })\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn sources\n\t}\n\n\t#collectTargetSources() {\n\t\tif (!this.target) return []\n\n\t\tconst helper = new TargetFlatCheckHelper(\n\t\t\tthis.token,\n\t\t\tthis.target,\n\t\t\tthis.adjustments,\n\t\t\tthis.rollOptions,\n\t\t)\n\t\tconst sources = helper.collectedSources()\n\t\treturn sources\n\t}\n\n\t#collectAdditionalSources() {\n\t\treturn this.adjustments.getAdditionalSources(this.rollOptions)\n\t}\n\n\tasync calculateChecks() {\n\t\tconst slots: Record & { target: BaseTargetFlatCheck[] } = {\n\t\t\ttarget: [],\n\t\t}\n\n\t\tfor (const source of this.#collectOriginSources()) {\n\t\t\tconst key = source.type\n\t\t\tif (key in slots) slots[key].push(source)\n\t\t\telse slots[key] = [source]\n\t\t}\n\n\t\tfor (const source of this.#collectAdditionalSources()) {\n\t\t\tconst key = source.slot\n\t\t\tif (key in slots) slots[key].push(source)\n\t\t\telse slots[key] = [source]\n\t\t}\n\n\t\tfor (const source of await this.#collectTargetSources()) {\n\t\t\tslots.target.push(source)\n\t\t}\n\n\t\tconst checks: FlatCheckRecord = {}\n\t\tfor (const [k, v] of Object.entries(slots)) {\n\t\t\tconst check = this.#sourcesToHighestCheck(v)\n\t\t\tif (check) {\n\t\t\t\tchecks[k] = check\n\t\t\t\tif ([\"undetected\", \"unnoticed\"].includes(check.type)) {\n\t\t\t\t\tcheck.secret = true\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn checks\n\t}\n\n\t#sourcesToHighestCheck(\n\t\tsources: FlatCheckSource[] | BaseTargetFlatCheck[],\n\t): FlatCheckData | undefined {\n\t\treturn R.pipe(\n\t\t\tsources,\n\t\t\tR.map((s) => {\n\t\t\t\tconst options = [this.rollOptions, flatCheckRollOptions.forCheck(s)].flat()\n\n\t\t\t\tif (s.baseDc == null)\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...s,\n\t\t\t\t\t\tfinalDc: null,\n\t\t\t\t\t}\n\n\t\t\t\tconst { finalDc, adjustments } = this.adjustments.getDcAdjustment(s.type, options, s.baseDc)\n\t\t\t\treturn {\n\t\t\t\t\t...s,\n\t\t\t\t\tfinalDc: finalDc,\n\t\t\t\t\tdcAdjustments: adjustments,\n\t\t\t\t}\n\t\t\t}),\n\t\t\tR.firstBy([(d) => d.finalDc ?? Infinity, \"desc\"]),\n\t\t)\n\t}\n}\n","export function localizeType(type: string) {\n\tconst capitalized = type.capitalize()\n\tfor (const key of [\n\t\t`PF2E.ConditionType${capitalized}`,\n\t\t`PF2E.Trait${capitalized}`,\n\t\t`pf2e-fc.common.${type}`,\n\t]) {\n\t\tconst t = tryTranslate(key)\n\t\tif (t) return t\n\t}\n\n\treturn titleCase(type)\n}\n\nexport function localizeOrigin(origin: { slug: string; label?: string }) {\n\tconst t = tryTranslate(`pf2e-fc.flat.source.${origin.slug}`)\n\tif (t) return t\n\n\treturn origin.label ?? titleCase(origin.slug)\n}\n\nfunction tryTranslate(key: string) {\n\tconst t = game.i18n.localize(key)\n\tif (t === key) return null\n\treturn t\n}\n\nfunction titleCase(s: string) {\n\treturn s.replace(/\\w\\S*/g, (t) => {\n\t\treturn t.charAt(0).toUpperCase() + t.substring(1).toLowerCase()\n\t})\n}\n","import type { ChatMessagePF2e, ChatMessageSourcePF2e, SpellPF2e } from \"@7h3laughingman/pf2e-types\"\nimport { MODULE_ID } from \"src/constants\"\nimport MODULE from \"src/index\"\nimport { parseHTML, SYSTEM, translate } from \"src/utils\"\nimport { BaseModule } from \"../base\"\nimport { ActorTypesWithPerception } from \"./constants\"\nimport { collectFlatChecks, type FlatCheckData } from \"./data\"\nimport { localizeOrigin, localizeType } from \"./i18n\"\nimport { tokenExposureCache } from \"./light/token\"\nimport type { TreatAsAdjustment } from \"./rules/common\"\n\nexport class MessageFlatCheckModule extends BaseModule {\n\tsettingsKey = \"flat-check-in-message\"\n\n\tenable() {\n\t\tif (!game.modules.get(\"lib-wrapper\")?.active) return\n\t\tsuper.enable()\n\n\t\t// this.registerHook(\"preCreateChatMessage\", preCreateMessage)\n\t\t// this.registerHook(\"createChatMessage\", onCreateChatMessage)\n\t\tthis.registerWrapper(\"ChatMessage.prototype._preCreate\", messagePreCreateWrapper, \"WRAPPER\")\n\t\tthis.registerWrapper(\"ChatMessage.prototype.renderHTML\", messageRenderHTMLWrapper, \"WRAPPER\")\n\t\tthis.registerChatAction(\"fc-reveal-hidden-message\", handleRevealClick)\n\n\t\ttokenExposureCache.enable()\n\t}\n\tdisable() {\n\t\tsuper.disable()\n\t}\n}\n\ntype RerollModes = \"low\" | \"high\" | \"hero\" | \"new\"\nconst REROLL_ICONS: Record = {\n\thero: \"fa-solid fa-hospital-symbol\",\n\tnew: \"fa-solid fa-dice\",\n\tlow: \"fa-solid fa-dice-one\",\n\thigh: \"fa-solid fa-dice-six\",\n}\n\ninterface MsgFlagCheckData extends FlatCheckData {\n\troll?: number\n\treroll?: {\n\t\toldRoll: number\n\t\tkeep: RerollModes\n\t}\n}\n\ninterface MsgFlagTargetCountData {\n\ttargetCount: number\n}\n\nexport type MsgFlagData = Record & {\n\ttarget?: MsgFlagCheckData | MsgFlagTargetCountData\n}\n\nexport async function messagePreCreateWrapper(this: ChatMessagePF2e, wrapper, ...args) {\n\tconst data: any = await wrapper(...args)\n\n\ttry {\n\t\tif ((await preCreateMessage(this)) === false) return false\n\t} catch (e) {\n\t\tconsole.error(\"Exception occured in message _preCreate wrapper: \", e)\n\t}\n\n\treturn data\n}\n\nexport async function messageRenderHTMLWrapper(this: ChatMessagePF2e, wrapper, ...args) {\n\tconst html: HTMLElement = await wrapper(...args)\n\n\ttry {\n\t\tif (this.isContentVisible) {\n\t\t\tif (this.flags[MODULE_ID]?.hiddenMsg != null) renderHiddenRollMessage(this, html)\n\t\t\tawait renderButtons(this, html)\n\t\t}\n\t} catch (e) {\n\t\tconsole.error(\"Exception occured while rendering message flat-check buttons: \", e)\n\t}\n\n\treturn html\n}\n\nasync function renderButtons(msg: ChatMessagePF2e, html: HTMLElement) {\n\tinterface ButtonData {\n\t\tkey: string\n\t\ttype: string\n\t\torigin?: { slug: string; label?: string }\n\t\tbaseDc: number | null\n\t\tfinalDc: number | null\n\t\treasons?: string[]\n\t\tconditionAdjustments?: TreatAsAdjustment[]\n\t\twarning?: string\n\t\tdcAdjustments?: string\n\t\trolls: { class: string; value: number }[]\n\t\trerollIcon?: string\n\t\tsecret?: \"gm\" | \"hide\"\n\t\trollButton: string\n\t}\n\tinterface NoteData {\n\t\ticon: string\n\t\ttext: string\n\t}\n\n\tfunction checkToData(key: string, check: MsgFlagCheckData): ButtonData {\n\t\tconst rollData: { class: string; value: number }[] = []\n\t\tconst rolls: [number | undefined, number | undefined] = [check.reroll?.oldRoll, check.roll]\n\n\t\tlet rollClasses: [string, string] = [\"strikethrough\", \"strikethrough\"]\n\t\tif (check.finalDc == null) {\n\t\t\trollClasses = [\"\", \"\"]\n\t\t\tif (check.reroll?.keep && [\"hero\", \"new\"].includes(check.reroll?.keep)) {\n\t\t\t\trollClasses[0] = \"strikethrough\"\n\t\t\t}\n\t\t} else if (check.reroll?.keep === \"high\") {\n\t\t\tconst higherIndex = check.reroll.oldRoll < check.roll! ? 1 : 0\n\t\t\tconst outcome = rolls[higherIndex]! >= check.finalDc ? \"success\" : \"failure\"\n\t\t\trollClasses[higherIndex] = outcome\n\t\t} else if (check.reroll?.keep === \"low\") {\n\t\t\tconst lowerIndex = check.reroll.oldRoll > check.roll! ? 1 : 0\n\t\t\tconst outcome = rolls[lowerIndex]! >= check.finalDc ? \"success\" : \"failure\"\n\t\t\trollClasses[lowerIndex] = outcome\n\t\t} else {\n\t\t\tconst outcome = check.roll ? (check.roll >= check.finalDc ? \"success\" : \"failure\") : \"\"\n\t\t\trollClasses[1] = outcome\n\t\t}\n\n\t\tif (check.reroll?.oldRoll) {\n\t\t\trollData.push({ class: rollClasses[0], value: check.reroll.oldRoll })\n\t\t}\n\t\tif (check.roll) {\n\t\t\trollData.push({ class: rollClasses[1], value: check.roll })\n\t\t}\n\n\t\tlet rollButton = \"hide\"\n\t\tif (check.finalDc != null && check.finalDc <= 1) rollButton = \"auto\"\n\t\telse if (check.finalDc != null && check.finalDc >= 20) rollButton = \"impossible\"\n\t\telse if (msg.canUserModify(game.user, \"update\") && !check.reroll) rollButton = \"show\"\n\n\t\tconst secret = check.secret && (game.user.isGM ? \"gm\" : \"hide\")\n\t\tif (secret && !msg.hasPlayerOwner && game.user.isGM) rollButton = \"gm-only\"\n\n\t\treturn {\n\t\t\tkey,\n\t\t\tbaseDc: check.baseDc,\n\t\t\tfinalDc: check.finalDc,\n\t\t\tdcAdjustments: check.dcAdjustments?.map((a) => `${a.label}: ${a.value}`).join(\"
\"),\n\t\t\ttype: check.type,\n\t\t\treasons: check.origin?.reasons,\n\t\t\tconditionAdjustments: check.conditionAdjustments,\n\t\t\twarning: check.origin?.warning,\n\t\t\torigin: check.origin,\n\t\t\trolls: rollData,\n\t\t\trerollIcon: check.reroll?.keep ? REROLL_ICONS[check.reroll?.keep] : undefined,\n\t\t\tsecret,\n\t\t\trollButton,\n\t\t}\n\t}\n\n\tfunction targetCountToData(key: string, check: MsgFlagTargetCountData): NoteData {\n\t\treturn {\n\t\t\ticon: \"fa-solid fa-circle-question\",\n\t\t\ttext: translate(\"flat.message.button-require-flat-check\", { count: check.targetCount }),\n\t\t}\n\t}\n\n\t// @ts-expect-error\n\tif (msg.flags[\"pf2e-toolbelt\"]?.targetHelper?.type === \"check\") return\n\tconst data = msg.flags[MODULE_ID]?.flatchecks as MsgFlagData | undefined\n\tif (!data) return\n\n\tconst buttons: ButtonData[] = []\n\tconst notes: NoteData[] = []\n\n\tfor (const [key, check] of Object.entries(data)) {\n\t\tif (\"type\" in check) {\n\t\t\tbuttons.push(checkToData(key, check))\n\t\t} else if (\"targetCount\" in check) {\n\t\t\tnotes.push(targetCountToData(key, check))\n\t\t}\n\t}\n\n\tif (buttons.length || notes.length) {\n\t\tconst renderData = {\n\t\t\tbuttons,\n\t\t\tnotes,\n\t\t\ti18n: (key: string) => {\n\t\t\t\treturn translate(`flat.${key}`)\n\t\t\t},\n\t\t\tlocalizeType: localizeType,\n\t\t\tlocalizeOrigin: localizeOrigin,\n\t\t}\n\n\t\tconst buttonHtml = await foundry.applications.handlebars.renderTemplate(\n\t\t\t\"modules/pf2e-flatcheck-helper/templates/flat-check-buttons.hbs\",\n\t\t\trenderData,\n\t\t)\n\n\t\tconst buttonNode = parseHTML(buttonHtml)\n\n\t\tif (data.grabbed && data.stupefied) {\n\t\t\tconst note = parseHTML(`
\n\t\t\t\t\t\n\t\t\t\t
`)\n\t\t\tbuttonNode.append(note)\n\t\t}\n\t\t;(() => {\n\t\t\tlet section: Element | null | undefined = html.querySelector(\"section.card-buttons\")\n\t\t\tif (section) {\n\t\t\t\tsection.append(buttonNode)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tsection = [...html.querySelectorAll(\"div.dice-roll\")].at(-1)\n\t\t\tif (section) {\n\t\t\t\tsection.after(buttonNode)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tsection = html.querySelector(\"footer\")\n\t\t\tif (section) {\n\t\t\t\tsection.before(buttonNode)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tsection = html.querySelector(\"div.message-buttons\")\n\t\t\tif (section) {\n\t\t\t\tsection.before(buttonNode)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tsection = html.querySelector(\"div.message-content\")\n\t\t\tif (section) {\n\t\t\t\tsection.append(buttonNode)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tconsole.error(\"Could not insert flat check buttons into message.\", msg)\n\t\t})()\n\n\t\thtml.addEventListener(\"click\", (event) => {\n\t\t\tconst element = event.target\n\t\t\tif (\n\t\t\t\telement instanceof HTMLElement &&\n\t\t\t\telement.matches('button[data-action=\"roll-flatcheck\"]')\n\t\t\t) {\n\t\t\t\tconst key = element.dataset.key!\n\t\t\t\tconst dc = Number(element.dataset.dc)\n\t\t\t\thandleFlatButtonClick(msg, key, dc)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunction renderHiddenRollMessage(msg: ChatMessagePF2e, html: HTMLElement) {\n\tconst allowReveal = game.user.isGM || MODULE.settings.flatPlayersCanReveal\n\tconst disabled = allowReveal ? \"\" : \"disabled\"\n\tconst tooltip = allowReveal\n\t\t? \"\"\n\t\t: `data-tooltip=\"${translate(\"flat.message.hide.disabled-tooltip\")}\"`\n\n\tconst buttons = parseHTML(`\n\t\t
\n\t\t\t\n\t\t
`)\n\n\thtml.querySelector(\".fc-dice-placeholder\")?.after(buttons)\n}\n\nfunction shouldShowFlatChecks(msg: ChatMessagePF2e): boolean {\n\tconst contextType = msg.flags?.[SYSTEM.id]?.context?.type\n\tconst blacklist: (typeof contextType)[] = [\n\t\t\"damage-roll\",\n\t\t\"damage-taken\",\n\t\t\"flat-check\",\n\t\t\"initiative\",\n\t\t\"saving-throw\",\n\t]\n\n\tif (contextType && blacklist.includes(contextType)) return false\n\n\t// If the spell has an attack roll, don't show flat checks on the spell card, but only on the attack roll itself\n\tif (contextType === \"spell-cast\") return (msg.item as SpellPF2e).isAttack === msg.isRoll\n\n\tconst context = msg.flags?.[SYSTEM.id]?.context\n\t// If message is a roll, only show flat checks if it has a DC\n\tif (msg.isRoll) return !!context && \"dc\" in context\n\n\tif (!msg.item) return false\n\n\treturn msg.item.isOfType(\"action\", \"consumable\", \"equipment\", \"feat\", \"melee\", \"spell\", \"weapon\")\n}\n\nexport async function preCreateMessage(msg: ChatMessagePF2e) {\n\tif (!msg.actor || !shouldShowFlatChecks(msg) || msg.flags[MODULE_ID]?.revealed) {\n\t\tif (msg.isRoll && game.modules.get(\"xdy-pf2e-workbench\")?.active) {\n\t\t\t// Disable auto roll when manually revealed\n\t\t\tmsg.updateSource({ \"flags.xdy-pf2e-workbench.noAutoDamageRoll\": true })\n\t\t}\n\t\treturn\n\t}\n\n\tconst data = (await collectFlatChecks(msg)) as MsgFlagData\n\n\tif (data != null && Object.keys(data).length) {\n\t\tmsg.updateSource({\n\t\t\t[`flags.${MODULE_ID}.flatchecks`]: data,\n\t\t})\n\n\t\tif (MODULE.settings.flatAutoRoll && !msg.isReroll) {\n\t\t\tconst rollUpdates = await autoRoll(msg)\n\t\t\tmsg.updateSource(rollUpdates)\n\t\t}\n\n\t\tconst passedChecks = passedAllFlatChecks(msg)\n\t\tconst shouldHide =\n\t\t\tMODULE.settings.flatHideRoll &&\n\t\t\tActorTypesWithPerception.includes(msg.actor.type) &&\n\t\t\t(!MODULE.settings.flatAutoReveal || !passedChecks)\n\n\t\tif (shouldHide && msg.isCheckRoll && !msg.isReroll) {\n\t\t\tconst flavorEl = parseHTML(msg.flavor)\n\t\t\tfor (const selector of [\"div.result.degree-of-success\", \"ul.notes\"]) {\n\t\t\t\tflavorEl.querySelector(selector)?.remove()\n\t\t\t}\n\t\t\tconst flavorText = new XMLSerializer().serializeToString(flavorEl)\n\n\t\t\tgetDocumentClass(\"ChatMessage\").create({\n\t\t\t\tauthor: msg.author?.id,\n\t\t\t\tspeaker: msg.speaker,\n\t\t\t\tsound: (MODULE.settings.flatAutoRoll ? CONFIG.sounds.dice : CONFIG.sounds.lock) as any,\n\t\t\t\tcontent: `\n\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t\t\t${flavorText}\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t\t

\n\t\t\t\t\t\n\t\t\t\t

\n\t\t\t`,\n\t\t\t\tflags: {\n\t\t\t\t\t[MODULE_ID]: {\n\t\t\t\t\t\thiddenMsg: msg.toJSON(),\n\t\t\t\t\t\tflatchecks: msg.flags[MODULE_ID].flatchecks as JSONValue,\n\t\t\t\t\t},\n\t\t\t\t\t\"xdy-pf2e-workbench\": {\n\t\t\t\t\t\tnoAutoDamageRoll: true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t})\n\n\t\t\treturn false\n\t\t}\n\n\t\tif (!passedChecks && game.modules.get(\"xdy-pf2e-workbench\")?.active) {\n\t\t\tmsg.updateSource({ \"flags.xdy-pf2e-workbench.noAutoDamageRoll\": true })\n\t\t}\n\t}\n}\n\nasync function autoRoll(msg: ChatMessagePF2e) {\n\tconst data = msg.flags[MODULE_ID]?.flatchecks as MsgFlagData | undefined\n\tif (!data) return\n\tconst updates: Record = {}\n\n\tfor (const [key, check] of Object.entries(data)) {\n\t\tif (!(\"finalDc\" in check)) continue\n\t\tif (check.finalDc == null || check.finalDc <= 1 || check.finalDc >= 20) continue\n\n\t\tconst roll = await new Roll(\"1d20\").roll()\n\t\tmsg.rolls.push(roll)\n\t\tupdates[`flags.${MODULE_ID}.flatchecks.${key}.roll`] = roll.total\n\n\t\temitDiceSoNiceRoll({\n\t\t\tmsgId: msg.id,\n\t\t\tuserId: game.user.id,\n\t\t\trolls: JSON.stringify([roll]),\n\t\t})\n\t\tawait addRollToTracker(msg, check, roll.total, !!check?.reroll)\n\t}\n\n\treturn updates\n}\n\nfunction passedAllFlatChecks(msg: ChatMessagePF2e, passIfNoChecks = true) {\n\tconst checks = msg.flags[MODULE_ID]?.flatchecks as MsgFlagData | undefined\n\tif (checks == null || Object.keys(checks).length === 0) return passIfNoChecks\n\n\tfor (const check of Object.values(checks)) {\n\t\tif (!(\"finalDc\" in check)) continue\n\t\t// Unknown or impossible check\n\t\tif (check.finalDc == null || check.finalDc >= 20) return false\n\t\t// Auto-success\n\t\tif (check.finalDc <= 1) continue\n\n\t\t// Player doesn't know if roll succeeded without GM saying so\n\t\tif (check.secret && (msg.hasPlayerOwner || !game.user.isGM)) return false\n\n\t\tlet roll = check.roll\n\t\tif (roll == null) return false\n\n\t\tif (check.reroll) {\n\t\t\tconst keep = check.reroll.keep\n\t\t\tconst oldRoll = check.reroll.oldRoll\n\t\t\tif (keep === \"low\") roll = Math.min(oldRoll, roll)\n\t\t\telse if (keep === \"high\") roll = Math.max(oldRoll, roll)\n\t\t}\n\n\t\tif (roll < check.finalDc) return false\n\t}\n\treturn true\n}\n\ninterface SocketData {\n\tmsgId: string\n\tuserId: string\n\trolls: string\n}\n\nasync function addRollToTracker(\n\tmsg: ChatMessagePF2e,\n\tcheck: MsgFlagCheckData | undefined,\n\troll: number,\n\tisReroll: boolean,\n) {\n\t// @ts-expect-error\n\tconst toolBelt = game.toolbelt\n\tif (!toolBelt || !check) return\n\n\tif (!game.settings.get(\"pf2e-toolbelt\", \"rollTracker.enabled\")) return\n\n\tconst outcome = check.finalDc == null ? undefined : roll >= check.finalDc ? \"success\" : \"failure\"\n\n\tconst currentData = (game.settings.get(\"pf2e-toolbelt\", \"rollTracker.userRolls\") as any[]).slice()\n\n\tcurrentData.push({\n\t\tvalue: roll,\n\t\ttime: Date.now(),\n\t\ttype: \"flat-check\",\n\t\tisPrivate: !!check.secret,\n\t\tisReroll,\n\t\tactor: msg.actor?.id,\n\t\tencounter: game.combat?.id,\n\t\tsession: game.settings.get(\"pf2e-toolbelt\", \"rollTracker.session\"),\n\t\toutcome,\n\t\tmodifier: \"flat\",\n\t})\n\n\tawait game.settings.set(\"pf2e-toolbelt\", \"rollTracker.userRolls\", currentData)\n}\n\nfunction emitDiceSoNiceRoll(data: SocketData) {\n\t// @ts-expect-error\n\tif (!game.dice3d) return\n\n\tconst user = game.users.get(data.userId)\n\tif (!user) return\n\n\tfor (const rollJson of JSON.parse(data.rolls)) {\n\t\tconst roll = Roll.fromData(rollJson)\n\t\t// @ts-expect-error\n\t\tgame.dice3d.showForRoll(roll, user, true, null, false, data.msgId)\n\t}\n}\n\nasync function handleFlatButtonClick(msg: ChatMessagePF2e, key: string, dc: number) {\n\tconst roll = await new Roll(\"d20\").roll()\n\tconst oldRoll = foundry.utils.getProperty(msg, `flags.${MODULE_ID}.flatchecks.${key}.roll`)\n\tconst check = foundry.utils.getProperty(msg, `flags.${MODULE_ID}.flatchecks.${key}`) as\n\t\t| MsgFlagCheckData\n\t\t| undefined\n\n\tconst updates: Record = {}\n\n\tif (!oldRoll) {\n\t\tupdates[`flags.${MODULE_ID}.flatchecks.${key}.roll`] = roll.total\n\t} else {\n\t\tlet heroPoints = 0\n\t\tif (msg.actor?.isOfType(\"character\")) {\n\t\t\theroPoints = msg.actor?.system.resources.heroPoints.value\n\t\t}\n\n\t\tawait foundry.applications.api.DialogV2.wait({\n\t\t\tid: `${MODULE_ID}.flatcheck.reroll`,\n\t\t\twindow: { title: \"PF2e Utility Buttons\" },\n\t\t\tcontent: `\n\t\t\t\t${heroPoints > 0 ? `` : \"\"}\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t`,\n\t\t\tbuttons: [\n\t\t\t\t{\n\t\t\t\t\taction: \"submit\",\n\t\t\t\t\ticon: \"fa-solid fa-rotate rotate\",\n\t\t\t\t\tlabel: translate(\"flat.message.button-reroll\"),\n\t\t\t\t\tdefault: true,\n\t\t\t\t\t// @ts-expect-error\n\t\t\t\t\tcallback: (event, button, dialog) => button.form.elements.choice.value,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\taction: \"cancel\",\n\t\t\t\t\ticon: \"fas fa-times\",\n\t\t\t\t\tlabel: translate(\"flat.message.button-cancel\"),\n\t\t\t\t},\n\t\t\t],\n\t\t\tsubmit: async (result) => {\n\t\t\t\tif (result === \"cancel\") return\n\n\t\t\t\tif (result === \"hero\" && msg.actor?.isOfType(\"character\")) {\n\t\t\t\t\tconst { value, max } = msg.actor.system.resources.heroPoints\n\t\t\t\t\tawait msg.actor?.update({\n\t\t\t\t\t\t\"system.resources.heroPoints.value\": Math.clamp(value - 1, 0, max),\n\t\t\t\t\t})\n\t\t\t\t}\n\n\t\t\t\tupdates[`flags.${MODULE_ID}.flatchecks.${key}.roll`] = roll.total\n\t\t\t\tupdates[`flags.${MODULE_ID}.flatchecks.${key}.reroll`] = { oldRoll, keep: result }\n\t\t\t},\n\t\t})\n\t}\n\n\tif (Object.keys(updates).length > 0) {\n\t\t// Add the roll to the message to prevent the PF2e system from marking it as a blind roll...\n\t\tmsg.rolls.push(roll)\n\t\temitDiceSoNiceRoll({\n\t\t\tmsgId: msg.id,\n\t\t\tuserId: game.user.id,\n\t\t\trolls: JSON.stringify([roll.toJSON()]),\n\t\t})\n\n\t\tawait addRollToTracker(msg, check, roll.total, !!oldRoll)\n\n\t\tawait msg.update(updates)\n\n\t\tif (MODULE.settings.flatAutoReveal && passedAllFlatChecks(msg)) revealMessage(msg)\n\t}\n}\n\nasync function handleRevealClick(msg: ChatMessagePF2e) {\n\tawait revealMessage(msg)\n}\n\nasync function revealMessage(msg: ChatMessagePF2e) {\n\tconst msgData = msg.flags[MODULE_ID].hiddenMsg as ChatMessageSourcePF2e | undefined\n\n\tif (msgData) {\n\t\tmsgData.flags[MODULE_ID].revealed = true\n\t\tmsgData.flags[MODULE_ID].flatchecks = msg.flags[MODULE_ID].flatchecks as MsgFlagData\n\t\tawait getDocumentClass(\"ChatMessage\").create(msgData)\n\t\tawait msg.delete()\n\t}\n}\n","import type {\n\tDataFieldValidationOptions,\n\tDataModelCleaningOptions,\n} from \"@7h3laughingman/foundry-types/common/data/_module.mjs\"\n\ntype RuleValue = string | number\n\nexport class ValueField<\n\tTRequired extends boolean,\n\tTNullable extends boolean,\n\tTHasInitial extends boolean = false,\n> extends foundry.data.fields.DataField {\n\tprotected override _validateType(value: JSONValue, options?: DataFieldValidationOptions) {\n\t\treturn typeof value === \"string\" || typeof value === \"number\"\n\t}\n\n\tprotected _cleanType(input: RuleValue, options?: Readonly): RuleValue {\n\t\tif (typeof input === \"number\") return input\n\n\t\tconst value = input.trim()\n\t\tconst num = Number.parseInt(value, 10)\n\t\tif (Number.isNaN(num)) return value\n\t\treturn num\n\t}\n}\n/*\n// @ts-expect-error\nconst flatModSchema = game.pf2e.RuleElements.builtin.FlatModifier.defineSchema()\n\nexport const PredicateField = flatModSchema.predicate.constructor as PredicateFieldType */\n","import type { ModelPropFromDataField } from \"@7h3laughingman/foundry-types/common/data/fields.mjs\"\nimport type { AdditionalFlatCheckSource } from \"./common\"\nimport { ValueField } from \"./fields\"\n\nconst fields = foundry.data.fields\n\nconst schema = {\n\ttype: new fields.StringField({\n\t\trequired: true,\n\t\tblank: false,\n\t}),\n\tslot: new fields.StringField({\n\t\trequired: false,\n\t\tblank: false,\n\t}),\n\tbaseDC: new ValueField({\n\t\trequired: true,\n\t}),\n\taffects: new fields.StringField({\n\t\trequired: true,\n\t\tchoices: [\"origin\", \"self\"],\n\t\tinitial: \"self\",\n\t}),\n}\n\ntype SchemaType = typeof schema\ntype SchemaProps = {\n\t[k in keyof SchemaType]: ModelPropFromDataField\n}\n\nexport function buildAddCheckRuleElement() {\n\t// biome-ignore lint/correctness/noUnusedVariables: neccesary evil\n\tinterface AddCheckRuleElementImpl extends SchemaProps {\n\t\tkey: \"fc-AddCheck\"\n\t\tslug: string\n\t}\n\n\t// biome-ignore lint/suspicious/noUnsafeDeclarationMerging: this should be a crime\n\tclass AddCheckRuleElementImpl extends game.pf2e.RuleElement {\n\t\tstatic override defineSchema() {\n\t\t\tconst base = super.defineSchema()\n\t\t\tbase.slug.required = true\n\t\t\tbase.slug.nullable = false\n\n\t\t\treturn { ...base, ...schema }\n\t\t}\n\n\t\ttoSource(options: string[]): AdditionalFlatCheckSource | null {\n\t\t\tif (!this.test(options)) return null\n\t\t\tconst dc = this.resolveValue(this.baseDC)\n\t\t\tif (typeof dc !== \"number\") return null\n\n\t\t\treturn {\n\t\t\t\ttype: this.type,\n\t\t\t\torigin: {\n\t\t\t\t\tslug: this.slug,\n\t\t\t\t\tlabel: this.label,\n\t\t\t\t},\n\t\t\t\tslot: this.slot ?? this.slug,\n\t\t\t\tbaseDc: dc,\n\t\t\t}\n\t\t}\n\t}\n\n\treturn AddCheckRuleElementImpl\n}\n\nexport type AddCheckRuleElement = InstanceType>\n","import type { ModelPropFromDataField } from \"@7h3laughingman/foundry-types/common/data/fields.mjs\"\nimport { PRIORITIES } from \"./common\"\nimport { ValueField } from \"./fields\"\n\nconst fields = foundry.data.fields\n\nconst schema = {\n\ttype: new fields.StringField({\n\t\trequired: true,\n\t\tblank: false,\n\t}),\n\tmode: new fields.StringField({\n\t\trequired: true,\n\t\tblank: false,\n\t\tchoices: [\"add\", \"upgrade\", \"downgrade\", \"override\"],\n\t}),\n\tvalue: new ValueField({ required: true }),\n\taffects: new fields.StringField({\n\t\trequired: true,\n\t\tchoices: [\"origin\", \"self\"],\n\t\tinitial: \"self\",\n\t}),\n}\n\ntype SchemaType = typeof schema\ntype SchemaProps = {\n\t[k in keyof SchemaType]: ModelPropFromDataField\n}\n\nexport function buildModifyFlatDCRuleElement() {\n\t// biome-ignore lint/correctness/noUnusedVariables: neccesary evil\n\tinterface ModifyFlatDCRuleElementImpl extends SchemaProps {\n\t\tkey: \"fc-ModifyFlatDC\"\n\t}\n\n\t// biome-ignore lint/suspicious/noUnsafeDeclarationMerging: this should be a crime\n\tclass ModifyFlatDCRuleElementImpl extends game.pf2e.RuleElement {\n\t\tstatic override defineSchema() {\n\t\t\tconst base = super.defineSchema()\n\t\t\tbase.priority.initial = (d) => PRIORITIES[String(d.mode)] ?? PRIORITIES.override\n\t\t\treturn {\n\t\t\t\t...base,\n\t\t\t\t...schema,\n\t\t\t}\n\t\t}\n\n\t\tget tiebreakPriority() {\n\t\t\treturn this.resolvedValue\n\t\t}\n\n\t\tget resolvedValue() {\n\t\t\tconst resolved = this.resolveValue(this.value, NaN)\n\t\t\tif (Number.isNumeric(resolved)) return Number(resolved)\n\t\t\treturn NaN\n\t\t}\n\n\t\tgetData(options: string[]) {\n\t\t\tif (!this.test(options)) return null\n\n\t\t\tconst resolvedValue = this.resolvedValue\n\t\t\tif (Number.isNaN(resolvedValue)) return null\n\n\t\t\tconst data = {\n\t\t\t\tlabel: this.label,\n\t\t\t\ttype: this.resolveInjectedProperties(this.type),\n\t\t\t\tmode: this.mode,\n\t\t\t\tvalue: resolvedValue,\n\t\t\t\taffects: this.affects,\n\t\t\t}\n\n\t\t\tif (this.ignored) return null\n\t\t\treturn data\n\t\t}\n\t}\n\n\treturn ModifyFlatDCRuleElementImpl\n}\n\nexport type ModifyFlatDCRuleElement = InstanceType>\n\nexport type ModifyFlatDCData = NonNullable>\n","import { buildAddCheckRuleElement } from \"./add\"\nimport { buildModifyFlatDCRuleElement } from \"./modify\"\nimport { buildTreatAsRuleElement } from \"./treat-as\"\n\nexport function setupRuleElements() {\n\tgame.pf2e.RuleElements.custom[\"fc-ModifyFlatDC\"] = buildModifyFlatDCRuleElement()\n\tgame.pf2e.RuleElements.custom[\"fc-AddCheck\"] = buildAddCheckRuleElement()\n\tgame.pf2e.RuleElements.custom[\"fc-TreatAs\"] = buildTreatAsRuleElement()\n}\n","import type Token from \"@7h3laughingman/foundry-types/client/canvas/placeables/token.mjs\"\nimport type { TokenPF2e } from \"@7h3laughingman/pf2e-types\"\nimport MODULE from \"src\"\nimport { MODULE_ID } from \"src/constants\"\nimport { translate } from \"src/utils\"\nimport { BaseModule } from \"../base\"\nimport { FlatCheckHelper } from \"./data\"\nimport { localizeOrigin, localizeType } from \"./i18n\"\nimport { tokenExposureCache } from \"./light/token\"\nimport { TargetColors } from \"./light/utils\"\nimport { guessOrigin } from \"./target\"\n\nfunction calcScaleFromToken(token: Token, multPerSquare = 0) {\n\tconst gridSize = token.scene!.grid.size\n\tconst squares = Math.max(\n\t\t1,\n\t\tMath.ceil(Math.min(token.bounds.width, token.bounds.height) / gridSize),\n\t)\n\treturn gridSize / 100 + multPerSquare * squares\n}\n\nconst tokenTargetManager = {\n\ttokenMap: new Map(),\n\tgetOrCreate(token: TokenPF2e) {\n\t\tif (this.tokenMap.has(token.id)) return this.tokenMap.get(token.id)!\n\t\tconst r = new TokenTargetRenderer(token)\n\t\tthis.tokenMap.set(token.id, r)\n\t\treturn r\n\t},\n\ttarget(token: TokenPF2e) {\n\t\tthis.getOrCreate(token).draw()\n\t},\n\tuntarget(token: TokenPF2e) {\n\t\tthis.tokenMap.get(token.id)?.destroy()\n\t\tthis.tokenMap.delete(token.id)\n\t},\n\trefreshToken(token: TokenPF2e) {\n\t\tthis.tokenMap.get(token.id)?.draw()\n\t},\n\tdestroyAll() {\n\t\tfor (const [_, token] of this.tokenMap.entries()) token.destroy()\n\t},\n\trefreshTargets() {\n\t\tfor (const t of game.user.targets) this.target(t)\n\t},\n\tdebouncedRefresh: foundry.utils.debounce(() => {\n\t\ttokenTargetManager.refreshTargets()\n\t}, 100),\n}\n\nconst style: Partial = { align: \"center\", dropShadow: false, strokeThickness: 2 }\nconst textStyles = {\n\tnormal: (scale: number) =>\n\t\tfoundry.canvas.containers.PreciseText.getTextStyle({ fontSize: 14 * scale, ...style }),\n\tsmall: (scale: number) =>\n\t\tfoundry.canvas.containers.PreciseText.getTextStyle({\n\t\t\tfontSize: 12 * scale,\n\t\t\tfill: \"#eeeeee\",\n\t\t\t...style,\n\t\t}),\n}\n\nclass TokenTargetRenderer {\n\t#layer: PIXI.Container\n\t#filter: foundry.canvas.rendering.filters.OutlineOverlayFilter\n\tconstructor(public token: TokenPF2e) {\n\t\tthis.#layer = new PIXI.Container()\n\t\tthis.#layer.alpha = 0.9\n\t\tconst outlineScale = calcScaleFromToken(token, 0.5)\n\t\tthis.#filter = foundry.canvas.rendering.filters.OutlineOverlayFilter.create({\n\t\t\tknockout: false,\n\t\t\twave: false,\n\t\t})\n\t\tthis.#filter.thickness = 3 * outlineScale\n\t\tthis.#filter.animated = false\n\n\t\tthis.token.addChild(this.#layer)\n\t\tthis.token.mesh?.filters?.unshift(this.#filter)\n\t}\n\n\tasync draw() {\n\t\tthis.#layer.removeChildren()\n\t\t// Start disabled to prevent flashing because of await\n\t\tthis.#filter.enabled = false\n\t\tconst origin = guessOrigin()\n\t\tconst check = (await FlatCheckHelper.fromTokens(origin, this.token.document)).target\n\n\t\tif (\n\t\t\t!check ||\n\t\t\t(check.finalDc != null && check.finalDc <= 1) ||\n\t\t\t(MODULE.settings.flatTargetMarkerMode === \"onlyWithOrigin\" && origin == null)\n\t\t) {\n\t\t\treturn\n\t\t}\n\n\t\tif (MODULE.settings.flatTargetMarkerDisplay.outline) {\n\t\t\tconst color = TargetColors.fromDC(check.finalDc)\n\t\t\tthis.#filter.uniforms.outlineColor = color.toArray()\n\t\t\tthis.#filter.enabled = true\n\t\t}\n\n\t\tif (MODULE.settings.flatTargetMarkerDisplay.text) {\n\t\t\tconst textScale = calcScaleFromToken(this.token, 0.5)\n\t\t\tconst text = new foundry.canvas.containers.PreciseText(\n\t\t\t\ttranslate(\"flat.target-marker-dc\", {\n\t\t\t\t\tdc: check.finalDc ?? \"?\",\n\t\t\t\t\tlabel: localizeType(check.type),\n\t\t\t\t}),\n\t\t\t\ttextStyles.normal(textScale),\n\t\t\t)\n\t\t\ttext.x = this.token.bounds.width / 2 - text.width / 2\n\t\t\ttext.y = this.token.bounds.height * 0.95 - text.height\n\t\t\tthis.#layer.addChild(text)\n\t\t\tif (check.origin && check.type !== check.origin.slug) {\n\t\t\t\tconst smallText = new foundry.canvas.containers.PreciseText(\n\t\t\t\t\tlocalizeOrigin(check.origin),\n\t\t\t\t\ttextStyles.small(textScale),\n\t\t\t\t)\n\t\t\t\tsmallText.x = this.token.bounds.width / 2 - smallText.width / 2\n\t\t\t\tsmallText.y = text.y - smallText.height * 0.75\n\t\t\t\tthis.#layer.addChild(smallText)\n\t\t\t}\n\t\t}\n\t}\n\tdestroy() {\n\t\tthis.#layer.destroy()\n\n\t\tconst idx = this.token.mesh?.filters?.indexOf(this.#filter)\n\t\tif (idx !== undefined && idx > -1) this.token.mesh?.filters?.splice(idx, 1)\n\t}\n}\n\nexport class TargetInfoModule extends BaseModule {\n\tsettingsKey = \"flat-check-target-marker\"\n\n\thasSettingEnabled() {\n\t\treturn game.settings.get(MODULE_ID, this.settingsKey) !== \"disabled\"\n\t}\n\n\tenable(): void {\n\t\tthis.registerHook(\"targetToken\", (user: User, token: TokenPF2e, state: boolean) => {\n\t\t\tif (user !== game.user) return\n\t\t\tif (state) tokenTargetManager.target(token)\n\t\t\telse tokenTargetManager.untarget(token)\n\t\t})\n\t\tthis.registerHook(\"controlToken\", () => {\n\t\t\ttokenTargetManager.debouncedRefresh()\n\t\t})\n\t\tconst refreshTimeoutIds = new Map()\n\t\tthis.registerHook(\"refreshToken\", (token: TokenPF2e, args: Record) => {\n\t\t\tif (!(args.refreshPosition && args.refreshVisibility)) return\n\n\t\t\tif (refreshTimeoutIds.has(token.id)) {\n\t\t\t\tclearTimeout(refreshTimeoutIds.get(token.id))\n\t\t\t}\n\t\t\tconst id = setTimeout(() => {\n\t\t\t\trefreshTimeoutIds.delete(token.id)\n\t\t\t\ttokenTargetManager.refreshToken(token)\n\t\t\t}, 100)\n\t\t\trefreshTimeoutIds.set(token.id, id)\n\t\t})\n\t\tthis.registerHook(\"canvasTearDown\", () => {\n\t\t\ttokenTargetManager.destroyAll()\n\t\t})\n\t\tthis.registerHook(\"lightingRefresh\", () => {\n\t\t\ttokenTargetManager.debouncedRefresh()\n\t\t})\n\n\t\ttokenExposureCache.enable()\n\t}\n\n\tdisable() {\n\t\tsuper.disable()\n\t\ttokenTargetManager.destroyAll()\n\t}\n}\n","import type {\n\tActorPF2e,\n\tChatMessagePF2e,\n\tCombatantPF2e,\n\tEffectPF2e,\n\tItemPF2e,\n} from \"@7h3laughingman/pf2e-types\"\nimport { MODULE_ID } from \"src/constants\"\nimport MODULE from \"src/index\"\nimport { actorEffectBySlug, actorHasEffect, SYSTEM, translate } from \"src/utils\"\nimport { BaseModule } from \"./base\"\n\nexport class LifeLinkModule extends BaseModule {\n\tsettingsKey = \"lifelink\"\n\n\tenable() {\n\t\tsuper.enable()\n\n\t\tthis.registerHook(\"pf2e.startTurn\", onStartTurn)\n\t\tthis.registerHook(\"createItem\", onCreateItem)\n\t\tthis.registerHook(\"createChatMessage\", onCreateMessage)\n\t\tthis.registerHook(\"renderChatMessageHTML\", onRenderChatMessage)\n\t}\n}\n\ninterface ButtonArgs {\n\t// HP to transfer from source to target\n\t// Stops if source doesn't have enough HP\n\ttransfer?: number\n\t// HP to restore to target\n\theal?: number\n\t// HP to remove from source\n\tdmg?: number\n\tsource: string\n\ttarget: string\n\tcd?: 1\n}\n\nconst UNDO_BUTTON_MARKUP = ``\n\nfunction makeButton(label: string, args: ButtonArgs) {\n\tconst json = JSON.stringify(args)\n\treturn `\n \n \n ${label}\n \n `\n}\n\nasync function updateHP(actor, delta) {\n\tconst hp = actor.system.attributes.hp.value\n\tawait actor.update({\n\t\t\"system.attributes.hp.value\": hp + delta,\n\t})\n}\n\nasync function handleTransferButton(args: ButtonArgs) {\n\tconst required = [\"source\", \"target\"]\n\tfor (const k of required) {\n\t\tif (!(k in args)) return ui.notifications.error(`Missing arg ${k}`)\n\t}\n\n\tconst source = fromUuidSync(args.source)\n\tconst target = fromUuidSync(args.target)\n\tif (!target) return ui.notifications.error(translate(\"life-link.error-no-target\"))\n\tif (!source) return ui.notifications.error(translate(\"life-link.error-no-source\"))\n\tif (source.id === target.id)\n\t\treturn ui.notifications.error(translate(\"life-link.error-source-is-target\"))\n\n\tlet transfer = 0\n\n\tif (args.transfer) {\n\t\tconst missingHP =\n\t\t\t// @ts-expect-error pf2e\n\t\t\ttarget.system.attributes.hp.max - target.system.attributes.hp.value\n\t\tconst maxTransfer = Math.min(Number(args.transfer), missingHP)\n\n\t\t// @ts-expect-error pf2e\n\t\tconst hpRemaining = source.system.attributes.hp.value\n\t\ttransfer = Math.min(maxTransfer, hpRemaining)\n\n\t\tif (transfer <= 0) return ui.notifications.warn(translate(\"life-link.no-hp-remaining\"))\n\t}\n\n\tlet heal = transfer\n\tlet dmg = transfer\n\n\t// If the HP transfer (from life link) reduces the source to 0, share life no longer applies\n\t// @ts-expect-error pf2e\n\tif (transfer < source.system.attributes.hp.value) {\n\t\theal += args.heal ?? 0\n\t\tdmg += args.dmg ?? 0\n\t}\n\tawait updateHP(source, -dmg)\n\tawait updateHP(target, heal)\n\n\tif (args.cd) {\n\t\tawait target.createEmbeddedDocuments(\"Item\", [\n\t\t\t{\n\t\t\t\ttype: \"effect\",\n\t\t\t\tname: translate(\"life-link.life-link-cooldown-effect\"),\n\t\t\t\timg: SYSTEM.filePath(\"icons/spells/life-link.webp\"),\n\t\t\t\tsystem: {\n\t\t\t\t\ttokenIcon: { show: true },\n\t\t\t\t\tduration: {\n\t\t\t\t\t\tvalue: 1,\n\t\t\t\t\t\tunit: \"rounds\",\n\t\t\t\t\t\tsustained: false,\n\t\t\t\t\t\texpiry: \"turn-start\",\n\t\t\t\t\t},\n\t\t\t\t\tslug: \"life-link-cd\",\n\t\t\t\t},\n\t\t\t},\n\t\t])\n\t}\n\n\tawait ChatMessage.create({\n\t\tcontent: `\n ${translate(\"life-link.hp-add\", { actor: String(target.name), hp: heal })}\n 🡰\n ${translate(\"life-link.hp-sub\", { actor: String(source.name), hp: dmg })}\n \n ${UNDO_BUTTON_MARKUP}\n `,\n\t\tflags: {\n\t\t\t[MODULE_ID]: {\n\t\t\t\tundo: [\n\t\t\t\t\t[source.uuid, dmg],\n\t\t\t\t\t[target.uuid, -heal],\n\t\t\t\t],\n\t\t\t},\n\t\t},\n\t})\n}\n\nfunction handleSpiritLink(effect: EffectPF2e) {\n\tconst { actor, origin } = effect\n\n\tif (!actor) {\n\t\treturn null\n\t}\n\n\tif (!origin || origin.id === actor.id) {\n\t\tui.notifications.error(\n\t\t\ttranslate(\"life-link.spirit-link-error-bad-actor\", { actor: actor.name }),\n\t\t)\n\t\treturn null\n\t}\n\n\tconst transfer = effect.level * 2\n\tconst missingHP = actor.system.attributes.hp!.max - actor.system.attributes.hp!.value\n\tif (missingHP <= 0) return null\n\n\treturn makeButton(\n\t\ttranslate(\"life-link.spirit-link-button\", { hp: transfer, actor: actor.name }),\n\t\t{\n\t\t\ttransfer,\n\t\t\tsource: origin.uuid,\n\t\t\ttarget: actor.uuid,\n\t\t},\n\t)\n}\n\nasync function onStartTurn(combatant: CombatantPF2e) {\n\tif (game?.users?.activeGM?.id !== game.user?.id) return\n\n\tconst links: string[] = []\n\n\tcanvas.scene?.tokens.forEach(({ actor }) => {\n\t\tif (!actor) return\n\t\tconst e = actorEffectBySlug(actor, \"spirit-linked\")\n\t\tif (!e) return\n\t\tif (combatant.actor?.id !== e.origin?.id) return\n\n\t\tconst link = handleSpiritLink(e)\n\t\tif (link) links.push(link)\n\t})\n\n\tconst content = translate(\"life-link.spirit-link-message\", { link: links.join(\"
\") })\n\n\tif (links.length) {\n\t\tawait ChatMessage.create({\n\t\t\tcontent: content,\n\t\t\twhisper: ChatMessage.getWhisperRecipients(\"GM\").map((u) => u.id),\n\t\t\tspeaker: ChatMessage.getSpeaker({ actor: combatant.actor }),\n\t\t})\n\t}\n}\n\nasync function onCreateItem(item: ItemPF2e) {\n\tif (item.isOfType(\"effect\") && item.slug === \"spirit-linked\") {\n\t\tconst link = handleSpiritLink(item)\n\t\tif (link) {\n\t\t\tawait ChatMessage.create({\n\t\t\t\tcontent: translate(\"life-link.spirit-link-message\", { link }),\n\t\t\t\twhisper: ChatMessage.getWhisperRecipients(\"GM\").map((u) => u.id),\n\t\t\t\tspeaker: ChatMessage.getSpeaker({ actor: item.actor }),\n\t\t\t})\n\t\t}\n\t}\n}\n\nasync function onCreateMessage(msg: ChatMessagePF2e) {\n\tif (game.users?.activeGM?.id !== game.user?.id) return\n\n\tconst flags = msg.flags?.[SYSTEM.id]?.appliedDamage\n\tconst uuid = flags?.uuid\n\tconst dmg = flags?.updates.find((e) => e.path === \"system.attributes.hp.value\")?.value\n\tif (!uuid || !dmg || dmg <= 0) return\n\n\tconst actor = fromUuidSync(uuid) as ActorPF2e\n\tif (!actor) return\n\n\tlet lifeLinkTransfer = 0\n\n\tconst lifeLinkEffect = actorEffectBySlug(actor, \"life-linked\")\n\tif (lifeLinkEffect && !actorHasEffect(actor, \"life-link-cd\")) {\n\t\tlifeLinkTransfer = (() => {\n\t\t\tif (!lifeLinkEffect.origin || lifeLinkEffect.origin.id === actor.id) {\n\t\t\t\tui.notifications.error(\n\t\t\t\t\ttranslate(\"life-link.life-link-error-bad-actor\", { actor: actor.name }),\n\t\t\t\t\t{\n\t\t\t\t\t\tpermanent: true,\n\t\t\t\t\t},\n\t\t\t\t)\n\t\t\t\treturn 0\n\t\t\t}\n\n\t\t\tlet maxTransfer = 3\n\t\t\tif (MODULE.settings.lifeLinkVariant === \"plus\")\n\t\t\t\tmaxTransfer = 2 + Math.floor((lifeLinkEffect.level - 1) / 2) * 3\n\t\t\telse {\n\t\t\t\tif (lifeLinkEffect.level >= 3) maxTransfer = 5\n\t\t\t\tif (lifeLinkEffect.level >= 6) maxTransfer = 10\n\t\t\t\tif (lifeLinkEffect.level >= 9) maxTransfer = 15\n\t\t\t}\n\n\t\t\treturn Math.min(maxTransfer, dmg)\n\t\t})()\n\t}\n\n\tconst shareLifeEffect = actorEffectBySlug(actor, \"share-life\")\n\n\tif (shareLifeEffect && !shareLifeEffect?.origin)\n\t\tui.notifications.error(\n\t\t\ttranslate(\"life-link.share-life-error-bad-actor\", { actor: actor.name }),\n\t\t\t{\n\t\t\t\tpermanent: true,\n\t\t\t},\n\t\t)\n\n\tconst buttons: string[] = []\n\t;(() => {\n\t\tif (shareLifeEffect && lifeLinkTransfer) {\n\t\t\tconst remainingDmg = dmg - lifeLinkTransfer\n\n\t\t\tif (\n\t\t\t\tshareLifeEffect?.origin &&\n\t\t\t\tlifeLinkEffect?.origin &&\n\t\t\t\tshareLifeEffect.origin.uuid === lifeLinkEffect.origin.uuid\n\t\t\t) {\n\t\t\t\t// Both effects from the same source -> One Button\n\t\t\t\tbuttons.push(\n\t\t\t\t\tmakeButton(\n\t\t\t\t\t\ttranslate(\"life-link.damage-button\", {\n\t\t\t\t\t\t\tdamage: Math.ceil(remainingDmg / 2) + lifeLinkTransfer,\n\t\t\t\t\t\t\tactor: lifeLinkEffect.origin.name,\n\t\t\t\t\t\t}),\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttransfer: lifeLinkTransfer,\n\t\t\t\t\t\t\theal: remainingDmg === 1 ? 1 : Math.ceil(remainingDmg / 2),\n\t\t\t\t\t\t\tdmg: Math.ceil(remainingDmg / 2),\n\t\t\t\t\t\t\tcd: 1,\n\t\t\t\t\t\t\tsource: lifeLinkEffect.origin.uuid,\n\t\t\t\t\t\t\ttarget: actor.uuid,\n\t\t\t\t\t\t},\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t\t// return above means this is unreachable if both effects are from the same source\n\t\tif (shareLifeEffect?.origin) {\n\t\t\tconst remainingDmg = dmg - lifeLinkTransfer\n\t\t\t// Button for Share Life\n\t\t\tif (remainingDmg)\n\t\t\t\tbuttons.push(\n\t\t\t\t\tmakeButton(\n\t\t\t\t\t\ttranslate(\"life-link.share-life-damage-button\", {\n\t\t\t\t\t\t\tdamage: Math.ceil(remainingDmg / 2),\n\t\t\t\t\t\t\tactor: shareLifeEffect.origin.name,\n\t\t\t\t\t\t}),\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\theal: remainingDmg === 1 ? 1 : Math.ceil(remainingDmg / 2),\n\t\t\t\t\t\t\tdmg: Math.ceil(remainingDmg / 2),\n\t\t\t\t\t\t\tsource: shareLifeEffect.origin.uuid,\n\t\t\t\t\t\t\ttarget: actor.uuid,\n\t\t\t\t\t\t},\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t}\n\t\tif (lifeLinkEffect?.origin && lifeLinkTransfer) {\n\t\t\tbuttons.push(\n\t\t\t\tmakeButton(\n\t\t\t\t\ttranslate(\"life-link.life-link-damage-button\", {\n\t\t\t\t\t\tdamage: lifeLinkTransfer,\n\t\t\t\t\t\tactor: lifeLinkEffect.origin.name,\n\t\t\t\t\t}),\n\t\t\t\t\t{\n\t\t\t\t\t\ttransfer: lifeLinkTransfer,\n\t\t\t\t\t\tcd: 1,\n\t\t\t\t\t\tsource: lifeLinkEffect.origin.uuid,\n\t\t\t\t\t\ttarget: actor.uuid,\n\t\t\t\t\t},\n\t\t\t\t),\n\t\t\t)\n\t\t}\n\t})()\n\n\tif (buttons.length) {\n\t\tawait ChatMessage.create({\n\t\t\tcontent: translate(\"life-link.damage-transfer-message\", { buttons: buttons.join(\"
\") }),\n\t\t\twhisper: ChatMessage.getWhisperRecipients(\"GM\").map((u) => u.id),\n\t\t\tspeaker: ChatMessage.getSpeaker(actor),\n\t\t})\n\t}\n}\n\nfunction onRenderChatMessage(msg: ChatMessagePF2e, html: HTMLElement) {\n\tif (!game.user?.isGM) return\n\thtml.querySelector(\"a.life-link\")?.addEventListener(\"click\", async (event) => {\n\t\tif (!(event.target instanceof HTMLElement)) return\n\t\tconst args = JSON.parse(event.target.dataset.args!) as ButtonArgs\n\t\tawait handleTransferButton(args)\n\t})\n\thtml.querySelector(\"button.fc-undo-button\")?.addEventListener(\"click\", async () => {\n\t\tconst data = msg.flags[MODULE_ID]?.undo as [string, number][]\n\t\tfor (const [uuid, dmg] of data) {\n\t\t\tconst actor = await fromUuid(uuid)\n\t\t\tawait updateHP(actor, dmg)\n\t\t}\n\t\thtml.querySelector(\".undo-text\")?.classList.add(\"undo\")\n\t\tawait msg.update({\n\t\t\tcontent: html.querySelector(\".message-content\")?.innerHTML,\n\t\t})\n\t})\n}\n","import type { ChatMessagePF2e } from \"@7h3laughingman/pf2e-types\"\nimport { MODULE_ID } from \"src/constants\"\nimport { SYSTEM } from \"src/utils\"\nimport { BaseModule } from \"../base\"\n\nexport class AltRollBreakdownModule extends BaseModule {\n\tsettingsKey = \"script-alt-roll-breakdown\"\n\n\tenable() {\n\t\tsuper.enable()\n\n\t\tthis.registerHook(\"renderChatMessageHTML\", onRenderChatMessage)\n\t}\n\n\tonReady() {\n\t\tverifySettingsDialog()\n\t}\n}\n\nfunction shouldHide(msg: ChatMessagePF2e) {\n\treturn (\n\t\t!game.settings.get(SYSTEM.id, \"metagame_showBreakdowns\") &&\n\t\tmsg.author?.isGM &&\n\t\t!msg.actor?.hasPlayerOwner &&\n\t\tmsg.isRoll\n\t)\n}\n\nasync function onRenderChatMessage(msg: ChatMessagePF2e, html: HTMLElement) {\n\tif (!shouldHide(msg)) return\n\tconst modifiers = msg.flags[SYSTEM.id].modifiers\n\tif (!modifiers) return\n\n\tconst toReveal = modifiers.filter(\n\t\t(m) =>\n\t\t\tm.type &&\n\t\t\t[\"untyped\", \"circumstance\", \"status\"].includes(m.type) &&\n\t\t\tm.slug !== \"base\" &&\n\t\t\tm.enabled,\n\t)\n\n\tfor (const modifier of toReveal) {\n\t\thtml\n\t\t\t.querySelector(`span.flavor-text span.tag[data-slug=\"${modifier.slug}\"]`)\n\t\t\t?.removeAttribute(\"data-visibility\")\n\t}\n}\n\nfunction verifySettingsDialog() {\n\tif (!game.user.isGM || !game.settings.get(SYSTEM.id, \"metagame_showBreakdowns\")) return\n\n\tnew foundry.applications.api.DialogV2({\n\t\twindow: { title: \"PF2e Utility Buttons - Alternative Roll Breakdowns\" },\n\t\tcontent: `\n

Alternative Roll Breakdowns need the \"Show Roll Breakdowns\" system metagame setting to be disabled.

\n `,\n\t\tbuttons: [\n\t\t\t{\n\t\t\t\taction: \"disable\",\n\t\t\t\tlabel: \"Disable Alternative Roll Breakdowns\",\n\t\t\t\tcallback: () => game.settings.set(MODULE_ID, \"script-alt-roll-breakdown\", false),\n\t\t\t},\n\t\t\t{\n\t\t\t\taction: \"enable\",\n\t\t\t\tlabel: \"Disable system setting\",\n\t\t\t\tdefault: true,\n\t\t\t\tcallback: () => game.settings.set(SYSTEM.id, \"metagame_showBreakdowns\", false),\n\t\t\t},\n\t\t],\n\t\tsubmit: undefined,\n\t}).render({ force: true })\n}\n","import { SYSTEM } from \"src/utils\"\nimport { BaseModule } from \"../base\"\n\nexport class SharedVisionModule extends BaseModule {\n\tsettingsKey = \"script-toggle-shared-vision\"\n\n\tenable() {\n\t\tsuper.enable()\n\n\t\tthis.registerHook(\"updateSetting\", onUpdateSetting)\n\t\tthis.registerHook(\"combatStart\", onCombatStart)\n\t\tthis.registerHook(\"deleteCombat\", onDeleteCombat)\n\t}\n\n\tonReady() {\n\t\t// Not perfect, but refreshing the setting if a second GM joins and gets activeGM should not cause any issues\n\t\tif (game.users.activeGM === game.user)\n\t\t\tgame.settings.set(SYSTEM.id, \"metagame_partyVision\", !game.combat?.started)\n\t}\n}\n\nfunction onUpdateSetting(s: { key: string }) {\n\tif (game.user.isGM || s.key !== `${SYSTEM.id}.metagame_partyVision`) return\n\n\t// Vision is updated in Token._onControl, so changing the party vision setting would only do something after a user (de)selects a token\n\t// This is copied from _onControl to force refresh vision\n\n\tfor (const token of canvas.tokens.placeables) {\n\t\t// @ts-expect-error\n\t\tif (!token.vision === token._isVisionSource()) token.initializeVisionSource()\n\t}\n\n\tcanvas.perception.update({\n\t\trefreshVision: true,\n\t\trefreshSounds: true,\n\t\t// @ts-expect-error\n\t\trefreshOcclusion: canvas.tokens.occlusionMode & CONST.TOKEN_OCCLUSION_MODES.CONTROLLED,\n\t})\n}\n\nfunction onCombatStart() {\n\tif (game.users.activeGM === game.user) game.settings.set(SYSTEM.id, \"metagame_partyVision\", false)\n}\nfunction onDeleteCombat() {\n\tif (game.users.activeGM === game.user) game.settings.set(SYSTEM.id, \"metagame_partyVision\", true)\n}\n","import type SettingsConfig from \"@7h3laughingman/foundry-types/client/applications/settings/config.mjs\"\nimport MODULE from \"src\"\nimport { MODULE_ID } from \"./constants\"\nimport { FlatMessageConfigApplication } from \"./modules/flat/message-config\"\nimport { parseHTML, translate } from \"./utils\"\n\ntype Callback = (value: unknown) => void\nconst listeners: Record = {}\n\nexport const settings = {\n\tget delayShouldPrompt() {\n\t\tconst s = game.settings.get(MODULE_ID, \"delay-prompt\") as boolean\n\t\treturn s\n\t},\n\tget allowReturn() {\n\t\tconst s = game.settings.get(MODULE_ID, \"delay-return\") as boolean\n\t\treturn s\n\t},\n\tget delayCreateMessage() {\n\t\treturn game.settings.get(MODULE_ID, \"delay-create-message\") as boolean\n\t},\n\tget showInCombatTracker() {\n\t\treturn game.settings.get(MODULE_ID, \"delay-combat-tracker\") as boolean\n\t},\n\tget showInTokenHUD() {\n\t\treturn game.settings.get(MODULE_ID, \"delay-token-hud\") as boolean\n\t},\n\tget modifyPF2eHud() {\n\t\treturn game.settings.get(MODULE_ID, \"pf2e-hud-enable\") as boolean\n\t},\n\tget removeCombatToggle() {\n\t\treturn game.settings.get(MODULE_ID, \"token-hud-remove-combat-toggle\") as boolean\n\t},\n\tget delayCreatesMessage() {\n\t\treturn game.settings.get(MODULE_ID, \"delay-create-message\") as boolean\n\t},\n\tget flatAutoRoll() {\n\t\tconst world = game.settings.get(MODULE_ID, \"flat-check-auto-roll\")\n\t\tif (world === \"always\") return true\n\t\telse if (world === \"never\") return false\n\t\treturn game.settings.get(MODULE_ID, \"flat-check-auto-roll-user\") as boolean\n\t},\n\tget flatHideRoll() {\n\t\treturn game.settings.get(MODULE_ID, \"flat-check-hide-roll\") as boolean\n\t},\n\tget flatAutoReveal() {\n\t\treturn game.settings.get(MODULE_ID, \"flat-check-hide-roll-auto-reveal\") as boolean\n\t},\n\tget flatPlayersCanReveal() {\n\t\treturn game.settings.get(MODULE_ID, \"flat-check-hide-roll-players-can-reveal\") as boolean\n\t},\n\tget flatTargetMarkerMode() {\n\t\treturn game.settings.get(MODULE_ID, \"flat-check-target-marker\") as\n\t\t\t| \"enabled\"\n\t\t\t| \"disabled\"\n\t\t\t| \"onlyWithOrigin\"\n\t},\n\tget flatTargetMarkerDisplay() {\n\t\tconst value = game.settings.get(MODULE_ID, \"flat-check-target-marker-display\") as\n\t\t\t| \"all\"\n\t\t\t| \"outlineOnly\"\n\t\t\t| \"textOnly\"\n\n\t\tconst text = value === \"all\" || value === \"textOnly\"\n\t\tconst outline = value === \"all\" || value === \"outlineOnly\"\n\n\t\treturn { text, outline }\n\t},\n\tget lifeLinkEnabled() {\n\t\treturn game.settings.get(MODULE_ID, \"lifelink\") as boolean\n\t},\n\tget lifeLinkVariant() {\n\t\treturn game.settings.get(MODULE_ID, \"lifelink-formular\") as \"apg\" | \"plus\"\n\t},\n\tget emanationAutomation() {\n\t\treturn (\n\t\t\tgame.modules.get(\"lib-wrapper\")?.active &&\n\t\t\t(game.settings.get(MODULE_ID, \"emanation-automation\") as boolean)\n\t\t)\n\t},\n\tget altRollBreakdown() {\n\t\treturn game.settings.get(MODULE_ID, \"script-alt-roll-breakdown\") as boolean\n\t},\n\tget toggleSharedVision() {\n\t\treturn game.settings.get(MODULE_ID, \"script-toggle-shared-vision\") as boolean\n\t},\n\n\tget flags() {\n\t\treturn SettingFlags\n\t},\n\n\tinit() {\n\t\tregister(\"flat-check-in-message\", {\n\t\t\tname: \"pf2e-fc.settings.flat-check-in-message.name\",\n\t\t\thint: \"pf2e-fc.settings.flat-check-in-message.hint\",\n\t\t\tscope: \"world\",\n\t\t\tconfig: true,\n\t\t\tdefault: true,\n\t\t\ttype: Boolean,\n\t\t\trequiresReload: true,\n\t\t\tflags: {\n\t\t\t\trequiresLibwrapper: true,\n\t\t\t},\n\t\t})\n\n\t\tregister(\"flat-check-config\", {\n\t\t\tname: \"pf2e-fc.settings.flat-check-config.name\",\n\t\t\thint: \"\",\n\t\t\tscope: \"world\",\n\t\t\tconfig: true,\n\t\t\tdefault: {},\n\t\t\ttype: Object,\n\t\t})\n\n\t\tregister(\"flat-check-auto-roll\", {\n\t\t\tname: \"pf2e-fc.settings.flat-check-auto-roll.name\",\n\t\t\thint: \"pf2e-fc.settings.flat-check-auto-roll.hint\",\n\t\t\tscope: \"world\",\n\t\t\tconfig: true,\n\t\t\tdefault: \"user\",\n\t\t\tchoices: {\n\t\t\t\talways: \"pf2e-fc.settings.flat-check-auto-roll.choices.always\",\n\t\t\t\tuser: \"pf2e-fc.settings.flat-check-auto-roll.choices.user\",\n\t\t\t\tnever: \"pf2e-fc.settings.flat-check-auto-roll.choices.never\",\n\t\t\t},\n\t\t\ttype: String,\n\t\t})\n\n\t\tregister(\"flat-check-auto-roll-user\", {\n\t\t\tname: \"pf2e-fc.settings.flat-check-auto-roll-user.name\",\n\t\t\thint: \"pf2e-fc.settings.flat-check-auto-roll-user.hint\",\n\t\t\tscope: \"user\",\n\t\t\tconfig: true,\n\t\t\tdefault: false,\n\t\t\ttype: Boolean,\n\t\t})\n\n\t\tregister(\"flat-check-hide-roll\", {\n\t\t\tname: \"pf2e-fc.settings.flat-check-hide-roll.name\",\n\t\t\thint: \"pf2e-fc.settings.flat-check-hide-roll.hint\",\n\t\t\tscope: \"world\",\n\t\t\tconfig: true,\n\t\t\tdefault: false,\n\t\t\ttype: Boolean,\n\t\t})\n\n\t\tregister(\"flat-check-hide-roll-auto-reveal\", {\n\t\t\tname: \"pf2e-fc.settings.flat-check-hide-roll-auto-reveal.name\",\n\t\t\thint: \"pf2e-fc.settings.flat-check-hide-roll-auto-reveal.hint\",\n\t\t\tscope: \"world\",\n\t\t\tconfig: true,\n\t\t\tdefault: true,\n\t\t\ttype: Boolean,\n\t\t})\n\n\t\tregister(\"flat-check-hide-roll-players-can-reveal\", {\n\t\t\tname: \"pf2e-fc.settings.flat-check-hide-roll-players-can-reveal.name\",\n\t\t\thint: \"pf2e-fc.settings.flat-check-hide-roll-players-can-reveal.hint\",\n\t\t\tscope: \"world\",\n\t\t\tconfig: true,\n\t\t\tdefault: false,\n\t\t\ttype: Boolean,\n\t\t})\n\n\t\tregister(\"flat-check-target-marker\", {\n\t\t\tname: \"pf2e-fc.settings.flat-check-target-marker.name\",\n\t\t\thint: \"pf2e-fc.settings.flat-check-target-marker.hint\",\n\t\t\tscope: \"user\",\n\t\t\tconfig: true,\n\t\t\tdefault: \"enabled\",\n\t\t\tchoices: {\n\t\t\t\tenabled: \"pf2e-fc.settings.flat-check-target-marker.choices.enabled\",\n\t\t\t\tonlyWithOrigin: \"pf2e-fc.settings.flat-check-target-marker.choices.onlyWithOrigin\",\n\t\t\t\tdisabled: \"pf2e-fc.settings.flat-check-target-marker.choices.disabled\",\n\t\t\t},\n\t\t\ttype: String,\n\t\t})\n\n\t\tregister(\"flat-check-target-marker-display\", {\n\t\t\tname: \"pf2e-fc.settings.flat-check-target-marker-display.name\",\n\t\t\thint: \"pf2e-fc.settings.flat-check-target-marker-display.hint\",\n\t\t\tscope: \"user\",\n\t\t\tconfig: true,\n\t\t\tdefault: \"all\",\n\t\t\tchoices: {\n\t\t\t\tall: \"pf2e-fc.settings.flat-check-target-marker-display.choices.all\",\n\t\t\t\toutlineOnly: \"pf2e-fc.settings.flat-check-target-marker-display.choices.outlineOnly\",\n\t\t\t\ttextOnly: \"pf2e-fc.settings.flat-check-target-marker-display.choices.textOnly\",\n\t\t\t},\n\t\t\ttype: String,\n\t\t})\n\n\t\tregister(\"light-level-vis\", {\n\t\t\tname: \"pf2e-fc.settings.light-level-vis.name\",\n\t\t\thint: \"pf2e-fc.settings.light-level-vis.hint\",\n\t\t\tscope: \"user\",\n\t\t\tconfig: true,\n\t\t\tdefault: true,\n\t\t\ttype: Boolean,\n\t\t})\n\n\t\tregister(\"delay-combat-tracker\", {\n\t\t\tname: \"pf2e-fc.settings.delay-combat-tracker.name\",\n\t\t\thint: \"pf2e-fc.settings.delay-combat-tracker.hint\",\n\t\t\tscope: \"world\",\n\t\t\tconfig: true,\n\t\t\tdefault: true,\n\t\t\ttype: Boolean,\n\t\t})\n\n\t\tregister(\"delay-token-hud\", {\n\t\t\tname: \"pf2e-fc.settings.delay-token-hud.name\",\n\t\t\thint: \"pf2e-fc.settings.delay-token-hud.hint\",\n\t\t\tscope: \"world\",\n\t\t\tconfig: true,\n\t\t\tdefault: true,\n\t\t\ttype: Boolean,\n\t\t})\n\n\t\tregister(\"delay-return\", {\n\t\t\tname: \"pf2e-fc.settings.delay-return.name\",\n\t\t\thint: \"pf2e-fc.settings.delay-return.hint\",\n\t\t\tscope: \"world\",\n\t\t\tconfig: true,\n\t\t\tdefault: true,\n\t\t\ttype: Boolean,\n\t\t})\n\n\t\tregister(\"delay-prompt\", {\n\t\t\tname: \"pf2e-fc.settings.delay-prompt.name\",\n\t\t\thint: \"pf2e-fc.settings.delay-prompt.hint\",\n\t\t\tscope: \"world\",\n\t\t\tconfig: true,\n\t\t\tdefault: false,\n\t\t\ttype: Boolean,\n\t\t})\n\n\t\tregister(\"delay-create-message\", {\n\t\t\tname: \"pf2e-fc.settings.delay-create-message.name\",\n\t\t\tscope: \"world\",\n\t\t\tconfig: true,\n\t\t\tdefault: true,\n\t\t\ttype: Boolean,\n\t\t})\n\n\t\tregister(\"token-hud-remove-combat-toggle\", {\n\t\t\tname: \"pf2e-fc.settings.token-hud-remove-combat-toggle.name\",\n\t\t\thint: \"pf2e-fc.settings.token-hud-remove-combat-toggle.hint\",\n\t\t\tscope: \"world\",\n\t\t\tconfig: true,\n\t\t\tdefault: false,\n\t\t\ttype: Boolean,\n\t\t})\n\n\t\tregister(\"pf2e-hud-enable\", {\n\t\t\tname: \"pf2e-fc.settings.pf2e-hud-enable.name\",\n\t\t\thint: \"pf2e-fc.settings.pf2e-hud-enable.hint\",\n\t\t\tscope: \"world\",\n\t\t\tconfig: true,\n\t\t\tdefault: false,\n\t\t\ttype: Boolean,\n\t\t})\n\n\t\tregister(\"lifelink\", {\n\t\t\tname: \"pf2e-fc.settings.lifelink.name\",\n\t\t\thint: \"pf2e-fc.settings.lifelink.hint\",\n\t\t\tscope: \"world\",\n\t\t\tconfig: true,\n\t\t\tdefault: true,\n\t\t\ttype: Boolean,\n\t\t})\n\n\t\tregister(\"lifelink-formular\", {\n\t\t\tname: \"pf2e-fc.settings.lifelink-formular.name\",\n\t\t\thint: \"pf2e-fc.settings.lifelink-formular.hint\",\n\t\t\tscope: \"world\",\n\t\t\tconfig: true,\n\t\t\ttype: String,\n\t\t\tdefault: \"apg\",\n\t\t\tchoices: {\n\t\t\t\tapg: \"pf2e-fc.settings.lifelink-formular.choices.apg\",\n\t\t\t\tplus: \"pf2e-fc.settings.lifelink-formular.choices.plus\",\n\t\t\t},\n\t\t})\n\n\t\tregister(\"emanation-automation\", {\n\t\t\tname: \"pf2e-fc.settings.emanation-automation.name\",\n\t\t\thint: \"\",\n\t\t\tscope: \"world\",\n\t\t\tconfig: true,\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t\tflags: {\n\t\t\t\trequiresLibwrapper: true,\n\t\t\t},\n\t\t})\n\n\t\tregister(\"script-alt-roll-breakdown\", {\n\t\t\tname: \"pf2e-fc.settings.script-alt-roll-breakdown.name\",\n\t\t\thint: \"pf2e-fc.settings.script-alt-roll-breakdown.hint\",\n\t\t\tscope: \"world\",\n\t\t\tconfig: true,\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t})\n\n\t\tregister(\"script-toggle-shared-vision\", {\n\t\t\tname: \"pf2e-fc.settings.script-toggle-shared-vision.name\",\n\t\t\thint: \"pf2e-fc.settings.script-toggle-shared-vision.hint\",\n\t\t\tscope: \"world\",\n\t\t\tconfig: true,\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t})\n\n\t\tHooks.on(\"updateSetting\", onUpdateSetting as any)\n\t\tHooks.on(\"renderSettingsConfig\", onRenderSettingsConfig as any)\n\t},\n\n\taddListener(key: string, callback: Callback) {\n\t\tlisteners[key] = callback\n\t},\n\tremoveListener(key: string) {\n\t\tdelete listeners[key]\n\t},\n\tcallListener(key: string, value: unknown) {\n\t\tlisteners[key]?.(value)\n\t},\n}\n\ninterface SettingFlagsType {\n\trequiresLibwrapper?: true\n}\ntype SettingsParamater = Parameters[2]\ninterface SettingRegistration extends SettingsParamater {\n\tonChange?: (newValue: unknown) => void | Promise\n\tflags?: SettingFlagsType\n}\n\nconst SettingFlags = new Map()\n\nfunction register(key: string, { flags, ...data }: SettingRegistration) {\n\tif (flags) SettingFlags.set(key, flags)\n\n\tgame.settings.register(MODULE_ID, key, {\n\t\t...data,\n\t\tonChange() {\n\t\t\tconst value = game.settings.get(MODULE_ID, key) as any\n\t\t\tdata.onChange?.(value)\n\t\t\tsettings.callListener(key, value)\n\n\t\t\tHooks.callAll(`${MODULE_ID}.updateSetting`, { key, value })\n\n\t\t\tif (data.scope === \"client\") {\n\t\t\t\tonUpdateSetting({ key: `${MODULE_ID}.${key}` }, { value: value.toString() })\n\t\t\t}\n\t\t},\n\t})\n}\n\nfunction onUpdateSetting(setting: { key: string }, data) {\n\tif (!setting.key.startsWith(MODULE_ID)) return\n\n\tconst key = setting.key.split(\".\", 2).at(1)\n\tif (!key) return\n\n\tfor (const m of Object.values(MODULE.modules)) {\n\t\tif (m.settingsKey !== key) continue\n\n\t\tconst hasSettingEnabled = m.hasSettingEnabled()\n\t\tif (hasSettingEnabled && m.enabled) {\n\t\t\tm.enable()\n\t\t\tif (m.enabled) m.onReady()\n\t\t} else if (!hasSettingEnabled && m.enabled) {\n\t\t\tm.disable()\n\t\t}\n\t}\n}\n\nfunction onRenderSettingsConfig(app: SettingsConfig, html: HTMLFormElement) {\n\tconst tab = html.querySelector(`.tab[data-tab=\"${MODULE_ID}\"]`)\n\tif (!tab) return\n\n\tconst createHeading = (settingId: string, text: string) => {\n\t\tconst label = tab.querySelector(`label[for=\"settings-config-${MODULE_ID}.${settingId}\"]`)\n\t\tconst el = label?.parentElement\n\t\tif (!el) return\n\n\t\tconst heading = document.createElement(\"strong\")\n\t\theading.textContent = translate(text)\n\t\theading.style.fontSize = \"var(--font-h5-size)\"\n\t\theading.style.borderWidth = \"0 0 1px 0\"\n\t\theading.style.borderColor = \"var(--color-tabs-border)\"\n\t\theading.style.borderStyle = \"solid\"\n\t\tel.before(heading)\n\t}\n\n\tcreateHeading(\"flat-check-in-message\", \"settings.headings.flat\")\n\tcreateHeading(\"delay-combat-tracker\", \"settings.headings.delay\")\n\tcreateHeading(\"lifelink\", \"settings.headings.lifelink\")\n\tcreateHeading(\"emanation-automation\", \"settings.headings.emanation-automation\")\n\tcreateHeading(\"script-alt-roll-breakdown\", \"settings.headings.misc\")\n\n\tif (!game.modules.get(\"lib-wrapper\")?.active) {\n\t\tconst settingRequiringLibwrapper = SettingFlags.entries()\n\t\t\t.filter(([k, v]) => v.requiresLibwrapper)\n\t\t\t.map(([k, v]) => k)\n\t\tfor (const key of settingRequiringLibwrapper) {\n\t\t\tconst label = tab.querySelector(`label[for=\"settings-config-${MODULE_ID}.${key}\"]`)\n\t\t\tconst formGroup = label?.parentElement\n\t\t\tformGroup\n\t\t\t\t?.querySelector(\"p.hint\")\n\t\t\t\t?.insertAdjacentHTML(\n\t\t\t\t\t\"afterbegin\",\n\t\t\t\t\t`Requires libwrapper. `,\n\t\t\t\t)\n\t\t\tconst input = tab.querySelector(`input[name=\"${MODULE_ID}.${key}\"]`)\n\t\t\tif (input) {\n\t\t\t\tinput.title = \"Requires lib-wrapper\"\n\t\t\t\tinput.disabled = true\n\t\t\t\tinput.indeterminate = true\n\t\t\t\tinput.style.cursor = \"not-allowed\"\n\t\t\t}\n\t\t}\n\t}\n\n\tconst flatConfigButton = parseHTML(``)\n\tflatConfigButton.firstChild!.addEventListener(\"click\", () => {\n\t\tnew FlatMessageConfigApplication({\n\t\t\twindow: {\n\t\t\t\ttitle: translate(\"settings.flat-check-config.name\"),\n\t\t\t},\n\t\t}).render(true)\n\t})\n\n\tconst input = tab.querySelector(`input[name=\"${MODULE_ID}.flat-check-config\"]`)\n\tinput?.parentNode?.appendChild(flatConfigButton)\n\tinput?.remove()\n\n\tconst guideButton = parseHTML(\n\t\t`
\n\t\t

${translate(\"settings.docs.description\")}

\n\t\t \n\t\t
`,\n\t)\n\tguideButton.querySelector(\"button\")?.addEventListener(\"click\", async () => {\n\t\tconst { GuideApp } = await import(\"./guide/app\")\n\t\tnew GuideApp().render(true)\n\t})\n\n\ttab.prepend(guideButton)\n}\n","import { MODULE_ID } from \"./constants\"\nimport { DelayModule } from \"./modules/delay\"\nimport { EmanationModule } from \"./modules/emanation/emanation\"\nimport { LightVisModule } from \"./modules/flat/light/layer\"\nimport { MessageFlatCheckModule } from \"./modules/flat/message\"\nimport { setupRuleElements } from \"./modules/flat/rules/setup\"\nimport { TargetInfoModule } from \"./modules/flat/target-marker\"\nimport { LifeLinkModule } from \"./modules/life-link\"\nimport { AltRollBreakdownModule } from \"./modules/misc/alt-roll-breakdown\"\nimport { SharedVisionModule } from \"./modules/misc/toggle-vision\"\nimport { settings } from \"./settings\"\nimport { ChatActionHandler } from \"./shared/chat-button-handler\"\n\ntype Callback = (data: any) => void\n\nclass SocketHandler {\n\t#callbacks: Record = {}\n\n\tinit() {\n\t\tgame.socket.on(`module.${MODULE_ID}`, (data: { type: string; payload: any }) => {\n\t\t\tconst handler = this.#callbacks[data.type]\n\t\t\tif (!handler) throw new Error(`No socker handler for '${data.type}'`)\n\t\t\thandler(data.payload)\n\t\t})\n\t}\n\n\tregister(type: string, handler: Callback) {\n\t\tthis.#callbacks[type] = handler\n\t}\n\tunregister(type: string) {\n\t\tdelete this.#callbacks[type]\n\t}\n\n\temit(type: string, data: any) {\n\t\tif (!(type in this.#callbacks)) {\n\t\t\tthrow new Error(`No socket callback registered for '${type}'`)\n\t\t}\n\n\t\tgame.socket.emit(`module.${MODULE_ID}`, { type, payload: data })\n\t\t// Call function on this client as well\n\t\tthis.#callbacks[type](data)\n\t}\n}\n\nconst MODULE = {\n\tsocketHandler: new SocketHandler(),\n\tsettings,\n\tmodules: {\n\t\tflatMessageButtons: new MessageFlatCheckModule(),\n\t\tlightVis: new LightVisModule(),\n\t\ttargetInfo: new TargetInfoModule(),\n\t\tdelay: new DelayModule(),\n\t\temanation: new EmanationModule(),\n\t\tlifeLink: new LifeLinkModule(),\n\t\taltRollBreakdown: new AltRollBreakdownModule(),\n\t\tsharedVision: new SharedVisionModule(),\n\t},\n\tdebug: {\n\t\tre: false,\n\t},\n}\n\nexport default MODULE\n\nHooks.on(\"init\", () => {\n\t// CONFIG.debug.hooks = true\n\tMODULE.settings.init()\n\tMODULE.socketHandler.init()\n\n\tsetupRuleElements()\n\n\tfor (const module of Object.values(MODULE.modules)) {\n\t\tif (module.hasSettingEnabled()) module.enable()\n\t}\n\n\t;(game.modules.get(MODULE_ID) as any).debug = MODULE.debug\n\n\tif (import.meta.env.DEV) {\n\t\t;(async () => {\n\t\t\t// @ts-expect-error\n\t\t\twindow.delay = {\n\t\t\t\tsetup: (id: number) => import(\"./modules/delay/test\").then((m) => m.setupCase(id)),\n\t\t\t\trun: (id: number | null = null) =>\n\t\t\t\t\timport(\"./modules/delay/test\").then((m) => m.runCase(id)),\n\t\t\t}\n\n\t\t\tconst utils = await import(\"./modules/delay/utils\")\n\n\t\t\t// @ts-expect-error\n\t\t\twindow.debugCombat = () => utils.debugCombat(\"Debug\")\n\t\t})()\n\t}\n})\n\nHooks.on(\"ready\", () => {\n\tfor (const module of Object.values(MODULE.modules)) {\n\t\tif (module.enabled) module.onReady()\n\t}\n\n\tChatActionHandler.init()\n\n\tif (import.meta.env.DEV) {\n\t\t// @ts-expect-error\n\t\twindow.__PIXI_DEVTOOLS__ = { renderer: canvas.app.renderer, stage: canvas.app.stage }\n\t}\n})\n"],"x_google_ignoreList":[16,17,18,19,20,21,22,23,24,25],"mappings":"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"}