mirror of
https://github.com/migatu/vtt_work.git
synced 2026-07-14 21:38:39 +00:00
73 lines
3.5 KiB
JavaScript
73 lines
3.5 KiB
JavaScript
// gk-greyknight — helpers v0.6.4 (Brotherhood discipline prompt)
|
|
Hooks.once("ready", () => {
|
|
const PACK_KEY = "gk-greyknight.gk-items";
|
|
const PACK_SRC_PREFIX = `Compendium.${PACK_KEY}.`;
|
|
const FLAG_SCOPE = "gk-greyknight";
|
|
|
|
async function promptDiscipline(actor) {
|
|
const existing = await actor.getFlag(FLAG_SCOPE, "discipline");
|
|
if (existing) return existing;
|
|
return await new Promise(resolve => {
|
|
new Dialog({
|
|
title: "Brotherhood of Psykers — Discipline",
|
|
content: `<p>Choose a psychic discipline for this character:</p>
|
|
<div style="display:flex; gap:.75rem; margin-top:.5rem;">
|
|
<label><input type="radio" name="disc" value="librarius" checked> Librarius</label>
|
|
<label><input type="radio" name="disc" value="sanctic"> Sanctic</label>
|
|
</div>
|
|
<p style="margin:.5rem 0 0; font-size:.9em; opacity:.8;">(You can change this later in Actor → Flags → gk-greyknight → discipline.)</p>`,
|
|
buttons: {
|
|
ok: { label: "Confirm", icon: "<i class='fas fa-check'></i>", callback: html => resolve(html.find('input[name=\"disc\"]:checked').val() || "librarius") },
|
|
cancel: { label: "Cancel", callback: () => resolve(null) }
|
|
},
|
|
default: "ok"
|
|
}).render(true);
|
|
});
|
|
}
|
|
|
|
if (window._gkBroHookId) { Hooks.off("createItem", window._gkBroHookId); window._gkBroHookId = null; }
|
|
|
|
window._gkBroHookId = Hooks.on("createItem", async (item, opts, userId) => {
|
|
try {
|
|
if (game.userId !== userId) return;
|
|
if (item?.type !== "ability") return;
|
|
const name = item?.name || "";
|
|
if (name !== "Brotherhood of Psykers") return;
|
|
const src = item?.flags?.core?.sourceId || "";
|
|
const isFromOurPack = src.startsWith(PACK_SRC_PREFIX);
|
|
if (!isFromOurPack && name !== "Brotherhood of Psykers") return;
|
|
const actor = item.parent; if (!actor) return;
|
|
|
|
const chosen = await promptDiscipline(actor);
|
|
if (!chosen) return;
|
|
await actor.setFlag(FLAG_SCOPE, "discipline", chosen);
|
|
|
|
if (chosen === "sanctic") {
|
|
ui.notifications.info("Discipline set to SANCTIC. Open the GK compendium and pick one Sanctic power as your starter.");
|
|
} else {
|
|
ui.notifications.info("Discipline set to LIBRARIUS. Use core Librarius powers from wng-core.");
|
|
}
|
|
} catch (e) { console.error("gk-greyknight brotherhood helper:", e); }
|
|
});
|
|
|
|
console.log("gk-greyknight helpers active (v0.6.4): Brotherhood discipline prompt enabled.");
|
|
});
|
|
|
|
/* gk-greyknight 0.6.4.1 — house-rule reminder (non-blocking) */
|
|
Hooks.on("preCreateChatMessage", (doc, data, options, userId) => {
|
|
try {
|
|
const flavor = (data.flavor || "").toLowerCase();
|
|
const isPsychic = flavor.includes("psychic") || flavor.includes("power");
|
|
if (!isPsychic) return;
|
|
const speaker = data.speaker || {}; const actor = game.actors?.get(speaker.actor);
|
|
if (!actor) return;
|
|
const hasBrotherhood = actor.items?.some(i => i.type === "ability" && i.name === "Brotherhood of Psykers");
|
|
if (!hasBrotherhood) return;
|
|
const combat = game.combat; if (!combat) return;
|
|
const key = `gk-greyknight.usedPsychicAction.r${combat.round}`;
|
|
const prev = combat.getFlag("gk-greyknight", key) || null;
|
|
if (prev && prev !== actor.id) ui.notifications?.warn("House rule (Brotherhood Focus): only one Grey Knight should use a psychic power as their Action this round.");
|
|
else if (!prev) combat.setFlag("gk-greyknight", key, actor.id);
|
|
} catch (e) { console.error("gk-greyknight helpers (house-rule reminder):", e); }
|
|
});
|