mirror of
https://github.com/migatu/vtt_work.git
synced 2026-07-14 13:34:42 +00:00
Final
This commit is contained in:
@@ -1 +0,0 @@
|
|||||||
Homebrew content for personal table use.
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
Grey Knights — Compendium (Wrath & Glory) v0.6.1
|
|
||||||
- Consolidated main pack 'gk-items' (merged updated items; icons improved where missing/generic).
|
|
||||||
- Auto-loadout scoped to our GK archetype.
|
|
||||||
- If you previously had a LevelDB folder packs/gk-items/, delete it once to force re-migration, then Rebuild Index.
|
|
||||||
|
|
||||||
Changelog highlights:
|
|
||||||
* Replaced Aegis/Terminator Aegis/Integrated Storm Bolter with your updated JSONs (equip-only effects left intact).
|
|
||||||
* Added Pilgrim Astartes Power Armor and ORDO MALLEUS keyword fallback to the main pack.
|
|
||||||
* Added Nemesis Falchions (Pair), Psycannon, Psilencer, Psybolt Ammunition.
|
|
||||||
* Set rarity 'unique' for new weapons/ammo.
|
|
||||||
* Improved icons for items lacking an icon, using modules/wng-core/assets list.
|
|
||||||
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
Drop your real icons here; JSONs point to icons/svg/ (Foundry stock) to avoid broken paths.
|
|
||||||
@@ -1,35 +0,0 @@
|
|||||||
{
|
|
||||||
"id": "wrath-and-glory-gk",
|
|
||||||
"title": "Wrath & Glory — Inquisition & Daemonhunters (Grey Knights)",
|
|
||||||
"description": "Content split into Inquisition and Daemonhunters. Includes Grey Knight stubs (weapons, archetypes) for importer.",
|
|
||||||
"version": "0.3.0",
|
|
||||||
"compatibility": {
|
|
||||||
"minimum": "10",
|
|
||||||
"verified": "11"
|
|
||||||
},
|
|
||||||
"authors": [
|
|
||||||
{
|
|
||||||
"name": "ChatGPT (assistant)"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"systems": [
|
|
||||||
{
|
|
||||||
"id": "wrath-and-glory",
|
|
||||||
"type": "system",
|
|
||||||
"compatibility": {
|
|
||||||
"minimum": "5"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"esmodules": [
|
|
||||||
"scripts/macro-gk-auto-loadout-on-archetype.js"
|
|
||||||
],
|
|
||||||
"packs": [],
|
|
||||||
"relationships": {
|
|
||||||
"systems": [
|
|
||||||
{
|
|
||||||
"id": "wrath-and-glory"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
File diff suppressed because one or more lines are too long
@@ -1,7 +0,0 @@
|
|||||||
{"name": "Nemesis Falchions (Pair)", "type": "weapon", "img": "modules/wng-core/assets/icons/weapons/force-sword.webp", "system": {"quantity": 1, "rarity": "unique", "description": "A matched pair of sanctified force blades. When wielding both, each attack may gain either +1 bonus die to WS or +1ED. Vs DAEMON/PSYKER: +1ED. Requires PSYKER to benefit from Force.", "value": 9, "keywords": "IMPERIUM, ADEPTUS ASTARTES, GREY KNIGHTS, SANCTIFIED", "equipped": false, "attack": {"base": 0, "bonus": 0, "rank": "none"}, "damage": {"base": 12, "bonus": 0, "rank": 0, "ed": {"base": 2, "bonus": 0, "rank": 0, "dice": ""}, "ap": {"base": -3, "bonus": 0, "rank": 0, "dice": ""}, "enabled": false, "otherDamage": {"mortal": "0", "wounds": "0", "shock": "0"}, "dice": ""}, "ed": {"base": 0, "bonus": 0, "rank": 0}, "ap": {"base": 0, "bonus": 0, "rank": 0}, "category": "melee", "range": {"short": 0, "medium": 0, "long": 0, "melee": 1, "thrown": null}, "ammo": {"id": ""}, "salvo": 0, "traits": {"list": [{"name": "force"}, {"name": "parry"}]}, "upgrades": [], "otherDamage": {}, "combi": {}, "twinned": false}, "effects": [], "_stats": {"coreVersion": "13.347", "systemId": "wrath-and-glory", "systemVersion": "7.1.1", "createdTime": 1755858904217, "modifiedTime": 1755859370010, "lastModifiedBy": "ETeghv7x8fjtIEKK", "exportSource": {"worldId": "gilead2", "uuid": "Item.AUwZwmYWGCSH04m2", "coreVersion": "13.347", "systemId": "wrath-and-glory", "systemVersion": "7.1.1"}}, "folder": null, "flags": {}, "_id": "AUwZwmYWGCSH04m2"}
|
|
||||||
{"name": "Psilencer", "type": "weapon", "img": "modules/wng-core/assets/icons/weapons/assault-cannon.webp", "system": {"quantity": 1, "rarity": "unique", "description": "High-rate psykic disruptor. Vs PSYKER: +1ED; hit PSYKER cannot Aim in the same round.", "value": 9, "keywords": "IMPERIUM, ADEPTUS ASTARTES, GREY KNIGHTS, SANCTIFIED", "equipped": false, "attack": {"base": 0, "bonus": 0, "rank": "none"}, "damage": {"base": 11, "bonus": 0, "rank": 0, "ed": {"base": 2, "bonus": 0, "rank": 0, "dice": ""}, "ap": {"base": 0, "bonus": 0, "rank": 0, "dice": ""}, "enabled": false, "otherDamage": {"mortal": "0", "wounds": "0", "shock": "0"}, "dice": ""}, "ed": {"base": 0, "bonus": 0, "rank": 0}, "ap": {"base": 0, "bonus": 0, "rank": 0}, "category": "ranged", "range": {"short": 12, "medium": 24, "long": 36, "melee": 1, "thrown": null}, "ammo": {"id": ""}, "salvo": 3, "traits": {"list": [{"name": "rapidFire", "rating": "3"}, {"name": "reliable"}]}, "upgrades": [], "otherDamage": {}, "combi": {}, "twinned": false}, "effects": [], "_stats": {"coreVersion": "13.347", "systemId": "wrath-and-glory", "systemVersion": "7.1.1", "createdTime": 1755859392521, "modifiedTime": 1755859417510, "lastModifiedBy": "ETeghv7x8fjtIEKK", "exportSource": {"worldId": "gilead2", "uuid": "Item.qvk9TxIezbO2C5OK", "coreVersion": "13.347", "systemId": "wrath-and-glory", "systemVersion": "7.1.1"}}, "folder": null, "flags": {}, "_id": "qvk9TxIezbO2C5OK"}
|
|
||||||
{"name": "Psycannon", "type": "weapon", "img": "modules/wng-core/assets/icons/weapons/autocannon.webp", "system": {"quantity": 1, "rarity": "unique", "description": "Anti-daemonic bolt weapon. Vs DAEMON/PSYKER: +1ED. On Critical: gains Rending (1) for the result.", "value": 9, "keywords": "BOLT, IMPERIUM, ADEPTUS ASTARTES, GREY KNIGHTS, SANCTIFIED", "equipped": false, "attack": {"base": 0, "bonus": 0, "rank": "none"}, "damage": {"base": 14, "bonus": 0, "rank": 0, "ed": {"base": 3, "bonus": 0, "rank": 0, "dice": ""}, "ap": {"base": -2, "bonus": 0, "rank": 0, "dice": ""}, "enabled": false, "otherDamage": {"mortal": "0", "wounds": "0", "shock": "0"}, "dice": ""}, "ed": {"base": 0, "bonus": 0, "rank": 0}, "ap": {"base": 0, "bonus": 0, "rank": 0}, "category": "ranged", "range": {"short": 20, "medium": 40, "long": 60, "melee": 1, "thrown": null}, "ammo": {"id": ""}, "salvo": 2, "traits": {"list": [{"name": "heavy", "rating": "7"}, {"name": "rapidFire", "rating": "2"}]}, "upgrades": [], "otherDamage": {}, "combi": {}, "twinned": false}, "effects": [], "_stats": {"coreVersion": "13.347", "systemId": "wrath-and-glory", "systemVersion": "7.1.1", "createdTime": 1755858910417, "modifiedTime": 1755859387007, "lastModifiedBy": "ETeghv7x8fjtIEKK", "exportSource": {"worldId": "gilead2", "uuid": "Item.luQa0ffP6nroOeN8", "coreVersion": "13.347", "systemId": "wrath-and-glory", "systemVersion": "7.1.1"}}, "folder": null, "flags": {}, "_id": "luQa0ffP6nroOeN8"}
|
|
||||||
{"name": "Terminator Aegis (Grey Knights)", "type": "armour", "img": "modules/wng-core/assets/icons/armour/terminator-armour.webp", "effects": [{"_id": "OvE7cPAtNLDdEj6j", "name": "Aegis Wards (Constant)", "origin": null, "disabled": false, "duration": {"startTime": null, "combat": null}, "changes": [{"key": "system.skills.psychicMastery.bonus", "mode": 2, "value": "1", "priority": 20}, {"key": "system.combat.resolve.bonus", "mode": 2, "value": "1", "priority": 20}], "tint": "#ffffff", "transfer": true, "flags": {}, "system": {"transferData": {"equipTransfer": true, "type": "document", "originalType": "document", "documentType": "Actor", "avoidTest": {"value": "none", "opposed": false, "prevention": true, "reversed": false}, "testIndependent": false, "selfOnly": false, "prompt": false, "area": {"templateData": {"borderColor": null, "fillColor": null, "texture": null}, "keep": false, "aura": {"transferred": false, "render": false}, "duration": "sustained"}, "zone": {"type": "zone", "transferred": false, "traits": {}, "skipImmediateOnPlacement": false, "keep": false}}, "itemTargetData": {"ids": [], "allItems": false}, "scriptData": [], "zone": {"type": "zone", "traits": {}, "skipImmediateOnPlacement": false}, "sourceData": {"test": {}}}, "_stats": {"coreVersion": "13.347", "systemId": "wrath-and-glory", "systemVersion": "7.1.1", "lastModifiedBy": null}, "img": "icons/svg/aura.svg", "type": "base", "description": "", "statuses": [], "sort": 0}, {"_id": "RXHERg7YjunnEQ8h", "name": "Aegis Warding Runes (Toggle)", "origin": null, "disabled": true, "duration": {"startTime": null, "combat": null}, "changes": [{"key": "system.combat.resilience.bonus", "mode": 2, "value": "1", "priority": 20}, {"key": "system.combat.defence.bonus", "mode": 2, "value": "-1", "priority": 20}], "tint": "#ffffff", "transfer": true, "flags": {}, "system": {"transferData": {"equipTransfer": true, "type": "document", "originalType": "document", "documentType": "Actor", "avoidTest": {"value": "none", "opposed": false, "prevention": true, "reversed": false}, "testIndependent": false, "selfOnly": false, "prompt": false, "area": {"templateData": {"borderColor": null, "fillColor": null, "texture": null}, "keep": false, "aura": {"transferred": false, "render": false}, "duration": "sustained"}, "zone": {"type": "zone", "transferred": false, "traits": {}, "skipImmediateOnPlacement": false, "keep": false}}, "itemTargetData": {"ids": [], "allItems": false}, "scriptData": [], "zone": {"type": "zone", "traits": {}, "skipImmediateOnPlacement": false}, "sourceData": {"test": {}}}, "_stats": {"coreVersion": "13.347", "systemId": "wrath-and-glory", "systemVersion": "7.1.1", "lastModifiedBy": null}, "img": "icons/svg/explosion.svg", "type": "base", "description": "", "statuses": [], "sort": 0}], "flags": {"wng-core": {"initialization-folder": "Armour", "sort": 0}, "core": {}}, "system": {"quantity": 1, "rarity": "", "description": "<p>Grey Knights Tactical Dreadnought armour with Aegis wards and storm bolter hard‑mount.</p><ul><li><b>AR 7</b>; <b>Powered (4)</b>; <b>Cumbersome</b>; counts as Large while worn.</li><li><b>Aegis (integrated):</b> Constant: +1 die to Deny the Witch and +1 die to resist Corruption.</li><li><b>Toggle (Action):</b> Aegis Warding Runes — +1 Resilience, −1 Defence (vs ranged).</li></ul>", "value": 10, "keywords": "POWERED, IMPERIUM, ADEPTUS ASTARTES, GREY KNIGHTS, INQUISITION, DAEMONHUNTERS", "equipped": false, "rating": 7, "base": 0, "traits": {"list": [{"name": "cumbersome"}, {"name": "powered", "rating": "4"}]}, "invulnerable": false}, "_stats": {"coreVersion": "13.347", "systemId": "wrath-and-glory", "systemVersion": "7.1.1", "createdTime": 1755859195679, "modifiedTime": 1755859221056, "lastModifiedBy": "ETeghv7x8fjtIEKK", "exportSource": {"worldId": "gilead2", "uuid": "Item.9XTvCiJElW4LJij9", "coreVersion": "13.347", "systemId": "wrath-and-glory", "systemVersion": "7.1.1"}}, "folder": "K59Lb8PvaCmIrviu", "_id": "9XTvCiJElW4LJij9"}
|
|
||||||
{"name": "Psybolt Ammunition", "type": "ammo", "img": "modules/wng-core/assets/icons/ammo/ammo.webp", "system": {"quantity": 1, "rarity": "unique", "description": "Upgrade for BOLT/Storm Bolter weapons. Grants +1ED. Against DAEMON/PSYKER, attacks gain Rending (1). Apply manually to attack resolving rules; conditional effects are not automated.", "value": 5, "keywords": "BOLT, SANCTIFIED", "effect": "", "traits": {"list": []}}, "effects": [], "_stats": {"coreVersion": "13.347", "systemId": "wrath-and-glory", "systemVersion": "7.1.1", "createdTime": 1755858907510, "modifiedTime": 1755859000832, "lastModifiedBy": "ETeghv7x8fjtIEKK", "exportSource": {"worldId": "gilead2", "uuid": "Item.ozxEfipXNkP69SHr", "coreVersion": "13.347", "systemId": "wrath-and-glory", "systemVersion": "7.1.1"}}, "folder": null, "flags": {}, "_id": "ozxEfipXNkP69SHr"}
|
|
||||||
{"name": "Aegis Power Armour", "type": "armour", "img": "modules/wng-core/assets/icons/armour/aquila-mk-vii.webp", "effects": [{"_id": "25aqxUBwyQtSAdxb", "name": "Aegis Wards (Constant)", "origin": null, "disabled": false, "duration": {"startTime": null, "combat": null}, "changes": [{"key": "system.skills.psychicMastery.bonus", "mode": 2, "value": "1", "priority": 20}, {"key": "system.combat.resolve.bonus", "mode": 2, "value": "1", "priority": 20}], "tint": "#ffffff", "transfer": true, "flags": {}, "system": {"transferData": {"equipTransfer": true, "type": "document", "originalType": "document", "documentType": "Actor", "avoidTest": {"value": "none", "opposed": false, "prevention": true, "reversed": false}, "testIndependent": false, "selfOnly": false, "prompt": false, "area": {"templateData": {"borderColor": null, "fillColor": null, "texture": null}, "keep": false, "aura": {"transferred": false, "render": false}, "duration": "sustained"}, "zone": {"type": "zone", "transferred": false, "traits": {}, "skipImmediateOnPlacement": false, "keep": false}}, "itemTargetData": {"ids": [], "allItems": false}, "scriptData": [], "zone": {"type": "zone", "traits": {}, "skipImmediateOnPlacement": false}, "sourceData": {"test": {}}}, "_stats": {"coreVersion": "13.347", "systemId": "wrath-and-glory", "systemVersion": "7.1.1", "lastModifiedBy": null}, "img": "icons/svg/aura.svg", "type": "base", "description": "", "statuses": [], "sort": 0}, {"_id": "LfRNsXknme6JLgSC", "name": "Aegis Warding Runes (Toggle)", "origin": null, "disabled": true, "duration": {"startTime": null, "combat": null}, "changes": [{"key": "system.combat.resilience.bonus", "mode": 2, "value": "1", "priority": 20}, {"key": "system.combat.defence.bonus", "mode": 2, "value": "-1", "priority": 20}], "tint": "#ffffff", "transfer": true, "flags": {}, "system": {"transferData": {"equipTransfer": true, "type": "document", "originalType": "document", "documentType": "Actor", "avoidTest": {"value": "none", "opposed": false, "prevention": true, "reversed": false}, "testIndependent": false, "selfOnly": false, "prompt": false, "area": {"templateData": {"borderColor": null, "fillColor": null, "texture": null}, "keep": false, "aura": {"transferred": false, "render": false}, "duration": "sustained"}, "zone": {"type": "zone", "transferred": false, "traits": {}, "skipImmediateOnPlacement": false, "keep": false}}, "itemTargetData": {"ids": [], "allItems": false}, "scriptData": [], "zone": {"type": "zone", "traits": {}, "skipImmediateOnPlacement": false}, "sourceData": {"test": {}}}, "_stats": {"coreVersion": "13.347", "systemId": "wrath-and-glory", "systemVersion": "7.1.1", "lastModifiedBy": null}, "img": "icons/svg/explosion.svg", "type": "base", "description": "", "statuses": [], "sort": 0}], "flags": {"wng-core": {"initialization-folder": "Armour", "sort": 0}, "core": {}}, "system": {"quantity": 1, "rarity": "", "description": "<p>Grey Knights sanctified power armour with hexagrammic wards and storm bolter forearm mount.</p><ul><li><b>AR 5</b>; <b>Powered (3)</b>.</li><li><b>Aegis (integrated):</b> Constant: +1 die to Deny the Witch and +1 die to resist Corruption.</li><li><b>Toggle (Action):</b> Aegis Warding Runes — runes glow; +1 Resilience, −1 Defence (vs ranged).</li></ul>", "value": 9, "keywords": "POWERED, IMPERIUM, ADEPTUS ASTARTES, GREY KNIGHTS, INQUISITION, DAEMONHUNTERS", "equipped": false, "rating": 5, "base": 0, "traits": {"list": [{"name": "powered", "rating": "3"}]}, "invulnerable": false}, "_stats": {"coreVersion": "13.347", "systemId": "wrath-and-glory", "systemVersion": "7.1.1", "createdTime": 1755859231852, "modifiedTime": 1755859293388, "lastModifiedBy": "ETeghv7x8fjtIEKK", "exportSource": {"worldId": "gilead2", "uuid": "Item.11NZTwYXPlHBlnXC", "coreVersion": "13.347", "systemId": "wrath-and-glory", "systemVersion": "7.1.1"}}, "folder": "K59Lb8PvaCmIrviu", "_id": "11NZTwYXPlHBlnXC"}
|
|
||||||
{"name": "Grey Knight Armour Integrated Storm Bolter", "type": "weapon", "img": "modules/wng-core/assets/icons/weapons/storm-bolter.webp", "effects": [], "flags": {"wng-core": {"initialization-folder": "Weapons", "sort": 0}, "core": {}}, "system": {"quantity": 1, "rarity": "rare", "description": "<p>Integrated forearm storm bolter. <b>Integrated:</b> does not occupy hands; may fire while wielding two‑handed melee. Treat as Pistol for firing in melee.</p>", "value": 4, "keywords": "BOLT, INTEGRATED, IMPERIUM, ADEPTUS ASTARTES, GREY KNIGHTS, INQUISITION, DAEMONHUNTERS", "equipped": false, "attack": {"base": 0, "bonus": 0, "rank": "none"}, "damage": {"base": 10, "bonus": 0, "rank": 0, "ed": {"base": 2, "bonus": 0, "rank": 0, "dice": ""}, "ap": {"base": 0, "bonus": 0, "rank": 0, "dice": ""}, "enabled": false, "otherDamage": {"mortal": "0", "wounds": "0", "shock": "0"}, "dice": ""}, "ed": {"base": 0, "bonus": 0, "rank": 0}, "ap": {"base": 0, "bonus": 0, "rank": 0}, "category": "ranged", "range": {"short": 12, "medium": 24, "long": 36, "melee": 1, "thrown": null}, "ammo": {"id": ""}, "salvo": 1, "traits": {"list": [{"name": "brutal"}, {"name": "pistol"}, {"name": "rapidFire", "rating": "2"}]}, "upgrades": [], "otherDamage": {}, "combi": {}, "twinned": false}, "_stats": {"coreVersion": "13.347", "systemId": "wrath-and-glory", "systemVersion": "7.1.1", "createdTime": 1755859127318, "modifiedTime": 1755859187508, "lastModifiedBy": "ETeghv7x8fjtIEKK", "exportSource": {"worldId": "gilead2", "uuid": "Item.SDFwequVtp6WsCFj", "coreVersion": "13.347", "systemId": "wrath-and-glory", "systemVersion": "7.1.1"}}, "folder": "85dkcvhBYli5TJrZ", "_id": "SDFwequVtp6WsCFj"}
|
|
||||||
@@ -1,75 +0,0 @@
|
|||||||
// WNG-Daemonhunters 0.6.4.2 — GK autoload (single dialog, restored Archetype in pack)
|
|
||||||
Hooks.once('ready', () => console.log("WNG-Daemonhunters | Auto-loadout ready"));
|
|
||||||
|
|
||||||
async function addFromPackByName(actor, packKey, name, equip=false) {
|
|
||||||
const pack = game.packs.get(packKey);
|
|
||||||
if (!pack) return ui.notifications?.warn(`Pack not found: ${packKey}`);
|
|
||||||
const index = await pack.getIndex();
|
|
||||||
const entry = index.find(e => e.name === name);
|
|
||||||
if (!entry) return ui.notifications?.warn(`Item not in pack: ${name}`);
|
|
||||||
const doc = await pack.getDocument(entry._id);
|
|
||||||
const data = doc.toObject(); delete data._id;
|
|
||||||
if (equip && data.system && ('equipped' in data.system)) data.system.equipped = true;
|
|
||||||
const [created] = await actor.createEmbeddedDocuments('Item', [data]);
|
|
||||||
return created;
|
|
||||||
}
|
|
||||||
async function addFromUuid(actor, uuid, equip=false) {
|
|
||||||
const doc = await fromUuid(uuid);
|
|
||||||
if (!doc) return ui.notifications?.warn(`Missing UUID: ${uuid}`);
|
|
||||||
const data = doc.toObject(); delete data._id;
|
|
||||||
if (equip && data.system && ('equipped' in data.system)) data.system.equipped = true;
|
|
||||||
const [created] = await actor.createEmbeddedDocuments('Item', [data]);
|
|
||||||
return created;
|
|
||||||
}
|
|
||||||
|
|
||||||
Hooks.on('createItem', async (item, options, userId) => {
|
|
||||||
try {
|
|
||||||
const actor = item.parent;
|
|
||||||
if (!actor || item.type !== 'archetype' || item.name !== 'Grey Knight') return;
|
|
||||||
if (game.userId !== userId) return;
|
|
||||||
if (actor.getFlag('wng-daemonhunters','gkLoaded')) return;
|
|
||||||
|
|
||||||
const content = `<p>Select initial loadout for <strong>Grey Knight</strong>:</p>
|
|
||||||
<div class="form-group"><label>Loadout</label>
|
|
||||||
<select id="gk-loadout">
|
|
||||||
<option value="incog">Incognito — Pilgrim Astartes Plate (Disguise Armour) + Astartes Combat Knife + Bolt Pistol</option>
|
|
||||||
<option value="power" selected>War‑Plate — Aegis Power Armour + Nemesis Force Halberd + Grey Knight Armour Integrated Storm Bolter</option>
|
|
||||||
<option value="termi">Terminator — Terminator Aegis (Grey Knights) + Nemesis Force Halberd + Grey Knight Armour Integrated Storm Bolter</option>
|
|
||||||
</select>
|
|
||||||
</div>`;
|
|
||||||
|
|
||||||
new Dialog({
|
|
||||||
title: "Grey Knight — Choose Loadout",
|
|
||||||
content,
|
|
||||||
buttons: {
|
|
||||||
ok: { label: "Apply", callback: async (html) => {
|
|
||||||
const choice = html.find('#gk-loadout').val();
|
|
||||||
const PACK = "wng-daemonhunters.daemonhunters";
|
|
||||||
|
|
||||||
// Core abilities
|
|
||||||
await addFromPackByName(actor, PACK, "Aegis of Titan");
|
|
||||||
await addFromPackByName(actor, PACK, "Brotherhood of Psykers");
|
|
||||||
await addFromPackByName(actor, PACK, "Might of Heroes");
|
|
||||||
|
|
||||||
if (choice === 'incog') {
|
|
||||||
await addFromPackByName(actor, PACK, "Pilgrim Astartes Plate (Disguise Armour)", true);
|
|
||||||
await addFromUuid(actor, "Compendium.wng-core.items.Item.4QVBQYWXXLyvFWkj", true); // Knife
|
|
||||||
await addFromUuid(actor, "Compendium.wng-core.items.Item.7b2xcPWBB7up65PM", true); // Bolt Pistol
|
|
||||||
} else if (choice === 'power') {
|
|
||||||
await addFromPackByName(actor, PACK, "Aegis Power Armour", true);
|
|
||||||
await addFromPackByName(actor, PACK, "Nemesis Force Halberd", true);
|
|
||||||
await addFromPackByName(actor, PACK, "Grey Knight Armour Integrated Storm Bolter", true);
|
|
||||||
} else if (choice === 'termi') {
|
|
||||||
await addFromPackByName(actor, PACK, "Terminator Aegis (Grey Knights)", true);
|
|
||||||
await addFromPackByName(actor, PACK, "Nemesis Force Halberd", true);
|
|
||||||
await addFromPackByName(actor, PACK, "Grey Knight Armour Integrated Storm Bolter", true);
|
|
||||||
}
|
|
||||||
|
|
||||||
await actor.setFlag('wng-daemonhunters','gkLoaded', true);
|
|
||||||
ui.notifications?.info("Grey Knight loadout applied.");
|
|
||||||
}}
|
|
||||||
},
|
|
||||||
default: "ok"
|
|
||||||
}).render(true);
|
|
||||||
} catch (e) { console.error("GK autoload error", e); }
|
|
||||||
});
|
|
||||||
@@ -1,40 +0,0 @@
|
|||||||
// GK – Import Items From Module into Items Directory
|
|
||||||
(async () => {
|
|
||||||
const FILES = [
|
|
||||||
"fvtt-Item-archetype-grey-knight_v5.json",
|
|
||||||
"fvtt-Item-ability-aegis-of-titan_v5.json",
|
|
||||||
"fvtt-Item-nemesis-force-halberd_v4.json",
|
|
||||||
"fvtt-Item-gk-armour-integrated-storm-bolter_v2.json",
|
|
||||||
"fvtt-Item-aegis-power-armour_v2.json",
|
|
||||||
"fvtt-Item-terminator-aegis-gk_v4.json"
|
|
||||||
];
|
|
||||||
const MODULE_ID = "gk-greyknight";
|
|
||||||
const base = `modules/${MODULE_ID}/foundry`;
|
|
||||||
|
|
||||||
const ensureFolder = async (name, color="#4b6eaf") => {
|
|
||||||
let f = game.folders.find(x => x.type === "Item" && x.name === name);
|
|
||||||
if (!f) f = await Folder.create({name, type:"Item", color});
|
|
||||||
return f;
|
|
||||||
};
|
|
||||||
const worldFolder = await ensureFolder("Grey Knight Pack", "#4b6eaf");
|
|
||||||
|
|
||||||
const fetchJSON = async (path) => {
|
|
||||||
const res = await fetch(`/${path}`);
|
|
||||||
if (!res.ok) throw new Error(`Nie mogę pobrać: ${path} (HTTP ${res.status})`);
|
|
||||||
return await res.json();
|
|
||||||
};
|
|
||||||
|
|
||||||
let created = 0, updated = 0;
|
|
||||||
for (const fn of FILES) {
|
|
||||||
const full = `${base}/${fn}`;
|
|
||||||
try {
|
|
||||||
const data = await fetchJSON(full);
|
|
||||||
if (data._id) delete data._id;
|
|
||||||
data.folder = worldFolder.id;
|
|
||||||
const existing = game.items.getName(data.name);
|
|
||||||
if (existing) { await existing.update(data); updated++; }
|
|
||||||
else { await Item.create(data); created++; }
|
|
||||||
} catch (e) { console.error("Import err", full, e); ui.notifications.warn(`Błąd importu: ${fn}`); }
|
|
||||||
}
|
|
||||||
ui.notifications.info(`GK Module Import: utworzono ${created}, zaktualizowano ${updated}.`);
|
|
||||||
})();
|
|
||||||
@@ -1,64 +0,0 @@
|
|||||||
// GK – Loadout Manager (module)
|
|
||||||
(async () => {
|
|
||||||
const NAMES = {
|
|
||||||
archetype: "Grey Knight (Archetype)",
|
|
||||||
ability: "Aegis of Titan (Ability)",
|
|
||||||
nemesis: "Nemesis Force Halberd",
|
|
||||||
storm: "Grey Knight Armour Integrated Storm Bolter",
|
|
||||||
aegis: "Aegis Power Armour",
|
|
||||||
term: "Terminator Aegis (Grey Knights)"
|
|
||||||
};
|
|
||||||
const FOLDER = "Grey Knight Pack";
|
|
||||||
|
|
||||||
const actor = canvas.tokens.controlled[0]?.actor ?? game.user.character;
|
|
||||||
if (!actor) return ui.notifications.warn("Zaznacz token albo przypisz postać.");
|
|
||||||
|
|
||||||
const mode = await Dialog.prompt({
|
|
||||||
title: "Grey Knight – Loadout Manager",
|
|
||||||
content: `<p>Wybierz lub zmień loadout:</p>
|
|
||||||
<label><input type="radio" name="m" value="incognito"> Incognito (bez Aegis)</label><br/>
|
|
||||||
<label><input type="radio" name="m" value="war" checked> War-Plate (Aegis Power Armour)</label><br/>
|
|
||||||
<label><input type="radio" name="m" value="term"> Terminator (Terminator Aegis)</label>`,
|
|
||||||
label: "OK",
|
|
||||||
callback: html => html.find('input[name="m"]:checked').val()
|
|
||||||
});
|
|
||||||
if (!mode) return;
|
|
||||||
|
|
||||||
const findWorldItem = (name) => {
|
|
||||||
const inFolder = game.items.filter(i => i.name === name && i.folder?.name === FOLDER);
|
|
||||||
if (inFolder.length) return inFolder[0];
|
|
||||||
return game.items.getName(name) ?? null;
|
|
||||||
};
|
|
||||||
const ensureOnActor = async (name) => {
|
|
||||||
const have = actor.items.getName(name);
|
|
||||||
if (have) return have;
|
|
||||||
const worldIt = findWorldItem(name);
|
|
||||||
if (!worldIt) { ui.notifications.warn(`Brak w Items Directory: ${name} — użyj importera modułu.`); return null; }
|
|
||||||
const created = await actor.createEmbeddedDocuments("Item", [worldIt.toObject()]);
|
|
||||||
return created[0];
|
|
||||||
};
|
|
||||||
|
|
||||||
for (const key of Object.keys(NAMES)) await ensureOnActor(NAMES[key]);
|
|
||||||
|
|
||||||
const setEquipped = async (name, on) => { const it = actor.items.getName(name); if (it) await it.update({"system.equipped": !!on}); };
|
|
||||||
await setEquipped(NAMES.aegis, false);
|
|
||||||
await setEquipped(NAMES.term, false);
|
|
||||||
await setEquipped(NAMES.storm, false);
|
|
||||||
await setEquipped(NAMES.nemesis, false);
|
|
||||||
|
|
||||||
if (mode === "war") {
|
|
||||||
await setEquipped(NAMES.aegis, true);
|
|
||||||
await setEquipped(NAMES.storm, true);
|
|
||||||
await setEquipped(NAMES.nemesis, true);
|
|
||||||
} else if (mode === "term") {
|
|
||||||
await setEquipped(NAMES.term, true);
|
|
||||||
await setEquipped(NAMES.storm, true);
|
|
||||||
await setEquipped(NAMES.nemesis, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
const anyAegisEquipped = !!actor.items.find(i => ["armour","armor"].includes(i.type) && /Aegis/.test(i.name) && i.system?.equipped);
|
|
||||||
const abilItem = actor.items.getName(NAMES.ability);
|
|
||||||
if (abilItem) for (const ef of abilItem.effects ?? []) if (ef.name?.includes("Aegis Synergy")) await ef.update({ disabled: !anyAegisEquipped });
|
|
||||||
|
|
||||||
ui.notifications.info(`Loadout ustawiony: ${mode.toUpperCase()}.`);
|
|
||||||
})();
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
// Auto loadout on archetype creation (hook Actor creation)
|
|
||||||
Hooks.on("createActor", async (actor, options, userId) => {
|
|
||||||
try {
|
|
||||||
const arch = actor.items.find(i => i.type === "archetype" && i.name?.includes("Grey Knight"));
|
|
||||||
if (!arch) return;
|
|
||||||
const names = ["Nemesis Force Halberd","Aegis Power Armour","Grey Knight Armour Integrated Storm Bolter","Aegis of Titan"];
|
|
||||||
const toAdd = [];
|
|
||||||
for (const n of names) {
|
|
||||||
const packItem = game.items.getName?.(n);
|
|
||||||
if (packItem) toAdd.push(packItem.toObject());
|
|
||||||
else {
|
|
||||||
// fallback: create minimal items
|
|
||||||
toAdd.push({name:n, type: n.includes("Armour") ? "armor" : (n.includes("Bolter") ? "weapon" : "ability"), img:"icons/svg/placeholder.svg", system:{}});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
await actor.createEmbeddedDocuments("Item", toAdd);
|
|
||||||
} catch(e) {
|
|
||||||
console.error(e);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
Reference in New Issue
Block a user