diff --git a/wg-voidships-builder/packs/wg-voidship-hulls.db b/wg-voidships-builder/packs/wg-voidship-hulls.db index 7264856..b726df3 100644 --- a/wg-voidships-builder/packs/wg-voidship-hulls.db +++ b/wg-voidships-builder/packs/wg-voidship-hulls.db @@ -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"} diff --git a/wg-voidships-builder/packs/wg-voidship-items.db b/wg-voidships-builder/packs/wg-voidship-items.db index 11c7e14..61b38d9 100644 --- a/wg-voidships-builder/packs/wg-voidship-items.db +++ b/wg-voidships-builder/packs/wg-voidship-items.db @@ -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":[]} diff --git a/wg-voidships-builder/scripts/voidship-actor.js b/wg-voidships-builder/scripts/voidship-actor.js index 054083f..2ab6bbd 100644 --- a/wg-voidships-builder/scripts/voidship-actor.js +++ b/wg-voidships-builder/scripts/voidship-actor.js @@ -1,23 +1,29 @@ // W&G Voidships Builder — Voidship Actor Sheet (vehicle+flag emulation) -// v1.1.0 (mapping weapons + core reqs + safer drops) — Foundry v11–v13 +// v1.1.0 — Foundry V11–V13 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 = ` -
- - - - - - - `; - 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 = ` + `; + 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"], diff --git a/wg-voidships-builder/templates/voidship-sheet.hbs b/wg-voidships-builder/templates/voidship-sheet.hbs index e4c9b11..d5e8453 100644 --- a/wg-voidships-builder/templates/voidship-sheet.hbs +++ b/wg-voidships-builder/templates/voidship-sheet.hbs @@ -5,7 +5,6 @@{{warnings.capacity}}
{{/if}}{{warnings.slots}}
{{/if}} + {{#if warnings.requirements}}{{warnings.requirements}}
{{/if}}{{warnings.capacity}}
{{/if}} - {{#if warnings.slots}}{{warnings.slots}}
{{/if}} - {{#if warnings.mounts}}{{warnings.mounts}}
{{/if}} - {{#if warnings.requirements}}{{warnings.requirements}}
{{/if}}* Mods dodawane są tylko z wyposażonych komponentów.
{{json this}}
+ Source: {{rtCard.source}}
{{/if}}{{json actor.flags.wg-voidships-builder.rtRaw}}
+ {{json crew}}
+ {{warnings.capacity}}
{{/if}}{{warnings.capacity}}
{{/if}} {{#if warnings.slots}}{{warnings.slots}}
{{/if}} - {{#if warnings.mounts}}{{warnings.mounts}}
{{/if}} {{#if warnings.requirements}}{{warnings.requirements}}
{{/if}} @@ -168,46 +180,51 @@No components installed. Drop items with system.voidship.
No components installed. Drag items from the Components compendium here.
{{/if}} - - +{{json components}}
+ {{json use}}
+