This commit is contained in:
2025-09-16 14:44:55 +02:00
parent e34f3a2271
commit 22e4553cc1
7 changed files with 65 additions and 191 deletions
+3 -2
View File
@@ -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`.
@@ -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": "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":"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": "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":"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": "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":"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": "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": []}
@@ -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"}}
@@ -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=>`<option>${n}</option>`).join(''); const content=`<p>Choose items to add (Ctrl/Cmd+Click):</p><select id=it multiple size=12 style='width:100%'>${opts}</select>`; 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=`<p>Primary: <input type=checkbox id=p ${g.primaryActive?'checked':''}></p><p>Reserve: <input type=checkbox id=r ${g.reserveActive?'checked':''}></p>`; 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}}
@@ -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"}}
@@ -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. 161162"}}
{"_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":"Mezoas refinement of Mars-pattern cannons; higher output at the cost of greater space and power demands.","keywords":"VOIDSHIP, MACROBATT","source":"Into the Storm, p. 161162"}}
{"_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. 162163"}}
{"_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. 161162"}}
{"_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. 161162"}}
{"_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. 161162"}}
{"_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. 161162"}}
{"_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"}}
+1 -150
View File
@@ -1,150 +1 @@
Hooks.once('ready',()=>console.warn('wg-voidships-builder: helper script not provided, using stub'));
/* 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: `<p>Tracks starship shield layers (SHD). Current: ${s.shields||0}/${s.shields||0}</p>`,
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: `<b>${r.d66}</b> — <u>${r.name}</u><br/>${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 <b>${net}</b> 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('<input type="number" value="1"/>') })) || 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('<input type="number" value="0"/>') })) || 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(`<input type="number" value="${cur}"/>`) })) || cur;
return game.wgVoidships.setShields(a, val);
}
};