diff --git a/wg-greyknights/gk-greyknight-0.4.2-patch/scripts/auto-loadout.js b/wg-greyknights/gk-greyknight-0.4.2-patch/scripts/auto-loadout.js deleted file mode 100644 index 790704b..0000000 --- a/wg-greyknights/gk-greyknight-0.4.2-patch/scripts/auto-loadout.js +++ /dev/null @@ -1,68 +0,0 @@ -// gk-greyknight — auto-attach loadout on Grey Knight Archetype -Hooks.once("ready", () => { - const PACK_KEY = "gk-greyknight.gk-items"; // moduleId.packName - const NAMES = [ - "Aegis of Titan (Ability)", - "Nemesis Force Halberd", - "Grey Knight Armour Integrated Storm Bolter", - "Aegis Power Armour" - ]; - - async function fetchFromCompendium(name) { - const pack = game.packs.get(PACK_KEY); - if (!pack) return null; - const index = await pack.getIndex(); - const hit = index.find(e => e.name === name); - if (!hit) return null; - const doc = await pack.getDocument(hit._id); - return doc?.toObject(); - } - - async function ensureOnActor(actor, name, equip=false) { - const have = actor.items.getName(name); - if (have) return have; - let src = await fetchFromCompendium(name); - if (!src) { - // fallback: look in world items directory - const world = game.items.getName(name); - if (world) src = world.toObject(); - } - if (!src) return null; - // set equipped if item supports it - if (equip && src.system && typeof src.system.equipped !== "undefined") { - src.system.equipped = true; - } - const created = await actor.createEmbeddedDocuments("Item", [src]); - return created[0]; - } - - // Hook: when the Grey Knight Archetype is added to an actor - Hooks.on("createItem", async (item, opts, userId) => { - try { - if (item?.type !== "archetype") return; - if (item?.name !== "Grey Knight (Archetype)") return; - const actor = item.parent; - if (!actor || game.userId !== userId) return; - - // Attach base loadout (War-Plate default) + ability - await ensureOnActor(actor, "Aegis of Titan (Ability)", false); - await ensureOnActor(actor, "Nemesis Force Halberd", true); - await ensureOnActor(actor, "Grey Knight Armour Integrated Storm Bolter", true); - await ensureOnActor(actor, "Aegis Power Armour", true); - - // Optional: enable Aegis Synergy effect if present and Aegis is equipped - const abil = actor.items.getName("Aegis of Titan (Ability)"); - const aegis = actor.items.getName("Aegis Power Armour"); - const hasAegis = !!(aegis?.system?.equipped); - if (abil && abil.effects) { - for (const ef of abil.effects) { - if (ef.name?.toLowerCase().includes("synergy")) await ef.update({disabled: !hasAegis}); - } - } - - ui.notifications.info("Grey Knight loadout attached."); - } catch (e) { - console.error("gk-greyknight auto-loadout error:", e); - } - }); -}); diff --git a/wg-greyknights/gk-greyknight-0.4.2-patch/module.json.patch.json b/wg-greyknights/gk-greyknight-0.4.4-patch/module.json.patch.json similarity index 100% rename from wg-greyknights/gk-greyknight-0.4.2-patch/module.json.patch.json rename to wg-greyknights/gk-greyknight-0.4.4-patch/module.json.patch.json diff --git a/wg-greyknights/gk-greyknight-0.4.4-patch/scripts/auto-loadout.js b/wg-greyknights/gk-greyknight-0.4.4-patch/scripts/auto-loadout.js new file mode 100644 index 0000000..fd4ca28 --- /dev/null +++ b/wg-greyknights/gk-greyknight-0.4.4-patch/scripts/auto-loadout.js @@ -0,0 +1,112 @@ +// gk-greyknight — auto-attach loadout with clear choices +Hooks.once("ready", () => { + const PACK_KEY = "gk-greyknight.gk-items"; // moduleId.packName + const ITEMS = { + ability: "Aegis of Titan (Ability)", + nemesis: "Nemesis Force Halberd", + storm: "Grey Knight Armour Integrated Storm Bolter", + aegisPA: "Aegis Power Armour", + aegisTerm: "Terminator Aegis (Grey Knights)" + }; + + async function fetchFromCompendium(name) { + const pack = game.packs.get(PACK_KEY); + if (!pack) return null; + const index = await pack.getIndex(); + const hit = index.find(e => e.name === name); + if (!hit) return null; + const doc = await pack.getDocument(hit._id); + return doc?.toObject(); + } + async function ensureOnActor(actor, name, equip=false) { + let have = actor.items.getName(name); + if (have) { + if (typeof have.system?.equipped !== "undefined") await have.update({"system.equipped": !!equip}); + return have; + } + let src = await fetchFromCompendium(name); + if (!src) { const world = game.items.getName(name); if (world) src = world.toObject(); } + if (!src) return null; + if (equip && src.system && typeof src.system.equipped !== "undefined") src.system.equipped = true; + const [created] = await actor.createEmbeddedDocuments("Item", [src]); + return created; + } + async function setEquipped(actor, name, on) { + const it = actor.items.getName(name); + if (it && typeof it.system?.equipped !== "undefined") await it.update({"system.equipped": !!on}); + } + + Hooks.on("createItem", async (item, opts, userId) => { + try { + if (item?.type !== "archetype") return; + if (item?.name !== "Grey Knight (Archetype)") return; + const actor = item.parent; + if (!actor || game.userId !== userId) return; + + // Build labeled dialog (no more "Choice1 / Choice2") + const content = ` + +