From 22e4553cc161ec5e2102b91d1b9dd29f1f27c601 Mon Sep 17 00:00:00 2001 From: Michal Tuszowski Date: Tue, 16 Sep 2025 14:44:55 +0200 Subject: [PATCH] dd --- wg-voidships-foundry/journal/README.md | 5 +- .../packs/wg-voidship-hulls.db | 28 +++- .../packs/wg-voidship-items.db | 32 ++++ .../packs/wg-voidship-macros.db | 4 + .../packs/wg-voidship-xenos.db | 1 + .../packs/wg-voidship-xewnos.db | 35 ---- wg-voidships-foundry/scripts/voidships.js | 151 +----------------- 7 files changed, 65 insertions(+), 191 deletions(-) create mode 100644 wg-voidships-foundry/packs/wg-voidship-items.db create mode 100644 wg-voidships-foundry/packs/wg-voidship-macros.db create mode 100644 wg-voidships-foundry/packs/wg-voidship-xenos.db delete mode 100644 wg-voidships-foundry/packs/wg-voidship-xewnos.db diff --git a/wg-voidships-foundry/journal/README.md b/wg-voidships-foundry/journal/README.md index cbffd04..bfa4398 100644 --- a/wg-voidships-foundry/journal/README.md +++ b/wg-voidships-foundry/journal/README.md @@ -1,3 +1,4 @@ -# W&G Voidships — Complete +# W&G Voidships — Builder -Actors, RollTable, Macros, Items. +Import a Hull from the hulls compendium, then add Items from the Items compendium or use the macros. +RollTables are provided by the separate module `wg-voidships-foundry`. diff --git a/wg-voidships-foundry/packs/wg-voidship-hulls.db b/wg-voidships-foundry/packs/wg-voidship-hulls.db index 838f432..7f86aa8 100644 --- a/wg-voidships-foundry/packs/wg-voidship-hulls.db +++ b/wg-voidships-foundry/packs/wg-voidship-hulls.db @@ -1,4 +1,24 @@ -{"_id":"hull000000000001","name":"Escort Hull (Empty)","type":"vehicle","img":null,"system":{"mnvr":2,"notes":"Empty hull. Add Components from Items pack.","combat":{"size":"colossal","speed":10,"wounds":{"value":0,"bonus":0,"max":18},"resilience":{"bonus":0,"total":9},"defence":{"bonus":3},"fly":0}},"prototypeToken":{"name":"Escort Hull (Empty)","width":4,"height":4,"displayName":50},"flags":{"wg-voidships":{"shields":{"current":1,"max":1},"speedVU":10,"handling":2,"cr":5,"tur":1,"mounts":"","traits":"","components":[]}},"items":[],"effects":[]} -{"_id":"hull000000000002","name":"Frigate Hull (Empty)","type":"vehicle","img":null,"system":{"mnvr":1,"notes":"Empty hull. Add Components from Items pack.","combat":{"size":"colossal","speed":10,"wounds":{"value":0,"bonus":0,"max":24},"resilience":{"bonus":0,"total":10},"defence":{"bonus":3},"fly":0}},"prototypeToken":{"name":"Frigate Hull (Empty)","width":4,"height":4,"displayName":50},"flags":{"wg-voidships":{"shields":{"current":2,"max":2},"speedVU":10,"handling":1,"cr":5,"tur":2,"mounts":"","traits":"","components":[]}},"items":[],"effects":[]} -{"_id":"hull000000000003","name":"Light Cruiser Hull (Empty)","type":"vehicle","img":null,"system":{"mnvr":0,"notes":"Empty hull. Add Components from Items pack.","combat":{"size":"colossal","speed":9,"wounds":{"value":0,"bonus":0,"max":32},"resilience":{"bonus":0,"total":11},"defence":{"bonus":2},"fly":0}},"prototypeToken":{"name":"Light Cruiser Hull (Empty)","width":4,"height":4,"displayName":50},"flags":{"wg-voidships":{"shields":{"current":2,"max":2},"speedVU":9,"handling":0,"cr":6,"tur":2,"mounts":"","traits":"","components":[]}},"items":[],"effects":[]} -{"_id":"hull000000000004","name":"Cruiser Hull (Empty)","type":"vehicle","img":null,"system":{"mnvr":-1,"notes":"Empty hull. Add Components from Items pack.","combat":{"size":"colossal","speed":8,"wounds":{"value":0,"bonus":0,"max":40},"resilience":{"bonus":0,"total":12},"defence":{"bonus":2},"fly":0}},"prototypeToken":{"name":"Cruiser Hull (Empty)","width":4,"height":4,"displayName":50},"flags":{"wg-voidships":{"shields":{"current":3,"max":3},"speedVU":8,"handling":-1,"cr":7,"tur":3,"mounts":"","traits":"","components":[]}},"items":[],"effects":[]} +{"_id": "4412029d26021383", "name": "Escort Hull (Empty)", "type": "vehicle", "img": null, "system": {"mnvr": 2, "notes": "Empty hull. Add Components from Items pack.", "combat": {"size": "colossal", "speed": 10, "wounds": {"value": 0, "bonus": 0, "max": 18}, "resilience": {"bonus": 0, "total": 9}, "defence": {"bonus": 3}, "fly": 0}}, "prototypeToken": {"name": "Escort Hull (Empty)", "width": 4, "height": 4, "displayName": 50}, "flags": {"wg-voidships": {"shields": {"current": 1, "max": 1}, "speedVU": 10, "handling": 2, "cr": 5, "tur": 1, "mounts": "", "traits": "", "components": []}}, "items": [], "effects": []} +{"_id": "1f954166473bedf3", "name": "Frigate Hull (Empty)", "type": "vehicle", "img": null, "system": {"mnvr": 1, "notes": "Empty hull. Add Components from Items pack.", "combat": {"size": "colossal", "speed": 10, "wounds": {"value": 0, "bonus": 0, "max": 24}, "resilience": {"bonus": 0, "total": 10}, "defence": {"bonus": 3}, "fly": 0}}, "prototypeToken": {"name": "Frigate Hull (Empty)", "width": 4, "height": 4, "displayName": 50}, "flags": {"wg-voidships": {"shields": {"current": 2, "max": 2}, "speedVU": 10, "handling": 1, "cr": 5, "tur": 2, "mounts": "", "traits": "", "components": []}}, "items": [], "effects": []} +{"_id": "c5ca1fc87803b111", "name": "Light Cruiser Hull (Empty)", "type": "vehicle", "img": null, "system": {"mnvr": 0, "notes": "Empty hull. Add Components from Items pack.", "combat": {"size": "colossal", "speed": 9, "wounds": {"value": 0, "bonus": 0, "max": 32}, "resilience": {"bonus": 0, "total": 11}, "defence": {"bonus": 2}, "fly": 0}}, "prototypeToken": {"name": "Light Cruiser Hull (Empty)", "width": 4, "height": 4, "displayName": 50}, "flags": {"wg-voidships": {"shields": {"current": 2, "max": 2}, "speedVU": 9, "handling": 0, "cr": 6, "tur": 2, "mounts": "", "traits": "", "components": []}}, "items": [], "effects": []} +{"_id": "96a0dacd77d672bb", "name": "Cruiser Hull (Empty)", "type": "vehicle", "img": null, "system": {"mnvr": -1, "notes": "Empty hull. Add Components from Items pack.", "combat": {"size": "colossal", "speed": 8, "wounds": {"value": 0, "bonus": 0, "max": 40}, "resilience": {"bonus": 0, "total": 12}, "defence": {"bonus": 2}, "fly": 0}}, "prototypeToken": {"name": "Cruiser Hull (Empty)", "width": 4, "height": 4, "displayName": 50}, "flags": {"wg-voidships": {"shields": {"current": 3, "max": 3}, "speedVU": 8, "handling": -1, "cr": 7, "tur": 3, "mounts": "", "traits": "", "components": []}}, "items": [], "effects": []} +{"_id": "a08b1d9ef251ec0b", "name": "Jericho-class Pilgrim Vessel", "type": "vehicle", "img": null, "system": {"mnvr": -1, "notes": "Immense conversions for pilgrim passages and reliquary cargo. Cavernous holds and chapels; range and capacity over armour and speed.", "combat": {"size": "colossal", "speed": 8, "wounds": {"value": 0, "bonus": 0, "max": 36}, "resilience": {"bonus": 0, "total": 12}, "defence": {"bonus": 2}, "fly": 0}, "source": "Rogue Trader Core Rulebook, p. 195"}, "prototypeToken": {"name": "Jericho-class Pilgrim Vessel", "width": 4, "height": 4, "displayName": 50}, "flags": {"wg-voidships": {"source": "Rogue Trader Core Rulebook, p. 195", "shields": {"current": 1, "max": 1}, "speedVU": 8, "handling": -1, "cr": 5, "tur": 1, "mounts": "", "traits": "", "components": []}}, "items": [], "effects": []} +{"_id": "95fcf7b99d705bd1", "name": "Vagabond-class Merchant Trader", "type": "vehicle", "img": null, "system": {"mnvr": -1, "notes": "Modular cargobays and adaptable fittings; a chartist workhorse. Simple to keep running in frontier yards; heavily customised.", "combat": {"size": "colossal", "speed": 8, "wounds": {"value": 0, "bonus": 0, "max": 36}, "resilience": {"bonus": 0, "total": 12}, "defence": {"bonus": 2}, "fly": 0}, "source": "Rogue Trader Core Rulebook, p. 195"}, "prototypeToken": {"name": "Vagabond-class Merchant Trader", "width": 4, "height": 4, "displayName": 50}, "flags": {"wg-voidships": {"source": "Rogue Trader Core Rulebook, p. 195", "shields": {"current": 1, "max": 1}, "speedVU": 8, "handling": -1, "cr": 5, "tur": 1, "mounts": "", "traits": "", "components": []}}, "items": [], "effects": []} +{"_id": "521f6e630bd813a4", "name": "Hazeroth-class Privateer", "type": "vehicle", "img": null, "system": {"mnvr": 2, "notes": "Knife-fast raider with reinforced internals and stripped armour. Favoured for ambushes and commerce raiding.", "combat": {"size": "colossal", "speed": 10, "wounds": {"value": 0, "bonus": 0, "max": 22}, "resilience": {"bonus": 0, "total": 9}, "defence": {"bonus": 3}, "fly": 0}, "source": "Rogue Trader Core Rulebook, p. 195"}, "prototypeToken": {"name": "Hazeroth-class Privateer", "width": 4, "height": 4, "displayName": 50}, "flags": {"wg-voidships": {"source": "Rogue Trader Core Rulebook, p. 195", "shields": {"current": 1, "max": 1}, "speedVU": 10, "handling": 2, "cr": 5, "tur": 1, "mounts": "", "traits": "", "components": []}}, "items": [], "effects": []} +{"_id": "c4c69cf1b895c0e1", "name": "Havoc-class Merchant Raider", "type": "vehicle", "img": null, "system": {"mnvr": 2, "notes": "Hybrid carrier-raider balancing battery weight with cargo. Less protected than Navy hulls but brutal on traffic.", "combat": {"size": "colossal", "speed": 10, "wounds": {"value": 0, "bonus": 0, "max": 22}, "resilience": {"bonus": 0, "total": 9}, "defence": {"bonus": 3}, "fly": 0}, "source": "Rogue Trader Core Rulebook, p. 196"}, "prototypeToken": {"name": "Havoc-class Merchant Raider", "width": 4, "height": 4, "displayName": 50}, "flags": {"wg-voidships": {"source": "Rogue Trader Core Rulebook, p. 196", "shields": {"current": 1, "max": 1}, "speedVU": 10, "handling": 2, "cr": 5, "tur": 1, "mounts": "", "traits": "", "components": []}}, "items": [], "effects": []} +{"_id": "ec53303961ef4fd4", "name": "Sword-class Frigate", "type": "vehicle", "img": null, "system": {"mnvr": 1, "notes": "Reliable escort with accurate dorsal lasers and stout drives. Squadrons screen convoys and prosecute pirates.", "combat": {"size": "colossal", "speed": 10, "wounds": {"value": 0, "bonus": 0, "max": 28}, "resilience": {"bonus": 0, "total": 10}, "defence": {"bonus": 3}, "fly": 0}, "source": "Battlefleet Koronus, p. 28"}, "prototypeToken": {"name": "Sword-class Frigate", "width": 4, "height": 4, "displayName": 50}, "flags": {"wg-voidships": {"source": "Battlefleet Koronus, p. 28", "shields": {"current": 2, "max": 2}, "speedVU": 10, "handling": 1, "cr": 5, "tur": 2, "mounts": "", "traits": "", "components": []}}, "items": [], "effects": []} +{"_id": "fb874877eacc7a08", "name": "Tempest-class Strike Frigate", "type": "vehicle", "img": null, "system": {"mnvr": 1, "notes": "Close-action brawler for boardings and short-range gunnery. Reinforced prow and over-tuned drives.", "combat": {"size": "colossal", "speed": 10, "wounds": {"value": 0, "bonus": 0, "max": 28}, "resilience": {"bonus": 0, "total": 10}, "defence": {"bonus": 3}, "fly": 0}, "source": "Rogue Trader Core Rulebook, p. 196"}, "prototypeToken": {"name": "Tempest-class Strike Frigate", "width": 4, "height": 4, "displayName": 50}, "flags": {"wg-voidships": {"source": "Rogue Trader Core Rulebook, p. 196", "shields": {"current": 2, "max": 2}, "speedVU": 10, "handling": 1, "cr": 5, "tur": 2, "mounts": "", "traits": "", "components": []}}, "items": [], "effects": []} +{"_id": "c8975bb7181d8e12", "name": "Dauntless-class Light Cruiser", "type": "vehicle", "img": null, "system": {"mnvr": 0, "notes": "Versatile patrol cruiser—good acceleration and flexible refits. Often leads Passage Watch patrols.", "combat": {"size": "colossal", "speed": 9, "wounds": {"value": 0, "bonus": 0, "max": 32}, "resilience": {"bonus": 0, "total": 11}, "defence": {"bonus": 2}, "fly": 0}, "source": "Battlefleet Koronus, p. 36"}, "prototypeToken": {"name": "Dauntless-class Light Cruiser", "width": 4, "height": 4, "displayName": 50}, "flags": {"wg-voidships": {"source": "Battlefleet Koronus, p. 36", "shields": {"current": 2, "max": 2}, "speedVU": 9, "handling": 0, "cr": 6, "tur": 2, "mounts": "", "traits": "", "components": []}}, "items": [], "effects": []} +{"_id": "0b59c38ddda63f42", "name": "Lunar-class Cruiser", "type": "vehicle", "img": null, "system": {"mnvr": -1, "notes": "Archetypal line cruiser—balanced, dependable, easily refitted. Backbone of many squadrons.", "combat": {"size": "colossal", "speed": 8, "wounds": {"value": 0, "bonus": 0, "max": 40}, "resilience": {"bonus": 0, "total": 12}, "defence": {"bonus": 2}, "fly": 0}, "source": "Battlefleet Koronus, p. 24"}, "prototypeToken": {"name": "Lunar-class Cruiser", "width": 4, "height": 4, "displayName": 50}, "flags": {"wg-voidships": {"source": "Battlefleet Koronus, p. 24", "shields": {"current": 3, "max": 3}, "speedVU": 8, "handling": -1, "cr": 7, "tur": 3, "mounts": "", "traits": "", "components": []}}, "items": [], "effects": []} +{"_id": "b518e981d69324aa", "name": "Cobra-class Destroyer", "type": "vehicle", "img": null, "system": {"mnvr": 2, "notes": "Torpedo raider hunting in packs; strikes, then disengages to reload.", "combat": {"size": "colossal", "speed": 10, "wounds": {"value": 0, "bonus": 0, "max": 22}, "resilience": {"bonus": 0, "total": 9}, "defence": {"bonus": 3}, "fly": 0}, "source": "Battlefleet Koronus, p. 66"}, "prototypeToken": {"name": "Cobra-class Destroyer", "width": 4, "height": 4, "displayName": 50}, "flags": {"wg-voidships": {"source": "Battlefleet Koronus, p. 66", "shields": {"current": 1, "max": 1}, "speedVU": 10, "handling": 2, "cr": 5, "tur": 1, "mounts": "", "traits": "", "components": []}}, "items": [], "effects": []} +{"_id": "d3853b0270deaf3f", "name": "Falchion-class Frigate", "type": "vehicle", "img": null, "system": {"mnvr": 1, "notes": "Modernised frigate with improved drives for frontier scouting.", "combat": {"size": "colossal", "speed": 10, "wounds": {"value": 0, "bonus": 0, "max": 28}, "resilience": {"bonus": 0, "total": 10}, "defence": {"bonus": 3}, "fly": 0}, "source": "Battlefleet Koronus, p. 28"}, "prototypeToken": {"name": "Falchion-class Frigate", "width": 4, "height": 4, "displayName": 50}, "flags": {"wg-voidships": {"source": "Battlefleet Koronus, p. 28", "shields": {"current": 2, "max": 2}, "speedVU": 10, "handling": 1, "cr": 5, "tur": 2, "mounts": "", "traits": "", "components": []}}, "items": [], "effects": []} +{"_id": "f1ea3416a6d0d27e", "name": "Turbulent-class Heavy Frigate", "type": "vehicle", "img": null, "system": {"mnvr": 1, "notes": "Strengthened frame and broader arcs; trades agility for staying power.", "combat": {"size": "colossal", "speed": 10, "wounds": {"value": 0, "bonus": 0, "max": 28}, "resilience": {"bonus": 0, "total": 10}, "defence": {"bonus": 3}, "fly": 0}, "source": "Battlefleet Koronus, p. 28"}, "prototypeToken": {"name": "Turbulent-class Heavy Frigate", "width": 4, "height": 4, "displayName": 50}, "flags": {"wg-voidships": {"source": "Battlefleet Koronus, p. 28", "shields": {"current": 2, "max": 2}, "speedVU": 10, "handling": 1, "cr": 5, "tur": 2, "mounts": "", "traits": "", "components": []}}, "items": [], "effects": []} +{"_id": "73eed7c83ea60340", "name": "Defiant-class Light Cruiser (Carrier)", "type": "vehicle", "img": null, "system": {"mnvr": 0, "notes": "Light carrier with significant attack craft; excellent for recon and strikes.", "combat": {"size": "colossal", "speed": 9, "wounds": {"value": 0, "bonus": 0, "max": 32}, "resilience": {"bonus": 0, "total": 11}, "defence": {"bonus": 2}, "fly": 0}}, "prototypeToken": {"name": "Defiant-class Light Cruiser (Carrier)", "width": 4, "height": 4, "displayName": 50}, "flags": {"wg-voidships": {"source": "Battlefleet Koronus", "shields": {"current": 2, "max": 2}, "speedVU": 9, "handling": 0, "cr": 6, "tur": 2, "mounts": "", "traits": "", "components": []}}, "items": [], "effects": []} +{"_id": "6836e238cce8d9fc", "name": "Universe-class Mass Conveyor", "type": "vehicle", "img": null, "system": {"mnvr": -1, "notes": "Super-massive hauler for colony loads and crusade materiel; logistics linchpin.", "combat": {"size": "colossal", "speed": 8, "wounds": {"value": 0, "bonus": 0, "max": 36}, "resilience": {"bonus": 0, "total": 12}, "defence": {"bonus": 2}, "fly": 0}, "source": "Battlefleet Koronus, p. 31"}, "prototypeToken": {"name": "Universe-class Mass Conveyor", "width": 4, "height": 4, "displayName": 50}, "flags": {"wg-voidships": {"source": "Battlefleet Koronus, p. 31", "shields": {"current": 1, "max": 1}, "speedVU": 8, "handling": -1, "cr": 5, "tur": 1, "mounts": "", "traits": "", "components": []}}, "items": [], "effects": []} +{"_id": "2c612305a7bb853f", "name": "Goliath-class Factory Ship", "type": "vehicle", "img": null, "system": {"mnvr": -1, "notes": "Roving manufactorum and refinery; long autonomous deployments.", "combat": {"size": "colossal", "speed": 8, "wounds": {"value": 0, "bonus": 0, "max": 36}, "resilience": {"bonus": 0, "total": 12}, "defence": {"bonus": 2}, "fly": 0}, "source": "Battlefleet Koronus, p. 30"}, "prototypeToken": {"name": "Goliath-class Factory Ship", "width": 4, "height": 4, "displayName": 50}, "flags": {"wg-voidships": {"source": "Battlefleet Koronus, p. 30", "shields": {"current": 1, "max": 1}, "speedVU": 8, "handling": -1, "cr": 5, "tur": 1, "mounts": "", "traits": "", "components": []}}, "items": [], "effects": []} +{"_id": "287a7cd15c95031f", "name": "Conquest-class Star Galleon", "type": "vehicle", "img": null, "system": {"mnvr": -1, "notes": "Heavily built merchant galleon with strong batteries and hull.", "combat": {"size": "colossal", "speed": 8, "wounds": {"value": 0, "bonus": 0, "max": 36}, "resilience": {"bonus": 0, "total": 12}, "defence": {"bonus": 2}, "fly": 0}, "source": "Battlefleet Koronus, p. 25"}, "prototypeToken": {"name": "Conquest-class Star Galleon", "width": 4, "height": 4, "displayName": 50}, "flags": {"wg-voidships": {"source": "Battlefleet Koronus, p. 25", "shields": {"current": 1, "max": 1}, "speedVU": 8, "handling": -1, "cr": 5, "tur": 1, "mounts": "", "traits": "", "components": []}}, "items": [], "effects": []} +{"_id": "750ee1998f698e08", "name": "Orion-class Star Clipper", "type": "vehicle", "img": null, "system": {"mnvr": -1, "notes": "Fast passenger/light-cargo clipper for courier missions and risky runs.", "combat": {"size": "colossal", "speed": 8, "wounds": {"value": 0, "bonus": 0, "max": 36}, "resilience": {"bonus": 0, "total": 12}, "defence": {"bonus": 2}, "fly": 0}, "source": "Into the Storm, p. 150"}, "prototypeToken": {"name": "Orion-class Star Clipper", "width": 4, "height": 4, "displayName": 50}, "flags": {"wg-voidships": {"source": "Into the Storm, p. 150", "shields": {"current": 1, "max": 1}, "speedVU": 8, "handling": -1, "cr": 5, "tur": 1, "mounts": "", "traits": "", "components": []}}, "items": [], "effects": []} +{"_id": "6da4418bdbd2206c", "name": "Cobra-class Destroyer (Renegade)", "type": "vehicle", "img": null, "system": {"mnvr": 2, "notes": "Ex-Navy Cobra in privateer hands with non-standard prow refits.", "combat": {"size": "colossal", "speed": 10, "wounds": {"value": 0, "bonus": 0, "max": 22}, "resilience": {"bonus": 0, "total": 9}, "defence": {"bonus": 3}, "fly": 0}, "source": "Battlefleet Koronus, p. 66"}, "prototypeToken": {"name": "Cobra-class Destroyer (Renegade)", "width": 4, "height": 4, "displayName": 50}, "flags": {"wg-voidships": {"source": "Battlefleet Koronus, p. 66", "shields": {"current": 1, "max": 1}, "speedVU": 10, "handling": 2, "cr": 5, "tur": 1, "mounts": "", "traits": "", "components": []}}, "items": [], "effects": []} +{"_id": "0eb071148d375807", "name": "Secutor-class Monitor-Cruiser", "type": "vehicle", "img": null, "system": {"mnvr": -1, "notes": "Mechanicus monitor with powerful dorsals and redundant shielding; anchors actions.", "combat": {"size": "colossal", "speed": 8, "wounds": {"value": 0, "bonus": 0, "max": 40}, "resilience": {"bonus": 0, "total": 12}, "defence": {"bonus": 2}, "fly": 0}, "source": "Into the Storm, p. 151"}, "prototypeToken": {"name": "Secutor-class Monitor-Cruiser", "width": 4, "height": 4, "displayName": 50}, "flags": {"wg-voidships": {"source": "Into the Storm, p. 151", "shields": {"current": 3, "max": 3}, "speedVU": 8, "handling": -1, "cr": 7, "tur": 3, "mounts": "", "traits": "", "components": []}}, "items": [], "effects": []} +{"_id": "104965869ffa36bb", "name": "Lathe-class Monitor-Cruiser", "type": "vehicle", "img": null, "system": {"mnvr": -1, "notes": "Lathes-forged variant emphasising resilient sanctified systems.", "combat": {"size": "colossal", "speed": 8, "wounds": {"value": 0, "bonus": 0, "max": 40}, "resilience": {"bonus": 0, "total": 12}, "defence": {"bonus": 2}, "fly": 0}, "source": "Into the Storm, p. 152"}, "prototypeToken": {"name": "Lathe-class Monitor-Cruiser", "width": 4, "height": 4, "displayName": 50}, "flags": {"wg-voidships": {"source": "Into the Storm, p. 152", "shields": {"current": 3, "max": 3}, "speedVU": 8, "handling": -1, "cr": 7, "tur": 3, "mounts": "", "traits": "", "components": []}}, "items": [], "effects": []} +{"_id": "6774443321f24e87", "name": "Tyrant-class Cruiser", "type": "vehicle", "img": null, "system": {"mnvr": -1, "notes": "Macrobattery-focused cruiser optimised for crushing broadsides.", "combat": {"size": "colossal", "speed": 8, "wounds": {"value": 0, "bonus": 0, "max": 40}, "resilience": {"bonus": 0, "total": 12}, "defence": {"bonus": 2}, "fly": 0}, "source": "Into the Storm, p. 153"}, "prototypeToken": {"name": "Tyrant-class Cruiser", "width": 4, "height": 4, "displayName": 50}, "flags": {"wg-voidships": {"source": "Into the Storm, p. 153", "shields": {"current": 3, "max": 3}, "speedVU": 8, "handling": -1, "cr": 7, "tur": 3, "mounts": "", "traits": "", "components": []}}, "items": [], "effects": []} diff --git a/wg-voidships-foundry/packs/wg-voidship-items.db b/wg-voidships-foundry/packs/wg-voidship-items.db new file mode 100644 index 0000000..3bc306f --- /dev/null +++ b/wg-voidships-foundry/packs/wg-voidship-items.db @@ -0,0 +1,32 @@ +{"_id": "4c636b539f64cdb9", "name": "Mars-Pattern Macrocannon", "type": "weapon", "img": null, "system": {"category": "ranged", "damage": {"base": 12, "bonus": 0, "rank": 0, "ed": {"base": 3, "bonus": 0, "rank": 0}, "ap": {"base": -1, "bonus": 0, "rank": 0}, "enabled": false, "otherDamage": {"mortal": "0", "shock": "0", "wounds": "0"}}, "range": {"short": 30, "medium": 60, "long": 120, "melee": 1, "thrown": null}, "salvo": 3, "traits": {"list": [{"name": "brutal"}, {"name": "rapidFire", "rating": "2"}]}, "keywords": "VOIDSHIP, MACROBROADSIDES"}} +{"_id": "ca475410c5c586ab", "name": "Sunsear Laser Battery", "type": "weapon", "img": null, "system": {"category": "ranged", "damage": {"base": 14, "bonus": 0, "rank": 0, "ed": {"base": 2, "bonus": 0, "rank": 0}, "ap": {"base": -2, "bonus": 0, "rank": 0}, "enabled": false, "otherDamage": {"mortal": "0", "shock": "0", "wounds": "0"}}, "range": {"short": 40, "medium": 80, "long": 160, "melee": 1, "thrown": null}, "salvo": 2, "traits": {"list": [{"name": "reliable"}, {"name": "volley", "rating": "2"}]}, "keywords": "VOIDSHIP, MACROLASERS"}} +{"_id": "2e5ebcbd3f63b739", "name": "Lance Battery", "type": "weapon", "img": null, "system": {"category": "ranged", "damage": {"base": 16, "bonus": 0, "rank": 0, "ed": {"base": 1, "bonus": 0, "rank": 0}, "ap": {"base": -3, "bonus": 0, "rank": 0}, "enabled": false, "otherDamage": {"mortal": "0", "shock": "0", "wounds": "0"}}, "range": {"short": 50, "medium": 100, "long": 200, "melee": 1, "thrown": null}, "salvo": 2, "traits": {"list": [{"name": "precise"}, {"name": "volley", "rating": "2"}]}, "keywords": "VOIDSHIP, LANCE"}} +{"_id": "c0e76cf8e4a100c0", "name": "Torpedo Tubes", "type": "gear", "img": null, "system": {"description": "Bow torpedo tubes (ordnance).", "value": 0, "rarity": "rare", "keywords": "VOIDSHIP, ORDNANCE"}} +{"_id": "60951ef378ddb44c", "name": "Launch Bay", "type": "gear", "img": null, "system": {"description": "Attack craft wings.", "value": 0, "rarity": "rare", "keywords": "VOIDSHIP, ORDNANCE"}} +{"_id": "24c79e9c9ee464af", "name": "Nova Cannon", "type": "gear", "img": null, "system": {"description": "Superheavy ordnance; GM adjudication.", "value": 0, "rarity": "veryRare", "keywords": "VOIDSHIP, ORDNANCE"}} +{"_id": "dce16e3acc436f41", "name": "Plasma Drive — Jovian Pattern", "type": "gear", "img": null, "system": {"description": "Essential Component: plasma drive (Jovian).", "value": 0, "rarity": "rare", "keywords": "VOIDSHIP, ESSENTIAL, DRIVE"}} +{"_id": "501ff1a2bd541b7a", "name": "Plasma Drive — Lathe Pattern", "type": "gear", "img": null, "system": {"description": "Essential Component: plasma drive (Lathe).", "value": 0, "rarity": "veryRare", "keywords": "VOIDSHIP, ESSENTIAL, DRIVE"}} +{"_id": "696ec23471a30210", "name": "Warp Engine — Strelov", "type": "gear", "img": null, "system": {"description": "Essential Component: warp engine (Strelov).", "value": 0, "rarity": "rare", "keywords": "VOIDSHIP, ESSENTIAL, WARP"}} +{"_id": "6251cd78f55a7109", "name": "Warp Engine — Miloslav", "type": "gear", "img": null, "system": {"description": "Essential Component: warp engine (Miloslav).", "value": 0, "rarity": "veryRare", "keywords": "VOIDSHIP, ESSENTIAL, WARP"}} +{"_id": "46a88fd35a5b5c3c", "name": "Geller Field (Primary)", "type": "gear", "img": null, "system": {"description": "Primary Geller field projector.", "value": 0, "rarity": "rare", "keywords": "VOIDSHIP, ESSENTIAL, GELLER"}} +{"_id": "3e086585bbae99e3", "name": "Geller Field (Reserve)", "type": "gear", "img": null, "system": {"description": "Reserve/backup Geller field (independent).", "value": 0, "rarity": "rare", "keywords": "VOIDSHIP, ESSENTIAL, GELLER"}} +{"_id": "252f476c561c29a4", "name": "Void Shield Array (Single)", "type": "gear", "img": null, "system": {"description": "Single-pattern void shields.", "value": 0, "rarity": "rare", "keywords": "VOIDSHIP, ESSENTIAL, SHIELDS"}} +{"_id": "ba4dff7991891d61", "name": "Void Shield Array (Double)", "type": "gear", "img": null, "system": {"description": "Dual-pattern void shields.", "value": 0, "rarity": "veryRare", "keywords": "VOIDSHIP, ESSENTIAL, SHIELDS"}} +{"_id": "830b39f8c6a0367e", "name": "Combat Bridge", "type": "gear", "img": null, "system": {"description": "Command bridge; targeting/cmd suites.", "value": 0, "rarity": "uncommon", "keywords": "VOIDSHIP, ESSENTIAL, BRIDGE"}} +{"_id": "9f0743898f310492", "name": "Vitae-Pattern Life Sustainer", "type": "gear", "img": null, "system": {"description": "Essential life sustainer system.", "value": 0, "rarity": "rare", "keywords": "VOIDSHIP, ESSENTIAL, LIFE-SUSTAINER"}} +{"_id": "d8430ab1d15beb37", "name": "Voidsmen Quarters", "type": "gear", "img": null, "system": {"description": "Standard crew quarters.", "value": 0, "rarity": "common", "keywords": "VOIDSHIP, ESSENTIAL, QUARTERS"}} +{"_id": "1916605eb593cc0a", "name": "Luxury Passenger Quarters", "type": "gear", "img": null, "system": {"description": "Luxury accommodations.", "value": 0, "rarity": "rare", "keywords": "VOIDSHIP, ESSENTIAL, QUARTERS"}} +{"_id": "dd72e813065d0e34", "name": "Auger Array", "type": "gear", "img": null, "system": {"description": "Standard shipboard augur sensors.", "value": 0, "rarity": "uncommon", "keywords": "VOIDSHIP, ESSENTIAL, AUGUR"}} +{"_id": "fff778f13b7ddf73", "name": "Empyrean Mantle", "type": "gear", "img": null, "system": {"description": "Warp-signature damping.", "value": 0, "rarity": "veryRare", "keywords": "VOIDSHIP, SUPPLEMENTAL, STEALTH"}} +{"_id": "2a099d32269fcc91", "name": "Holo-Baffles", "type": "gear", "img": null, "system": {"description": "Visual/holo signature masking.", "value": 0, "rarity": "rare", "keywords": "VOIDSHIP, SUPPLEMENTAL, STEALTH"}} +{"_id": "692975b02473b4ef", "name": "Teleportarium", "type": "gear", "img": null, "system": {"description": "Teleport insertion capability.", "value": 0, "rarity": "veryRare", "keywords": "VOIDSHIP, SUPPLEMENTAL"}} +{"_id": "26ea0553729833be", "name": "Tenebro-Maze", "type": "gear", "img": null, "system": {"description": "Internal labyrinth vs boarders.", "value": 0, "rarity": "rare", "keywords": "VOIDSHIP, SUPPLEMENTAL"}} +{"_id": "b9cd53d57d0eb46c", "name": "Murder-Servitors", "type": "gear", "img": null, "system": {"description": "Automated servitor kill-grids.", "value": 0, "rarity": "veryRare", "keywords": "VOIDSHIP, SUPPLEMENTAL"}} +{"_id": "209b5b26731923b6", "name": "Superior Plating", "type": "gear", "img": null, "system": {"description": "Enhanced armor facings.", "value": 0, "rarity": "rare", "keywords": "VOIDSHIP, SUPPLEMENTAL"}} +{"_id": "96594975caec8fd1", "name": "Librarium Vault", "type": "gear", "img": null, "system": {"description": "Schola/librarium complex.", "value": 0, "rarity": "uncommon", "keywords": "VOIDSHIP, SUPPLEMENTAL"}} +{"_id": "53394adfd9df0f67", "name": "Temple-Shrine to the God-Emperor", "type": "gear", "img": null, "system": {"description": "Dedicated shrine complex.", "value": 0, "rarity": "uncommon", "keywords": "VOIDSHIP, SUPPLEMENTAL"}} +{"_id": "eed15ac1f0b855d0", "name": "Observation Dome", "type": "gear", "img": null, "system": {"description": "Panoramic astrogation dome.", "value": 0, "rarity": "uncommon", "keywords": "VOIDSHIP, SUPPLEMENTAL"}} +{"_id": "035ef8929ef5c465", "name": "Cargo Hold & Lighter Bay", "type": "gear", "img": null, "system": {"description": "Expanded cargo & lighters.", "value": 0, "rarity": "common", "keywords": "VOIDSHIP, SUPPLEMENTAL"}} +{"_id": "ce218220da6dad3e", "name": "Barracks", "type": "gear", "img": null, "system": {"description": "Embarked troops for boarding/landings.", "value": 0, "rarity": "uncommon", "keywords": "VOIDSHIP, SUPPLEMENTAL"}} +{"_id": "32caa789ebca127b", "name": "Auto-Temple", "type": "gear", "img": null, "system": {"description": "Automated Ecclesiarchy node.", "value": 0, "rarity": "rare", "keywords": "VOIDSHIP, SUPPLEMENTAL"}} +{"_id": "3e2dd5640db8e12b", "name": "Trophy Room", "type": "gear", "img": null, "system": {"description": "Crew morale-focused trophy hall.", "value": 0, "rarity": "uncommon", "keywords": "VOIDSHIP, SUPPLEMENTAL"}} diff --git a/wg-voidships-foundry/packs/wg-voidship-macros.db b/wg-voidships-foundry/packs/wg-voidship-macros.db new file mode 100644 index 0000000..e0281bf --- /dev/null +++ b/wg-voidships-foundry/packs/wg-voidship-macros.db @@ -0,0 +1,4 @@ +{"_id": "4be25d217b8dd9de", "name": "Add Gear to Selected Voidship", "type": "script", "img": "icons/svg/plus.svg", "command": "(async ()=>{const a=canvas.tokens.controlled[0]?.actor; if(!a) return ui.notifications.warn('Select a voidship token.'); const pack=game.packs.get('wg-voidships-builder.wg-voidship-items'); if(!pack) return ui.notifications.error('Items pack not found.'); const index=await pack.getIndex(); const names=index.map(e=>e.name).sort(); const opts=names.map(n=>``).join(''); const content=`

Choose items to add (Ctrl/Cmd+Click):

`; new Dialog({title:'Add Gear', content, buttons:{ok:{label:'Add',callback:async html=>{const sel=[...html[0].querySelector('#it').selectedOptions].map(o=>o.value); const docs=await pack.getDocuments({name:{$in:sel}}); const data=docs.map(d=>d.toObject()); await a.createEmbeddedDocuments('Item', data); ui.notifications.info(`Added ${sel.length} item(s) to ${a.name}.`);}}}}).render(true);})();", "scope": "global", "author": null, "ownership": {"default": 2}} +{"_id": "41ade68c839678fa", "name": "Remove All Gear (Selected)", "type": "script", "img": "icons/svg/trash.svg", "command": "(async()=>{const a=canvas.tokens.controlled[0]?.actor; if(!a) return ui.notifications.warn('Select a voidship token.'); const ids=a.items.filter(i=>['gear','weapon'].includes(i.type)).map(i=>i.id); if(!ids.length) return ui.notifications.info('No gear/weapon items to remove.'); await a.deleteEmbeddedDocuments('Item', ids); ui.notifications.info(`Removed ${ids.length} items from ${a.name}.`);})();", "scope": "global", "author": null, "ownership": {"default": 2}} +{"_id": "5079989f359a3c3d", "name": "Toggle Geller (Primary/Reserve)", "type": "script", "img": "icons/svg/aura.svg", "command": "(async()=>{const a=canvas.tokens.controlled[0]?.actor; if(!a) return ui.notifications.warn('Select a voidship token.'); const g=a.getFlag('wg-voidships','geller')||{primaryActive:false,reserveActive:false}; const content=`

Primary:

Reserve:

`; new Dialog({title:'Geller Fields',content,buttons:{ok:{label:'Set',callback:async html=>{const p=html[0].querySelector('#p').checked; const r=html[0].querySelector('#r').checked; await a.setFlag('wg-voidships','geller',{primaryActive:p,reserveActive:r}); ChatMessage.create({content:`${a.name}: Geller Primary ${p?'ON':'OFF'} / Reserve ${r?'ON':'OFF'}`});}}}}).render(true);})();", "scope": "global", "author": null, "ownership": {"default": 2}} +{"_id": "6a4bc2349dda4733", "name": "Organize Builder Compendia Folders", "type": "script", "img": "icons/svg/folder.svg", "command": "(async ()=>{\n const moduleId = \"wg-voidships-builder\";\n const packs = {\n items: game.packs.get(`${moduleId}.wg-voidship-items`),\n hulls: game.packs.get(`${moduleId}.wg-voidship-hulls`)\n };\n async function ensureFolder(pack, name) {\n await pack.getIndex();\n const typeName = pack.documentName; // \"Item\" or \"Actor\"\n const existing = pack.folders.find(f => f.name === name);\n if (existing) return existing;\n return Folder.create({ name, type: typeName, sorting: \"a\" }, { pack: pack.collection });\n }\n // Items\n if (packs.items) {\n const fWeapons = await ensureFolder(packs.items, \"Weapons\");\n const fEssential = await ensureFolder(packs.items, \"Essential Components\");\n const fSupplemental = await ensureFolder(packs.items, \"Supplemental Components\");\n const fOrdnance = await ensureFolder(packs.items, \"Ordnance\");\n const docs = await packs.items.getDocuments();\n for (const d of docs) {\n const kw = String(d.system?.keywords ?? \"\").toUpperCase();\n let folder = fSupplemental;\n if (d.type === \"weapon\") folder = fWeapons;\n else if (kw.includes(\"ESSENTIAL\")) folder = fEssential;\n else if (kw.includes(\"ORDNANCE\")) folder = fOrdnance;\n if (!d.folder || d.folder.id !== folder.id) {\n await d.update({ folder: folder.id }, { pack: packs.items.collection });\n }\n }\n }\n // Hulls\n if (packs.hulls) {\n const fHulls = await ensureFolder(packs.hulls, \"Hulls\");\n const docs = await packs.hulls.getDocuments();\n for (const d of docs) {\n if (!d.folder || d.folder.id !== fHulls.id) {\n await d.update({ folder: fHulls.id }, { pack: packs.hulls.collection });\n }\n }\n }\n ui.notifications.info(\"Voidships Builder: Compendium folders organized.\");\n})();", "scope": "global", "author": null, "ownership": {"default": 2}} diff --git a/wg-voidships-foundry/packs/wg-voidship-xenos.db b/wg-voidships-foundry/packs/wg-voidship-xenos.db new file mode 100644 index 0000000..2d8c831 --- /dev/null +++ b/wg-voidships-foundry/packs/wg-voidship-xenos.db @@ -0,0 +1 @@ +{"_id":"2a8c7c6b5d4e3f21","name":"Xenos Habitats","type":"gear","img":null,"system":{"description":"Specialist compartments and atmospherics for transporting or housing alien beings and crews. Includes containment precautions and adaptable life-support matrices.","keywords":"VOIDSHIP, XENOS, QUARTERS","value":0,"rarity":"rare","source":"Into the Storm, p. 161"}} diff --git a/wg-voidships-foundry/packs/wg-voidship-xewnos.db b/wg-voidships-foundry/packs/wg-voidship-xewnos.db deleted file mode 100644 index ce92e9c..0000000 --- a/wg-voidships-foundry/packs/wg-voidship-xewnos.db +++ /dev/null @@ -1,35 +0,0 @@ -{"_id":"a1e0b1c2d3e4f5a6","name":"Jovian-pattern Missile Battery","type":"weapon","img":null,"system":{"category":"ranged","damage":{"base":12,"bonus":0,"rank":0,"ed":{"base":2,"bonus":0,"rank":0},"ap":{"base":-1,"bonus":0,"rank":0},"enabled":false,"otherDamage":{"mortal":"0","shock":"0","wounds":"0"}},"range":{"short":30,"medium":60,"long":120,"melee":1,"thrown":null},"salvo":2,"traits":{"list":[{"name":"volley","rating":"2"}]},"description":"Medium-ranged missile pods mounted externally; unleash a devastating salvo then require lengthy reload cycles. Ideal for an opening alpha strike.","keywords":"VOIDSHIP, ORDNANCE, MACROBATT","source":"Into the Storm, p. 161"}} -{"_id":"b1e0c1d2e3f4a5b6","name":"Lathe-pattern Grav-culverin Broadside","type":"weapon","img":null,"system":{"category":"ranged","damage":{"base":12,"bonus":0,"rank":0,"ed":{"base":2,"bonus":0,"rank":0},"ap":{"base":-1,"bonus":0,"rank":0},"enabled":false,"otherDamage":{"mortal":"0","shock":"0","wounds":"0"}},"range":{"short":30,"medium":60,"long":120,"melee":1,"thrown":null},"salvo":2,"traits":{"list":[{"name":"broadside","rating":"-"},{"name":"option:extended-range (reduced damage)","rating":"-"}]},"description":"Gravitic mass-accelerators that can fire self-propelled warheads to extend range at reduced damage; must occupy Port or Starboard capacity.","keywords":"VOIDSHIP, MACROBROADSIDES","source":"Into the Storm, p. 161–162"}} -{"_id":"c1e0d1e2f3a4b5c6","name":"Mezoa-pattern Macrocannons","type":"weapon","img":null,"system":{"category":"ranged","damage":{"base":12,"bonus":0,"rank":0,"ed":{"base":2,"bonus":0,"rank":0},"ap":{"base":-1,"bonus":0,"rank":0},"enabled":false,"otherDamage":{"mortal":"0","shock":"0","wounds":"0"}},"range":{"short":30,"medium":60,"long":120,"melee":1,"thrown":null},"salvo":2,"traits":{"list":[{"name":"bulky","rating":"-"}]},"description":"Mezoa’s refinement of Mars-pattern cannons; higher output at the cost of greater space and power demands.","keywords":"VOIDSHIP, MACROBATT","source":"Into the Storm, p. 161–162"}} -{"_id":"d1e0e1f2a3b4c5d6","name":"Pyros Melta-cannons","type":"weapon","img":null,"system":{"category":"ranged","damage":{"base":12,"bonus":0,"rank":0,"ed":{"base":2,"bonus":0,"rank":0},"ap":{"base":-1,"bonus":0,"rank":0},"enabled":false,"otherDamage":{"mortal":"0","shock":"0","wounds":"0"}},"range":{"short":30,"medium":60,"long":120,"melee":1,"thrown":null},"salvo":2,"traits":{"list":[{"name":"inferno-on-crit","rating":"-"}]},"description":"Oversized barrels firing melta-tipped shells; critical hits tend to ignite devastating onboard fires.","keywords":"VOIDSHIP, MACROBATT, MELTA","source":"Into the Storm, p. 162"}} -{"_id":"e1e0f1a2b3c4d5e6","name":"Sunsear Las-broadside","type":"weapon","img":null,"system":{"category":"ranged","damage":{"base":12,"bonus":0,"rank":0,"ed":{"base":2,"bonus":0,"rank":0},"ap":{"base":-1,"bonus":0,"rank":0},"enabled":false,"otherDamage":{"mortal":"0","shock":"0","wounds":"0"}},"range":{"short":30,"medium":60,"long":120,"melee":1,"thrown":null},"salvo":2,"traits":{"list":[{"name":"broadside","rating":"-"}]},"description":"Long-ranged Sunsear arrays on Port/Starboard arcs; prized for precision fire.","keywords":"VOIDSHIP, MACROLASERS","source":"Into the Storm, p. 162–163"}} -{"_id":"f1e0a1b2c3d4e5f6","name":"Sunhammer Lance (Weapon)","type":"weapon","img":null,"system":{"category":"ranged","damage":{"base":12,"bonus":0,"rank":0,"ed":{"base":2,"bonus":0,"rank":0},"ap":{"base":-1,"bonus":0,"rank":0},"enabled":false,"otherDamage":{"mortal":"0","shock":"0","wounds":"0"}},"range":{"short":30,"medium":60,"long":120,"melee":1,"thrown":null},"salvo":2,"traits":{"list":[{"name":"lance","rating":"-"}]},"description":"High-energy lance emitter tuned for penetrative strikes through armour belts.","keywords":"VOIDSHIP, LANCE","source":"Into the Storm, p. 163"}} -{"_id":"a2f0b2c3d4e5f6a7","name":"Sunhammer Lance (Battery)","type":"weapon","img":null,"system":{"category":"ranged","damage":{"base":12,"bonus":0,"rank":0,"ed":{"base":2,"bonus":0,"rank":0},"ap":{"base":-1,"bonus":0,"rank":0},"enabled":false,"otherDamage":{"mortal":"0","shock":"0","wounds":"0"}},"range":{"short":30,"medium":60,"long":120,"melee":1,"thrown":null},"salvo":2,"traits":{"list":[{"name":"lance","rating":"-"},{"name":"battery","rating":"-"}]},"description":"Multiple Sunhammer emitters slaved together; saturates targets with cutting beams at colossal power draw.","keywords":"VOIDSHIP, LANCE","source":"Into the Storm, p. 163"}} -{"_id":"b2f0c2d3e4f5a6b7","name":"Jovian-pattern Class 8.1 Drive","type":"gear","img":null,"system":{"description":"Frigate-scale Jovian plasma drive; dependable and easily serviced across Navy yards.","keywords":"VOIDSHIP, ESSENTIAL, DRIVE","value":0,"rarity":"uncommon","source":"Battlefleet Koronus, p. 34"}} -{"_id":"c2f0d2e3f4a5b6c7","name":"Jovian-pattern Class 8.2 Drive","type":"gear","img":null,"system":{"description":"Light cruiser-scale Jovian plant tuned for long patrols and smooth load cycles.","keywords":"VOIDSHIP, ESSENTIAL, DRIVE","value":0,"rarity":"uncommon","source":"Battlefleet Koronus, p. 34"}} -{"_id":"d2f0e2f3a4b5c6d7","name":"Jovian-pattern Class 8.3 Drive","type":"gear","img":null,"system":{"description":"Cruiser-grade Jovian turbines balancing thrust against maintenance burden.","keywords":"VOIDSHIP, ESSENTIAL, DRIVE","value":0,"rarity":"uncommon","source":"Battlefleet Koronus, p. 34"}} -{"_id":"e2f0f2a3b4c5d6e7","name":"Jovian-pattern Class 8.4 Drive","type":"gear","img":null,"system":{"description":"Grand cruiser-scale Jovian core designed for extended campaigns.","keywords":"VOIDSHIP, ESSENTIAL, DRIVE","value":0,"rarity":"uncommon","source":"Battlefleet Koronus, p. 34"}} -{"_id":"f2f0a3b4c5d6e7f8","name":"Saturine-pattern Class 4A Ultra Drive","type":"gear","img":null,"system":{"description":"Battlecruiser plasma drive renowned for brutal acceleration envelopes.","keywords":"VOIDSHIP, ESSENTIAL, DRIVE","value":0,"rarity":"uncommon","source":"Battlefleet Koronus, p. 34"}} -{"_id":"a3f0b4c5d6e7f8a9","name":"Saturine-pattern Class 5 Drive","type":"gear","img":null,"system":{"description":"Grand cruiser Saturine turbines delivering imposing output at high upkeep.","keywords":"VOIDSHIP, ESSENTIAL, DRIVE","value":0,"rarity":"uncommon","source":"Battlefleet Koronus, p. 34"}} -{"_id":"b3f0c4d5e6f7a8b9","name":"Miloslav G-616.b Warp Engine","type":"gear","img":null,"system":{"description":"Compact Miloslav warp engine for raiders/transports/frigates; aggressive transits, temperamental spirits.","keywords":"VOIDSHIP, ESSENTIAL, WARP","value":0,"rarity":"uncommon","source":"Battlefleet Koronus, p. 34"}} -{"_id":"c3f0d4e5f6a7b8c9","name":"Miloslav H-616.b Warp Engine","type":"gear","img":null,"system":{"description":"Heavy Miloslav variant for light cruisers/cruisers; improved stability in storms.","keywords":"VOIDSHIP, ESSENTIAL, WARP","value":0,"rarity":"uncommon","source":"Battlefleet Koronus, p. 34"}} -{"_id":"d3f0e4f5a6b7c8d9","name":"Belecane-pattern 90.r Geller Field","type":"gear","img":null,"system":{"description":"Standardised Geller generator maintaining a reality bubble in the warp.","keywords":"VOIDSHIP, ESSENTIAL, GELLER","value":0,"rarity":"uncommon","source":"Battlefleet Koronus, p. 34"}} -{"_id":"e3f0f4a5b6c7d8e9","name":"Voss 'Glimmer'-pattern Void Shield Array","type":"gear","img":null,"system":{"description":"Efficient Voss-pattern shield array; single-layer baseline for lighter hulls.","keywords":"VOIDSHIP, ESSENTIAL, SHIELDS","value":0,"rarity":"uncommon","source":"Battlefleet Koronus, p. 34"}} -{"_id":"f3f0a4b5c6d7e8f9","name":"Voss 'Glimmer'-pattern Multiple Void Shield Array","type":"gear","img":null,"system":{"description":"Expanded Voss-pattern array for cruisers with multiple layers.","keywords":"VOIDSHIP, ESSENTIAL, SHIELDS","value":0,"rarity":"uncommon","source":"Battlefleet Koronus, p. 34"}} -{"_id":"a4f0b5c6d7e8f9a0","name":"Triple Void Shield Array","type":"gear","img":null,"system":{"description":"Grand cruiser triple-layer void shields for line engagements.","keywords":"VOIDSHIP, ESSENTIAL, SHIELDS","value":0,"rarity":"uncommon","source":"Battlefleet Koronus, p. 34"}} -{"_id":"b4f0c5d6e7f8a9b0","name":"Fleet Flag Bridge","type":"gear","img":null,"system":{"description":"Flag bridge for coordinating squadrons and task forces.","keywords":"VOIDSHIP, ESSENTIAL, BRIDGE","value":0,"rarity":"uncommon","source":"Battlefleet Koronus, p. 34"}} -{"_id":"c4f0d5e6f7a8b9c0","name":"Flight Command Bridge","type":"gear","img":null,"system":{"description":"Bridge layout optimised for carrier operations and wing control.","keywords":"VOIDSHIP, ESSENTIAL, BRIDGE","value":0,"rarity":"uncommon","source":"Battlefleet Koronus, p. 34"}} -{"_id":"d4f0e5f6a7b8c9d0","name":"Invasion Bridge","type":"gear","img":null,"system":{"description":"Assault-landing command bridge with troop coordination shrines.","keywords":"VOIDSHIP, ESSENTIAL, BRIDGE","value":0,"rarity":"uncommon","source":"Battlefleet Koronus, p. 34"}} -{"_id":"e4f0f5a6b7c8d9e0","name":"Clemency-pattern Life Sustainer","type":"gear","img":null,"system":{"description":"Life sustainer with improved bio-recycling and air scrubbing.","keywords":"VOIDSHIP, ESSENTIAL, LIFE-SUSTAINER","value":0,"rarity":"uncommon","source":"Battlefleet Koronus, p. 34"}} -{"_id":"f4f0a5b6c7d8e9f0","name":"Bilge-Rat Quarters","type":"gear","img":null,"system":{"description":"Cramped, austere berthing maximising capacity at morale cost.","keywords":"VOIDSHIP, ESSENTIAL, QUARTERS","value":0,"rarity":"uncommon","source":"Battlefleet Koronus, p. 34"}} -{"_id":"a5f0b6c7d8e9f0a1","name":"BG-15 Assault Scanners","type":"gear","img":null,"system":{"description":"Close-in auger refit for aggressive scans during boardings.","keywords":"VOIDSHIP, ESSENTIAL, AUGUR","value":0,"rarity":"uncommon","source":"Battlefleet Koronus, p. 34"}} -{"_id":"b5f0c6d7e8f9a0b1","name":"X-470 Ultimo Array","type":"gear","img":null,"system":{"description":"Powerful external auger suite; superb detection but a bright target.","keywords":"VOIDSHIP, ESSENTIAL, AUGUR","value":0,"rarity":"uncommon","source":"Battlefleet Koronus, p. 34"}} -{"_id":"c5f0d6e7f8a9b0c1","name":"Shadowblind Bays","type":"gear","img":null,"system":{"description":"Stealth-baffled bays to conceal movements and heat signatures.","keywords":"VOIDSHIP, SUPPLEMENTAL, CARGO","value":0,"rarity":"uncommon","source":"Into the Storm, p. 161"}} -{"_id":"d5f0e6f7a8b9c0d1","name":"Auxiliary Plasma Banks","type":"gear","img":null,"system":{"description":"Additional plasma accumulators for surge power output.","keywords":"VOIDSHIP, SUPPLEMENTAL, DRIVE","value":0,"rarity":"uncommon","source":"Into the Storm, p. 161"}} -{"_id":"e5f0f6a7b8c9d0e1","name":"Drop Pod Launch Bays","type":"gear","img":null,"system":{"description":"Guidance relays and launch cathedra for mass drop-pod insertions.","keywords":"VOIDSHIP, SUPPLEMENTAL, ORDNANCE","value":0,"rarity":"uncommon","source":"Into the Storm, p. 161"}} -{"_id":"f5f0a6b7c8d9e0f1","name":"Empyrean Mantle (Expanded)","type":"gear","img":null,"system":{"description":"Enhanced warp-signature damping projectors (frigate/cruiser variants).","keywords":"VOIDSHIP, SUPPLEMENTAL, STEALTH","value":0,"rarity":"uncommon","source":"Into the Storm, p. 161–162"}} -{"_id":"a6f0b7c8d9e0f1a2","name":"Reinforced Prow","type":"gear","img":null,"system":{"description":"Bolstered prow structure for ramming and head-on engagements.","keywords":"VOIDSHIP, SUPPLEMENTAL, ARMOUR","value":0,"rarity":"uncommon","source":"Into the Storm, p. 161–162"}} -{"_id":"b6f0c7d8e9f0a1b2","name":"Arboretum","type":"gear","img":null,"system":{"description":"Hydroponic groves that bolster morale and supplement life support.","keywords":"VOIDSHIP, SUPPLEMENTAL, LIFE-SUPPORT","value":0,"rarity":"uncommon","source":"Into the Storm, p. 161–162"}} -{"_id":"c6f0d7e8f9a0b1c2","name":"Asteroid Mining Facility","type":"gear","img":null,"system":{"description":"Industrial cutter arrays and ore refineries for on-site extraction.","keywords":"VOIDSHIP, SUPPLEMENTAL, INDUSTRY","value":0,"rarity":"uncommon","source":"Into the Storm, p. 161–162"}} -{"_id":"d6f0e7f8a9b0c1d2","name":"Astropathic Choir-chambers","type":"gear","img":null,"system":{"description":"Ward-sheltered sancta for astropathic choirs and amplifiers.","keywords":"VOIDSHIP, SUPPLEMENTAL, COMMUNICATIONS","value":0,"rarity":"uncommon","source":"Into the Storm, p. 161"}} -{"_id":"e6f0f7a8b9c0d1e2","name":"Broadband Hymn-casters","type":"gear","img":null,"system":{"description":"Broadcast towers that drown all frequencies in deafening litanies, disrupting hostile coordination.","keywords":"VOIDSHIP, SUPPLEMENTAL, COMMUNICATIONS","value":0,"rarity":"uncommon","source":"Into the Storm, p. 161"}} diff --git a/wg-voidships-foundry/scripts/voidships.js b/wg-voidships-foundry/scripts/voidships.js index 11f811e..4571434 100644 --- a/wg-voidships-foundry/scripts/voidships.js +++ b/wg-voidships-foundry/scripts/voidships.js @@ -1,150 +1 @@ - -/* global game, ui, Roll, foundry, mergeObject */ -// Minimal helper for Wrath & Glory voidship play -// Reads data/voidships.json and creates Vehicle actors representing starships. -// Also provides shield tracking, critical hit table creation, and simple actions. -Hooks.once("ready", () => { - game.wgVoidships = { - async importShips(folderName="Voidships") { - const module = game.modules.get("wg-voidships-foundry"); - const path = `${module?.path}/data/voidships.json`; - const ships = await (await fetch(path)).json(); - let folder = game.folders.find(f => f.type==="Actor" && f.name===folderName); - if (!folder) folder = await Folder.create({name: folderName, type: "Actor"}); - for (const s of ships) { - const name = s.name; - const data = { - name, - type: "vehicle", - folder: folder.id, - system: { - mnvr: Math.max(0, s.handling), - value: 20, - traits: { list: [{name:"voidship"}] }, - combat: { - size: "colossal", - speed: s.speedVU || 10, // in VU; informational - wounds: { value: 0, bonus: 0, max: s.hull || 20 }, - resilience: { bonus: 0, total: s.armour || 10 }, - defence: { bonus: s.defence || 3 }, - fly: 0 - }, - notes: `Mounts: ${s.mounts || ""}\nTraits: ${s.traits || ""}` - }, - flags: { - "wg-voidships": { - shields: { current: s.shields||0, max: s.shields||0 }, - speedVU: s.speedVU||10, - handling: s.handling||0, - cr: s.cr||5, - tur: s.tur||0, - mounts: s.mounts||"", - traits: s.traits||"", - components: s.components||[] - } - }, - prototypeToken: { name, width: 4, height: 4, displayName: CONST.TOKEN_DISPLAY_MODES.OWNER_HOVER } - }; - const existing = game.actors.find(a => a.name===name); - const actor = existing ?? await Actor.create(data); - if (existing) await actor.update(data); - // Add a simple Item that tracks Void Shields - if (!actor.items.find(i => i.name==="Void Shields")) { - await actor.createEmbeddedDocuments("Item", [{ - name: "Void Shields", - type: "gear", - system: { - description: `

Tracks starship shield layers (SHD). Current: ${s.shields||0}/${s.shields||0}

`, - value: 0, - rarity: "unique", - keywords: "VOIDSHIP" - } - }]); - } - } - ui.notifications.info(`Imported ${ships.length} voidships into folder "${folderName}".`); - }, - - async ensureCriticalHitsTable() { - const name = "Voidship Critical Hits (d66)"; - let table = game.tables.getName(name); - if (table) return table; - const module = game.modules.get("wg-voidships-foundry"); - const rows = await (await fetch(`${module?.path}/data/critical_hits.json`)).json(); - const results = rows.map(r => ({ - type: CONST.TABLE_RESULT_TYPES.TEXT, - text: `${r.d66}${r.name}
${r.effect}`, - range: [1,1], - weight: 1 - })); - table = await RollTable.create({name, results, displayRoll: true, formula: "1d36"}); - ui.notifications.info("Created roll table: " + name); - return table; - }, - - // Utilities for shields and damage - async applyHit(a, hits=1, dmg=0) { - // Apply hits to shields first (per-hit, not per-damage) - const shields = foundry.utils.getProperty(a, "flags.wg-voidships.shields") ?? {current:0,max:0}; - let absorbed = 0, remaining = hits; - while (remaining>0 && shields.current>0) { - shields.current -= 1; absorbed += 1; remaining -= 1; - } - if (absorbed>0) ui.notifications.info(`${a.name}: ${absorbed} hit(s) absorbed by Void Shields.`); - if (remaining>0 && dmg>0) { - // Simple damage: reduce by Resilience then apply Wounds - const res = foundry.utils.getProperty(a, "system.combat.resilience.total") ?? 10; - const net = Math.max(0, dmg - res); - if (net>0) { - const cur = a.system.combat.wounds.value; - await a.update({"system.combat.wounds.value": cur + net}); - ChatMessage.create({content:`${a.name} suffers ${net} HULL damage (after AR ${res}).`}); - } else { - ChatMessage.create({content:`${a.name} shrugs the damage (AR ${res}).`}); - } - } - await a.update({"flags.wg-voidships.shields.current": shields.current}); - }, - - async rechargeShields(a, amount=null) { - const max = foundry.utils.getProperty(a, "flags.wg-voidships.shields.max") ?? 0; - const cur = foundry.utils.getProperty(a, "flags.wg-voidships.shields.current") ?? 0; - const val = Math.min(max, amount==null ? max : cur + amount); - await a.update({"flags.wg-voidships.shields.current": val}); - ui.notifications.info(`${a.name} shields set to ${val}/${max}.`); - }, - - async setShields(a, val) { - const max = foundry.utils.getProperty(a, "flags.wg-voidships.shields.max") ?? 0; - val = Math.max(0, Math.min(max, val)); - await a.update({"flags.wg-voidships.shields.current": val}); - ui.notifications.info(`${a.name} shields now ${val}/${max}.`); - } - }; -}); - -// Macros (global helpers) -game.wgVoidshipsMacros = { - async importVoidships() { return game.wgVoidships.importShips(); }, - async createCritTable() { return game.wgVoidships.ensureCriticalHitsTable(); }, - async applyHit() { - const a = canvas.tokens.controlled[0]?.actor ?? game.user.character; - if (!a) return ui.notifications.warn("Select a voidship token or set a default character."); - const hits = Number(await Dialog.prompt({title:"Hits", content:"How many hits to apply?", label:"Apply", callback: html => html.querySelector("input")?.value, render: html => html.append('') })) || 1; - const dmg = Number(await Dialog.prompt({title:"Damage", content:"Base damage (after weapon calc)?", label:"Apply", callback: html => html.querySelector("input")?.value, render: html => html.append('') })) || 0; - return game.wgVoidships.applyHit(a, hits, dmg); - }, - async rechargeShields() { - const a = canvas.tokens.controlled[0]?.actor ?? game.user.character; - if (!a) return ui.notifications.warn("Select a voidship token or set a default character."); - return game.wgVoidships.rechargeShields(a); - }, - async setShields() { - const a = canvas.tokens.controlled[0]?.actor ?? game.user.character; - if (!a) return ui.notifications.warn("Select a voidship token or set a default character."); - const cur = foundry.utils.getProperty(a, "flags.wg-voidships.shields.current") ?? 0; - const max = foundry.utils.getProperty(a, "flags.wg-voidships.shields.max") ?? 0; - const val = Number(await Dialog.prompt({title:"Set Shields", content:`0..${max}`, label:"Set", callback: html => html.querySelector("input")?.value, render: html => html.append(``) })) || cur; - return game.wgVoidships.setShields(a, val); - } -}; +Hooks.once('ready',()=>console.warn('wg-voidships-builder: helper script not provided, using stub')); \ No newline at end of file