Working version

This commit is contained in:
2025-09-18 23:56:05 +02:00
parent a4c51710ec
commit 584985ede8
5 changed files with 409 additions and 309 deletions
+24 -24
View File
@@ -1,24 +1,24 @@
{"name":"Escort Hull (Empty)","type":"vehicle","img":"icons/svg/ship.svg","flags":{"core":{"sheetClass":"wg-voidships-builder.VoidshipSheet"},"wg-voidships-builder":{"isVoidship":true,"hull":{"class":"Escort Hull (Empty)","size":"Escort","slots":{"prow":1,"dorsal":1,"port":0,"starboard":0,"keel":0}},"base":{"armour":9,"integrity":18,"manoeuvre":2,"detection":0,"speed":10,"space":30,"power":40},"crew":{"command":1,"pilot":1,"sensors":1,"engineering":2,"gunnery":2,"security":2,"flightDeck":0,"passengers":0},"rtRaw":{"rt":{"speed":10,"armour":9,"hullIntegrity":18,"space":30,"power":40,"weapons":{"prow":1,"dorsal":1,"port":0,"starboard":0,"keel":0},"turret":1},"mnvr":2,"notes":"Empty hull for escorts.","combat":{"size":"colossal","speed":10,"wounds":{"max":18},"resilience":{"total":9},"defence":{"bonus":3}}}}},"system":{},"effects":[],"items":[]}
{"name":"Frigate Hull (Empty)","type":"vehicle","img":"icons/svg/ship.svg","flags":{"core":{"sheetClass":"wg-voidships-builder.VoidshipSheet"},"wg-voidships-builder":{"isVoidship":true,"hull":{"class":"Frigate Hull (Empty)","size":"Frigate","slots":{"prow":1,"dorsal":1,"port":0,"starboard":0,"keel":0}},"base":{"armour":10,"integrity":24,"manoeuvre":1,"detection":0,"speed":10,"space":35,"power":45},"crew":{"command":1,"pilot":1,"sensors":1,"engineering":2,"gunnery":2,"security":2,"flightDeck":0,"passengers":0},"rtRaw":{"rt":{"speed":10,"armour":10,"hullIntegrity":24,"space":35,"power":45,"weapons":{"prow":1,"dorsal":1,"port":0,"starboard":0,"keel":0},"turret":1},"mnvr":1,"notes":"Empty frigate hull.","combat":{"size":"colossal","speed":10,"wounds":{"max":24},"resilience":{"total":10},"defence":{"bonus":3}}}}},"system":{},"effects":[],"items":[]}
{"name":"Light Cruiser Hull (Empty)","type":"vehicle","img":"icons/svg/ship.svg","flags":{"core":{"sheetClass":"wg-voidships-builder.VoidshipSheet"},"wg-voidships-builder":{"isVoidship":true,"hull":{"class":"Light Cruiser Hull (Empty)","size":"Light Cruiser","slots":{"prow":1,"dorsal":2,"port":1,"starboard":1,"keel":0}},"base":{"armour":11,"integrity":32,"manoeuvre":0,"detection":0,"speed":9,"space":55,"power":60},"crew":{"command":1,"pilot":1,"sensors":1,"engineering":2,"gunnery":2,"security":2,"flightDeck":0,"passengers":0},"rtRaw":{"rt":{"speed":9,"armour":11,"hullIntegrity":32,"space":55,"power":60,"weapons":{"prow":1,"dorsal":2,"port":1,"starboard":1,"keel":0},"turret":2},"mnvr":0,"notes":"Empty light cruiser hull.","combat":{"size":"colossal","speed":9,"wounds":{"max":32},"resilience":{"total":11},"defence":{"bonus":2}}}}},"system":{},"effects":[],"items":[]}
{"name":"Cruiser Hull (Empty)","type":"vehicle","img":"icons/svg/ship.svg","flags":{"core":{"sheetClass":"wg-voidships-builder.VoidshipSheet"},"wg-voidships-builder":{"isVoidship":true,"hull":{"class":"Cruiser Hull (Empty)","size":"Cruiser","slots":{"prow":1,"dorsal":1,"port":2,"starboard":2,"keel":0}},"base":{"armour":12,"integrity":40,"manoeuvre":-1,"detection":0,"speed":8,"space":65,"power":75},"crew":{"command":1,"pilot":1,"sensors":1,"engineering":2,"gunnery":2,"security":2,"flightDeck":0,"passengers":0},"rtRaw":{"rt":{"speed":8,"armour":12,"hullIntegrity":40,"space":65,"power":75,"weapons":{"prow":1,"dorsal":1,"port":2,"starboard":2,"keel":0},"turret":2},"mnvr":-1,"notes":"Empty cruiser hull.","combat":{"size":"colossal","speed":8,"wounds":{"max":40},"resilience":{"total":12},"defence":{"bonus":2}}}}},"system":{},"effects":[],"items":[]}
{"name":"Jericho-class Pilgrim Vessel","type":"vehicle","img":"icons/svg/ship.svg","flags":{"core":{"sheetClass":"wg-voidships-builder.VoidshipSheet"},"wg-voidships-builder":{"isVoidship":true,"hull":{"class":"Jericho-class Pilgrim Vessel","size":"Transport","slots":{"prow":1,"dorsal":1,"port":1,"starboard":1,"keel":0}},"base":{"armour":12,"integrity":36,"manoeuvre":-1,"detection":0,"speed":8,"space":60,"power":55},"crew":{"command":1,"pilot":1,"sensors":1,"engineering":2,"gunnery":2,"security":2,"flightDeck":0,"passengers":0},"rtRaw":{"rt":{"speed":8,"armour":12,"hullIntegrity":36,"space":60,"power":55,"weapons":{"prow":1,"dorsal":1,"port":1,"starboard":1,"keel":0},"turret":1},"mnvr":-1,"notes":"Pilgrim conversions with reliquary holds.","combat":{"size":"colossal","speed":8,"wounds":{"max":36},"resilience":{"total":12},"defence":{"bonus":2}}}}},"system":{},"effects":[],"items":[]}
{"name":"Vagabond-class Merchant Trader","type":"vehicle","img":"icons/svg/ship.svg","flags":{"core":{"sheetClass":"wg-voidships-builder.VoidshipSheet"},"wg-voidships-builder":{"isVoidship":true,"hull":{"class":"Vagabond-class Merchant Trader","size":"Transport","slots":{"prow":1,"dorsal":1,"port":1,"starboard":1,"keel":0}},"base":{"armour":12,"integrity":36,"manoeuvre":-1,"detection":0,"speed":8,"space":60,"power":55},"crew":{"command":1,"pilot":1,"sensors":1,"engineering":2,"gunnery":2,"security":2,"flightDeck":0,"passengers":0},"rtRaw":{"rt":{"speed":8,"armour":12,"hullIntegrity":36,"space":60,"power":55,"weapons":{"prow":1,"dorsal":1,"port":1,"starboard":1,"keel":0},"turret":1},"mnvr":-1,"notes":"Modular cargobays; workhorse trader.","combat":{"size":"colossal","speed":8,"wounds":{"max":36},"resilience":{"total":12},"defence":{"bonus":2}}}}},"system":{},"effects":[],"items":[]}
{"name":"Hazeroth-class Privateer","type":"vehicle","img":"icons/svg/ship.svg","flags":{"core":{"sheetClass":"wg-voidships-builder.VoidshipSheet"},"wg-voidships-builder":{"isVoidship":true,"hull":{"class":"Hazeroth-class Privateer","size":"Escort","slots":{"prow":1,"dorsal":1,"port":0,"starboard":0,"keel":0}},"base":{"armour":9,"integrity":22,"manoeuvre":2,"detection":0,"speed":10,"space":35,"power":45},"crew":{"command":1,"pilot":1,"sensors":1,"engineering":2,"gunnery":2,"security":2,"flightDeck":0,"passengers":0},"rtRaw":{"rt":{"speed":10,"armour":9,"hullIntegrity":22,"space":35,"power":45,"weapons":{"prow":1,"dorsal":1,"port":0,"starboard":0,"keel":0},"turret":1},"mnvr":2,"notes":"Fast raider with stripped armour.","combat":{"size":"colossal","speed":10,"wounds":{"max":22},"resilience":{"total":9},"defence":{"bonus":3}}}}},"system":{},"effects":[],"items":[]}
{"name":"Havoc-class Merchant Raider","type":"vehicle","img":"icons/svg/ship.svg","flags":{"core":{"sheetClass":"wg-voidships-builder.VoidshipSheet"},"wg-voidships-builder":{"isVoidship":true,"hull":{"class":"Havoc-class Merchant Raider","size":"Escort","slots":{"prow":1,"dorsal":1,"port":0,"starboard":0,"keel":0}},"base":{"armour":9,"integrity":22,"manoeuvre":2,"detection":0,"speed":10,"space":35,"power":45},"crew":{"command":1,"pilot":1,"sensors":1,"engineering":2,"gunnery":2,"security":2,"flightDeck":0,"passengers":0},"rtRaw":{"rt":{"speed":10,"armour":9,"hullIntegrity":22,"space":35,"power":45,"weapons":{"prow":1,"dorsal":1,"port":0,"starboard":0,"keel":0},"turret":1},"mnvr":2,"notes":"Hybrid carrier-raider.","combat":{"size":"colossal","speed":10,"wounds":{"max":22},"resilience":{"total":9},"defence":{"bonus":3}}}}},"system":{},"effects":[],"items":[]}
{"name":"Sword-class Frigate","type":"vehicle","img":"icons/svg/ship.svg","flags":{"core":{"sheetClass":"wg-voidships-builder.VoidshipSheet"},"wg-voidships-builder":{"isVoidship":true,"hull":{"class":"Sword-class Frigate","size":"Frigate","slots":{"prow":1,"dorsal":1,"port":0,"starboard":0,"keel":0}},"base":{"armour":10,"integrity":28,"manoeuvre":1,"detection":0,"speed":10,"space":35,"power":45},"crew":{"command":1,"pilot":1,"sensors":1,"engineering":2,"gunnery":2,"security":2,"flightDeck":0,"passengers":0},"rtRaw":{"rt":{"speed":10,"armour":10,"hullIntegrity":28,"space":35,"power":45,"weapons":{"prow":1,"dorsal":1,"port":0,"starboard":0,"keel":0},"turret":1},"mnvr":1,"notes":"Escort with accurate dorsals.","combat":{"size":"colossal","speed":10,"wounds":{"max":28},"resilience":{"total":10},"defence":{"bonus":3}}}}},"system":{},"effects":[],"items":[]}
{"name":"Tempest-class Strike Frigate","type":"vehicle","img":"icons/svg/ship.svg","flags":{"core":{"sheetClass":"wg-voidships-builder.VoidshipSheet"},"wg-voidships-builder":{"isVoidship":true,"hull":{"class":"Tempest-class Strike Frigate","size":"Frigate","slots":{"prow":1,"dorsal":1,"port":0,"starboard":0,"keel":0}},"base":{"armour":10,"integrity":28,"manoeuvre":1,"detection":0,"speed":10,"space":35,"power":45},"crew":{"command":1,"pilot":1,"sensors":1,"engineering":2,"gunnery":2,"security":2,"flightDeck":0,"passengers":0},"rtRaw":{"rt":{"speed":10,"armour":10,"hullIntegrity":28,"space":35,"power":45,"weapons":{"prow":1,"dorsal":1,"port":0,"starboard":0,"keel":0},"turret":1},"mnvr":1,"notes":"Close-action brawler.","combat":{"size":"colossal","speed":10,"wounds":{"max":28},"resilience":{"total":10},"defence":{"bonus":3}}}}},"system":{},"effects":[],"items":[]}
{"name":"Dauntless-class Light Cruiser","type":"vehicle","img":"icons/svg/ship.svg","flags":{"core":{"sheetClass":"wg-voidships-builder.VoidshipSheet"},"wg-voidships-builder":{"isVoidship":true,"hull":{"class":"Dauntless-class Light Cruiser","size":"Light Cruiser","slots":{"prow":1,"dorsal":2,"port":1,"starboard":1,"keel":0}},"base":{"armour":11,"integrity":32,"manoeuvre":0,"detection":0,"speed":9,"space":55,"power":60},"crew":{"command":1,"pilot":1,"sensors":1,"engineering":2,"gunnery":2,"security":2,"flightDeck":0,"passengers":0},"rtRaw":{"rt":{"speed":9,"armour":11,"hullIntegrity":32,"space":55,"power":60,"weapons":{"prow":1,"dorsal":2,"port":1,"starboard":1,"keel":0},"turret":2},"mnvr":0,"notes":"Versatile patrol light cruiser.","combat":{"size":"colossal","speed":9,"wounds":{"max":32},"resilience":{"total":11},"defence":{"bonus":2}}}}},"system":{},"effects":[],"items":[]}
{"name":"Lunar-class Cruiser","type":"vehicle","img":"icons/svg/ship.svg","flags":{"core":{"sheetClass":"wg-voidships-builder.VoidshipSheet"},"wg-voidships-builder":{"isVoidship":true,"hull":{"class":"Lunar-class Cruiser","size":"Cruiser","slots":{"prow":1,"dorsal":1,"port":2,"starboard":2,"keel":0}},"base":{"armour":12,"integrity":40,"manoeuvre":-1,"detection":0,"speed":8,"space":65,"power":75},"crew":{"command":1,"pilot":1,"sensors":1,"engineering":2,"gunnery":2,"security":2,"flightDeck":0,"passengers":0},"rtRaw":{"rt":{"speed":8,"armour":12,"hullIntegrity":40,"space":65,"power":75,"weapons":{"prow":1,"dorsal":1,"port":2,"starboard":2,"keel":0},"turret":2},"mnvr":-1,"notes":"Balanced line cruiser.","combat":{"size":"colossal","speed":8,"wounds":{"max":40},"resilience":{"total":12},"defence":{"bonus":2}}}}},"system":{},"effects":[],"items":[]}
{"name":"Cobra-class Destroyer","type":"vehicle","img":"icons/svg/ship.svg","flags":{"core":{"sheetClass":"wg-voidships-builder.VoidshipSheet"},"wg-voidships-builder":{"isVoidship":true,"hull":{"class":"Cobra-class Destroyer","size":"Escort","slots":{"prow":1,"dorsal":0,"port":0,"starboard":0,"keel":0}},"base":{"armour":9,"integrity":22,"manoeuvre":2,"detection":0,"speed":10,"space":32,"power":42},"crew":{"command":1,"pilot":1,"sensors":1,"engineering":2,"gunnery":2,"security":2,"flightDeck":0,"passengers":0},"rtRaw":{"rt":{"speed":10,"armour":9,"hullIntegrity":22,"space":32,"power":42,"weapons":{"prow":1,"dorsal":0,"port":0,"starboard":0,"keel":0},"turret":1},"mnvr":2,"notes":"Torpedo destroyer; hunts in packs.","combat":{"size":"colossal","speed":10,"wounds":{"max":22},"resilience":{"total":9},"defence":{"bonus":3}}}}},"system":{},"effects":[],"items":[]}
{"name":"Falchion-class Frigate","type":"vehicle","img":"icons/svg/ship.svg","flags":{"core":{"sheetClass":"wg-voidships-builder.VoidshipSheet"},"wg-voidships-builder":{"isVoidship":true,"hull":{"class":"Falchion-class Frigate","size":"Frigate","slots":{"prow":1,"dorsal":1,"port":0,"starboard":0,"keel":0}},"base":{"armour":10,"integrity":28,"manoeuvre":1,"detection":0,"speed":10,"space":35,"power":45},"crew":{"command":1,"pilot":1,"sensors":1,"engineering":2,"gunnery":2,"security":2,"flightDeck":0,"passengers":0},"rtRaw":{"rt":{"speed":10,"armour":10,"hullIntegrity":28,"space":35,"power":45,"weapons":{"prow":1,"dorsal":1,"port":0,"starboard":0,"keel":0},"turret":1},"mnvr":1,"notes":"Modernised frigate for scouting.","combat":{"size":"colossal","speed":10,"wounds":{"max":28},"resilience":{"total":10},"defence":{"bonus":3}}}}},"system":{},"effects":[],"items":[]}
{"name":"Turbulent-class Heavy Frigate","type":"vehicle","img":"icons/svg/ship.svg","flags":{"core":{"sheetClass":"wg-voidships-builder.VoidshipSheet"},"wg-voidships-builder":{"isVoidship":true,"hull":{"class":"Turbulent-class Heavy Frigate","size":"Frigate","slots":{"prow":1,"dorsal":1,"port":0,"starboard":0,"keel":0}},"base":{"armour":10,"integrity":30,"manoeuvre":1,"detection":0,"speed":10,"space":35,"power":45},"crew":{"command":1,"pilot":1,"sensors":1,"engineering":2,"gunnery":2,"security":2,"flightDeck":0,"passengers":0},"rtRaw":{"rt":{"speed":10,"armour":10,"hullIntegrity":30,"space":35,"power":45,"weapons":{"prow":1,"dorsal":1,"port":0,"starboard":0,"keel":0},"turret":1},"mnvr":1,"notes":"Strengthened frame; better arcs.","combat":{"size":"colossal","speed":10,"wounds":{"max":30},"resilience":{"total":10},"defence":{"bonus":3}}}}},"system":{},"effects":[],"items":[]}
{"name":"Defiant-class Light Cruiser (Carrier)","type":"vehicle","img":"icons/svg/ship.svg","flags":{"core":{"sheetClass":"wg-voidships-builder.VoidshipSheet"},"wg-voidships-builder":{"isVoidship":true,"hull":{"class":"Defiant-class Light Cruiser (Carrier)","size":"Light Cruiser","slots":{"prow":1,"dorsal":1,"port":1,"starboard":1,"keel":0}},"base":{"armour":11,"integrity":32,"manoeuvre":0,"detection":0,"speed":9,"space":55,"power":60},"crew":{"command":1,"pilot":1,"sensors":1,"engineering":2,"gunnery":2,"security":2,"flightDeck":0,"passengers":0},"rtRaw":{"rt":{"speed":9,"armour":11,"hullIntegrity":32,"space":55,"power":60,"weapons":{"prow":1,"dorsal":1,"port":1,"starboard":1,"keel":0},"turret":2},"mnvr":0,"notes":"Light carrier with strong attack craft.","combat":{"size":"colossal","speed":9,"wounds":{"max":32},"resilience":{"total":11},"defence":{"bonus":2}}}}},"system":{},"effects":[],"items":[]}
{"name":"Universe-class Mass Conveyor","type":"vehicle","img":"icons/svg/ship.svg","flags":{"core":{"sheetClass":"wg-voidships-builder.VoidshipSheet"},"wg-voidships-builder":{"isVoidship":true,"hull":{"class":"Universe-class Mass Conveyor","size":"Transport","slots":{"prow":0,"dorsal":0,"port":1,"starboard":1,"keel":0},"requirements":[{"tag":"cargo-bay","min":4,"label":"Cargo Holds"},{"tag":"aux-plasma","min":1,"label":"Auxiliary Plasma Generator"}]},"base":{"armour":12,"integrity":36,"manoeuvre":-1,"detection":0,"speed":8,"space":60,"power":55},"crew":{"command":1,"pilot":1,"sensors":1,"engineering":2,"gunnery":2,"security":2,"flightDeck":0,"passengers":0},"rtRaw":{"rt":{"speed":8,"armour":12,"hullIntegrity":36,"space":60,"power":55,"weapons":{"prow":0,"dorsal":0,"port":1,"starboard":1,"keel":0},"turret":1},"mnvr":-1,"notes":"Super-massive hauler; logistics linchpin.","combat":{"size":"colossal","speed":8,"wounds":{"max":36},"resilience":{"total":12},"defence":{"bonus":2}}}}},"system":{},"effects":[],"items":[]}
{"name":"Goliath-class Factory Ship","type":"vehicle","img":"icons/svg/ship.svg","flags":{"core":{"sheetClass":"wg-voidships-builder.VoidshipSheet"},"wg-voidships-builder":{"isVoidship":true,"hull":{"class":"Goliath-class Factory Ship","size":"Transport","slots":{"prow":1,"dorsal":1,"port":1,"starboard":1,"keel":0}},"base":{"armour":12,"integrity":36,"manoeuvre":-1,"detection":0,"speed":8,"space":60,"power":60},"crew":{"command":1,"pilot":1,"sensors":1,"engineering":2,"gunnery":2,"security":2,"flightDeck":0,"passengers":0},"rtRaw":{"rt":{"speed":8,"armour":12,"hullIntegrity":36,"space":60,"power":60,"weapons":{"prow":1,"dorsal":1,"port":1,"starboard":1,"keel":0},"turret":1},"mnvr":-1,"notes":"Roving manufactorum/refinery.","combat":{"size":"colossal","speed":8,"wounds":{"max":36},"resilience":{"total":12},"defence":{"bonus":2}}}}},"system":{},"effects":[],"items":[]}
{"name":"Conquest-class Star Galleon","type":"vehicle","img":"icons/svg/ship.svg","flags":{"core":{"sheetClass":"wg-voidships-builder.VoidshipSheet"},"wg-voidships-builder":{"isVoidship":true,"hull":{"class":"Conquest-class Star Galleon","size":"Transport","slots":{"prow":1,"dorsal":1,"port":1,"starboard":1,"keel":0}},"base":{"armour":12,"integrity":36,"manoeuvre":-1,"detection":0,"speed":8,"space":60,"power":60},"crew":{"command":1,"pilot":1,"sensors":1,"engineering":2,"gunnery":2,"security":2,"flightDeck":0,"passengers":0},"rtRaw":{"rt":{"speed":8,"armour":12,"hullIntegrity":36,"space":60,"power":60,"weapons":{"prow":1,"dorsal":1,"port":1,"starboard":1,"keel":0},"turret":1},"mnvr":-1,"notes":"Heavily built merchant galleon.","combat":{"size":"colossal","speed":8,"wounds":{"max":36},"resilience":{"total":12},"defence":{"bonus":2}}}}},"system":{},"effects":[],"items":[]}
{"name":"Orion-class Star Clipper","type":"vehicle","img":"icons/svg/ship.svg","flags":{"core":{"sheetClass":"wg-voidships-builder.VoidshipSheet"},"wg-voidships-builder":{"isVoidship":true,"hull":{"class":"Orion-class Star Clipper","size":"Transport","slots":{"prow":1,"dorsal":1,"port":0,"starboard":0,"keel":0}},"base":{"armour":11,"integrity":32,"manoeuvre":0,"detection":0,"speed":9,"space":45,"power":50},"crew":{"command":1,"pilot":1,"sensors":1,"engineering":2,"gunnery":2,"security":2,"flightDeck":0,"passengers":0},"rtRaw":{"rt":{"speed":9,"armour":11,"hullIntegrity":32,"space":45,"power":50,"weapons":{"prow":1,"dorsal":1,"port":0,"starboard":0,"keel":0},"turret":1},"mnvr":0,"notes":"Fast passenger/light cargo clipper.","combat":{"size":"colossal","speed":9,"wounds":{"max":32},"resilience":{"total":11},"defence":{"bonus":2}}}}},"system":{},"effects":[],"items":[]}
{"name":"Cobra-class Destroyer (Renegade)","type":"vehicle","img":"icons/svg/ship.svg","flags":{"core":{"sheetClass":"wg-voidships-builder.VoidshipSheet"},"wg-voidships-builder":{"isVoidship":true,"hull":{"class":"Cobra-class Destroyer (Renegade)","size":"Escort","slots":{"prow":1,"dorsal":0,"port":0,"starboard":0,"keel":0}},"base":{"armour":9,"integrity":22,"manoeuvre":2,"detection":0,"speed":10,"space":32,"power":42},"crew":{"command":1,"pilot":1,"sensors":1,"engineering":2,"gunnery":2,"security":2,"flightDeck":0,"passengers":0},"rtRaw":{"rt":{"speed":10,"armour":9,"hullIntegrity":22,"space":32,"power":42,"weapons":{"prow":1,"dorsal":0,"port":0,"starboard":0,"keel":0},"turret":1},"mnvr":2,"notes":"Privateer refits on a Cobra hull.","combat":{"size":"colossal","speed":10,"wounds":{"max":22},"resilience":{"total":9},"defence":{"bonus":3}}}}},"system":{},"effects":[],"items":[]}
{"name":"Secutor-class Monitor-Cruiser","type":"vehicle","img":"icons/svg/ship.svg","flags":{"core":{"sheetClass":"wg-voidships-builder.VoidshipSheet"},"wg-voidships-builder":{"isVoidship":true,"hull":{"class":"Secutor-class Monitor-Cruiser","size":"Cruiser","slots":{"prow":1,"dorsal":2,"port":1,"starboard":1,"keel":0}},"base":{"armour":12,"integrity":40,"manoeuvre":-1,"detection":0,"speed":8,"space":65,"power":80},"crew":{"command":1,"pilot":1,"sensors":1,"engineering":2,"gunnery":2,"security":2,"flightDeck":0,"passengers":0},"rtRaw":{"rt":{"speed":8,"armour":12,"hullIntegrity":40,"space":65,"power":80,"weapons":{"prow":1,"dorsal":2,"port":1,"starboard":1,"keel":0},"turret":2},"mnvr":-1,"notes":"Mechanicus monitor with heavy dorsals.","combat":{"size":"colossal","speed":8,"wounds":{"max":40},"resilience":{"total":12},"defence":{"bonus":2}}}}},"system":{},"effects":[],"items":[]}
{"name":"Lathe-class Monitor-Cruiser","type":"vehicle","img":"icons/svg/ship.svg","flags":{"core":{"sheetClass":"wg-voidships-builder.VoidshipSheet"},"wg-voidships-builder":{"isVoidship":true,"hull":{"class":"Lathe-class Monitor-Cruiser","size":"Cruiser","slots":{"prow":1,"dorsal":2,"port":1,"starboard":1,"keel":0}},"base":{"armour":12,"integrity":40,"manoeuvre":-1,"detection":0,"speed":8,"space":65,"power":80},"crew":{"command":1,"pilot":1,"sensors":1,"engineering":2,"gunnery":2,"security":2,"flightDeck":0,"passengers":0},"rtRaw":{"rt":{"speed":8,"armour":12,"hullIntegrity":40,"space":65,"power":80,"weapons":{"prow":1,"dorsal":2,"port":1,"starboard":1,"keel":0},"turret":2},"mnvr":-1,"notes":"Lathes-forged variant; resilient sanctified systems.","combat":{"size":"colossal","speed":8,"wounds":{"max":40},"resilience":{"total":12},"defence":{"bonus":2}}}}},"system":{},"effects":[],"items":[]}
{"name":"Tyrant-class Cruiser","type":"vehicle","img":"icons/svg/ship.svg","flags":{"core":{"sheetClass":"wg-voidships-builder.VoidshipSheet"},"wg-voidships-builder":{"isVoidship":true,"hull":{"class":"Tyrant-class Cruiser","size":"Cruiser","slots":{"prow":1,"dorsal":1,"port":2,"starboard":2,"keel":0}},"base":{"armour":12,"integrity":40,"manoeuvre":-1,"detection":0,"speed":8,"space":65,"power":75},"crew":{"command":1,"pilot":1,"sensors":1,"engineering":2,"gunnery":2,"security":2,"flightDeck":0,"passengers":0},"rtRaw":{"rt":{"speed":8,"armour":12,"hullIntegrity":40,"space":65,"power":75,"weapons":{"prow":1,"dorsal":1,"port":2,"starboard":2,"keel":0},"turret":2},"mnvr":-1,"notes":"Macrobattery-focused broadside cruiser.","combat":{"size":"colossal","speed":8,"wounds":{"max":40},"resilience":{"total":12},"defence":{"bonus":2}}}}},"system":{},"effects":[],"items":[]}
{"name":"Lunar-class Cruiser","type":"vehicle","img":"icons/svg/ship.svg","folder":null,"sort":0,"ownership":{"default":0},"flags":{"core":{"sheetClass":"wg-voidships-builder.VoidshipSheet"},"wg-voidships-builder":{"isVoidship":true,"hull":{"class":"Lunar-class Cruiser","size":"Cruiser","slots":{"prow":1,"dorsal":2,"port":1,"starboard":1,"keel":0},"requirements":[{"tag":"bridge","min":1,"label":"Bridge"},{"tag":"reactor","min":1,"label":"Plasma Reactor"},{"tag":"gellar","min":1,"label":"Gellar Field"},{"tag":"warp","min":1,"label":"Warp Drive"}]},"base":{"armour":12,"integrity":40,"manoeuvre":-1,"detection":1,"speed":8,"space":70,"power":80},"crew":{"command":1,"pilot":1,"sensors":1,"engineering":2,"gunnery":2,"security":2,"flightDeck":0,"passengers":0},"rtRaw":{"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"}}},"system":{},"effects":[],"items":[],"prototypeToken":{"name":"Lunar-class Cruiser","actorLink":true,"texture":{"src":"icons/svg/ship.svg"},"disposition":1,"displayName":0},"_id":"0b59c38ddda63f42","systemId":"wrath-and-glory","systemVersion":"7.1.1"}
{"name":"Secutor-class Monitor-Cruiser","type":"vehicle","img":"icons/svg/ship.svg","folder":null,"sort":0,"ownership":{"default":0},"flags":{"core":{"sheetClass":"wg-voidships-builder.VoidshipSheet"},"wg-voidships-builder":{"isVoidship":true,"hull":{"class":"Secutor-class Monitor-Cruiser","size":"Cruiser","slots":{"prow":1,"dorsal":3,"port":0,"starboard":0,"keel":0},"requirements":[{"tag":"bridge","min":1,"label":"Bridge"},{"tag":"reactor","min":1,"label":"Plasma Reactor"},{"tag":"gellar","min":1,"label":"Gellar Field"},{"tag":"warp","min":1,"label":"Warp Drive"}]},"base":{"armour":12,"integrity":40,"manoeuvre":-1,"detection":1,"speed":8,"space":68,"power":82},"crew":{"command":1,"pilot":1,"sensors":1,"engineering":2,"gunnery":2,"security":2,"flightDeck":0,"passengers":0},"rtRaw":{"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"}}},"system":{},"effects":[],"items":[],"prototypeToken":{"name":"Secutor-class Monitor-Cruiser","actorLink":true,"texture":{"src":"icons/svg/ship.svg"},"disposition":1,"displayName":0},"_id":"0eb071148d375807","systemId":"wrath-and-glory","systemVersion":"7.1.1"}
{"name":"Lathe-class Monitor-Cruiser","type":"vehicle","img":"icons/svg/ship.svg","folder":null,"sort":0,"ownership":{"default":0},"flags":{"core":{"sheetClass":"wg-voidships-builder.VoidshipSheet"},"wg-voidships-builder":{"isVoidship":true,"hull":{"class":"Lathe-class Monitor-Cruiser","size":"Cruiser","slots":{"prow":1,"dorsal":3,"port":0,"starboard":0,"keel":0},"requirements":[{"tag":"bridge","min":1,"label":"Bridge"},{"tag":"reactor","min":1,"label":"Plasma Reactor"},{"tag":"gellar","min":1,"label":"Gellar Field"},{"tag":"warp","min":1,"label":"Warp Drive"}]},"base":{"armour":12,"integrity":40,"manoeuvre":-1,"detection":1,"speed":8,"space":68,"power":82},"crew":{"command":1,"pilot":1,"sensors":1,"engineering":2,"gunnery":2,"security":2,"flightDeck":0,"passengers":0},"rtRaw":{"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"}}},"system":{},"effects":[],"items":[],"prototypeToken":{"name":"Lathe-class Monitor-Cruiser","actorLink":true,"texture":{"src":"icons/svg/ship.svg"},"disposition":1,"displayName":0},"_id":"104965869ffa36bb","systemId":"wrath-and-glory","systemVersion":"7.1.1"}
{"name":"Frigate Hull (Empty)","type":"vehicle","img":"icons/svg/ship.svg","folder":null,"sort":0,"ownership":{"default":0},"flags":{"core":{"sheetClass":"wg-voidships-builder.VoidshipSheet"},"wg-voidships-builder":{"isVoidship":true,"hull":{"class":"Frigate Hull (Empty)","size":"Frigate","slots":{"prow":1,"dorsal":1,"port":0,"starboard":0,"keel":0},"requirements":[{"tag":"bridge","min":1,"label":"Bridge"},{"tag":"reactor","min":1,"label":"Plasma Reactor"},{"tag":"gellar","min":1,"label":"Gellar Field"},{"tag":"warp","min":1,"label":"Warp Drive"}]},"base":{"armour":10,"integrity":24,"manoeuvre":1,"detection":1,"speed":10,"space":40,"power":45},"crew":{"command":1,"pilot":1,"sensors":1,"engineering":2,"gunnery":2,"security":2,"flightDeck":0,"passengers":0},"rtRaw":{"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}}}},"system":{},"effects":[],"items":[],"prototypeToken":{"name":"Frigate Hull (Empty)","actorLink":true,"texture":{"src":"icons/svg/ship.svg"},"disposition":1,"displayName":0},"_id":"1f954166473bedf3","systemId":"wrath-and-glory","systemVersion":"7.1.1"}
{"name":"Conquest-class Star Galleon","type":"vehicle","img":"icons/svg/ship.svg","folder":null,"sort":0,"ownership":{"default":0},"flags":{"core":{"sheetClass":"wg-voidships-builder.VoidshipSheet"},"wg-voidships-builder":{"isVoidship":true,"hull":{"class":"Conquest-class Star Galleon","size":"Cruiser","slots":{"prow":1,"dorsal":1,"port":1,"starboard":1,"keel":0},"requirements":[{"tag":"bridge","min":1,"label":"Bridge"},{"tag":"reactor","min":1,"label":"Plasma Reactor"},{"tag":"gellar","min":1,"label":"Gellar Field"},{"tag":"warp","min":1,"label":"Warp Drive"}]},"base":{"armour":12,"integrity":36,"manoeuvre":-1,"detection":1,"speed":8,"space":75,"power":70},"crew":{"command":1,"pilot":1,"sensors":1,"engineering":2,"gunnery":2,"security":2,"flightDeck":0,"passengers":0},"rtRaw":{"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"}}},"system":{},"effects":[],"items":[],"prototypeToken":{"name":"Conquest-class Star Galleon","actorLink":true,"texture":{"src":"icons/svg/ship.svg"},"disposition":1,"displayName":0},"_id":"287a7cd15c95031f","systemId":"wrath-and-glory","systemVersion":"7.1.1"}
{"name":"Goliath-class Factory Ship","type":"vehicle","img":"icons/svg/ship.svg","folder":null,"sort":0,"ownership":{"default":0},"flags":{"core":{"sheetClass":"wg-voidships-builder.VoidshipSheet"},"wg-voidships-builder":{"isVoidship":true,"hull":{"class":"Goliath-class Factory Ship","size":"Cruiser","slots":{"prow":1,"dorsal":1,"port":0,"starboard":0,"keel":0},"requirements":[{"tag":"bridge","min":1,"label":"Bridge"},{"tag":"reactor","min":1,"label":"Plasma Reactor"},{"tag":"gellar","min":1,"label":"Gellar Field"},{"tag":"warp","min":1,"label":"Warp Drive"}]},"base":{"armour":12,"integrity":36,"manoeuvre":-1,"detection":1,"speed":8,"space":75,"power":70},"crew":{"command":1,"pilot":1,"sensors":1,"engineering":2,"gunnery":2,"security":2,"flightDeck":0,"passengers":0},"rtRaw":{"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"}}},"system":{},"effects":[],"items":[],"prototypeToken":{"name":"Goliath-class Factory Ship","actorLink":true,"texture":{"src":"icons/svg/ship.svg"},"disposition":1,"displayName":0},"_id":"2c612305a7bb853f","systemId":"wrath-and-glory","systemVersion":"7.1.1"}
{"name":"Escort Hull (Empty)","type":"vehicle","img":"icons/svg/ship.svg","folder":null,"sort":0,"ownership":{"default":0},"flags":{"core":{"sheetClass":"wg-voidships-builder.VoidshipSheet"},"wg-voidships-builder":{"isVoidship":true,"hull":{"class":"Escort Hull (Empty)","size":"Escort","slots":{"prow":1,"dorsal":0,"port":0,"starboard":0,"keel":0},"requirements":[{"tag":"bridge","min":1,"label":"Bridge"},{"tag":"reactor","min":1,"label":"Plasma Reactor"},{"tag":"gellar","min":1,"label":"Gellar Field"},{"tag":"warp","min":1,"label":"Warp Drive"}]},"base":{"armour":9,"integrity":18,"manoeuvre":2,"detection":1,"speed":10,"space":35,"power":40},"crew":{"command":1,"pilot":1,"sensors":1,"engineering":2,"gunnery":2,"security":2,"flightDeck":0,"passengers":0},"rtRaw":{"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}}}},"system":{},"effects":[],"items":[],"prototypeToken":{"name":"Escort Hull (Empty)","actorLink":true,"texture":{"src":"icons/svg/ship.svg"},"disposition":1,"displayName":0},"_id":"4412029d26021383","systemId":"wrath-and-glory","systemVersion":"7.1.1"}
{"name":"Hazeroth-class Privateer","type":"vehicle","img":"icons/svg/ship.svg","folder":null,"sort":0,"ownership":{"default":0},"flags":{"core":{"sheetClass":"wg-voidships-builder.VoidshipSheet"},"wg-voidships-builder":{"isVoidship":true,"hull":{"class":"Hazeroth-class Privateer","size":"Frigate","slots":{"prow":1,"dorsal":1,"port":0,"starboard":0,"keel":0},"requirements":[{"tag":"bridge","min":1,"label":"Bridge"},{"tag":"reactor","min":1,"label":"Plasma Reactor"},{"tag":"gellar","min":1,"label":"Gellar Field"},{"tag":"warp","min":1,"label":"Warp Drive"}]},"base":{"armour":9,"integrity":22,"manoeuvre":2,"detection":1,"speed":10,"space":38,"power":45},"crew":{"command":1,"pilot":1,"sensors":1,"engineering":2,"gunnery":2,"security":2,"flightDeck":0,"passengers":0},"rtRaw":{"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"}}},"system":{},"effects":[],"items":[],"prototypeToken":{"name":"Hazeroth-class Privateer","actorLink":true,"texture":{"src":"icons/svg/ship.svg"},"disposition":1,"displayName":0},"_id":"521f6e630bd813a4","systemId":"wrath-and-glory","systemVersion":"7.1.1"}
{"name":"Tyrant-class Cruiser","type":"vehicle","img":"icons/svg/ship.svg","folder":null,"sort":0,"ownership":{"default":0},"flags":{"core":{"sheetClass":"wg-voidships-builder.VoidshipSheet"},"wg-voidships-builder":{"isVoidship":true,"hull":{"class":"Tyrant-class Cruiser","size":"Cruiser","slots":{"prow":1,"dorsal":2,"port":1,"starboard":1,"keel":0},"requirements":[{"tag":"bridge","min":1,"label":"Bridge"},{"tag":"reactor","min":1,"label":"Plasma Reactor"},{"tag":"gellar","min":1,"label":"Gellar Field"},{"tag":"warp","min":1,"label":"Warp Drive"}]},"base":{"armour":12,"integrity":40,"manoeuvre":-1,"detection":1,"speed":8,"space":70,"power":80},"crew":{"command":1,"pilot":1,"sensors":1,"engineering":2,"gunnery":2,"security":2,"flightDeck":0,"passengers":0},"rtRaw":{"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"}}},"system":{},"effects":[],"items":[],"prototypeToken":{"name":"Tyrant-class Cruiser","actorLink":true,"texture":{"src":"icons/svg/ship.svg"},"disposition":1,"displayName":0},"_id":"6774443321f24e87","systemId":"wrath-and-glory","systemVersion":"7.1.1"}
{"name":"Universe-class Mass Conveyor","type":"vehicle","img":"icons/svg/ship.svg","folder":null,"sort":0,"ownership":{"default":0},"flags":{"core":{"sheetClass":"wg-voidships-builder.VoidshipSheet"},"wg-voidships-builder":{"isVoidship":true,"hull":{"class":"Universe-class Mass Conveyor","size":"Cruiser","slots":{"prow":1,"dorsal":1,"port":0,"starboard":0,"keel":0},"requirements":[{"tag":"bridge","min":1,"label":"Bridge"},{"tag":"reactor","min":1,"label":"Plasma Reactor"},{"tag":"gellar","min":1,"label":"Gellar Field"},{"tag":"warp","min":1,"label":"Warp Drive"},{"tag":"cargo-bay","min":4,"label":"Cargo Holds"},{"tag":"aux-plasma","min":1,"label":"Auxiliary Plasma Generator"}]},"base":{"armour":12,"integrity":36,"manoeuvre":-1,"detection":1,"speed":8,"space":80,"power":60},"crew":{"command":1,"pilot":1,"sensors":1,"engineering":2,"gunnery":2,"security":2,"flightDeck":0,"passengers":0},"rtRaw":{"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"}}},"system":{},"effects":[],"items":[],"prototypeToken":{"name":"Universe-class Mass Conveyor","actorLink":true,"texture":{"src":"icons/svg/ship.svg"},"disposition":1,"displayName":0},"_id":"6836e238cce8d9fc","systemId":"wrath-and-glory","systemVersion":"7.1.1"}
{"name":"Cobra-class Destroyer (Renegade)","type":"vehicle","img":"icons/svg/ship.svg","folder":null,"sort":0,"ownership":{"default":0},"flags":{"core":{"sheetClass":"wg-voidships-builder.VoidshipSheet"},"wg-voidships-builder":{"isVoidship":true,"hull":{"class":"Cobra-class Destroyer (Renegade)","size":"Escort","slots":{"prow":1,"dorsal":1,"port":0,"starboard":0,"keel":0},"requirements":[{"tag":"bridge","min":1,"label":"Bridge"},{"tag":"reactor","min":1,"label":"Plasma Reactor"},{"tag":"gellar","min":1,"label":"Gellar Field"},{"tag":"warp","min":1,"label":"Warp Drive"}]},"base":{"armour":9,"integrity":22,"manoeuvre":2,"detection":1,"speed":10,"space":36,"power":42},"crew":{"command":1,"pilot":1,"sensors":1,"engineering":2,"gunnery":2,"security":2,"flightDeck":0,"passengers":0},"rtRaw":{"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"}}},"system":{},"effects":[],"items":[],"prototypeToken":{"name":"Cobra-class Destroyer (Renegade)","actorLink":true,"texture":{"src":"icons/svg/ship.svg"},"disposition":1,"displayName":0},"_id":"6da4418bdbd2206c","systemId":"wrath-and-glory","systemVersion":"7.1.1"}
{"name":"Defiant-class Light Cruiser (Carrier)","type":"vehicle","img":"icons/svg/ship.svg","folder":null,"sort":0,"ownership":{"default":0},"flags":{"core":{"sheetClass":"wg-voidships-builder.VoidshipSheet"},"wg-voidships-builder":{"isVoidship":true,"hull":{"class":"Defiant-class Light Cruiser (Carrier)","size":"Light Cruiser","slots":{"prow":1,"dorsal":1,"port":1,"starboard":1,"keel":0},"requirements":[{"tag":"bridge","min":1,"label":"Bridge"},{"tag":"reactor","min":1,"label":"Plasma Reactor"},{"tag":"gellar","min":1,"label":"Gellar Field"},{"tag":"warp","min":1,"label":"Warp Drive"}]},"base":{"armour":11,"integrity":32,"manoeuvre":0,"detection":1,"speed":9,"space":60,"power":70},"crew":{"command":1,"pilot":1,"sensors":1,"engineering":2,"gunnery":2,"security":2,"flightDeck":0,"passengers":0},"rtRaw":{"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}}}},"system":{},"effects":[],"items":[],"prototypeToken":{"name":"Defiant-class Light Cruiser (Carrier)","actorLink":true,"texture":{"src":"icons/svg/ship.svg"},"disposition":1,"displayName":0},"_id":"73eed7c83ea60340","systemId":"wrath-and-glory","systemVersion":"7.1.1"}
{"name":"Orion-class Star Clipper","type":"vehicle","img":"icons/svg/ship.svg","folder":null,"sort":0,"ownership":{"default":0},"flags":{"core":{"sheetClass":"wg-voidships-builder.VoidshipSheet"},"wg-voidships-builder":{"isVoidship":true,"hull":{"class":"Orion-class Star Clipper","size":"Cruiser","slots":{"prow":1,"dorsal":1,"port":0,"starboard":0,"keel":0},"requirements":[{"tag":"bridge","min":1,"label":"Bridge"},{"tag":"reactor","min":1,"label":"Plasma Reactor"},{"tag":"gellar","min":1,"label":"Gellar Field"},{"tag":"warp","min":1,"label":"Warp Drive"}]},"base":{"armour":12,"integrity":36,"manoeuvre":-1,"detection":1,"speed":8,"space":70,"power":70},"crew":{"command":1,"pilot":1,"sensors":1,"engineering":2,"gunnery":2,"security":2,"flightDeck":0,"passengers":0},"rtRaw":{"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"}}},"system":{},"effects":[],"items":[],"prototypeToken":{"name":"Orion-class Star Clipper","actorLink":true,"texture":{"src":"icons/svg/ship.svg"},"disposition":1,"displayName":0},"_id":"750ee1998f698e08","systemId":"wrath-and-glory","systemVersion":"7.1.1"}
{"name":"Vagabond-class Merchant Trader","type":"vehicle","img":"icons/svg/ship.svg","folder":null,"sort":0,"ownership":{"default":0},"flags":{"core":{"sheetClass":"wg-voidships-builder.VoidshipSheet"},"wg-voidships-builder":{"isVoidship":true,"hull":{"class":"Vagabond-class Merchant Trader","size":"Cruiser","slots":{"prow":1,"dorsal":1,"port":0,"starboard":0,"keel":0},"requirements":[{"tag":"bridge","min":1,"label":"Bridge"},{"tag":"reactor","min":1,"label":"Plasma Reactor"},{"tag":"gellar","min":1,"label":"Gellar Field"},{"tag":"warp","min":1,"label":"Warp Drive"}]},"base":{"armour":12,"integrity":36,"manoeuvre":-1,"detection":1,"speed":8,"space":72,"power":68},"crew":{"command":1,"pilot":1,"sensors":1,"engineering":2,"gunnery":2,"security":2,"flightDeck":0,"passengers":0},"rtRaw":{"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"}}},"system":{},"effects":[],"items":[],"prototypeToken":{"name":"Vagabond-class Merchant Trader","actorLink":true,"texture":{"src":"icons/svg/ship.svg"},"disposition":1,"displayName":0},"_id":"95fcf7b99d705bd1","systemId":"wrath-and-glory","systemVersion":"7.1.1"}
{"name":"Cruiser Hull (Empty)","type":"vehicle","img":"icons/svg/ship.svg","folder":null,"sort":0,"ownership":{"default":0},"flags":{"core":{"sheetClass":"wg-voidships-builder.VoidshipSheet"},"wg-voidships-builder":{"isVoidship":true,"hull":{"class":"Cruiser Hull (Empty)","size":"Cruiser","slots":{"prow":1,"dorsal":2,"port":1,"starboard":1,"keel":0},"requirements":[{"tag":"bridge","min":1,"label":"Bridge"},{"tag":"reactor","min":1,"label":"Plasma Reactor"},{"tag":"gellar","min":1,"label":"Gellar Field"},{"tag":"warp","min":1,"label":"Warp Drive"}]},"base":{"armour":12,"integrity":40,"manoeuvre":-1,"detection":1,"speed":8,"space":70,"power":80},"crew":{"command":1,"pilot":1,"sensors":1,"engineering":2,"gunnery":2,"security":2,"flightDeck":0,"passengers":0},"rtRaw":{"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}}}},"system":{},"effects":[],"items":[],"prototypeToken":{"name":"Cruiser Hull (Empty)","actorLink":true,"texture":{"src":"icons/svg/ship.svg"},"disposition":1,"displayName":0},"_id":"96a0dacd77d672bb","systemId":"wrath-and-glory","systemVersion":"7.1.1"}
{"name":"Jericho-class Pilgrim Vessel","type":"vehicle","img":"icons/svg/ship.svg","folder":null,"sort":0,"ownership":{"default":0},"flags":{"core":{"sheetClass":"wg-voidships-builder.VoidshipSheet"},"wg-voidships-builder":{"isVoidship":true,"hull":{"class":"Jericho-class Pilgrim Vessel","size":"Cruiser","slots":{"prow":1,"dorsal":1,"port":0,"starboard":0,"keel":0},"requirements":[{"tag":"bridge","min":1,"label":"Bridge"},{"tag":"reactor","min":1,"label":"Plasma Reactor"},{"tag":"gellar","min":1,"label":"Gellar Field"},{"tag":"warp","min":1,"label":"Warp Drive"}]},"base":{"armour":12,"integrity":36,"manoeuvre":-1,"detection":1,"speed":8,"space":75,"power":68},"crew":{"command":1,"pilot":1,"sensors":1,"engineering":2,"gunnery":2,"security":2,"flightDeck":0,"passengers":0},"rtRaw":{"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"}}},"system":{},"effects":[],"items":[],"prototypeToken":{"name":"Jericho-class Pilgrim Vessel","actorLink":true,"texture":{"src":"icons/svg/ship.svg"},"disposition":1,"displayName":0},"_id":"a08b1d9ef251ec0b","systemId":"wrath-and-glory","systemVersion":"7.1.1"}
{"name":"Cobra-class Destroyer","type":"vehicle","img":"icons/svg/ship.svg","folder":null,"sort":0,"ownership":{"default":0},"flags":{"core":{"sheetClass":"wg-voidships-builder.VoidshipSheet"},"wg-voidships-builder":{"isVoidship":true,"hull":{"class":"Cobra-class Destroyer","size":"Escort","slots":{"prow":1,"dorsal":1,"port":0,"starboard":0,"keel":0},"requirements":[{"tag":"bridge","min":1,"label":"Bridge"},{"tag":"reactor","min":1,"label":"Plasma Reactor"},{"tag":"gellar","min":1,"label":"Gellar Field"},{"tag":"warp","min":1,"label":"Warp Drive"}]},"base":{"armour":9,"integrity":22,"manoeuvre":2,"detection":1,"speed":10,"space":36,"power":42},"crew":{"command":1,"pilot":1,"sensors":1,"engineering":2,"gunnery":2,"security":2,"flightDeck":0,"passengers":0},"rtRaw":{"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"}}},"system":{},"effects":[],"items":[],"prototypeToken":{"name":"Cobra-class Destroyer","actorLink":true,"texture":{"src":"icons/svg/ship.svg"},"disposition":1,"displayName":0},"_id":"b518e981d69324aa","systemId":"wrath-and-glory","systemVersion":"7.1.1"}
{"name":"Havoc-class Merchant Raider","type":"vehicle","img":"icons/svg/ship.svg","folder":null,"sort":0,"ownership":{"default":0},"flags":{"core":{"sheetClass":"wg-voidships-builder.VoidshipSheet"},"wg-voidships-builder":{"isVoidship":true,"hull":{"class":"Havoc-class Merchant Raider","size":"Frigate","slots":{"prow":1,"dorsal":1,"port":0,"starboard":0,"keel":0},"requirements":[{"tag":"bridge","min":1,"label":"Bridge"},{"tag":"reactor","min":1,"label":"Plasma Reactor"},{"tag":"gellar","min":1,"label":"Gellar Field"},{"tag":"warp","min":1,"label":"Warp Drive"}]},"base":{"armour":9,"integrity":22,"manoeuvre":2,"detection":1,"speed":10,"space":38,"power":45},"crew":{"command":1,"pilot":1,"sensors":1,"engineering":2,"gunnery":2,"security":2,"flightDeck":0,"passengers":0},"rtRaw":{"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"}}},"system":{},"effects":[],"items":[],"prototypeToken":{"name":"Havoc-class Merchant Raider","actorLink":true,"texture":{"src":"icons/svg/ship.svg"},"disposition":1,"displayName":0},"_id":"c4c69cf1b895c0e1","systemId":"wrath-and-glory","systemVersion":"7.1.1"}
{"name":"Light Cruiser Hull (Empty)","type":"vehicle","img":"icons/svg/ship.svg","folder":null,"sort":0,"ownership":{"default":0},"flags":{"core":{"sheetClass":"wg-voidships-builder.VoidshipSheet"},"wg-voidships-builder":{"isVoidship":true,"hull":{"class":"Light Cruiser Hull (Empty)","size":"Light Cruiser","slots":{"prow":1,"dorsal":1,"port":1,"starboard":1,"keel":0},"requirements":[{"tag":"bridge","min":1,"label":"Bridge"},{"tag":"reactor","min":1,"label":"Plasma Reactor"},{"tag":"gellar","min":1,"label":"Gellar Field"},{"tag":"warp","min":1,"label":"Warp Drive"}]},"base":{"armour":11,"integrity":32,"manoeuvre":0,"detection":1,"speed":9,"space":60,"power":70},"crew":{"command":1,"pilot":1,"sensors":1,"engineering":2,"gunnery":2,"security":2,"flightDeck":0,"passengers":0},"rtRaw":{"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}}}},"system":{},"effects":[],"items":[],"prototypeToken":{"name":"Light Cruiser Hull (Empty)","actorLink":true,"texture":{"src":"icons/svg/ship.svg"},"disposition":1,"displayName":0},"_id":"c5ca1fc87803b111","systemId":"wrath-and-glory","systemVersion":"7.1.1"}
{"name":"Dauntless-class Light Cruiser","type":"vehicle","img":"icons/svg/ship.svg","folder":null,"sort":0,"ownership":{"default":0},"flags":{"core":{"sheetClass":"wg-voidships-builder.VoidshipSheet"},"wg-voidships-builder":{"isVoidship":true,"hull":{"class":"Dauntless-class Light Cruiser","size":"Light Cruiser","slots":{"prow":1,"dorsal":2,"port":1,"starboard":1,"keel":0},"requirements":[{"tag":"bridge","min":1,"label":"Bridge"},{"tag":"reactor","min":1,"label":"Plasma Reactor"},{"tag":"gellar","min":1,"label":"Gellar Field"},{"tag":"warp","min":1,"label":"Warp Drive"}]},"base":{"armour":11,"integrity":32,"manoeuvre":0,"detection":1,"speed":9,"space":62,"power":72},"crew":{"command":1,"pilot":1,"sensors":1,"engineering":2,"gunnery":2,"security":2,"flightDeck":0,"passengers":0},"rtRaw":{"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"}}},"system":{},"effects":[],"items":[],"prototypeToken":{"name":"Dauntless-class Light Cruiser","actorLink":true,"texture":{"src":"icons/svg/ship.svg"},"disposition":1,"displayName":0},"_id":"c8975bb7181d8e12","systemId":"wrath-and-glory","systemVersion":"7.1.1"}
{"name":"Falchion-class Frigate","type":"vehicle","img":"icons/svg/ship.svg","folder":null,"sort":0,"ownership":{"default":0},"flags":{"core":{"sheetClass":"wg-voidships-builder.VoidshipSheet"},"wg-voidships-builder":{"isVoidship":true,"hull":{"class":"Falchion-class Frigate","size":"Frigate","slots":{"prow":1,"dorsal":1,"port":0,"starboard":0,"keel":0},"requirements":[{"tag":"bridge","min":1,"label":"Bridge"},{"tag":"reactor","min":1,"label":"Plasma Reactor"},{"tag":"gellar","min":1,"label":"Gellar Field"},{"tag":"warp","min":1,"label":"Warp Drive"}]},"base":{"armour":10,"integrity":28,"manoeuvre":1,"detection":1,"speed":10,"space":42,"power":48},"crew":{"command":1,"pilot":1,"sensors":1,"engineering":2,"gunnery":2,"security":2,"flightDeck":0,"passengers":0},"rtRaw":{"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"}}},"system":{},"effects":[],"items":[],"prototypeToken":{"name":"Falchion-class Frigate","actorLink":true,"texture":{"src":"icons/svg/ship.svg"},"disposition":1,"displayName":0},"_id":"d3853b0270deaf3f","systemId":"wrath-and-glory","systemVersion":"7.1.1"}
{"name":"Sword-class Frigate","type":"vehicle","img":"icons/svg/ship.svg","folder":null,"sort":0,"ownership":{"default":0},"flags":{"core":{"sheetClass":"wg-voidships-builder.VoidshipSheet"},"wg-voidships-builder":{"isVoidship":true,"hull":{"class":"Sword-class Frigate","size":"Frigate","slots":{"prow":1,"dorsal":1,"port":0,"starboard":0,"keel":0},"requirements":[{"tag":"bridge","min":1,"label":"Bridge"},{"tag":"reactor","min":1,"label":"Plasma Reactor"},{"tag":"gellar","min":1,"label":"Gellar Field"},{"tag":"warp","min":1,"label":"Warp Drive"}]},"base":{"armour":10,"integrity":28,"manoeuvre":1,"detection":1,"speed":10,"space":42,"power":48},"crew":{"command":1,"pilot":1,"sensors":1,"engineering":2,"gunnery":2,"security":2,"flightDeck":0,"passengers":0},"rtRaw":{"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"}}},"system":{},"effects":[],"items":[],"prototypeToken":{"name":"Sword-class Frigate","actorLink":true,"texture":{"src":"icons/svg/ship.svg"},"disposition":1,"displayName":0},"_id":"ec53303961ef4fd4","systemId":"wrath-and-glory","systemVersion":"7.1.1"}
{"name":"Turbulent-class Heavy Frigate","type":"vehicle","img":"icons/svg/ship.svg","folder":null,"sort":0,"ownership":{"default":0},"flags":{"core":{"sheetClass":"wg-voidships-builder.VoidshipSheet"},"wg-voidships-builder":{"isVoidship":true,"hull":{"class":"Turbulent-class Heavy Frigate","size":"Frigate","slots":{"prow":1,"dorsal":1,"port":0,"starboard":0,"keel":0},"requirements":[{"tag":"bridge","min":1,"label":"Bridge"},{"tag":"reactor","min":1,"label":"Plasma Reactor"},{"tag":"gellar","min":1,"label":"Gellar Field"},{"tag":"warp","min":1,"label":"Warp Drive"}]},"base":{"armour":10,"integrity":28,"manoeuvre":1,"detection":1,"speed":10,"space":42,"power":48},"crew":{"command":1,"pilot":1,"sensors":1,"engineering":2,"gunnery":2,"security":2,"flightDeck":0,"passengers":0},"rtRaw":{"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"}}},"system":{},"effects":[],"items":[],"prototypeToken":{"name":"Turbulent-class Heavy Frigate","actorLink":true,"texture":{"src":"icons/svg/ship.svg"},"disposition":1,"displayName":0},"_id":"f1ea3416a6d0d27e","systemId":"wrath-and-glory","systemVersion":"7.1.1"}
{"name":"Tempest-class Strike Frigate","type":"vehicle","img":"icons/svg/ship.svg","folder":null,"sort":0,"ownership":{"default":0},"flags":{"core":{"sheetClass":"wg-voidships-builder.VoidshipSheet"},"wg-voidships-builder":{"isVoidship":true,"hull":{"class":"Tempest-class Strike Frigate","size":"Frigate","slots":{"prow":1,"dorsal":1,"port":0,"starboard":0,"keel":0},"requirements":[{"tag":"bridge","min":1,"label":"Bridge"},{"tag":"reactor","min":1,"label":"Plasma Reactor"},{"tag":"gellar","min":1,"label":"Gellar Field"},{"tag":"warp","min":1,"label":"Warp Drive"}]},"base":{"armour":10,"integrity":28,"manoeuvre":1,"detection":1,"speed":10,"space":42,"power":48},"crew":{"command":1,"pilot":1,"sensors":1,"engineering":2,"gunnery":2,"security":2,"flightDeck":0,"passengers":0},"rtRaw":{"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"}}},"system":{},"effects":[],"items":[],"prototypeToken":{"name":"Tempest-class Strike Frigate","actorLink":true,"texture":{"src":"icons/svg/ship.svg"},"disposition":1,"displayName":0},"_id":"fb874877eacc7a08","systemId":"wrath-and-glory","systemVersion":"7.1.1"}
+10 -18
View File
@@ -1,18 +1,10 @@
{"_id":"ITM0BRIDGECIV01","name":"Command Bridge (Civilian)","type":"gear","img":"icons/svg/book.svg","flags":{"wg-voidships-builder":{"component":{"kind":"core","subtype":"bridge","tags":["bridge"],"allowedSlots":[]},"voidOnly":true}},"system":{"description":"Standard command bridge and cogitators.","equipped":true,"voidship":{"slot":"Internal","use":{"space":2,"power":2},"mods":{"detection":1,"manoeuvre":1}}},"effects":[]}
{"_id":"ITM0LIFESUPP001","name":"Life Support","type":"gear","img":"icons/svg/poison.svg","flags":{"wg-voidships-builder":{"component":{"kind":"core","subtype":"life-support","tags":["life-support"],"allowedSlots":[]},"voidOnly":true}},"system":{"description":"Atmospheric recyclers, grav-amps, habitat.","equipped":true,"voidship":{"slot":"Internal","use":{"space":2,"power":2}}},"effects":[]}
{"_id":"ITM0GELLARSTD01","name":"Gellar Field Projector","type":"gear","img":"icons/svg/temple.svg","flags":{"wg-voidships-builder":{"component":{"kind":"core","subtype":"gellar","tags":["gellar"],"allowedSlots":[]},"voidOnly":true}},"system":{"description":"Essential protection in the Immaterium.","equipped":true,"voidship":{"slot":"Internal","use":{"space":2,"power":3}}},"effects":[]}
{"_id":"ITM0WARPDRIVE01","name":"Warp Drive (Miloslav)","type":"gear","img":"icons/svg/wing.svg","flags":{"wg-voidships-builder":{"component":{"kind":"core","subtype":"warp-drive","tags":["warp-drive"],"allowedSlots":[]},"voidOnly":true}},"system":{"description":"Reliable civilian warp drive.","equipped":true,"voidship":{"slot":"Internal","use":{"space":3,"power":6}}},"effects":[]}
{"_id":"ITM0REACTOR001A","name":"Plasma Reactor (Civilian)","type":"gear","img":"icons/svg/energy.svg","flags":{"wg-voidships-builder":{"component":{"kind":"core","subtype":"reactor","tags":["reactor"],"allowedSlots":[]},"voidOnly":true}},"system":{"description":"Primary plasma power generation.","equipped":true,"voidship":{"slot":"Internal","use":{"space":3,"power":-50},"mods":{"power":50}}},"effects":[]}
{"_id":"ITM0AUGURCIV001","name":"Augur Array (Civilian)","type":"gear","img":"icons/svg/mystery-man.svg","flags":{"wg-voidships-builder":{"component":{"kind":"core","subtype":"augur","tags":["augur"],"allowedSlots":[]},"voidOnly":true}},"system":{"description":"Standard augur/sensor package.","equipped":true,"voidship":{"slot":"Aetherics","use":{"space":1,"power":2},"mods":{"detection":2}}},"effects":[]}
{"_id":"ITM0VSHIELD001A","name":"Void Shields (Single)","type":"gear","img":"icons/svg/shield.svg","flags":{"wg-voidships-builder":{"component":{"kind":"core","subtype":"void-shields","tags":["void-shields"],"allowedSlots":[]},"voidOnly":true}},"system":{"description":"Standard void shield emitters.","equipped":true,"voidship":{"slot":"Internal","use":{"space":1,"power":3},"mods":{"integrity":2}}},"effects":[]}
{"_id":"ITM0CARGOHOLD01","name":"Cargo Hold & Lighter Bay","type":"gear","img":"icons/svg/crate.svg","flags":{"wg-voidships-builder":{"component":{"kind":"upgrade","subtype":"cargo-bay","tags":["cargo-bay"],"allowedSlots":[]},"voidOnly":true}},"system":{"description":"General-purpose cargo hold.","equipped":true,"voidship":{"slot":"Internal","use":{"space":-5,"power":1},"mods":{"space":-5}}},"effects":[]}
{"_id":"ITM0AUXPLASMA01","name":"Auxiliary Plasma Generator","type":"gear","img":"icons/svg/energy.svg","flags":{"wg-voidships-builder":{"component":{"kind":"upgrade","subtype":"aux-plasma","tags":["aux-plasma","reactor"],"allowedSlots":[]},"voidOnly":true}},"system":{"description":"Auxiliary plasma reactor increasing available power.","equipped":true,"voidship":{"slot":"Internal","use":{"space":2,"power":-6},"mods":{"power":6}}},"effects":[]}
{"_id":"ITM0ARMOURPLT01","name":"Reinforced Hull Plating","type":"gear","img":"icons/svg/armor.svg","flags":{"wg-voidships-builder":{"component":{"kind":"upgrade","subtype":"plating","tags":["hull","armour"],"allowedSlots":[]},"voidOnly":true}},"system":{"description":"Additional armour plates and bracing.","equipped":true,"voidship":{"slot":"Internal","use":{"space":1,"power":0},"mods":{"armour":2,"integrity":4,"manoeuvre":-1}}},"effects":[]}
{"_id":"ITM0MANEUVER01A","name":"High-Output Manoeuvring Thrusters","type":"gear","img":"icons/svg/wing.svg","flags":{"wg-voidships-builder":{"component":{"kind":"upgrade","subtype":"thrusters","tags":["thrusters"],"allowedSlots":[]},"voidOnly":true}},"system":{"description":"Vectorable RCS and trim jets.","equipped":true,"voidship":{"slot":"External","use":{"space":1,"power":2},"mods":{"manoeuvre":2}}},"effects":[]}
{"_id":"ITM0MACROPORT01","name":"Mars-Pattern Macrobattery (Port)","type":"gear","img":"icons/svg/sword.svg","flags":{"wg-voidships-builder":{"component":{"kind":"weapon","subtype":"macrobattery","tags":["weapon"],"allowedSlots":["port"]},"voidOnly":true}},"system":{"description":"Port broadside macro-cannons.","equipped":true,"voidship":{"slot":"Port","use":{"space":2,"power":3},"mods":{}}},"effects":[]}
{"_id":"ITM0MACROSTBD01","name":"Mars-Pattern Macrobattery (Starboard)","type":"gear","img":"icons/svg/sword.svg","flags":{"wg-voidships-builder":{"component":{"kind":"weapon","subtype":"macrobattery","tags":["weapon"],"allowedSlots":["starboard"]},"voidOnly":true}},"system":{"description":"Starboard broadside macro-cannons.","equipped":true,"voidship":{"slot":"Starboard","use":{"space":2,"power":3},"mods":{}}},"effects":[]}
{"_id":"ITM0LANCEDORS01","name":"Sunsear Laser Battery (Dorsal)","type":"gear","img":"icons/svg/sun.svg","flags":{"wg-voidships-builder":{"component":{"kind":"weapon","subtype":"laser-battery","tags":["weapon"],"allowedSlots":["dorsal"]},"voidOnly":true}},"system":{"description":"High-energy dorsal lasers.","equipped":true,"voidship":{"slot":"Dorsal","use":{"space":2,"power":4},"mods":{}}},"effects":[]}
{"_id":"ITM0PROWTORP01","name":"Prow Torpedo Tubes","type":"gear","img":"icons/svg/anchor.svg","flags":{"wg-voidships-builder":{"component":{"kind":"weapon","subtype":"torpedoes","tags":["weapon"],"allowedSlots":["prow"]},"voidOnly":true}},"system":{"description":"Prow-mounted torpedo tubes.","equipped":true,"voidship":{"slot":"Prow","use":{"space":3,"power":3},"mods":{}}},"effects":[]}
{"_id":"ITM0KEELNOVA01","name":"Keel Nova Cannon","type":"gear","img":"icons/svg/explosion.svg","flags":{"wg-voidships-builder":{"component":{"kind":"weapon","subtype":"nova-cannon","tags":["weapon"],"allowedSlots":["keel"]},"voidOnly":true}},"system":{"description":"Spinal nova cannon on the keel.","equipped":true,"voidship":{"slot":"Keel","use":{"space":4,"power":6},"mods":{}}},"effects":[]}
{"_id":"BRIDGECLV0000001","name":"Command Bridge (Civilian)","type":"gear","img":"icons/svg/book.svg","flags":{"wg-voidships-builder":{"component":{"kind":"bridge","subtype":"civilian","tags":["bridge","internal"]},"voidOnly":true,"voidship":{"slot":"Internal","use":{"space":2,"power":2},"mods":{"armour":0,"integrity":0,"manoeuvre":1,"detection":1,"speed":0,"space":0,"power":0}}}},"system":{"quantity":1,"rarity":"Common","description":"Standard command bridge and cogitators.","value":0,"keywords":[],"effect":"","test":""},"effects":[]}
{"_id":"REACTORPLSM00001","name":"Plasma Reactor (Civilian)","type":"gear","img":"icons/svg/energy.svg","flags":{"wg-voidships-builder":{"component":{"kind":"reactor","subtype":"plasma","tags":["reactor","internal"]},"voidOnly":true,"voidship":{"slot":"Internal","use":{"space":4,"power":-10},"mods":{"armour":0,"integrity":0,"manoeuvre":0,"detection":0,"speed":0,"space":0,"power":10}}}},"system":{"quantity":1,"rarity":"Common","description":"Primary plasma reactor for voidship operations.","value":0,"keywords":[],"effect":"","test":""},"effects":[]}
{"_id":"GELLARSTD0000001","name":"Gellar Field Projector","type":"gear","img":"icons/svg/temple.svg","flags":{"wg-voidships-builder":{"component":{"kind":"gellar","subtype":"standard","tags":["gellar","internal"]},"voidOnly":true,"voidship":{"slot":"Internal","use":{"space":2,"power":3},"mods":{"armour":0,"integrity":0,"manoeuvre":0,"detection":0,"speed":0,"space":0,"power":0}}}},"system":{"quantity":1,"rarity":"Common","description":"Essential protection in the Immaterium.","value":0,"keywords":[],"effect":"","test":""},"effects":[]}
{"_id":"WARPDRVMILO00001","name":"Miloslav Warp Drive (Civilian)","type":"gear","img":"icons/svg/wing.svg","flags":{"wg-voidships-builder":{"component":{"kind":"drive","subtype":"warp","tags":["drive","warp","internal"]},"voidOnly":true,"voidship":{"slot":"Internal","use":{"space":3,"power":6},"mods":{"armour":0,"integrity":0,"manoeuvre":0,"detection":0,"speed":0,"space":0,"power":0}}}},"system":{"quantity":1,"rarity":"Common","description":"Reliable civilian warp drive.","value":0,"keywords":[],"effect":"","test":""},"effects":[]}
{"_id":"AUGURARRAY000001","name":"Augur Array (Civilian)","type":"gear","img":"icons/svg/mystery-man.svg","flags":{"wg-voidships-builder":{"component":{"kind":"sensor","subtype":"augur","tags":["sensor","auspex","aetherics"]},"voidOnly":true,"voidship":{"slot":"Aetherics","use":{"space":1,"power":2},"mods":{"armour":0,"integrity":0,"manoeuvre":0,"detection":2,"speed":0,"space":0,"power":0}}}},"system":{"quantity":1,"rarity":"Common","description":"Standard augur/sensor package.","value":0,"keywords":[],"effect":"","test":""},"effects":[]}
{"_id":"HULLPLATE0000001","name":"Reinforced Hull Plating","type":"gear","img":"icons/svg/armor.svg","flags":{"wg-voidships-builder":{"component":{"kind":"armour","subtype":"plating","tags":["hull","armour","internal"]},"voidOnly":true,"voidship":{"slot":"Internal","use":{"space":1,"power":0},"mods":{"armour":2,"integrity":4,"manoeuvre":-1,"detection":0,"speed":0,"space":0,"power":0}}}},"system":{"quantity":1,"rarity":"Common","description":"Additional armour plates and bracing.","value":0,"keywords":[],"effect":"","test":""},"effects":[]}
{"_id":"CARGOHOLD0000001","name":"Cargo Hold & Lighter Bay","type":"gear","img":"icons/svg/crate.svg","flags":{"wg-voidships-builder":{"component":{"kind":"cargo-bay","subtype":"standard","tags":["cargo-bay","internal"]},"voidOnly":true,"voidship":{"slot":"Internal","use":{"space":-5,"power":1},"mods":{"armour":0,"integrity":0,"manoeuvre":0,"detection":0,"speed":0,"space":-5,"power":0}}}},"system":{"quantity":1,"rarity":"Common","description":"General-purpose cargo hold with lighter handling.","value":0,"keywords":[],"effect":"","test":""},"effects":[]}
{"_id":"AUXPLASMA0000001","name":"Auxiliary Plasma Generator","type":"gear","img":"icons/svg/energy.svg","flags":{"wg-voidships-builder":{"component":{"kind":"plasma","subtype":"aux-generator","tags":["aux-plasma","internal"]},"voidOnly":true,"voidship":{"slot":"Internal","use":{"space":2,"power":-6},"mods":{"armour":0,"integrity":0,"manoeuvre":0,"detection":0,"speed":0,"space":0,"power":6}}}},"system":{"quantity":1,"rarity":"Common","description":"Auxiliary plasma reactor increasing available power.","value":0,"keywords":[],"effect":"","test":""},"effects":[]}
{"_id":"MACROPROW0000001","name":"Macrobattery (Prow)","type":"gear","img":"icons/svg/sword.svg","flags":{"wg-voidships-builder":{"component":{"kind":"weapon","subtype":"macrobattery","tags":["weapon","prow"]},"voidOnly":true,"voidship":{"slot":"Prow","use":{"space":2,"power":2},"mods":{"armour":0,"integrity":0,"manoeuvre":0,"detection":0,"speed":0,"space":0,"power":0}}}},"system":{"quantity":1,"rarity":"Common","description":"Prow macrobattery.","value":0,"keywords":[],"effect":"","test":""},"effects":[]}
{"_id":"MACRODORS0000001","name":"Macrobattery (Dorsal)","type":"gear","img":"icons/svg/sword.svg","flags":{"wg-voidships-builder":{"component":{"kind":"weapon","subtype":"macrobattery","tags":["weapon","dorsal"]},"voidOnly":true,"voidship":{"slot":"Dorsal","use":{"space":2,"power":2},"mods":{"armour":0,"integrity":0,"manoeuvre":0,"detection":0,"speed":0,"space":0,"power":0}}}},"system":{"quantity":1,"rarity":"Common","description":"Dorsal macrobattery.","value":0,"keywords":[],"effect":"","test":""},"effects":[]}
+323 -232
View File
@@ -1,23 +1,29 @@
// W&G Voidships Builder — Voidship Actor Sheet (vehicle+flag emulation)
// v1.1.0 (mapping weapons + core reqs + safer drops) — Foundry v11v13
// v1.1.0 — Foundry V11V13 safe
/* eslint-env es2021 */
const VB_MOD = "wg-voidships-builder";
const VB_DEBUG = true; // debug on; switch later via setting
const VB_DEBUG = true; // Debug on
function dbg(...args) { if (VB_DEBUG) console.debug("[VB]", ...args); }
// Canonical slot keys
const SLOT_KEYS = ["prow","dorsal","port","starboard","keel"];
// Default RT-like core requirements (if hull.requirements is empty)
const DEFAULT_CORE_REQS = [
{ tag: "bridge", min: 1, label: "Bridge" },
{ tag: "life-support", min: 1, label: "Life Support" },
{ tag: "gellar", min: 1, label: "Gellar Field" },
{ tag: "warp-drive", min: 1, label: "Warp Drive" },
{ tag: "reactor", min: 1, label: "Plasma/Power Reactor" },
{ tag: "augur", min: 1, label: "Augur Array" },
{ tag: "void-shields", min: 1, label: "Void Shields" }
];
// ---------------- Handlebars helpers ----------------
Hooks.once("init", () => {
if (!Handlebars.helpers.signed) {
Handlebars.registerHelper("signed", (v) => {
const n = Number(v || 0);
if (!Number.isFinite(n) || n === 0) return "±0";
return (n > 0 ? "+" : "") + Math.abs(n);
});
}
if (!Handlebars.helpers.eq) {
Handlebars.registerHelper("eq", (a, b) => a === b);
}
if (!Handlebars.helpers.json) {
Handlebars.registerHelper("json", (ctx) => {
try { return JSON.stringify(ctx, null, 2); }
catch { return String(ctx); }
});
}
});
class VoidshipSheet extends ActorSheet {
static get defaultOptions() {
@@ -27,97 +33,64 @@ class VoidshipSheet extends ActorSheet {
template: `modules/${VB_MOD}/templates/voidship-sheet.hbs`,
width: 720,
height: 680,
tabs: [{ navSelector: ".tabs", contentSelector: ".sheet-body", initial: "wg" }]
tabs: [{ navSelector: ".tabs", contentSelector: ".sheet-body", initial: "wg" }],
dragDrop: [{ dragSelector: ".voidship-sheet", dropSelector: ".voidship-sheet" }]
});
}
/** Allow viewing for everyone (adjust if you need perms) */
_canUserView(user) { return !!user; }
get isVoidship() { return this.actor?.getFlag(VB_MOD, "isVoidship") === true; }
/** Sum flags.base + items mods + usage */
_computeDerived() {
const a = this.actor;
const b = a.getFlag(VB_MOD, "base") || {};
const base = {
armour: Number(b.armour)||0,
integrity: Number(b.integrity)||0,
manoeuvre: Number(b.manoeuvre)||0,
detection: Number(b.detection)||0,
speed: Number(b.speed)||0,
space: Number(b.space)||0,
power: Number(b.power)||0
};
// ---- math helpers ----
_sumModsFromItems(items) {
const mods = { armour: 0, integrity: 0, manoeuvre: 0, detection: 0, speed: 0, space: 0, power: 0 };
let useSpace = 0, usePower = 0;
const slotsUsed = { prow: 0, dorsal: 0, port: 0, starboard: 0, keel: 0 };
const mods = { armour:0, integrity:0, manoeuvre:0, detection:0, speed:0, space:0, power:0 };
const usage = { space:0, power:0 };
const slotsUsed = { prow:0, dorsal:0, port:0, starboard:0, keel:0 };
for (const it of items) {
const vs = it.system?.voidship;
if (!vs) continue;
for (const it of a.items.contents) {
const sys = it.system ?? {};
const v = sys.voidship ?? {};
const equipped = (sys.equipped ?? true) === true; // treat true/undefined as mounted
const comp = it.getFlag(VB_MOD, "component") || v.component || {}; // our kind/tags live in flags
const equipped = (it.system?.equipped ?? true);
const slotKey = String(vs.slot || "").toLowerCase();
if (equipped && ["prow", "dorsal", "port", "starboard", "keel"].includes(slotKey)) {
slotsUsed[slotKey] = (slotsUsed[slotKey] || 0) + 1;
}
if (equipped) {
// accumulate mods
const m = v.mods || {};
for (const k of Object.keys(mods)) {
const n = Number(m[k]);
if (Number.isFinite(n)) mods[k] += n;
}
// accumulate usage
const u = v.use || {};
if (Number.isFinite(Number(u.space))) usage.space += Number(u.space);
if (Number.isFinite(Number(u.power))) usage.power += Number(u.power);
// capacity usage (always counts, bo to realne zużycie jeśli wolisz tylko equipped, to obejmij warunkiem)
const use = vs.use || {};
if (Number.isFinite(Number(use.space))) useSpace += Number(use.space);
if (Number.isFinite(Number(use.power))) usePower += Number(use.power);
// weapon slots count ONLY for kind === "weapon"
const kind = String(comp?.kind || "").toLowerCase();
const slot = String(v.slot || "").toLowerCase();
if (kind === "weapon" && SLOT_KEYS.includes(slot)) slotsUsed[slot] += 1;
// mods liczą się tylko jeśli equipped
if (!equipped) continue;
const m = vs.mods || {};
for (const k of Object.keys(mods)) {
const val = Number(m[k]);
if (Number.isFinite(val)) mods[k] += val;
}
}
const total = {
armour: base.armour + mods.armour,
integrity: base.integrity + mods.integrity,
manoeuvre: base.manoeuvre + mods.manoeuvre,
detection: base.detection + mods.detection,
speed: base.speed + mods.speed,
space: base.space + mods.space,
power: base.power + mods.power,
spaceFree: base.space + mods.space - usage.space,
powerFree: base.power + mods.power - usage.power
};
dbg("computeDerived:", { base, mods, usage, total, slotsUsed });
return { base, mods, usage, total, slotsUsed };
return { mods, use: { space: useSpace, power: usePower }, slotsUsed };
}
}
/** helpers */
Hooks.once("init", () => {
if (!Handlebars.helpers.signed) {
Handlebars.registerHelper("signed", v => {
const n = Number(v||0); if (!Number.isFinite(n) || n===0) return "±0";
return (n>0?"+":"")+Math.abs(n);
});
}
// pretty-json (for debug blocks)
if (!Handlebars.helpers.tojson) {
Handlebars.registerHelper("tojson", v => JSON.stringify(v, null, 2));
}
});
VoidshipSheet.prototype.getData = async function(options) {
// ---- data aggregation for template ----
async getData(options) {
const data = await super.getData(options);
const actor = this.actor;
const VB_MOD = "wg-voidships-builder";
// Flagowe źródła (przeżywają migracje W&G)
const flags = actor.getFlag(VB_MOD, "") || {};
const hull = flags.hull || { class: actor.name, size: "Cruiser", slots: { prow:0,dorsal:0,port:0,starboard:0,keel:0 } };
const base = flags.base || { armour:0, integrity:0, manoeuvre:0, detection:0, speed:0, space:0, power:0 };
const crew = flags.crew || { command:1,pilot:1,sensors:1,engineering:2,gunnery:2,security:2,flightDeck:0,passengers:0 };
const rtRaw = flags["rtRaw"] || {};
const rt = rtRaw.rt || {};
const hull = flags.hull || { class: actor.name, size: "Cruiser", slots: { prow: 0, dorsal: 0, port: 0, starboard: 0, keel: 0 } };
const base = flags.base || { armour: 0, integrity: 0, manoeuvre: 0, detection: 0, speed: 0, space: 0, power: 0 };
const crew = flags.crew || { command: 0, pilot: 0, sensors: 0, engineering: 0, gunnery: 0, security: 0, flightDeck: 0, passengers: 0 };
// RT snapshot (jak dotąd)
const rtRaw = actor.getFlag(VB_MOD, "rtRaw") || {};
const rt = rtRaw.rt || {};
const rtCard = {
speed: rt.speed ?? rtRaw.combat?.speed ?? 0,
manoeuvrability: rt.manoeuvrability ?? rtRaw.mnvr ?? 0,
@@ -135,172 +108,290 @@ VoidshipSheet.prototype.getData = async function(options) {
},
turret: rt.turret ?? 0,
notes: rtRaw.notes ?? "",
source: rt.source ?? ""
source: rt.source ?? rtRaw.source ?? ""
};
// components (only items having system.voidship)
const components = actor.items.contents
.filter(i => i.system?.voidship)
.map(i => {
const v = foundry.utils.deepClone(i.system.voidship || {});
const comp = i.getFlag(VB_MOD, "component") || v.component || {};
return {
itemId: i.id,
name: i.name,
equipped: (i.system?.equipped ?? true) === true,
slot: v.slot || "Internal",
use: Object.assign({ space:0, power:0 }, v.use),
mods: Object.assign({ armour:0, integrity:0, manoeuvre:0, detection:0, speed:0, space:0, power:0 }, v.mods),
component: { kind: String(comp.kind||"").toLowerCase(), tags: comp.tags || [], allowedSlots: comp.allowedSlots || [] }
};
// ===== KOMPONENTY: czytamy Z FLAG =====
const items = actor.items.contents;
const inferSlotFromTags = (tags=[]) => {
const low = (Array.isArray(tags)?tags:[]).map(t => String(t).toLowerCase());
const pref = ["prow","dorsal","port","starboard","keel","aetherics","internal"];
const hit = pref.find(p => low.includes(p));
return hit ? (hit[0].toUpperCase()+hit.slice(1)) : "Internal";
};
const components = [];
for (const i of items) {
const fmod = i.flags?.[VB_MOD] || {};
const vflag = fmod.voidship || null; // <-- TU trzymamy liczby
const meta = fmod.component || {}; // kind/subtype/tags
// Dopuszczamy też stare itemy z system.voidship (jeśli coś przetrwa)
const vsys = i.system?.voidship || null;
// komponent, jeśli ma vflag LUB meta.tags LUB vsys
const isComponent = !!(vflag || vsys || (Array.isArray(meta.tags) && meta.tags.length));
if (!isComponent) continue;
const vf = vflag || vsys || {};
const use = {
space: Number(vf?.use?.space ?? 0),
power: Number(vf?.use?.power ?? 0)
};
const mods = {
armour: Number(vf?.mods?.armour ?? 0),
integrity: Number(vf?.mods?.integrity ?? 0),
manoeuvre: Number(vf?.mods?.manoeuvre ?? 0),
detection: Number(vf?.mods?.detection ?? 0),
speed: Number(vf?.mods?.speed ?? 0),
space: Number(vf?.mods?.space ?? 0),
power: Number(vf?.mods?.power ?? 0)
};
let slot = vf.slot || meta.slot || inferSlotFromTags(meta.tags);
const equipped = (i.system?.equipped ?? true) && (vf.disabled !== true);
components.push({
itemId: i.id,
name: i.name,
slot,
equipped,
use, mods,
tags: meta.tags || []
});
}
// derived totals and slotsUsed (weapons only)
const { base:baseCalc, mods, usage, total, slotsUsed } = this._computeDerived();
// Zliczanie slotów (tylko equipped)
const slotsUsed = components.reduce((acc, c) => {
if (!c.equipped) return acc;
const key = String(c.slot || "Internal").toLowerCase();
if (["prow","dorsal","port","starboard","keel"].includes(key)) acc[key] = (acc[key] || 0) + 1;
return acc;
}, { prow: 0, dorsal: 0, port: 0, starboard: 0, keel: 0 });
// Warnings: slots over-capacity (compare ONLY weapons vs hull slot caps)
// Capacity: bazowe + mody z komponentów (equipped) vs użycie (equipped)
const modsSum = components.reduce((acc, c) => {
if (!c.equipped) return acc;
for (const k of Object.keys(acc)) acc[k] += Number(c.mods[k] || 0);
return acc;
}, { armour:0, integrity:0, manoeuvre:0, detection:0, speed:0, space:0, power:0 });
const useSum = components.reduce((acc, c) => {
if (!c.equipped) return acc;
acc.space += Number(c.use.space || 0);
acc.power += Number(c.use.power || 0);
return acc;
}, { space: 0, power: 0 });
const totals = {
armour: (Number(base.armour)||0) + modsSum.armour,
integrity: (Number(base.integrity)||0) + modsSum.integrity,
manoeuvre: (Number(base.manoeuvre)||0) + modsSum.manoeuvre,
detection: (Number(base.detection)||0) + modsSum.detection,
speed: (Number(base.speed)||0) + modsSum.speed,
space: (Number(base.space)||0) + modsSum.space,
power: (Number(base.power)||0) + modsSum.power
};
totals.spaceFree = totals.space - useSum.space;
totals.powerFree = totals.power - useSum.power;
// Ostrzeżenia
const warnings = {};
if (components.length) {
const over =
(slotsUsed.prow > (hull.slots?.prow || 0)) ||
(slotsUsed.dorsal > (hull.slots?.dorsal || 0)) ||
(slotsUsed.port > (hull.slots?.port || 0)) ||
(slotsUsed.starboard > (hull.slots?.starboard || 0)) ||
(slotsUsed.keel > (hull.slots?.keel || 0));
if (over) warnings.slots = "One or more weapon slot groups exceed hull limits.";
}
if (total.spaceFree < 0 || total.powerFree < 0) {
const overSlots =
(slotsUsed.prow > (hull.slots?.prow || 0)) ||
(slotsUsed.dorsal > (hull.slots?.dorsal || 0)) ||
(slotsUsed.port > (hull.slots?.port || 0)) ||
(slotsUsed.starboard > (hull.slots?.starboard || 0)) ||
(slotsUsed.keel > (hull.slots?.keel || 0));
if (overSlots) warnings.slots = "One or more weapon slot groups exceed hull limits.";
if (totals.spaceFree < 0 || totals.powerFree < 0)
warnings.capacity = "Not enough Space/Power for installed components.";
}
// Validate allowedSlots for weapons (if provided)
const badMounts = components.filter(c =>
c.equipped &&
c.component?.kind === "weapon" &&
Array.isArray(c.component.allowedSlots) &&
c.component.allowedSlots.length &&
!c.component.allowedSlots.map(s => String(s).toLowerCase()).includes(String(c.slot).toLowerCase())
);
if (badMounts.length) {
warnings.mounts = `Invalid weapon placement: ${badMounts.map(b=>`${b.name}${b.slot}`).join(", ")}.`;
}
// Requirements — gather tags from equipped components
const tagCounts = {};
for (const c of components) {
if (!c.equipped) continue;
for (const t of (c.component?.tags || [])) {
const key = String(t).toLowerCase();
tagCounts[key] = (tagCounts[key] || 0) + 1;
}
}
const reqs = (Array.isArray(hull.requirements) && hull.requirements.length) ? hull.requirements : DEFAULT_CORE_REQS;
const missing = [];
for (const r of reqs) {
const need = Number(r.min||0);
if (!need) continue;
const have = tagCounts[String(r.tag||"").toLowerCase()] || 0;
if (have < need) missing.push(`${r.label||r.tag}: ${have}/${need}`);
}
if (missing.length) warnings.requirements = `Missing required systems — ${missing.join("; ")}`;
// expose to hbs
// wstrzyknij do template
data.hull = hull;
data.base = base;
data.crew = crew;
data.mods = mods;
data.usage = usage;
data.totals = total;
data.slotsUsed = slotsUsed;
data.rtCard = rtCard;
data.components = components;
data.slotsUsed = slotsUsed;
data.totals = totals;
data.warnings = warnings;
data.debug = { flags, tagCounts, reqs }; // handy raw blocks
dbg("sheet.getData", { base, hull, totals, slotsUsed, componentsCount: components.length });
return data;
};
}
VoidshipSheet.prototype.activateListeners = function(html) {
super.activateListeners(html);
// ---- listeners & UI ----
activateListeners(html) {
super.activateListeners(html);
// mark/unmark
html.find("[data-action='mark-voidship']").on("click", async () => {
await this.actor.setFlag(VB_MOD, "isVoidship", true);
ui.notifications.info("Marked as Voidship.");
this.render(true);
});
html.find("[data-action='unmark-voidship']").on("click", async () => {
await this.actor.unsetFlag(VB_MOD, "isVoidship");
ui.notifications.info("Unmarked Voidship.");
this.render(true);
});
// configure base
html.find("[data-action='configure-base']").on("click", async () => {
const cur = this._computeDerived().base;
const content = `
<div class="form-group"><label>Armour</label><input type="number" name="armour" value="${cur.armour}"/></div>
<div class="form-group"><label>Integrity</label><input type="number" name="integrity" value="${cur.integrity}"/></div>
<div class="form-group"><label>Manoeuvre</label><input type="number" name="manoeuvre" value="${cur.manoeuvre}"/></div>
<div class="form-group"><label>Detection</label><input type="number" name="detection" value="${cur.detection}"/></div>
<div class="form-group"><label>Speed</label><input type="number" name="speed" value="${cur.speed}"/></div>
<div class="form-group"><label>Space</label><input type="number" name="space" value="${cur.space}"/></div>
<div class="form-group"><label>Power</label><input type="number" name="power" value="${cur.power}"/></div>
`;
new Dialog({
title: "Voidship — Base Stats",
content, buttons: {
ok: { label: "Save", callback: async (dlg) => {
const form = dlg[0].querySelector("form") || dlg[0];
const get = (k) => Number(form.querySelector(`[name="${k}"]`)?.value || 0);
const patchBase = {
armour: get("armour"),
integrity: get("integrity"),
manoeuvre: get("manoeuvre"),
detection: get("detection"),
speed: get("speed"),
space: get("space"),
power: get("power")
};
await this.actor.setFlag(VB_MOD, "base", patchBase);
this.render(true);
}},
cancel: { label: "Cancel" }
}, default: "ok"
}, { jQuery: true }).render(true);
});
// toggle raw debug blocks
html.find("[data-action='toggle-raw']").on("click", (ev) => {
const el = html.find(".vb-raw")[0];
if (el) el.style.display = (el.style.display === "none") ? "block" : "none";
});
};
// ACCEPT only items having system.voidship (and optionally flags[VB_MOD].component)
VoidshipSheet.prototype._onDropItem = async function(event, data) {
try {
const resolved = await Item.fromDropData(data);
if (!resolved) return ui.notifications.error("Drop failed: cannot resolve item (no UUID/DATA).");
const sys = resolved.system ?? {};
if (!sys.voidship) return ui.notifications.warn("This item is not a voidship component.");
// optional hard guard: if not our 'voidOnly' flag, still allow — but warn
const vFlags = resolved.getFlag(VB_MOD, "component");
if (!vFlags) dbg("Component missing flags; proceeding with system.voidship only.");
// pass to Foundry to actually create the embedded item
const created = await this.actor.createEmbeddedDocuments("Item", [resolved.toObject()]);
if (created?.length) {
ui.notifications.info(`Installed component: ${created[0].name}`);
html.find("[data-action='mark-voidship']").on("click", async () => {
await this.actor.setFlag(VB_MOD, "isVoidship", true);
ui.notifications.info("Marked as Voidship.");
this.render(true);
}
} catch (err) {
console.error(err);
ui.notifications.error("Drop failed: cannot resolve item data (no UUID/DATA).");
}
};
});
html.find("[data-action='unmark-voidship']").on("click", async () => {
await this.actor.unsetFlag(VB_MOD, "isVoidship");
ui.notifications.info("Unmarked Voidship.");
this.render(true);
});
html.find("[data-action='configure-base']").on("click", async () => {
const cur = this.actor.getFlag(VB_MOD, "base") || {};
const content = `
<form>
<div class="form-group"><label>Armour</label><input type="number" name="armour" value="${Number(cur.armour || 0)}"/></div>
<div class="form-group"><label>Integrity</label><input type="number" name="integrity" value="${Number(cur.integrity || 0)}"/></div>
<div class="form-group"><label>Manoeuvre</label><input type="number" name="manoeuvre" value="${Number(cur.manoeuvre || 0)}"/></div>
<div class="form-group"><label>Detection</label><input type="number" name="detection" value="${Number(cur.detection || 0)}"/></div>
<div class="form-group"><label>Speed</label><input type="number" name="speed" value="${Number(cur.speed || 0)}"/></div>
<div class="form-group"><label>Space</label><input type="number" name="space" value="${Number(cur.space || 0)}"/></div>
<div class="form-group"><label>Power</label><input type="number" name="power" value="${Number(cur.power || 0)}"/></div>
</form>`;
new Dialog({
title: "Voidship — Base Stats",
content, buttons: {
ok: {
label: "Save",
callback: async (dlg) => {
const form = dlg[0].querySelector("form");
const num = (n) => Number(form.querySelector(`[name="${n}"]`)?.value || 0);
await this.actor.setFlag(VB_MOD, "base", {
armour: num("armour"), integrity: num("integrity"),
manoeuvre: num("manoeuvre"), detection: num("detection"),
speed: num("speed"), space: num("space"), power: num("power")
});
this.render(true);
}
},
cancel: { label: "Cancel" }
}, default: "ok"
}, { jQuery: true }).render(true);
});
// Components controls
html.find("[data-action='comp-toggle']").on("click", async (ev) => {
const row = ev.currentTarget.closest("tr");
const id = row?.dataset?.itemId;
const item = this.actor.items.get(id);
if (!item) return;
const equipped = !(item.system?.equipped ?? true);
await item.update({ "system.equipped": equipped });
this.render(true);
});
html.find("[data-action='comp-edit']").on("click", async (ev) => {
const row = ev.currentTarget.closest("tr");
const id = row?.dataset?.itemId;
const item = this.actor.items.get(id);
if (item) item.sheet?.render(true);
});
html.find("[data-action='comp-remove']").on("click", async (ev) => {
const row = ev.currentTarget.closest("tr");
const id = row?.dataset?.itemId;
if (!id) return;
await this.actor.deleteEmbeddedDocuments("Item", [id]);
this.render(true);
});
}
// --- robust drop handlers: flag-only storage (survives W&G) ---
async _onDrop(event) {
event.preventDefault();
let raw = {};
try { raw = JSON.parse(event.dataTransfer?.getData("text/plain") || "{}"); }
catch { ui.notifications.error("Drop failed: cannot parse drop payload."); return; }
if (raw?.type === "Item") return this._onDropItem(event, raw);
dbg("drop.ignored", raw);
}
async _onDropItem(event, data) {
const VB_MOD = "wg-voidships-builder";
dbg("drop.item.raw", foundry.utils.deepClone(data));
// 1) spróbuj fromUuid
let itemDoc = null;
if (data?.uuid) {
try { itemDoc = await fromUuid(data.uuid); } catch (e) { dbg("fromUuid.error", e); }
}
// 2) inline data
let itemData = itemDoc?.toObject?.() ?? data?.data ?? null;
// 3) ostatecznie spróbuj Foundry helpera
if (!itemData) {
try {
const i = await Item.implementation.fromDropData(data);
itemData = i?.toObject?.() ?? null;
} catch (e) {
ui.notifications.error("Drop failed: cannot resolve item data (no UUID/DATA).");
dbg("fromDropData.error", e, data); return;
}
}
if (!itemData) { ui.notifications.error("Drop failed: no item data."); return; }
// 4) Czy to komponent? akceptujemy po flagach lub po system.voidship
const fmod = itemData.flags?.[VB_MOD] || {};
const meta = fmod.component || {};
const vflag = fmod.voidship || null;
const vsys = itemData.system?.voidship || null;
const tags = Array.isArray(meta.tags) ? meta.tags : [];
const isComponent = !!(vflag || vsys || tags.length);
if (!isComponent) {
ui.notifications.warn("This item is not a voidship component.");
dbg("notComponent", { name: itemData.name, flags: itemData.flags });
return;
}
// 5) wyznacz slot + liczby (preferuj to co już jest w flagach; jeśli było tylko w system.voidship przenieś do flag)
const inferSlotFromTags = (tags=[]) => {
const low = (Array.isArray(tags)?tags:[]).map(t => String(t).toLowerCase());
const pref = ["prow","dorsal","port","starboard","keel","aetherics","internal"];
const hit = pref.find(p => low.includes(p));
return hit ? (hit[0].toUpperCase()+hit.slice(1)) : "Internal";
};
const vf = vflag || vsys || {};
const slot = vf.slot || meta.slot || inferSlotFromTags(meta.tags);
const vfixed = {
slot,
use: {
space: Number(vf?.use?.space ?? 0),
power: Number(vf?.use?.power ?? 0)
},
mods: {
armour: Number(vf?.mods?.armour ?? 0),
integrity: Number(vf?.mods?.integrity ?? 0),
manoeuvre: Number(vf?.mods?.manoeuvre ?? 0),
detection: Number(vf?.mods?.detection ?? 0),
speed: Number(vf?.mods?.speed ?? 0),
space: Number(vf?.mods?.space ?? 0),
power: Number(vf?.mods?.power ?? 0)
}
};
// 6) Nie dotykamy schema W&G zapisujemy w FLAGS
itemData.flags = foundry.utils.mergeObject(itemData.flags || {}, {
[VB_MOD]: foundry.utils.mergeObject(fmod, { voidship: vfixed }, { inplace: false })
}, { inplace: false });
// 7) dopnij equipped (żeby mody się naliczały od razu)
itemData.system = foundry.utils.mergeObject(itemData.system || {}, { equipped: true }, { inplace: false });
dbg("drop.finalized", { name: itemData.name, vfixed });
try {
const created = await this.actor.createEmbeddedDocuments("Item", [itemData]);
dbg("drop.created", created?.map(c => ({ id: c.id, name: c.name })));
this.render(true);
} catch (e) {
ui.notifications.error("Failed to add component to this voidship (see console).");
dbg("drop.create.error", e);
}
}
}
// Register the sheet
Hooks.once("init", () => {
Actors.registerSheet(VB_MOD, VoidshipSheet, {
types: ["vehicle"],
@@ -5,7 +5,6 @@
<div style="margin-left:auto; display:flex; gap:.5rem;">
<button type="button" data-action="configure-base"><i class="fas fa-cog"></i> Base</button>
<button type="button" data-action="toggle-raw"><i class="fas fa-bug"></i> Raw</button>
{{#if (eq actor.flags.wg-voidships-builder.isVoidship true)}}
<button type="button" data-action="unmark-voidship"><i class="fas fa-times-circle"></i> Unmark</button>
{{else}}
@@ -22,35 +21,37 @@
</nav>
<section class="sheet-body">
<!-- W&G TAB -->
<div class="tab" data-group="primary" data-tab="wg">
<div class="grid grid-2col" style="gap:.5rem;">
<div class="card">
<h3>Totals</h3>
<h3>Totals (Base + Mods)</h3>
<ol class="properties">
<li>Armour: <b>{{totals.armour}}</b></li>
<li>Integrity: <b>{{totals.integrity}}</b></li>
<li>Manoeuvre: <b>{{totals.manoeuvre}}</b></li>
<li>Detection: <b>{{totals.detection}}</b></li>
<li>Speed: <b>{{totals.speed}}</b></li>
<li>Space (free / total): <b>{{totals.spaceFree}}</b> / <b>{{totals.space}}</b></li>
<li>Power (free / total): <b>{{totals.powerFree}}</b> / <b>{{totals.power}}</b></li>
<li>Space (free/total): <b>{{totals.spaceFree}}</b> / <b>{{totals.space}}</b></li>
<li>Power (free/total): <b>{{totals.powerFree}}</b> / <b>{{totals.power}}</b></li>
</ol>
{{#if warnings.capacity}}<p class="warning" style="color:#b45309;">{{warnings.capacity}}</p>{{/if}}
</div>
<div class="card">
<h3>Hull</h3>
<ol class="properties">
<li>Class: <b>{{hull.class}}</b> ({{hull.size}})</li>
<li>Slots Allowed — Prow: <b>{{hull.slots.prow}}</b>, Dorsal: <b>{{hull.slots.dorsal}}</b>, Port: <b>{{hull.slots.port}}</b>, Starboard: <b>{{hull.slots.starboard}}</b>, Keel: <b>{{hull.slots.keel}}</b></li>
<li>Slots — Prow: <b>{{hull.slots.prow}}</b>, Dorsal: <b>{{hull.slots.dorsal}}</b>, Port: <b>{{hull.slots.port}}</b>, Starboard: <b>{{hull.slots.starboard}}</b>, Keel: <b>{{hull.slots.keel}}</b></li>
</ol>
{{#if warnings.slots}}<p class="warning" style="color:#b45309;">{{warnings.slots}}</p>{{/if}}
{{#if warnings.requirements}}<p class="warning" style="color:#b91c1c;">{{warnings.requirements}}</p>{{/if}}
</div>
</div>
{{#if warnings.capacity}}<p class="warning" style="color:#b45309;">{{warnings.capacity}}</p>{{/if}}
{{#if warnings.slots}}<p class="warning" style="color:#b45309;">{{warnings.slots}}</p>{{/if}}
{{#if warnings.mounts}}<p class="warning" style="color:#b91c1c;">{{warnings.mounts}}</p>{{/if}}
{{#if warnings.requirements}}<p class="warning" style="color:#b91c1c;">{{warnings.requirements}}</p>{{/if}}
<hr>
<div class="grid grid-2col" style="gap:.5rem;">
<div class="card">
<h3>Base (flags)</h3>
@@ -64,6 +65,7 @@
<li>Power: <b>{{base.power}}</b></li>
</ol>
</div>
<div class="card">
<h3>Mods (items)</h3>
<ol class="properties">
@@ -75,11 +77,16 @@
<li>Space: <b>{{mods.space}}</b></li>
<li>Power: <b>{{mods.power}}</b></li>
</ol>
<p class="notes" style="opacity:.7">* Mods dodawane są tylko z wyposażonych komponentów.</p>
</div>
</div>
<details style="margin-top:.5rem;"><summary>Raw JSON</summary>
<pre>{{json this}}</pre>
</details>
</div>
<!-- RT TAB -->
<!-- ROGUE TRADER TAB -->
<div class="tab" data-group="primary" data-tab="rt">
<div class="grid grid-2col" style="gap:.75rem;">
<div class="card">
@@ -108,6 +115,9 @@
{{#if rtCard.source}}<p class="notes" style="margin-top:.25rem; opacity:.65;">Source: {{rtCard.source}}</p>{{/if}}
</div>
</div>
<details style="margin-top:.5rem;"><summary>Raw RT</summary>
<pre>{{json actor.flags.wg-voidships-builder.rtRaw}}</pre>
</details>
</div>
<!-- CREW TAB -->
@@ -132,6 +142,9 @@
</ol>
</div>
</div>
<details style="margin-top:.5rem;"><summary>Raw Crew</summary>
<pre>{{json crew}}</pre>
</details>
</div>
<!-- COMPONENTS TAB -->
@@ -143,8 +156,9 @@
<li>Space (free / total): <b>{{totals.spaceFree}}</b> / <b>{{totals.space}}</b></li>
<li>Power (free / total): <b>{{totals.powerFree}}</b> / <b>{{totals.power}}</b></li>
</ol>
{{#if warnings.capacity}}<p class="warning" style="color:#b45309;">{{warnings.capacity}}</p>{{/if}}
<hr>
<h3>Weapon Slots Used</h3>
<h3>Slots Used</h3>
<ol class="properties">
<li>Prow: <b>{{slotsUsed.prow}}</b> / <b>{{hull.slots.prow}}</b></li>
<li>Dorsal: <b>{{slotsUsed.dorsal}}</b> / <b>{{hull.slots.dorsal}}</b></li>
@@ -152,9 +166,7 @@
<li>Starboard: <b>{{slotsUsed.starboard}}</b> / <b>{{hull.slots.starboard}}</b></li>
<li>Keel: <b>{{slotsUsed.keel}}</b> / <b>{{hull.slots.keel}}</b></li>
</ol>
{{#if warnings.capacity}}<p class="warning" style="color:#b45309;">{{warnings.capacity}}</p>{{/if}}
{{#if warnings.slots}}<p class="warning" style="color:#b45309;">{{warnings.slots}}</p>{{/if}}
{{#if warnings.mounts}}<p class="warning" style="color:#b91c1c;">{{warnings.mounts}}</p>{{/if}}
{{#if warnings.requirements}}<p class="warning" style="color:#b91c1c;">{{warnings.requirements}}</p>{{/if}}
</div>
@@ -168,46 +180,51 @@
<th>Slot</th>
<th>Use</th>
<th>Mods</th>
<th style="width:90px;">Actions</th>
</tr>
</thead>
<tbody>
{{#each components as |c|}}
<tr>
<tr data-item-id="{{c.itemId}}">
<td style="text-align:left;">
{{#if c.equipped}}<i class="fa-solid fa-plug" title="Equipped"></i>{{else}}<i class="fa-regular fa-square" title="Unequipped"></i>{{/if}}
{{c.name}}
</td>
<td style="text-align:center;">{{c.slot}}</td>
<td style="text-align:center;"><small>Space: {{c.use.space}}, Power: {{c.use.power}}</small></td>
<td><small>
{{#if c.mods.armour}}Armour {{signed c.mods.armour}} {{/if}}
{{#if c.mods.integrity}}Integrity {{signed c.mods.integrity}} {{/if}}
{{#if c.mods.manoeuvre}}Manoeuvre {{signed c.mods.manoeuvre}} {{/if}}
{{#if c.mods.detection}}Detection {{signed c.mods.detection}} {{/if}}
{{#if c.mods.speed}}Speed {{signed c.mods.speed}} {{/if}}
{{#if c.mods.space}}Space {{signed c.mods.space}} {{/if}}
{{#if c.mods.power}}Power {{signed c.mods.power}} {{/if}}
</small></td>
<td style="text-align:center;">
<small>Space: {{c.use.space}}, Power: {{c.use.power}}</small>
</td>
<td>
<small>
{{#if c.mods.armour}}Armour {{signed c.mods.armour}} {{/if}}
{{#if c.mods.integrity}}Integrity {{signed c.mods.integrity}} {{/if}}
{{#if c.mods.manoeuvre}}Manoeuvre {{signed c.mods.manoeuvre}} {{/if}}
{{#if c.mods.detection}}Detection {{signed c.mods.detection}} {{/if}}
{{#if c.mods.speed}}Speed {{signed c.mods.speed}} {{/if}}
{{#if c.mods.space}}Space {{signed c.mods.space}} {{/if}}
{{#if c.mods.power}}Power {{signed c.mods.power}} {{/if}}
</small>
</td>
<td style="text-align:center;">
<a class="control" data-action="comp-toggle" title="Toggle Equipped"><i class="fa-solid fa-power-off"></i></a>
<a class="control" data-action="comp-edit" title="Edit Component"><i class="fa-solid fa-pen-to-square"></i></a>
<a class="control" data-action="comp-remove" title="Remove"><i class="fa-solid fa-trash"></i></a>
</td>
</tr>
{{/each}}
</tbody>
</table>
{{else}}
<p style="opacity:.7">No components installed. Drop items with <code>system.voidship</code>.</p>
<p style="opacity:.7">No components installed. Drag items from the Components compendium here.</p>
{{/if}}
</div>
</div>
<!-- RAW DEBUG -->
<div class="vb-raw" style="display:none; margin-top:.5rem;">
<hr>
<details open>
<summary>Debug: Flags & Totals</summary>
<pre>{{tojson debug}}</pre>
<pre>{{tojson totals}}</pre>
<pre>{{tojson hull}}</pre>
</details>
</div>
<details style="margin-top:.5rem;"><summary>Raw Components & Use</summary>
<pre>{{json components}}</pre>
<pre>{{json use}}</pre>
</details>
</div>
</section>
</form>
Binary file not shown.