67 Commits

Author SHA1 Message Date
gitea ec8b34044b sync: nucleares_monitor v0.1 2025-10-11 21:18:35 +02:00
gitea c7048e6c32 sync: investigation-board_v13 v0.2 2025-10-09 20:58:50 +02:00
gitea 3a610b71e2 sync: wg-voidships-builder v1.4.13 2025-10-09 20:55:39 +02:00
gitea 9c06d9ceea sync: investigation-board_v13 v0.1 2025-10-09 20:55:36 +02:00
gitea a6cdd01ec8 sync: help_scripts v0.3 2025-10-09 20:55:33 +02:00
gitea 0a4148abaa sync: foundry v0.2 2025-10-09 20:55:30 +02:00
gitea 95a71cb6e2 sync: wg-voidships_doc v0.2 2025-09-19 23:48:50 +02:00
gitea 97f738c57d sync: wg-voidships-journal v1.0.2 2025-09-19 23:48:44 +02:00
gitea 5ed6c55e0d sync: wg-voidships-builder v1.4.12 2025-09-19 23:48:39 +02:00
gitea 7b621f8be1 sync: gk-greyknight v0.6.5.3 2025-09-19 23:48:31 +02:00
gitea 64c3b8cad2 sync: help_scripts v0.2 2025-09-19 23:48:28 +02:00
gitea 298239c3aa sync: foundry v0.1 2025-09-19 23:48:25 +02:00
gitea ee632ee088 sync: help_scripts v0.1 2025-09-19 21:38:42 +02:00
gitea bf6e1050d9 Cleanup part one 2025-09-19 18:51:25 +02:00
gitea c2a93cbd86 sync: wg-voidships-builder v1.4.11 2025-09-19 17:28:20 +02:00
gitea 862e0c3ca5 sync: wg-voidships-builder v1.4.10 2025-09-19 15:59:54 +02:00
gitea 20345f1605 sync: wg-voidships-builder v1.4.9 2025-09-19 15:59:30 +02:00
gitea c11e029b92 aaa 2025-09-19 15:31:22 +02:00
gitea 886bced193 updt 2025-09-19 12:59:10 +02:00
gitea 584985ede8 Working version 2025-09-18 23:56:05 +02:00
gitea a4c51710ec aaa 2025-09-18 21:14:20 +02:00
gitea 1abe31b3c8 111 2025-09-18 18:32:48 +02:00
gitea ddae4ad4b0 asd 2025-09-18 10:43:10 +02:00
gitea 5186b26408 test 2025-09-18 10:15:01 +02:00
gitea e84c0127bb 1 2025-09-18 09:47:02 +02:00
gitea 5892e6148d aaa 2025-09-18 09:12:46 +02:00
gitea e8ad547844 11 2025-09-18 00:18:33 +02:00
gitea 897916553c ss 2025-09-18 00:15:49 +02:00
gitea 9c3d73501a More context files 2025-09-18 00:14:43 +02:00
gitea d977cff4e4 Final final final 2025-09-18 00:09:29 +02:00
gitea 56ada5e1d9 Final 2025-09-18 00:06:59 +02:00
gitea 7c35c1bb9c cleanup 2025-09-18 00:03:27 +02:00
gitea b2c47b6841 Import gk-greyknight-0.6.4.8.zip do wg-greyknights (2025-08-25T13:36:01Z) 2025-08-25 13:36:01 +00:00
gitea fbbc5eecfa Import gk-greyknight-0.6.4.5.zip do wg-greyknights (2025-08-23T20:41:27Z) 2025-08-23 20:41:27 +00:00
gitea 1d346db6c0 Import gk-greyknight-0.6.4.4.zip do wg-greyknights (2025-08-23T20:15:27Z) 2025-08-23 20:15:27 +00:00
gitea 0e417ca6cb Import gk-greyknight-0.6.4.3.zip do wg-greyknights (2025-08-23T19:48:54Z) 2025-08-23 19:48:54 +00:00
gitea 47a0250f2a Import gk-greyknight-0.6.4.2.zip do wg-greyknights (2025-08-23T19:35:08Z) 2025-08-23 19:35:08 +00:00
gitea f4074855d6 Import gk-greyknight-0.6.4.1-patch.zip do wg-greyknights (2025-08-23T19:02:02Z) 2025-08-23 19:02:02 +00:00
gitea 4dbce12b5a Import gk-greyknight-0.6.4-patch.zip do wg-greyknights (2025-08-23T19:01:42Z) 2025-08-23 19:01:42 +00:00
gitea e29930d0b7 Import 0.6.1.stable.gk.zip do wg-greyknights (2025-08-22T17:44:46Z) 2025-08-22 17:44:46 +00:00
gitea 45b2d0d3b7 Import wng-daemonhunters-0.6.4.2.zip do wg-greyknights (2025-08-22T17:26:07Z) 2025-08-22 17:26:07 +00:00
gitea e164cb6ed4 Import wng-daemonhunters-0.6.4.1.zip do wg-greyknights (2025-08-22T17:07:40Z) 2025-08-22 17:07:40 +00:00
gitea fe70f8796d Import gk-greyknight-0.6.3.zip do wg-greyknights (2025-08-22T12:08:07Z) 2025-08-22 12:08:07 +00:00
gitea bf3fe1e7c8 Import gk-greyknight-0.6.1.zip do wg-greyknights (2025-08-22T11:40:25Z) 2025-08-22 11:40:25 +00:00
gitea 4408ca8971 Import gk-greyknight-0.6.0.zip do wg-greyknights (2025-08-22T11:09:50Z) 2025-08-22 11:09:50 +00:00
gitea 73b70ca47f Import gk-greyknight-0.5.3.zip do wg-greyknights (2025-08-22T10:31:14Z) 2025-08-22 10:31:14 +00:00
gitea 2e44ddf786 Import gk-greyknight-last_stable.zip do wg-greyknights (2025-08-22T10:21:33Z) 2025-08-22 10:21:33 +00:00
gitea 235f91f08c Import gk-greyknight-0.5.2-patch.zip do wg-greyknights (2025-08-22T10:04:48Z) 2025-08-22 10:04:48 +00:00
gitea d7bb255968 Import gk-greyknight-0.5.1-patch.zip do wg-greyknights (2025-08-22T09:46:13Z) 2025-08-22 09:46:13 +00:00
gitea 06ae94b837 Import gk-greyknight-0.5.0-patch.zip do wg-greyknights (2025-08-22T00:06:01Z) 2025-08-22 00:06:01 +00:00
gitea 8fe7cf519d Import gk-greyknight-0.4.9-patch.zip do wg-greyknights (2025-08-21T23:12:29Z) 2025-08-21 23:12:29 +00:00
gitea 2452cb605e Import gk-greyknight-0.4.8-patch.zip do wg-greyknights (2025-08-21T22:49:35Z) 2025-08-21 22:49:35 +00:00
gitea f7b7e00ccb Import gk-greyknight-0.4.7-patch.zip do wg-greyknights (2025-08-21T22:41:13Z) 2025-08-21 22:41:13 +00:00
gitea 2111d117e2 Import gk-greyknight-0.4.6-patch.zip do wg-greyknights (2025-08-21T22:23:55Z) 2025-08-21 22:23:55 +00:00
gitea 5fcdc8d2f3 Import gk-greyknight-0.4.5-patch.zip do wg-greyknights (2025-08-21T22:05:46Z) 2025-08-21 22:05:46 +00:00
gitea 305edfa775 Import gk-greyknight-0.4.4-patch.zip do wg-greyknights (2025-08-21T21:44:57Z) 2025-08-21 21:44:57 +00:00
gitea 0ab17ffe3d Import gk-greyknight-0.4.3-patch.zip do wg-greyknights (2025-08-21T21:34:22Z) 2025-08-21 21:34:22 +00:00
gitea cf7c469655 Import gk-greyknight-0.4.2-patch.zip do wg-greyknights (2025-08-21T21:19:36Z) 2025-08-21 21:19:36 +00:00
gitea da34a79555 Import gk-greyknight-0.4.1.zip do wg-greyknights (2025-08-21T20:56:51Z) 2025-08-21 20:56:51 +00:00
gitea b301758881 Import gk-greyknight-compendium-0.4.0.zip do wg-greyknights (2025-08-21T20:43:39Z) 2025-08-21 20:43:39 +00:00
gitea 10c7630663 Import wrath-and-glory-gk-0.3.0.zip do wg-greyknights (2025-08-21T20:13:12Z) 2025-08-21 20:13:12 +00:00
gitea cbbdb35faa Import wrath-and-glory-gk-0.2.1.zip do wg-greyknights (2025-08-21T20:13:04Z) 2025-08-21 20:13:04 +00:00
gitea b4ee703fdc Import wrath-and-glory-gk-0.2.0.zip do wg-greyknights (2025-08-21T20:12:55Z) 2025-08-21 20:12:55 +00:00
gitea 24ad39dc6f Import gk-greyknight-0.1.0.zip do wg-greyknights (2025-08-21T19:51:05Z) 2025-08-21 19:51:05 +00:00
gitea dc82906983 Import GK_Foundry_Macros_Fix_v5.zip do wg-greyknights (2025-08-21T19:30:33Z) 2025-08-21 19:30:33 +00:00
gitea edb3f0dffb Import GK_Foundry_GreyKnight_v5.zip do wg-greyknights (2025-08-21T19:02:44Z) 2025-08-21 19:02:44 +00:00
gitea c725793b46 Import Grey_Knight_WrathAndGlory_FoundryPack.zip do wg-greyknights (2025-08-21T17:10:55Z) 2025-08-21 17:10:55 +00:00
92 changed files with 16986 additions and 141 deletions
+17
View File
@@ -0,0 +1,17 @@
{
"name": "Aegis Power Armour",
"type": "armor",
"img": "icons/svg/shield.svg",
"system": {
"keywords": [
"GREY KNIGHTS",
"INQUISITION",
"DAEMONHUNTERS",
"ORDO MALLEUS"
],
"effects": [
"Aegis Warding (toggleable barrier; visual runes glow)",
"Psychic Hood Integration (+dice to Deny the Witch)"
]
}
}
+13
View File
@@ -0,0 +1,13 @@
{
"name": "Aegis Terminator Armour",
"type": "armor",
"img": "icons/svg/shield.svg",
"system": {
"keywords": [
"GREY KNIGHTS",
"INQUISITION",
"DAEMONHUNTERS",
"ORDO MALLEUS"
]
}
}
+19
View File
@@ -0,0 +1,19 @@
{
"name": "Grey Knight",
"type": "archetype",
"img": "icons/svg/book.svg",
"system": {
"keywords": [
"GREY KNIGHTS",
"INQUISITION",
"DAEMONHUNTERS",
"ORDO MALLEUS"
],
"wargear": [
"Nemesis Force Halberd",
"Aegis Power Armour",
"Grey Knight Armour Integrated Storm Bolter"
],
"notes": "Innate: +1 vs Corruption; +1 additional vs Corruption when equipped with Aegis armour. Adds Aegis of Titan ability."
}
}
+28
View File
@@ -0,0 +1,28 @@
hull_name,class_type,speed,manoeuvrability,detection,hull_integrity,armour,turret_rating,space,sp,weapon_capacity,special_rules_notes,length_km,beam_km,mass_megatonnes,crew,acceleration_g,summary_3_sentences
Jericho-class Pilgrim Vessel,Transport,UNKN,UNKN,UNKN,UNKN,UNKN,UNKN,UNKN,UNKN,UNKN,UNKN,1.8,0.45,UNKN,"≈19,300",3.5,"Pielgrzymkowiec zaprojektowany do długich, samowystarczalnych rejsów z wiernymi i ładunkiem sakralnym; tani w utrzymaniu, ale nie jest okrętem wojennym. Najczęściej służy rodowodom, sektom i zakonnikom do żeglugi „z wiarą przez pustkę”. Po modyfikacjach bywa trzonem taniej, szerokozakresowej logistyki dynastii Rogue Tradera."
Vagabond-class Merchant Trader,Transport,UNKN,UNKN,UNKN,UNKN,UNKN,UNKN,UNKN,UNKN,UNKN,UNKN,1.9,0.45,UNKN,"≈24,000",4.0,"Klasyczny „koń roboczy” kupców—dużo ładowni, oszczędne systemy i przyzwoity zasięg. Odporny na trudy dzikich szlaków, ale w walce raczej ucieka niż wygrywa wymianę ognia. Popularny wśród niezależnych domów i dynastii rozpoczynających ekspansję."
Viper-class Scout Sloop,Transport/Scout,11,+28,+15,22,15,1,20,25,Dorsal 1,UNKN,UNKN,UNKN,UNKN,UNKN,UNKN,"Ekstremalnie szybki i zwinny zwiadowca do rozpoznania i patroli. Minimalne uzbrojenie rekompensuje mobilnością i świetną elektroniką. Idealny do kurierki, sondowania przejść i „pierwszego kontaktu”."
Carrack-class Transport,Transport,4,+10,+10,40,17,1,45,35,"Prow 1, Dorsal 1",UNKN,UNKN,UNKN,UNKN,UNKN,UNKN,"Stary, pojemny wół roboczy—wozi wszystko, wszędzie, byle powoli. Często przerabiany na „filtry” dla kontrabandy i szarej logistyki. Lubiany przez dynastie wolące pewność i ładowność zamiast osiągów."
Goliath-class Factory Ship,Transport/Industrial,3,5,+5,55,17,1,65,40,"Dorsal 1, Prow 1",UNKN,UNKN,UNKN,UNKN,UNKN,UNKN,"Mobilna fabryka z potężnymi warsztatami i ciągami przetwórczymi. Sprawdza się w długich operacjach poza liniami zaopatrzenia. Powolny, ale strategicznie bezcenny dla kolonizacji i kampanii przemysłowych."
Universe-class Mass Conveyor,Transport/Mass Conveyor,2,10,+10,70,18,1,100,52,"Dorsal 1, Prow 1",UNKN,UNKN,UNKN,UNKN,UNKN,UNKN,Gigant do przerzutu olbrzymich mas ludzi i towarów—„miasteczko w pustce”. Prawie nie walczy; jego ochroną jest eskorta i dystans. Kręgosłup wielkich przedsięwzięć kolonizacyjnych i krucjat logistycznych.
Hazeroth-class Privateer,Raider,10,+23,+12,32,14,1,35,30,"Dorsal 1, Prow 1",UNKN,UNKN,UNKN,UNKN,UNKN,UNKN,"Szybki korsarz z Hazeroth Abyss—pozbywa się pancerza i ładowni na rzecz napędu. Ucieka, jeśli nie może wygrać. Ulubieniec prywaterskich kapitanów i klanów pirackich."
Havoc-class Merchant Raider,Raider,9,+25,+10,30,16,1,40,35,"Dorsal 1, Prow 1",UNKN,UNKN,UNKN,UNKN,UNKN,UNKN,"„Szklana armata”—mocny bitewnie, kruchy w obronie. Znakomity do szybkich uderzeń na frachtowce. W rękach zdolnego kapitana groźny nawet dla fregat."
Iconoclast-class Destroyer,Destroyer,10,+25,+10,30,15,1,35,30,"Dorsal 1, Prow 1",UNKN,UNKN,UNKN,UNKN,UNKN,UNKN,"Agresywny niszczyciel flot reaverów i renegatów. Potężny pęd, lekki pancerz—walczy z pozycji przewagi lub nie walczy wcale. Częsty trzon watah pirackich."
Meritech Shrike-class Raider,Raider,10,+22,+15,35,16,1,40,35,"Dorsal 1, Prow 1",UNKN,UNKN,UNKN,UNKN,UNKN,UNKN,Dziedzictwo wojen Merate—szybkie rojujące rajdery o „pirackiej” filozofii walki. Znakomite do wilczych stad i polowań na eskorty. Znane z bezwzględności i przebiegłych modernizacji.
Cobra-class Destroyer,Destroyer,10,+30,+10,30,15,1,35,30,"Dorsal 1, Prow 1",UNKN,UNKN,UNKN,UNKN,UNKN,UNKN,"Najmniejszy pełnoprawny okręt Marynarki—zabójczy nosiciel torped. W wilczych stadach rozrywa linię wroga i znika. Ulubiony „budżetowy” wybór dynastii, które przerabiają wyrzutnie na ładownie."
Sword-class Frigate,Frigate,8,+20,+15,35,18,2,40,40,Dorsal 2,UNKN,UNKN,UNKN,UNKN,UNKN,UNKN,"Niezawodny, wszechstronny eskortowiec; „miecz” we flocie i u Traderów. Sprawdzone systemy, celne lasy, solidne napędy. Często przerabiany na frachtowóz-raidera."
Tempest-class Strike Frigate,Frigate,8,+20,+15,35,19,2,40,40,Dorsal 2,UNKN,UNKN,UNKN,UNKN,UNKN,UNKN,"Uderzeniowa fregata zaprojektowana do silnych, krótkich starć. Minimalne przerwy ogniowe, maksymalizacja siły salwy. Doskonała jako „młot” w parze z „mieczem” Swordów."
Firestorm-class Frigate,Frigate,7,+20,+15,38,18,1,40,41,"Dorsal 1, Prow 1",UNKN,UNKN,UNKN,UNKN,UNKN,UNKN,„Miecz z lancą”—Sword z przebudową na potężną lancę dziobową. Świetna kontra na inne eskorty dzięki zasięgowi lancy. Rzadziej wybierana przez Traderów ze względu na mniejszą ładowność.
Turbulent-class Heavy Frigate,Heavy Frigate,7,+18,+15,40,20,1,42,42,Dorsal 2,Hot Drives: +2 Power to each drive component; Antiquated Comms: 5 to Command (setting-specific note).,UNKN,UNKN,UNKN,UNKN,UNKN,"Rzadki „ciężki” eskorta—gorące generatory kosztem anachronicznych systemów łączności. Słynie z agresywnej służby i „szczęścia” w bitwach. Dla Traderów: świetny, jeśli priorytetem jest bitewna odporność."
Dauntless-class Light Cruiser,Light Cruiser,7,+15,+20,60,19,1,60,55,"Prow 1, Port 1, Starboard 1",UNKN,UNKN,UNKN,UNKN,UNKN,UNKN,"Oczy i uszy flot—zasięg, zapasy, „duża lanca z przodu”. Łączy zwrotność fregaty z siłą lekkiego krążownika. Idealny „lider” skrzydeł eskorckich."
Endeavour-class Light Cruiser,Light Cruiser,6,+12,+15,60,20,2,58,57,"Prow 2 (1 torpedo), Port 1, Starboard 1",UNKN,UNKN,UNKN,UNKN,UNKN,UNKN,Nowocześniejszy „bulterier” flot—torpedowy specjalista o zbalansowanym uzbrojeniu. Stanowi bazę dla wariantów Endurance/Defiant (lanca/carrier) w doktrynie BFG. W RT świetny dla Traderów nastawionych na bitwy liniowe.
Defiant-class Light Cruiser,Light Cruiser/Carrier,UNKN,UNKN,UNKN,UNKN,UNKN,UNKN,UNKN,UNKN,Launch Bays (light carrier configuration),UNKN,UNKN,UNKN,UNKN,UNKN,UNKN,"Lekki lotniskowiec—wyjątkowo cenny do zwiadu, projekcji siły i osłony konwojów. Wymaga ochrony, bo sam ma „krótsze zęby”. Daje Rogue Traderowi elastyczność operacyjną dzięki Furies/Starhawks."
Secutor-class Monitor-Cruiser,Monitor Cruiser,6,+15,+30,52,20,UNKN,56,UNKN,"Prow 1, Port 1, Starboard 1",Void Shields: 1 (explicit); Mechanicus pattern.,UNKN,UNKN,UNKN,UNKN,UNKN,"Mechanicusowy „czapnik”—długie czujniki, metodyczne polowanie, mniejsza prędkość. Pogardzany przez część Marynarki, ale lubiany przez Magosów za stabilność platformy. Idealny do patroli i „czystek” sektora."
Lathe-class Monitor-Cruiser,Monitor Cruiser,5,+12,+15,63,20,1,60,55,"Dorsal 1, Prow 1, Port 1, Starboard 1",UNKN,UNKN,UNKN,UNKN,UNKN,UNKN,"Ultra-samowystarczalny „flotowy traktor” Mechanicus—wolniejszy, za to pancerniejszy od typowych LCs. Znakomity w długich rejsach bez doków. Platforma do eksploracji „głębokiej pustki”."
Lunar-class Cruiser,Cruiser,5,+10,+10,70,20,2,75,60,"Prow 1, Port 2, Starboard 2",UNKN,UNKN,UNKN,UNKN,UNKN,UNKN,Kręgosłup flot; bardzo wszechstronny i łatwiejszy w budowie. Traderzy zwykle zdejmują torpedy pod dodatkowe ładownie. Świetny kompromis między siłą ognia a adaptacyjnością.
Tyrant-class Cruiser,Cruiser,5,+10,+10,70,20,2,77,61,"Prow 1, Port 2, Starboard 2",UNKN,UNKN,UNKN,UNKN,UNKN,UNKN,"Krążownik „superfired plasma”—nacisk na daleki ogień makrobaterii. Wersje retro-fit często sięgają po odzyskane dalekosiężne uzbrojenie. Lubiany przez Traderów, którzy chcą siać ogień z dystansu."
Carnage-class Cruiser,Cruiser (Traitor),5,+12,+12,65,19,2,72,58,"Prow 1, Port 2, Starboard 2",UNKN,UNKN,UNKN,UNKN,UNKN,UNKN,"Klasyk sił Archenemesis—„śnieżyca makroognia” po kosztach pancerza. Groźny, gdy trzyma dystans i przewagę liczebną. W rękach renegatów bywa jądrem ich „linii bojowej”."
Overlord-class Battlecruiser,Battlecruiser,5,+10,+10,70,20,2,78,64,"Prow 1, Port 2, Starboard 2, Dorsal 1",UNKN,UNKN,UNKN,UNKN,UNKN,UNKN,"Klasyczny ciężki „dowódca dywizjonu”—zbalansowana, dalekosiężna artyleria i torpedy. Bardzo „marynarski” w doktrynie i dobrze znosi ogień kontrbateryjny. Dla Traderów—prestiż i miażdżąca siła projekcji."
Mars-class Battlecruiser,Battlecruiser/Carrier,5,+10,+10,70,20,2,54,71,"Prow 1, Port 2, Starboard 2, Dorsal 1; Pre-fitted 2× Jovian Launch Bays",Often fitted with Nova Cannon; carrier-focused; pre-installed launch bays.,UNKN,UNKN,UNKN,UNKN,UNKN,"„Wszystkomający” pancernik liniowy—Nova Cannon + lotnictwo + lancy = kontrola teatru działań. Rzadki, trudny do modernizacji (hangary i gniazdo Novy są „na stałe”). W rękach bogatej dynastii to pływająca forteca i duma rodowa."
Falchion-class Frigate,Frigate,8,+17,+14,36,18,1,34,42,"Prow 1 (pre-equipped Voss-pattern Torpedo Tubes; half ammo; +1 Power), Dorsal 2",Torpedo Specialist: Prow slot occupied by Voss-pattern Torpedo Tubes (cannot be removed); half usual ammunition capacity; space already accounted; ship must provide 1 Power to this Component.,UNKN,UNKN,UNKN,UNKN,UNKN,"Nowa klasa torpedowej fregaty przeznaczona do dalekiego zwiadu w Halo Stars. Marynarka podchodzi do niej chłodno, ale Rogue Traderzy chętnie wykorzystują jej potencjał. Fabrycznie uzbrojona w wyrzutnię torped Voss o ograniczonej amunicji."
Claymore-class Corvette,Corvette,8,+18,+12,30,17,1,38,38,Dorsal 2,UNKN,1.4,0.3,5.9,"≈21,000",4.6,"Typowa korweta—wytrzymała, łatwa w naprawach i użytkowa, wolniejsza od rajderów, mocniej opancerzona. Budowane masowo w czasie wojen (m.in. podczas Krucjaty Angewina), często odstawiane do rezerwy lub sprzedawane Traderom. Ulubione jako tanie, powszechne eskorty dla konwojów i transportów."
1 hull_name class_type speed manoeuvrability detection hull_integrity armour turret_rating space sp weapon_capacity special_rules_notes length_km beam_km mass_megatonnes crew acceleration_g summary_3_sentences
2 Jericho-class Pilgrim Vessel Transport UNKN UNKN UNKN UNKN UNKN UNKN UNKN UNKN UNKN UNKN 1.8 0.45 UNKN ≈19,300 3.5 Pielgrzymkowiec zaprojektowany do długich, samowystarczalnych rejsów z wiernymi i ładunkiem sakralnym; tani w utrzymaniu, ale nie jest okrętem wojennym. Najczęściej służy rodowodom, sektom i zakonnikom do żeglugi „z wiarą przez pustkę”. Po modyfikacjach bywa trzonem taniej, szerokozakresowej logistyki dynastii Rogue Tradera.
3 Vagabond-class Merchant Trader Transport UNKN UNKN UNKN UNKN UNKN UNKN UNKN UNKN UNKN UNKN 1.9 0.45 UNKN ≈24,000 4.0 Klasyczny „koń roboczy” kupców—dużo ładowni, oszczędne systemy i przyzwoity zasięg. Odporny na trudy dzikich szlaków, ale w walce raczej ucieka niż wygrywa wymianę ognia. Popularny wśród niezależnych domów i dynastii rozpoczynających ekspansję.
4 Viper-class Scout Sloop Transport/Scout 11 +28 +15 22 15 1 20 25 Dorsal 1 UNKN UNKN UNKN UNKN UNKN UNKN Ekstremalnie szybki i zwinny zwiadowca do rozpoznania i patroli. Minimalne uzbrojenie rekompensuje mobilnością i świetną elektroniką. Idealny do kurierki, sondowania przejść i „pierwszego kontaktu”.
5 Carrack-class Transport Transport 4 +10 +10 40 17 1 45 35 Prow 1, Dorsal 1 UNKN UNKN UNKN UNKN UNKN UNKN Stary, pojemny wół roboczy—wozi wszystko, wszędzie, byle powoli. Często przerabiany na „filtry” dla kontrabandy i szarej logistyki. Lubiany przez dynastie wolące pewność i ładowność zamiast osiągów.
6 Goliath-class Factory Ship Transport/Industrial 3 −5 +5 55 17 1 65 40 Dorsal 1, Prow 1 UNKN UNKN UNKN UNKN UNKN UNKN Mobilna fabryka z potężnymi warsztatami i ciągami przetwórczymi. Sprawdza się w długich operacjach poza liniami zaopatrzenia. Powolny, ale strategicznie bezcenny dla kolonizacji i kampanii przemysłowych.
7 Universe-class Mass Conveyor Transport/Mass Conveyor 2 −10 +10 70 18 1 100 52 Dorsal 1, Prow 1 UNKN UNKN UNKN UNKN UNKN UNKN Gigant do przerzutu olbrzymich mas ludzi i towarów—„miasteczko w pustce”. Prawie nie walczy; jego ochroną jest eskorta i dystans. Kręgosłup wielkich przedsięwzięć kolonizacyjnych i krucjat logistycznych.
8 Hazeroth-class Privateer Raider 10 +23 +12 32 14 1 35 30 Dorsal 1, Prow 1 UNKN UNKN UNKN UNKN UNKN UNKN Szybki korsarz z Hazeroth Abyss—pozbywa się pancerza i ładowni na rzecz napędu. Ucieka, jeśli nie może wygrać. Ulubieniec prywaterskich kapitanów i klanów pirackich.
9 Havoc-class Merchant Raider Raider 9 +25 +10 30 16 1 40 35 Dorsal 1, Prow 1 UNKN UNKN UNKN UNKN UNKN UNKN „Szklana armata”—mocny bitewnie, kruchy w obronie. Znakomity do szybkich uderzeń na frachtowce. W rękach zdolnego kapitana groźny nawet dla fregat.
10 Iconoclast-class Destroyer Destroyer 10 +25 +10 30 15 1 35 30 Dorsal 1, Prow 1 UNKN UNKN UNKN UNKN UNKN UNKN Agresywny niszczyciel flot reaverów i renegatów. Potężny pęd, lekki pancerz—walczy z pozycji przewagi lub nie walczy wcale. Częsty trzon watah pirackich.
11 Meritech Shrike-class Raider Raider 10 +22 +15 35 16 1 40 35 Dorsal 1, Prow 1 UNKN UNKN UNKN UNKN UNKN UNKN Dziedzictwo wojen Merate—szybkie rojujące rajdery o „pirackiej” filozofii walki. Znakomite do wilczych stad i polowań na eskorty. Znane z bezwzględności i przebiegłych modernizacji.
12 Cobra-class Destroyer Destroyer 10 +30 +10 30 15 1 35 30 Dorsal 1, Prow 1 UNKN UNKN UNKN UNKN UNKN UNKN Najmniejszy pełnoprawny okręt Marynarki—zabójczy nosiciel torped. W wilczych stadach rozrywa linię wroga i znika. Ulubiony „budżetowy” wybór dynastii, które przerabiają wyrzutnie na ładownie.
13 Sword-class Frigate Frigate 8 +20 +15 35 18 2 40 40 Dorsal 2 UNKN UNKN UNKN UNKN UNKN UNKN Niezawodny, wszechstronny eskortowiec; „miecz” we flocie i u Traderów. Sprawdzone systemy, celne lasy, solidne napędy. Często przerabiany na frachtowóz-raidera.
14 Tempest-class Strike Frigate Frigate 8 +20 +15 35 19 2 40 40 Dorsal 2 UNKN UNKN UNKN UNKN UNKN UNKN Uderzeniowa fregata zaprojektowana do silnych, krótkich starć. Minimalne przerwy ogniowe, maksymalizacja siły salwy. Doskonała jako „młot” w parze z „mieczem” Swordów.
15 Firestorm-class Frigate Frigate 7 +20 +15 38 18 1 40 41 Dorsal 1, Prow 1 UNKN UNKN UNKN UNKN UNKN UNKN „Miecz z lancą”—Sword z przebudową na potężną lancę dziobową. Świetna kontra na inne eskorty dzięki zasięgowi lancy. Rzadziej wybierana przez Traderów ze względu na mniejszą ładowność.
16 Turbulent-class Heavy Frigate Heavy Frigate 7 +18 +15 40 20 1 42 42 Dorsal 2 Hot Drives: +2 Power to each drive component; Antiquated Comms: −5 to Command (setting-specific note). UNKN UNKN UNKN UNKN UNKN Rzadki „ciężki” eskorta—gorące generatory kosztem anachronicznych systemów łączności. Słynie z agresywnej służby i „szczęścia” w bitwach. Dla Traderów: świetny, jeśli priorytetem jest bitewna odporność.
17 Dauntless-class Light Cruiser Light Cruiser 7 +15 +20 60 19 1 60 55 Prow 1, Port 1, Starboard 1 UNKN UNKN UNKN UNKN UNKN UNKN Oczy i uszy flot—zasięg, zapasy, „duża lanca z przodu”. Łączy zwrotność fregaty z siłą lekkiego krążownika. Idealny „lider” skrzydeł eskorckich.
18 Endeavour-class Light Cruiser Light Cruiser 6 +12 +15 60 20 2 58 57 Prow 2 (1 torpedo), Port 1, Starboard 1 UNKN UNKN UNKN UNKN UNKN UNKN Nowocześniejszy „bulterier” flot—torpedowy specjalista o zbalansowanym uzbrojeniu. Stanowi bazę dla wariantów Endurance/Defiant (lanca/carrier) w doktrynie BFG. W RT świetny dla Traderów nastawionych na bitwy liniowe.
19 Defiant-class Light Cruiser Light Cruiser/Carrier UNKN UNKN UNKN UNKN UNKN UNKN UNKN UNKN Launch Bays (light carrier configuration) UNKN UNKN UNKN UNKN UNKN UNKN Lekki lotniskowiec—wyjątkowo cenny do zwiadu, projekcji siły i osłony konwojów. Wymaga ochrony, bo sam ma „krótsze zęby”. Daje Rogue Traderowi elastyczność operacyjną dzięki Furies/Starhawks.
20 Secutor-class Monitor-Cruiser Monitor Cruiser 6 +15 +30 52 20 UNKN 56 UNKN Prow 1, Port 1, Starboard 1 Void Shields: 1 (explicit); Mechanicus pattern. UNKN UNKN UNKN UNKN UNKN Mechanicusowy „czapnik”—długie czujniki, metodyczne polowanie, mniejsza prędkość. Pogardzany przez część Marynarki, ale lubiany przez Magosów za stabilność platformy. Idealny do patroli i „czystek” sektora.
21 Lathe-class Monitor-Cruiser Monitor Cruiser 5 +12 +15 63 20 1 60 55 Dorsal 1, Prow 1, Port 1, Starboard 1 UNKN UNKN UNKN UNKN UNKN UNKN Ultra-samowystarczalny „flotowy traktor” Mechanicus—wolniejszy, za to pancerniejszy od typowych LCs. Znakomity w długich rejsach bez doków. Platforma do eksploracji „głębokiej pustki”.
22 Lunar-class Cruiser Cruiser 5 +10 +10 70 20 2 75 60 Prow 1, Port 2, Starboard 2 UNKN UNKN UNKN UNKN UNKN UNKN Kręgosłup flot; bardzo wszechstronny i łatwiejszy w budowie. Traderzy zwykle zdejmują torpedy pod dodatkowe ładownie. Świetny kompromis między siłą ognia a adaptacyjnością.
23 Tyrant-class Cruiser Cruiser 5 +10 +10 70 20 2 77 61 Prow 1, Port 2, Starboard 2 UNKN UNKN UNKN UNKN UNKN UNKN Krążownik „superfired plasma”—nacisk na daleki ogień makrobaterii. Wersje retro-fit często sięgają po odzyskane dalekosiężne uzbrojenie. Lubiany przez Traderów, którzy chcą siać ogień z dystansu.
24 Carnage-class Cruiser Cruiser (Traitor) 5 +12 +12 65 19 2 72 58 Prow 1, Port 2, Starboard 2 UNKN UNKN UNKN UNKN UNKN UNKN Klasyk sił Archenemesis—„śnieżyca makroognia” po kosztach pancerza. Groźny, gdy trzyma dystans i przewagę liczebną. W rękach renegatów bywa jądrem ich „linii bojowej”.
25 Overlord-class Battlecruiser Battlecruiser 5 +10 +10 70 20 2 78 64 Prow 1, Port 2, Starboard 2, Dorsal 1 UNKN UNKN UNKN UNKN UNKN UNKN Klasyczny ciężki „dowódca dywizjonu”—zbalansowana, dalekosiężna artyleria i torpedy. Bardzo „marynarski” w doktrynie i dobrze znosi ogień kontrbateryjny. Dla Traderów—prestiż i miażdżąca siła projekcji.
26 Mars-class Battlecruiser Battlecruiser/Carrier 5 +10 +10 70 20 2 54 71 Prow 1, Port 2, Starboard 2, Dorsal 1; Pre-fitted 2× Jovian Launch Bays Often fitted with Nova Cannon; carrier-focused; pre-installed launch bays. UNKN UNKN UNKN UNKN UNKN „Wszystkomający” pancernik liniowy—Nova Cannon + lotnictwo + lancy = kontrola teatru działań. Rzadki, trudny do modernizacji (hangary i gniazdo Novy są „na stałe”). W rękach bogatej dynastii to pływająca forteca i duma rodowa.
27 Falchion-class Frigate Frigate 8 +17 +14 36 18 1 34 42 Prow 1 (pre-equipped Voss-pattern Torpedo Tubes; half ammo; +1 Power), Dorsal 2 Torpedo Specialist: Prow slot occupied by Voss-pattern Torpedo Tubes (cannot be removed); half usual ammunition capacity; space already accounted; ship must provide 1 Power to this Component. UNKN UNKN UNKN UNKN UNKN Nowa klasa torpedowej fregaty przeznaczona do dalekiego zwiadu w Halo Stars. Marynarka podchodzi do niej chłodno, ale Rogue Traderzy chętnie wykorzystują jej potencjał. Fabrycznie uzbrojona w wyrzutnię torped Voss o ograniczonej amunicji.
28 Claymore-class Corvette Corvette 8 +18 +12 30 17 1 38 38 Dorsal 2 UNKN 1.4 0.3 5.9 ≈21,000 4.6 Typowa korweta—wytrzymała, łatwa w naprawach i użytkowa, wolniejsza od rajderów, mocniej opancerzona. Budowane masowo w czasie wojen (m.in. podczas Krucjaty Angewina), często odstawiane do rezerwy lub sprzedawane Traderom. Ulubione jako tanie, powszechne eskorty dla konwojów i transportów.
+9
View File
@@ -0,0 +1,9 @@
Type,SP Tier,Availability
Supplemental,1,Scarce
Essential,Base,Scarce
Supplemental,2,Rare
Essential,Base+1 SP,Rare
Supplemental,3,Very Rare
Essential,Base+2 SP,Very Rare
Archeotech,Any,Extremely Rare
Xenotech,Any,Near Unique
1 Type SP Tier Availability
2 Supplemental 1 Scarce
3 Essential Base Scarce
4 Supplemental 2 Rare
5 Essential Base+1 SP Rare
6 Supplemental 3 Very Rare
7 Essential Base+2 SP Very Rare
8 Archeotech Any Extremely Rare
9 Xenotech Any Near Unique
@@ -0,0 +1,170 @@
Category,Component,Appropriate Hull Types,Power,Space,SP,Notes / Effects,Source
Supplemental,Augmented Retro-Thrusters,All,2,0,0,Improves turning/decels (core rules).,FFG Drydock: Table 1-4 Supplemental Components
Supplemental,Armoured Prow,All,0,0,1,Reinforced prow; ramming/front armour interactions.,FFG Drydock: Table 1-4 Supplemental Components
Supplemental,Armour Plating,All,1,1,2,Additional armour plating.,FFG Drydock: Table 1-4 Supplemental Components
Supplemental,Auto-Temple,All,1,1,0,Automated shrine; morale/Creed bonuses.,FFG Drydock: Table 1-4 Supplemental Components
Supplemental,Barracks,All,2,4,2,Troop capacity; boarding bonuses.,FFG Drydock: Table 1-4 Supplemental Components
Supplemental,Brig,All,1,1,1,Cells for prisoners; NPC/social modifiers.,FFG Drydock: Table 1-4 Supplemental Components
Supplemental,Cargo Hold and Lighter Bay,All,1,2,1,Cargo space + small craft (lighters).,FFG Drydock: Table 1-4 Supplemental Components
Supplemental,Casemate Main Weapon Mounts,All,2,2,1,Weapon mount modification (main).,FFG Drydock: Table 1-4 Supplemental Components
Supplemental,Casemate Weapon Mounts,All,1,1,0,Weapon mount modification (secondary).,FFG Drydock: Table 1-4 Supplemental Components
Supplemental,Chimera Pattern Defensive Armour,All,0,1,1,Defensive armour scheme.,FFG Drydock: Table 1-4 Supplemental Components
Supplemental,Compartmentalized Cargo Hold,All,2,4,1,Segmented holds; safer cargo.,FFG Drydock: Table 1-4 Supplemental Components
Supplemental,Combat Jet Batteries (Lance),All,12,6,2,Lance-type casemate batteries.,FFG Drydock: Table 1-4 Supplemental Components
Supplemental,Combat Macrocannon Broadsides,All,8,6,2,Macrobattery broadside (combat).,FFG Drydock: Table 1-4 Supplemental Components
Supplemental,Combat Void Shield Array,All,0,1,2,Combat-optimised void shields.,FFG Drydock: Table 1-4 Supplemental Components
Supplemental,Command Bridge,All,1,1,2,Bridge variant with command bonuses.,FFG Drydock: Table 1-4 Supplemental Components
Supplemental,Defense System,All,1,1,1,General defensive array.,FFG Drydock: Table 1-4 Supplemental Components
Supplemental,Deflector Array (Lance),All,8,4,1,Lance deflector battery.,FFG Drydock: Table 1-4 Supplemental Components
Supplemental,Deep Void Augur Array,All,4,0,0,Long-range augury.,FFG Drydock: Table 1-4 Supplemental Components
Supplemental,Ekthir Pattern Hole-Moulded Void Shield Array,All,0,2,0,Hull-moulded void shield.,FFG Drydock: Table 1-4 Supplemental Components
Supplemental,Extended Supply Vaults,All,0,1,1,Extended supplies; endurance.,FFG Drydock: Table 1-4 Supplemental Components
Supplemental,Fibre Optic Wire Weave,All,0,0,1,Reinforced wiring; harder to disable.,FFG Drydock: Table 1-4 Supplemental Components
Supplemental,Forward Landing Bay,All,2,1,0,Forward-position launch bay.,FFG Drydock: Table 1-4 Supplemental Components
Supplemental,Gothic Class Five Torpedo Tubes,All,2,3,2,Torpedo tubes (size V).,FFG Drydock: Table 1-4 Supplemental Components
Supplemental,Gothic Class Six Torpedo Tubes,All,2,4,3,Torpedo tubes (size VI).,FFG Drydock: Table 1-4 Supplemental Components
Supplemental,Gryphonne Pattern Viper Drive,All,2,2,3,Thruster/drive upgrade.,FFG Drydock: Table 1-4 Supplemental Components
Supplemental,Gyro-Stabilised Targeting Matrix,All,2,1,1,Targeting cogitators; gunnery bonus.,FFG Drydock: Table 1-4 Supplemental Components
Supplemental,Hecuter Auger Array,All,4,0,0,Advanced augurs.,FFG Drydock: Table 1-4 Supplemental Components
Supplemental,Heavy Stormport,All,1,4,1,Large docking port.,FFG Drydock: Table 1-4 Supplemental Components
Supplemental,Heavy Clan-Kin Quarters,All,2,3,1,Upgraded clan-kin quarters.,FFG Drydock: Table 1-4 Supplemental Components
Supplemental,Hymnocular Beam System,All,1,1,1,Psychoacoustic broadcast; intimidation.,FFG Drydock: Table 1-4 Supplemental Components
Supplemental,Landing Bay,All,1,1,0,Standard launch bay.,FFG Drydock: Table 1-4 Supplemental Components
Supplemental,Librarium Vault,All,1,1,1,Archives; inquiry bonuses.,FFG Drydock: Table 1-4 Supplemental Components
Supplemental,Luxury Passenger Quarters,All,1,1,2,Passenger comfort; profit/morale.,FFG Drydock: Table 1-4 Supplemental Components
Supplemental,Main Cargo Hold,All,0,4,1,Primary cargo storage.,FFG Drydock: Table 1-4 Supplemental Components
Supplemental,Main Hangar Bay,All,1,1,0,Central hangar/launch bay.,FFG Drydock: Table 1-4 Supplemental Components
Supplemental,Mausoleum,All,1,1,1,Honours the dead; morale effects.,FFG Drydock: Table 1-4 Supplemental Components
Supplemental,Mezoa Pattern Armoured Prow,All,0,0,2,Reinforced prow (Mezoa).,FFG Drydock: Table 1-4 Supplemental Components
Supplemental,Murder Servitors,All,1,2,1,Boarding servitors; Hit & Run bonus.,FFG Drydock: Table 1-4 Supplemental Components
Supplemental,Observation Dome,All,0,1,1,Observation blister; social bonuses.,FFG Drydock: Table 1-4 Supplemental Components
Supplemental,Plasma Broadsides,All,6,6,2,Plasma macrobattery broadside.,FFG Drydock: Table 1-4 Supplemental Components
Supplemental,Plasma Accelerated Torpedo Tubes,All,3,4,2,PAT torpedo tubes.,FFG Drydock: Table 1-4 Supplemental Components
Supplemental,Plasma Battery,All,2,1,2,Plasma macrobattery.,FFG Drydock: Table 1-4 Supplemental Components
Supplemental,Plasma Flare Shield,All,1,0,1,Plasma flare countermeasures.,FFG Drydock: Table 1-4 Supplemental Components
Supplemental,Repair Deck,All,3,3,1,Onboard repair facility.,FFG Drydock: Table 1-4 Supplemental Components
Supplemental,Salvage Systems,All,1,3,1,Recovery & salvage gear.,FFG Drydock: Table 1-4 Supplemental Components
Supplemental,Strategic Countermeasure Array,All,1,1,1,EW countermeasures.,FFG Drydock: Table 1-4 Supplemental Components
Supplemental,Temple-Shrine to the God-Emperor,All,1,1,1,Shrine; morale/Creed bonuses.,FFG Drydock: Table 1-4 Supplemental Components
Supplemental,Tenebro-Maze,All,0,1,0,Labyrinthine passages; boarding defense.,FFG Drydock: Table 1-4 Supplemental Components
Supplemental,Teleportation Array,All,1,1,1,Hit & Run vs targets with shields down (see ItS).,FFG Drydock: Table 1-4 Supplemental Components
Supplemental,Vaulted Ceilings,All,0,0,1,Grand interiors; social bonuses.,FFG Drydock: Table 1-4 Supplemental Components
Supplemental,Warrior Chamber/Training Hall,All,2,2,1,Training facility; boarding bonuses.,FFG Drydock: Table 1-4 Supplemental Components
Supplemental,X-470 Ultimo Array,All,1,0,1,Advanced augurs.,FFG Drydock: Table 1-4 Supplemental Components
Xenos,Holofield,Eldar Ships,UNKN,UNKN,UNKN,Attacks vs ship: 40 to hit (20 macrobatteries); 30 to detect; no Void Shields; always active unless destroyed.,Battlefleet Koronus (Eldar sections)
Xenos,Solar Sails (Small/Standard),Eldar Ships,UNKN,UNKN,UNKN,Speed modifier by solar orientation; 90° turns regardless of hull size; may interrupt Manoeuvre for Shooting.,Battlefleet Koronus (Eldar sections)
Xenos,Solar Sails (Large/Extra-Large),Eldar Ships,UNKN,UNKN,UNKN,As above; fitted to LC+ Eldar hulls; sometimes provide surplus power.,Battlefleet Koronus (Eldar sections)
Xenos,Warp-Plotter,Eldar Ships,UNKN,UNKN,UNKN,Eldar navigation augmentation; essential on Eldar hulls.,Battlefleet Koronus (Eldar sections)
Xenos,Eldar Life Sustainer,Eldar Ships,UNKN,UNKN,UNKN,Eldar-specific life sustainer (essential).,Battlefleet Koronus (Eldar sections)
Xenos,Eldar Crew Quarters,Eldar Ships,UNKN,UNKN,UNKN,Eldar-specific crew quarters (essential).,Battlefleet Koronus (Eldar sections)
Xenos,Eldar Sensor Array,Eldar Ships,UNKN,UNKN,UNKN,Eldar augur array (essential).,Battlefleet Koronus (Eldar sections)
Xenos,Defensive Holofield (Torpedoes),Eldar Ships,UNKN,UNKN,UNKN,Eldar torpedoes negate Turret bonuses; Seeking rules.,Battlefleet Koronus (Eldar sections)
Archeotech,Castellan Shield,All (unless noted),UNKN,UNKN,UNKN,"Counts as Void Shield; once per enemy Strategic Turn, Enginseer Test to double shields temporarily.",Into the Storm (Archeotech Components)
Archeotech,Castellan Shield Array,All (unless noted),UNKN,2,UNKN,Counts as two Void Shields; same fail-safes; increased Space.,Into the Storm (Archeotech Components)
Archeotech,Cogitator Interlink,All (unless noted),UNKN,UNKN,UNKN,Crew Rating +5 due to augmented cogitators.,Into the Storm (Archeotech Components)
Archeotech,Energistic Conversion Matrix,All (unless noted),UNKN,UNKN,UNKN,Divert Power to Speed as Free Action (limit +5 Speed); can depower Components.,Into the Storm (Archeotech Components)
Archeotech,Empyrean Mantle,All (unless noted),UNKN,0,UNKN,External; Silent Running detection is two steps harder; +50 EP to Criminal objectives.,Into the Storm (Archeotech Components)
Archeotech,Teleportarium (Teleportation Array),All (unless noted),1,1,1,Enables Hit & Run vs targets with Void Shields down; per ItS usage rules.,Into the Storm (Archeotech Components)
Category,Component,Appropriate Hull Types,Power,Space,SP,Notes / Effects,Source
Cargo Holds and Passenger Compartments,Cargo Hold and Lighter Bay,Raider/Frigate/Light Cruiser/Cruiser,1,2,1,Standard cargo + lighter bay,Table 8-5
Cargo Holds and Passenger Compartments,Compartmentalized Cargo Hold,Raider/Frigate/Light Cruiser/Cruiser,2,5,1,Segmented holds; safer cargo,Table 8-5
Cargo Holds and Passenger Compartments,Main Cargo Hold,Transports,2,4,1,Primary cargo storage,Table 8-5
Cargo Holds and Passenger Compartments,Luxury Passenger Quarters,All Ships,2,1,1,Passenger comfort/morale,Table 8-5
Cargo Holds and Passenger Compartments,Barracks,All Ships,2,4,2,Troop capacity; boarding bonus,Table 8-5
Augments and Enhancements,Augmented Retro-thrusters,Raider/Frigate,3,0,2,Improved decel/turn,Table 8-5
Augments and Enhancements,Augmented Retro-thrusters,Transports/Light Cruisers,4,0,2,Improved decel/turn,Table 8-5
Augments and Enhancements,Augmented Retro-thrusters,Cruisers,5,0,2,Improved decel/turn,Table 8-5
Augments and Enhancements,Reinforced Interior Bulkheads,Transports/Raiders/Frigates,0,2,2,Structural survivability,Table 8-5
Augments and Enhancements,Reinforced Interior Bulkheads,Light Cruisers/Cruisers,0,3,2,Structural survivability,Table 8-5
Augments and Enhancements,Armour Plating†,Transports/Raiders/Frigates,0,1,2,"† Once per vessel",Table 8-5
Augments and Enhancements,Armour Plating†,Light Cruisers/Cruisers,0,2,2,"† Once per vessel",Table 8-5
Augments and Enhancements,Armoured Prow†,Cruisers,0,4,2,"† Once per vessel",Table 8-5
Augments and Enhancements,Tenebro-Maze†,Transports/Raiders/Frigates,1,2,2,"† Once per vessel",Table 8-5
Augments and Enhancements,Tenebro-Maze†,Light Cruisers/Cruisers,2,3,2,"† Once per vessel",Table 8-5
Additional Facilities,Extended Supply Vaults,All Ships,1,4,2,Extended endurance,Table 8-5
Additional Facilities,Crew Reclamation Facility,All Ships,1,1,1,Reclaims crew losses,Table 8-5
Additional Facilities,Munitorium,Transports/Raiders/Frigates,2,3,2,Ordnance logistics,Table 8-5
Additional Facilities,Munitorium,Light Cruisers/Cruisers,3,4,2,Ordnance logistics,Table 8-5
Additional Facilities,Temple-shrine to the God Emperor,All Ships,1,1,1,Morale/Creed benefits,Table 8-5
Additional Facilities,Librarium Vault,All Ships,1,1,1,Archives/intel,Table 8-5
Additional Facilities,Trophy Room,All Ships,1,1,1,Social/renown,Table 8-5
Additional Facilities,Observation Dome,All Ships,0,1,1,Observation/social,Table 8-5
Additional Facilities,Murder-Servitors,All Ships,1,1,2,Boarding bonus,Table 8-5
Cargo and Passenger Compartments,Brig,All Ships,1,1,1,Prison cells,Table 1-10
Cargo and Passenger Compartments,Ships Stores,Light Cruisers/Cruisers,1,5,2,Spares & supplies,Table 1-10
Cargo and Passenger Compartments,Ships Stores,Transports/Grand Cruisers,1,10,2,Spares & supplies,Table 1-10
Augments and Enhancements,Defensive Countermeasures†,All Ships,1,1,2,"† Once per vessel",Table 1-10
Augments and Enhancements,Flak Turrets†,All Ships,1,1,1,"† Once per vessel",Table 1-10
Augments and Enhancements,Field Bracing,All Ships,"1-3",1,2,Variable power by scope,Table 1-10
Augments and Enhancements,Fire Suppression System†,Transports/Raiders/Frigates,1,1,2,"† Once per vessel",Table 1-10
Augments and Enhancements,Fire Suppression System†,Light Cruisers/Cruisers,2,2,2,"† Once per vessel",Table 1-10
Augments and Enhancements,Fire Suppression System†,Grand Cruisers,3,3,2,"† Once per vessel",Table 1-10
Augments and Enhancements,Lux Net,All Ships,"10 generated",2,2,Generates Power; special rules,Table 1-10
Augments and Enhancements,Minelayer Bay,Transports/Light Cruisers/Cruisers,1,4,1,Deploys mines,Table 1-10
Augments and Enhancements,Power Ram†,Light Cruisers/Cruisers,2,0,2,"† Once per vessel",Table 1-10
Additional Facilities,Cloudmining Facility†,Transports,3,4,1,"† Once per vessel",Table 1-10
Additional Facilities,Hydraphuran Jamming System†,All Ships,4,0,1,"† Once per vessel",Table 1-10
Additional Facilities,Manufactorum†,Light Cruisers/Cruisers,2,1,2,"† Once per vessel",Table 1-10
Additional Facilities,Medicae Deck†,All Ships,2,1,1,"† Once per vessel",Table 1-10
Additional Facilities,Melodium†,All Ships,1,1,1,"† Once per vessel",Table 1-10
Additional Facilities,Plasma Scoop†,Raiders/Frigates,2,3,3,"† Once per vessel",Table 1-10
Additional Facilities,Plasma Scoop†,Light Cruisers/Cruisers,3,4,3,"† Once per vessel",Table 1-10
Additional Facilities,Pilots Chamber†,All Ships,1,1,1,"† Once per vessel",Table 1-10
Additional Facilities,Salvage Systems†,Transport/Light Cruiser/Cruiser,5,3,3,"† Once per vessel",Table 1-10
Additional Facilities,Small Craft Repair Deck†,Light Cruisers/Cruisers,2,2,1,"† Once per vessel",Table 1-10
Additional Facilities,Spacedock Piers†,Transports (50+ Space)/Grand Cruisers,7,14,4,"† Once per vessel",Table 1-10
Cargo Holds and Passenger Compartments,Shadowblind Bays,All Ships,3,4,2,Stealth berths,Table 4-3
Cargo Holds and Passenger Compartments,Xenos Habitats,All Ships,2,1,1,Accommodations for xenos,Table 4-3
Augments and Enhancements,Auxiliary Plasma Banks,Transports/Raiders/Frigates,"8 generated",5,1,Generates Power; special rules,Table 4-3
Augments and Enhancements,Auxiliary Plasma Banks,Light Cruisers/Cruisers,"10 generated",6,1,Generates Power; special rules,Table 4-3
Augments and Enhancements,Drop Pod Launch Bays,All Ships,1,3,2,Assault insertion bays,Table 4-3
Augments and Enhancements,Empyrean Mantle,Transports/Raiders/Frigates,3,0,2,External; stealth vs detection,Table 4-3
Augments and Enhancements,Empyrean Mantle,Light Cruisers/Cruisers,5,0,2,External; stealth vs detection,Table 4-3
Augments and Enhancements,Reinforced Prow,Transports/Raiders/Frigates,0,2,1,Strengthened prow,Table 4-3
Augments and Enhancements,Reinforced Prow,Light Cruisers/Cruisers,0,3,1,Strengthened prow,Table 4-3
Additional Facilities,Arboretum,Transports/Raiders/Frigates,2,2,1,Life-supporting gardens,Table 4-3
Additional Facilities,Arboretum,Light Cruisers/Cruisers,2,3,1,Life-supporting gardens,Table 4-3
Additional Facilities,Asteroid Mining Facility,All Ships,6,10,3,Onboard mining/refinery,Table 4-3
Additional Facilities,Astropathic Choir-chambers,All Ships,1,1,1,Astropathic communications,Table 4-3
Additional Facilities,Broadband Hymn-casters,All Ships,3,0,1,Long-range vox-hymn projectors,Table 4-3
Category,Component,Appropriate Hull Types,Power,Space,SP,Notes / Effects,Source
Archeotech,Castellan Shield,All Ships,5,1,2,Archeotech void-shield variant.,Table 4-4
Archeotech,Castellan Shield Array,Cruisers,7,2,2,Counts as multiple shields; archeotech array.,Table 4-4
Archeotech,Cogitator Interlink†,All Ships,1,1,2,"† Once per vessel; advanced cogitator network.",Table 4-4
Archeotech,Energistic Conversion Matrix†,All Ships,1,1,1,"† Once per vessel; convert Power to Speed per rules.",Table 4-4
Archeotech,Gyro-stabilisation Matrix†,All Ships,1,1,1,"† Once per vessel; enhanced targeting stabilisation.",Table 4-4
Archeotech,Staravar Laser Macrobattery,All Ships,4,4,2,Archeotech laser macrobattery (see weapon statline in Table 4-5),Table 4-4
Archeotech,Star-flare Lance,Light Cruisers/Cruisers,12,6,3,Archeotech lance (see weapon statline in Table 4-5),Table 4-4
Archeotech,Cypra-pattern Class 1 Drive,Transports,"30 Generated",10,2,Archeotech plasma drive.,Table 1-11
Archeotech,Cypra-pattern Class 2 Drive,Raiders/Frigates,"40 Generated",12,2,Archeotech plasma drive.,Table 1-11
Archeotech,Jovian-pattern Nova Cannon,Cruisers,6,7,5,Component entry for Nova Cannon mount (see weapon on Table 1-12),Table 1-11
Archeotech,Plasma Accelerated Torpedo Tubes,All Ships,2,6,2,Archeotech torpedo tubes (see weapon on Table 1-12),Table 1-11
Archeotech,Warp Antenna,All Ships,1,1,2,Archeotech warp comms augment.,Table 1-11
Archeotech,Warp Sextant,All Ships,4,1,2,Archeotech warp navigation aid.,Table 1-11
Archeotech,Ancient Life Sustainer,Transports/Raiders/Frigates,2,1,2,Archeotech life support.,Table 8-6
Archeotech,Ancient Life Sustainer,Light Cruisers/Cruisers,2,2,2,Archeotech life support.,Table 8-6
Archeotech,Modifified Jovian Pattern Class 1 Drive,Transports,"35 Generated",4,3,Archeotech/modified drive.,Table 8-6
Archeotech,Modifified Lathe Pattern Class 1 Drive,Transports,"40 Generated",8,3,Archeotech/modified drive.,Table 8-6
Archeotech,Modifified Jovian Pattern Class 2 Drive,Raiders/Frigates,"45 Generated",6,3,Archeotech/modified drive.,Table 8-6
Archeotech,Modifified Jovian Pattern Class 3 Drive,Light Cruisers,"60 Generated",8,3,Archeotech/modified drive.,Table 8-6
Archeotech,Modifified Jovian Pattern Class 4 Drive,Cruisers,"75 Generated",10,3,Archeotech/modified drive.,Table 8-6
Archeotech,Bridge of Antiquity,Transports/Raiders/Frigates,1,1,2,Archeotech bridge.,Table 8-6
Archeotech,Bridge of Antiquity,Light Cruisers/Cruisers,2,1,2,Archeotech bridge.,Table 8-6
Archeotech,Auto-stabilised Logis-targeter,All ships,5,0,2,Archeotech targeting augmentation.,Table 8-6
Archeotech,Teleportarium,All ships,1,1,1,Archeotech teleport array (component entry),Table 8-6
Xenotech,Ghost Field,All ships,8,4,3,Xenos equivalent of advanced stealth shielding.,Table 8-7
Xenotech,Shard Cannon Battery,All ships,0,3,2,Xenos macrobattery analogue.,Table 8-7
Xenotech,Runecaster,All ships,0,1,2,Xenos augury/warding device.,Table 8-7
Xenotech,Micro Laser Defence Grid,All ships,2,0,2,Xenos PD grid.,Table 8-7
Xenotech,Gravity Sails,Transports/Raiders/Frigates,3,0,3,Ancient gravity sail rig.,Table 8-7
Xenotech,Gravity Sails,Light cruisers/Cruisers,5,0,3,Ancient gravity sail rig.,Table 8-7
1 Category Component Appropriate Hull Types Power Space SP Notes / Effects Source
2 Supplemental Augmented Retro-Thrusters All 2 0 0 Improves turning/decels (core rules). FFG Drydock: Table 1-4 Supplemental Components
3 Supplemental Armoured Prow All 0 0 1 Reinforced prow; ramming/front armour interactions. FFG Drydock: Table 1-4 Supplemental Components
4 Supplemental Armour Plating All 1 1 2 Additional armour plating. FFG Drydock: Table 1-4 Supplemental Components
5 Supplemental Auto-Temple All 1 1 0 Automated shrine; morale/Creed bonuses. FFG Drydock: Table 1-4 Supplemental Components
6 Supplemental Barracks All 2 4 2 Troop capacity; boarding bonuses. FFG Drydock: Table 1-4 Supplemental Components
7 Supplemental Brig All 1 1 1 Cells for prisoners; NPC/social modifiers. FFG Drydock: Table 1-4 Supplemental Components
8 Supplemental Cargo Hold and Lighter Bay All 1 2 1 Cargo space + small craft (lighters). FFG Drydock: Table 1-4 Supplemental Components
9 Supplemental Casemate Main Weapon Mounts All 2 2 1 Weapon mount modification (main). FFG Drydock: Table 1-4 Supplemental Components
10 Supplemental Casemate Weapon Mounts All 1 1 0 Weapon mount modification (secondary). FFG Drydock: Table 1-4 Supplemental Components
11 Supplemental Chimera Pattern Defensive Armour All 0 1 1 Defensive armour scheme. FFG Drydock: Table 1-4 Supplemental Components
12 Supplemental Compartmentalized Cargo Hold All 2 4 1 Segmented holds; safer cargo. FFG Drydock: Table 1-4 Supplemental Components
13 Supplemental Combat Jet Batteries (Lance) All 12 6 2 Lance-type casemate batteries. FFG Drydock: Table 1-4 Supplemental Components
14 Supplemental Combat Macrocannon Broadsides All 8 6 2 Macrobattery broadside (combat). FFG Drydock: Table 1-4 Supplemental Components
15 Supplemental Combat Void Shield Array All 0 1 2 Combat-optimised void shields. FFG Drydock: Table 1-4 Supplemental Components
16 Supplemental Command Bridge All 1 1 2 Bridge variant with command bonuses. FFG Drydock: Table 1-4 Supplemental Components
17 Supplemental Defense System All 1 1 1 General defensive array. FFG Drydock: Table 1-4 Supplemental Components
18 Supplemental Deflector Array (Lance) All 8 4 1 Lance deflector battery. FFG Drydock: Table 1-4 Supplemental Components
19 Supplemental Deep Void Augur Array All 4 0 0 Long-range augury. FFG Drydock: Table 1-4 Supplemental Components
20 Supplemental Ekthir Pattern Hole-Moulded Void Shield Array All 0 2 0 Hull-moulded void shield. FFG Drydock: Table 1-4 Supplemental Components
21 Supplemental Extended Supply Vaults All 0 1 1 Extended supplies; endurance. FFG Drydock: Table 1-4 Supplemental Components
22 Supplemental Fibre Optic Wire Weave All 0 0 1 Reinforced wiring; harder to disable. FFG Drydock: Table 1-4 Supplemental Components
23 Supplemental Forward Landing Bay All 2 1 0 Forward-position launch bay. FFG Drydock: Table 1-4 Supplemental Components
24 Supplemental Gothic Class Five Torpedo Tubes All 2 3 2 Torpedo tubes (size V). FFG Drydock: Table 1-4 Supplemental Components
25 Supplemental Gothic Class Six Torpedo Tubes All 2 4 3 Torpedo tubes (size VI). FFG Drydock: Table 1-4 Supplemental Components
26 Supplemental Gryphonne Pattern Viper Drive All 2 2 3 Thruster/drive upgrade. FFG Drydock: Table 1-4 Supplemental Components
27 Supplemental Gyro-Stabilised Targeting Matrix All 2 1 1 Targeting cogitators; gunnery bonus. FFG Drydock: Table 1-4 Supplemental Components
28 Supplemental Hecuter Auger Array All 4 0 0 Advanced augurs. FFG Drydock: Table 1-4 Supplemental Components
29 Supplemental Heavy Stormport All 1 4 1 Large docking port. FFG Drydock: Table 1-4 Supplemental Components
30 Supplemental Heavy Clan-Kin Quarters All 2 3 1 Upgraded clan-kin quarters. FFG Drydock: Table 1-4 Supplemental Components
31 Supplemental Hymnocular Beam System All 1 1 1 Psychoacoustic broadcast; intimidation. FFG Drydock: Table 1-4 Supplemental Components
32 Supplemental Landing Bay All 1 1 0 Standard launch bay. FFG Drydock: Table 1-4 Supplemental Components
33 Supplemental Librarium Vault All 1 1 1 Archives; inquiry bonuses. FFG Drydock: Table 1-4 Supplemental Components
34 Supplemental Luxury Passenger Quarters All 1 1 2 Passenger comfort; profit/morale. FFG Drydock: Table 1-4 Supplemental Components
35 Supplemental Main Cargo Hold All 0 4 1 Primary cargo storage. FFG Drydock: Table 1-4 Supplemental Components
36 Supplemental Main Hangar Bay All 1 1 0 Central hangar/launch bay. FFG Drydock: Table 1-4 Supplemental Components
37 Supplemental Mausoleum All 1 1 1 Honours the dead; morale effects. FFG Drydock: Table 1-4 Supplemental Components
38 Supplemental Mezoa Pattern Armoured Prow All 0 0 2 Reinforced prow (Mezoa). FFG Drydock: Table 1-4 Supplemental Components
39 Supplemental Murder Servitors All 1 2 1 Boarding servitors; Hit & Run bonus. FFG Drydock: Table 1-4 Supplemental Components
40 Supplemental Observation Dome All 0 1 1 Observation blister; social bonuses. FFG Drydock: Table 1-4 Supplemental Components
41 Supplemental Plasma Broadsides All 6 6 2 Plasma macrobattery broadside. FFG Drydock: Table 1-4 Supplemental Components
42 Supplemental Plasma Accelerated Torpedo Tubes All 3 4 2 PAT torpedo tubes. FFG Drydock: Table 1-4 Supplemental Components
43 Supplemental Plasma Battery All 2 1 2 Plasma macrobattery. FFG Drydock: Table 1-4 Supplemental Components
44 Supplemental Plasma Flare Shield All 1 0 1 Plasma flare countermeasures. FFG Drydock: Table 1-4 Supplemental Components
45 Supplemental Repair Deck All 3 3 1 Onboard repair facility. FFG Drydock: Table 1-4 Supplemental Components
46 Supplemental Salvage Systems All 1 3 1 Recovery & salvage gear. FFG Drydock: Table 1-4 Supplemental Components
47 Supplemental Strategic Countermeasure Array All 1 1 1 EW countermeasures. FFG Drydock: Table 1-4 Supplemental Components
48 Supplemental Temple-Shrine to the God-Emperor All 1 1 1 Shrine; morale/Creed bonuses. FFG Drydock: Table 1-4 Supplemental Components
49 Supplemental Tenebro-Maze All 0 1 0 Labyrinthine passages; boarding defense. FFG Drydock: Table 1-4 Supplemental Components
50 Supplemental Teleportation Array All 1 1 1 Hit & Run vs targets with shields down (see ItS). FFG Drydock: Table 1-4 Supplemental Components
51 Supplemental Vaulted Ceilings All 0 0 1 Grand interiors; social bonuses. FFG Drydock: Table 1-4 Supplemental Components
52 Supplemental Warrior Chamber/Training Hall All 2 2 1 Training facility; boarding bonuses. FFG Drydock: Table 1-4 Supplemental Components
53 Supplemental X-470 Ultimo Array All 1 0 1 Advanced augurs. FFG Drydock: Table 1-4 Supplemental Components
54 Xenos Holofield Eldar Ships UNKN UNKN UNKN Attacks vs ship: −40 to hit (−20 macrobatteries); −30 to detect; no Void Shields; always active unless destroyed. Battlefleet Koronus (Eldar sections)
55 Xenos Solar Sails (Small/Standard) Eldar Ships UNKN UNKN UNKN Speed modifier by solar orientation; 90° turns regardless of hull size; may interrupt Manoeuvre for Shooting. Battlefleet Koronus (Eldar sections)
56 Xenos Solar Sails (Large/Extra-Large) Eldar Ships UNKN UNKN UNKN As above; fitted to LC+ Eldar hulls; sometimes provide surplus power. Battlefleet Koronus (Eldar sections)
57 Xenos Warp-Plotter Eldar Ships UNKN UNKN UNKN Eldar navigation augmentation; essential on Eldar hulls. Battlefleet Koronus (Eldar sections)
58 Xenos Eldar Life Sustainer Eldar Ships UNKN UNKN UNKN Eldar-specific life sustainer (essential). Battlefleet Koronus (Eldar sections)
59 Xenos Eldar Crew Quarters Eldar Ships UNKN UNKN UNKN Eldar-specific crew quarters (essential). Battlefleet Koronus (Eldar sections)
60 Xenos Eldar Sensor Array Eldar Ships UNKN UNKN UNKN Eldar augur array (essential). Battlefleet Koronus (Eldar sections)
61 Xenos Defensive Holofield (Torpedoes) Eldar Ships UNKN UNKN UNKN Eldar torpedoes negate Turret bonuses; Seeking rules. Battlefleet Koronus (Eldar sections)
62 Archeotech Castellan Shield All (unless noted) UNKN UNKN UNKN Counts as Void Shield; once per enemy Strategic Turn, Enginseer Test to double shields temporarily. Into the Storm (Archeotech Components)
63 Archeotech Castellan Shield Array All (unless noted) UNKN 2 UNKN Counts as two Void Shields; same fail-safes; increased Space. Into the Storm (Archeotech Components)
64 Archeotech Cogitator Interlink All (unless noted) UNKN UNKN UNKN Crew Rating +5 due to augmented cogitators. Into the Storm (Archeotech Components)
65 Archeotech Energistic Conversion Matrix All (unless noted) UNKN UNKN UNKN Divert Power to Speed as Free Action (limit +5 Speed); can depower Components. Into the Storm (Archeotech Components)
66 Archeotech Empyrean Mantle All (unless noted) UNKN 0 UNKN External; Silent Running detection is two steps harder; +50 EP to Criminal objectives. Into the Storm (Archeotech Components)
67 Archeotech Teleportarium (Teleportation Array) All (unless noted) 1 1 1 Enables Hit & Run vs targets with Void Shields down; per ItS usage rules. Into the Storm (Archeotech Components)
68 Category Component Appropriate Hull Types Power Space SP Notes / Effects Source
69 Cargo Holds and Passenger Compartments Cargo Hold and Lighter Bay Raider/Frigate/Light Cruiser/Cruiser 1 2 1 Standard cargo + lighter bay Table 8-5
70 Cargo Holds and Passenger Compartments Compartmentalized Cargo Hold Raider/Frigate/Light Cruiser/Cruiser 2 5 1 Segmented holds; safer cargo Table 8-5
71 Cargo Holds and Passenger Compartments Main Cargo Hold Transports 2 4 1 Primary cargo storage Table 8-5
72 Cargo Holds and Passenger Compartments Luxury Passenger Quarters All Ships 2 1 1 Passenger comfort/morale Table 8-5
73 Cargo Holds and Passenger Compartments Barracks All Ships 2 4 2 Troop capacity; boarding bonus Table 8-5
74 Augments and Enhancements Augmented Retro-thrusters Raider/Frigate 3 0 2 Improved decel/turn Table 8-5
75 Augments and Enhancements Augmented Retro-thrusters Transports/Light Cruisers 4 0 2 Improved decel/turn Table 8-5
76 Augments and Enhancements Augmented Retro-thrusters Cruisers 5 0 2 Improved decel/turn Table 8-5
77 Augments and Enhancements Reinforced Interior Bulkheads Transports/Raiders/Frigates 0 2 2 Structural survivability Table 8-5
78 Augments and Enhancements Reinforced Interior Bulkheads Light Cruisers/Cruisers 0 3 2 Structural survivability Table 8-5
79 Augments and Enhancements Armour Plating† Transports/Raiders/Frigates 0 1 2 † Once per vessel Table 8-5
80 Augments and Enhancements Armour Plating† Light Cruisers/Cruisers 0 2 2 † Once per vessel Table 8-5
81 Augments and Enhancements Armoured Prow† Cruisers 0 4 2 † Once per vessel Table 8-5
82 Augments and Enhancements Tenebro-Maze† Transports/Raiders/Frigates 1 2 2 † Once per vessel Table 8-5
83 Augments and Enhancements Tenebro-Maze† Light Cruisers/Cruisers 2 3 2 † Once per vessel Table 8-5
84 Additional Facilities Extended Supply Vaults All Ships 1 4 2 Extended endurance Table 8-5
85 Additional Facilities Crew Reclamation Facility All Ships 1 1 1 Reclaims crew losses Table 8-5
86 Additional Facilities Munitorium Transports/Raiders/Frigates 2 3 2 Ordnance logistics Table 8-5
87 Additional Facilities Munitorium Light Cruisers/Cruisers 3 4 2 Ordnance logistics Table 8-5
88 Additional Facilities Temple-shrine to the God Emperor All Ships 1 1 1 Morale/Creed benefits Table 8-5
89 Additional Facilities Librarium Vault All Ships 1 1 1 Archives/intel Table 8-5
90 Additional Facilities Trophy Room All Ships 1 1 1 Social/renown Table 8-5
91 Additional Facilities Observation Dome All Ships 0 1 1 Observation/social Table 8-5
92 Additional Facilities Murder-Servitors All Ships 1 1 2 Boarding bonus Table 8-5
93 Cargo and Passenger Compartments Brig All Ships 1 1 1 Prison cells Table 1-10
94 Cargo and Passenger Compartments Ship’s Stores Light Cruisers/Cruisers 1 5 2 Spares & supplies Table 1-10
95 Cargo and Passenger Compartments Ship’s Stores Transports/Grand Cruisers 1 10 2 Spares & supplies Table 1-10
96 Augments and Enhancements Defensive Countermeasures† All Ships 1 1 2 † Once per vessel Table 1-10
97 Augments and Enhancements Flak Turrets† All Ships 1 1 1 † Once per vessel Table 1-10
98 Augments and Enhancements Field Bracing All Ships 1-3 1 2 Variable power by scope Table 1-10
99 Augments and Enhancements Fire Suppression System† Transports/Raiders/Frigates 1 1 2 † Once per vessel Table 1-10
100 Augments and Enhancements Fire Suppression System† Light Cruisers/Cruisers 2 2 2 † Once per vessel Table 1-10
101 Augments and Enhancements Fire Suppression System† Grand Cruisers 3 3 2 † Once per vessel Table 1-10
102 Augments and Enhancements Lux Net All Ships 10 generated 2 2 Generates Power; special rules Table 1-10
103 Augments and Enhancements Minelayer Bay Transports/Light Cruisers/Cruisers 1 4 1 Deploys mines Table 1-10
104 Augments and Enhancements Power Ram† Light Cruisers/Cruisers 2 0 2 † Once per vessel Table 1-10
105 Additional Facilities Cloudmining Facility† Transports 3 4 1 † Once per vessel Table 1-10
106 Additional Facilities Hydraphuran Jamming System† All Ships 4 0 1 † Once per vessel Table 1-10
107 Additional Facilities Manufactorum† Light Cruisers/Cruisers 2 1 2 † Once per vessel Table 1-10
108 Additional Facilities Medicae Deck† All Ships 2 1 1 † Once per vessel Table 1-10
109 Additional Facilities Melodium† All Ships 1 1 1 † Once per vessel Table 1-10
110 Additional Facilities Plasma Scoop† Raiders/Frigates 2 3 3 † Once per vessel Table 1-10
111 Additional Facilities Plasma Scoop† Light Cruisers/Cruisers 3 4 3 † Once per vessel Table 1-10
112 Additional Facilities Pilot’s Chamber† All Ships 1 1 1 † Once per vessel Table 1-10
113 Additional Facilities Salvage Systems† Transport/Light Cruiser/Cruiser 5 3 3 † Once per vessel Table 1-10
114 Additional Facilities Small Craft Repair Deck† Light Cruisers/Cruisers 2 2 1 † Once per vessel Table 1-10
115 Additional Facilities Spacedock Piers† Transports (50+ Space)/Grand Cruisers 7 14 4 † Once per vessel Table 1-10
116 Cargo Holds and Passenger Compartments Shadowblind Bays All Ships 3 4 2 Stealth berths Table 4-3
117 Cargo Holds and Passenger Compartments Xenos Habitats All Ships 2 1 1 Accommodations for xenos Table 4-3
118 Augments and Enhancements Auxiliary Plasma Banks Transports/Raiders/Frigates 8 generated 5 1 Generates Power; special rules Table 4-3
119 Augments and Enhancements Auxiliary Plasma Banks Light Cruisers/Cruisers 10 generated 6 1 Generates Power; special rules Table 4-3
120 Augments and Enhancements Drop Pod Launch Bays All Ships 1 3 2 Assault insertion bays Table 4-3
121 Augments and Enhancements Empyrean Mantle Transports/Raiders/Frigates 3 0 2 External; stealth vs detection Table 4-3
122 Augments and Enhancements Empyrean Mantle Light Cruisers/Cruisers 5 0 2 External; stealth vs detection Table 4-3
123 Augments and Enhancements Reinforced Prow Transports/Raiders/Frigates 0 2 1 Strengthened prow Table 4-3
124 Augments and Enhancements Reinforced Prow Light Cruisers/Cruisers 0 3 1 Strengthened prow Table 4-3
125 Additional Facilities Arboretum Transports/Raiders/Frigates 2 2 1 Life-supporting gardens Table 4-3
126 Additional Facilities Arboretum Light Cruisers/Cruisers 2 3 1 Life-supporting gardens Table 4-3
127 Additional Facilities Asteroid Mining Facility All Ships 6 10 3 Onboard mining/refinery Table 4-3
128 Additional Facilities Astropathic Choir-chambers All Ships 1 1 1 Astropathic communications Table 4-3
129 Additional Facilities Broadband Hymn-casters All Ships 3 0 1 Long-range vox-hymn projectors Table 4-3
130 Category Component Appropriate Hull Types Power Space SP Notes / Effects Source
131 Archeotech Castellan Shield All Ships 5 1 2 Archeotech void-shield variant. Table 4-4
132 Archeotech Castellan Shield Array Cruisers 7 2 2 Counts as multiple shields; archeotech array. Table 4-4
133 Archeotech Cogitator Interlink† All Ships 1 1 2 † Once per vessel; advanced cogitator network. Table 4-4
134 Archeotech Energistic Conversion Matrix† All Ships 1 1 1 † Once per vessel; convert Power to Speed per rules. Table 4-4
135 Archeotech Gyro-stabilisation Matrix† All Ships 1 1 1 † Once per vessel; enhanced targeting stabilisation. Table 4-4
136 Archeotech Staravar Laser Macrobattery All Ships 4 4 2 Archeotech laser macrobattery (see weapon statline in Table 4-5) Table 4-4
137 Archeotech Star-flare Lance Light Cruisers/Cruisers 12 6 3 Archeotech lance (see weapon statline in Table 4-5) Table 4-4
138 Archeotech Cypra-pattern Class 1 Drive Transports 30 Generated 10 2 Archeotech plasma drive. Table 1-11
139 Archeotech Cypra-pattern Class 2 Drive Raiders/Frigates 40 Generated 12 2 Archeotech plasma drive. Table 1-11
140 Archeotech Jovian-pattern Nova Cannon Cruisers 6 7 5 Component entry for Nova Cannon mount (see weapon on Table 1-12) Table 1-11
141 Archeotech Plasma Accelerated Torpedo Tubes All Ships 2 6 2 Archeotech torpedo tubes (see weapon on Table 1-12) Table 1-11
142 Archeotech Warp Antenna All Ships 1 1 2 Archeotech warp comms augment. Table 1-11
143 Archeotech Warp Sextant All Ships 4 1 2 Archeotech warp navigation aid. Table 1-11
144 Archeotech Ancient Life Sustainer Transports/Raiders/Frigates 2 1 2 Archeotech life support. Table 8-6
145 Archeotech Ancient Life Sustainer Light Cruisers/Cruisers 2 2 2 Archeotech life support. Table 8-6
146 Archeotech Modifified Jovian Pattern Class 1 Drive Transports 35 Generated 4 3 Archeotech/modified drive. Table 8-6
147 Archeotech Modifified Lathe Pattern Class 1 Drive Transports 40 Generated 8 3 Archeotech/modified drive. Table 8-6
148 Archeotech Modifified Jovian Pattern Class 2 Drive Raiders/Frigates 45 Generated 6 3 Archeotech/modified drive. Table 8-6
149 Archeotech Modifified Jovian Pattern Class 3 Drive Light Cruisers 60 Generated 8 3 Archeotech/modified drive. Table 8-6
150 Archeotech Modifified Jovian Pattern Class 4 Drive Cruisers 75 Generated 10 3 Archeotech/modified drive. Table 8-6
151 Archeotech Bridge of Antiquity Transports/Raiders/Frigates 1 1 2 Archeotech bridge. Table 8-6
152 Archeotech Bridge of Antiquity Light Cruisers/Cruisers 2 1 2 Archeotech bridge. Table 8-6
153 Archeotech Auto-stabilised Logis-targeter All ships 5 0 2 Archeotech targeting augmentation. Table 8-6
154 Archeotech Teleportarium All ships 1 1 1 Archeotech teleport array (component entry) Table 8-6
155 Xenotech Ghost Field All ships 8 4 3 Xenos equivalent of advanced stealth shielding. Table 8-7
156 Xenotech Shard Cannon Battery All ships 0 3 2 Xenos macrobattery analogue. Table 8-7
157 Xenotech Runecaster All ships 0 1 2 Xenos augury/warding device. Table 8-7
158 Xenotech Micro Laser Defence Grid All ships 2 0 2 Xenos PD grid. Table 8-7
159 Xenotech Gravity Sails Transports/Raiders/Frigates 3 0 3 Ancient gravity sail rig. Table 8-7
160 Xenotech Gravity Sails Light cruisers/Cruisers 5 0 3 Ancient gravity sail rig. Table 8-7
+22
View File
@@ -0,0 +1,22 @@
component_name,category,hull_sizes,power,space,sp,availability,summary,notes,book_sources,needs_review
Jovian-pattern Class 2 Drive,Plasma Drive,Raider/Frigate,UNKN,UNKN,UNKN,UNKN,Standard napęd plazmowy dla rajderów i fregat; wysoka niezawodność i przyzwoita moc.,Wymagany 1× na statek (Essential).,Core,check_table;check_desc
Jovian-pattern Class 3 Drive,Plasma Drive,Cruiser,UNKN,UNKN,UNKN,UNKN,"Skalowany wariant Joviana dla krążowników, zapewnia zasilanie dla cięższych platform.",Wymagany 1× na statek (Essential).,Core,check_table;check_desc
Strelov 1 Warp Engine,Warp Engine,Raider/Frigate,UNKN,UNKN,UNKN,UNKN,"Podstawowy silnik warp dla lekkich kadłubów, stabilny i szeroko dostępny.",Wymagany 1× na statek (Essential).,Core,check_table;check_desc
Strelov 2 Warp Engine,Warp Engine,Cruiser,UNKN,UNKN,UNKN,UNKN,Udoskonalony Strelov dla krążowników; typowy standard Marynarki.,Wymagany 1× na statek (Essential).,Core,check_table;check_desc
Miloslav H-616.b Warp Engine,Warp Engine,Raider/Frigate/Cruiser,UNKN,UNKN,UNKN,UNKN,Szybsza nawigacja w Immaterium kosztem zwiększonych wymagań; preferowany przez śmiałych Traderów.,Wariant alternatywny względem Strelov; kompatybilność zależna od tonażu.,BFK,check_table;check_desc
Geller Field,Geller Field,All (RF/C),UNKN,UNKN,UNKN,UNKN,Osłona antydemoniczna utrzymująca realspace wewnątrz statku podczas skoku warp.,Wymagany 1× na statek (Essential).,Core,check_table;check_desc
Warpsbane-pattern Geller Field,Geller Field,All (RF/C),UNKN,UNKN,UNKN,UNKN,Ulepszona ochrona przed zjawiskami warp i intruzją bytów niefizycznych.,Rzadki/Archeotech wariant; instalacja zamiast standardowego pola.,BFK,check_table;check_desc
Single Void Shield Array,Void Shield,Raider/Frigate,UNKN,UNKN,UNKN,UNKN,Bazowa osłona próżniowa; chroni przed pierwszym trafieniem w rundzie.,Wymagany 1× na statek (Essential).,Core,check_table;check_desc
Multiple Void Shield Array,Void Shield,Cruiser,UNKN,UNKN,UNKN,UNKN,Wzmocniona osłona z wieloma generatorami; lepsza odporność salwowa.,Wymagany 1× na statek (Essential).,Core,check_table;check_desc
Repulsor Shield Array,Void Shield,Cruiser,UNKN,UNKN,UNKN,UNKN,Zaawansowana odmiana maksymalizująca odbicie energii kinetycznej.,Rzadki/Specjalny; wymaga weryfikacji parametrów.,ItS/BFK,check_table;check_desc
Combat Bridge,Bridge,All (RF/C),UNKN,UNKN,UNKN,UNKN,Mostek bojowy optymalizujący działania taktyczne i ogień okrętu.,Essential; alternatywa dla Commerce/Armoured.,Core,check_table;check_desc
Commerce Bridge,Bridge,All (RF/C),UNKN,UNKN,UNKN,UNKN,"Mostek handlowy, systemy administracyjne i ładunkowe kosztem efektywności bojowej.",Essential; alternatywa dla Combat/Armoured.,Core,check_table;check_desc
Armoured Command Bridge,Bridge,All (RF/C),UNKN,UNKN,UNKN,UNKN,Silnie opancerzony mostek dowodzenia umożliwiający przetrwanie ciężkiego ostrzału.,Essential; alternatywa dla Combat/Commerce.,Core,check_table;check_desc
Vitae Pattern Life Sustainers,Life Sustainers,All (RF/C),UNKN,UNKN,UNKN,UNKN,Standardowe podtrzymanie życia o dobrej wydajności przy umiarkowanych kosztach.,UNKN,Core,check_table;check_desc
Clemency-pattern Life Sustainers,Life Sustainers,All (RF/C),UNKN,UNKN,UNKN,UNKN,"Ulepszone systemy oczyszczania, lepsze warunki bytowe dla załogi.",UNKN,Core,check_table;check_desc
Voidsmen Quarters,Crew Quarters,All (RF/C),UNKN,UNKN,UNKN,UNKN,Standardowe koszary dla załogi; kompromis między komfortem a pojemnością.,UNKN,Core,check_table;check_desc
Clan-Kin Quarters,Crew Quarters,All (RF/C),UNKN,UNKN,UNKN,UNKN,"Tradycyjne, klaustrofobiczne zabudowy klanowe zwiększające lojalność kosztem komfortu.",UNKN,Core,check_table;check_desc
Luxury Passenger Quarters,Crew Quarters,All (RF/C),UNKN,UNKN,UNKN,UNKN,Luksusowe kwatery dla VIP-ów i pasażerów; poprawiają reputację i morale.,UNKN,Core/ItS,check_table;check_desc
M-201.b Active Augur Array,Auger Array,All (RF/C),UNKN,UNKN,UNKN,UNKN,Aktywne sensory długiego zasięgu; dobre wykrywanie i śledzenie celów.,UNKN,Core,check_table;check_desc
W-240 Passive Detection Array,Auger Array,All (RF/C),UNKN,UNKN,UNKN,UNKN,"Pasywny pakiet nasłuchu i skanowania; cichsze, lecz słabsze wykrywanie.",UNKN,Core,check_table;check_desc
Deep Void Augur Array,Auger Array,All (RF/C),UNKN,UNKN,UNKN,UNKN,"Wysokoczułe układy do pracy w głębokiej pustce, przydatne w eksploracji.",UNKN,Core/BFK,check_table;check_desc
1 component_name category hull_sizes power space sp availability summary notes book_sources needs_review
2 Jovian-pattern Class 2 Drive Plasma Drive Raider/Frigate UNKN UNKN UNKN UNKN Standard napęd plazmowy dla rajderów i fregat; wysoka niezawodność i przyzwoita moc. Wymagany 1× na statek (Essential). Core check_table;check_desc
3 Jovian-pattern Class 3 Drive Plasma Drive Cruiser UNKN UNKN UNKN UNKN Skalowany wariant Joviana dla krążowników, zapewnia zasilanie dla cięższych platform. Wymagany 1× na statek (Essential). Core check_table;check_desc
4 Strelov 1 Warp Engine Warp Engine Raider/Frigate UNKN UNKN UNKN UNKN Podstawowy silnik warp dla lekkich kadłubów, stabilny i szeroko dostępny. Wymagany 1× na statek (Essential). Core check_table;check_desc
5 Strelov 2 Warp Engine Warp Engine Cruiser UNKN UNKN UNKN UNKN Udoskonalony Strelov dla krążowników; typowy standard Marynarki. Wymagany 1× na statek (Essential). Core check_table;check_desc
6 Miloslav H-616.b Warp Engine Warp Engine Raider/Frigate/Cruiser UNKN UNKN UNKN UNKN Szybsza nawigacja w Immaterium kosztem zwiększonych wymagań; preferowany przez śmiałych Traderów. Wariant alternatywny względem Strelov; kompatybilność zależna od tonażu. BFK check_table;check_desc
7 Geller Field Geller Field All (RF/C) UNKN UNKN UNKN UNKN Osłona antydemoniczna utrzymująca realspace wewnątrz statku podczas skoku warp. Wymagany 1× na statek (Essential). Core check_table;check_desc
8 Warpsbane-pattern Geller Field Geller Field All (RF/C) UNKN UNKN UNKN UNKN Ulepszona ochrona przed zjawiskami warp i intruzją bytów niefizycznych. Rzadki/Archeotech wariant; instalacja zamiast standardowego pola. BFK check_table;check_desc
9 Single Void Shield Array Void Shield Raider/Frigate UNKN UNKN UNKN UNKN Bazowa osłona próżniowa; chroni przed pierwszym trafieniem w rundzie. Wymagany 1× na statek (Essential). Core check_table;check_desc
10 Multiple Void Shield Array Void Shield Cruiser UNKN UNKN UNKN UNKN Wzmocniona osłona z wieloma generatorami; lepsza odporność salwowa. Wymagany 1× na statek (Essential). Core check_table;check_desc
11 Repulsor Shield Array Void Shield Cruiser UNKN UNKN UNKN UNKN Zaawansowana odmiana maksymalizująca odbicie energii kinetycznej. Rzadki/Specjalny; wymaga weryfikacji parametrów. ItS/BFK check_table;check_desc
12 Combat Bridge Bridge All (RF/C) UNKN UNKN UNKN UNKN Mostek bojowy optymalizujący działania taktyczne i ogień okrętu. Essential; alternatywa dla Commerce/Armoured. Core check_table;check_desc
13 Commerce Bridge Bridge All (RF/C) UNKN UNKN UNKN UNKN Mostek handlowy, systemy administracyjne i ładunkowe kosztem efektywności bojowej. Essential; alternatywa dla Combat/Armoured. Core check_table;check_desc
14 Armoured Command Bridge Bridge All (RF/C) UNKN UNKN UNKN UNKN Silnie opancerzony mostek dowodzenia umożliwiający przetrwanie ciężkiego ostrzału. Essential; alternatywa dla Combat/Commerce. Core check_table;check_desc
15 Vitae Pattern Life Sustainers Life Sustainers All (RF/C) UNKN UNKN UNKN UNKN Standardowe podtrzymanie życia o dobrej wydajności przy umiarkowanych kosztach. UNKN Core check_table;check_desc
16 Clemency-pattern Life Sustainers Life Sustainers All (RF/C) UNKN UNKN UNKN UNKN Ulepszone systemy oczyszczania, lepsze warunki bytowe dla załogi. UNKN Core check_table;check_desc
17 Voidsmen Quarters Crew Quarters All (RF/C) UNKN UNKN UNKN UNKN Standardowe koszary dla załogi; kompromis między komfortem a pojemnością. UNKN Core check_table;check_desc
18 Clan-Kin Quarters Crew Quarters All (RF/C) UNKN UNKN UNKN UNKN Tradycyjne, klaustrofobiczne zabudowy klanowe zwiększające lojalność kosztem komfortu. UNKN Core check_table;check_desc
19 Luxury Passenger Quarters Crew Quarters All (RF/C) UNKN UNKN UNKN UNKN Luksusowe kwatery dla VIP-ów i pasażerów; poprawiają reputację i morale. UNKN Core/ItS check_table;check_desc
20 M-201.b Active Augur Array Auger Array All (RF/C) UNKN UNKN UNKN UNKN Aktywne sensory długiego zasięgu; dobre wykrywanie i śledzenie celów. UNKN Core check_table;check_desc
21 W-240 Passive Detection Array Auger Array All (RF/C) UNKN UNKN UNKN UNKN Pasywny pakiet nasłuchu i skanowania; cichsze, lecz słabsze wykrywanie. UNKN Core check_table;check_desc
22 Deep Void Augur Array Auger Array All (RF/C) UNKN UNKN UNKN UNKN Wysokoczułe układy do pracy w głębokiej pustce, przydatne w eksploracji. UNKN Core/BFK check_table;check_desc
@@ -0,0 +1,415 @@
{
"folder": "Kgk6Zo2oRvw9N5ii",
"name": "Aquila Lander",
"type": "vehicle",
"img": "modules/wng-core/assets/tokens/rogue-trader-dynasties.webp",
"system": {
"complement": {
"pilot": 1,
"crew": 0,
"passenger": 7,
"list": []
},
"mnvr": 7,
"rarity": "rare",
"value": 14,
"traits": {
"list": [
{
"name": "flyer"
},
{
"name": "hover"
},
{
"name": "reliable"
},
{
"name": "sealed"
},
{
"name": "turboBoost",
"rating": "6"
}
]
},
"combat": {
"size": "gargantuan",
"speed": 120,
"wounds": {
"value": 0,
"bonus": 0,
"max": 14
},
"resilience": {
"bonus": 0,
"total": 12
},
"defence": {
"bonus": 0
},
"fly": 0
},
"notes": "<p>The Aquila Lander is the vessel of choice for Gilead dignitaries when they travel between ships or make planetary landings. It is lightly armed and relies on speed to ensure the safety of its valuable passengers.</p><p></p><p>The <strong>Aquila</strong> can replace its @UUID[Compendium.wng-core.items.Item.ut6nsTPR0xL4mfET]{Heavy Bolter} with either an @UUID[Compendium.wng-core.items.Item.9DfD3HEoGmpIWLoC]{Autocannon} or a @UUID[Compendium.wng-cos.items.Item.XtRh1VndguW93hzA]{Multi-Laser}.</p>",
"settings": {
"hidePassengers": false
}
},
"prototypeToken": {
"name": "Aquila Lander",
"displayName": 20,
"actorLink": false,
"appendNumber": false,
"prependAdjective": false,
"texture": {
"src": "modules/wng-core/assets/tokens/rogue-trader-dynasties.webp",
"scaleX": 1,
"scaleY": 1,
"offsetX": 0,
"offsetY": 0,
"rotation": 0,
"anchorX": 0.5,
"anchorY": 0.5,
"fit": "contain",
"tint": "#ffffff",
"alphaThreshold": 0.75
},
"width": 4,
"height": 4,
"lockRotation": false,
"rotation": 0,
"alpha": 1,
"disposition": 0,
"displayBars": 20,
"bar1": {
"attribute": "combat.wounds"
},
"bar2": {
"attribute": null
},
"light": {
"alpha": 0.5,
"angle": 360,
"bright": 0,
"coloration": 1,
"dim": 0,
"attenuation": 0.5,
"luminosity": 0.5,
"saturation": 0,
"contrast": 0,
"shadows": 0,
"animation": {
"type": null,
"speed": 5,
"intensity": 5,
"reverse": false
},
"darkness": {
"min": 0,
"max": 1
},
"negative": false,
"priority": 0,
"color": null
},
"sight": {
"enabled": false,
"range": 0,
"angle": 360,
"visionMode": "basic",
"attenuation": 0.1,
"brightness": 0,
"saturation": 0,
"contrast": 0,
"color": null
},
"detectionModes": [],
"flags": {},
"randomImg": false,
"occludable": {
"radius": 0
},
"ring": {
"enabled": false,
"colors": {
"ring": null,
"background": null
},
"effects": 1,
"subject": {
"scale": 1,
"texture": null
}
},
"turnMarker": {
"mode": 1,
"animation": null,
"src": null,
"disposition": false
},
"movementAction": null
},
"items": [
{
"_id": "c1eM1YGFaqKckprQ",
"name": "IMPERIUM",
"type": "keyword",
"img": "modules/wng-core/assets/ui/aquila-white.webp",
"effects": [],
"flags": {
"wng-core": {
"initialization-folder": "Keywords",
"sort": 3500000
},
"core": {}
},
"system": {
"description": "<p>The vast interstellar empire of Humanity that spans over a million worlds, led by the Emperor from Holy Terra. </p>"
},
"_stats": {
"coreVersion": "13.347",
"systemId": "wrath-and-glory",
"systemVersion": "7.1.1",
"lastModifiedBy": null
},
"folder": "SXjZUgQ1pROPVE9j",
"sort": 0,
"ownership": {
"default": 0
}
},
{
"_id": "AIDhVkSIsCH9Jfbx",
"name": "AERONAUTICA IMPERIALIS",
"type": "keyword",
"img": "modules/wng-core/assets/ui/aquila-white.webp",
"effects": [],
"flags": {
"wng-core": {
"initialization-folder": "Keywords",
"sort": 2100000
},
"core": {}
},
"system": {
"description": "<p>The Aeronautica Imperialis are part of the Navis Imperialis, and are responsible for Imperial in-atmosphere aviation. </p>"
},
"_stats": {
"coreVersion": "13.347",
"systemId": "wrath-and-glory",
"systemVersion": "7.1.1",
"lastModifiedBy": null
},
"folder": "SXjZUgQ1pROPVE9j",
"sort": 0,
"ownership": {
"default": 0
}
},
{
"name": "FLYER",
"type": "keyword",
"img": "modules/wng-core/assets/ui/aquila-white.webp",
"_id": "l7YgMSB9ww4iKXJW",
"system": {
"description": ""
},
"effects": [],
"folder": null,
"sort": 0,
"flags": {},
"_stats": {
"coreVersion": "13.347",
"systemId": "wrath-and-glory",
"systemVersion": "7.1.1",
"lastModifiedBy": null
},
"ownership": {
"default": 0
}
},
{
"_id": "76RoKhzW7pHowYHq",
"name": "Heavy Bolter",
"type": "weapon",
"img": "modules/wng-core/assets/icons/weapons/heavy-bolter.webp",
"effects": [],
"flags": {
"wng-core": {
"initialization-folder": "Weapons",
"sort": 0
},
"core": {}
},
"system": {
"quantity": 1,
"rarity": "uncommon",
"description": "The outsized brother of the cousin, these heavy weapons are as terrifying as one would expect. With sustained fire these huge guns can reduce heavily armoured infantry and light vehicles to naught but unrecognizable chunks of smouldering ruin.",
"value": 6,
"keywords": "BOLT, IMPERIUM",
"equipped": true,
"attack": {
"base": 0,
"bonus": 0,
"rank": "none"
},
"damage": {
"base": 12,
"bonus": 0,
"rank": 0,
"ed": {
"base": 2,
"bonus": 0,
"rank": 0
},
"ap": {
"base": 0,
"bonus": 0,
"rank": 0
},
"otherDamage": {
"mortal": "0",
"wounds": "0",
"shock": "0"
},
"enabled": false
},
"ed": {
"base": 0,
"bonus": 0,
"rank": "none"
},
"ap": {
"base": 0,
"bonus": 0,
"rank": "none"
},
"category": "ranged",
"range": {
"short": 18,
"medium": 36,
"long": 54,
"melee": 1,
"thrown": null
},
"ammo": {
"id": "b8eQkcc55L9gcmB3"
},
"salvo": 3,
"traits": {
"list": [
{
"name": "brutal"
},
{
"rating": "4",
"name": "heavy"
},
{
"rating": "4",
"name": "rapidFire"
}
]
},
"upgrades": [],
"combi": {},
"twinned": false,
"otherDamage": {}
},
"_stats": {
"coreVersion": "13.347",
"systemId": "wrath-and-glory",
"systemVersion": "7.1.1",
"lastModifiedBy": null
},
"folder": "85dkcvhBYli5TJrZ",
"sort": 0,
"ownership": {
"default": 0
}
},
{
"name": "Armoured Cockpit",
"folder": "FrmevO9rOTrrEhIe",
"type": "gear",
"system": {
"quantity": 1,
"rarity": "common",
"description": "Extra protection for the Pilot is always welcome, to ensure they not only deliver destruction but also deliver important passengers safely to their destinations.<br><br><strong>Effects: </strong>This item grants the Crew inside the vehicle's cockpit an AR of 4 against any attack originating from outside the vehicle.",
"value": 5,
"keywords": "FLYER",
"effect": "",
"test": {
"self": false
}
},
"_id": "IxcyH7fPsMvx4YFL",
"img": "modules/wng-core/assets/icons/gear/gear.webp",
"effects": [],
"sort": 100000,
"flags": {
"core": {}
},
"_stats": {
"coreVersion": "13.347",
"systemId": "wrath-and-glory",
"systemVersion": "7.1.1",
"lastModifiedBy": null
},
"ownership": {
"default": 0
}
},
{
"name": "Heavy Bolter Ammo",
"type": "ammo",
"img": "modules/wng-core/assets/icons/ammo/ammo.webp",
"_id": "b8eQkcc55L9gcmB3",
"system": {
"quantity": 10,
"rarity": "common",
"description": "",
"value": 0,
"keywords": "",
"effect": "",
"traits": {
"list": []
}
},
"effects": [],
"folder": null,
"sort": 0,
"flags": {},
"_stats": {
"coreVersion": "13.347",
"systemId": "wrath-and-glory",
"systemVersion": "7.1.1",
"lastModifiedBy": null
},
"ownership": {
"default": 0
}
}
],
"effects": [],
"flags": {},
"_stats": {
"coreVersion": "13.347",
"systemId": "wrath-and-glory",
"systemVersion": "7.1.1",
"createdTime": 1756320857500,
"modifiedTime": 1756320857500,
"lastModifiedBy": "ETeghv7x8fjtIEKK",
"exportSource": {
"worldId": "gilead2",
"uuid": "Actor.Qz0AG5vJU9HrYtxk",
"coreVersion": "13.348",
"systemId": "wrath-and-glory",
"systemVersion": "7.1.1"
}
},
"ownership": {
"default": 0
},
"_id": "Qz0AG5vJU9HrYtxk"
}
@@ -0,0 +1,295 @@
{
"name": "Cobra-class Destroyer (Renegade)",
"type": "vehicle",
"img": "modules/wng-core/assets/tokens/generic.webp",
"system": {
"complement": {
"pilot": 0,
"crew": 0,
"passenger": 0,
"list": []
},
"mnvr": 2,
"rarity": "",
"value": 0,
"traits": {
"list": []
},
"combat": {
"size": "colossal",
"speed": 10,
"wounds": {
"value": 0,
"bonus": 0,
"max": 22
},
"resilience": {
"bonus": 0,
"total": 9
},
"defence": {
"bonus": 3
},
"fly": 0
},
"notes": "Ex-Navy Cobra in privateer hands with non-standard prow refits.",
"settings": {
"hidePassengers": false
}
},
"prototypeToken": {
"name": "Cobra-class Destroyer (Renegade)",
"width": 4,
"height": 4,
"displayName": 50,
"actorLink": false,
"texture": {
"src": "modules/wng-core/assets/tokens/generic.webp",
"anchorX": 0.5,
"anchorY": 0.5,
"offsetX": 0,
"offsetY": 0,
"fit": "contain",
"scaleX": 1,
"scaleY": 1,
"rotation": 0,
"tint": "#ffffff",
"alphaThreshold": 0.75
},
"lockRotation": false,
"rotation": 0,
"alpha": 1,
"disposition": -1,
"displayBars": 0,
"bar1": {
"attribute": null
},
"bar2": {
"attribute": null
},
"light": {
"negative": false,
"priority": 0,
"alpha": 0.5,
"angle": 360,
"bright": 0,
"color": null,
"coloration": 1,
"dim": 0,
"attenuation": 0.5,
"luminosity": 0.5,
"saturation": 0,
"contrast": 0,
"shadows": 0,
"animation": {
"type": null,
"speed": 5,
"intensity": 5,
"reverse": false
},
"darkness": {
"min": 0,
"max": 1
}
},
"sight": {
"enabled": false,
"range": 0,
"angle": 360,
"visionMode": "basic",
"color": null,
"attenuation": 0.1,
"brightness": 0,
"saturation": 0,
"contrast": 0
},
"detectionModes": [],
"occludable": {
"radius": 0
},
"ring": {
"enabled": false,
"colors": {
"ring": null,
"background": null
},
"effects": 1,
"subject": {
"scale": 1,
"texture": null
}
},
"turnMarker": {
"mode": 1,
"animation": null,
"src": null,
"disposition": false
},
"movementAction": null,
"flags": {},
"randomImg": false,
"appendNumber": false,
"prependAdjective": false
},
"flags": {
"wg-voidships": {
"source": "Battlefleet Koronus, p. 66",
"shields": {
"current": 1,
"max": 1
},
"speedVU": 10,
"handling": 2,
"cr": 5,
"tur": 1,
"mounts": "",
"traits": "",
"components": []
}
},
"items": [
{
"_id": "aarPxYJvbSDqkUQf",
"name": "Torpedo Tubes",
"type": "weapon",
"img": "modules/wng-core/assets/icons/weapons/missile-launcher.webp",
"system": {
"quantity": 1,
"rarity": "uncommon",
"description": "Torpedowe wyrzutnie okrętowe. Strzał: Gunnery (BS) vs DEF; przechwytywalne przez TUR. Statystyki efektu zależą od załadowanej głowicy.\n\n**Kompatybilna amunicja (drag&drop na aktora, a następnie wybierz w polu Ammo):**\n• Torpedo Warhead — Standard / Plasma / Melta / Virus / Vortex / Guided.\n\n**Uwaga:** natywny system W&G nie zmienia DMG/AP/ED wg amunicji; używaj opisu ładunku przy interpretacji efektu.",
"value": 0,
"keywords": "VOIDSHIP, ORDNANCE, TORPEDO, AMMO-DEPENDENT",
"equipped": true,
"attack": {
"base": 0,
"bonus": 0,
"rank": "0"
},
"damage": {
"base": 0,
"bonus": 0,
"rank": 0,
"enabled": false,
"ed": {
"base": 0,
"bonus": 0,
"rank": 0
},
"ap": {
"base": 0,
"bonus": 0,
"rank": 0
},
"otherDamage": {
"mortal": "0",
"shock": "0",
"wounds": "0"
}
},
"ed": {
"base": 0,
"bonus": 0,
"rank": 0
},
"ap": {
"base": 0,
"bonus": 0,
"rank": 0
},
"category": "launcher",
"range": {
"short": 30,
"medium": 60,
"long": 120,
"melee": 1,
"thrown": null
},
"ammo": {},
"salvo": 1,
"traits": {
"list": [
{
"name": "ordnance"
},
{
"name": "interceptable",
"rating": "TUR"
}
]
},
"upgrades": [],
"otherDamage": {},
"combi": {},
"twinned": false
},
"effects": [],
"_stats": {
"coreVersion": "13.348",
"systemId": "wrath-and-glory",
"systemVersion": "7.1.1",
"createdTime": 1758135686326,
"modifiedTime": 1758135709107,
"lastModifiedBy": "ETeghv7x8fjtIEKK"
},
"folder": null,
"sort": 0,
"flags": {},
"ownership": {
"default": 0
}
},
{
"_id": "RoyTsWuwxFInsIQS",
"name": "Torpedo Warhead — Guided",
"type": "ammo",
"img": "modules/wng-core/assets/icons/ammo/ammo.webp",
"system": {
"quantity": 6,
"rarity": "rare",
"description": "Naprowadzana — lepsza celność, trudniejsza do przechwycenia.",
"value": 0,
"keywords": "VOIDSHIP, TORPEDO-WARHEAD, GUIDED",
"effect": "+1k do ataku lub przerzut 1 nieudanego; TUR przeciwnika -1 do Intercept.",
"traits": {
"list": []
}
},
"effects": [],
"_stats": {
"coreVersion": "13.348",
"systemId": "wrath-and-glory",
"systemVersion": "7.1.1",
"createdTime": 1758135687800,
"modifiedTime": 1758135687800,
"lastModifiedBy": "ETeghv7x8fjtIEKK"
},
"folder": null,
"sort": 0,
"flags": {},
"ownership": {
"default": 0
}
}
],
"effects": [],
"_stats": {
"coreVersion": "13.348",
"systemId": "wrath-and-glory",
"systemVersion": "7.1.1",
"createdTime": 1758135625462,
"modifiedTime": 1758135625462,
"lastModifiedBy": "ETeghv7x8fjtIEKK",
"exportSource": {
"worldId": "gilead2",
"uuid": "Actor.jPYz63kXVprYFXMi",
"coreVersion": "13.348",
"systemId": "wrath-and-glory",
"systemVersion": "7.1.1"
}
},
"folder": null,
"ownership": {
"default": 0
},
"_id": "jPYz63kXVprYFXMi"
}
@@ -0,0 +1,172 @@
{
"name": "Cobra-class Destroyer",
"type": "vehicle",
"img": "modules/wng-core/assets/tokens/generic.webp",
"system": {
"complement": {
"pilot": 0,
"crew": 0,
"passenger": 0,
"list": []
},
"mnvr": 2,
"rarity": "",
"value": 0,
"traits": {
"list": []
},
"combat": {
"size": "colossal",
"speed": 10,
"wounds": {
"value": 0,
"bonus": 0,
"max": 22
},
"resilience": {
"bonus": 0,
"total": 9
},
"defence": {
"bonus": 3
},
"fly": 0
},
"notes": "Torpedo raider hunting in packs; strikes, then disengages to reload.",
"settings": {
"hidePassengers": false
}
},
"prototypeToken": {
"name": "Cobra-class Destroyer",
"width": 4,
"height": 4,
"displayName": 50,
"actorLink": false,
"texture": {
"src": "modules/wng-core/assets/tokens/generic.webp",
"anchorX": 0.5,
"anchorY": 0.5,
"offsetX": 0,
"offsetY": 0,
"fit": "contain",
"scaleX": 1,
"scaleY": 1,
"rotation": 0,
"tint": "#ffffff",
"alphaThreshold": 0.75
},
"lockRotation": false,
"rotation": 0,
"alpha": 1,
"disposition": -1,
"displayBars": 0,
"bar1": {
"attribute": null
},
"bar2": {
"attribute": null
},
"light": {
"negative": false,
"priority": 0,
"alpha": 0.5,
"angle": 360,
"bright": 0,
"color": null,
"coloration": 1,
"dim": 0,
"attenuation": 0.5,
"luminosity": 0.5,
"saturation": 0,
"contrast": 0,
"shadows": 0,
"animation": {
"type": null,
"speed": 5,
"intensity": 5,
"reverse": false
},
"darkness": {
"min": 0,
"max": 1
}
},
"sight": {
"enabled": false,
"range": 0,
"angle": 360,
"visionMode": "basic",
"color": null,
"attenuation": 0.1,
"brightness": 0,
"saturation": 0,
"contrast": 0
},
"detectionModes": [],
"occludable": {
"radius": 0
},
"ring": {
"enabled": false,
"colors": {
"ring": null,
"background": null
},
"effects": 1,
"subject": {
"scale": 1,
"texture": null
}
},
"turnMarker": {
"mode": 1,
"animation": null,
"src": null,
"disposition": false
},
"movementAction": null,
"flags": {},
"randomImg": false,
"appendNumber": false,
"prependAdjective": false
},
"flags": {
"wg-voidships": {
"source": "Battlefleet Koronus, p. 66",
"shields": {
"current": 1,
"max": 1
},
"speedVU": 10,
"handling": 2,
"cr": 5,
"tur": 1,
"mounts": "",
"traits": "",
"components": []
}
},
"items": [],
"effects": [],
"_stats": {
"coreVersion": "13.348",
"systemId": "wrath-and-glory",
"systemVersion": "7.1.1",
"createdTime": 1758135104158,
"modifiedTime": 1758135104158,
"lastModifiedBy": "ETeghv7x8fjtIEKK",
"exportSource": {
"worldId": "gilead2",
"uuid": "Actor.b518e981d69324aa",
"coreVersion": "13.348",
"systemId": "wrath-and-glory",
"systemVersion": "7.1.1"
}
},
"folder": null,
"ownership": {
"default": 0
},
"_id": "b518e981d69324aa"
}
@@ -0,0 +1,600 @@
{
"name": "Dauntless-class Light Cruiser",
"type": "vehicle",
"img": "modules/wng-core/assets/tokens/generic.webp",
"system": {
"complement": {
"pilot": 0,
"crew": 0,
"passenger": 0,
"list": []
},
"mnvr": 0,
"rarity": "",
"value": 0,
"traits": {
"list": []
},
"combat": {
"size": "",
"speed": 9,
"wounds": {
"value": 0,
"bonus": 0,
"max": 32
},
"resilience": {
"bonus": 0,
"total": 11
},
"defence": {
"bonus": 2
},
"fly": 0
},
"notes": "Versatile patrol cruiser—good acceleration and flexible refits. Often leads Passage Watch patrols.",
"settings": {
"hidePassengers": false
}
},
"prototypeToken": {
"name": "Dauntless-class Light Cruiser",
"width": 4,
"height": 4,
"displayName": 50,
"actorLink": false,
"texture": {
"src": "modules/wng-core/assets/tokens/generic.webp",
"anchorX": 0.5,
"anchorY": 0.5,
"offsetX": 0,
"offsetY": 0,
"fit": "contain",
"scaleX": 1,
"scaleY": 1,
"rotation": 0,
"tint": "#ffffff",
"alphaThreshold": 0.75
},
"lockRotation": false,
"rotation": 0,
"alpha": 1,
"disposition": -1,
"displayBars": 0,
"bar1": {
"attribute": null
},
"bar2": {
"attribute": null
},
"light": {
"negative": false,
"priority": 0,
"alpha": 0.5,
"angle": 360,
"bright": 0,
"color": null,
"coloration": 1,
"dim": 0,
"attenuation": 0.5,
"luminosity": 0.5,
"saturation": 0,
"contrast": 0,
"shadows": 0,
"animation": {
"type": null,
"speed": 5,
"intensity": 5,
"reverse": false
},
"darkness": {
"min": 0,
"max": 1
}
},
"sight": {
"enabled": false,
"range": 0,
"angle": 360,
"visionMode": "basic",
"color": null,
"attenuation": 0.1,
"brightness": 0,
"saturation": 0,
"contrast": 0
},
"detectionModes": [],
"occludable": {
"radius": 0
},
"ring": {
"enabled": false,
"colors": {
"ring": null,
"background": null
},
"effects": 1,
"subject": {
"scale": 1,
"texture": null
}
},
"turnMarker": {
"mode": 1,
"animation": null,
"src": null,
"disposition": false
},
"movementAction": null,
"flags": {},
"randomImg": false,
"appendNumber": false,
"prependAdjective": false
},
"flags": {
"wg-voidships": {
"source": "Battlefleet Koronus, p. 36",
"shields": {
"current": 2,
"max": 2
},
"speedVU": 9,
"handling": 0,
"cr": 6,
"tur": 2,
"mounts": "",
"traits": "",
"components": []
}
},
"items": [
{
"_id": "rQRXWIkHVSfInJEU",
"name": "Launch Bay",
"type": "weapon",
"img": "modules/wng-core/assets/icons/weapons/missile-launcher.webp",
"system": {
"quantity": 1,
"rarity": "uncommon",
"description": "Zatoki startowe dla skrzydeł. Test Gunnery (BS) vs DEF celu lub manewry CAP/Intercept/Bombing/Assault zgodnie z ładunkiem skrzydeł.\n\n**Kompatybilna amunicja (wybierz w polu Ammo):**\n• Wing Loadout — Fury Interceptors / Starhawk Bombers / Assault Boats.\n\n**Uwaga:** system nie modyfikuje DMG/AP/ED wg ładunku — używaj opisu skrzydła.",
"value": 0,
"keywords": "VOIDSHIP, CARRIER, CRAFT, AMMO-DEPENDENT",
"equipped": true,
"attack": {
"base": 0,
"bonus": 0,
"rank": "0"
},
"damage": {
"base": 0,
"bonus": 0,
"rank": 0,
"enabled": false,
"ed": {
"base": 0,
"bonus": 0,
"rank": 0
},
"ap": {
"base": 0,
"bonus": 0,
"rank": 0
},
"otherDamage": {
"mortal": "0",
"shock": "0",
"wounds": "0"
}
},
"ed": {
"base": 0,
"bonus": 0,
"rank": 0
},
"ap": {
"base": 0,
"bonus": 0,
"rank": 0
},
"category": "launcher",
"range": {
"short": 30,
"medium": 60,
"long": 120,
"melee": 1,
"thrown": null
},
"ammo": {},
"salvo": 1,
"traits": {
"list": [
{
"name": "carrier",
"rating": "wings"
},
{
"name": "interceptable",
"rating": "TUR"
}
]
},
"upgrades": [],
"otherDamage": {},
"combi": {},
"twinned": false
},
"effects": [],
"_stats": {
"coreVersion": "13.348",
"systemId": "wrath-and-glory",
"systemVersion": "7.1.1",
"createdTime": 1758142366746,
"modifiedTime": 1758142375262,
"lastModifiedBy": "ETeghv7x8fjtIEKK"
},
"folder": null,
"sort": 0,
"flags": {},
"ownership": {
"default": 0
}
},
{
"_id": "gre08Ehhz66jpP3x",
"name": "Torpedo Warhead — Standard",
"type": "ammo",
"img": "modules/wng-core/assets/icons/ammo/ammo.webp",
"system": {
"quantity": 6,
"rarity": "uncommon",
"description": "Standardowa głowica torpedy. DMG/AP/ED wg zasad modułu torped.",
"value": 0,
"keywords": "VOIDSHIP, TORPEDO-WARHEAD, STANDARD",
"effect": "Atak Gunnery (BS) vs DEF; może być przechwycone przez TUR. Sugerowane: DMG 14, ED 3, AP -2.",
"traits": {
"list": []
}
},
"effects": [],
"_stats": {
"coreVersion": "13.348",
"systemId": "wrath-and-glory",
"systemVersion": "7.1.1",
"createdTime": 1758142369873,
"modifiedTime": 1758142369873,
"lastModifiedBy": "ETeghv7x8fjtIEKK"
},
"folder": null,
"sort": 0,
"flags": {},
"ownership": {
"default": 0
}
},
{
"_id": "Pmu9A4bJw9d7Ar1g",
"name": "Torpedo Tubes",
"type": "weapon",
"img": "modules/wng-core/assets/icons/weapons/missile-launcher.webp",
"system": {
"quantity": 1,
"rarity": "uncommon",
"description": "Torpedowe wyrzutnie okrętowe. Strzał: Gunnery (BS) vs DEF; przechwytywalne przez TUR. Statystyki efektu zależą od załadowanej głowicy.\n\n**Kompatybilna amunicja (drag&drop na aktora, a następnie wybierz w polu Ammo):**\n• Torpedo Warhead — Standard / Plasma / Melta / Virus / Vortex / Guided.\n\n**Uwaga:** natywny system W&G nie zmienia DMG/AP/ED wg amunicji; używaj opisu ładunku przy interpretacji efektu.",
"value": 0,
"keywords": "VOIDSHIP, ORDNANCE, TORPEDO, AMMO-DEPENDENT",
"equipped": true,
"attack": {
"base": 0,
"bonus": 0,
"rank": "0"
},
"damage": {
"base": 0,
"bonus": 0,
"rank": 0,
"enabled": false,
"ed": {
"base": 0,
"bonus": 0,
"rank": 0
},
"ap": {
"base": 0,
"bonus": 0,
"rank": 0
},
"otherDamage": {
"mortal": "0",
"shock": "0",
"wounds": "0"
}
},
"ed": {
"base": 0,
"bonus": 0,
"rank": 0
},
"ap": {
"base": 0,
"bonus": 0,
"rank": 0
},
"category": "launcher",
"range": {
"short": 30,
"medium": 60,
"long": 120,
"melee": 1,
"thrown": null
},
"ammo": {},
"salvo": 1,
"traits": {
"list": [
{
"name": "ordnance"
},
{
"name": "interceptable",
"rating": "TUR"
}
]
},
"upgrades": [],
"otherDamage": {},
"combi": {},
"twinned": false
},
"effects": [],
"_stats": {
"coreVersion": "13.348",
"systemId": "wrath-and-glory",
"systemVersion": "7.1.1",
"createdTime": 1758142371364,
"modifiedTime": 1758142375868,
"lastModifiedBy": "ETeghv7x8fjtIEKK"
},
"folder": null,
"sort": 0,
"flags": {},
"ownership": {
"default": 0
}
},
{
"_id": "QKm9bcww1aWOimbb",
"name": "Wing Loadout — Assault Boats",
"type": "ammo",
"img": "modules/wng-core/assets/icons/ammo/ammo.webp",
"system": {
"quantity": 1,
"rarity": "uncommon",
"description": "Łodzie abordażowe — dostarczają zespoły na pokład.",
"value": 0,
"keywords": "VOIDSHIP, WING-LOADOUT, ASSAULT, BOARDING",
"effect": "Zamiast DMG uruchamia Boarding (Close/Contact). Jeśli dotrą bez strat: +2 do pierwszej fazy abordażu.",
"traits": {
"list": []
}
},
"effects": [],
"_stats": {
"coreVersion": "13.348",
"systemId": "wrath-and-glory",
"systemVersion": "7.1.1",
"createdTime": 1758142372933,
"modifiedTime": 1758142372933,
"lastModifiedBy": "ETeghv7x8fjtIEKK"
},
"folder": null,
"sort": 0,
"flags": {},
"ownership": {
"default": 0
}
},
{
"name": "Heavy Squig Launcha",
"type": "weapon",
"folder": "vmJPLFnHHoDwT4DM",
"system": {
"quantity": 1,
"rarity": "uncommon",
"description": "<p>A larger version of the primitive weapon that propels murderous Orkoids known as Squigs wherever an Ork sees fit. Whenever you fire a Heavy Squig Launcha, you can fire a Bile, Bitey, or Boom Squig.</p><ul><li><p>@UUID[Compendium.wng-cos.items.Item.SLT8t7m3UHZ1v5dq]{Bile Squig}</p></li><li><p>@UUID[Compendium.wng-cos.items.Item.LkjqUWSEfH14D9Jj]{Bitey Squig}</p></li><li><p>@UUID[Compendium.wng-cos.items.Item.QHcZdjZBknkZq39u]{Boom Squig}</p></li></ul>",
"value": 6,
"keywords": "ORK, SQUIG",
"equipped": true,
"attack": {
"base": 0,
"bonus": 0,
"rank": "none"
},
"damage": {
"base": 0,
"bonus": 0,
"rank": 0,
"ed": {
"base": 0,
"bonus": 0,
"rank": 0
},
"ap": {
"base": 0,
"bonus": 0,
"rank": 0
},
"otherDamage": {
"mortal": "0",
"wounds": "0",
"shock": "0"
},
"enabled": false
},
"ed": {
"base": 0,
"bonus": 0,
"rank": "none"
},
"ap": {
"base": 0,
"bonus": 0,
"rank": "none"
},
"category": "launcher",
"range": {
"short": 18,
"medium": 36,
"long": 54,
"melee": 1,
"thrown": null
},
"ammo": {
"id": "2oFWikZMQghCIcnY"
},
"salvo": null,
"traits": {
"list": [
{
"rating": "4",
"name": "heavy"
}
]
},
"upgrades": [],
"combi": {},
"twinned": false,
"otherDamage": {}
},
"_id": "VdgZx9v0s650UuQ0",
"img": "modules/wng-core/assets/icons/weapons/ranged-weapon.webp",
"effects": [],
"flags": {},
"_stats": {
"coreVersion": "13.348",
"systemId": "wrath-and-glory",
"systemVersion": "7.1.1",
"createdTime": 1758142626932,
"modifiedTime": 1758142671577,
"lastModifiedBy": "ETeghv7x8fjtIEKK"
},
"sort": 0,
"ownership": {
"default": 0
}
},
{
"folder": "9ke9KBkf4wjqg6Gg",
"name": "Bile Squig",
"type": "weapon",
"_id": "2oFWikZMQghCIcnY",
"img": "modules/wng-core/assets/icons/weapons/melee-weapon.webp",
"system": {
"quantity": 1,
"rarity": "uncommon",
"description": "<p>Squig Launcher ammunition is a living, conscious being. Its effect on the battlefield has been simplified to that of a projectile, but if you wish to run a squiggly beast as a combatant, you can use the following profile: @UUID[Compendium.wng-cos.actors.Actor.6TQklyAQ4v1RWRPv]{Bile Squig}.</p>",
"value": 2,
"keywords": "ORK, SQUIG",
"equipped": false,
"attack": {
"base": 0,
"bonus": 0,
"rank": "none"
},
"damage": {
"base": 10,
"bonus": 0,
"rank": 0,
"ap": {
"base": 0,
"bonus": 0,
"rank": 0
},
"ed": {
"base": 3,
"bonus": 0,
"rank": 0
},
"otherDamage": {
"mortal": "0",
"wounds": "0",
"shock": "0"
},
"enabled": false
},
"ed": {
"base": 0,
"bonus": 0,
"rank": "none"
},
"ap": {
"base": 0,
"bonus": 0,
"rank": "none"
},
"category": "grenade-missile",
"range": {
"short": 0,
"medium": 0,
"long": 0,
"melee": null,
"thrown": null
},
"ammo": {
"id": ""
},
"salvo": 0,
"traits": {
"list": [
{
"name": "blast",
"rating": "8"
},
{
"name": "inflict",
"rating": "Poisoned 2"
}
]
},
"upgrades": [],
"combi": {},
"twinned": false,
"otherDamage": {}
},
"effects": [],
"flags": {},
"_stats": {
"coreVersion": "13.348",
"systemId": "wrath-and-glory",
"systemVersion": "7.1.1",
"createdTime": 1758142638477,
"modifiedTime": 1758142638477,
"lastModifiedBy": "ETeghv7x8fjtIEKK"
},
"sort": 0,
"ownership": {
"default": 0
}
}
],
"effects": [],
"_stats": {
"coreVersion": "13.348",
"systemId": "wrath-and-glory",
"systemVersion": "7.1.1",
"createdTime": 1758142355338,
"modifiedTime": 1758142671578,
"lastModifiedBy": "ETeghv7x8fjtIEKK",
"exportSource": {
"worldId": "gilead2",
"uuid": "Actor.c8975bb7181d8e12",
"coreVersion": "13.348",
"systemId": "wrath-and-glory",
"systemVersion": "7.1.1"
}
},
"folder": null,
"ownership": {
"default": 0
},
"_id": "c8975bb7181d8e12"
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,635 @@
{
"folder": "Kgk6Zo2oRvw9N5ii",
"name": "Inquisitorial Arvus Lighter",
"type": "vehicle",
"img": "modules/wng-cos/assets/tokens/arvus-lighter.webp",
"system": {
"complement": {
"pilot": 1,
"crew": 1,
"passenger": 4,
"list": []
},
"mnvr": 4,
"rarity": "uncommon",
"value": 10,
"traits": {
"list": [
{
"name": "flyer"
},
{
"name": "hover"
},
{
"name": "reliable"
},
{
"name": "sealed"
}
]
},
"combat": {
"size": "huge",
"speed": 190,
"wounds": {
"value": 0,
"bonus": 0,
"max": 17
},
"resilience": {
"bonus": 0,
"total": 17
},
"defence": {
"bonus": 0
},
"fly": 0
},
"notes": "<p>A small cargo shuttle, the Arvus is robust enough to double as an assault boat for infantry landings and boarding parties. Few would praise its appearance, but the vessel has become a frequent sight in warzones.</p><p></p><p>This is a special version modified to be used as an inquisitorial shuttle. Due to amount of modification it has heavily reduced passenger compartment, almost non-existent cargo compartment and very limited life support (it gets REALLY cold after three hours inside).</p>",
"settings": {
"hidePassengers": false
}
},
"prototypeToken": {
"name": "Arvus Lighter",
"displayName": 20,
"actorLink": false,
"appendNumber": false,
"prependAdjective": false,
"texture": {
"src": "modules/wng-cos/assets/tokens/arvus-lighter.webp",
"scaleX": 1,
"scaleY": 1,
"offsetX": 0,
"offsetY": 0,
"rotation": 0,
"anchorX": 0.5,
"anchorY": 0.5,
"fit": "contain",
"tint": "#ffffff",
"alphaThreshold": 0.75
},
"width": 3,
"height": 3,
"lockRotation": false,
"rotation": 0,
"alpha": 1,
"disposition": 0,
"displayBars": 20,
"bar1": {
"attribute": "combat.wounds"
},
"bar2": {
"attribute": null
},
"light": {
"alpha": 0.5,
"angle": 360,
"bright": 0,
"coloration": 1,
"dim": 0,
"attenuation": 0.5,
"luminosity": 0.5,
"saturation": 0,
"contrast": 0,
"shadows": 0,
"animation": {
"type": null,
"speed": 5,
"intensity": 5,
"reverse": false
},
"darkness": {
"min": 0,
"max": 1
},
"negative": false,
"priority": 0,
"color": null
},
"sight": {
"enabled": false,
"range": 0,
"angle": 360,
"visionMode": "basic",
"attenuation": 0.1,
"brightness": 0,
"saturation": 0,
"contrast": 0,
"color": null
},
"detectionModes": [],
"flags": {},
"randomImg": false,
"occludable": {
"radius": 0
},
"ring": {
"enabled": false,
"colors": {
"ring": null,
"background": null
},
"effects": 1,
"subject": {
"scale": 1,
"texture": null
}
},
"turnMarker": {
"mode": 1,
"animation": null,
"src": null,
"disposition": false
},
"movementAction": null
},
"items": [
{
"_id": "c1eM1YGFaqKckprQ",
"name": "IMPERIUM",
"type": "keyword",
"img": "modules/wng-core/assets/ui/aquila-white.webp",
"effects": [],
"flags": {
"wng-core": {
"initialization-folder": "Keywords",
"sort": 3500000
},
"core": {}
},
"system": {
"description": "<p>The vast interstellar empire of Humanity that spans over a million worlds, led by the Emperor from Holy Terra. </p>"
},
"_stats": {
"coreVersion": "13.348",
"systemId": "wrath-and-glory",
"systemVersion": "7.1.1",
"lastModifiedBy": null
},
"folder": "SXjZUgQ1pROPVE9j",
"sort": 0,
"ownership": {
"default": 0
}
},
{
"_id": "AIDhVkSIsCH9Jfbx",
"name": "AERONAUTICA IMPERIALIS",
"type": "keyword",
"img": "modules/wng-core/assets/ui/aquila-white.webp",
"effects": [],
"flags": {
"wng-core": {
"initialization-folder": "Keywords",
"sort": 2100000
},
"core": {}
},
"system": {
"description": "<p>The Aeronautica Imperialis are part of the Navis Imperialis, and are responsible for Imperial in-atmosphere aviation. </p>"
},
"_stats": {
"coreVersion": "13.348",
"systemId": "wrath-and-glory",
"systemVersion": "7.1.1",
"lastModifiedBy": null
},
"folder": "SXjZUgQ1pROPVE9j",
"sort": 0,
"ownership": {
"default": 0
}
},
{
"name": "FLYER",
"type": "keyword",
"img": "modules/wng-core/assets/ui/aquila-white.webp",
"_id": "vhTSyOGeICmO7sQ4",
"system": {
"description": ""
},
"effects": [],
"folder": null,
"sort": 0,
"flags": {},
"_stats": {
"coreVersion": "13.348",
"systemId": "wrath-and-glory",
"systemVersion": "7.1.1",
"lastModifiedBy": null
},
"ownership": {
"default": 0
}
},
{
"name": "Just a very very bright searchlight",
"type": "weapon",
"folder": "ArBt3bkoEZjiK885",
"system": {
"quantity": 1,
"rarity": "rare",
"description": "<p>The <s>Aeldari</s> Inquisitorial Bright <s>Lance fires</s> Searchlight illuminates a target with a hyperfocussed beam of coherent light through psychically grown crystals. The beam is efficient and intensely powerful, able to penetrate even the thickest armour with pinpoint accuracy. This can be used only twice each flight before having to be recharged on the board of a capital ship</p>",
"value": 9,
"keywords": "LAS, AELDARI, ASURYANI",
"equipped": true,
"attack": {
"base": 0,
"bonus": 0,
"rank": "none"
},
"damage": {
"base": 16,
"bonus": 0,
"rank": 0,
"ap": {
"base": -4,
"bonus": 0,
"rank": 0,
"dice": ""
},
"ed": {
"base": 2,
"bonus": 0,
"rank": 0,
"dice": ""
},
"otherDamage": {
"mortal": "0",
"wounds": "0",
"shock": "0"
},
"enabled": false,
"dice": ""
},
"ed": {
"base": 0,
"bonus": 0,
"rank": "none"
},
"ap": {
"base": 0,
"bonus": 0,
"rank": "none"
},
"category": "ranged",
"range": {
"short": 18,
"medium": 36,
"long": 54,
"melee": 1,
"thrown": null
},
"ammo": {
"id": ""
},
"salvo": 1,
"traits": {
"list": [
{
"rating": "12",
"name": "heavy"
},
{
"name": "lance"
},
{
"name": "reliable"
}
]
},
"upgrades": [],
"combi": {
"id": ""
},
"twinned": false,
"otherDamage": {}
},
"_id": "2It4OvjTfwTp0CEX",
"img": "modules/wng-core/assets/icons/weapons/ranged-weapon.webp",
"effects": [],
"sort": 400000,
"flags": {
"LocknKey": {
"IDKeysFlag": "",
"RemoveKeyonUseFlag": false,
"LPFormulaFlag": "",
"LPFormulaOverrideFlag": false,
"LBFormulaFlag": "",
"LBFormulaOverrideFlag": false,
"ReplacementItemFlag": ""
}
},
"_stats": {
"coreVersion": "13.348",
"systemId": "wrath-and-glory",
"systemVersion": "7.1.1",
"createdTime": 1758058557560,
"modifiedTime": 1758058941650,
"lastModifiedBy": "ETeghv7x8fjtIEKK"
},
"ownership": {
"default": 0
}
},
{
"name": "Infernum Halo Launcher",
"folder": "kYNF8JUlpf9Syo2d",
"type": "gear",
"system": {
"quantity": 1,
"rarity": "rare",
"description": "<p>Capable of firing a fusillade of Flares as a defensive countermeasure to distract automatically aimed anti-air projectiles, the Infernum Halo Launcher creates a ring of holy light that defends Imperial craft, reminiscent of the protective gaze of the Emperor.<br><br><strong>Effect: </strong>The Infernum Halo Launcher can be activated as a Reflexive Action whenever the vehicle it is attached to is targeted by an attack. When it is activated, the vehicle's Defence is increased by +4 until the start of the next Round.</p>",
"value": 9,
"keywords": "IMPERIUM, FLYER, ADEPTUS ASTARTES",
"effect": "",
"test": {
"self": false
}
},
"_id": "RDQ5VFK3NNXZec4q",
"img": "modules/wng-core/assets/icons/gear/gear.webp",
"effects": [],
"sort": 0,
"flags": {},
"_stats": {
"coreVersion": "13.348",
"systemId": "wrath-and-glory",
"systemVersion": "7.1.1",
"createdTime": 1758058683811,
"modifiedTime": 1758058683811,
"lastModifiedBy": "ETeghv7x8fjtIEKK"
},
"ownership": {
"default": 0
}
},
{
"name": "Infernum Halo Launcher",
"folder": "kYNF8JUlpf9Syo2d",
"type": "gear",
"system": {
"quantity": 1,
"rarity": "rare",
"description": "<p>Capable of firing a fusillade of Flares as a defensive countermeasure to distract automatically aimed anti-air projectiles, the Infernum Halo Launcher creates a ring of holy light that defends Imperial craft, reminiscent of the protective gaze of the Emperor.<br><br><strong>Effect: </strong>The Infernum Halo Launcher can be activated as a Reflexive Action whenever the vehicle it is attached to is targeted by an attack. When it is activated, the vehicle's Defence is increased by +4 until the start of the next Round.</p>",
"value": 9,
"keywords": "IMPERIUM, FLYER, ADEPTUS ASTARTES",
"effect": "",
"test": {
"self": false
}
},
"_id": "lSu6Rrrr9F11Sw3I",
"img": "modules/wng-core/assets/icons/gear/gear.webp",
"effects": [],
"sort": 0,
"flags": {},
"_stats": {
"coreVersion": "13.348",
"systemId": "wrath-and-glory",
"systemVersion": "7.1.1",
"createdTime": 1758058691816,
"modifiedTime": 1758058691816,
"lastModifiedBy": "ETeghv7x8fjtIEKK"
},
"ownership": {
"default": 0
}
},
{
"name": "Flare Launcher",
"folder": "kYNF8JUlpf9Syo2d",
"type": "gear",
"system": {
"quantity": 1,
"rarity": "common",
"description": "<p>Often used as an inexpensive signalling device, the Flare Launcher has seen activity as a method to hamper enemy targeting by using obscuring smoke.<br><br><strong>Effect: </strong>Flare Launchers are loaded with 6 Flares and can be fired using a Simple Action. When a vehicle fires a Flare, it gains +2 Defence against shooting attacks until the end of the following Round. Any allies on bikes within 12 metres of that vehicle treat their Speed as 6 higher in the Turn the Flare was fired.</p>",
"value": 4,
"keywords": "IMPERIUM",
"effect": "",
"test": {
"self": false
}
},
"_id": "dszzCx9DCO0u3wAz",
"img": "modules/wng-core/assets/icons/gear/gear.webp",
"effects": [],
"sort": 0,
"flags": {},
"_stats": {
"coreVersion": "13.348",
"systemId": "wrath-and-glory",
"systemVersion": "7.1.1",
"createdTime": 1758058693804,
"modifiedTime": 1758058693804,
"lastModifiedBy": "ETeghv7x8fjtIEKK"
},
"ownership": {
"default": 0
}
},
{
"name": "Orbital Comms Array",
"folder": "kYNF8JUlpf9Syo2d",
"type": "gear",
"system": {
"quantity": 1,
"rarity": "very-rare",
"description": "<p>The advanced communications technology of the Orbital Comms Array allows warriors on the ground to call down a veritable Armageddon of firepower from the colossal weaponry of Imperial Cruisers in the void.<br><br><strong>Effect: </strong>A vehicle with an operational Orbital Comms Array is treated as having the @UUID[Compendium.wng-core.items.Item.0QAqbjjgBCYl78LT]{Bombardment} Talent, which can be used once per session by anyone aboard the vehicle.</p>",
"value": 6,
"keywords": "IMPERIUM, [ANY]",
"effect": "",
"test": {
"self": false
}
},
"_id": "HRJKhtfgKDtUKKrw",
"img": "modules/wng-core/assets/icons/gear/gear.webp",
"effects": [],
"sort": 0,
"flags": {},
"_stats": {
"coreVersion": "13.348",
"systemId": "wrath-and-glory",
"systemVersion": "7.1.1",
"createdTime": 1758058703904,
"modifiedTime": 1758058703904,
"lastModifiedBy": "ETeghv7x8fjtIEKK"
},
"ownership": {
"default": 0
}
},
{
"name": "Shield Dome",
"folder": "kYNF8JUlpf9Syo2d",
"type": "gear",
"system": {
"quantity": 1,
"rarity": "very-rare",
"description": "<p>A large Refractor Field designed to cloak an entire vehicle with advanced protective energies, a Shield Dome is a rare device using the height of Imperial vehicular technology.<br><br><strong>Effect: </strong>A Shield Dome can only be installed on a Huge or larger vehicle. A vehicle with a Shield Dome gains +3* Resilience.</p>",
"value": 7,
"keywords": "ADEPTUS ASTARTES, PRIMARIS, TANK, TRANSPORT, RAIDER",
"effect": "",
"test": {
"self": false
}
},
"_id": "L97wk36wXap5CFFg",
"img": "modules/wng-core/assets/icons/gear/gear.webp",
"effects": [],
"sort": 0,
"flags": {},
"_stats": {
"coreVersion": "13.348",
"systemId": "wrath-and-glory",
"systemVersion": "7.1.1",
"createdTime": 1758058715745,
"modifiedTime": 1758058715745,
"lastModifiedBy": "ETeghv7x8fjtIEKK"
},
"ownership": {
"default": 0
}
},
{
"_id": "srbBTA7HY8MfSS8V",
"name": "Heavy Bolter (Requires Arvus to be unsealed for use)",
"type": "weapon",
"img": "modules/wng-core/assets/icons/weapons/heavy-bolter.webp",
"effects": [],
"sort": 0,
"flags": {
"wng-core": {
"initialization-folder": "Weapons",
"sort": 0
},
"core": {},
"LocknKey": {
"IDKeysFlag": "",
"RemoveKeyonUseFlag": false,
"LPFormulaFlag": "",
"LPFormulaOverrideFlag": false,
"LBFormulaFlag": "",
"LBFormulaOverrideFlag": false,
"ReplacementItemFlag": ""
}
},
"system": {
"quantity": 1,
"rarity": "uncommon",
"description": "<p>The outsized brother of the cousin, these heavy weapons are as terrifying as one would expect. With sustained fire these huge guns can reduce heavily armoured infantry and light vehicles to naught but unrecognizable chunks of smouldering ruin.</p><p></p><p>It is a bolter that can be used only from the loading ramp of the ship for strafing or ground support.</p>",
"value": 6,
"keywords": "BOLT, IMPERIUM",
"equipped": false,
"attack": {
"base": 0,
"bonus": 0,
"rank": "none"
},
"damage": {
"base": 12,
"bonus": 0,
"rank": 0,
"ed": {
"base": 2,
"bonus": 0,
"rank": 0,
"dice": ""
},
"ap": {
"base": -1,
"bonus": 0,
"rank": 0,
"dice": ""
},
"enabled": false,
"otherDamage": {
"mortal": "0",
"wounds": "0",
"shock": "0"
},
"dice": ""
},
"ed": {
"base": 0,
"bonus": 0,
"rank": 0
},
"ap": {
"base": 0,
"bonus": 0,
"rank": 0
},
"category": "ranged",
"range": {
"short": 18,
"medium": 36,
"long": 54,
"melee": 1,
"thrown": null
},
"ammo": {
"id": ""
},
"salvo": 3,
"traits": {
"list": [
{
"name": "brutal"
},
{
"rating": "4",
"name": "heavy"
},
{
"rating": "4",
"name": "rapidFire"
}
]
},
"upgrades": [],
"otherDamage": {},
"combi": {
"id": ""
},
"twinned": false
},
"_stats": {
"coreVersion": "13.348",
"systemId": "wrath-and-glory",
"systemVersion": "7.1.1",
"createdTime": 1758058742526,
"modifiedTime": 1758058803595,
"lastModifiedBy": "ETeghv7x8fjtIEKK"
},
"folder": "85dkcvhBYli5TJrZ",
"ownership": {
"default": 0
}
}
],
"effects": [],
"flags": {},
"_stats": {
"coreVersion": "13.348",
"systemId": "wrath-and-glory",
"systemVersion": "7.1.1",
"createdTime": 1758058442675,
"modifiedTime": 1758059324353,
"lastModifiedBy": "ETeghv7x8fjtIEKK",
"exportSource": {
"worldId": "gilead2",
"uuid": "Actor.hF4mUyX99AMTa5MI",
"coreVersion": "13.348",
"systemId": "wrath-and-glory",
"systemVersion": "7.1.1"
}
},
"ownership": {
"default": 0
},
"_id": "hF4mUyX99AMTa5MI"
}
@@ -0,0 +1,661 @@
{
"folder": null,
"name": "Valkyrie \"Mloniya 1\"",
"type": "vehicle",
"img": "modules/wng-cos/assets/tokens/valkyrie.webp",
"system": {
"complement": {
"pilot": 1,
"crew": 3,
"passenger": 12,
"list": []
},
"mnvr": 6,
"rarity": "rare",
"value": 13,
"traits": {
"list": [
{
"name": "flyer"
},
{
"name": "hover"
},
{
"name": "reliable"
},
{
"name": "sealed"
},
{
"name": "turboBoost",
"rating": "8"
}
]
},
"combat": {
"size": "gargantuan",
"speed": 115,
"wounds": {
"value": 0,
"bonus": 0,
"max": 15
},
"resilience": {
"bonus": 0,
"total": 15
},
"defence": {
"bonus": 0
},
"fly": 0
},
"notes": "<p>The Valkyrie serves the Imperium as a versatile and reliable aerial weapons platform. It can also deploy and extricate ground troops with ease due to its VTOL capabilities and high speed. Combining these aspects with respectable armour and easily customisable weaponry, the Valkyrie is an invaluable asset to the Imperiums military forces.</p><p>Though technically under the purview of the Imperial Navy, Valkyries are usually despatched to support Imperial Guard deployments of all types, from small sorties to full-scale battles. For beleaguered ground troops, the scream of their engines is always a welcome sound.</p><p></p><p>A <strong>Valkyrie</strong> may replace its @UUID[Compendium.wng-cos.items.Item.BEa8lO6vFyNa45Bl]{Hellstrike Missile}s with 2 @UUID[Compendium.wng-cos.items.Item.xTgz0HUZYa3SW0XK]{Multiple Rocket Pods}, and its @UUID[Compendium.wng-cos.items.Item.XtRh1VndguW93hzA]{Multi-Laser} with a @UUID[Compendium.wng-core.items.Item.x1Ouy4jFDseOnm26]{Lascannon}.</p>",
"settings": {
"hidePassengers": false
}
},
"prototypeToken": {
"name": "Valkyrie",
"displayName": 20,
"actorLink": false,
"appendNumber": false,
"prependAdjective": false,
"texture": {
"src": "modules/wng-cos/assets/tokens/valkyrie.webp",
"scaleX": 1,
"scaleY": 1,
"offsetX": 0,
"offsetY": 0,
"rotation": 0,
"anchorX": 0.5,
"anchorY": 0.5,
"fit": "contain",
"tint": "#ffffff",
"alphaThreshold": 0.75
},
"width": 4,
"height": 4,
"lockRotation": false,
"rotation": 0,
"alpha": 1,
"disposition": 0,
"displayBars": 20,
"bar1": {
"attribute": "combat.wounds"
},
"bar2": {
"attribute": null
},
"light": {
"alpha": 0.5,
"angle": 360,
"bright": 0,
"coloration": 1,
"dim": 0,
"attenuation": 0.5,
"luminosity": 0.5,
"saturation": 0,
"contrast": 0,
"shadows": 0,
"animation": {
"type": null,
"speed": 5,
"intensity": 5,
"reverse": false
},
"darkness": {
"min": 0,
"max": 1
},
"negative": false,
"priority": 0,
"color": null
},
"sight": {
"enabled": false,
"range": 0,
"angle": 360,
"visionMode": "basic",
"attenuation": 0.1,
"brightness": 0,
"saturation": 0,
"contrast": 0,
"color": null
},
"detectionModes": [],
"flags": {},
"randomImg": false,
"occludable": {
"radius": 0
},
"ring": {
"enabled": false,
"colors": {
"ring": null,
"background": null
},
"effects": 1,
"subject": {
"scale": 1,
"texture": null
}
},
"turnMarker": {
"mode": 1,
"animation": null,
"src": null,
"disposition": false
},
"movementAction": null
},
"items": [
{
"_id": "c1eM1YGFaqKckprQ",
"name": "IMPERIUM",
"type": "keyword",
"img": "modules/wng-core/assets/ui/aquila-white.webp",
"effects": [],
"flags": {
"wng-core": {
"initialization-folder": "Keywords",
"sort": 3500000
},
"core": {}
},
"system": {
"description": "<p>The vast interstellar empire of Humanity that spans over a million worlds, led by the Emperor from Holy Terra. </p>"
},
"_stats": {
"coreVersion": "13.348",
"systemId": "wrath-and-glory",
"systemVersion": "7.1.1",
"lastModifiedBy": null
},
"folder": "SXjZUgQ1pROPVE9j",
"sort": 0,
"ownership": {
"default": 0
}
},
{
"_id": "AIDhVkSIsCH9Jfbx",
"name": "AERONAUTICA IMPERIALIS",
"type": "keyword",
"img": "modules/wng-core/assets/ui/aquila-white.webp",
"effects": [],
"flags": {
"wng-core": {
"initialization-folder": "Keywords",
"sort": 2100000
},
"core": {}
},
"system": {
"description": "<p>The Aeronautica Imperialis are part of the Navis Imperialis, and are responsible for Imperial in-atmosphere aviation. </p>"
},
"_stats": {
"coreVersion": "13.348",
"systemId": "wrath-and-glory",
"systemVersion": "7.1.1",
"lastModifiedBy": null
},
"folder": "SXjZUgQ1pROPVE9j",
"sort": 0,
"ownership": {
"default": 0
}
},
{
"_id": "xmheh9BsPxK1eYk3",
"name": "ASTRA MILITARUM",
"type": "keyword",
"img": "modules/wng-core/assets/factions/astra-militarum.svg",
"effects": [],
"flags": {
"wng-core": {
"initialization-folder": "Keywords",
"sort": 2500000
},
"core": {}
},
"system": {
"description": "<p>The largest military force of the Imperium, numbering billions of mortal Humans. </p>"
},
"_stats": {
"coreVersion": "13.348",
"systemId": "wrath-and-glory",
"systemVersion": "7.1.1",
"lastModifiedBy": null
},
"folder": "SXjZUgQ1pROPVE9j",
"sort": 0,
"ownership": {
"default": 0
}
},
{
"name": "FLYER",
"type": "keyword",
"img": "modules/wng-core/assets/ui/aquila-white.webp",
"_id": "P02iUsdpBLqaajhN",
"system": {
"description": ""
},
"effects": [],
"folder": null,
"sort": 0,
"flags": {},
"_stats": {
"coreVersion": "13.348",
"systemId": "wrath-and-glory",
"systemVersion": "7.1.1",
"lastModifiedBy": null
},
"ownership": {
"default": 0
}
},
{
"name": "Multi-Laser",
"type": "weapon",
"folder": "5Cdtq3mpuTzh76fA",
"system": {
"quantity": 1,
"rarity": "uncommon",
"description": "<p>A rapid-firing and more deadly version Imperial Lasgun, the Multi-Laser utilises massive amounts of energy to fire powerful lasers at high speed. It is extremely effective at dispatching massed infantry and light vehicles with searing barrages.</p>",
"value": 8,
"keywords": "LAS, IMPERIUM, ASTRA MILITARUM",
"equipped": true,
"attack": {
"base": 0,
"bonus": 0,
"rank": "none"
},
"damage": {
"base": 12,
"bonus": 0,
"rank": 0,
"ed": {
"base": 4,
"bonus": 0,
"rank": 0
},
"ap": {
"base": 0,
"bonus": 0,
"rank": 0
},
"otherDamage": {
"mortal": "0",
"wounds": "0",
"shock": "0"
},
"enabled": false
},
"ed": {
"base": 0,
"bonus": 0,
"rank": "none"
},
"ap": {
"base": 0,
"bonus": 0,
"rank": "none"
},
"category": "ranged",
"range": {
"short": 18,
"medium": 36,
"long": 54,
"melee": 1,
"thrown": null
},
"ammo": {
"id": "y7oQWqUSmIZQElme"
},
"salvo": 4,
"traits": {
"list": [
{
"rating": "Large",
"name": "mounted"
},
{
"rating": "2",
"name": "rapidFire"
},
{
"name": "reliable"
}
]
},
"upgrades": [],
"combi": {},
"twinned": false,
"otherDamage": {}
},
"_id": "XtRh1VndguW93hzA",
"img": "modules/wng-core/assets/icons/weapons/lascannon.webp",
"effects": [],
"sort": 1600000,
"flags": {},
"_stats": {
"coreVersion": "13.348",
"systemId": "wrath-and-glory",
"systemVersion": "7.1.1",
"lastModifiedBy": null
},
"ownership": {
"default": 0
}
},
{
"_id": "clL2gyHJYJKReJqS",
"name": "Heavy Bolter",
"type": "weapon",
"img": "modules/wng-core/assets/icons/weapons/heavy-bolter.webp",
"effects": [],
"flags": {
"wng-core": {
"initialization-folder": "Weapons",
"sort": 0
},
"core": {}
},
"system": {
"quantity": 2,
"rarity": "uncommon",
"description": "The outsized brother of the cousin, these heavy weapons are as terrifying as one would expect. With sustained fire these huge guns can reduce heavily armoured infantry and light vehicles to naught but unrecognizable chunks of smouldering ruin.",
"value": 6,
"keywords": "BOLT, IMPERIUM",
"equipped": true,
"attack": {
"base": 0,
"bonus": 0,
"rank": "none"
},
"damage": {
"base": 12,
"bonus": 0,
"rank": 0,
"ed": {
"base": 2,
"bonus": 0,
"rank": 0
},
"ap": {
"base": 0,
"bonus": 0,
"rank": 0
},
"otherDamage": {
"mortal": "0",
"wounds": "0",
"shock": "0"
},
"enabled": false
},
"ed": {
"base": 0,
"bonus": 0,
"rank": "none"
},
"ap": {
"base": 0,
"bonus": 0,
"rank": "none"
},
"category": "ranged",
"range": {
"short": 18,
"medium": 36,
"long": 54,
"melee": 1,
"thrown": null
},
"ammo": {
"id": "QkaAGj8DRZmexAls"
},
"salvo": 3,
"traits": {
"list": [
{
"name": "brutal"
},
{
"rating": "4",
"name": "heavy"
},
{
"rating": "4",
"name": "rapidFire"
}
]
},
"upgrades": [],
"combi": {},
"twinned": false,
"otherDamage": {}
},
"_stats": {
"coreVersion": "13.348",
"systemId": "wrath-and-glory",
"systemVersion": "7.1.1",
"lastModifiedBy": null
},
"folder": "85dkcvhBYli5TJrZ",
"sort": 0,
"ownership": {
"default": 0
}
},
{
"name": "Hellstrike Missile",
"type": "weapon",
"folder": "apWp4JadfC6T9kpt",
"system": {
"quantity": 2,
"rarity": "rare",
"description": "<p>Similar to the @UUID[Compendium.wng-cos.items.Item.vFDen8DywXkNBu8K]{Hunter-Killer Missile} Missile, the Hellstrike allows Imperial aircraft to provide effective ground support</p>",
"value": 5,
"keywords": "EXPLOSIVE, IMPERIUM, AERONAUTICA IMPERIALIS",
"equipped": true,
"attack": {
"base": 0,
"bonus": 0,
"rank": "none"
},
"damage": {
"base": 14,
"bonus": 0,
"rank": 0,
"ed": {
"base": 3,
"bonus": 0,
"rank": 0
},
"ap": {
"base": -2,
"bonus": 0,
"rank": 0
},
"otherDamage": {
"mortal": "0",
"wounds": "0",
"shock": "0"
},
"enabled": false
},
"ed": {
"base": 0,
"bonus": 0,
"rank": "none"
},
"ap": {
"base": 0,
"bonus": 0,
"rank": "none"
},
"category": "launcher",
"range": {
"short": 36,
"medium": 72,
"long": 108,
"melee": 1,
"thrown": null
},
"ammo": {
"id": "DiQpmuvNoEtRY7yg"
},
"salvo": 0,
"traits": {
"list": [
{
"rating": "4",
"name": "blast"
},
{
"name": "brutal"
},
{
"rating": "Huge",
"name": "mounted"
}
]
},
"upgrades": [],
"combi": {},
"twinned": false,
"otherDamage": {}
},
"_id": "gI7Vt1hsNXXenFcp",
"img": "modules/wng-core/assets/icons/weapons/missile-launcher.webp",
"effects": [],
"sort": 0,
"flags": {
"core": {}
},
"_stats": {
"coreVersion": "13.348",
"systemId": "wrath-and-glory",
"systemVersion": "7.1.1",
"lastModifiedBy": null
},
"ownership": {
"default": 0
}
},
{
"name": "Multi-Laser Ammo",
"type": "ammo",
"img": "modules/wng-core/assets/icons/ammo/ammo.webp",
"_id": "y7oQWqUSmIZQElme",
"system": {
"quantity": 10,
"rarity": "common",
"description": "",
"value": 0,
"keywords": "",
"effect": "",
"traits": {
"list": []
}
},
"effects": [],
"folder": null,
"sort": 0,
"flags": {},
"_stats": {
"coreVersion": "13.348",
"systemId": "wrath-and-glory",
"systemVersion": "7.1.1",
"lastModifiedBy": null
},
"ownership": {
"default": 0
}
},
{
"name": "Heavy Bolter Ammo",
"type": "ammo",
"img": "modules/wng-core/assets/icons/ammo/ammo.webp",
"_id": "QkaAGj8DRZmexAls",
"system": {
"quantity": 20,
"rarity": "common",
"description": "",
"value": 0,
"keywords": "",
"effect": "",
"traits": {
"list": []
}
},
"effects": [],
"folder": null,
"sort": 0,
"flags": {},
"_stats": {
"coreVersion": "13.348",
"systemId": "wrath-and-glory",
"systemVersion": "7.1.1",
"lastModifiedBy": null
},
"ownership": {
"default": 0
}
},
{
"name": "Hellstrike Missile Ammo",
"type": "ammo",
"img": "modules/wng-core/assets/icons/ammo/ammo.webp",
"_id": "DiQpmuvNoEtRY7yg",
"system": {
"quantity": 20,
"rarity": "common",
"description": "",
"value": 0,
"keywords": "",
"effect": "",
"traits": {
"list": []
}
},
"effects": [],
"folder": null,
"sort": 0,
"flags": {},
"_stats": {
"coreVersion": "13.348",
"systemId": "wrath-and-glory",
"systemVersion": "7.1.1",
"lastModifiedBy": null
},
"ownership": {
"default": 0
}
}
],
"effects": [],
"flags": {},
"_stats": {
"coreVersion": "13.348",
"systemId": "wrath-and-glory",
"systemVersion": "7.1.1",
"createdTime": 1758058994839,
"modifiedTime": 1758059059038,
"lastModifiedBy": "ETeghv7x8fjtIEKK",
"exportSource": {
"worldId": "gilead2",
"uuid": "Actor.s4qSSaRJokNOfjkm",
"coreVersion": "13.348",
"systemId": "wrath-and-glory",
"systemVersion": "7.1.1"
}
},
"ownership": {
"default": 0
},
"_id": "s4qSSaRJokNOfjkm"
}
@@ -0,0 +1,65 @@
{
"name": "Aegis of Titan (Ability)",
"type": "talent",
"img": "icons/svg/aura.svg",
"_id": "WpiwdDYb43gYCaoZ",
"effects": [
{
"_id": "CZVs8Y7RVFIExaHs",
"label": "Aegis of Titan — Innate Purity",
"icon": "icons/svg/aura.svg",
"origin": "",
"disabled": false,
"duration": {
"startTime": null
},
"changes": [
{
"key": "system.combat.resolve.bonus",
"mode": 2,
"value": 1,
"priority": 20
}
],
"transfer": true,
"flags": {}
},
{
"_id": "fRopUvWWkFv6OzO4",
"label": "Aegis of Titan — Aegis Synergy",
"icon": "icons/svg/upgrade.svg",
"origin": "",
"disabled": true,
"duration": {
"startTime": null
},
"changes": [
{
"key": "system.combat.resolve.bonus",
"mode": 2,
"value": 1,
"priority": 20
}
],
"transfer": true,
"flags": {}
}
],
"flags": {
"core": {},
"wng-core": {
"initialization-folder": "Talents",
"sort": 0
}
},
"folder": null,
"system": {
"description": "Innate purity (+1 vs Corruption) and +1 while equipped with Aegis (toggle Synergy).",
"keywords": "IMPERIUM, ADEPTUS ASTARTES, GREY KNIGHTS"
},
"_stats": {
"coreVersion": "13.347",
"systemId": "wrath-and-glory",
"systemVersion": "7.1.1"
}
}
@@ -0,0 +1,61 @@
{
"name": "Aegis of Titan (Ability)",
"type": "ability",
"img": "icons/svg/aura.svg",
"_id": "3SQI68UqiAewIU1y",
"effects": [
{
"_id": "5suMwN6MqzHdEg4V",
"name": "Aegis of Titan — Innate Purity",
"icon": "icons/svg/aura.svg",
"origin": "",
"disabled": false,
"duration": {
"startTime": null
},
"changes": [
{
"key": "system.combat.resolve.bonus",
"mode": 2,
"value": 1,
"priority": 20
}
],
"transfer": true,
"flags": {}
},
{
"_id": "Bp0mJSit3PToM3N3",
"name": "Aegis of Titan — Aegis Synergy",
"icon": "icons/svg/upgrade.svg",
"origin": "",
"disabled": true,
"duration": {
"startTime": null
},
"changes": [
{
"key": "system.combat.resolve.bonus",
"mode": 2,
"value": 1,
"priority": 20
}
],
"transfer": true,
"flags": {}
}
],
"flags": {
"core": {}
},
"folder": null,
"system": {
"description": "Innate purity (+1 vs Corruption). While equipped with Aegis armour, enable Synergy for an additional +1 vs Corruption.",
"keywords": "IMPERIUM, ADEPTUS ASTARTES, GREY KNIGHTS, INQUISITION, DAEMONHUNTERS, ORDO MALLEUS"
},
"_stats": {
"coreVersion": "13.347",
"systemId": "wrath-and-glory",
"systemVersion": "7.1.1"
}
}
@@ -0,0 +1,104 @@
{
"name": "Aegis Power Armour",
"type": "armour",
"img": "icons/svg/shield.svg",
"effects": [
{
"_id": "WzCZif9l1GFukRaE",
"name": "Aegis Wards (Constant)",
"icon": "icons/svg/aura.svg",
"origin": "",
"disabled": false,
"duration": {
"startTime": null
},
"changes": [
{
"key": "system.skills.psychicMastery.bonus",
"mode": 2,
"value": 1,
"priority": 20
},
{
"key": "system.combat.resolve.bonus",
"mode": 2,
"value": 1,
"priority": 20
}
],
"tint": null,
"transfer": true,
"flags": {}
},
{
"_id": "D27fn83cJnvlfpC4",
"name": "Aegis Warding Runes (Toggle)",
"icon": "icons/svg/explosion.svg",
"origin": "",
"disabled": true,
"duration": {
"startTime": null
},
"changes": [
{
"key": "system.combat.resilience.bonus",
"mode": 2,
"value": 1,
"priority": 20
},
{
"key": "system.combat.defence.bonus",
"mode": 2,
"value": -1,
"priority": 20
}
],
"tint": null,
"transfer": true,
"flags": {}
}
],
"flags": {
"wng-core": {
"initialization-folder": "Armour",
"sort": 0
},
"core": {}
},
"system": {
"quantity": 1,
"rarity": "veryRare",
"description": "<p>Grey Knights sanctified power armour with hexagrammic wards and storm bolter forearm mount.</p><ul><li><b>AR 5</b>; <b>Powered (3)</b>.</li><li><b>Aegis (integrated):</b> Constant: +1 die to Deny the Witch and +1 die to resist Corruption.</li><li><b>Toggle (Action):</b> Aegis Warding Runes — runes glow; +1 Resilience, 1 Defence (vs ranged).</li></ul>",
"value": 9,
"keywords": "POWERED, IMPERIUM, ADEPTUS ASTARTES, GREY KNIGHTS, INQUISITION, DAEMONHUNTERS, ORDO MALLEUS",
"equipped": false,
"rating": 5,
"base": 0,
"traits": {
"list": [
{
"name": "powered",
"rating": "3"
}
]
},
"invulnerable": false
},
"_stats": {
"coreVersion": "13.347",
"systemId": "wrath-and-glory",
"systemVersion": "7.1.1",
"createdTime": 1755779886550,
"modifiedTime": 1755779886550,
"lastModifiedBy": "8fThFXcxV83JCCcX",
"exportSource": {
"worldId": "gilead-wandg",
"uuid": "Item.sTGTpOfbIveLcFul",
"coreVersion": "13.347",
"systemId": "wrath-and-glory",
"systemVersion": "7.1.1"
}
},
"folder": "K59Lb8PvaCmIrviu",
"_id": "pTSF0G0Cvx4PzPXI"
}
@@ -0,0 +1,87 @@
{
"name": "Aegis (Psychic Hood) — Grey Knights",
"type": "gear",
"img": "modules/wng-core/assets/icons/gear/psychic-hood.webp",
"_id": "Niy9qzL63nlyNyzs",
"effects": [
{
"_id": "c2bj13jQg1uIz1Od",
"name": "Warding Runes Engaged (Toggle)",
"icon": "icons/svg/explosion.svg",
"origin": "",
"disabled": true,
"duration": {
"startTime": null
},
"changes": [
{
"key": "system.combat.resilience.bonus",
"mode": 2,
"value": 1,
"priority": 20
},
{
"key": "system.combat.defence.bonus",
"mode": 2,
"value": -1,
"priority": 20
}
],
"tint": null,
"transfer": true,
"flags": {}
},
{
"_id": "8wTAyZmZZ1hYMZDd",
"name": "Aegis Wards (Constant)",
"icon": "icons/svg/aura.svg",
"origin": "",
"disabled": false,
"duration": {
"startTime": null
},
"changes": [
{
"key": "system.skills.psychicMastery.bonus",
"mode": 2,
"value": 1,
"priority": 20
},
{
"key": "system.combat.resolve.bonus",
"mode": 2,
"value": 1,
"priority": 20
}
],
"tint": null,
"transfer": true,
"flags": {}
}
],
"flags": {
"core": {},
"wng-core": {
"initialization-folder": "Gear",
"sort": 0
}
},
"folder": null,
"system": {
"quantity": 1,
"rarity": "veryRare",
"description": "<p>Hexagrammic wards and sanctified psychic hood.</p><p><b>Toggle (Action):</b> Warding Runes Engaged — +1 Resilience, 1 Defence (vs ranged). <b>Constant:</b> +1 die to Deny the Witch; +1 die vs Corruption.</p>",
"value": 9,
"keywords": "IMPERIUM, ADEPTUS ASTARTES, GREY KNIGHTS, PSYCHIC HOOD",
"equipped": false,
"effect": "",
"test": {
"self": false
}
},
"_stats": {
"coreVersion": "13.347",
"systemId": "wrath-and-glory",
"systemVersion": "7.1.1"
}
}
@@ -0,0 +1,283 @@
{
"name": "Grey Knight (Archetype)",
"type": "archetype",
"img": "modules/wng-forsaken/assets/actors/archetype-astartes-librarian.webp",
"effects": [
{
"_id": "I76csFVFAcWAA4Zz",
"label": "Aegis of Titan — Innate Purity",
"icon": "icons/svg/aura.svg",
"origin": "",
"disabled": false,
"duration": {
"startTime": null
},
"changes": [
{
"key": "system.combat.resolve.bonus",
"mode": 2,
"value": 1,
"priority": 20
}
],
"transfer": true,
"flags": {}
}
],
"flags": {
"wng-forsaken": {
"initialization-folder": "Archetypes",
"sort": 0
},
"core": {}
},
"system": {
"tier": 4,
"journal": "DMmW708Q5AQvQfuy",
"species": {
"name": "Adeptus Astartes",
"id": "KpwHo0A92bR7iVMB"
},
"faction": {
"name": "Adeptus Astartes",
"id": "CN5E9Z5GqfiR1MDn"
},
"influence": 2,
"cost": 359,
"keywords": [
"IMPERIUM",
"ADEPTUS ASTARTES",
"GREY KNIGHTS"
],
"attributes": {
"strength": 5,
"toughness": 5,
"agility": 5,
"initiative": 5,
"willpower": 6,
"intellect": 3,
"fellowship": null
},
"skills": {
"athletics": 3,
"awareness": 3,
"ballisticSkill": 5,
"cunning": null,
"deception": null,
"insight": null,
"intimidation": null,
"investigation": null,
"leadership": null,
"medicae": null,
"persuasion": null,
"pilot": null,
"psychicMastery": 4,
"scholar": 2,
"stealth": 3,
"survival": 1,
"tech": null,
"weaponSkill": 5
},
"ability": {
"id": "",
"name": "Aegis of Titan",
"description": "Innate Purity: +1 vs Corruption. Aegis Synergy: +1 vs Corruption while equipped with Aegis. Reroll 1 die on Deny the Witch each round."
},
"wargear": {
"structure": {
"type": "and",
"groupId": "root",
"id": "root",
"options": [
{
"type": "option",
"index": 0,
"groupId": "cj0fha0grf41pcv4",
"id": "cj0fha0grf41pcv4"
},
{
"type": "option",
"index": 1,
"groupId": "a89wca5qifs6kga9",
"id": "a89wca5qifs6kga9"
},
{
"type": "option",
"index": 2,
"groupId": "7za8qa72jedhuct9",
"id": "7za8qa72jedhuct9"
},
{
"type": "option",
"index": 3,
"groupId": "q3jc5brs0mr50azx",
"id": "q3jc5brs0mr50azx"
},
{
"type": "option",
"index": 4,
"groupId": "lz6z45ef5goceln6",
"id": "lz6z45ef5goceln6"
},
{
"type": "option",
"index": 5,
"groupId": "xuev8a8qyfhywpzn",
"id": "xuev8a8qyfhywpzn"
}
]
},
"options": [
{
"name": "Mk VII Astartes Power Armour",
"type": "item",
"id": "cj0fha0grf41pcv4",
"diff": {
"name": "Mk VII Astartes Power Armour"
},
"documentId": "7Bp1rDIfKEB2MB9N",
"idType": "id",
"filters": []
},
{
"name": "Psychic Hood",
"type": "item",
"id": "a89wca5qifs6kga9",
"diff": {
"name": "Psychic Hood"
},
"documentId": "qKIlaAhu9RZ63l1N",
"idType": "id",
"filters": []
},
{
"name": "Bolt Pistol",
"type": "item",
"id": "7za8qa72jedhuct9",
"diff": {
"name": "Bolt Pistol"
},
"documentId": "7b2xcPWBB7up65PM",
"idType": "id",
"filters": []
},
{
"name": "Force Stave",
"type": "item",
"id": "q3jc5brs0mr50azx",
"diff": {
"name": "Force Stave"
},
"documentId": "9vfkaU0vc61t7hKO",
"idType": "id",
"filters": []
},
{
"name": "Frag Grenades",
"type": "item",
"id": "lz6z45ef5goceln6",
"diff": {
"name": "Frag Grenades",
"data": {
"quantity": 3
}
},
"documentId": "oDG9YpSKSiSUFLIY",
"idType": "id",
"filters": []
},
{
"name": "Krak Grenades",
"type": "item",
"id": "xuev8a8qyfhywpzn",
"diff": {
"name": "Krak Grenades",
"data": {
"quantity": 3
}
},
"documentId": "SJ8UaYHEMtF71W1M",
"idType": "id",
"filters": []
}
],
"freeItems": [
{
"id": "",
"name": "Nemesis Force Halberd"
},
{
"id": "",
"name": "Aegis (Psychic Hood) — Grey Knights"
},
{
"id": "",
"name": "Astartes Storm Bolter (Aegis Mount)"
},
{
"id": "",
"name": "Frag Grenade"
},
{
"id": "",
"name": "Krak Grenade"
},
{
"id": "",
"name": "Trinket (Chapter Relic Shard)"
}
]
},
"suggested": {
"attributes": {
"strength": null,
"toughness": null,
"agility": null,
"initiative": null,
"willpower": null,
"intellect": null,
"fellowship": null
},
"skills": {
"athletics": null,
"awareness": null,
"ballisticSkill": null,
"cunning": null,
"deception": null,
"insight": null,
"intimidation": null,
"investigation": null,
"leadership": null,
"medicae": null,
"persuasion": null,
"pilot": null,
"psychicMastery": null,
"scholar": null,
"stealth": null,
"survival": null,
"tech": null,
"weaponSkill": null
},
"talents": {
"list": []
}
}
},
"_stats": {
"coreVersion": "13.347",
"systemId": "wrath-and-glory",
"systemVersion": "7.1.1",
"createdTime": 1755771384639,
"modifiedTime": 1755771384639,
"lastModifiedBy": "8fThFXcxV83JCCcX",
"exportSource": {
"worldId": "gilead-wandg",
"uuid": "Item.TCmE7YmUDUVQ3xoz",
"coreVersion": "13.347",
"systemId": "wrath-and-glory",
"systemVersion": "7.1.1"
}
},
"folder": "DEb55m6iVZ0NUOxA",
"_id": "VLHxIxgzHvpG706F"
}
@@ -0,0 +1,290 @@
{
"name": "Grey Knight (Archetype)",
"type": "archetype",
"img": "icons/svg/book.svg",
"effects": [
{
"_id": "T0IpNmU0xjFwmcwr",
"name": "Aegis of Titan — Innate Purity",
"icon": "icons/svg/aura.svg",
"origin": "",
"disabled": false,
"duration": {
"startTime": null
},
"changes": [
{
"key": "system.combat.resolve.bonus",
"mode": 2,
"value": 1,
"priority": 20
}
],
"transfer": true,
"flags": {}
}
],
"flags": {
"wng-forsaken": {
"initialization-folder": "Archetypes",
"sort": 0
},
"core": {}
},
"system": {
"tier": 4,
"journal": "DMmW708Q5AQvQfuy",
"species": {
"name": "Adeptus Astartes",
"id": "KpwHo0A92bR7iVMB"
},
"faction": {
"name": "Adeptus Astartes",
"id": "CN5E9Z5GqfiR1MDn"
},
"influence": 2,
"cost": 359,
"keywords": [
"IMPERIUM",
"ADEPTUS ASTARTES",
"GREY KNIGHTS",
"INQUISITION",
"DAEMONHUNTERS",
"ORDO MALLEUS"
],
"attributes": {
"strength": 5,
"toughness": 5,
"agility": 5,
"initiative": 5,
"willpower": 6,
"intellect": 3,
"fellowship": null
},
"skills": {
"athletics": 3,
"awareness": 3,
"ballisticSkill": 5,
"cunning": null,
"deception": null,
"insight": null,
"intimidation": null,
"investigation": null,
"leadership": null,
"medicae": null,
"persuasion": null,
"pilot": null,
"psychicMastery": 4,
"scholar": 2,
"stealth": 3,
"survival": 1,
"tech": null,
"weaponSkill": 5
},
"ability": {
"id": "",
"name": "Aegis of Titan",
"description": "Innate Purity: +1 vs Corruption. Aegis Synergy: +1 vs Corruption while equipped with Aegis armour. Re-roll 1 die on Deny the Witch each round."
},
"wargear": {
"structure": {
"type": "and",
"groupId": "root",
"id": "root",
"options": [
{
"type": "option",
"index": 0,
"groupId": "cj0fha0grf41pcv4",
"id": "cj0fha0grf41pcv4"
},
{
"type": "option",
"index": 1,
"groupId": "a89wca5qifs6kga9",
"id": "a89wca5qifs6kga9"
},
{
"type": "option",
"index": 2,
"groupId": "7za8qa72jedhuct9",
"id": "7za8qa72jedhuct9"
},
{
"type": "option",
"index": 3,
"groupId": "q3jc5brs0mr50azx",
"id": "q3jc5brs0mr50azx"
},
{
"type": "option",
"index": 4,
"groupId": "lz6z45ef5goceln6",
"id": "lz6z45ef5goceln6"
},
{
"type": "option",
"index": 5,
"groupId": "xuev8a8qyfhywpzn",
"id": "xuev8a8qyfhywpzn"
}
]
},
"options": [
{
"name": "Mk VII Astartes Power Armour",
"type": "item",
"id": "cj0fha0grf41pcv4",
"diff": {
"name": "Mk VII Astartes Power Armour"
},
"documentId": "7Bp1rDIfKEB2MB9N",
"idType": "id",
"filters": []
},
{
"name": "Psychic Hood",
"type": "item",
"id": "a89wca5qifs6kga9",
"diff": {
"name": "Psychic Hood"
},
"documentId": "qKIlaAhu9RZ63l1N",
"idType": "id",
"filters": []
},
{
"name": "Bolt Pistol",
"type": "item",
"id": "7za8qa72jedhuct9",
"diff": {
"name": "Bolt Pistol"
},
"documentId": "7b2xcPWBB7up65PM",
"idType": "id",
"filters": []
},
{
"name": "Force Stave",
"type": "item",
"id": "q3jc5brs0mr50azx",
"diff": {
"name": "Force Stave"
},
"documentId": "9vfkaU0vc61t7hKO",
"idType": "id",
"filters": []
},
{
"name": "Frag Grenades",
"type": "item",
"id": "lz6z45ef5goceln6",
"diff": {
"name": "Frag Grenades",
"data": {
"quantity": 3
}
},
"documentId": "oDG9YpSKSiSUFLIY",
"idType": "id",
"filters": []
},
{
"name": "Krak Grenades",
"type": "item",
"id": "xuev8a8qyfhywpzn",
"diff": {
"name": "Krak Grenades",
"data": {
"quantity": 3
}
},
"documentId": "SJ8UaYHEMtF71W1M",
"idType": "id",
"filters": []
}
],
"freeItems": [
{
"id": "",
"name": "Nemesis Force Halberd"
},
{
"id": "",
"name": "Aegis Power Armour"
},
{
"id": "",
"name": "Grey Knight Armour Integrated Storm Bolter"
},
{
"id": "",
"name": "Aegis of Titan (Ability)"
},
{
"id": "",
"name": "Frag Grenade"
},
{
"id": "",
"name": "Krak Grenade"
},
{
"id": "",
"name": "Trinket (Chapter Relic Shard)"
}
]
},
"suggested": {
"attributes": {
"strength": null,
"toughness": null,
"agility": null,
"initiative": null,
"willpower": null,
"intellect": null,
"fellowship": null
},
"skills": {
"athletics": null,
"awareness": null,
"ballisticSkill": null,
"cunning": null,
"deception": null,
"insight": null,
"intimidation": null,
"investigation": null,
"leadership": null,
"medicae": null,
"persuasion": null,
"pilot": null,
"psychicMastery": null,
"scholar": null,
"stealth": null,
"survival": null,
"tech": null,
"weaponSkill": null
},
"talents": {
"list": []
}
}
},
"_stats": {
"coreVersion": "13.347",
"systemId": "wrath-and-glory",
"systemVersion": "7.1.1",
"createdTime": 1755771384639,
"modifiedTime": 1755771384639,
"lastModifiedBy": "8fThFXcxV83JCCcX",
"exportSource": {
"worldId": "gilead-wandg",
"uuid": "Item.TCmE7YmUDUVQ3xoz",
"coreVersion": "13.347",
"systemId": "wrath-and-glory",
"systemVersion": "7.1.1"
}
},
"folder": "DEb55m6iVZ0NUOxA",
"_id": "AhWvgUliU6XV5GFT"
}
@@ -0,0 +1,99 @@
{
"folder": "9ke9KBkf4wjqg6Gg",
"name": "Bile Squig",
"type": "weapon",
"img": "modules/wng-core/assets/icons/weapons/melee-weapon.webp",
"system": {
"quantity": 1,
"rarity": "uncommon",
"description": "<p>Squig Launcher ammunition is a living, conscious being. Its effect on the battlefield has been simplified to that of a projectile, but if you wish to run a squiggly beast as a combatant, you can use the following profile: @UUID[Compendium.wng-cos.actors.Actor.6TQklyAQ4v1RWRPv]{Bile Squig}.</p>",
"value": 2,
"keywords": "ORK, SQUIG",
"equipped": false,
"attack": {
"base": 0,
"bonus": 0,
"rank": "none"
},
"damage": {
"base": 10,
"bonus": 0,
"rank": 0,
"ap": {
"base": 0,
"bonus": 0,
"rank": 0
},
"ed": {
"base": 3,
"bonus": 0,
"rank": 0
},
"otherDamage": {
"mortal": "0",
"wounds": "0",
"shock": "0"
},
"enabled": false
},
"ed": {
"base": 0,
"bonus": 0,
"rank": "none"
},
"ap": {
"base": 0,
"bonus": 0,
"rank": "none"
},
"category": "grenade-missile",
"range": {
"short": 0,
"medium": 0,
"long": 0,
"melee": null,
"thrown": null
},
"ammo": {
"id": ""
},
"salvo": 0,
"traits": {
"list": [
{
"name": "blast",
"rating": "8"
},
{
"name": "inflict",
"rating": "Poisoned 2"
}
]
},
"upgrades": [],
"combi": {},
"twinned": false,
"otherDamage": {}
},
"effects": [],
"flags": {},
"_stats": {
"coreVersion": "13.348",
"systemId": "wrath-and-glory",
"systemVersion": "7.1.1",
"createdTime": 1758136200481,
"modifiedTime": 1758136200481,
"lastModifiedBy": "ETeghv7x8fjtIEKK",
"exportSource": {
"worldId": "gilead2",
"uuid": "Item.SLT8t7m3UHZ1v5dq",
"coreVersion": "13.348",
"systemId": "wrath-and-glory",
"systemVersion": "7.1.1"
}
},
"ownership": {
"default": 0
},
"_id": "SLT8t7m3UHZ1v5dq"
}
@@ -0,0 +1,44 @@
{
"name": "Bolt",
"type": "ammo",
"img": "modules/wng-core/assets/icons/ammo/bolt.webp",
"effects": [],
"flags": {
"wng-core": {
"initialization-folder": "Ammo",
"sort": -50000
},
"core": {}
},
"system": {
"quantity": 0,
"rarity": "uncommon",
"description": "",
"value": 2,
"keywords": "",
"effect": "",
"traits": {
"list": []
}
},
"_stats": {
"coreVersion": "13.348",
"systemId": "wrath-and-glory",
"systemVersion": "7.1.1",
"createdTime": 1758136282162,
"modifiedTime": 1758136282162,
"lastModifiedBy": "ETeghv7x8fjtIEKK",
"exportSource": {
"worldId": "gilead2",
"uuid": "Item.Y1Xc0ybqJdgJEFFP",
"coreVersion": "13.348",
"systemId": "wrath-and-glory",
"systemVersion": "7.1.1"
}
},
"folder": "fyz06Xz1z4Pqj4BP",
"ownership": {
"default": 0
},
"_id": "Y1Xc0ybqJdgJEFFP"
}
@@ -0,0 +1,104 @@
{
"name": "Grey Knight Armour Integrated Storm Bolter",
"type": "weapon",
"img": "icons/svg/gun.svg",
"effects": [],
"flags": {
"wng-core": {
"initialization-folder": "Weapons",
"sort": 0
},
"core": {}
},
"system": {
"quantity": 1,
"rarity": "rare",
"description": "<p>Integrated forearm storm bolter. <b>Integrated:</b> does not occupy hands; may fire while wielding twohanded melee. Treat as Pistol for firing in melee.</p>",
"value": 4,
"keywords": "BOLT, INTEGRATED, IMPERIUM, ADEPTUS ASTARTES, GREY KNIGHTS, INQUISITION, DAEMONHUNTERS, ORDO MALLEUS",
"equipped": false,
"attack": {
"base": 0,
"bonus": 0,
"rank": "none"
},
"damage": {
"base": 10,
"bonus": 0,
"rank": 0,
"ed": {
"base": 2,
"bonus": 0,
"rank": 0
},
"ap": {
"base": 0,
"bonus": 0,
"rank": 0
},
"enabled": false,
"otherDamage": {
"mortal": "0",
"wounds": "0",
"shock": "0"
}
},
"ed": {
"base": 0,
"bonus": 0,
"rank": 0
},
"ap": {
"base": 0,
"bonus": 0,
"rank": 0
},
"category": "ranged",
"range": {
"short": 12,
"medium": 24,
"long": 36,
"melee": 1,
"thrown": null
},
"ammo": {
"id": ""
},
"salvo": 1,
"traits": {
"list": [
{
"name": "brutal"
},
{
"name": "pistol"
},
{
"name": "rapidFire",
"rating": "2"
}
]
},
"upgrades": [],
"otherDamage": {},
"combi": {},
"twinned": false
},
"_stats": {
"coreVersion": "13.347",
"systemId": "wrath-and-glory",
"systemVersion": "7.1.1",
"createdTime": 1755779945407,
"modifiedTime": 1755779945407,
"lastModifiedBy": "8fThFXcxV83JCCcX",
"exportSource": {
"worldId": "gilead-wandg",
"uuid": "Item.Seza6hxnXhHInk8m",
"coreVersion": "13.347",
"systemId": "wrath-and-glory",
"systemVersion": "7.1.1"
}
},
"folder": "85dkcvhBYli5TJrZ",
"_id": "1R3iq7EsPdCYkMiU"
}
@@ -0,0 +1,108 @@
{
"name": "Heavy Bolter",
"type": "weapon",
"img": "modules/wng-core/assets/icons/weapons/heavy-bolter.webp",
"effects": [],
"flags": {
"wng-core": {
"initialization-folder": "Weapons",
"sort": 0
},
"core": {}
},
"system": {
"quantity": 1,
"rarity": "uncommon",
"description": "The outsized brother of the cousin, these heavy weapons are as terrifying as one would expect. With sustained fire these huge guns can reduce heavily armoured infantry and light vehicles to naught but unrecognizable chunks of smouldering ruin.",
"value": 6,
"keywords": "BOLT, IMPERIUM",
"equipped": false,
"attack": {
"base": 0,
"bonus": 0,
"rank": "none"
},
"damage": {
"base": 12,
"bonus": 0,
"rank": 0,
"ed": {
"base": 2,
"bonus": 0,
"rank": 0
},
"ap": {
"base": -1,
"bonus": 0,
"rank": 0
},
"enabled": false,
"otherDamage": {
"mortal": "0",
"wounds": "0",
"shock": "0"
}
},
"ed": {
"base": 0,
"bonus": 0,
"rank": 0
},
"ap": {
"base": 0,
"bonus": 0,
"rank": 0
},
"category": "ranged",
"range": {
"short": 18,
"medium": 36,
"long": 54,
"melee": 1,
"thrown": null
},
"ammo": {
"id": ""
},
"salvo": 3,
"traits": {
"list": [
{
"name": "brutal"
},
{
"rating": "4",
"name": "heavy"
},
{
"rating": "4",
"name": "rapidFire"
}
]
},
"upgrades": [],
"otherDamage": {},
"combi": {},
"twinned": false
},
"_stats": {
"coreVersion": "13.348",
"systemId": "wrath-and-glory",
"systemVersion": "7.1.1",
"createdTime": 1758136294829,
"modifiedTime": 1758136294829,
"lastModifiedBy": "ETeghv7x8fjtIEKK",
"exportSource": {
"worldId": "gilead2",
"uuid": "Item.ut6nsTPR0xL4mfET",
"coreVersion": "13.348",
"systemId": "wrath-and-glory",
"systemVersion": "7.1.1"
}
},
"folder": "85dkcvhBYli5TJrZ",
"ownership": {
"default": 0
},
"_id": "ut6nsTPR0xL4mfET"
}
@@ -0,0 +1,95 @@
{
"name": "Heavy Squig Launcha",
"type": "weapon",
"folder": "vmJPLFnHHoDwT4DM",
"system": {
"quantity": 1,
"rarity": "uncommon",
"description": "<p>A larger version of the primitive weapon that propels murderous Orkoids known as Squigs wherever an Ork sees fit. Whenever you fire a Heavy Squig Launcha, you can fire a Bile, Bitey, or Boom Squig.</p><ul><li><p>@UUID[Compendium.wng-cos.items.Item.SLT8t7m3UHZ1v5dq]{Bile Squig}</p></li><li><p>@UUID[Compendium.wng-cos.items.Item.LkjqUWSEfH14D9Jj]{Bitey Squig}</p></li><li><p>@UUID[Compendium.wng-cos.items.Item.QHcZdjZBknkZq39u]{Boom Squig}</p></li></ul>",
"value": 6,
"keywords": "ORK, SQUIG",
"equipped": false,
"attack": {
"base": 0,
"bonus": 0,
"rank": "none"
},
"damage": {
"base": 0,
"bonus": 0,
"rank": 0,
"ed": {
"base": 0,
"bonus": 0,
"rank": 0
},
"ap": {
"base": 0,
"bonus": 0,
"rank": 0
},
"otherDamage": {
"mortal": "0",
"wounds": "0",
"shock": "0"
},
"enabled": false
},
"ed": {
"base": 0,
"bonus": 0,
"rank": "none"
},
"ap": {
"base": 0,
"bonus": 0,
"rank": "none"
},
"category": "launcher",
"range": {
"short": 18,
"medium": 36,
"long": 54,
"melee": 1,
"thrown": null
},
"ammo": {
"id": ""
},
"salvo": null,
"traits": {
"list": [
{
"rating": "4",
"name": "heavy"
}
]
},
"upgrades": [],
"combi": {},
"twinned": false,
"otherDamage": {}
},
"img": "modules/wng-core/assets/icons/weapons/ranged-weapon.webp",
"effects": [],
"flags": {},
"_stats": {
"coreVersion": "13.348",
"systemId": "wrath-and-glory",
"systemVersion": "7.1.1",
"createdTime": 1758136217894,
"modifiedTime": 1758136217894,
"lastModifiedBy": "ETeghv7x8fjtIEKK",
"exportSource": {
"worldId": "gilead2",
"uuid": "Item.ft1Rx5y4pKSoBvxj",
"coreVersion": "13.348",
"systemId": "wrath-and-glory",
"systemVersion": "7.1.1"
}
},
"ownership": {
"default": 0
},
"_id": "ft1Rx5y4pKSoBvxj"
}
@@ -0,0 +1,169 @@
{
"name": "Hellfire Bolt Rounds",
"type": "ammo",
"img": "modules/wng-core/assets/icons/ammo/hellfire-bolt-rounds.webp",
"effects": [
{
"_id": "Omr8RqQpJAAj66Cz",
"changes": [],
"disabled": false,
"duration": {
"startTime": null,
"seconds": null,
"combat": null,
"rounds": null,
"turns": null,
"startRound": null,
"startTurn": null
},
"transfer": false,
"flags": {
"wrath-and-glory": {
"description": "",
"changeCondition": {
"0": {
"script": "",
"description": "Inorganic Target"
},
"1": {
"script": "",
"description": "Organic Target"
}
},
"manualEffectKeys": false
}
},
"tint": "#ffffff",
"origin": null,
"name": "Hellfire Bolt Rounds",
"description": "",
"statuses": [],
"_stats": {
"coreVersion": "13.348",
"systemId": "wrath-and-glory",
"systemVersion": "7.1.1",
"lastModifiedBy": null
},
"img": "modules/wng-core/assets/icons/ammo/hellfire-bolt-rounds.webp",
"type": "base",
"system": {
"transferData": {
"documentType": "Item",
"type": "document",
"originalType": "document",
"avoidTest": {
"value": "none",
"opposed": false,
"prevention": true,
"reversed": false
},
"testIndependent": false,
"equipTransfer": false,
"selfOnly": false,
"prompt": false,
"area": {
"templateData": {
"borderColor": null,
"fillColor": null,
"texture": null
},
"keep": false,
"aura": {
"transferred": false,
"render": false
},
"duration": "sustained"
},
"zone": {
"type": "zone",
"transferred": false,
"traits": {},
"skipImmediateOnPlacement": false,
"keep": false
}
},
"scriptData": [
{
"script": "[Script.kfxaiFWAqWgb57Xj]",
"label": "Organic Target",
"trigger": "dialog",
"options": {
"targeter": false,
"hideScript": "",
"activateScript": "",
"submissionScript": "",
"deleteEffect": false,
"defending": false
},
"async": false
},
{
"script": "[Script.tmtDBU0AvKlGUXUi]",
"label": "Inorganic Target",
"trigger": "dialog",
"options": {
"targeter": false,
"hideScript": "",
"activateScript": "",
"submissionScript": "",
"deleteEffect": false,
"defending": false
},
"async": false
}
],
"itemTargetData": {
"ids": [],
"allItems": false
},
"zone": {
"type": "zone",
"traits": {},
"skipImmediateOnPlacement": false
},
"sourceData": {
"test": {}
}
},
"sort": 0
}
],
"flags": {
"wng-core": {
"initialization-folder": "Ammo",
"sort": 0
},
"core": {}
},
"system": {
"quantity": 1,
"rarity": "very-rare",
"description": "<p>Developed to combat Tyranids, a vial of mutagenic acid replaces the core and tip of these rounds. As the round strikes, thousands of tiny needles splinter and rip through the vial, injecting the accumulated acid directly into exposed flesh.&nbsp;</p>\n<p><strong>Effect</strong>: +3 ED against organic targets.&nbsp;+2 ED against inorganic targets.</p>",
"value": 6,
"keywords": "IMPERIUM, ADEPTUS ASTARTES",
"effect": "",
"traits": {
"list": []
}
},
"_stats": {
"coreVersion": "13.348",
"systemId": "wrath-and-glory",
"systemVersion": "7.1.1",
"createdTime": 1758143070187,
"modifiedTime": 1758143070187,
"lastModifiedBy": "ETeghv7x8fjtIEKK",
"exportSource": {
"worldId": "gilead2",
"uuid": "Item.ZIXiS264WZhHapZS",
"coreVersion": "13.348",
"systemId": "wrath-and-glory",
"systemVersion": "7.1.1"
}
},
"folder": "fyz06Xz1z4Pqj4BP",
"ownership": {
"default": 0
},
"_id": "ZIXiS264WZhHapZS"
}
@@ -0,0 +1,98 @@
{
"name": "Hurricane Bolter",
"type": "weapon",
"folder": "5Cdtq3mpuTzh76fA",
"system": {
"quantity": 1,
"rarity": "rare",
"description": "<p>A Hurricane Bolter comprises six interlinked Boltguns mounted on a single vehicle sponson, multiplying the deadly force of the Adeptus Astartes iconic weapon.</p>",
"value": 8,
"keywords": "BOLT, IMPERIUM, ADEPTUS ASTARTES",
"equipped": false,
"attack": {
"base": 0,
"bonus": 0,
"rank": "none"
},
"damage": {
"base": 10,
"bonus": 0,
"rank": 0,
"ap": {
"base": 0,
"bonus": 0,
"rank": 0
},
"ed": {
"base": 2,
"bonus": 0,
"rank": 0
},
"otherDamage": {
"mortal": "0",
"wounds": "0",
"shock": "0"
},
"enabled": false
},
"ed": {
"base": 0,
"bonus": 0,
"rank": "none"
},
"ap": {
"base": 0,
"bonus": 0,
"rank": "none"
},
"category": "ranged",
"range": {
"short": 12,
"medium": 24,
"long": 36,
"melee": 1,
"thrown": null
},
"ammo": {
"id": ""
},
"salvo": 6,
"traits": {
"list": [
{
"name": "brutal"
},
{
"rating": "6",
"name": "rapidFire"
}
]
},
"upgrades": [],
"combi": {},
"twinned": false,
"otherDamage": {}
},
"img": "modules/wng-core/assets/icons/weapons/heavy-bolter.webp",
"effects": [],
"flags": {},
"_stats": {
"coreVersion": "13.348",
"systemId": "wrath-and-glory",
"systemVersion": "7.1.1",
"createdTime": 1758136183738,
"modifiedTime": 1758136183738,
"lastModifiedBy": "ETeghv7x8fjtIEKK",
"exportSource": {
"worldId": "gilead2",
"uuid": "Item.BXNJ0R8o0E29pOpe",
"coreVersion": "13.348",
"systemId": "wrath-and-glory",
"systemVersion": "7.1.1"
}
},
"ownership": {
"default": 0
},
"_id": "BXNJ0R8o0E29pOpe"
}
@@ -0,0 +1,137 @@
{
"name": "Kraken Bolt Rounds",
"type": "ammo",
"img": "modules/wng-core/assets/icons/ammo/kraken-bolt-rounds.webp",
"effects": [
{
"_id": "KgRfIVCDblNxCy9m",
"changes": [
{
"key": "system.damage.ap.bonus",
"mode": 2,
"value": "-2",
"priority": null
}
],
"disabled": false,
"duration": {
"startTime": null,
"seconds": null,
"combat": null,
"rounds": null,
"turns": null,
"startRound": null,
"startTurn": null
},
"transfer": false,
"flags": {
"wrath-and-glory": {
"description": "",
"manualEffectKeys": true
}
},
"tint": "#ffffff",
"origin": null,
"name": "Kraken Bolt Rounds",
"description": "",
"statuses": [],
"_stats": {
"coreVersion": "13.348",
"systemId": "wrath-and-glory",
"systemVersion": "7.1.1",
"lastModifiedBy": null
},
"img": "modules/wng-core/assets/icons/ammo/kraken-bolt-rounds.webp",
"type": "base",
"system": {
"transferData": {
"type": "document",
"originalType": "document",
"documentType": "Actor",
"avoidTest": {
"value": "none",
"opposed": false,
"prevention": true,
"reversed": false
},
"testIndependent": false,
"equipTransfer": false,
"selfOnly": false,
"prompt": false,
"area": {
"templateData": {
"borderColor": null,
"fillColor": null,
"texture": null
},
"keep": false,
"aura": {
"transferred": false,
"render": false
},
"duration": "sustained"
},
"zone": {
"type": "zone",
"transferred": false,
"traits": {},
"skipImmediateOnPlacement": false,
"keep": false
}
},
"itemTargetData": {
"ids": [],
"allItems": false
},
"scriptData": [],
"zone": {
"type": "zone",
"traits": {},
"skipImmediateOnPlacement": false
},
"sourceData": {
"test": {}
}
},
"sort": 0
}
],
"flags": {
"wng-core": {
"initialization-folder": "Ammo",
"sort": 0
},
"core": {}
},
"system": {
"quantity": 1,
"rarity": "very-rare",
"description": "<p>These powerful armour-piercing Bolt shells possess a solid adamantium core delivered by a powerful propellant. Upon impact, the outer casing peels away, allowing the high-velocity adamantium penetrator to accelerate further into the target before its payload detonates.</p>\n<p><strong>Effect</strong>: AP -2</p>",
"value": 6,
"keywords": "IMPERIUM, ADEPTUS ASTARTES",
"effect": "",
"traits": {
"list": []
}
},
"_stats": {
"coreVersion": "13.348",
"systemId": "wrath-and-glory",
"systemVersion": "7.1.1",
"createdTime": 1758143095932,
"modifiedTime": 1758143095932,
"lastModifiedBy": "ETeghv7x8fjtIEKK",
"exportSource": {
"worldId": "gilead2",
"uuid": "Item.p42CwuqBal2u2iLw",
"coreVersion": "13.348",
"systemId": "wrath-and-glory",
"systemVersion": "7.1.1"
}
},
"folder": "fyz06Xz1z4Pqj4BP",
"ownership": {
"default": 0
},
"_id": "p42CwuqBal2u2iLw"
}
@@ -0,0 +1,103 @@
{
"name": "Nemesis Force Halberd",
"type": "weapon",
"img": "modules/wng-core/assets/icons/weapons/force-stave.webp",
"effects": [],
"flags": {
"wng-core": {
"initialization-folder": "Weapons",
"sort": 0
},
"core": {}
},
"system": {
"quantity": 1,
"rarity": "uncommon",
"description": "Force Staves are laced with a complex psy-matrix that allows them to act as a psychic battery, storing psychic energy that can be released with brutal efficiency.<p><em>Nemesis:</em> vs DAEMON/PSYKER: +1 ED (homebrew). TwoHanded.</p>",
"value": 2,
"keywords": "FORCE, AELDARI, 2-HANDED, INQUISITION, ADEPTUS ASTARTES, ADEPTUS ASTRA TELEPATHICA, GREY KNIGHTS",
"equipped": false,
"attack": {
"base": 0,
"bonus": 0,
"rank": "none"
},
"damage": {
"base": 4,
"bonus": 0,
"rank": 0,
"ap": {
"base": -1,
"bonus": 0,
"rank": 0
},
"ed": {
"base": 2,
"bonus": 0,
"rank": 0
},
"enabled": false,
"otherDamage": {
"mortal": "0",
"wounds": "0",
"shock": "0"
}
},
"ed": {
"base": 0,
"bonus": 0,
"rank": 0
},
"ap": {
"base": 0,
"bonus": 0,
"rank": 0
},
"category": "melee",
"range": {
"short": 0,
"medium": 0,
"long": 0,
"melee": 2,
"thrown": null
},
"ammo": {
"id": ""
},
"salvo": 0,
"traits": {
"list": [
{
"name": "brutal"
},
{
"name": "force"
},
{
"name": "twoHanded"
}
]
},
"upgrades": [],
"otherDamage": {},
"combi": {},
"twinned": false
},
"_stats": {
"coreVersion": "13.347",
"systemId": "wrath-and-glory",
"systemVersion": "7.1.1",
"createdTime": 1755779931196,
"modifiedTime": 1755779931196,
"lastModifiedBy": "8fThFXcxV83JCCcX",
"exportSource": {
"worldId": "gilead-wandg",
"uuid": "Item.9vfkaU0vc61t7hKO",
"coreVersion": "13.347",
"systemId": "wrath-and-glory",
"systemVersion": "7.1.1"
}
},
"folder": "85dkcvhBYli5TJrZ",
"_id": "m1dt3VuFzdGxMgaC"
}
@@ -0,0 +1,103 @@
{
"name": "Nemesis Force Halberd",
"type": "weapon",
"img": "icons/svg/sword.svg",
"effects": [],
"flags": {
"wng-core": {
"initialization-folder": "Weapons",
"sort": 0
},
"core": {}
},
"system": {
"quantity": 1,
"rarity": "uncommon",
"description": "Force Staves are laced with a complex psy-matrix that allows them to act as a psychic battery, storing psychic energy that can be released with brutal efficiency.<p><em>Nemesis:</em> vs DAEMON/PSYKER: +1 ED (homebrew). TwoHanded.</p>",
"value": 2,
"keywords": "IMPERIUM, ADEPTUS ASTARTES, GREY KNIGHTS, INQUISITION, DAEMONHUNTERS, ORDO MALLEUS, MELEE, FORCE",
"equipped": false,
"attack": {
"base": 0,
"bonus": 0,
"rank": "none"
},
"damage": {
"base": 4,
"bonus": 0,
"rank": 0,
"ap": {
"base": -1,
"bonus": 0,
"rank": 0
},
"ed": {
"base": 2,
"bonus": 0,
"rank": 0
},
"enabled": false,
"otherDamage": {
"mortal": "0",
"wounds": "0",
"shock": "0"
}
},
"ed": {
"base": 0,
"bonus": 0,
"rank": 0
},
"ap": {
"base": 0,
"bonus": 0,
"rank": 0
},
"category": "melee",
"range": {
"short": 0,
"medium": 0,
"long": 0,
"melee": 2,
"thrown": null
},
"ammo": {
"id": ""
},
"salvo": 0,
"traits": {
"list": [
{
"name": "brutal"
},
{
"name": "force"
},
{
"name": "twoHanded"
}
]
},
"upgrades": [],
"otherDamage": {},
"combi": {},
"twinned": false
},
"_stats": {
"coreVersion": "13.347",
"systemId": "wrath-and-glory",
"systemVersion": "7.1.1",
"createdTime": 1755779931196,
"modifiedTime": 1755779931196,
"lastModifiedBy": "8fThFXcxV83JCCcX",
"exportSource": {
"worldId": "gilead-wandg",
"uuid": "Item.9vfkaU0vc61t7hKO",
"coreVersion": "13.347",
"systemId": "wrath-and-glory",
"systemVersion": "7.1.1"
}
},
"folder": "85dkcvhBYli5TJrZ",
"_id": "O68u3VzArlrZwwFb"
}
@@ -0,0 +1,90 @@
{
"name": "Pilgrim Astartes Plate (Disguise Armour)",
"type": "armour",
"img": "modules/wng-core/assets/icons/armour/terminator-armour.webp",
"effects": [
{
"_id": "44rACWx99MiXXe4E",
"name": "Pilgrim Disguise Penalties",
"icon": "icons/svg/downgrade.svg",
"origin": "",
"disabled": false,
"duration": {
"startTime": null,
"seconds": null,
"turns": null,
"startRound": null,
"startTurn": null
},
"changes": [
{
"key": "system.attributes.agility.bonus",
"mode": 2,
"value": -1,
"priority": 20
},
{
"key": "system.skills.stealth.bonus",
"mode": 2,
"value": -1,
"priority": 20
},
{
"key": "system.combat.speed",
"mode": 2,
"value": -1,
"priority": 20
}
],
"tint": null,
"transfer": true,
"flags": {}
}
],
"flags": {
"wng-core": {
"initialization-folder": "Armour",
"sort": 0
},
"core": {}
},
"system": {
"quantity": 1,
"rarity": "rare",
"description": "<p>Scavenged Black Templars plate, patched & lightened. Designed for incognito operations.</p><ul><li><b>AR 4</b>; <b>Powered (1)</b>; <b>Cumbersome</b>.</li><li><b>Penalty (Active Effect):</b> 1 die to Agility- and Stealth-based Tests while worn; 1 Speed (homebrew).</li><li>Appears as Templar armour at a glance; close inspection may reveal inconsistencies.</li></ul>",
"value": 6,
"keywords": "POWERED, IMPERIUM, ADEPTUS ASTARTES, BLACK TEMPLARS (DISGUISE)",
"equipped": true,
"rating": 4,
"base": 0,
"traits": {
"list": [
{
"name": "cumbersome"
},
{
"name": "powered",
"rating": "1"
}
]
},
"invulnerable": false
},
"_stats": {
"coreVersion": "13.347",
"systemId": "wrath-and-glory",
"systemVersion": "7.1.1",
"createdTime": 1755779886550,
"modifiedTime": 1755779886550,
"lastModifiedBy": "8fThFXcxV83JCCcX",
"exportSource": {
"worldId": "gilead-wandg",
"uuid": "Item.sTGTpOfbIveLcFul",
"coreVersion": "13.347",
"systemId": "wrath-and-glory",
"systemVersion": "7.1.1"
}
},
"folder": "K59Lb8PvaCmIrviu",
"_id": "2P2HioialQdFUCv6"
}
@@ -0,0 +1,104 @@
{
"name": "Astartes Storm Bolter (Aegis Mount)",
"type": "weapon",
"img": "modules/wng-core/assets/icons/weapons/bolt-pistol.webp",
"effects": [],
"flags": {
"wng-core": {
"initialization-folder": "Weapons",
"sort": 0
},
"core": {}
},
"system": {
"quantity": 1,
"rarity": "rare",
"description": "<p>Integrated storm bolter module. <b>Integrated:</b> does not occupy hands; may fire while wielding twohanded melee. Treat as Pistol for firing in melee.</p>",
"value": 4,
"keywords": "BOLT, IMPERIUM, ADEPTUS ASTARTES, GREY KNIGHTS, INTEGRATED",
"equipped": false,
"attack": {
"base": 0,
"bonus": 0,
"rank": "none"
},
"damage": {
"base": 10,
"bonus": 0,
"rank": 0,
"ed": {
"base": 2,
"bonus": 0,
"rank": 0
},
"ap": {
"base": 0,
"bonus": 0,
"rank": 0
},
"enabled": false,
"otherDamage": {
"mortal": "0",
"wounds": "0",
"shock": "0"
}
},
"ed": {
"base": 0,
"bonus": 0,
"rank": 0
},
"ap": {
"base": 0,
"bonus": 0,
"rank": 0
},
"category": "ranged",
"range": {
"short": 12,
"medium": 24,
"long": 36,
"melee": 1,
"thrown": null
},
"ammo": {
"id": ""
},
"salvo": 1,
"traits": {
"list": [
{
"name": "brutal"
},
{
"name": "pistol"
},
{
"name": "rapidFire",
"rating": "2"
}
]
},
"upgrades": [],
"otherDamage": {},
"combi": {},
"twinned": false
},
"_stats": {
"coreVersion": "13.347",
"systemId": "wrath-and-glory",
"systemVersion": "7.1.1",
"createdTime": 1755779945407,
"modifiedTime": 1755779945407,
"lastModifiedBy": "8fThFXcxV83JCCcX",
"exportSource": {
"worldId": "gilead-wandg",
"uuid": "Item.Seza6hxnXhHInk8m",
"coreVersion": "13.347",
"systemId": "wrath-and-glory",
"systemVersion": "7.1.1"
}
},
"folder": "85dkcvhBYli5TJrZ",
"_id": "fUottZHaIQ6IhPH8"
}
@@ -0,0 +1,107 @@
{
"name": "Terminator Aegis (Grey Knights)",
"type": "armour",
"img": "icons/svg/tower.svg",
"effects": [
{
"_id": "0f6j24Bb5F9IltEj",
"name": "Aegis Wards (Constant)",
"icon": "icons/svg/aura.svg",
"origin": "",
"disabled": false,
"duration": {
"startTime": null
},
"changes": [
{
"key": "system.skills.psychicMastery.bonus",
"mode": 2,
"value": 1,
"priority": 20
},
{
"key": "system.combat.resolve.bonus",
"mode": 2,
"value": 1,
"priority": 20
}
],
"tint": null,
"transfer": true,
"flags": {}
},
{
"_id": "fABPJslze9yrrlcc",
"name": "Aegis Warding Runes (Toggle)",
"icon": "icons/svg/explosion.svg",
"origin": "",
"disabled": true,
"duration": {
"startTime": null
},
"changes": [
{
"key": "system.combat.resilience.bonus",
"mode": 2,
"value": 1,
"priority": 20
},
{
"key": "system.combat.defence.bonus",
"mode": 2,
"value": -1,
"priority": 20
}
],
"tint": null,
"transfer": true,
"flags": {}
}
],
"flags": {
"wng-core": {
"initialization-folder": "Armour",
"sort": 0
},
"core": {}
},
"system": {
"quantity": 1,
"rarity": "artifact",
"description": "<p>Grey Knights Tactical Dreadnought armour with Aegis wards and storm bolter hardmount.</p><ul><li><b>AR 7</b>; <b>Powered (4)</b>; <b>Cumbersome</b>; counts as Large while worn.</li><li><b>Aegis (integrated):</b> Constant: +1 die to Deny the Witch and +1 die to resist Corruption.</li><li><b>Toggle (Action):</b> Aegis Warding Runes — +1 Resilience, 1 Defence (vs ranged).</li></ul>",
"value": 10,
"keywords": "POWERED, IMPERIUM, ADEPTUS ASTARTES, GREY KNIGHTS, INQUISITION, DAEMONHUNTERS, ORDO MALLEUS",
"equipped": false,
"rating": 7,
"base": 0,
"traits": {
"list": [
{
"name": "cumbersome"
},
{
"name": "powered",
"rating": "4"
}
]
},
"invulnerable": false
},
"_stats": {
"coreVersion": "13.347",
"systemId": "wrath-and-glory",
"systemVersion": "7.1.1",
"createdTime": 1755779886550,
"modifiedTime": 1755779886550,
"lastModifiedBy": "8fThFXcxV83JCCcX",
"exportSource": {
"worldId": "gilead-wandg",
"uuid": "Item.sTGTpOfbIveLcFul",
"coreVersion": "13.347",
"systemId": "wrath-and-glory",
"systemVersion": "7.1.1"
}
},
"folder": "K59Lb8PvaCmIrviu",
"_id": "vq0e5MD7FXcEqQFi"
}
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+49
View File
@@ -0,0 +1,49 @@
component_name,category,mount,scale,strength,damage,crit_rating,range_vu,power,space,sp,availability,special_rules_notes,book_sources,needs_review
Mars-pattern Macrocannon Broadside (Frigate Scale),Macrocannon,Dorsal,Raider/Frigate,3,1d10+2,5,6,4,2,1,UNKN,"Standard macrobattery for escorts; broadside-equivalent on dorsal for small hulls.",Core (Table 8-4),
Mars-pattern Macrocannon Broadside (Cruiser Scale),Macrocannon,Port/Starboard,Cruiser/Battlecruiser,6,1d10+2,5,6,4,5,1,UNKN,Standard cruiser macrobroadside component.,Core (Table 8-4),
Sunsear Laser Battery (Frigate Scale),Laser Battery,Dorsal,Raider/Frigate,4,1d10+2,4,9,6,4,1,UNKN,High accuracy laser macrobattery used by escorts.,Core (Table 8-4),
Sunsear Laser Battery (Cruiser Scale),Laser Battery,Port/Starboard,Cruiser/Battlecruiser,6,1d10+2,4,9,9,6,1,UNKN,Cruiser-grade laser macrobattery.,Supplemental Table 4-2,
Dorsal Lance Battery (Frigate Grade),Lance,Dorsal,Frigate,1,1d10+2,3,5,6,4,2,UNKN,Single/double lance mount for escorts.,Core (Table 8-4),
Prow Lance Battery (Light Cruiser),Lance,Prow,Light Cruiser,1,1d10+4,3,6,9,4,2,UNKN,Iconic Dauntless prow lance fit.,Core (Table 8-4),
Port/Starboard Lance Battery (Cruiser),Lance,Port/Starboard,Cruiser/Battlecruiser,2,1d10+4,3,6,13,6,2,UNKN,Heavy lance broadside for line ships.,Core (Table 8-4),
Voss-pattern Torpedo Tubes,Torpedo Tubes,Prow,Escort/Light Cruiser/Cruiser,2,UNKN,UNKN,UNKN,1,5,1,UNKN,"As seen on Falchion (prow slot pre-equipped; half ammo, +1 Power).",Core (Table 1-9),
Standard Torpedo Tubes (Cruiser Pattern),Torpedo Tubes,Prow,Cruiser/Battlecruiser,6,UNKN,UNKN,UNKN,2,8,2,UNKN,Generic torpedo tube component for cruiser-sized hulls.,Core (Table 1-9),
Jovian-pattern Launch Bay,Launch Bay,Port/Starboard,Light Cruiser/Cruiser/Battlecruiser,2,UNKN,UNKN,UNKN,1,6,2,UNKN,"Carrier component for attack craft (Fury/Starhawk wings).",Core (Table 1-9),
Nova Cannon,Nova Cannon,Prow,Cruiser/Battlecruiser,SPECIAL,2d5+4,SPECIAL,640,3,7,3,UNKN,"Superheavy prow weapon; unique ammo rules.",Core (Table 1-9),check_table
Plasma Battery (Cruiser Grade),Plasma Battery,Port/Starboard,Cruiser/Battlecruiser,4,1d10+4,4,5,7,4,2,UNKN,"If present in BFK as a distinct macrobattery type; verify exact name/statline.",Core (Table 8-4),
Bombardment Cannons,Macrocannon,Port/Starboard,Light Cruiser/Cruiser,3,1d10+6,2,4,5,5,3,UNKN,Heavy bombardment macrobattery.,Core (Table 1-9),
Disruption Macrocannons,Macrocannon,Any,All Ships,3,1d10+1,0,5,4,2,2,UNKN,"Mount varies by hull: Dorsal on escorts; Port/Starboard on larger hulls.",Core (Table 1-9),
Disruption Macrocannon Broadside,Macrocannon,Port/Starboard,Light Cruiser/Cruiser,6,1d10+1,0,5,6,5,2,UNKN,Broadside variant.,Core (Table 1-9),
Stygies-pattern Macrocannons,Macrocannon,Any,All Ships,3,1d10+2,5,5,4,3,1,UNKN,"Mount varies by hull: Dorsal on escorts; Port/Starboard on larger hulls.",Core (Table 1-9),
Hecutor-pattern Plasma Battery,Plasma Battery,Port/Starboard,Light Cruiser/Cruiser,3,1d10+2,4,11,8,3,2,UNKN,High-velocity plasma battery.,Core (Table 1-9),
Hecutor-pattern Plasma Broadside,Plasma Battery,Port/Starboard,Battlecruiser/Grand Cruiser,5,1d10+2,4,11,12,5,2,UNKN,Heavy plasma broadside.,Core (Table 1-9),
Godsbane Lance,Lance,Any,Battlecruiser/Grand Cruiser,1,1d10+2,3,12,9,4,3,UNKN,Single long-range lance.,Core (Table 1-9),
Godsbane Lance Battery,Lance,Port/Starboard,Battlecruiser/Grand Cruiser,2,1d10+2,3,12,13,6,3,UNKN,Broadside lance battery.,Core (Table 1-9),
Las-burner,Lance,Any,All Ships,2,1d5+1,3,3,7,3,2,UNKN,Short-range cutting lance.,Core (Table 1-9),
Mezoa Lance Weapon,Lance,Any,All Ships,1,1d10+5,4,4,9,4,3,UNKN,High-output lance emitter.,Core (Table 1-9),
Mezoa Lance Battery,Lance,Port/Starboard,Light Cruiser/Cruiser,2,1d10+5,4,4,13,6,3,UNKN,Heavy lance battery.,Core (Table 1-9),
Voidsunder Lance Battery,Lance,Port/Starboard,Light Cruiser/Cruiser,1,1d10+4,3,6,15,8,3,UNKN,Shield-piercing lance battery.,Core (Table 1-9),
Ryza-pattern Nova Cannon,Nova Cannon,Prow,Cruisers,SPECIAL,2d5+5,SPECIAL,636,4,7,4,UNKN,"Nova weapon; special blast/aiming rules apply.",Core (Table 1-9),check_table
Fortis-pattern Torpedo Tubes,Torpedo Tubes,Prow,Light Cruiser/Cruiser,6,UNKN,UNKN,UNKN,2,8,3,UNKN,Standard cruiser/LC torpedo system.,Core (Table 1-9),
Gryphonne-pattern Torpedo Tubes,Torpedo Tubes,Prow,Raider/Frigate/Light Cruiser/Cruiser,4,UNKN,UNKN,UNKN,2,6,1,UNKN,Escort-through-cruiser compatible tubes.,Core (Table 1-9),
Mars-pattern Torpedo Tubes,Torpedo Tubes,Prow,Light Cruiser/Cruiser,6,UNKN,UNKN,UNKN,2,8,2,UNKN,Standard Navy cruiser torpedo fit.,Core (Table 1-9),
Hold Landing Bay,Launch Bay,Internal,Transports,2,UNKN,UNKN,UNKN,1,0,2,UNKN,"Cargo-hold conversion; Space shown as 0 for '—' per CSV convention.",Core (Table 1-9),
Jovian-pattern Escort Bay,Launch Bay,Port/Starboard,Light Cruiser/Cruiser,1,UNKN,UNKN,UNKN,1,4,1,UNKN,Escort-grade launch bay.,Core (Table 1-9),
Lathe-pattern Landing Bay,Launch Bay,Port/Starboard,Cruiser,2,UNKN,UNKN,UNKN,1,5,2,UNKN,Cruiser-grade launch bay (Lathe),Core (Table 1-9),
Jovian Missile Battery,Macrocannon,Any,All Ships,5,1d10+1,6,6,3,1,1,UNKN,"Missile-based macrobattery; mount varies by hull.",Supplemental Table 4-2,
Lathe Grav-culverin Broadside,Macrocannon,Port/Starboard,Light Cruiser/Cruiser,6,1d10+3,6,5,5,5,1,UNKN,High-velocity gravitic broadside.,Supplemental Table 4-2,
Mezoa Macrocannons,Macrocannon,Any,All Ships,4,1d10+3,5,5,4,4,1,UNKN,"Mount varies by hull: Dorsal on escorts; Port/Starboard on larger hulls.",Supplemental Table 4-2,
Pyros Melta-cannons,Macrocannon,Any,All Ships,3,1d10+4,4,4,4,3,2,UNKN,Short-range melta macrobattery.,Supplemental Table 4-2,
Sunhammer Lance,Lance,Any,All Ships,1,1d10+3,3,9,9,4,2,UNKN,Long-range lance emitter.,Supplemental Table 4-2,
Sunhammer Lance Battery,Lance,Port/Starboard,All Ships,2,1d10+3,3,9,13,6,2,UNKN,Long-range lance battery.,Supplemental Table 4-2,
Mars-pattern Nova Cannon,Nova Cannon,Prow,Cruisers,SPECIAL,2d5+4,SPECIAL,640,3,7,3,UNKN,"Nova weapon; special blast/aiming rules apply.",Core (Table 1-9),check_table
Staravar Laser Macrobattery,Macrocannon,Any,All Ships,4,1d10+2,4,12,4,4,2,Extremely Rare,"Archeotech laser macro; mount depends on hull (Dorsal/Port-Starboard).",Table 4-5,
Star-flare Lance,Lance,Any,Light Cruiser/Cruiser,3,1d10+3,3,7,12,6,3,Extremely Rare,Archeotech lance emitter.,Table 4-5,
Jovian-pattern Nova Cannon†,Nova Cannon,Prow,Cruisers,SPECIAL,2d5+7,SPECIAL,635,5,7,5,Extremely Rare,"† Special rules for Strength/Crit (see page 16).",Table 1-12,check_table
Plasma Accelerated Torpedo Tubes (Archeotech Weapon),Torpedo Tubes,Prow,All Ships,4,UNKN,UNKN,UNKN,1,4,4,Extremely Rare,"Archeotech torpedo mount; torpedo warhead stats handled separately.",Table 1-12,
1 component_name category mount scale strength damage crit_rating range_vu power space sp availability special_rules_notes book_sources needs_review
2 Mars-pattern Macrocannon Broadside (Frigate Scale) Macrocannon Dorsal Raider/Frigate 3 1d10+2 5 6 4 2 1 UNKN Standard macrobattery for escorts; broadside-equivalent on dorsal for small hulls. Core (Table 8-4)
3 Mars-pattern Macrocannon Broadside (Cruiser Scale) Macrocannon Port/Starboard Cruiser/Battlecruiser 6 1d10+2 5 6 4 5 1 UNKN Standard cruiser macrobroadside component. Core (Table 8-4)
4 Sunsear Laser Battery (Frigate Scale) Laser Battery Dorsal Raider/Frigate 4 1d10+2 4 9 6 4 1 UNKN High accuracy laser macrobattery used by escorts. Core (Table 8-4)
5 Sunsear Laser Battery (Cruiser Scale) Laser Battery Port/Starboard Cruiser/Battlecruiser 6 1d10+2 4 9 9 6 1 UNKN Cruiser-grade laser macrobattery. Supplemental Table 4-2
6 Dorsal Lance Battery (Frigate Grade) Lance Dorsal Frigate 1 1d10+2 3 5 6 4 2 UNKN Single/double lance mount for escorts. Core (Table 8-4)
7 Prow Lance Battery (Light Cruiser) Lance Prow Light Cruiser 1 1d10+4 3 6 9 4 2 UNKN Iconic Dauntless prow lance fit. Core (Table 8-4)
8 Port/Starboard Lance Battery (Cruiser) Lance Port/Starboard Cruiser/Battlecruiser 2 1d10+4 3 6 13 6 2 UNKN Heavy lance broadside for line ships. Core (Table 8-4)
9 Voss-pattern Torpedo Tubes Torpedo Tubes Prow Escort/Light Cruiser/Cruiser 2 UNKN UNKN UNKN 1 5 1 UNKN As seen on Falchion (prow slot pre-equipped; half ammo, +1 Power). Core (Table 1-9)
10 Standard Torpedo Tubes (Cruiser Pattern) Torpedo Tubes Prow Cruiser/Battlecruiser 6 UNKN UNKN UNKN 2 8 2 UNKN Generic torpedo tube component for cruiser-sized hulls. Core (Table 1-9)
11 Jovian-pattern Launch Bay Launch Bay Port/Starboard Light Cruiser/Cruiser/Battlecruiser 2 UNKN UNKN UNKN 1 6 2 UNKN Carrier component for attack craft (Fury/Starhawk wings). Core (Table 1-9)
12 Nova Cannon Nova Cannon Prow Cruiser/Battlecruiser SPECIAL 2d5+4 SPECIAL 6–40 3 7 3 UNKN Superheavy prow weapon; unique ammo rules. Core (Table 1-9) check_table
13 Plasma Battery (Cruiser Grade) Plasma Battery Port/Starboard Cruiser/Battlecruiser 4 1d10+4 4 5 7 4 2 UNKN If present in BFK as a distinct macrobattery type; verify exact name/statline. Core (Table 8-4)
14 Bombardment Cannons Macrocannon Port/Starboard Light Cruiser/Cruiser 3 1d10+6 2 4 5 5 3 UNKN Heavy bombardment macrobattery. Core (Table 1-9)
15 Disruption Macrocannons Macrocannon Any All Ships 3 1d10+1 0 5 4 2 2 UNKN Mount varies by hull: Dorsal on escorts; Port/Starboard on larger hulls. Core (Table 1-9)
16 Disruption Macrocannon Broadside Macrocannon Port/Starboard Light Cruiser/Cruiser 6 1d10+1 0 5 6 5 2 UNKN Broadside variant. Core (Table 1-9)
17 Stygies-pattern Macrocannons Macrocannon Any All Ships 3 1d10+2 5 5 4 3 1 UNKN Mount varies by hull: Dorsal on escorts; Port/Starboard on larger hulls. Core (Table 1-9)
18 Hecutor-pattern Plasma Battery Plasma Battery Port/Starboard Light Cruiser/Cruiser 3 1d10+2 4 11 8 3 2 UNKN High-velocity plasma battery. Core (Table 1-9)
19 Hecutor-pattern Plasma Broadside Plasma Battery Port/Starboard Battlecruiser/Grand Cruiser 5 1d10+2 4 11 12 5 2 UNKN Heavy plasma broadside. Core (Table 1-9)
20 Godsbane Lance Lance Any Battlecruiser/Grand Cruiser 1 1d10+2 3 12 9 4 3 UNKN Single long-range lance. Core (Table 1-9)
21 Godsbane Lance Battery Lance Port/Starboard Battlecruiser/Grand Cruiser 2 1d10+2 3 12 13 6 3 UNKN Broadside lance battery. Core (Table 1-9)
22 Las-burner Lance Any All Ships 2 1d5+1 3 3 7 3 2 UNKN Short-range cutting lance. Core (Table 1-9)
23 Mezoa Lance Weapon Lance Any All Ships 1 1d10+5 4 4 9 4 3 UNKN High-output lance emitter. Core (Table 1-9)
24 Mezoa Lance Battery Lance Port/Starboard Light Cruiser/Cruiser 2 1d10+5 4 4 13 6 3 UNKN Heavy lance battery. Core (Table 1-9)
25 Voidsunder Lance Battery Lance Port/Starboard Light Cruiser/Cruiser 1 1d10+4 3 6 15 8 3 UNKN Shield-piercing lance battery. Core (Table 1-9)
26 Ryza-pattern Nova Cannon Nova Cannon Prow Cruisers SPECIAL 2d5+5 SPECIAL 6–36 4 7 4 UNKN Nova weapon; special blast/aiming rules apply. Core (Table 1-9) check_table
27 Fortis-pattern Torpedo Tubes Torpedo Tubes Prow Light Cruiser/Cruiser 6 UNKN UNKN UNKN 2 8 3 UNKN Standard cruiser/LC torpedo system. Core (Table 1-9)
28 Gryphonne-pattern Torpedo Tubes Torpedo Tubes Prow Raider/Frigate/Light Cruiser/Cruiser 4 UNKN UNKN UNKN 2 6 1 UNKN Escort-through-cruiser compatible tubes. Core (Table 1-9)
29 Mars-pattern Torpedo Tubes Torpedo Tubes Prow Light Cruiser/Cruiser 6 UNKN UNKN UNKN 2 8 2 UNKN Standard Navy cruiser torpedo fit. Core (Table 1-9)
30 Hold Landing Bay Launch Bay Internal Transports 2 UNKN UNKN UNKN 1 0 2 UNKN Cargo-hold conversion; Space shown as 0 for '—' per CSV convention. Core (Table 1-9)
31 Jovian-pattern Escort Bay Launch Bay Port/Starboard Light Cruiser/Cruiser 1 UNKN UNKN UNKN 1 4 1 UNKN Escort-grade launch bay. Core (Table 1-9)
32 Lathe-pattern Landing Bay Launch Bay Port/Starboard Cruiser 2 UNKN UNKN UNKN 1 5 2 UNKN Cruiser-grade launch bay (Lathe) Core (Table 1-9)
33 Jovian Missile Battery Macrocannon Any All Ships 5 1d10+1 6 6 3 1 1 UNKN Missile-based macrobattery; mount varies by hull. Supplemental Table 4-2
34 Lathe Grav-culverin Broadside Macrocannon Port/Starboard Light Cruiser/Cruiser 6 1d10+3 6 5 5 5 1 UNKN High-velocity gravitic broadside. Supplemental Table 4-2
35 Mezoa Macrocannons Macrocannon Any All Ships 4 1d10+3 5 5 4 4 1 UNKN Mount varies by hull: Dorsal on escorts; Port/Starboard on larger hulls. Supplemental Table 4-2
36 Pyros Melta-cannons Macrocannon Any All Ships 3 1d10+4 4 4 4 3 2 UNKN Short-range melta macrobattery. Supplemental Table 4-2
37 Sunhammer Lance Lance Any All Ships 1 1d10+3 3 9 9 4 2 UNKN Long-range lance emitter. Supplemental Table 4-2
38 Sunhammer Lance Battery Lance Port/Starboard All Ships 2 1d10+3 3 9 13 6 2 UNKN Long-range lance battery. Supplemental Table 4-2
39 Mars-pattern Nova Cannon Nova Cannon Prow Cruisers SPECIAL 2d5+4 SPECIAL 6–40 3 7 3 UNKN Nova weapon; special blast/aiming rules apply. Core (Table 1-9) check_table
40 Staravar Laser Macrobattery Macrocannon Any All Ships 4 1d10+2 4 12 4 4 2 Extremely Rare Archeotech laser macro; mount depends on hull (Dorsal/Port-Starboard). Table 4-5
41 Star-flare Lance Lance Any Light Cruiser/Cruiser 3 1d10+3 3 7 12 6 3 Extremely Rare Archeotech lance emitter. Table 4-5
42 Jovian-pattern Nova Cannon† Nova Cannon Prow Cruisers SPECIAL 2d5+7 SPECIAL 6–35 5 7 5 Extremely Rare † Special rules for Strength/Crit (see page 16). Table 1-12 check_table
43 Plasma Accelerated Torpedo Tubes (Archeotech Weapon) Torpedo Tubes Prow All Ships 4 UNKN UNKN UNKN 1 4 4 Extremely Rare Archeotech torpedo mount; torpedo warhead stats handled separately. Table 1-12
+1
View File
@@ -0,0 +1 @@
0.2
+118
View File
@@ -0,0 +1,118 @@
# generate_manifests.py
# Fortel Trappa — pełne manifesty ładunkowe (HOLD I/II/III) w ZIP
# Uruchom: python generate_manifests.py -> powstaną dwa pliki ZIP w bieżącym katalogu.
import random, zipfile, datetime
random.seed(40000) # deterministyczny „smak”
WORLDS = ["Ostia","Avachrus","Enoch","Gilead Prime","Nethreus","Ryza","Vostroya","Scintilla","Footfall"]
INN_NOTES = [
"Zwykły wyrób, zgodny z normą diecezjalną.",
"Do użytku cywilnego; dokumentacja pełna.",
"Na potrzeby konserwacji/edukacji polowej.",
"Brak zasilania, brak funkcji specjalnych.",
"Wersja eksportowa; gwinty zgodne z PL-3.",
"Na morale i porządek; bez cech bojowych.",
"Próbki kontrolne — wynik negatywny na scrapcode.",
"Rekwizyty katechetyczne; brak statusu kultowego.",
"Puste, czyste, opieczętowane.",
"Zabezpieczone audytem Ministorum.",
"Składane; bez ostrych krawędzi w papierach.",
"Zwykła jakość magazynowa; brak niespodzianek.",
"Brak reakcji psionicznej (pomiar: tło).",
"Standard przemysłowy; kompatybilność wysoka.",
"Do ekspozycji; nieotwierane przy inspekcji.",
"Zestaw muzealny; kojąco nudny.",
"Oznaczenie cywilne; instrukcja w komplecie.",
"Zgodne z przepisem P-77 (ładownie ogólne).",
"Pieczęć diecezjalna aktualna; datowanie bieżące.",
"Bezpieczne dla chóru i czytników vox."
]
INN_NAMES = [
"Ziarno kultywacyjne ‘Święty Oset","Mąka Hostia","Kasza jęczmienna Pielgrzym","Groch Kocioł’","Fasola Pilgrim",
"Sól żywnościowa","Olej lampowy","Smary maszynowe Stałość’","Farba kadłubowa Mgła","Pasy mocujące Ordo Cargo",
"Złącza heksowe","Zawory nadciśnieniowe","Łożyska baryłkowe Wytrwałość’","Łożyska kulkowe precyzyjne",
"Taśmy stalowe Krzyżowe","Plandeki światłochłonne Cień’","Pudła ciszy (obudowy wygłuszające)","Lampiony procesyjne",
"Witraże polowe (składane)","Zwoje pergaminowe Sztywna Karta","Maski nabożne Neutral","Relikwie podręczne (skrzynki)",
"Szkatuły dewocyjne (stal miękka)","Szkła ochronne Błękit Służbowy","Barwniki okienne (błękit/purpura)",
"Kity hermetyczne Głuchy Spaw","Rury segmentowe PL-7","Kable PL-3 Uniwersalne","Siatki zabezpieczające Drobne Oczko",
"Zasuwy grodziowe PL-10","Zaczepy stalowe Cierpliwość’","Kątowniki ciężkie Prosto","Nity kadłubowe Amen",
"Skrzynki na dźwięk (wygłuszenie)","Szkła różnobarwne (mix)","Amfory gliniane E-Seria","Szaty Pokora (robocze)",
"Kopułki modlitewne (mini)","Płaszcze przeciwdeszczowe Wachta","Świece czarne Negocjacje","Świece woskowe Cisza Nocna",
"Zwoje kabli heksowych (ekranowane)","Sprężyny powrotne","Zawiesia wielokrążkowe","Przekaźniki proste Miedź’",
"Łożyska stożkowe Kierunek","Szkatuły na krople (apteczne)","Ołtarze polowe (składane)","Figurki pobożne",
"Piety miniaturowe","Popiół posypny (liturgiczny)","Kleje statkowe Głuchy Spaw","Klemy zasilające Moc",
"Kołnierze izolacyjne PL-5","Beczki puste Gotowość’","Rolki transportowe Gładkie","Słód jasny Nocny",
"Skrzydła drzwiowe Jedność’","Skarbonki parafialne","Księgi wizualne (albumy)","Zegary harmoniczne (niski ton)",
"Baldachimy małe Krem","Puchar kapłański (rekwizyt)","Księgi zakładkowe","Pasy transmisyjne Ciągłość’",
"Pudła akustyczne (puste)","Rękawice robocze Skóra+",
]
XENO_REAL = [
"fragmenty wraithbone Aeldari (martwe, obrobione na szkło)",
"odpryski spirit-stone (pozbawione ładunku)",
"ukryty vox-scrambler xeno (obudowa cywilna)",
"mikrofiolki po jadu Lhamaean (dokładnie wyparzone)",
"moduł holo-emisyjny Aeldari (matryca wycięta, nieaktywny)",
"kaseta rozliczeń cold trade (podwójne dno)",
"nekrotech — fragment stele bezcielesnej (kamień ozdobny)",
"obudowy tłumiące sygnał (technologia nieidentyfikowana)",
"orb psioniczny — tłumik nastroju (źródło Aeldari)",
"halo-device: element oprawy (niekompletne, bez rdzenia)",
"resztki proscribed tomes (okładki, wkład wymieniony na blanki)",
"zegar-pikietaż dla transakcji cold trade (ukryty znacznik czasu)",
"ampułki po obscura klasy ceremonialnej (umyte; testy czyste)",
"fiolki po ichorze drukhari (sterylnie czyste)",
"masker polowy Drukhari — tkanina z włóknem ziggurat (zdezaktywowana)",
]
def inn_note(): return random.choice(INN_NOTES)
def name(): return random.choice(INN_NAMES)
def world(): return random.choice(WORLDS)
def qty(): return random.randint(1, 8)
def make_line(idx, suspicious_ratio=0.34):
q = qty(); nm = name(); ow = world(); note = inn_note()
if random.random() < suspicious_ratio:
paren = f"({random.choice(XENO_REAL)})"
else:
paren = f"({random.choice(['zwykły ładunek cywilny','materiały szkoleniowe/rekonstrukcja','zestaw konserwatorski','komplet części serwisowych','puste i czyste','standard magazynowy','produkt spożywczy','wyposażenie pomocnicze','materiały dekoracyjne','narzędzia warsztatowe'])})"
return f"{idx}) {q}×{nm}{ow} — [{note}] {paren}", q
def make_section_text(hold_label, s_idx, s_cnt):
header = f"=== FORTEL TRAPPA — MANIFEST ŁADUNKOWY ===\n{hold_label} / SEKCJA {s_idx} z {s_cnt}\n(Format: [Liczba 110] × Standardowy Imperialny Kontener — Nazwa — Pochodzenie — [Uwaga kapitańska] (co to naprawdę jest))\n\n"
total = 0; entries = []
for i in range(1, 124):
line, q = make_line(i, suspicious_ratio=0.34)
entries.append([line, q]); total += q
if total > 1000:
excess = total - 1000
for i in range(len(entries)-1, -1, -1):
if excess <= 0: break
q = entries[i][1]
if q > 1:
red = min(q-1, excess); entries[i][1] -= red; excess -= red
prefix, rest = entries[i][0].split("×", 1)
idx_str = prefix.split(")")[0] + ")"
entries[i][0] = f"{idx_str} {entries[i][1]}×{rest}"
body = "\n".join(e[0] for e in entries)
footer = f"\n\n— KONIEC: {hold_label} / SEKCJA {s_idx}/{s_cnt}"
return header + body + footer
def write_full_zip(path_full, path_hold1):
with zipfile.ZipFile(path_full, "w", compression=zipfile.ZIP_DEFLATED) as z:
for s in range(4, 17): # HOLD I 0416
z.writestr(f"HOLD_I_SEKCJA_{s:02d}.txt", make_section_text("HOLD I", s, 16))
for s in range(1, 16): # HOLD II 0115
z.writestr(f"HOLD_II_SEKCJA_{s:02d}.txt", make_section_text("HOLD II", s, 15))
for s in range(1, 16): # HOLD III 0115
z.writestr(f"HOLD_III_SEKCJA_{s:02d}.txt", make_section_text("HOLD III", s, 15))
z.writestr("README.txt", f"FORTEL TRAPPA — MANIFESTY ({datetime.datetime.utcnow().isoformat()}Z)\nHOLD I: 0416; HOLD II: 0115; HOLD III: 0115\n~1/3 pozycji w ( ) ma real-tożsamość (xeno/kontrabanda), [ ] — noty urzędowo niewinne.\n")
with zipfile.ZipFile(path_hold1, "w", compression=zipfile.ZIP_DEFLATED) as z:
for s in range(4, 17):
z.writestr(f"HOLD_I_SEKCJA_{s:02d}.txt", make_section_text("HOLD I", s, 16))
z.writestr("README_HOLD_I.txt", f"HOLD I (0416) — {datetime.datetime.utcnow().isoformat()}Z\n")
if __name__ == "__main__":
write_full_zip("FORTEL_HOLD_I_II_III_MANIFESTS.zip", "FORTEL_HOLD_I_SEKCJE_04-16.zip")
print("OK: FORTEL_HOLD_I_II_III_MANIFESTS.zip | FORTEL_HOLD_I_SEKCJE_04-16.zip")
+182
View File
@@ -0,0 +1,182 @@
# generate_manifests_v2.py
# Fortel Trappa — manifesty o wysokiej różnorodności (HOLD I/II/III) w dwóch ZIP-ach.
# Uruchom: python generate_manifests_v2.py
# Wynik: FORTEL_MANIFESTS_v2_FULL.zip oraz FORTEL_MANIFESTS_v2_HOLD_I.zip
import random, zipfile, datetime
# ===== USTAWIENIA =====
SEED = None # ustaw np. na liczbę, jeśli chcesz powtarzalny wynik
SUSP_RATIO = 0.34 # ~1/3 pozycji ma „prawdę” w ( ) o xeno/kontrabandzie
QTY_MIN, QTY_MAX = 1, 10
LINES_PER_SECTION = 123
CAP_PER_SECTION = 1000
if SEED is None:
random.seed() # świeża losowość
else:
random.seed(SEED)
# ===== PULI I KOMPONENTY NAZW =====
WORLDS = [
"Ostia","Avachrus","Enoch","Gilead Prime","Nethreus","Ryza","Vostroya","Scintilla","Footfall",
"Hydraphur","Malfi","Port Wander","Voss Prime","Lucius","Graia","Metalica","Sollex","Sibellus"
]
FOODS = [
"Ziarno kultywacyjne","Pszenica","Owies","Jęczmień","Mąka","Kasza jęczmienna","Kasza owsiana",
"Groch","Fasola","Ciecierzyca","Słód jasny","Słód ciemny","Suszone jarzyny","Sól żywnościowa","Olej lampowy"
]
INDUSTRY = [
"Złącza heksowe","Zawory nadciśnieniowe","Łożyska baryłkowe","Łożyska kulkowe","Łożyska stożkowe",
"Taśmy stalowe","Plandeki światłochłonne","Pudła ciszy (wygłuszenie)","Rury segmentowe PL","Kable PL",
"Siatki zabezpieczające","Zasuwy grodziowe","Zaczepy stalowe","Kątowniki ciężkie","Nity kadłubowe",
"Skrzynki na dźwięk (wygłuszenie)","Filtry rebreatherów","Transpondery nawigacyjne","Przekaźniki proste",
"Zawiesia wielokrążkowe","Sprężyny powrotne","Kołnierze izolacyjne","Kleje statkowe","Klemy zasilające",
"Rolki transportowe","Farba kadłubowa","Żywica naprawcza","Kity hermetyczne","Szkła ochronne",
"Panele grodziowe","Uszczelki retencyjne","Siłowniki serwo (obudowy)"
]
DEVOTION = [
"Lampiony procesyjne","Witraże polowe (składane)","Zwoje pergaminowe","Maski nabożne",
"Relikwie podręczne (skrzynki)","Szkatuły dewocyjne (stal miękka)","Amfory gliniane",
"Szaty Pokora (robocze)","Kopułki modlitewne (mini)","Płaszcze Wachta",
"Świece czarne Negocjacje","Świece woskowe Cisza Nocna","Figurki pobożne",
"Piety miniaturowe","Popiół posypny (liturgiczny)","Ołtarze polowe (składane)",
"Skarbonki parafialne","Księgi wizualne (albumy)","Księgi zakładkowe",
"Ikony ścienne (odlewy)","Reliefy miedziane","Baldachimy Krem","Puchary kapłańskie (rekwizyt)"
]
ADJ = [
"Hostia","Pielgrzym","Kocioł’","Pilgrim","Stałość’","Ordo Cargo","Mgła","Cień’",
"Błękit Służbowy","Sztywna Karta","Jedność’","Głuchy Spaw","Kierunek","Gotowość’","Neutral",
"Mk II","Mk III","Mk IV","Mk V","Plus","Premium","Export","Seria V","Seria IX","Nocny"
]
INN_NOTES = [
"Zwykły wyrób, zgodny z normą diecezjalną.",
"Do użytku cywilnego; dokumentacja pełna.",
"Na potrzeby konserwacji/edukacji polowej.",
"Brak zasilania, brak funkcji specjalnych.",
"Wersja eksportowa; gwinty zgodne z PL-3.",
"Na morale i porządek; bez cech bojowych.",
"Próbki kontrolne — wynik negatywny na scrapcode.",
"Rekwizyty katechetyczne; brak statusu kultowego.",
"Puste, czyste, opieczętowane.",
"Zabezpieczone audytem Ministorum.",
"Składane; bez ostrych krawędzi w papierach.",
"Zwykła jakość magazynowa; brak niespodzianek.",
"Brak reakcji psionicznej (pomiar: tło).",
"Standard przemysłowy; kompatybilność wysoka.",
"Do ekspozycji; nieotwierane przy inspekcji.",
"Zestaw muzealny; kojąco nudny.",
"Oznaczenie cywilne; instrukcja w komplecie.",
"Zgodne z przepisem P-77 (ładownie ogólne).",
"Pieczęć diecezjalna aktualna; datowanie bieżące.",
"Bezpieczne dla chóru i czytników vox."
]
HARMLESS = [
"zwykły ładunek cywilny","materiały szkoleniowe/rekonstrukcja","zestaw konserwatorski",
"komplet części serwisowych","puste i czyste","standard magazynowy","produkt spożywczy",
"wyposażenie pomocnicze","materiały dekoracyjne","narzędzia warsztatowe"
]
XENO_REAL = [
"fragmenty wraithbone Aeldari (martwe, obrobione na szkło)",
"odpryski spirit-stone (pozbawione ładunku)",
"ukryty vox-scrambler xeno (obudowa cywilna)",
"mikrofiolki po jadu Lhamaean (dokładnie wyparzone)",
"moduł holo-emisyjny Aeldari (matryca wycięta, nieaktywny)",
"kaseta rozliczeń cold trade (podwójne dno)",
"nekrotech — fragment stele bezcielesnej (kamień ozdobny)",
"obudowy tłumiące sygnał (technologia nieidentyfikowana)",
"orb psioniczny — tłumik nastroju (źródło Aeldari)",
"halo-device: element oprawy (niekompletne, bez rdzenia)",
"resztki proscribed tomes (okładki, wkład wymieniony na blanki)",
"zegar-pikietaż dla transakcji cold trade (ukryty znacznik czasu)",
"ampułki po obscura klasy ceremonialnej (umyte; testy czyste)",
"fiolki po ichorze drukhari (sterylnie czyste)",
"masker polowy Drukhari — tkanina z włóknem ziggurat (zdezaktywowana)",
"matryca soniczna Laer (obudowana pudłem ciszy)",
"półprzezroczysta łuska necron — fragment dekoracyjny (brak reakcji)",
]
def compose_name():
# wybór kategorii z wagami
genre = random.choices(["food","industry","devotion"], [4,5,3])[0]
base = random.choice({"food":FOODS, "industry":INDUSTRY, "devotion":DEVOTION}[genre])
# modyfikacje wersji/serii
if "PL" in base:
base = base.replace("PL", f"PL-{random.randint(3,12)}")
if "Kable PL" in base and random.random()<0.7:
base = base.replace("Kable PL", f"Kable PL-{random.randint(2,8)}")
flair=[]
if random.random()<0.7: flair.append(random.choice(ADJ))
if random.random()<0.25: flair.append(f"Seria {random.randint(2,12)}")
return base if not flair else f"{base} " + " ".join(flair)
def make_line(idx, suspicious_ratio=SUSP_RATIO):
q = random.randint(QTY_MIN, QTY_MAX)
nm = compose_name()
ow = random.choice(WORLDS)
note = random.choice(INN_NOTES)
paren = f"({random.choice(XENO_REAL)})" if random.random()<suspicious_ratio else f"({random.choice(HARMLESS)})"
return f"{idx}) {q}×{nm}{ow} — [{note}] {paren}", q
def make_section_text(hold_label, s_idx, s_cnt):
header = (
"=== FORTEL TRAPPA — MANIFEST ŁADUNKOWY ===\n"
f"{hold_label} / SEKCJA {s_idx} z {s_cnt}\n"
"(Format: [Liczba 110] × Standardowy Imperialny Kontener — Nazwa — Pochodzenie — [Uwaga kapitańska] (co to naprawdę jest))\n\n"
)
total=0; entries=[]
# ogranicz powtórzenia nazw w obrębie sekcji
seen=set()
for i in range(1, LINES_PER_SECTION+1):
tries=0
while True:
line,q = make_line(i)
name_part = line.split("")[1].strip() # „N× — NAZWA — ...”
if name_part not in seen or tries>7:
seen.add(name_part)
break
tries+=1
entries.append([line,q]); total+=q
# przytnij sumę kontenerów do CAP_PER_SECTION
if total>CAP_PER_SECTION:
excess=total-CAP_PER_SECTION
for i in range(len(entries)-1,-1,-1):
if excess<=0: break
q=entries[i][1]
if q>1:
red=min(q-1,excess); entries[i][1]-=red; excess-=red
prefix,rest=entries[i][0].split("×",1)
idx_str=prefix.split(")")[0]+")"
entries[i][0]=f"{idx_str} {entries[i][1]}×{rest}"
body="\n".join(e[0] for e in entries)
footer=f"\n\n— KONIEC: {hold_label} / SEKCJA {s_idx}/{s_cnt}"
return header+body+footer
def build_zip(full_path, hold1_path):
# FULL: HOLD I 0416; HOLD II 0115; HOLD III 0115
with zipfile.ZipFile(full_path,"w",compression=zipfile.ZIP_DEFLATED) as z:
for s in range(4,17): # HOLD I
z.writestr(f"HOLD_I_SEKCJA_{s:02d}.txt", make_section_text("HOLD I", s, 16))
for s in range(1,16): # HOLD II
z.writestr(f"HOLD_II_SEKCJA_{s:02d}.txt", make_section_text("HOLD II", s, 15))
for s in range(1,16): # HOLD III
z.writestr(f"HOLD_III_SEKCJA_{s:02d}.txt", make_section_text("HOLD III", s, 15))
z.writestr("README.txt",
f"FORTEL TRAPPA — MANIFESTY v2 ({datetime.datetime.utcnow().isoformat()}Z)\n"
"HOLD I: 0416; HOLD II: 0115; HOLD III: 0115\n"
f"~{int(SUSP_RATIO*100)}% pozycji w ( ) ujawnia real-tożsamość (xeno/kontrabanda); [ ] — noty urzędowo niewinne.\n"
"123 pozycji/sekcję; 110 kontenerów/pozycję; suma ≤1000/sekcję.\n")
# HOLD I only
with zipfile.ZipFile(hold1_path,"w",compression=zipfile.ZIP_DEFLATED) as z:
for s in range(4,17):
z.writestr(f"HOLD_I_SEKCJA_{s:02d}.txt", make_section_text("HOLD I", s, 16))
z.writestr("README_HOLD_I.txt", f"HOLD I (0416) v2 — {datetime.datetime.utcnow().isoformat()}Z\n")
if __name__ == "__main__":
build_zip("FORTEL_MANIFESTS_v2_FULL.zip","FORTEL_MANIFESTS_v2_HOLD_I.zip")
print("OK -> FORTEL_MANIFESTS_v2_FULL.zip | FORTEL_MANIFESTS_v2_HOLD_I.zip")
+234
View File
@@ -0,0 +1,234 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Patchuje:
1) wg-voidship-hulls.db -> base.power = 0 (dla wszystkich kadłubów)
2) wg-voidship-items.db -> reaktory: use.power=0, mods.power wg subtype;
aux-plasma: use.power=0;
dopisuje 4 reaktory jeśli brak.
Uruchom w katalogu z plikami .db
"""
import json, shutil
from pathlib import Path
HULLS_FN = Path("wg-voidship-hulls.db")
ITEMS_FN = Path("wg-voidship-items.db")
REACTOR_POWER_BY_SUBTYPE = {
"escort": 40,
"frigate": 45,
"light-cruiser": 55,
"cruiser": 60,
}
# 4 reaktory „wzorcowe” do dopisania, jeśli brak:
REACTOR_TEMPLATES = [
{
"_id": "ITEMREACTCRU0001",
"name": "Plasma Reactor (Cruiser) — Mars-Pattern",
"type": "gear",
"img": "icons/svg/energy.svg",
"flags": {
"wg-voidships-builder": {
"voidOnly": True,
"component": {"kind": "reactor", "subtype": "cruiser", "tags": ["reactor", "plasma"]}
}
},
"system": {
"description": "Standardowy reaktor plazmowy klasy krążownik (Mars-Pattern). Generuje moc dla wszystkich systemów okrętu.",
"voidship": {
"slot": "Internal",
"use": {"space": 20, "power": 0},
"mods": {"armour": 0, "integrity": 0, "manoeuvre": 0, "detection": 0, "speed": 0, "space": 0, "power": 60}
}
},
"effects": []
},
{
"_id": "ITEMREACTLCR0001",
"name": "Plasma Reactor (Light Cruiser) — Mars-Pattern",
"type": "gear",
"img": "icons/svg/energy.svg",
"flags": {
"wg-voidships-builder": {
"voidOnly": True,
"component": {"kind": "reactor", "subtype": "light-cruiser", "tags": ["reactor", "plasma"]}
}
},
"system": {
"description": "Reaktor plazmowy dla lekkich krążowników (Mars-Pattern).",
"voidship": {
"slot": "Internal",
"use": {"space": 18, "power": 0},
"mods": {"armour": 0, "integrity": 0, "manoeuvre": 0, "detection": 0, "speed": 0, "space": 0, "power": 55}
}
},
"effects": []
},
{
"_id": "ITEMREACTFRI0001",
"name": "Plasma Reactor (Frigate) — Jovian-Pattern",
"type": "gear",
"img": "icons/svg/energy.svg",
"flags": {
"wg-voidships-builder": {
"voidOnly": True,
"component": {"kind": "reactor", "subtype": "frigate", "tags": ["reactor", "plasma"]}
}
},
"system": {
"description": "Reaktor plazmowy okrętów klasy fregata (Jovian-Pattern).",
"voidship": {
"slot": "Internal",
"use": {"space": 15, "power": 0},
"mods": {"armour": 0, "integrity": 0, "manoeuvre": 0, "detection": 0, "speed": 0, "space": 0, "power": 45}
}
},
"effects": []
},
{
"_id": "ITEMREACTESC0001",
"name": "Plasma Reactor (Escort) — Jovian-Pattern",
"type": "gear",
"img": "icons/svg/energy.svg",
"flags": {
"wg-voidships-builder": {
"voidOnly": True,
"component": {"kind": "reactor", "subtype": "escort", "tags": ["reactor", "plasma"]}
}
},
"system": {
"description": "Lżejszy reaktor plazmowy dla eskort.",
"voidship": {
"slot": "Internal",
"use": {"space": 12, "power": 0},
"mods": {"armour": 0, "integrity": 0, "manoeuvre": 0, "detection": 0, "speed": 0, "space": 0, "power": 40}
}
},
"effects": []
},
]
def read_ndjson(path: Path):
if not path.exists():
print(f"[WARN] Brak pliku: {path.name}")
return []
rows = []
with path.open("r", encoding="utf-8") as f:
for i, line in enumerate(f, 1):
line = line.strip()
if not line:
continue
try:
rows.append(json.loads(line))
except Exception as e:
print(f"[WARN] {path.name}:{i}: nie mogę zdekodować JSON: {e}")
return rows
def write_ndjson(path: Path, rows):
tmp = path.with_suffix(path.suffix + ".patched")
with tmp.open("w", encoding="utf-8") as f:
for obj in rows:
f.write(json.dumps(obj, ensure_ascii=False, separators=(",", ":")) + "\n")
tmp.replace(path)
def ensure_backup(path: Path):
bak = path.with_suffix(path.suffix + ".bak")
if path.exists() and not bak.exists():
shutil.copy2(path, bak)
print(f"[OK] Backup -> {bak.name}")
def patch_hulls():
if not HULLS_FN.exists():
print(f"[INFO] Pomijam hulls (brak {HULLS_FN.name})")
return
ensure_backup(HULLS_FN)
rows = read_ndjson(HULLS_FN)
patched = 0
for o in rows:
flags = o.setdefault("flags", {}).setdefault("wg-voidships-builder", {})
base = flags.setdefault("base", {})
if base.get("power", None) != 0:
base["power"] = 0
patched += 1
write_ndjson(HULLS_FN, rows)
print(f"[OK] Hulls: ustawiono base.power=0 w {patched} rekordach ({len(rows)} linii)")
def has_tag(flags_obj, tag: str) -> bool:
try:
tags = flags_obj["wg-voidships-builder"]["component"]["tags"]
return isinstance(tags, list) and tag in tags
except Exception:
return False
def patch_items():
if not ITEMS_FN.exists():
print(f"[INFO] Pomijam items (brak {ITEMS_FN.name})")
return
ensure_backup(ITEMS_FN)
rows = read_ndjson(ITEMS_FN)
existing_ids = set()
patched_reactors = 0
patched_aux = 0
for o in rows:
existing_ids.add(o.get("_id", ""))
flags = o.get("flags", {})
comp = flags.get("wg-voidships-builder", {}).get("component", {})
kind = comp.get("kind")
subtype = comp.get("subtype")
# Upewnij się, że ścieżka system.voidship.use/mods istnieje
sys = o.setdefault("system", {})
vsh = sys.setdefault("voidship", {})
use = vsh.setdefault("use", {})
mods = vsh.setdefault("mods", {})
# Auxiliary plasma (po tagu)
if has_tag(flags, "aux-plasma"):
if use.get("power") != 0:
use["power"] = 0
patched_aux += 1
# Reaktory
if kind == "reactor":
if use.get("power") != 0:
use["power"] = 0
if subtype in REACTOR_POWER_BY_SUBTYPE:
pow_val = REACTOR_POWER_BY_SUBTYPE[subtype]
if mods.get("power") != pow_val:
mods["power"] = pow_val
patched_reactors += 1
# zadbaj o wypełnienie brakujących kluczy modów
for k in ["armour","integrity","manoeuvre","detection","speed","space"]:
mods.setdefault(k, 0)
# i sensowne sloty/space
vsh.setdefault("slot", "Internal")
use.setdefault("space", use.get("space", 0))
# Zapisz zmodyfikowane wiersze
write_ndjson(ITEMS_FN, rows)
print(f"[OK] Items: zaktualizowano reaktory: {patched_reactors}, aux-plasma: {patched_aux}")
# Dopisz brakujące 4 reaktory
to_append = [r for r in REACTOR_TEMPLATES if r["_id"] not in existing_ids]
if to_append:
with ITEMS_FN.open("a", encoding="utf-8") as f:
for obj in to_append:
f.write(json.dumps(obj, ensure_ascii=False, separators=(",", ":")) + "\n")
print(f"[OK] Items: dopisano brakujące reaktory: {[o['_id'] for o in to_append]}")
else:
print(f"[OK] Items: wszystkie reaktory już są — nic do dopisania.")
def main():
print("== WG Voidships Patch ==")
patch_hulls()
patch_items()
print("Gotowe. Zrestartuj/reloadnij Foundry i reimportuj kompendia, jeśli potrzeba.")
if __name__ == "__main__":
main()
View File
+652
View File
@@ -0,0 +1,652 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
sync_foundry_module.py
Rozszerzony:
- Tryb AUTO: wykrywanie katalogów ze zmianami (git), obsługa modułów i niemodułów.
- Każdy katalog -> osobny commit i push.
- Root version.nfo: opcjonalny bump globalnej wersji (0.x) jeśli są zmiany i HEAD ma tag z obecną wersją.
- Zipowanie po commit/push, przed podmianą plików (moduły) lub tuż po commicie (niemoduły):
ZIP_MODE = "ALL" | "MODULE_ONLY" | "OFF"; CLI: --zip-mode; --zip-output-dir.
Dwa tryby:
- AUTO (domyślny): wykryj wszystkie ZMIENIONE podkatalogi w SOURCE_BASE_DIR:
* jeśli folder zawiera module.json -> procedura "moduł"
* jeśli nie -> procedura "niemoduł" (version.nfo 0.x, inkrementacja)
- SINGLE: przetwórz wyłącznie katalog wskazany w MODULE_SUBDIR_NAME (jak wcześniej)
Dry-run:
- nic NIE modyfikuje (ani plików, ani repo), nie czyści i nie kopiuje tylko plan.
Wymagania:
- Python 3.8+
- git w PATH (dla commit/push i wykrywania zmian)
- uprawnienia do zapisu w repo i w katalogu docelowym modułów
"""
from __future__ import annotations
import os
import sys
import shutil
import argparse
import json
import subprocess
from pathlib import Path
from typing import List, Optional, Tuple, Set
# ==========================
# KONFIGURACJA (DOMYŚLNA)
# ==========================
# Tryb: "auto" (wykryj zmienione katalogi) lub "single" (tylko MODULE_SUBDIR_NAME)
MODE: str = "auto" # "auto" | "single"
TARGET_USER: str = "mtusz" # nazwa folderu w C:\Users\...
APPDATA_KIND: Optional[str] = None # None | "Local" | "LocalLow" | "Roaming"
TARGET_MODULES_DIR_OVERRIDE: Optional[str] = None # pełna ścieżka do ...\FoundryVTT\Data\modules
MODULE_SUBDIR_NAME: str = "wg-voidships" # używane w trybie SINGLE
CONFIRM_DELETE: bool = True
SOURCE_BASE_DIR: str = r"C:\vtt_work"
RELATIVE_PATTERN: str = r"FoundryVTT\Data\modules"
DRY_RUN: bool = False # globalny tryb symulacji (nic nie zmienia)
# --- ZIP settings ---
# ALL -> zipuj WSZYSTKIE katalogi (moduły i niemoduły)
# MODULE_ONLY -> zipuj TYLKO katalogi z module.json
# OFF -> nie twórz zipów
ZIP_MODE: str = "ALL" # "ALL" | "MODULE_ONLY" | "OFF"
# Katalog wyjściowy na archiwa .zip; jeśli None, użyje SOURCE_BASE_DIR/_zips
ZIP_OUTPUT_DIR: Optional[str] = r"C:\Release packs"
# ==========================
# KONIEC KONFIGURACJI
# ==========================
APPDATA_VARIANTS = ("Local", "LocalLow", "Roaming")
ARGS = None # wypełniane w main()
class AmbiguityError(RuntimeError):
pass
def norm(p: Path) -> Path:
return Path(os.path.normpath(str(p)))
def sh(cmd: List[str], cwd: Path) -> Tuple[int, str]:
"""Uruchom polecenie i zwróć (rc, out)."""
r = subprocess.run(cmd, cwd=str(cwd), stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True)
return r.returncode, r.stdout
def git_head_tag(repo_dir: Path) -> Optional[str]:
"""Zwraca tag dokładnie na HEAD (jeśli istnieje), inaczej None."""
rc, out = sh(["git", "describe", "--tags", "--exact-match", "HEAD"], repo_dir)
if rc != 0:
return None
return out.strip() if out.strip() else None
def ensure_git_repo(path: Path) -> None:
rc, out = sh(["git", "rev-parse", "--is-inside-work-tree"], path)
if rc != 0 or "true" not in out.strip().lower():
raise RuntimeError(f"Katalog {norm(path)} nie wygląda na repozytorium git.\n{out}")
def git_changed_top_level_dirs(repo_dir: Path) -> List[str]:
"""
Zwraca posortowaną listę unikalnych NAZW PODKATALOGÓW (1. poziom) w repo,
które mają zmiany wg `git status --porcelain` (staged/unstaged/untracked).
Zmiany w plikach w root repo są ignorowane (brak katalogu).
"""
rc, out = sh(["git", "status", "--porcelain"], repo_dir)
if rc != 0:
raise RuntimeError(f"Błąd podczas `git status --porcelain` w {norm(repo_dir)}:\n{out}")
changed: Set[str] = set()
for line in out.splitlines():
if not line.strip():
continue
# format: XY <path> lub "?? <path>"
try:
path = line[3:].strip()
except Exception:
continue
# ignoruj rename "R a -> b": wówczas path ma "a -> b"
if "->" in path:
path = path.split("->", 1)[1].strip()
parts = Path(path).parts
if len(parts) >= 1:
top = parts[0]
# bierz tylko katalogi (jeśli top to plik w root, pomiń)
if (repo_dir / top).is_dir():
changed.add(top)
return sorted(changed)
def find_modules_dir_for_user(user: str,
relative_pattern: str,
appdata_kind: Optional[str]) -> Path:
base = Path(f"C:/Users/{user}/AppData")
if not base.exists():
raise FileNotFoundError(f"Nie znaleziono katalogu użytkownika: {norm(base)}")
candidates: List[Path] = []
if appdata_kind:
if appdata_kind not in APPDATA_VARIANTS:
raise ValueError(f"APPDATA_KIND musi być jednym z: {APPDATA_VARIANTS}, a nie '{appdata_kind}'")
p = base / appdata_kind / Path(relative_pattern)
if p.is_dir():
return norm(p)
else:
raise FileNotFoundError(
f"Nie znaleziono katalogu: {norm(p)} (dla APPDATA_KIND={appdata_kind})."
)
for kind in APPDATA_VARIANTS:
p = base / kind / Path(relative_pattern)
if p.is_dir():
candidates.append(p)
if not candidates:
raise FileNotFoundError(
"Nie znaleziono żadnego katalogu zgodnego z wzorcem.\n"
f"Sprawdź, czy istnieje któryś z poniższych:\n"
+ "\n".join(f" - {norm(base / kind / Path(relative_pattern))}" for kind in APPDATA_VARIANTS)
)
if len(candidates) == 1:
return norm(candidates[0])
suggestions = []
for p in candidates:
try:
kind = p.parts[p.parts.index("AppData") + 1]
except Exception:
kind = "??"
suggestions.append(f'* Ustaw APPDATA_KIND="{kind}" # trafi w: {norm(p)}')
suggestions.append(f'* Albo ustaw TARGET_MODULES_DIR_OVERRIDE="{norm(candidates[0])}" # pełny override')
raise AmbiguityError(
"Znaleziono wiele pasujących lokalizacji dla wzorca 'FoundryVTT\\Data\\modules':\n"
+ "\n".join(f" - {norm(c)}" for c in candidates)
+ "\n\nPropozycje ujednolicenia:\n" + "\n".join(suggestions)
)
def ensure_dir(path: Path) -> None:
path.mkdir(parents=True, exist_ok=True)
def iter_dir_contents(dir_path: Path) -> List[Path]:
if not dir_path.exists():
return []
return list(dir_path.iterdir())
def clear_dir_contents(dir_path: Path, dry_run: bool) -> Tuple[int, int]:
ensure_dir(dir_path)
files = 0
dirs = 0
to_delete = iter_dir_contents(dir_path)
if dry_run:
print("[DRY-RUN] Zawartość do skasowania:")
if not to_delete:
print(" (pusto)")
for child in to_delete:
tag = "[plik]" if child.is_file() else "[katalog]" if child.is_dir() else "[inne]"
print(f" {tag} {norm(child)}")
for child in to_delete:
if child.is_file() or child.is_symlink():
files += 1
elif child.is_dir():
dirs += 1
return files, dirs
for child in to_delete:
if child.is_file() or child.is_symlink():
files += 1
child.unlink(missing_ok=True)
elif child.is_dir():
dirs += 1
shutil.rmtree(child, ignore_errors=True)
return files, dirs
def plan_copy(src: Path, dst: Path) -> List[Tuple[Path, Path, str]]:
plan: List[Tuple[Path, Path, str]] = []
if not src.is_dir():
raise FileNotFoundError(f"Katalog źródłowy nie istnieje: {norm(src)}")
for root, dirs, files in os.walk(src):
root_p = Path(root)
rel_root = root_p.relative_to(src)
for d in dirs:
s = root_p / d
t = dst / rel_root / d
status = "overwrite" if t.exists() else "create"
plan.append((s, t, status))
for f in files:
s = root_p / f
t = dst / rel_root / f
status = "overwrite" if t.exists() else "create"
plan.append((s, t, status))
return plan
def copy_dir_contents(src: Path, dst: Path, dry_run: bool) -> Tuple[int, int]:
ensure_dir(dst)
plan = plan_copy(src, dst)
if dry_run:
print("[DRY-RUN] Plan kopiowania:")
if not plan:
print(" (brak plików do skopiowania)")
for s, t, status in plan:
kind = "[katalog]" if s.is_dir() else "[plik]"
print(f" {kind} {norm(s)} -> {norm(t)} ({status})")
files = sum(1 for s, _, _ in plan if s.is_file())
dirs = sum(1 for s, _, _ in plan if s.is_dir())
return files, dirs
files = 0
dirs = 0
for s, t, _ in plan:
if s.is_dir():
shutil.copytree(s, t, dirs_exist_ok=True)
dirs += 1
elif s.is_file():
ensure_dir(t.parent)
shutil.copy2(s, t)
files += 1
elif s.is_symlink():
target = s.resolve()
ensure_dir(t.parent)
if target.is_dir():
shutil.copytree(target, t, dirs_exist_ok=True)
dirs += 1
else:
shutil.copy2(target, t)
files += 1
else:
print(f"[OSTRZEŻENIE] Pominięto nieobsługiwany typ pliku: {norm(s)}")
return files, dirs
# ============ PRE-FLIGHT: module.json + git ============
def read_manifest(manifest_path: Path) -> dict:
if not manifest_path.is_file():
raise FileNotFoundError(f"Brak pliku manifestu: {norm(manifest_path)}")
try:
with manifest_path.open("r", encoding="utf-8") as f:
return json.load(f)
except json.JSONDecodeError as e:
raise ValueError(f"Niepoprawny JSON w {norm(manifest_path)}: {e}") from e
def bump_version(last_version: str) -> str:
parts = last_version.strip().split(".")
if not parts:
raise ValueError(f"Niepoprawna wersja: '{last_version}'")
try:
n = int(parts[-1])
except ValueError:
raise ValueError(f"Ostatni segment wersji nie jest liczbą: '{last_version}'")
parts[-1] = str(n + 1)
return ".".join(parts)
def write_json_atomic(path: Path, data: dict) -> None:
tmp = path.with_suffix(path.suffix + ".tmp")
with tmp.open("w", encoding="utf-8") as f:
json.dump(data, f, ensure_ascii=False, indent=2)
f.write("\n")
tmp.replace(path)
def run_git_commands(repo_dir: Path, commit_msg: str, dry_run: bool) -> None:
if dry_run:
print("[DRY-RUN] git add -A")
print(f"[DRY-RUN] git commit -m {commit_msg!r}")
print("[DRY-RUN] git push")
return
def run(cmd: List[str]) -> None:
rc, out = sh(cmd, repo_dir)
if rc != 0:
raise RuntimeError(f"Błąd podczas uruchamiania: {' '.join(cmd)}\nWyjście:\n{out}")
if out.strip():
print(out)
run(["git", "add", "-A"])
rc, out = sh(["git", "commit", "-m", commit_msg], repo_dir)
if rc != 0:
raise RuntimeError(f"Błąd podczas git commit:\n{out}")
if out.strip():
print(out)
run(["git", "push"])
def preflight_module(src_dir: Path, dry_run: bool) -> Tuple[str, str]:
"""
Moduł: odczyt module.json, bump, zapis (jeśli nie dry_run), commit i push.
Zwraca (module_id, new_version).
"""
manifest_path = src_dir / "module.json"
manifest = read_manifest(manifest_path)
if "id" not in manifest or "version" not in manifest:
raise KeyError(f"W {norm(manifest_path)} brakuje pola 'id' lub 'version'.")
module_id = str(manifest["id"])
old_version = str(manifest["version"])
new_version = bump_version(old_version)
print(f"[PRE][MODULE] {src_dir.name}: id={module_id}, version={old_version} -> {new_version}")
if dry_run:
print("[DRY-RUN] Nie zapisuję module.json i nie wykonuję git.")
else:
manifest["version"] = new_version
write_json_atomic(manifest_path, manifest)
commit_msg = f"sync: {module_id} v{new_version}"
run_git_commands(src_dir, commit_msg, dry_run=False)
return module_id, new_version
def preflight_non_module(src_dir: Path, dry_run: bool) -> str:
"""
Niemoduł: version.nfo w formacie '0.x' (x int).
- jeśli brak -> '0.1'
- jeśli jest -> inkrementuj x
Zapis (nie dry-run) oraz osobny commit/push.
Zwraca new_version (np. '0.4').
"""
nfo = src_dir / "version.nfo"
if not nfo.exists():
new_version = "0.1"
print(f"[PRE][FOLDER] {src_dir.name}: version.nfo brak -> {new_version}")
if not dry_run:
with nfo.open("w", encoding="utf-8") as f:
f.write(new_version + "\n")
commit_msg = f"sync: {src_dir.name} v{new_version}"
run_git_commands(src_dir, commit_msg, dry_run=False)
return new_version
# istnieje -> wczytaj i bumpnij
content = nfo.read_text(encoding="utf-8").strip()
if not content.startswith("0."):
raise ValueError(f"{norm(nfo)}: oczekiwano formatu '0.x', otrzymano '{content}'")
tail = content.split(".", 1)[1]
try:
x = int(tail)
except ValueError:
raise ValueError(f"{norm(nfo)}: część po '0.' nie jest liczbą: '{tail}'")
new_version = f"0.{x+1}"
print(f"[PRE][FOLDER] {src_dir.name}: version {content} -> {new_version}")
if not dry_run:
with nfo.open("w", encoding="utf-8") as f:
f.write(new_version + "\n")
commit_msg = f"sync: {src_dir.name} v{new_version}"
run_git_commands(src_dir, commit_msg, dry_run=False)
return new_version
# ====== ROOT version.nfo (globalna wersja repo) ======
def maybe_bump_root_version(repo_dir: Path, changed_any: bool, dry_run: bool) -> Optional[str]:
"""
Jeśli:
- istnieją zmiany do przetworzenia (changed_any == True)
- HEAD ma tag zawierający aktualną wersję globalną z version.nfo (0.x)
to bumpnij version.nfo w roocie (0.x -> 0.(x+1)), zrób osobny commit i push.
Zwraca nową wersję (str) lub None, jeśli pominięto.
"""
if not changed_any:
print("[ROOT] Pomijam bump wersji globalnej: brak zmian do przetworzenia.")
return None
nfo = repo_dir / "version.nfo"
if not nfo.exists():
print("[ROOT] Brak version.nfo w roocie; pomijam bump (wymagany istniejący plik).")
return None
current = nfo.read_text(encoding="utf-8").strip()
if not current.startswith("0."):
raise ValueError(f"{nfo}: oczekiwano formatu '0.x', otrzymano '{current}'")
# HEAD musi mieć tag zawierający 'current'
tag = git_head_tag(repo_dir)
if not tag or current not in tag:
print(f"[ROOT] Pomijam bump: {'brak taga na HEAD' if not tag else f'tag \"{tag}\" nie zawiera wersji {current}'}")
return None
# Bump
try:
tail = int(current.split(".", 1)[1])
except ValueError:
raise ValueError(f"{nfo}: część po '0.' nie jest liczbą: '{current}'")
new_version = f"0.{tail+1}"
print(f"[ROOT] Globalna wersja: {current} -> {new_version}")
if dry_run:
print("[DRY-RUN][ROOT] Zapis version.nfo i commit/push zostaną pominięte.")
return new_version
nfo.write_text(new_version + "\n", encoding="utf-8")
run_git_commands(repo_dir, f"sync: root v{new_version}", dry_run=False)
return new_version
# ====== ZIP utilities ======
def should_zip(is_module: bool, zip_mode: str) -> bool:
if zip_mode == "OFF":
return False
if zip_mode == "ALL":
return True
# MODULE_ONLY
return is_module
def ensure_zip_output_dir(source_base: Path, override: Optional[str]) -> Path:
out = Path(override) if override else (source_base / "_zips")
out.mkdir(parents=True, exist_ok=True)
return out
def make_zip_for_folder(src_dir: Path, version: str, out_dir: Path, dry_run: bool) -> Path:
"""
Tworzy .zip z zawartością src_dir (bez nadkatalogów) o nazwie NAME-vVERSION.zip
Zwraca ścieżkę do archiwum.
"""
base_name = f"{src_dir.name}-v{version}"
target = out_dir / (base_name + ".zip")
if dry_run:
print(f"[DRY-RUN][ZIP] {src_dir} -> {target}")
return target
# shutil.make_archive potrzebuje base_name BEZ .zip i root_dir+base_dir
base_name_path = out_dir / base_name
shutil.make_archive(str(base_name_path), "zip", root_dir=str(src_dir), base_dir=".")
print(f"[ZIP] Utworzono {target}")
return target
def parse_args() -> argparse.Namespace:
p = argparse.ArgumentParser(description="Synchronizacja FoundryVTT: AUTO wykrywanie zmian + obsługa modułów/niemodułów.")
p.add_argument("--mode", choices=["auto", "single"], default=MODE,
help=f"Tryb działania (domyślnie: {MODE}).")
p.add_argument("--user", dest="user", default=TARGET_USER,
help=f"Nazwa użytkownika Windows (domyślnie: {TARGET_USER})")
p.add_argument("--appdata-kind", dest="appdata_kind", choices=APPDATA_VARIANTS + (None,),
default=APPDATA_KIND,
help=f"Wymuś AppData wariant: {APPDATA_VARIANTS} lub brak (None). Domyślnie: {APPDATA_KIND}")
p.add_argument("--modules-dir-override", dest="modules_dir_override",
default=TARGET_MODULES_DIR_OVERRIDE,
help="Pełna ścieżka do ...\\FoundryVTT\\Data\\modules (pomija wyszukiwanie).")
p.add_argument("--module-subdir-name", dest="module_subdir_name",
default=MODULE_SUBDIR_NAME,
help=f"Nazwa podkatalogu modułu (tylko w --mode single). Domyślnie: {MODULE_SUBDIR_NAME}")
cd_group = p.add_mutually_exclusive_group()
cd_group.add_argument("--confirm-delete", dest="confirm_delete", action="store_true",
help="Włącz potwierdzenie kasowania.")
cd_group.add_argument("--no-confirm-delete", dest="confirm_delete", action="store_false",
help="Wyłącz potwierdzenie kasowania.")
p.set_defaults(confirm_delete=CONFIRM_DELETE)
p.add_argument("--source-base-dir", dest="source_base_dir",
default=SOURCE_BASE_DIR,
help=f"Katalog źródłowy repo (domyślnie: {SOURCE_BASE_DIR})")
p.add_argument("--relative-pattern", dest="relative_pattern",
default=RELATIVE_PATTERN,
help=f"Wzorzec relatywny od AppData dla katalogu modules (domyślnie: {RELATIVE_PATTERN})")
dr_group = p.add_mutually_exclusive_group()
dr_group.add_argument("--dry-run", dest="dry_run", action="store_true",
help="Tryb symulacji: tylko plan (bez modyfikacji i bez gita).")
dr_group.add_argument("--no-dry-run", dest="dry_run", action="store_false",
help="Tryb wykonawczy: modyfikacje + git.")
p.set_defaults(dry_run=DRY_RUN)
# ZIP options
p.add_argument("--zip-mode", dest="zip_mode",
choices=["ALL", "MODULE_ONLY", "OFF"],
default=ZIP_MODE,
help=f"Zipowanie: ALL | MODULE_ONLY | OFF (domyślnie: {ZIP_MODE})")
p.add_argument("--zip-output-dir", dest="zip_output_dir",
default=ZIP_OUTPUT_DIR,
help="Katalog wyjściowy na zipy (domyślnie: SOURCE_BASE_DIR/_zips)")
return p.parse_args()
def resolve_modules_base(user: str, relative_pattern: str, appdata_kind: Optional[str],
override: Optional[str]) -> Path:
if override:
modules_dir = Path(override)
if not modules_dir.is_dir():
raise FileNotFoundError(f"TARGET_MODULES_DIR_OVERRIDE wskazuje na nieistniejący katalog: {norm(modules_dir)}")
return modules_dir
return find_modules_dir_for_user(user, relative_pattern, appdata_kind)
def process_module(src_dir: Path, modules_base: Path, confirm_delete: bool, dry_run: bool) -> None:
module_id, new_ver = preflight_module(src_dir, dry_run=dry_run)
target_dir = modules_base / src_dir.name
print(f"[INFO][MODULE] Cel modułu: {norm(target_dir)}")
if confirm_delete and not dry_run:
ans = input(f"Czy na pewno wyczyścić zawartość '{norm(target_dir)}'? [y/N]: ").strip().lower()
if ans not in ("y", "yes", "t", "tak"):
raise RuntimeError("Przerwano na życzenie użytkownika.")
if confirm_delete and dry_run:
print("[INFO] (dry-run) Pytanie o potwierdzenie pominięte.")
# ZIP po commicie, przed podmianą
if should_zip(is_module=True, zip_mode=ARGS.zip_mode):
out_dir = ensure_zip_output_dir(Path(ARGS.source_base_dir), ARGS.zip_output_dir)
try:
make_zip_for_folder(src_dir, new_ver, out_dir, dry_run)
except Exception as e:
raise RuntimeError(f"Błąd zipowania modułu {src_dir.name}: {e}") from e
print("[AKCJA] Czyszczenie..." if not dry_run else "[SYMULACJA] Plan czyszczenia...")
del_files, del_dirs = clear_dir_contents(target_dir, dry_run=dry_run)
print(f"[INFO] {'Do usunięcia' if dry_run else 'Usunięto'}: plików={del_files}, katalogów={del_dirs}")
print("[AKCJA] Kopiowanie..." if not dry_run else "[SYMULACJA] Plan kopiowania...")
cp_files, cp_dirs = copy_dir_contents(src_dir, target_dir, dry_run=dry_run)
print(f"[INFO] {'Do skopiowania' if dry_run else 'Skopiowano'}: plików={cp_files}, katalogów={cp_dirs}")
print(f"[DONE][MODULE] {src_dir.name} -> commit 'sync: {module_id} v{new_ver}' wykonany." if not dry_run
else f"[DRY-RUN][MODULE] {src_dir.name} -> commit planowany.")
def process_non_module(src_dir: Path, dry_run: bool) -> None:
new_ver = preflight_non_module(src_dir, dry_run=dry_run)
# ZIP po commicie (jeśli ustawienie pozwala)
if should_zip(is_module=False, zip_mode=ARGS.zip_mode):
out_dir = ensure_zip_output_dir(Path(ARGS.source_base_dir), ARGS.zip_output_dir)
try:
make_zip_for_folder(src_dir, new_ver, out_dir, dry_run)
except Exception as e:
raise RuntimeError(f"Błąd zipowania folderu {src_dir.name}: {e}") from e
print(f"[DONE][FOLDER] {src_dir.name} -> version.nfo = {new_ver}; commit wykonany." if not dry_run
else f"[DRY-RUN][FOLDER] {src_dir.name} -> version.nfo będzie {new_ver}; commit planowany.")
def main() -> int:
global ARGS
ARGS = parse_args()
mode = ARGS.mode
user = ARGS.user
appdata_kind = ARGS.appdata_kind if ARGS.appdata_kind != "None" else None
modules_override = ARGS.modules_dir_override
module_subdir_single = ARGS.module_subdir_name
confirm_delete = ARGS.confirm_delete
source_base = Path(ARGS.source_base_dir)
relative_pattern = ARGS.relative_pattern
dry_run = ARGS.dry_run
if not source_base.is_dir():
raise FileNotFoundError(f"Katalog źródłowy nie istnieje: {norm(source_base)}")
ensure_git_repo(source_base)
# Ustal bazę modules (tylko raz)
modules_base = resolve_modules_base(user, relative_pattern, appdata_kind, modules_override)
print(f"[INFO] Katalog modules base: {norm(modules_base)}")
if mode == "single":
src_dir = source_base / module_subdir_single
if not src_dir.is_dir():
raise FileNotFoundError(f"[SINGLE] Brak katalogu: {norm(src_dir)}")
# Root bump (globalna wersja) tylko jeśli "są zmiany do przetworzenia" (single -> True)
maybe_bump_root_version(source_base, changed_any=True, dry_run=dry_run)
if (src_dir / "module.json").is_file():
print(f"[MODE=SINGLE][MODULE] {src_dir.name}")
process_module(src_dir, modules_base, confirm_delete, dry_run)
else:
print(f"[MODE=SINGLE][FOLDER] {src_dir.name}")
process_non_module(src_dir, dry_run)
print("[SUKCES] Tryb SINGLE zakończony.")
return 0
# AUTO: wykryj zmienione katalogi
changed = git_changed_top_level_dirs(source_base)
print(f"[AUTO] Zmienione katalogi w {norm(source_base)}: {changed if changed else '(brak)'}")
# Root bump (globalna wersja) tylko jeśli są jakiekolwiek zmiany do przetworzenia
maybe_bump_root_version(source_base, changed_any=bool(changed), dry_run=dry_run)
if not changed:
print("[INFO] Brak zmian do przetworzenia.")
return 0
# Przetwarzaj w stałej kolejności
for name in changed:
src_dir = source_base / name
if (src_dir / "module.json").is_file():
print(f"\n[AUTO][MODULE] {name}")
process_module(src_dir, modules_base, confirm_delete, dry_run)
else:
print(f"\n[AUTO][FOLDER] {name}")
process_non_module(src_dir, dry_run)
print("\n[SUKCES] Tryb AUTO zakończony.")
return 0
if __name__ == "__main__":
try:
sys.exit(main())
except AmbiguityError as e:
print("\n[NIERÓWNOZNACZNOŚĆ]\n" + str(e), file=sys.stderr)
sys.exit(2)
except Exception as e:
print("\n[BŁĄD]\n" + str(e), file=sys.stderr)
sys.exit(1)
+1
View File
@@ -0,0 +1 @@
0.3
Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 934 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 794 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

@@ -0,0 +1,31 @@
{
"title": "Investigation Board",
"description": "A Foundry VTT module that lets everyone create, edit, and move sticky and photo notes on the scene as collaborative investigation tools.",
"version": "1.3.2",
"authors": [
{
"name": "Gus",
"url": "",
"email": ""
}
],
"compatibility": {
"minimum": "12",
"verified": "13"
},
"esmodules": [
"scripts/settings.js",
"scripts/investigation-board.js"
],
"styles": [
"styles/style.css"
],
"packs": [],
"templates": [
"templates/drawing-sheet.html"
],
"url": "https://github.com/mordachai/investigation-board",
"manifest": "https://github.com/mordachai/investigation-board/raw/main/module.json",
"download": "https://github.com/mordachai/investigation-board/raw/main/investigation-board.zip",
"id": "investigation-board"
}
@@ -0,0 +1,471 @@
//investigation-boards.js
import { registerSettings } from "./settings.js";
const MODULE_ID = "investigation-board";
const BASE_FONT_SIZE = 15;
const PIN_COLORS = ["redPin.webp", "bluePin.webp", "yellowPin.webp", "greenPin.webp"];
function getBaseCharacterLimits() {
return game.settings.get(MODULE_ID, "baseCharacterLimits") || {
sticky: 60,
photo: 15,
index: 200,
};
}
function getDynamicCharacterLimits(noteType, currentFontSize) {
const baseLimits = getBaseCharacterLimits();
const scaleFactor = BASE_FONT_SIZE / currentFontSize;
const limits = baseLimits[noteType] || { sticky: 60, photo: 15, index: 200 };
return {
sticky: Math.round(limits.sticky * scaleFactor),
photo: Math.round(limits.photo * scaleFactor),
index: Math.round(limits.index * scaleFactor),
};
}
class CustomDrawingSheet extends DrawingConfig {
static get defaultOptions() {
return foundry.utils.mergeObject(super.defaultOptions, {
classes: ["custom-drawing-sheet"],
template: "modules/investigation-board/templates/drawing-sheet.html",
width: 400,
height: "auto",
title: "Note Configuration",
});
}
getData(options) {
const data = super.getData(options);
data.noteType = this.object.flags[MODULE_ID]?.type || "sticky";
data.text = this.object.flags[MODULE_ID]?.text || "Default Text";
data.image = this.object.flags[MODULE_ID]?.image || "modules/investigation-board/assets/placeholder.webp";
// Pass along the extra identityName for futuristic photo notes
data.identityName = this.object.flags[MODULE_ID]?.identityName || "";
// Include the board mode from settings for conditional display in the template
data.boardMode = game.settings.get(MODULE_ID, "boardMode");
data.noteTypes = {
sticky: "Sticky Note",
photo: "Photo Note",
index: "Index Card",
};
return data;
}
async _updateObject(event, formData) {
const updates = {
[`flags.${MODULE_ID}.type`]: formData.noteType,
[`flags.${MODULE_ID}.text`]: formData.text,
[`flags.${MODULE_ID}.image`]: formData.image || "modules/investigation-board/assets/placeholder.webp",
};
if (formData.identityName !== undefined) {
updates[`flags.${MODULE_ID}.identityName`] = formData.identityName;
}
await this.object.update(updates);
const drawing = canvas.drawings.get(this.object.id);
if (drawing) drawing.refresh();
}
// Add activateListeners to hook up the file-picker button.
activateListeners(element) {
super.activateListeners(element);
element.querySelectorAll(".file-picker-button").forEach(btn => btn.addEventListener("click", ev => {
ev.preventDefault();
// Open Foundry's FilePicker for images; adjust the "current" directory if needed.
new FilePicker({
type: "image",
current: "modules/investigation-board/assets/",
callback: path => {
// Update the readonly input with the chosen image path.
const input = element.querySelector("input[name='image']"); if (input) input.value = path;
}
}).browse();
}));
}
}
class CustomDrawing extends Drawing {
constructor(...args) {
super(...args);
this.bgSprite = null;
this.pinSprite = null;
this.noteText = null;
this.photoImageSprite = null;
this.identityNameText = null;
this.futuristicText = null;
}
// Ensure sprites are created when the drawing is first rendered.
async draw() {
await super.draw();
await this._updateSprites();
return this;
}
// Ensure sprites update correctly on refresh.
async refresh() {
await super.refresh();
await this._updateSprites();
return this;
}
async _updateSprites() {
const noteData = this.document.flags[MODULE_ID];
if (!noteData) return;
const isPhoto = noteData.type === "photo";
const isIndex = noteData.type === "index";
const mode = game.settings.get(MODULE_ID, "boardMode");
// FUTURISTIC PHOTO NOTE LAYOUT
if (isPhoto && mode === "futuristic") {
const fullWidth = game.settings.get(MODULE_ID, "photoNoteWidth");
const margin = 10;
const photoImgWidth = fullWidth * 0.4;
const photoImgHeight = photoImgWidth * (4 / 3);
const textAreaX = margin + photoImgWidth + margin;
const fullHeight = photoImgHeight + margin * 2;
// --- Background Frame ---
if (!this.bgSprite) {
this.bgSprite = new PIXI.Sprite();
this.addChildAt(this.bgSprite, 0);
}
try {
// Always use the fixed photo frame image.
this.bgSprite.texture = PIXI.Texture.from("modules/investigation-board/assets/photoFrame.webp");
} catch (err) {
console.error("Failed to load photo frame texture", err);
this.bgSprite.texture = PIXI.Texture.EMPTY;
}
this.bgSprite.width = fullWidth;
this.bgSprite.height = fullHeight;
// --- Foreground (User-Assigned) Photo ---
if (!this.photoImageSprite) {
this.photoImageSprite = new PIXI.Sprite();
this.addChild(this.photoImageSprite);
}
try {
// Use a fallback if no image is assigned.
const imagePath = noteData.image || "modules/investigation-board/assets/placeholder.webp";
this.photoImageSprite.texture = PIXI.Texture.from(imagePath);
} catch (err) {
console.error(`Failed to load user photo: ${noteData.image}`, err);
this.photoImageSprite.texture = PIXI.Texture.EMPTY;
}
// Position the user photo inside the frame.
this.photoImageSprite.width = fullWidth * 0.9;
this.photoImageSprite.height = fullHeight * 0.9;
this.photoImageSprite.position.set(fullWidth * 0.05, fullHeight * 0.05);
// --- Identity Name and Additional Text (Futuristic) ---
const font = game.settings.get(MODULE_ID, "font");
const baseFontSize = game.settings.get(MODULE_ID, "baseFontSize");
const fontSize = (fullWidth / 200) * baseFontSize;
const textStyle = new PIXI.TextStyle({
fontFamily: font,
fontSize: fontSize,
fill: "#000000",
wordWrap: true,
wordWrapWidth: fullWidth - textAreaX - margin,
align: "left",
});
if (!this.identityNameText) {
this.identityNameText = new PIXI.Text("", textStyle);
this.addChild(this.identityNameText);
}
this.identityNameText.text = noteData.identityName || "Name";
this.identityNameText.style = textStyle;
this.identityNameText.position.set(textAreaX, margin);
if (!this.futuristicText) {
this.futuristicText = new PIXI.Text("", textStyle);
this.addChild(this.futuristicText);
}
this.futuristicText.text = noteData.text || "";
this.futuristicText.style = textStyle;
this.futuristicText.position.set(textAreaX, margin + this.identityNameText.height + 5);
// Remove default note text if present.
if (this.noteText) {
this.removeChild(this.noteText);
this.noteText.destroy();
this.noteText = null;
}
// --- Pin Handling (Futuristic) ---
const pinSetting = game.settings.get(MODULE_ID, "pinColor");
if (pinSetting === "none") {
if (this.pinSprite) {
this.removeChild(this.pinSprite);
this.pinSprite.destroy();
this.pinSprite = null;
}
} else {
if (!this.pinSprite) {
this.pinSprite = new PIXI.Sprite();
this.addChild(this.pinSprite);
}
let pinColor = noteData.pinColor;
if (!pinColor) {
pinColor = (pinSetting === "random")
? PIN_COLORS[Math.floor(Math.random() * PIN_COLORS.length)]
: `${pinSetting}Pin.webp`;
if (this.document.isOwner) {
await this.document.update({ [`flags.${MODULE_ID}.pinColor`]: pinColor });
}
}
const pinImage = `modules/investigation-board/assets/${pinColor}`;
try {
this.pinSprite.texture = PIXI.Texture.from(pinImage);
} catch (err) {
console.error(`Failed to load pin texture: ${pinImage}`, err);
this.pinSprite.texture = PIXI.Texture.EMPTY;
}
this.pinSprite.width = 40;
this.pinSprite.height = 40;
this.pinSprite.position.set(fullWidth / 2 - 20, 3);
}
return; // End early for futuristic photo notes.
}
// STANDARD LAYOUT (Modern photo notes, sticky, index, etc.)
const width = isPhoto
? game.settings.get(MODULE_ID, "photoNoteWidth")
: isIndex
? game.settings.get(MODULE_ID, "indexNoteWidth") || 600
: game.settings.get(MODULE_ID, "stickyNoteWidth");
const height = isPhoto
? Math.round(width / (225 / 290))
: isIndex
? Math.round(width / (600 / 400))
: width;
// Background Image based on board mode.
const getBackgroundImage = (noteType, mode) => {
if (mode === "futuristic") {
if (noteType === "photo") return "modules/investigation-board/assets/futuristic_photoFrame.webp";
if (noteType === "index") return "modules/investigation-board/assets/futuristic_note_index.webp";
return "modules/investigation-board/assets/futuristic_note_white.webp";
} else if (mode === "custom") {
if (noteType === "photo") return "modules/investigation-board/assets/custom_photoFrame.webp";
if (noteType === "index") return "modules/investigation-board/assets/custom_note_index.webp";
return "modules/investigation-board/assets/custom_note_white.webp";
}
// Default "modern" mode:
if (noteType === "photo") return "modules/investigation-board/assets/photoFrame.webp";
if (noteType === "index") return "modules/investigation-board/assets/note_index.webp";
return "modules/investigation-board/assets/note_white.webp";
};
const bgImage = getBackgroundImage(noteData.type, mode);
if (!this.bgSprite) {
this.bgSprite = new PIXI.Sprite();
this.addChild(this.bgSprite);
}
try {
this.bgSprite.texture = PIXI.Texture.from(bgImage);
} catch (err) {
console.error(`Failed to load background texture: ${bgImage}`, err);
this.bgSprite.texture = PIXI.Texture.EMPTY;
}
this.bgSprite.width = width;
this.bgSprite.height = height;
// --- Foreground (User-Assigned) Photo for Modern Mode ---
// (This is the code missing from your current version.)
if (isPhoto) {
const fgImage = noteData.image || "modules/investigation-board/assets/placeholder.webp";
if (!this.photoImageSprite) {
this.photoImageSprite = new PIXI.Sprite();
this.addChild(this.photoImageSprite);
}
try {
this.photoImageSprite.texture = PIXI.Texture.from(fgImage);
} catch (err) {
console.error(`Failed to load foreground texture: ${fgImage}`, err);
this.photoImageSprite.texture = PIXI.Texture.EMPTY;
}
// Use offsets similar to your old code.
const widthOffset = width * 0.13333;
const heightOffset = height * 0.30246;
this.photoImageSprite.width = width - widthOffset;
this.photoImageSprite.height = height - heightOffset;
this.photoImageSprite.position.set(widthOffset / 2, heightOffset / 2);
this.photoImageSprite.visible = true;
} else if (this.photoImageSprite) {
this.photoImageSprite.visible = false;
}
// --- Pin Handling (Standard) ---
{
const pinSetting = game.settings.get(MODULE_ID, "pinColor");
if (pinSetting === "none") {
if (this.pinSprite) {
this.removeChild(this.pinSprite);
this.pinSprite.destroy();
this.pinSprite = null;
}
} else {
if (!this.pinSprite) {
this.pinSprite = new PIXI.Sprite();
this.addChild(this.pinSprite);
}
let pinColor = noteData.pinColor;
if (!pinColor) {
pinColor = (pinSetting === "random")
? PIN_COLORS[Math.floor(Math.random() * PIN_COLORS.length)]
: `${pinSetting}Pin.webp`;
if (this.document.isOwner) {
await this.document.update({ [`flags.${MODULE_ID}.pinColor`]: pinColor });
}
}
const pinImage = `modules/investigation-board/assets/${pinColor}`;
try {
this.pinSprite.texture = PIXI.Texture.from(pinImage);
} catch (err) {
console.error(`Failed to load pin texture: ${pinImage}`, err);
this.pinSprite.texture = PIXI.Texture.EMPTY;
}
this.pinSprite.width = 40;
this.pinSprite.height = 40;
this.pinSprite.position.set(width / 2 - 20, 3);
}
}
// Default text layout for non-futuristic notes.
const font = game.settings.get(MODULE_ID, "font");
const baseFontSize = game.settings.get(MODULE_ID, "baseFontSize");
const fontSize = (width / 200) * baseFontSize;
const textStyle = new PIXI.TextStyle({
fontFamily: font,
fontSize: fontSize,
fill: "#000000",
wordWrap: true,
wordWrapWidth: width - 15,
align: "center",
});
const truncatedText = this._truncateText(noteData.text || "Default Text", font, noteData.type, fontSize);
if (!this.noteText) {
this.noteText = new PIXI.Text(truncatedText, textStyle);
this.noteText.anchor.set(0.5);
this.addChild(this.noteText);
} else {
this.noteText.style = textStyle;
this.noteText.text = truncatedText;
}
this.noteText.position.set(width / 2, isPhoto ? height - 25 : height / 2);
}
_truncateText(text, font, noteType, currentFontSize) {
const limits = getDynamicCharacterLimits(font, currentFontSize);
const charLimit = limits[noteType] || 100;
return text.length <= charLimit ? text : text.slice(0, charLimit).trim() + "...";
}
}
async function createNote(noteType) {
const scene = canvas.scene;
if (!scene) {
console.error("Cannot create note: No active scene.");
return;
}
// Retrieve width settings (or use defaults)
const stickyW = game.settings.get(MODULE_ID, "stickyNoteWidth") || 200;
const photoW = game.settings.get(MODULE_ID, "photoNoteWidth") || 225;
const indexW = game.settings.get(MODULE_ID, "indexNoteWidth") || 600;
const width = noteType === "photo" ? photoW
: noteType === "index" ? indexW
: stickyW;
const height = noteType === "photo" ? Math.round(photoW / (225 / 290))
: noteType === "index" ? Math.round(indexW / (600 / 400))
: stickyW;
const dims = canvas.dimensions;
const x = dims.width / 2;
const y = dims.height / 2;
// Get default text from settings (fallback if missing)
const defaultText = game.settings.get(MODULE_ID, `${noteType}NoteDefaultText`) || "Notes";
// Determine board mode and include identityName if note is a futuristic photo note
const boardMode = game.settings.get(MODULE_ID, "boardMode");
const extraFlags = {};
if (noteType === "photo" && boardMode === "futuristic") {
extraFlags.identityName = "";
}
await canvas.scene.createEmbeddedDocuments("Drawing", [
{
type: "r",
author: game.user.id,
x,
y,
shape: { width, height },
fillColor: "#ffffff",
fillAlpha: 1,
strokeColor: "transparent",
strokeAlpha: 0,
locked: false,
flags: {
[MODULE_ID]: {
type: noteType,
text: defaultText,
...extraFlags
},
},
"flags.core.sheetClass": "investigation-board.CustomDrawingSheet",
"ownership": { default: 3 },
},
]);
canvas.drawings.activate();
}
Hooks.on("getSceneControlButtons", (controls) => {
const journalControls = Array.isArray(controls) ? controls.find((c) => c.name === "notes") : (controls["notes"] ?? controls.notes);
if (!journalControls) return;
journalControls.tools.push(
{ name: "createStickyNote", title: "Create Sticky Note", icon: "fa-solid fa-note-sticky", onChange: (ev, active) => { if (active) createNote("sticky"); }, button: true },
{ name: "createPhotoNote", title: "Create Photo Note", icon: "fa-solid fa-camera-polaroid", onChange: (ev, active) => { if (active) createNote("photo"); }, button: true },
{ name: "createIndexCard", title: "Create Index Card", icon: "fa-regular fa-rectangle-list", onChange: (ev, active) => { if (active) createNote("index"); }, button: true }
);
});
Hooks.once("init", () => {
registerSettings();
CONFIG.Drawing.objectClass = CustomDrawing;
DocumentSheetConfig.registerSheet(DrawingDocument, "investigation-board", CustomDrawingSheet, {
label: "Note Drawing Sheet",
types: ["base"],
makeDefault: false,
});
console.log("Investigation Board module initialized.");
});
export { CustomDrawing, CustomDrawingSheet };
@@ -0,0 +1,167 @@
export const MODULE_ID = "investigation-board";
export const registerSettings = function() {
const refreshAllDrawings = () => {
if (canvas.drawings) {
canvas.drawings.placeables.forEach(drawing => {
if (drawing.document.flags[MODULE_ID]) {
drawing.refresh();
}
});
}
};
// Update the pinColor setting to include a "No Pins" option.
game.settings.register(MODULE_ID, "pinColor", {
name: "Pin Color",
hint: "Choose the color of the pin for notes. Selecting 'Random' will randomly assign a pin color. Select 'No Pins' to disable pin display.",
scope: "world",
config: true,
type: String,
choices: {
random: "Random",
red: "Red",
blue: "Blue",
yellow: "Yellow",
green: "Green",
none: "No Pins"
},
default: "random",
onChange: () => {
if (canvas.drawings) {
canvas.drawings.placeables.forEach(drawing => drawing.refresh());
}
}
});
// Register a new setting for board mode selection.
game.settings.register(MODULE_ID, "boardMode", {
name: "Board Mode",
hint: "Select the board mode to change the styling of notes.",
scope: "world",
config: true,
type: String,
choices: {
modern: "Modern",
futuristic: "Futuristic",
custom: "Custom"
},
default: "modern",
onChange: () => refreshAllDrawings()
});
// Register existing settings
game.settings.register(MODULE_ID, "stickyNoteWidth", {
name: "Sticky Note Width",
hint: "The width (in pixels) for all newly created sticky notes (default: 200).",
scope: "world",
config: true,
type: Number,
default: 200,
onChange: () => refreshAllDrawings()
});
game.settings.register(MODULE_ID, "photoNoteWidth", {
name: "Photo Note Width",
hint: "The width (in pixels) for all newly created photo notes (default: 225).",
scope: "world",
config: true,
type: Number,
default: 225,
onChange: () => refreshAllDrawings()
});
game.settings.register(MODULE_ID, "indexNoteWidth", {
name: "Index Note Width",
hint: "The width (in pixels) for all newly created index cards (default: 600).",
scope: "world",
config: true,
type: Number,
default: 600,
onChange: () => refreshAllDrawings()
});
game.settings.register(MODULE_ID, "baseFontSize", {
name: "Base Font Size",
hint: "The font size (in pixels) for text when the note width is at its default size (default: 16).",
scope: "world",
config: true,
type: Number,
default: 16,
onChange: () => refreshAllDrawings()
});
game.settings.register(MODULE_ID, "font", {
name: "Font",
hint: "Choose the font to be used in notes.",
scope: "world",
config: true,
type: String,
choices: {
"Rock Salt": "Rock Salt",
"Courier New": "Courier New",
"Times New Roman": "Times New Roman",
"Signika": "Signika",
"Arial": "Arial"
},
default: "Rock Salt",
onChange: () => refreshAllDrawings()
});
game.settings.register(MODULE_ID, "characterNameKey", {
name: "Character Name Key",
hint: "Specify the key path to retrieve the name (e.g., 'prototypeToken.name' or 'system.alias' for Blades in the Dark). If empty, defaults to 'name'.",
scope: "world",
config: true,
default: "prototypeToken.name",
type: String,
});
game.settings.register(MODULE_ID, "stickyNoteDefaultText", {
name: "Default Sticky Note Text",
hint: "The default text to use for new sticky notes.",
scope: "world",
config: true,
type: String,
default: "Clue",
onChange: () => refreshAllDrawings()
});
game.settings.register(MODULE_ID, "photoNoteDefaultText", {
name: "Default Photo Note Text",
hint: "The default text to use for new photo notes.",
scope: "world",
config: true,
type: String,
default: "Suspect/Place",
onChange: () => refreshAllDrawings()
});
game.settings.register(MODULE_ID, "indexNoteDefaultText", {
name: "Default Index Note Text",
hint: "The default text to use for new index notes.",
scope: "world",
config: true,
type: String,
default: "Notes",
onChange: () => refreshAllDrawings()
});
// Register base font size and character limits
game.settings.register(MODULE_ID, "baseCharacterLimits", {
name: "Base Character Limits",
hint: "The base character limits for each font and note type. Edit this JSON to customize.",
scope: "world",
config: false, // Hidden from the settings UI
type: Object,
default: {
"Rock Salt": { sticky: 90, photo: 20, index: 210 },
"Courier New": { sticky: 250, photo: 30, index: 580 },
"Times New Roman": { sticky: 200, photo: 30, index: 800 },
"Signika": { sticky: 200, photo: 30, index: 650 },
"Arial": { sticky: 200, photo: 30, index: 650 }
}
});
};
@@ -0,0 +1,134 @@
@font-face {
font-family: 'Rock Salt';
src: url('../assets/fonts/rock_salt.ttf') format('ttf');
font-weight: normal;
font-style: normal;
}
.custom-drawing-text {
font-family: 'Rock Salt', Arial, sans-serif;
color: #000000; /* Black text */
}
.sticky-note {
background-image: url("modules/investigation-board/assets/note_white.webp");
width: 200px;
height: 200px;
}
.photo-note {
background-image: url("modules/investigation-board/assets/photoFrame.webp");
width: 250px;
height: 310px;
}
/* EDIT FORM */
/*
.note-config-wrapper {
position: relative;
width: 400px;
min-height: 310px;
background-repeat: no-repeat;
background-position: center;
background-size: cover;
box-shadow: 0 0 10px rgba(0,0,0,0.5);
border: none;
}
.note-config-wrapper.sticky-mode {
background-image: url("../assets/note_white.webp");
background-repeat: no-repeat;
background-size: contain;
}
.note-config-wrapper.photo-mode {
background-image: url("../assets/photoFrame.webp");
background-repeat: no-repeat;
background-size: cover;
}
.note-config-wrapper .window-content {
background: none;
border: none;
}
.note-config-wrapper form {
position: relative;
width: 100%;
height: 100%;
overflow: hidden;
}
.note-type-group {
position: absolute;
top: 10px;
left: 10px;
width: 150px;
}
.note-text-group {
position: absolute;
left: 20px;
width: 360px;
}
.note-config-wrapper.sticky-mode .note-text-group {
top: 100px;
}
.note-config-wrapper.photo-mode .note-text-group {
top: 220px;
}
.note-image-group {
position: absolute;
top: 50px;
right: 20px;
width: 200px;
}
.note-save-group {
position: absolute;
bottom: 10px;
right: 10px;
}
.note-config-wrapper input,
.note-config-wrapper textarea,
.note-config-wrapper select {
background: rgba(255, 255, 255, 0.9);
border: 1px solid #ccc;
border-radius: 2px;
padding: 4px;
font-size: 14px;
font-family: Arial, sans-serif;
}
.note-config-wrapper label {
font-size: 12px;
font-weight: bold;
color: #333;
margin-bottom: 3px;
display: inline-block;
}
.file-picker-button {
margin-left: 5px;
background: #eee;
border: 1px solid #ccc;
padding: 2px 4px;
cursor: pointer;
}
.save-button {
background: #3f51b5;
color: #fff;
border: none;
padding: 5px 10px;
cursor: pointer;
font-size: 14px;
border-radius: 2px;
}
.save-button i {
margin-right: 5px;
} */
@@ -0,0 +1,37 @@
<form>
<div class="form-group">
<label for="text">Note Text:</label>
<textarea name="text" rows="4">{{text}}</textarea>
</div>
{{!-- Only show the Image Path field for photo notes --}}
{{#if (eq noteType "photo")}}
<div class="form-group" style="display: block;">
<label for="image">Image Path:</label>
<div class="file-picker">
<input type="text" name="image" value="{{image}}" placeholder="Enter image path" readonly />
<button type="button" class="file-picker-button">
<i class="fas fa-folder-open"></i> Browse
</button>
</div>
</div>
{{else}}
<div class="form-group" style="display: none;"></div>
{{/if}}
{{!-- If boardMode is futuristic and noteType is photo, show the extra Identity Name field --}}
{{#if (eq noteType "photo")}}
{{#if (eq boardMode "futuristic")}}
<div class="form-group" style="display: block;">
<label for="identityName">Identity Name:</label>
<input type="text" name="identityName" value="{{identityName}}" placeholder="Enter identity name" />
</div>
{{/if}}
{{/if}}
<div class="form-group">
<button type="submit" class="save-button">
<i class="fas fa-save"></i> Save
</button>
</div>
</form>
+1
View File
@@ -0,0 +1 @@
0.2
+516
View File
@@ -0,0 +1,516 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Control Board Monitor - v0.1
A lightweight Windows-friendly Python GUI to monitor server variables exposed via
HTTP GET as "/?variable=VARNAME".
- Defaults: host="localhost", port=8945 (edit globals below or use the GUI).
- Refreshes automatically every minute.
- Fetches variables sequentially with a configurable Requests-Per-Second (RPS) cap
and automatic backoff on HTTP 429/5xx to avoid overwhelming the server.
- Attempts to discover the variable list via WEBSERVER_LIST_VARIABLES_JSON, then
WEBSERVER_LIST_VARIABLES. You can also paste/import a list manually in the GUI.
- First version focuses on read-only monitoring. Next versions can add POST controls
to set variables and turn some values into indicator widgets.
No external GUI frameworks are required (uses Tkinter from the standard library).
No non-stdlib HTTP client is required (uses urllib).
"""
import json
import queue
import re
import threading
import time
import urllib.parse
import urllib.request
from dataclasses import dataclass, field
from datetime import datetime
from typing import Dict, List, Optional, Tuple
try:
import tkinter as tk
from tkinter import ttk, messagebox, simpledialog
except Exception as e:
raise SystemExit("Tkinter is required to run this app.")
# =====================
# Global configuration
# =====================
SERVER_HOST: str = "localhost" # default host
SERVER_PORT: int = 8785 # default port (as requested)
REFRESH_INTERVAL_S: int = 60 # run a full sweep roughly every minute
MAX_RPS: float = 5.0 # cap average requests/sec to avoid overload
REQUEST_TIMEOUT_S: float = 5.0 # per-request timeout
USER_AGENT: str = "ControlBoardMonitor/0.1 (+tkinter)"
CONNECT_TIMEOUT_S: float = 5.0
# Backoff
BACKOFF_BASE_S: float = 1.0 # initial backoff
BACKOFF_MAX_S: float = 15.0 # max backoff between retries
MAX_RETRIES: int = 2 # retries per variable within a cycle
# =====================
# Helper utilities
# =====================
def http_get(base_url: str, params: Dict[str, str]) -> Tuple[int, str, Dict[str, str]]:
"""Perform a GET with urllib. Returns (status, text, headers)."""
url = base_url + "?" + urllib.parse.urlencode(params)
req = urllib.request.Request(url, headers={"User-Agent": USER_AGENT})
try:
with urllib.request.urlopen(req, timeout=REQUEST_TIMEOUT_S) as resp:
status = resp.getcode()
body_bytes = resp.read()
try:
body = body_bytes.decode("utf-8", errors="replace")
except Exception:
body = body_bytes.decode("latin-1", errors="replace")
headers = {k.lower(): v for k, v in resp.getheaders()}
return status, body, headers
except urllib.error.HTTPError as e:
try:
body = e.read().decode("utf-8", errors="replace")
except Exception:
body = str(e)
return e.code, body, dict(e.headers or {})
except Exception as e:
return 0, str(e), {}
def build_base_url(host: str, port: int) -> str:
scheme = "http"
return f"{scheme}://{host}:{port}/"
def parse_variable_names_from_html_index(html_text: str) -> List[str]:
"""Best-effort extraction of variable names from the simple HTML index page style."""
vars_found: List[str] = []
for m in re.finditer(r"[?&]variable=([A-Z0-9_]+)", html_text):
vars_found.append(m.group(1))
# De-duplicate preserving order
seen = set()
uniq = []
for v in vars_found:
if v not in seen:
uniq.append(v)
seen.add(v)
return uniq
def coerce_preview(value: str, maxlen: int = 80) -> str:
v = value.strip().replace("\r", " ").replace("\n", " ")
if len(v) > maxlen:
return v[:maxlen - 1] + ""
return v
def infer_status_color(value: str) -> str:
"""Very simple status → tag mapping to mimic control-board feel."""
val = value.strip().lower()
if val in {"1", "true", "on", "open", "active", "ok", "running", "enabled"}:
return "ok"
if val in {"0", "false", "off", "closed", "inactive", "error", "fault", "disabled"}:
return "bad"
# Warn if it's empty or has obvious error keywords
if val == "" or "exception" in val or "error" in val:
return "bad"
return "neutral"
# =====================
# Data model
# =====================
@dataclass
class VarInfo:
name: str
last_value: str = ""
last_updated: float = 0.0
last_status: int = 0
error: Optional[str] = None
# =====================
# Poller thread
# =====================
class Poller(threading.Thread):
def __init__(
self,
host: str,
port: int,
variables: List[str],
ui_queue: queue.Queue,
refresh_interval: int,
max_rps: float,
stop_event: threading.Event,
paused_event: threading.Event,
) -> None:
super().__init__(daemon=True)
self.host = host
self.port = port
self.variables = variables
self.ui_queue = ui_queue
self.refresh_interval = int(max(5, refresh_interval))
self.max_rps = max(0.5, max_rps)
self.stop_event = stop_event
self.paused_event = paused_event
def run(self) -> None:
base_url = build_base_url(self.host, self.port)
min_spacing = 1.0 / self.max_rps # seconds between requests
while not self.stop_event.is_set():
cycle_start = time.time()
self.ui_queue.put(("cycle_start", datetime.now().strftime("%H:%M:%S")))
for name in list(self.variables):
# Allow pausing mid-cycle
while self.paused_event.is_set() and not self.stop_event.is_set():
time.sleep(0.1)
if self.stop_event.is_set():
break
attempt = 0
backoff = BACKOFF_BASE_S
while attempt <= MAX_RETRIES and not self.stop_event.is_set():
attempt += 1
t0 = time.time()
status, body, headers = http_get(base_url, {"variable": name})
# Success path
if status == 200:
self.ui_queue.put(("update", name, body, status))
break
# Backoff on overload or server error
if status in (429, 500, 502, 503, 504, 0):
self.ui_queue.put(("error", name, status, coerce_preview(body, 200)))
time.sleep(backoff)
backoff = min(BACKOFF_MAX_S, backoff * 2.0)
else:
# Other HTTP errors: report once and stop retrying
self.ui_queue.put(("error", name, status, coerce_preview(body, 200)))
break
# Respect RPS even with errors
dt = time.time() - t0
if dt < min_spacing:
time.sleep(min_spacing - dt)
# Spacing between requests
dt = time.time() - t0
if dt < min_spacing:
time.sleep(min_spacing - dt)
# Sleep to align roughly to the refresh interval
cycle_dt = time.time() - cycle_start
remaining = self.refresh_interval - cycle_dt
if remaining > 0:
for _ in range(int(remaining * 10)):
if self.stop_event.is_set():
break
time.sleep(0.1)
self.ui_queue.put(("stopped", ""))
# =====================
# GUI
# =====================
class App(tk.Tk):
def __init__(self) -> None:
super().__init__()
self.title("Control Board Monitor")
self.geometry("1100x700")
try:
self.iconbitmap(default="") # no icon file bundled
except Exception:
pass
# State
self.vars: Dict[str, VarInfo] = {}
self.stop_event = threading.Event()
self.paused_event = threading.Event()
self.ui_queue: queue.Queue = queue.Queue()
self.poller: Optional[Poller] = None
self.variables_list: List[str] = []
# Top controls
controls = ttk.Frame(self, padding=10)
controls.pack(side=tk.TOP, fill=tk.X)
self.host_var = tk.StringVar(value=SERVER_HOST)
self.port_var = tk.IntVar(value=SERVER_PORT)
self.refresh_var = tk.IntVar(value=REFRESH_INTERVAL_S)
self.rps_var = tk.DoubleVar(value=MAX_RPS)
ttk.Label(controls, text="Host:").grid(row=0, column=0, sticky="w")
ttk.Entry(controls, textvariable=self.host_var, width=16).grid(row=0, column=1, padx=(0, 12))
ttk.Label(controls, text="Port:").grid(row=0, column=2, sticky="w")
ttk.Entry(controls, textvariable=self.port_var, width=8).grid(row=0, column=3, padx=(0, 12))
ttk.Label(controls, text="Refresh (s):").grid(row=0, column=4, sticky="w")
ttk.Entry(controls, textvariable=self.refresh_var, width=8).grid(row=0, column=5, padx=(0, 12))
ttk.Label(controls, text="Max RPS:").grid(row=0, column=6, sticky="w")
ttk.Entry(controls, textvariable=self.rps_var, width=8).grid(row=0, column=7, padx=(0, 12))
self.status_lbl = ttk.Label(controls, text="Idle", foreground="#666")
self.status_lbl.grid(row=0, column=8, padx=(10, 0))
btns = ttk.Frame(controls)
btns.grid(row=0, column=9, padx=10, sticky="e")
self.start_btn = ttk.Button(btns, text="Start", command=self.start_polling)
self.start_btn.grid(row=0, column=0, padx=4)
self.pause_btn = ttk.Button(btns, text="Pause", command=self.toggle_pause, state="disabled")
self.pause_btn.grid(row=0, column=1, padx=4)
self.reload_btn = ttk.Button(btns, text="Reload Vars", command=self.reload_variables)
self.reload_btn.grid(row=0, column=2, padx=4)
self.import_btn = ttk.Button(btns, text="Import List", command=self.import_list_dialog)
self.import_btn.grid(row=0, column=3, padx=4)
# Filter/Search
search_frame = ttk.Frame(self, padding=(10, 0, 10, 10))
search_frame.pack(side=tk.TOP, fill=tk.X)
ttk.Label(search_frame, text="Filter:").pack(side=tk.LEFT)
self.filter_var = tk.StringVar(value="")
self.filter_var.trace_add("write", lambda *_: self.refresh_tree())
ttk.Entry(search_frame, textvariable=self.filter_var, width=50).pack(side=tk.LEFT, padx=8)
# Tree (control-board style with groups)
columns = ("value", "updated", "status")
self.tree = ttk.Treeview(self, columns=columns, show="tree headings", height=26)
self.tree.pack(side=tk.TOP, fill=tk.BOTH, expand=True, padx=10, pady=10)
self.tree.heading("#0", text="Variable")
self.tree.heading("value", text="Value")
self.tree.heading("updated", text="Updated")
self.tree.heading("status", text="HTTP")
self.tree.column("#0", width=420, anchor="w")
self.tree.column("value", width=420, anchor="w")
self.tree.column("updated", width=120, anchor="center")
self.tree.column("status", width=60, anchor="center")
# Style tags for a control-board feel
style = ttk.Style(self)
try:
style.theme_use("clam")
except Exception:
pass
self.tree.tag_configure("ok", background="#eaffea") # soft green
self.tree.tag_configure("bad", background="#ffecec") # soft red
self.tree.tag_configure("neutral", background="#f5f7fb") # soft gray-blue
# Footer
footer = ttk.Frame(self, padding=10)
footer.pack(side=tk.BOTTOM, fill=tk.X)
self.cycle_lbl = ttk.Label(footer, text="Last cycle: —")
self.cycle_lbl.pack(side=tk.LEFT)
self.protocol("WM_DELETE_WINDOW", self.on_close)
# Initial discovery
self.after(200, self.reload_variables)
# ------------- Variable discovery -------------
def reload_variables(self) -> None:
host = self.host_var.get().strip()
port = int(self.port_var.get())
base = build_base_url(host, port)
discovered: List[str] = []
# Try JSON list first
status, body, _ = http_get(base, {"variable": "WEBSERVER_LIST_VARIABLES_JSON"})
if status == 200:
try:
data = json.loads(body)
if isinstance(data, list) and all(isinstance(x, str) for x in data):
discovered = list(dict.fromkeys(data)) # preserve order, unique
except Exception:
discovered = []
# Fallback: parse the human/HTML list
if not discovered:
status, body, _ = http_get(base, {"variable": "WEBSERVER_LIST_VARIABLES"})
if status == 200 and body:
cand = parse_variable_names_from_html_index(body)
if cand:
discovered = cand
# If still empty, offer a minimal starter set
if not discovered:
discovered = [
"TIME", "TIME_STAMP", "CORE_TEMP", "CORE_PRESSURE", "CORE_STATE",
"COOLANT_CORE_PRESSURE", "COOLANT_CORE_FLOW_IN", "COOLANT_CORE_FLOW_OUT",
"STEAM_TURBINE_0_RPM", "POWER_FROM_TURBINE_KW", "POWER_DEMAND_MW",
]
# Update local state
self.variables_list = discovered
self.vars.clear()
for v in discovered:
self.vars[v] = VarInfo(name=v)
self.status_lbl.configure(text=f"Loaded {len(discovered)} vars")
self.refresh_tree()
def import_list_dialog(self) -> None:
txt = simpledialog.askstring(
"Import variable names",
"Paste variable names separated by spaces, commas, or newlines:",
parent=self,
)
if not txt:
return
names = re.findall(r"[A-Z0-9_]+", txt.upper())
if not names:
messagebox.showwarning("Nothing found", "No variable-like tokens found.")
return
# Deduplicate while preserving order
uniq = []
seen = set()
for n in names:
if n not in seen:
uniq.append(n); seen.add(n)
self.variables_list = uniq
self.vars.clear()
for v in uniq:
self.vars[v] = VarInfo(name=v)
self.status_lbl.configure(text=f"Imported {len(uniq)} vars")
self.refresh_tree()
# ------------- Poller control -------------
def start_polling(self) -> None:
if self.poller and self.poller.is_alive():
messagebox.showinfo("Already running", "Polling is already active.")
return
if not self.variables_list:
messagebox.showwarning("No variables", "Variable list is empty. Reload or import a list first.")
return
self.stop_event.clear()
self.paused_event.clear()
self.poller = Poller(
host=self.host_var.get().strip(),
port=int(self.port_var.get()),
variables=self.variables_list,
ui_queue=self.ui_queue,
refresh_interval=int(self.refresh_var.get()),
max_rps=float(self.rps_var.get()),
stop_event=self.stop_event,
paused_event=self.paused_event,
)
self.poller.start()
self.start_btn.configure(state="disabled")
self.pause_btn.configure(state="normal", text="Pause")
self.status_lbl.configure(text="Running…")
self.after(100, self.drain_queue)
def toggle_pause(self) -> None:
if not (self.poller and self.poller.is_alive()):
return
if self.paused_event.is_set():
self.paused_event.clear()
self.pause_btn.configure(text="Pause")
self.status_lbl.configure(text="Running…")
else:
self.paused_event.set()
self.pause_btn.configure(text="Resume")
self.status_lbl.configure(text="Paused")
def drain_queue(self) -> None:
"""Receive updates from the poller and apply to the UI safely from the main thread."""
try:
while True:
item = self.ui_queue.get_nowait()
kind = item[0]
if kind == "update":
_, name, value, status = item
vi = self.vars.get(name) or VarInfo(name=name)
vi.last_value = value
vi.last_updated = time.time()
vi.last_status = status
vi.error = None
self.vars[name] = vi
elif kind == "error":
_, name, status, msg = item
vi = self.vars.get(name) or VarInfo(name=name)
vi.last_status = status
vi.error = msg
vi.last_updated = time.time()
self.vars[name] = vi
elif kind == "cycle_start":
_, hhmmss = item
self.cycle_lbl.configure(text=f"Last cycle start: {hhmmss}")
elif kind == "stopped":
self.status_lbl.configure(text="Stopped")
self.ui_queue.task_done()
except queue.Empty:
pass
self.refresh_tree()
if self.poller and self.poller.is_alive():
self.after(250, self.drain_queue) # continue pumping
def stop_polling(self) -> None:
if self.poller and self.poller.is_alive():
self.stop_event.set()
# give it a moment to end gracefully
for _ in range(20):
if not self.poller.is_alive():
break
time.sleep(0.05)
self.start_btn.configure(state="normal")
self.pause_btn.configure(state="disabled", text="Pause")
# ------------- Tree rendering -------------
def refresh_tree(self) -> None:
# Clear existing
self.tree.delete(*self.tree.get_children())
# Group by prefix (e.g. CORE_, COOLANT_, STEAM_)
groups: Dict[str, List[VarInfo]] = {}
filt = self.filter_var.get().strip().upper()
for name, vi in self.vars.items():
if filt and filt not in name.upper():
# Also allow filtering by value preview
if vi.last_value and filt not in vi.last_value.upper():
continue
prefix = name.split("_", 1)[0] if "_" in name else "MISC"
groups.setdefault(prefix, []).append(vi)
# Sort groups alphabetically, vars within group by name
for g in sorted(groups.keys()):
parent = self.tree.insert("", "end", text=g, values=("", "", ""), open=True)
for vi in sorted(groups[g], key=lambda x: x.name):
updated_str = ""
if vi.last_updated:
updated_str = datetime.fromtimestamp(vi.last_updated).strftime("%H:%M:%S")
if vi.error:
value_preview = f"[ERR] {vi.error}"
else:
# Compact preview of first line
value_preview = coerce_preview(vi.last_value, 120)
tag = infer_status_color(vi.last_value if not vi.error else "error")
self.tree.insert(
parent,
"end",
text=vi.name,
values=(value_preview, updated_str, vi.last_status or ""),
tags=(tag,),
)
# ------------- Shutdown -------------
def on_close(self) -> None:
self.stop_polling()
self.destroy()
def main() -> None:
app = App()
app.mainloop()
if __name__ == "__main__":
main()
+1
View File
@@ -0,0 +1 @@
0.1
+1
View File
@@ -0,0 +1 @@
0.1
View File
+33
View File
@@ -0,0 +1,33 @@
{
"id": "gk-greyknight",
"title": "Grey Knights — Compendium (Wrath & Glory)",
"version": "0.6.5.3",
"compatibility": {
"minimum": "11",
"verified": "13"
},
"authors": [
{
"name": "User & Assistant"
}
],
"systems": [
"wrath-and-glory"
],
"packs": [
{
"name": "gk-items",
"label": "Grey Knights — Items",
"path": "packs/gk-items",
"type": "Item",
"system": "wrath-and-glory",
"private": false
}
],
"esmodules": [
"scripts/auto-loadout.js",
"scripts/helpers.js",
"scripts/ui-gkpanel.js"
],
"readme": "README.txt"
}
File diff suppressed because one or more lines are too long
+136
View File
@@ -0,0 +1,136 @@
// gk-greyknight — auto-attach loadout (scoped + incognito + ORDO) v0.6.1
Hooks.once("ready", () => {
const PACK_KEY = "gk-greyknight.gk-items";
const PACK_SRC_PREFIX = `Compendium.${PACK_KEY}.`;
const CORE = {
knife: "Compendium.wng-core.items.Item.4QVBQYWXXLyvFWkj",
pistol: "Compendium.wng-core.items.Item.7b2xcPWBB7up65PM",
ordo: "Compendium.wng-core.items.Item.mpcvHYlffwcBy9gP"
};
const ITEMS = {
ability: "Aegis of Titan (Ability)",
nemesis: "Nemesis Force Halberd",
storm: "Grey Knight Armour Integrated Storm Bolter",
aegisPA: "Aegis Power Armour",
aegisTerm: "Terminator Aegis (Grey Knights)",
pilgrim: "Pilgrim Astartes Power Armor",
ordo: "ORDO MALLEUS"
};
const FLAG_SCOPE = "gk-greyknight"; const FLAG_DONE = "autoLoadoutDone";
async function fetchFromCompendium(name) {
const pack = game.packs.get(PACK_KEY);
if (!pack) return null;
const index = await pack.getIndex();
const hit = index.find(e => e.name === name);
if (!hit) return null;
const doc = await pack.getDocument(hit._id);
return doc?.toObject();
}
async function fetchFromUuid(uuid) { try { const doc = await fromUuid(uuid); return doc?.toObject(); } catch(e){ return null; } }
async function ensureOnActor(actor, srcDoc, equip=false) {
const name = srcDoc?.name; if (!name) return null;
let have = actor.items.getName(name);
if (have) { if (typeof have.system?.equipped !== "undefined") await have.update({"system.equipped": !!equip}); return have; }
if (equip && srcDoc.system && typeof srcDoc.system.equipped !== "undefined") srcDoc.system.equipped = true;
const [created] = await actor.createEmbeddedDocuments("Item", [srcDoc]);
return created;
}
async function ensureByName(actor, name, equip=false) {
const have = actor.items.getName(name);
if (have) { if (typeof have.system?.equipped !== "undefined") await have.update({"system.equipped": !!equip}); return have; }
let src = await fetchFromCompendium(name);
if (!src) { const world = game.items.getName(name); if (world) src = world.toObject(); }
if (!src) return null;
return ensureOnActor(actor, src, equip);
}
async function setEquipped(actor, name, on) {
const it = actor.items.getName(name);
if (it && typeof it.system?.equipped !== "undefined") await it.update({"system.equipped": !!on});
}
if (window._gkAutoLoadoutHookId) { Hooks.off("createItem", window._gkAutoLoadoutHookId); window._gkAutoLoadoutHookId = null; }
window._gkAutoLoadoutHookId = Hooks.on("createItem", async (item, opts, userId) => {
try {
if (item?.type !== "archetype") return;
const src = item?.flags?.core?.sourceId || "";
const isFromOurPack = src.startsWith(PACK_SRC_PREFIX);
const isOurGKByName = item?.name === "Grey Knight (Archetype)";
if (!isFromOurPack && !isOurGKByName) return;
if (game.userId !== userId) return;
const actor = item.parent; if (!actor) return;
if (actor.getFlag(FLAG_SCOPE, FLAG_DONE)) return;
await actor.setFlag(FLAG_SCOPE, FLAG_DONE, true);
await ensureByName(actor, ITEMS.ability, false);
await ensureByName(actor, "Brotherhood of Psykers", false);
let ordoDoc = await fetchFromUuid(CORE.ordo);
if (!ordoDoc) ordoDoc = await fetchFromCompendium(ITEMS.ordo);
if (ordoDoc) await ensureOnActor(actor, ordoDoc, false);
const content = `
<style>
.gk-choices .opt{display:flex;gap:.6rem;align-items:flex-start;padding:.35rem .5rem;border:1px solid #6663;border-radius:6px;margin:.35rem 0}
.gk-choices .opt label{font-weight:600}
.gk-choices .hint{font-size:.9em;opacity:.85;margin-left:1.7rem}
</style>
<div class="gk-choices">
<div class="opt">
<input type="radio" name="mode" value="incog" id="gk-incog">
<label for="gk-incog">Incognito — Pilgrim Astartes Power Armor + Combat Knife + Bolt Pistol</label>
</div>
<div class="hint">Lowprofile loadout (bez Nemesis/SB)</div>
<div class="opt">
<input type="radio" name="mode" value="war" id="gk-war" checked>
<label for="gk-war">WarPlate — Aegis Power Armour</label>
</div>
<div class="hint">Aegis PA + Nemesis + Integrated Storm Bolter</div>
<div class="opt">
<input type="radio" name="mode" value="term" id="gk-term">
<label for="gk-term">Terminator — Terminator Aegis</label>
</div>
<div class="hint">Terminator Aegis + Nemesis + Integrated Storm Bolter</div>
</div>`;
const choice = await new Promise(resolve => {
new Dialog({ title: "Grey Knight — Wybierz Loadout",
content,
buttons: {
ok: {label: "Zastosuj", icon:"<i class='fas fa-check'></i>", callback: html => resolve(html.find('input[name=\"mode\"]:checked').val() || "war")},
cancel: {label:"Anuluj", callback: ()=>resolve(null)}
}, default: "ok"
}).render(true);
});
if (!choice) return;
await setEquipped(actor, ITEMS.aegisPA, false);
await setEquipped(actor, ITEMS.aegisTerm, false);
await setEquipped(actor, ITEMS.nemesis, false);
await setEquipped(actor, ITEMS.storm, false);
await setEquipped(actor, ITEMS.pilgrim, false);
if (choice === "incog") {
await ensureByName(actor, ITEMS.pilgrim, true);
const knife = await fetchFromUuid(CORE.knife); if (knife) await ensureOnActor(actor, knife, true);
const pistol = await fetchFromUuid(CORE.pistol); if (pistol) await ensureOnActor(actor, pistol, true);
} else if (choice === "war") {
await ensureByName(actor, ITEMS.nemesis, true);
await ensureByName(actor, ITEMS.storm, true);
await ensureByName(actor, ITEMS.aegisPA, true);
} else if (choice === "term") {
await ensureByName(actor, ITEMS.nemesis, true);
await ensureByName(actor, ITEMS.storm, true);
await ensureByName(actor, ITEMS.aegisTerm, true);
}
const abil = actor.items.getName(ITEMS.ability);
const anyAegisOn = !!actor.items.find(i => ["armour","armor"].includes(i.type) && /Aegis/.test(i.name) && i.system?.equipped);
if (abil?.effects?.length) for (const ef of abil.effects) if (ef.name?.toLowerCase().includes("synergy")) await ef.update({disabled: !anyAegisOn});
ui.notifications.info(`GK loadout: ${choice.toUpperCase()} ustawiony.`);
} catch (e) { console.error("gk-greyknight auto-loadout error:", e); }
});
console.log("gk-greyknight: auto-loadout hook active (v0.6.1)");
});
+34
View File
@@ -0,0 +1,34 @@
// GK Aegis Glow Toggle (module)
(async () => {
const tok = canvas.tokens.controlled[0] ?? null;
const actor = tok?.actor ?? game.user.character;
const token = tok ?? canvas.tokens.placeables.find(t => t.actor?.id === actor?.id);
if (!actor || !token) return ui.notifications.warn("Wybierz token lub przypisz postać do użytkownika.");
const aegisArm = actor.items.find(i => ["armour","armor"].includes(i.type) && /Aegis/.test(i.name));
if (!aegisArm) return ui.notifications.warn("Nie znaleziono Aegis armour na postaci.");
const eff = aegisArm.effects.find(e => e.name?.toLowerCase().startsWith("aegis warding runes"));
if (!eff) return ui.notifications.warn("Nie znaleziono efektu toggle na Aegis armour.");
const wasDisabled = eff.disabled ?? true;
await eff.update({ disabled: !wasDisabled });
const FLAG_SCOPE = "wng-gk"; const FLAG_KEY = "prevLight";
const setGlowOn = async () => {
const prev = token.document.getFlag(FLAG_SCOPE, FLAG_KEY);
if (!prev) await token.document.setFlag(FLAG_SCOPE, FLAG_KEY, foundry.utils.deepClone(token.document.light));
await token.document.update({
light: { color:"#66ccff", coloration:2, alpha:0.7, dim:16, bright:0, angle:360,
luminosity:0.5, attenuation:0.35, saturation:0, contrast:0, shadows:0,
animation:{ type:"pulse", speed:3, intensity:4, reverse:false } }
});
await canvas.perception.update({ lighting: { refresh: true } });
};
const setGlowOff = async () => {
const prev = token.document.getFlag(FLAG_SCOPE, FLAG_KEY);
if (prev) { await token.document.update({ light: prev }); await token.document.unsetFlag(FLAG_SCOPE, FLAG_KEY); }
else { await token.document.update({ light: { dim:0, bright:0, color:null } }); }
await canvas.perception.update({ lighting: { refresh: true } });
};
if (wasDisabled) { await setGlowOn(); ChatMessage.create({ content: `<b>Aegis:</b> Warding Runes <span style="color:#66ccff">ENGAGED</span>. (Akcja)` }); }
else { await setGlowOff(); ChatMessage.create({ content: `<b>Aegis:</b> Warding Runes DISENGAGED.` }); }
})();
+113
View File
@@ -0,0 +1,113 @@
// gk-greyknight helpers.js — consolidated 0.6.4.6
// Zawiera: Brotherhood prompt + starter, powiadomienie (także poza walką), sheet summary,
// mini-widżet, oraz patcher traitów (Psycannon/Psilencer -> force).
/* ---------------- Utilities ---------------- */
const GK_DEBUG = false;
const FLAG_SCOPE = "gk-greyknight";
async function findItemInAllPacksByName(name, type=null) {
for (const pack of game.packs) {
if (pack.documentName !== "Item") continue;
const idx = await pack.getIndex();
const hit = idx.find(e => e.name === name && (!type || e.type === type));
if (hit) return await pack.getDocument(hit._id);
}
return null;
}
async function ensureHasItemByName(actor, name, type=null) {
const existing = actor.items?.find(i => i.name === name && (!type || i.type === type));
if (existing) return existing;
const doc = await findItemInAllPacksByName(name, type);
if (!doc) return null;
const data = doc.toObject(); delete data._id;
const [created] = await actor.createEmbeddedDocuments("Item", [data]);
return created;
}
async function promptDiscipline(actor) {
const existing = await actor.getFlag(FLAG_SCOPE, "discipline");
if (existing) return existing;
return await new Promise(resolve => {
new Dialog({
title: "Brotherhood of Psykers — Choose Discipline",
content: `<p>Select a discipline for this character:</p>
<label style='display:block;margin-top:.5rem'><input type="radio" name="disc" value="sanctic" checked> Sanctic</label>
<label style='display:block'><input type="radio" name="disc" value="librarius"> Librarius</label>`,
buttons: {
ok: { label: "Confirm", icon: "<i class='fas fa-check'></i>", callback: html => resolve(html.find('input[name="disc"]:checked').val() || "sanctic") },
cancel: { label: "Cancel", callback: () => resolve(null) }
},
default: "ok"
}).render(true);
});
}
async function gkResolveActorFromMessage(doc) {
const sp = doc.speaker || {};
let actor = sp.actor ? game.actors?.get(sp.actor) : null;
if (!actor && canvas?.tokens) {
const t = (sp.token && canvas.tokens.get(sp.token)) || canvas.tokens.controlled?.[0] || null;
actor = t?.actor || actor;
}
return actor;
}
async function gkIsPsychicMessage(doc) {
try {
const raw = `${doc.flavor || ""} ${TextEditor?.stripHTML(doc.content || "") || ""}`.toLowerCase();
const keys = ["psychic","psychic mastery","psychic power","moc psioniczna","smite","hammerhand","sanctuary","shrouding","might of titan"];
if (keys.some(k=>raw.includes(k))) return true;
const flagsStr = JSON.stringify(doc.flags || {}).toLowerCase();
if (flagsStr.includes("psychic")) return true;
if (flagsStr.includes("psychicpower")) return true;
if (flagsStr.includes("\"power\"")) return true;
const tryUuids = [
doc.getFlag?.("core","sourceId"),
doc.getFlag?.("wng-core","itemUuid"),
doc.flags?.document?.uuid,
doc.flags?.uuid
].filter(Boolean);
for (const u of tryUuids) {
try { const it = await fromUuid(u); if (it?.type === "psychicPower") return true; } catch(e){}
}
} catch(e) { if (GK_DEBUG) console.warn("gk IsPsychicMessage error:", e); }
return false;
}
function gkBrotherhoodAlliesAndBonus(actor) {
const tokens = canvas?.tokens?.placeables || [];
const ids = new Set();
for (const t of tokens) {
const a = t.actor; if (!a) continue;
const ok = a.items?.some(i => i.type === "ability" && i.name === "Brotherhood of Psykers");
if (ok) ids.add(a.id);
}
const total = ids.size;
const bonus = ids.has(actor?.id) ? Math.max(0, total - 1) : total;
return { total, bonus };
}
/* ---------------- 1) Brotherhood: prompt + starter ---------------- */
Hooks.once("ready", () => {
// Avoid duplicate hook if hot-reloaded
if (window._gkBroCreateHookId) { Hooks.off("createItem", window._gkBroCreateHookId); window._gkBroCreateHookId = null; }
window._gkBroCreateHookId = Hooks.on("createItem", async (item, opts, userId) => {
try {
if (game.userId !== userId) return;
if (item?.type !== "ability" || item?.name !== "Brotherhood of Psykers") return;
const actor = item.parent; if (!actor) return;
const chosen = await promptDiscipline(actor);
if (!chosen) return;
await actor.setFlag(FLAG_SCOPE, "discipline", chosen);
const psyker = await ensureHasItemByName(actor, "PSYKER", "keyword");
if (!psyker) ui.notifications?.warn("PSYKER keyword not found in loaded packs. Add it manually from wng-core.");
if (chosen === "sanctic") {
const ok = await ensureHasItemByName(actor, "Hammerhand (Sanctic)", "psychicPower");
if (!ok) ui.notifications?.warn("Couldn't auto-add Hammerhand (Sanctic). Drag a Sanctic power from the GK pack.");
} else {
const ok = await ensureHasItemByName(actor, "Smite", "psychicPower");
if (!ok) {
ui.notifications?.warn("Smite not found in available packs. Please add a Librarius power manually.");
game.ui?.sidebar?.tabs?.compendium?.activate();
}
}
} catch (e) { console.error("gk-greyknight — Brotherhood prompt:", e); }
});
});
+201
View File
@@ -0,0 +1,201 @@
// gk-greyknight — ui-gkpanel.js (0.6.5.2)
const GK_NS = "gk-greyknight";
const GK_DEBUG = false;
/* ---------------- helpers ---------------- */
function gkActorHasBrotherhood(actor) {
return !!actor?.items?.some(i => i.type === "ability" && i.name === "Brotherhood of Psykers");
}
function gkAlliesAndBonus(actor) {
const tokens = canvas?.tokens?.placeables || [];
const ids = new Set();
for (const t of tokens) {
const a = t.actor; if (!a) continue;
if (gkActorHasBrotherhood(a)) ids.add(a.id);
}
const total = ids.size;
const bonus = ids.has(actor?.id) ? Math.max(0, total - 1) : total;
return { total, bonus };
}
/* ---------------- settings (per-user) ---------------- */
Hooks.once("init", () => {
game.settings.register(GK_NS, "panelVisible", {
name: "Brotherhood panel visible",
hint: "Show the Brotherhood Focus panel by default.",
scope: "client", config: true, type: Boolean, default: true,
onChange: (v) => { v ? GKFocusPanel.show(true) : GKFocusPanel.hide(); }
});
game.settings.register(GK_NS, "panelAutoOpen", {
name: "Auto-open when eligible",
hint: "Auto-open the panel when your selected actor (or controlled token) has Brotherhood of Psykers.",
scope: "client", config: true, type: Boolean, default: true,
onChange: () => GKFocusPanel.render()
});
});
// v13: dodatkowy hook na zmiany ustawień po stronie klienta
Hooks.on?.("clientSettingChanged", (key, value) => {
if (key === `${GK_NS}.panelVisible`) return value ? GKFocusPanel.show(true) : GKFocusPanel.hide();
if (key === `${GK_NS}.panelAutoOpen`) return GKFocusPanel.render();
});
/* ---------------- panel ---------------- */
class GKFocusPanel {
static async getState() {
return (await game.user.getFlag(GK_NS, "focusPanel")) || {};
}
static async saveState(patch) {
const cur = await this.getState();
return game.user.setFlag(GK_NS, "focusPanel", { ...cur, ...patch });
}
static async isVisible() {
const v = game.settings.get(GK_NS, "panelVisible");
const st = await this.getState();
return v && !st.closed;
}
static async hide() {
await this.saveState({ closed: true, forced: false });
$("#gk-focus-panel").remove();
}
static async show(force = false) {
await this.saveState({ closed: false, forced: !!force });
this.render();
}
static async toggle() {
const vis = await this.isVisible();
if (vis) return this.hide();
return this.show(true); // force-open nawet bez aktora GK
}
static currentActor() {
return game.user?.character || canvas.tokens?.controlled?.[0]?.actor || null;
}
static async render() {
const st = await this.getState();
if (st.closed || !game.settings.get(GK_NS, "panelVisible")) { $("#gk-focus-panel").remove(); return; }
const actor = this.currentActor();
if (!st.forced) {
if (!actor) { $("#gk-focus-panel").remove(); return; }
if (!gkActorHasBrotherhood(actor) && !game.settings.get(GK_NS, "panelAutoOpen")) {
$("#gk-focus-panel").remove(); return;
}
}
return this._renderInternal(actor);
}
static async _renderInternal(actor) {
const st = await this.getState();
const { total, bonus } = gkAlliesAndBonus(actor);
const x = Number.isFinite(st.x) ? st.x : (window.innerWidth - 260);
const y = Number.isFinite(st.y) ? st.y : (window.innerHeight - 120);
const w = Number.isFinite(st.w) ? st.w : 260;
const h = Number.isFinite(st.h) ? st.h : 110;
const root = $("#gk-focus-panel");
const html = $(`
<section id="gk-focus-panel" class="window-app"
style="position:fixed; left:${x}px; top:${y}px;
width:${w}px; height:${h}px; min-width:200px; min-height:80px;
resize: both; overflow:auto; background:#111A; color:#fff;
border:1px solid #444; border-radius:6px; z-index:70;">
<header class="window-header" style="cursor:move; display:flex; align-items:center; gap:.5rem; padding:.25rem .5rem; border-bottom:1px solid #444;">
<h4 class="window-title" style="margin:0; font-size:.95rem;">Brotherhood Focus</h4>
<a class="gk-close header-button" style="margin-left:auto;" title="Close"><i class="fas fa-times"></i></a>
</header>
<section class="window-content" style="padding:.4rem .6rem;">
<div><span style="opacity:.9">Allies</span>: <b>${total}</b> &nbsp;·&nbsp; <span style="opacity:.9">Bonus</span>: <b>+${bonus}</b></div>
<div style="opacity:.85; font-size:.9em; margin-top:.25rem;">Only one linked GK should use a psychic power as their <em>Action</em> per round. Subsequent powers add +1 <em>Wrath</em> die.</div>
</section>
</section>`);
if (root.length) root.replaceWith(html); else $("body").append(html);
html.find(".gk-close").off("click").on("click", async () => {
const left = parseInt(html.css("left")) || x;
const top = parseInt(html.css("top")) || y;
const ww = parseInt(html.outerWidth()) || w;
const hh = parseInt(html.outerHeight()) || h;
await this.saveState({ closed: true, forced: false, x:left, y:top, w:ww, h:hh });
html.remove();
});
const handle = html.find(".window-header");
let dragging = false, ox = 0, oy = 0;
function onMove(ev) {
if (!dragging) return;
const nx = Math.max(0, Math.min(window.innerWidth - html.outerWidth(), ev.clientX - ox));
const ny = Math.max(0, Math.min(window.innerHeight - html.outerHeight(), ev.clientY - oy));
html.css({ left: nx, top: ny });
}
async function onUp() {
if (!dragging) return;
dragging = false;
$(window).off("pointermove.gkfp").off("pointerup.gkfp");
const left = parseInt(html.css("left")) || 0;
const top = parseInt(html.css("top")) || 0;
const ww = parseInt(html.outerWidth()) || w;
const hh = parseInt(html.outerHeight()) || h;
await GKFocusPanel.saveState({ x:left, y:top, w:ww, h:hh });
}
handle.off("pointerdown.gkfp").on("pointerdown.gkfp", (ev) => {
dragging = true;
const r = html[0].getBoundingClientRect();
ox = ev.clientX - r.left; oy = ev.clientY - r.top;
$(window).on("pointermove.gkfp", onMove).on("pointerup.gkfp", onUp);
});
$(window).off("pointerup.gkfp-size").on("pointerup.gkfp-size", async () => {
if (!document.body.contains(html[0])) return;
const ww = parseInt(html.outerWidth()) || w;
const hh = parseInt(html.outerHeight()) || h;
await GKFocusPanel.saveState({ w: ww, h: hh });
});
}
}
/* ---------------- left toolbar button (v12 & v13) ---------------- */
Hooks.on("getSceneControlButtons", (controls) => {
// v12: controls = SceneControl[]
if (Array.isArray(controls)) {
const token = controls.find(c => c?.name === "token");
if (!token) return;
if (token.tools?.some?.(t => t?.name === "gk-toggle-focus")) return;
token.tools.push({
name: "gk-toggle-focus",
title: "Toggle Brotherhood Focus Panel",
icon: "fas fa-bolt",
button: true,
visible: true,
order: 999,
onClick: () => GKFocusPanel.toggle()
});
return;
}
// v13: controls = Record<string, SceneControl>; tools = Record<string, SceneControlTool>
const token = controls?.token;
if (!token) return;
token.tools ??= {};
if (!token.tools["gk-toggle-focus"]) {
token.tools["gk-toggle-focus"] = {
name: "gk-toggle-focus",
title: "Toggle Brotherhood Focus Panel",
icon: "fas fa-bolt",
button: true,
visible: true,
order: 999,
onClick: () => GKFocusPanel.toggle()
};
}
});
/* ---------------- reactive hooks ---------------- */
Hooks.on("canvasReady", () => GKFocusPanel.render());
Hooks.on("controlToken", () => GKFocusPanel.render());
Hooks.on("updateCombat", () => GKFocusPanel.render());
Hooks.on("createToken", () => GKFocusPanel.render());
Hooks.on("deleteToken", () => GKFocusPanel.render());
-3
View File
@@ -1,4 +1 @@
# W&G Voidships — Builder
Import a Hull from the hulls compendium, then add Items from the Items compendium or use the macros.
RollTables are provided by the separate module `wg-voidships-foundry`.
+64 -12
View File
@@ -2,18 +2,64 @@
"id": "wg-voidships-builder",
"title": "Wrath & Glory: Voidships — Builder",
"description": "Składanie okrętów jako Actorów przez dodawanie wyposażenia (gear) z kompendium.",
"version": "1.4.8",
"compatibility": { "minimum": "12", "verified": "13" },
"authors": [{ "name": "Gizmo & GPT-5 Thinking" }],
"esmodules": ["scripts/voidships.js"],
"version": "1.4.13",
"compatibility": {
"minimum": "12",
"verified": "13"
},
"authors": [
{
"name": "Gizmo & GPT-5 Thinking"
}
],
"scripts": [
"scripts/voidships.js",
"scripts/voidship-actor.js"
],
"templates": [
"templates/voidship-sheet.hbs"
],
"packs": [
{ "label": "W&G Voidship Hulls (Empty)", "name": "wg-voidship-hulls", "path": "packs/wg-voidship-hulls.db", "type": "Actor", "system": "wrath-and-glory" },
{ "label": "W&G Voidship Items", "name": "wg-voidship-items", "path": "packs/wg-voidship-items.db", "type": "Item", "system": "wrath-and-glory" },
{ "label": "W&G Voidships — Tables", "name": "wg-voidships-tables", "path": "packs/wg-voidships-tables.db", "type": "RollTable" },
{ "label": "W&G Voidship Macros", "name": "wg-voidship-macros", "path": "packs/wg-voidship-macros.db", "type": "Macro" },
{ "label": "W&G Voidship Archeotech", "name": "wg-voidship-archeotech", "path": "packs/wg-voidship-archeotech.db", "type": "Item", "system": "wrath-and-glory" },
{ "label": "W&G Voidship Xenos", "name": "wg-voidship-xenos", "path": "packs/wg-voidship-xenos.db", "type": "Item", "system": "wrath-and-glory" }
{
"label": "W&G Voidship Hulls (Empty)",
"name": "wg-voidship-hulls",
"path": "packs/wg-voidship-hulls.db",
"type": "Actor",
"system": "wrath-and-glory"
},
{
"label": "W&G Voidship Items",
"name": "wg-voidship-items",
"path": "packs/wg-voidship-items.db",
"type": "Item",
"system": "wrath-and-glory"
},
{
"label": "W&G Voidships — Tables",
"name": "wg-voidships-tables",
"path": "packs/wg-voidships-tables.db",
"type": "RollTable"
},
{
"label": "W&G Voidship Macros",
"name": "wg-voidship-macros",
"path": "packs/wg-voidship-macros.db",
"type": "Macro"
},
{
"label": "W&G Voidship Archeotech",
"name": "wg-voidship-archeotech",
"path": "packs/wg-voidship-archeotech.db",
"type": "Item",
"system": "wrath-and-glory"
},
{
"label": "W&G Voidship Xenos",
"name": "wg-voidship-xenos",
"path": "packs/wg-voidship-xenos.db",
"type": "Item",
"system": "wrath-and-glory"
}
],
"packFolders": [
{
@@ -30,7 +76,13 @@
"folders": []
}
],
"relationships": { "systems": [{ "id": "wrath-and-glory" }] },
"relationships": {
"systems": [
{
"id": "wrath-and-glory"
}
]
},
"readme": "journal/README.md",
"license": "LICENSE"
}
@@ -1,12 +1,16 @@
{"_id":"0cc5c3b3a915adf7","name":"Castellan Shield","type":"gear","img":null,"system":{"description":"Ancient projection-field array that can extend protection beyond the host hull. Temperamental and zealously maintained by dedicated Tech-Priests.","keywords":"VOIDSHIP, ARCHEOTECH, SHIELDS","value":0,"rarity":"very rare","source":"Archeotech Components (RT)"}}
{"_id":"a2aab0f18b9e4b9d","name":"Castellan Shield Array","type":"gear","img":null,"system":{"description":"Expanded castellum of emitters tuned for fleet support—projects a formidable ward to nearby vessels at grotesque power cost.","keywords":"VOIDSHIP, ARCHEOTECH, SHIELDS","value":0,"rarity":"very rare","source":"Archeotech Components (RT)"}}
{"_id":"ed965d6a2b3c1a65","name":"Cogitator Interlink","type":"gear","img":null,"system":{"description":"Ancient datalooms and logic-engines that interlink bridge, augurs and gunnery pits, smoothing latency and improving battle rhythm.","keywords":"VOIDSHIP, ARCHEOTECH, BRIDGE","value":0,"rarity":"very rare","source":"Archeotech Components (RT)"}}
{"_id":"2f96e98996b2414b","name":"Energistic Conversion Matrix","type":"gear","img":null,"system":{"description":"Relic matrix that reclaims waste energies throughout the ship and feeds them back into the grid; miraculous efficiency at inscrutable risk.","keywords":"VOIDSHIP, ARCHEOTECH, DRIVE","value":0,"rarity":"very rare","source":"Archeotech Components (RT)"}}
{"_id":"b1d5aa8f4a6b2e1a","name":"Gyro-Stabilization Matrix","type":"gear","img":null,"system":{"description":"Deep-keel stabilisers and vanes governed by pre-Imperial machine-logic; lessen recoil and improve tracking solutions.","keywords":"VOIDSHIP, ARCHEOTECH, MANOEUVRE","value":0,"rarity":"very rare","source":"Archeotech Components (RT)"}}
{"_id":"9e875efc3b2a4d1c","name":"Staravar Laser Macrobattery","type":"weapon","img":null,"system":{"category":"ranged","damage":{"base":12,"bonus":0,"rank":0,"ed":{"base":2,"bonus":0,"rank":0},"ap":{"base":-1,"bonus":0,"rank":0},"enabled":false,"otherDamage":{"mortal":"0","shock":"0","wounds":"0"}},"range":{"short":30,"medium":60,"long":120,"melee":1,"thrown":null},"salvo":2,"traits":{"list":[{"name":"volley","rating":"2"}]},"description":"Archeotech laser batteries from the Staravar school, famed for peerless coherence and range.","keywords":"VOIDSHIP, ARCHEOTECH, MACROLASERS","source":"Archeotech Components (RT)"}}
{"_id":"4a3d2c1b0e9f8a77","name":"Star-Flare Lance","type":"weapon","img":null,"system":{"category":"ranged","damage":{"base":12,"bonus":0,"rank":0,"ed":{"base":2,"bonus":0,"rank":0},"ap":{"base":-1,"bonus":0,"rank":0},"enabled":false,"otherDamage":{"mortal":"0","shock":"0","wounds":"0"}},"range":{"short":30,"medium":60,"long":120,"melee":1,"thrown":null},"salvo":2,"traits":{"list":[{"name":"lance","rating":"-"}]},"description":"A lance emitter of pre-Imperial refinement; slices armour with unsettling ease and little thermal bloom.","keywords":"VOIDSHIP, ARCHEOTECH, LANCE","source":"Archeotech Components (RT)"}}
{"_id":"arch-ancient-life-sustainer","name":"Ancient Life Sustainer","type":"gear","img":null,"system":{"description":"Archaiczny, wysokoefektywny podtrzymywacz życia z rozległą siecią przewodów i oczyszczaczy. Podnosi morale załogi i ogranicza straty załogi od nie-bojowych przyczyn; pełni rolę Life Sustainer.","keywords":"VOIDSHIP, ARCHEOTECH, LIFE-SUSTAINER","rarity":"extremely rare","source":"RT Core (205210)"}}
{"_id":"arch-modified-drive","name":"Modified Drive","type":"gear","img":null,"system":{"description":"Starożytny napęd STC z egzotycznych materiałów i nietypowej konstrukcji. Zwiększa prędkość okrętu, a jednocześnie ogranicza zajmowaną przestrzeń napędu; kapryśny w eksploatacji.","keywords":"VOIDSHIP, ARCHEOTECH, DRIVE","rarity":"extremely rare","source":"RT Core (205210)"}}
{"_id":"arch-bridge-of-antiquity","name":"Bridge of Antiquity","type":"gear","img":null,"system":{"description":"Mostek-relikt z epok przedimperialnych: rozbudowane loże dowódcze, antyczne interfejsy i sakralne pulpita. Ułatwia koordynację działań i przegląd sensorażu.","keywords":"VOIDSHIP, ARCHEOTECH, BRIDGE","rarity":"extremely rare","source":"RT Core (205210)"}}
{"_id":"arch-auto-logis-targeter","name":"Auto-stabilised Logis-targeter (Archeotech)","type":"gear","img":null,"system":{"description":"Zabytek mechanologicznym stabilizowane cogitatory balistyczne, które poprawiają celność baterii makro i zgrywają ogień z rozwiązaniami mostka.","keywords":"VOIDSHIP, ARCHEOTECH, GUNNERY","rarity":"extremely rare","source":"RT Core (205210)"}}
{"_id":"arch-teleportarium","name":"Teleportarium (Archeotech)","type":"gear","img":null,"system":{"description":"Krótkozasięgowy translator materii. Umożliwia błyskawiczne naloty abordażowe i ewakuację; obciążony ciężkimi restrykcjami i ryzykiem.","keywords":"VOIDSHIP, ARCHEOTECH, BOARDING","rarity":"extremely rare","source":"RT Core (205210)"}}
{"_id":"ARCH000000000001","name":"Teleportarium","type":"gear","img":"icons/svg/portal.svg","flags":{"wg-voidships-builder":{"component":{"kind":"archeotech","subtype":"teleport","tags":["archeotech","teleport","boarding"]},"voidOnly":true}},"system":{"description":"Krótkozasięgowy translator materii używany do abordażu/ewakuacji. W RT pozwala na natychmiastowe desanty z ryzykiem zakłóceń empirycznych. (RT/BFK)","voidship":{"slot":"Internal","use":{"space":1,"power":4},"mods":{"armour":0,"integrity":0,"manoeuvre":0,"detection":0,"speed":0,"space":0,"power":0}}},"effects":[]}
{"_id":"ARCH000000000002","name":"Empyrean Mantle","type":"gear","img":"icons/svg/wing.svg","flags":{"wg-voidships-builder":{"component":{"kind":"archeotech","subtype":"mantle","tags":["archeotech","stealth","defence"]},"voidOnly":true}},"system":{"description":"Zasłona empiryczna tłumiąca echo energetyczne okrętu i utrudniająca namierzenie. (IT/BFK)","voidship":{"slot":"Internal","use":{"space":1,"power":2},"mods":{"armour":0,"integrity":0,"manoeuvre":1,"detection":2,"speed":0,"space":0,"power":0}}},"effects":[]}
{"_id":"ARCH000000000003","name":"Warpsbane Hull","type":"gear","img":"icons/svg/anchor.svg","flags":{"wg-voidships-builder":{"component":{"kind":"archeotech","subtype":"warpsbane","tags":["archeotech","hull","defence"]},"voidOnly":true}},"system":{"description":"Konsekrowane pancerze i relikwiarze ograniczające anomalie Immaterium. (IT)","voidship":{"slot":"Internal","use":{"space":2,"power":0},"mods":{"armour":1,"integrity":6,"manoeuvre":0,"detection":0,"speed":0,"space":0,"power":0}}},"effects":[]}
{"_id":"ARCH000000000004","name":"Starchart Cogitator","type":"gear","img":"icons/svg/book.svg","flags":{"wg-voidships-builder":{"component":{"kind":"archeotech","subtype":"nav","tags":["archeotech","sensor","navigation"]},"voidOnly":true}},"system":{"description":"Gwiezdne kogitatory i mapy sprzed Ery Ciemności; ułatwiają pozycjonowanie i kalkulacje nawigacyjne. (BFK)","voidship":{"slot":"Aetherics","use":{"space":1,"power":1},"mods":{"armour":0,"integrity":0,"manoeuvre":0,"detection":2,"speed":0,"space":0,"power":0}}},"effects":[]}
{"_id":"ARCH000000000005","name":"Auto-Temple","type":"gear","img":"icons/svg/holy-symbol.svg","flags":{"wg-voidships-builder":{"component":{"kind":"archeotech","subtype":"morale","tags":["archeotech","crew"]},"voidOnly":true}},"system":{"description":"Zautomatyzowana kaplica i rytuały podnoszące morale. W RT redukuje straty/niepokoje; w W&G modelujemy jako +Integrity (abstrakcja).","voidship":{"slot":"Internal","use":{"space":1,"power":1},"mods":{"armour":0,"integrity":2,"manoeuvre":0,"detection":0,"speed":0,"space":0,"power":0}}},"effects":[]}
{"_id":"ARCH000000000006","name":"Castellan Shield","type":"gear","img":"icons/svg/shield.svg","flags":{"wg-voidships-builder":{"component":{"kind":"archeotech","subtype":"castellan","tags":["archeotech","shield","support"]},"voidOnly":true}},"system":{"description":"Archaiczny układ projekcyjny osłon; potrafi wzmacniać ochronę własną i—w ograniczonym zakresie—sojuszników w pobliżu. (RT Archeotech)","voidship":{"slot":"Internal","use":{"space":2,"power":8},"mods":{"armour":0,"integrity":6,"manoeuvre":0,"detection":0,"speed":0,"space":0,"power":0}}},"effects":[]}
{"_id":"ARCH000000000007","name":"Castellan Shield Array","type":"gear","img":"icons/svg/shield.svg","flags":{"wg-voidships-builder":{"component":{"kind":"archeotech","subtype":"castellan-array","tags":["archeotech","shield","support"]},"voidOnly":true}},"system":{"description":"Rozbudowana wieża kastelańska o zwiększonym zasięgu projekcji tarcz; koszmarne zużycie mocy. (RT Archeotech)","voidship":{"slot":"Internal","use":{"space":3,"power":12},"mods":{"armour":0,"integrity":8,"manoeuvre":0,"detection":0,"speed":0,"space":0,"power":0}}},"effects":[]}
{"_id":"ARCH000000000008","name":"Cogitator Interlink","type":"gear","img":"icons/svg/book.svg","flags":{"wg-voidships-builder":{"component":{"kind":"archeotech","subtype":"interlink","tags":["archeotech","bridge","gunnery"]},"voidOnly":true}},"system":{"description":"Reliktowe dataloomy spajające mostek, auspeksy i jamy artyleryjskie; wygładzają latencję i cykl ogniowy. (RT Archeotech)","voidship":{"slot":"Internal","use":{"space":1,"power":2},"mods":{"armour":0,"integrity":0,"manoeuvre":0,"detection":2,"speed":0,"space":0,"power":0}}},"effects":[]}
{"_id":"ARCH000000000009","name":"Energistic Conversion Matrix","type":"gear","img":"icons/svg/energy.svg","flags":{"wg-voidships-builder":{"component":{"kind":"archeotech","subtype":"conversion-matrix","tags":["archeotech","reactor","efficiency"]},"voidOnly":true}},"system":{"description":"Macierz odzysku energii wtórnej; „cudowna” sprawność przy nieprzewidywalnych efektach ubocznych. (RT Archeotech)","voidship":{"slot":"Internal","use":{"space":2,"power":1},"mods":{"armour":0,"integrity":0,"manoeuvre":0,"detection":0,"speed":0,"space":0,"power":6}}},"effects":[]}
{"_id":"ARCH000000000010","name":"Gyro-Stabilization Matrix","type":"gear","img":"icons/svg/compass.svg","flags":{"wg-voidships-builder":{"component":{"kind":"archeotech","subtype":"gyro","tags":["archeotech","manoeuvre","stability"]},"voidOnly":true}},"system":{"description":"Głębokokilowe stabilizatory i stery zarządzane maszynologicą sprzed Imperium; lepsze śledzenie i odrzut. (RT Archeotech)","voidship":{"slot":"Internal","use":{"space":1,"power":1},"mods":{"armour":0,"integrity":0,"manoeuvre":2,"detection":0,"speed":0,"space":0,"power":0}}},"effects":[]}
{"_id":"ARCH000000000011","name":"Staravar Laser Macrobattery (Dorsal)","type":"gear","img":"icons/svg/explosion.svg","flags":{"wg-voidships-builder":{"component":{"kind":"weapon","subtype":"macro-laser","tags":["archeotech","weapon","laser","dorsal"]},"voidOnly":true}},"system":{"description":"Szkoła Staravar: znakomita koherencja i zasięg. W RT to archeotechowa bateria laserowa. Slot: Dorsal.","voidship":{"slot":"Dorsal","use":{"space":2,"power":5},"mods":{"armour":0,"integrity":0,"manoeuvre":0,"detection":1,"speed":0,"space":0,"power":0}}},"effects":[]}
{"_id":"ARCH000000000012","name":"Star-Flare Lance (Prow)","type":"gear","img":"icons/svg/sword.svg","flags":{"wg-voidships-builder":{"component":{"kind":"weapon","subtype":"lance-starflare","tags":["archeotech","weapon","lance","prow"]},"voidOnly":true}},"system":{"description":"Przedimperialny emiter lancy o „chłodnym” przekroju termicznym, tnie pancerze z niepokojącą łatwością. Slot: Prow.","voidship":{"slot":"Prow","use":{"space":3,"power":7},"mods":{"armour":0,"integrity":0,"manoeuvre":0,"detection":0,"speed":0,"space":0,"power":0}}},"effects":[]}
{"_id":"ARCH000000000013","name":"Ancient Life Sustainer","type":"gear","img":"icons/svg/stoned-tower.svg","flags":{"wg-voidships-builder":{"component":{"kind":"archeotech","subtype":"life-sustainer","tags":["archeotech","life-sustainer","support"]},"voidOnly":true}},"system":{"description":"Archaiczny, wysoko-efektywny podtrzymywacz życia i filtracja. W RT poprawia komfort/straty; tu daje lekki buff integralności. (RT Core)","voidship":{"slot":"Internal","use":{"space":2,"power":2},"mods":{"armour":0,"integrity":2,"manoeuvre":0,"detection":0,"speed":0,"space":0,"power":0}}},"effects":[]}
{"_id":"ARCH000000000014","name":"Modified Drive (Archeotech)","type":"gear","img":"icons/svg/wing.svg","flags":{"wg-voidships-builder":{"component":{"kind":"archeotech","subtype":"drive-modified","tags":["archeotech","drive"]},"voidOnly":true}},"system":{"description":"Reliktowy napęd STC o nietypowej konstrukcji; wyższa prędkość i odzysk przestrzeni kosztem kaprysów serwisowych. (RT Core)","voidship":{"slot":"Internal","use":{"space":8,"power":3},"mods":{"armour":0,"integrity":0,"manoeuvre":0,"detection":0,"speed":1,"space":3,"power":0}}},"effects":[]}
{"_id":"ARCH000000000015","name":"Bridge of Antiquity","type":"gear","img":"icons/svg/book.svg","flags":{"wg-voidships-builder":{"component":{"kind":"archeotech","subtype":"bridge-antiquity","tags":["archeotech","bridge"]},"voidOnly":true}},"system":{"description":"Reliktowy mostek: loże dowódcze, antyczne interfejsy. Ułatwia koordynację i sensoraż. (RT Core)","voidship":{"slot":"Internal","use":{"space":2,"power":3},"mods":{"armour":0,"integrity":0,"manoeuvre":1,"detection":2,"speed":0,"space":0,"power":0}}},"effects":[]}
{"_id":"ARCH000000000016","name":"Auto-stabilised Logis-targeter","type":"gear","img":"icons/svg/crosshair.svg","flags":{"wg-voidships-builder":{"component":{"kind":"archeotech","subtype":"logis-targeter","tags":["archeotech","gunnery","weapon-mod"]},"voidOnly":true}},"system":{"description":"Stabilizowane kogitatory balistyczne poprawiające celność baterii. W praktyce lepsza akwizycja celów i synchronizacja ognia. (RT Core)","voidship":{"slot":"Internal","use":{"space":1,"power":2},"mods":{"armour":0,"integrity":0,"manoeuvre":0,"detection":2,"speed":0,"space":0,"power":0}}},"effects":[]}
+24 -24
View File
@@ -1,24 +1,24 @@
{"_id": "4412029d26021383", "name": "Escort Hull (Empty)", "type": "vehicle", "img": null, "system": {"mnvr": 2, "notes": "Empty hull. Add Components from Items pack.", "combat": {"size": "colossal", "speed": 10, "wounds": {"value": 0, "bonus": 0, "max": 18}, "resilience": {"bonus": 0, "total": 9}, "defence": {"bonus": 3}, "fly": 0}}, "prototypeToken": {"name": "Escort Hull (Empty)", "width": 4, "height": 4, "displayName": 50}, "flags": {"wg-voidships": {"shields": {"current": 1, "max": 1}, "speedVU": 10, "handling": 2, "cr": 5, "tur": 1, "mounts": "", "traits": "", "components": []}}, "items": [], "effects": []}
{"_id": "1f954166473bedf3", "name": "Frigate Hull (Empty)", "type": "vehicle", "img": null, "system": {"mnvr": 1, "notes": "Empty hull. Add Components from Items pack.", "combat": {"size": "colossal", "speed": 10, "wounds": {"value": 0, "bonus": 0, "max": 24}, "resilience": {"bonus": 0, "total": 10}, "defence": {"bonus": 3}, "fly": 0}}, "prototypeToken": {"name": "Frigate Hull (Empty)", "width": 4, "height": 4, "displayName": 50}, "flags": {"wg-voidships": {"shields": {"current": 2, "max": 2}, "speedVU": 10, "handling": 1, "cr": 5, "tur": 2, "mounts": "", "traits": "", "components": []}}, "items": [], "effects": []}
{"_id": "c5ca1fc87803b111", "name": "Light Cruiser Hull (Empty)", "type": "vehicle", "img": null, "system": {"mnvr": 0, "notes": "Empty hull. Add Components from Items pack.", "combat": {"size": "colossal", "speed": 9, "wounds": {"value": 0, "bonus": 0, "max": 32}, "resilience": {"bonus": 0, "total": 11}, "defence": {"bonus": 2}, "fly": 0}}, "prototypeToken": {"name": "Light Cruiser Hull (Empty)", "width": 4, "height": 4, "displayName": 50}, "flags": {"wg-voidships": {"shields": {"current": 2, "max": 2}, "speedVU": 9, "handling": 0, "cr": 6, "tur": 2, "mounts": "", "traits": "", "components": []}}, "items": [], "effects": []}
{"_id": "96a0dacd77d672bb", "name": "Cruiser Hull (Empty)", "type": "vehicle", "img": null, "system": {"mnvr": -1, "notes": "Empty hull. Add Components from Items pack.", "combat": {"size": "colossal", "speed": 8, "wounds": {"value": 0, "bonus": 0, "max": 40}, "resilience": {"bonus": 0, "total": 12}, "defence": {"bonus": 2}, "fly": 0}}, "prototypeToken": {"name": "Cruiser Hull (Empty)", "width": 4, "height": 4, "displayName": 50}, "flags": {"wg-voidships": {"shields": {"current": 3, "max": 3}, "speedVU": 8, "handling": -1, "cr": 7, "tur": 3, "mounts": "", "traits": "", "components": []}}, "items": [], "effects": []}
{"_id": "a08b1d9ef251ec0b", "name": "Jericho-class Pilgrim Vessel", "type": "vehicle", "img": null, "system": {"mnvr": -1, "notes": "Immense conversions for pilgrim passages and reliquary cargo. Cavernous holds and chapels; range and capacity over armour and speed.", "combat": {"size": "colossal", "speed": 8, "wounds": {"value": 0, "bonus": 0, "max": 36}, "resilience": {"bonus": 0, "total": 12}, "defence": {"bonus": 2}, "fly": 0}, "source": "Rogue Trader Core Rulebook, p. 195"}, "prototypeToken": {"name": "Jericho-class Pilgrim Vessel", "width": 4, "height": 4, "displayName": 50}, "flags": {"wg-voidships": {"source": "Rogue Trader Core Rulebook, p. 195", "shields": {"current": 1, "max": 1}, "speedVU": 8, "handling": -1, "cr": 5, "tur": 1, "mounts": "", "traits": "", "components": []}}, "items": [], "effects": []}
{"_id": "95fcf7b99d705bd1", "name": "Vagabond-class Merchant Trader", "type": "vehicle", "img": null, "system": {"mnvr": -1, "notes": "Modular cargobays and adaptable fittings; a chartist workhorse. Simple to keep running in frontier yards; heavily customised.", "combat": {"size": "colossal", "speed": 8, "wounds": {"value": 0, "bonus": 0, "max": 36}, "resilience": {"bonus": 0, "total": 12}, "defence": {"bonus": 2}, "fly": 0}, "source": "Rogue Trader Core Rulebook, p. 195"}, "prototypeToken": {"name": "Vagabond-class Merchant Trader", "width": 4, "height": 4, "displayName": 50}, "flags": {"wg-voidships": {"source": "Rogue Trader Core Rulebook, p. 195", "shields": {"current": 1, "max": 1}, "speedVU": 8, "handling": -1, "cr": 5, "tur": 1, "mounts": "", "traits": "", "components": []}}, "items": [], "effects": []}
{"_id": "521f6e630bd813a4", "name": "Hazeroth-class Privateer", "type": "vehicle", "img": null, "system": {"mnvr": 2, "notes": "Knife-fast raider with reinforced internals and stripped armour. Favoured for ambushes and commerce raiding.", "combat": {"size": "colossal", "speed": 10, "wounds": {"value": 0, "bonus": 0, "max": 22}, "resilience": {"bonus": 0, "total": 9}, "defence": {"bonus": 3}, "fly": 0}, "source": "Rogue Trader Core Rulebook, p. 195"}, "prototypeToken": {"name": "Hazeroth-class Privateer", "width": 4, "height": 4, "displayName": 50}, "flags": {"wg-voidships": {"source": "Rogue Trader Core Rulebook, p. 195", "shields": {"current": 1, "max": 1}, "speedVU": 10, "handling": 2, "cr": 5, "tur": 1, "mounts": "", "traits": "", "components": []}}, "items": [], "effects": []}
{"_id": "c4c69cf1b895c0e1", "name": "Havoc-class Merchant Raider", "type": "vehicle", "img": null, "system": {"mnvr": 2, "notes": "Hybrid carrier-raider balancing battery weight with cargo. Less protected than Navy hulls but brutal on traffic.", "combat": {"size": "colossal", "speed": 10, "wounds": {"value": 0, "bonus": 0, "max": 22}, "resilience": {"bonus": 0, "total": 9}, "defence": {"bonus": 3}, "fly": 0}, "source": "Rogue Trader Core Rulebook, p. 196"}, "prototypeToken": {"name": "Havoc-class Merchant Raider", "width": 4, "height": 4, "displayName": 50}, "flags": {"wg-voidships": {"source": "Rogue Trader Core Rulebook, p. 196", "shields": {"current": 1, "max": 1}, "speedVU": 10, "handling": 2, "cr": 5, "tur": 1, "mounts": "", "traits": "", "components": []}}, "items": [], "effects": []}
{"_id": "ec53303961ef4fd4", "name": "Sword-class Frigate", "type": "vehicle", "img": null, "system": {"mnvr": 1, "notes": "Reliable escort with accurate dorsal lasers and stout drives. Squadrons screen convoys and prosecute pirates.", "combat": {"size": "colossal", "speed": 10, "wounds": {"value": 0, "bonus": 0, "max": 28}, "resilience": {"bonus": 0, "total": 10}, "defence": {"bonus": 3}, "fly": 0}, "source": "Battlefleet Koronus, p. 28"}, "prototypeToken": {"name": "Sword-class Frigate", "width": 4, "height": 4, "displayName": 50}, "flags": {"wg-voidships": {"source": "Battlefleet Koronus, p. 28", "shields": {"current": 2, "max": 2}, "speedVU": 10, "handling": 1, "cr": 5, "tur": 2, "mounts": "", "traits": "", "components": []}}, "items": [], "effects": []}
{"_id": "fb874877eacc7a08", "name": "Tempest-class Strike Frigate", "type": "vehicle", "img": null, "system": {"mnvr": 1, "notes": "Close-action brawler for boardings and short-range gunnery. Reinforced prow and over-tuned drives.", "combat": {"size": "colossal", "speed": 10, "wounds": {"value": 0, "bonus": 0, "max": 28}, "resilience": {"bonus": 0, "total": 10}, "defence": {"bonus": 3}, "fly": 0}, "source": "Rogue Trader Core Rulebook, p. 196"}, "prototypeToken": {"name": "Tempest-class Strike Frigate", "width": 4, "height": 4, "displayName": 50}, "flags": {"wg-voidships": {"source": "Rogue Trader Core Rulebook, p. 196", "shields": {"current": 2, "max": 2}, "speedVU": 10, "handling": 1, "cr": 5, "tur": 2, "mounts": "", "traits": "", "components": []}}, "items": [], "effects": []}
{"_id": "c8975bb7181d8e12", "name": "Dauntless-class Light Cruiser", "type": "vehicle", "img": null, "system": {"mnvr": 0, "notes": "Versatile patrol cruiser—good acceleration and flexible refits. Often leads Passage Watch patrols.", "combat": {"size": "colossal", "speed": 9, "wounds": {"value": 0, "bonus": 0, "max": 32}, "resilience": {"bonus": 0, "total": 11}, "defence": {"bonus": 2}, "fly": 0}, "source": "Battlefleet Koronus, p. 36"}, "prototypeToken": {"name": "Dauntless-class Light Cruiser", "width": 4, "height": 4, "displayName": 50}, "flags": {"wg-voidships": {"source": "Battlefleet Koronus, p. 36", "shields": {"current": 2, "max": 2}, "speedVU": 9, "handling": 0, "cr": 6, "tur": 2, "mounts": "", "traits": "", "components": []}}, "items": [], "effects": []}
{"_id": "0b59c38ddda63f42", "name": "Lunar-class Cruiser", "type": "vehicle", "img": null, "system": {"mnvr": -1, "notes": "Archetypal line cruiser—balanced, dependable, easily refitted. Backbone of many squadrons.", "combat": {"size": "colossal", "speed": 8, "wounds": {"value": 0, "bonus": 0, "max": 40}, "resilience": {"bonus": 0, "total": 12}, "defence": {"bonus": 2}, "fly": 0}, "source": "Battlefleet Koronus, p. 24"}, "prototypeToken": {"name": "Lunar-class Cruiser", "width": 4, "height": 4, "displayName": 50}, "flags": {"wg-voidships": {"source": "Battlefleet Koronus, p. 24", "shields": {"current": 3, "max": 3}, "speedVU": 8, "handling": -1, "cr": 7, "tur": 3, "mounts": "", "traits": "", "components": []}}, "items": [], "effects": []}
{"_id": "b518e981d69324aa", "name": "Cobra-class Destroyer", "type": "vehicle", "img": null, "system": {"mnvr": 2, "notes": "Torpedo raider hunting in packs; strikes, then disengages to reload.", "combat": {"size": "colossal", "speed": 10, "wounds": {"value": 0, "bonus": 0, "max": 22}, "resilience": {"bonus": 0, "total": 9}, "defence": {"bonus": 3}, "fly": 0}, "source": "Battlefleet Koronus, p. 66"}, "prototypeToken": {"name": "Cobra-class Destroyer", "width": 4, "height": 4, "displayName": 50}, "flags": {"wg-voidships": {"source": "Battlefleet Koronus, p. 66", "shields": {"current": 1, "max": 1}, "speedVU": 10, "handling": 2, "cr": 5, "tur": 1, "mounts": "", "traits": "", "components": []}}, "items": [], "effects": []}
{"_id": "d3853b0270deaf3f", "name": "Falchion-class Frigate", "type": "vehicle", "img": null, "system": {"mnvr": 1, "notes": "Modernised frigate with improved drives for frontier scouting.", "combat": {"size": "colossal", "speed": 10, "wounds": {"value": 0, "bonus": 0, "max": 28}, "resilience": {"bonus": 0, "total": 10}, "defence": {"bonus": 3}, "fly": 0}, "source": "Battlefleet Koronus, p. 28"}, "prototypeToken": {"name": "Falchion-class Frigate", "width": 4, "height": 4, "displayName": 50}, "flags": {"wg-voidships": {"source": "Battlefleet Koronus, p. 28", "shields": {"current": 2, "max": 2}, "speedVU": 10, "handling": 1, "cr": 5, "tur": 2, "mounts": "", "traits": "", "components": []}}, "items": [], "effects": []}
{"_id": "f1ea3416a6d0d27e", "name": "Turbulent-class Heavy Frigate", "type": "vehicle", "img": null, "system": {"mnvr": 1, "notes": "Strengthened frame and broader arcs; trades agility for staying power.", "combat": {"size": "colossal", "speed": 10, "wounds": {"value": 0, "bonus": 0, "max": 28}, "resilience": {"bonus": 0, "total": 10}, "defence": {"bonus": 3}, "fly": 0}, "source": "Battlefleet Koronus, p. 28"}, "prototypeToken": {"name": "Turbulent-class Heavy Frigate", "width": 4, "height": 4, "displayName": 50}, "flags": {"wg-voidships": {"source": "Battlefleet Koronus, p. 28", "shields": {"current": 2, "max": 2}, "speedVU": 10, "handling": 1, "cr": 5, "tur": 2, "mounts": "", "traits": "", "components": []}}, "items": [], "effects": []}
{"_id": "73eed7c83ea60340", "name": "Defiant-class Light Cruiser (Carrier)", "type": "vehicle", "img": null, "system": {"mnvr": 0, "notes": "Light carrier with significant attack craft; excellent for recon and strikes.", "combat": {"size": "colossal", "speed": 9, "wounds": {"value": 0, "bonus": 0, "max": 32}, "resilience": {"bonus": 0, "total": 11}, "defence": {"bonus": 2}, "fly": 0}}, "prototypeToken": {"name": "Defiant-class Light Cruiser (Carrier)", "width": 4, "height": 4, "displayName": 50}, "flags": {"wg-voidships": {"source": "Battlefleet Koronus", "shields": {"current": 2, "max": 2}, "speedVU": 9, "handling": 0, "cr": 6, "tur": 2, "mounts": "", "traits": "", "components": []}}, "items": [], "effects": []}
{"_id": "6836e238cce8d9fc", "name": "Universe-class Mass Conveyor", "type": "vehicle", "img": null, "system": {"mnvr": -1, "notes": "Super-massive hauler for colony loads and crusade materiel; logistics linchpin.", "combat": {"size": "colossal", "speed": 8, "wounds": {"value": 0, "bonus": 0, "max": 36}, "resilience": {"bonus": 0, "total": 12}, "defence": {"bonus": 2}, "fly": 0}, "source": "Battlefleet Koronus, p. 31"}, "prototypeToken": {"name": "Universe-class Mass Conveyor", "width": 4, "height": 4, "displayName": 50}, "flags": {"wg-voidships": {"source": "Battlefleet Koronus, p. 31", "shields": {"current": 1, "max": 1}, "speedVU": 8, "handling": -1, "cr": 5, "tur": 1, "mounts": "", "traits": "", "components": []}}, "items": [], "effects": []}
{"_id": "2c612305a7bb853f", "name": "Goliath-class Factory Ship", "type": "vehicle", "img": null, "system": {"mnvr": -1, "notes": "Roving manufactorum and refinery; long autonomous deployments.", "combat": {"size": "colossal", "speed": 8, "wounds": {"value": 0, "bonus": 0, "max": 36}, "resilience": {"bonus": 0, "total": 12}, "defence": {"bonus": 2}, "fly": 0}, "source": "Battlefleet Koronus, p. 30"}, "prototypeToken": {"name": "Goliath-class Factory Ship", "width": 4, "height": 4, "displayName": 50}, "flags": {"wg-voidships": {"source": "Battlefleet Koronus, p. 30", "shields": {"current": 1, "max": 1}, "speedVU": 8, "handling": -1, "cr": 5, "tur": 1, "mounts": "", "traits": "", "components": []}}, "items": [], "effects": []}
{"_id": "287a7cd15c95031f", "name": "Conquest-class Star Galleon", "type": "vehicle", "img": null, "system": {"mnvr": -1, "notes": "Heavily built merchant galleon with strong batteries and hull.", "combat": {"size": "colossal", "speed": 8, "wounds": {"value": 0, "bonus": 0, "max": 36}, "resilience": {"bonus": 0, "total": 12}, "defence": {"bonus": 2}, "fly": 0}, "source": "Battlefleet Koronus, p. 25"}, "prototypeToken": {"name": "Conquest-class Star Galleon", "width": 4, "height": 4, "displayName": 50}, "flags": {"wg-voidships": {"source": "Battlefleet Koronus, p. 25", "shields": {"current": 1, "max": 1}, "speedVU": 8, "handling": -1, "cr": 5, "tur": 1, "mounts": "", "traits": "", "components": []}}, "items": [], "effects": []}
{"_id": "750ee1998f698e08", "name": "Orion-class Star Clipper", "type": "vehicle", "img": null, "system": {"mnvr": -1, "notes": "Fast passenger/light-cargo clipper for courier missions and risky runs.", "combat": {"size": "colossal", "speed": 8, "wounds": {"value": 0, "bonus": 0, "max": 36}, "resilience": {"bonus": 0, "total": 12}, "defence": {"bonus": 2}, "fly": 0}, "source": "Into the Storm, p. 150"}, "prototypeToken": {"name": "Orion-class Star Clipper", "width": 4, "height": 4, "displayName": 50}, "flags": {"wg-voidships": {"source": "Into the Storm, p. 150", "shields": {"current": 1, "max": 1}, "speedVU": 8, "handling": -1, "cr": 5, "tur": 1, "mounts": "", "traits": "", "components": []}}, "items": [], "effects": []}
{"_id": "6da4418bdbd2206c", "name": "Cobra-class Destroyer (Renegade)", "type": "vehicle", "img": null, "system": {"mnvr": 2, "notes": "Ex-Navy Cobra in privateer hands with non-standard prow refits.", "combat": {"size": "colossal", "speed": 10, "wounds": {"value": 0, "bonus": 0, "max": 22}, "resilience": {"bonus": 0, "total": 9}, "defence": {"bonus": 3}, "fly": 0}, "source": "Battlefleet Koronus, p. 66"}, "prototypeToken": {"name": "Cobra-class Destroyer (Renegade)", "width": 4, "height": 4, "displayName": 50}, "flags": {"wg-voidships": {"source": "Battlefleet Koronus, p. 66", "shields": {"current": 1, "max": 1}, "speedVU": 10, "handling": 2, "cr": 5, "tur": 1, "mounts": "", "traits": "", "components": []}}, "items": [], "effects": []}
{"_id": "0eb071148d375807", "name": "Secutor-class Monitor-Cruiser", "type": "vehicle", "img": null, "system": {"mnvr": -1, "notes": "Mechanicus monitor with powerful dorsals and redundant shielding; anchors actions.", "combat": {"size": "colossal", "speed": 8, "wounds": {"value": 0, "bonus": 0, "max": 40}, "resilience": {"bonus": 0, "total": 12}, "defence": {"bonus": 2}, "fly": 0}, "source": "Into the Storm, p. 151"}, "prototypeToken": {"name": "Secutor-class Monitor-Cruiser", "width": 4, "height": 4, "displayName": 50}, "flags": {"wg-voidships": {"source": "Into the Storm, p. 151", "shields": {"current": 3, "max": 3}, "speedVU": 8, "handling": -1, "cr": 7, "tur": 3, "mounts": "", "traits": "", "components": []}}, "items": [], "effects": []}
{"_id": "104965869ffa36bb", "name": "Lathe-class Monitor-Cruiser", "type": "vehicle", "img": null, "system": {"mnvr": -1, "notes": "Lathes-forged variant emphasising resilient sanctified systems.", "combat": {"size": "colossal", "speed": 8, "wounds": {"value": 0, "bonus": 0, "max": 40}, "resilience": {"bonus": 0, "total": 12}, "defence": {"bonus": 2}, "fly": 0}, "source": "Into the Storm, p. 152"}, "prototypeToken": {"name": "Lathe-class Monitor-Cruiser", "width": 4, "height": 4, "displayName": 50}, "flags": {"wg-voidships": {"source": "Into the Storm, p. 152", "shields": {"current": 3, "max": 3}, "speedVU": 8, "handling": -1, "cr": 7, "tur": 3, "mounts": "", "traits": "", "components": []}}, "items": [], "effects": []}
{"_id": "6774443321f24e87", "name": "Tyrant-class Cruiser", "type": "vehicle", "img": null, "system": {"mnvr": -1, "notes": "Macrobattery-focused cruiser optimised for crushing broadsides.", "combat": {"size": "colossal", "speed": 8, "wounds": {"value": 0, "bonus": 0, "max": 40}, "resilience": {"bonus": 0, "total": 12}, "defence": {"bonus": 2}, "fly": 0}, "source": "Into the Storm, p. 153"}, "prototypeToken": {"name": "Tyrant-class Cruiser", "width": 4, "height": 4, "displayName": 50}, "flags": {"wg-voidships": {"source": "Into the Storm, p. 153", "shields": {"current": 3, "max": 3}, "speedVU": 8, "handling": -1, "cr": 7, "tur": 3, "mounts": "", "traits": "", "components": []}}, "items": [], "effects": []}
{"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":0},"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":0},"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":0},"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":0},"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":0},"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":0},"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":0},"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":0},"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":0},"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":0},"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":0},"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":0},"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":0},"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":0},"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":0},"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":0},"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":0},"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":0},"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":0},"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":0},"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":0},"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":0},"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":0},"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":0},"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"}
@@ -0,0 +1,24 @@
{"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"}
@@ -1,76 +1,5 @@
{"_id": "4c636b539f64cdb9", "name": "Mars-Pattern Macrocannon", "type": "weapon", "img": null, "system": {"category": "ranged", "damage": {"base": 12, "bonus": 0, "rank": 0, "ed": {"base": 3, "bonus": 0, "rank": 0}, "ap": {"base": -1, "bonus": 0, "rank": 0}, "enabled": false, "otherDamage": {"mortal": "0", "shock": "0", "wounds": "0"}}, "range": {"short": 30, "medium": 60, "long": 120, "melee": 1, "thrown": null}, "salvo": 3, "traits": {"list": [{"name": "brutal"}, {"name": "rapidFire", "rating": "2"}]}, "keywords": "VOIDSHIP, MACROBROADSIDES"}}
{"_id": "ca475410c5c586ab", "name": "Sunsear Laser Battery", "type": "weapon", "img": null, "system": {"category": "ranged", "damage": {"base": 14, "bonus": 0, "rank": 0, "ed": {"base": 2, "bonus": 0, "rank": 0}, "ap": {"base": -2, "bonus": 0, "rank": 0}, "enabled": false, "otherDamage": {"mortal": "0", "shock": "0", "wounds": "0"}}, "range": {"short": 40, "medium": 80, "long": 160, "melee": 1, "thrown": null}, "salvo": 2, "traits": {"list": [{"name": "reliable"}, {"name": "volley", "rating": "2"}]}, "keywords": "VOIDSHIP, MACROLASERS"}}
{"_id": "2e5ebcbd3f63b739", "name": "Lance Battery", "type": "weapon", "img": null, "system": {"category": "ranged", "damage": {"base": 16, "bonus": 0, "rank": 0, "ed": {"base": 1, "bonus": 0, "rank": 0}, "ap": {"base": -3, "bonus": 0, "rank": 0}, "enabled": false, "otherDamage": {"mortal": "0", "shock": "0", "wounds": "0"}}, "range": {"short": 50, "medium": 100, "long": 200, "melee": 1, "thrown": null}, "salvo": 2, "traits": {"list": [{"name": "precise"}, {"name": "volley", "rating": "2"}]}, "keywords": "VOIDSHIP, LANCE"}}
{"_id":"c0e76cf8e4a100c0","name":"Torpedo Tubes","type":"weapon","img":"modules/wng-core/assets/icons/weapons/missile-launcher.webp","system":{"category":"launcher","description":"Torpedowe wyrzutnie okrętowe. Strzał: Gunnery (BS) vs DEF; przechwytywalne przez TUR. Statystyki efektu zależą od załadowanej głowicy.\n\n**Kompatybilna amunicja (drag&drop na aktora, a następnie wybierz w polu Ammo):**\n• Torpedo Warhead — Standard / Plasma / Melta / Virus / Vortex / Guided.\n\n**Uwaga:** natywny system W&G nie zmienia DMG/AP/ED wg amunicji; używaj opisu ładunku przy interpretacji efektu.","keywords":"VOIDSHIP, ORDNANCE, TORPEDO, AMMO-DEPENDENT","rarity":"uncommon","salvo":1,"damage":{"enabled":false,"base":0,"bonus":0,"rank":0,"ed":{"base":0,"bonus":0,"rank":0},"ap":{"base":0,"bonus":0,"rank":0},"otherDamage":{"mortal":"0","shock":"0","wounds":"0"}},"range":{"short":30,"medium":60,"long":120,"melee":1,"thrown":null},"ammo":{},"traits":{"list":[{"name":"ordnance"},{"name":"interceptable","rating":"TUR"}]},"upgrades":[]}}
{"_id":"60951ef378ddb44c","name":"Launch Bay","type":"weapon","img":"modules/wng-core/assets/icons/weapons/missile-launcher.webp","system":{"category":"launcher","description":"Zatoki startowe dla skrzydeł. Test Gunnery (BS) vs DEF celu lub manewry CAP/Intercept/Bombing/Assault zgodnie z ładunkiem skrzydeł.\n\n**Kompatybilna amunicja (wybierz w polu Ammo):**\n• Wing Loadout — Fury Interceptors / Starhawk Bombers / Assault Boats.\n\n**Uwaga:** system nie modyfikuje DMG/AP/ED wg ładunku — używaj opisu skrzydła.","keywords":"VOIDSHIP, CARRIER, CRAFT, AMMO-DEPENDENT","rarity":"uncommon","salvo":1,"damage":{"enabled":false,"base":0,"bonus":0,"rank":0,"ed":{"base":0,"bonus":0,"rank":0},"ap":{"base":0,"bonus":0,"rank":0},"otherDamage":{"mortal":"0","shock":"0","wounds":"0"}},"range":{"short":30,"medium":60,"long":120,"melee":1,"thrown":null},"ammo":{},"traits":{"list":[{"name":"carrier","rating":"wings"},{"name":"interceptable","rating":"TUR"}]},"upgrades":[]}}
{"_id": "24c79e9c9ee464af","name":"Nova Cannon","type":"weapon","img":null,"system":{"category":"ranged","description":"Potężny strzał z przeładowaniem: można odpalić co 2 rundy (Recharge 1). Jeśli chybi, fala uderzeniowa rozrywa jednostki w promieniu 1 VU od punktu detonacji (rozproszenie). Każda 6 na ED przy trafieniu generuje dodatkowy krytyk.","keywords":"VOIDSHIP, SIEGE, NOVA","rarity":"rare","salvo":1,"damage":{"enabled":false,"base":0,"bonus":0,"rank":0,"ed":{"base":0,"bonus":0,"rank":0},"ap":{"base":0,"bonus":0,"rank":0},"otherDamage":{"mortal":"0","shock":"0","wounds":"0"}},"range":{"short":30,"medium":60,"long":120,"melee":1,"thrown":null},"traits":{"list":[{"name":"recharge","rating":"1 (fires every 2 rounds)"},{"name":"blast","rating":"1 VU (shockwave on miss)"},{"name":"nova-scatter","rating":"miss: detonate area"},{"name":"ed6-extra-crit","rating":"ED=6 → +1 Crit"}]},"install":{"notes":"DMG/AP/ED i dokładny szablon efektu mogą być modulowane stołowo; core: Recharge 1, miss→fala 1 VU, ED=6→+1 Crit."}}}
{"_id": "dce16e3acc436f41", "name": "Plasma Drive — Jovian Pattern", "type": "gear", "img": null, "system": {"description": "Essential Component: plasma drive (Jovian).", "value": 0, "rarity": "rare", "keywords": "VOIDSHIP, ESSENTIAL, DRIVE"}}
{"_id": "501ff1a2bd541b7a", "name": "Plasma Drive — Lathe Pattern", "type": "gear", "img": null, "system": {"description": "Essential Component: plasma drive (Lathe).", "value": 0, "rarity": "veryRare", "keywords": "VOIDSHIP, ESSENTIAL, DRIVE"}}
{"_id": "696ec23471a30210", "name": "Warp Engine — Strelov", "type": "gear", "img": null, "system": {"description": "Essential Component: warp engine (Strelov).", "value": 0, "rarity": "rare", "keywords": "VOIDSHIP, ESSENTIAL, WARP"}}
{"_id": "6251cd78f55a7109", "name": "Warp Engine — Miloslav", "type": "gear", "img": null, "system": {"description": "Essential Component: warp engine (Miloslav).", "value": 0, "rarity": "veryRare", "keywords": "VOIDSHIP, ESSENTIAL, WARP"}}
{"_id": "46a88fd35a5b5c3c", "name": "Geller Field (Primary)", "type": "gear", "img": null, "system": {"description": "Primary Geller field projector.", "value": 0, "rarity": "rare", "keywords": "VOIDSHIP, ESSENTIAL, GELLER"}}
{"_id": "3e086585bbae99e3", "name": "Geller Field (Reserve)", "type": "gear", "img": null, "system": {"description": "Reserve/backup Geller field (independent).", "value": 0, "rarity": "rare", "keywords": "VOIDSHIP, ESSENTIAL, GELLER"}}
{"_id": "252f476c561c29a4", "name": "Void Shield Array (Single)", "type": "gear", "img": null, "system": {"description": "Single-pattern void shields.", "value": 0, "rarity": "rare", "keywords": "VOIDSHIP, ESSENTIAL, SHIELDS"}}
{"_id": "ba4dff7991891d61", "name": "Void Shield Array (Double)", "type": "gear", "img": null, "system": {"description": "Dual-pattern void shields.", "value": 0, "rarity": "veryRare", "keywords": "VOIDSHIP, ESSENTIAL, SHIELDS"}}
{"_id": "830b39f8c6a0367e", "name": "Combat Bridge", "type": "gear", "img": null, "system": {"description": "Command bridge; targeting/cmd suites.", "value": 0, "rarity": "uncommon", "keywords": "VOIDSHIP, ESSENTIAL, BRIDGE"}}
{"_id": "9f0743898f310492", "name": "Vitae-Pattern Life Sustainer", "type": "gear", "img": null, "system": {"description": "Essential life sustainer system.", "value": 0, "rarity": "rare", "keywords": "VOIDSHIP, ESSENTIAL, LIFE-SUSTAINER"}}
{"_id": "d8430ab1d15beb37", "name": "Voidsmen Quarters", "type": "gear", "img": null, "system": {"description": "Standard crew quarters.", "value": 0, "rarity": "common", "keywords": "VOIDSHIP, ESSENTIAL, QUARTERS"}}
{"_id": "1916605eb593cc0a", "name": "Luxury Passenger Quarters", "type": "gear", "img": null, "system": {"description": "Luxury accommodations.", "value": 0, "rarity": "rare", "keywords": "VOIDSHIP, ESSENTIAL, QUARTERS"}}
{"_id": "dd72e813065d0e34", "name": "Auger Array", "type": "gear", "img": null, "system": {"description": "Standard shipboard augur sensors.", "value": 0, "rarity": "uncommon", "keywords": "VOIDSHIP, ESSENTIAL, AUGUR"}}
{"_id": "fff778f13b7ddf73", "name": "Empyrean Mantle", "type": "gear", "img": null, "system": {"description": "Warp-signature damping.", "value": 0, "rarity": "veryRare", "keywords": "VOIDSHIP, SUPPLEMENTAL, STEALTH"}}
{"_id": "2a099d32269fcc91", "name": "Holo-Baffles", "type": "gear", "img": null, "system": {"description": "Visual/holo signature masking.", "value": 0, "rarity": "rare", "keywords": "VOIDSHIP, SUPPLEMENTAL, STEALTH"}}
{"_id": "692975b02473b4ef", "name": "Teleportarium", "type": "gear", "img": null, "system": {"description": "Teleport insertion capability.", "value": 0, "rarity": "veryRare", "keywords": "VOIDSHIP, SUPPLEMENTAL"}}
{"_id": "26ea0553729833be", "name": "Tenebro-Maze", "type": "gear", "img": null, "system": {"description": "Internal labyrinth vs boarders.", "value": 0, "rarity": "rare", "keywords": "VOIDSHIP, SUPPLEMENTAL"}}
{"_id": "b9cd53d57d0eb46c", "name": "Murder-Servitors", "type": "gear", "img": null, "system": {"description": "Automated servitor kill-grids.", "value": 0, "rarity": "veryRare", "keywords": "VOIDSHIP, SUPPLEMENTAL"}}
{"_id": "209b5b26731923b6", "name": "Superior Plating", "type": "gear", "img": null, "system": {"description": "Enhanced armor facings.", "value": 0, "rarity": "rare", "keywords": "VOIDSHIP, SUPPLEMENTAL"}}
{"_id": "96594975caec8fd1", "name": "Librarium Vault", "type": "gear", "img": null, "system": {"description": "Schola/librarium complex.", "value": 0, "rarity": "uncommon", "keywords": "VOIDSHIP, SUPPLEMENTAL"}}
{"_id": "53394adfd9df0f67", "name": "Temple-Shrine to the God-Emperor", "type": "gear", "img": null, "system": {"description": "Dedicated shrine complex.", "value": 0, "rarity": "uncommon", "keywords": "VOIDSHIP, SUPPLEMENTAL"}}
{"_id": "eed15ac1f0b855d0", "name": "Observation Dome", "type": "gear", "img": null, "system": {"description": "Panoramic astrogation dome.", "value": 0, "rarity": "uncommon", "keywords": "VOIDSHIP, SUPPLEMENTAL"}}
{"_id": "035ef8929ef5c465", "name": "Cargo Hold & Lighter Bay", "type": "gear", "img": null, "system": {"description": "Expanded cargo & lighters.", "value": 0, "rarity": "common", "keywords": "VOIDSHIP, SUPPLEMENTAL"}}
{"_id": "ce218220da6dad3e", "name": "Barracks", "type": "gear", "img": null, "system": {"description": "Embarked troops for boarding/landings.", "value": 0, "rarity": "uncommon", "keywords": "VOIDSHIP, SUPPLEMENTAL"}}
{"_id": "32caa789ebca127b", "name": "Auto-Temple", "type": "gear", "img": null, "system": {"description": "Automated Ecclesiarchy node.", "value": 0, "rarity": "rare", "keywords": "VOIDSHIP, SUPPLEMENTAL"}}
{"_id": "3e2dd5640db8e12b", "name": "Trophy Room", "type": "gear", "img": null, "system": {"description": "Crew morale-focused trophy hall.", "value": 0, "rarity": "uncommon", "keywords": "VOIDSHIP, SUPPLEMENTAL"}}
{"_id":"e101a1b2c3d4e5f1","name":"BG-15 Assault Scanners","type":"gear","img":null,"system":{"description":"Zbliżeniowe, agresywnie strojone auspeksy do skanów podczas abordażu i w zwarciu. Ułatwiają szybkie namierzanie celów w pobliżu.","keywords":"VOIDSHIP, ESSENTIAL, AUGUR","rarity":"uncommon","source":"Battlefleet Koronus, p. 34"}}
{"_id":"e102a1b2c3d4e5f2","name":"Belecane-pattern 90.r Geller Field","type":"gear","img":null,"system":{"description":"Standaryzowany generator pola Gellera utrzymujący „bańkę” rzeczywistości podczas żeglugi w Osnowie.","keywords":"VOIDSHIP, ESSENTIAL, GELLER","rarity":"uncommon","source":"Battlefleet Koronus, p. 34"}}
{"_id":"e103a1b2c3d4e5f3","name":"Bilge-Rat Quarters","type":"gear","img":null,"system":{"description":"Skrajnie oszczędne, ciasne kwatery maksymalizujące pojemność załogi kosztem morale i komfortu.","keywords":"VOIDSHIP, ESSENTIAL, QUARTERS","rarity":"uncommon","source":"Battlefleet Koronus, p. 34"}}
{"_id":"e104a1b2c3d4e5f4","name":"Clemency-pattern Life Sustainer","type":"gear","img":null,"system":{"description":"Wydajny układ podtrzymania życia z ulepszonym obiegiem powietrza i recyklingiem; zmniejsza straty długodystansowe.","keywords":"VOIDSHIP, ESSENTIAL, LIFE-SUSTAINER","rarity":"uncommon","source":"Battlefleet Koronus, p. 34"}}
{"_id":"e105a1b2c3d4e5f5","name":"Fleet Flag Bridge","type":"gear","img":null,"system":{"description":"Mostek flagowy do koordynacji formacji i zespołów zadaniowych; rozszerzone stanowiska dowodzenia i łączności.","keywords":"VOIDSHIP, ESSENTIAL, BRIDGE","rarity":"uncommon","source":"Battlefleet Koronus, p. 34"}}
{"_id":"e106a1b2c3d4e5f6","name":"Flight Command Bridge","type":"gear","img":null,"system":{"description":"Układ mostka zoptymalizowany pod działania lotnicze; integracja kontroli skrzydeł myśliwskich i rozpoznawczych.","keywords":"VOIDSHIP, ESSENTIAL, BRIDGE","rarity":"uncommon","source":"Battlefleet Koronus, p. 34"}}
{"_id":"e107a1b2c3d4e5f7","name":"Invasion Bridge","type":"gear","img":null,"system":{"description":"Mostek szturmowy do kierowania desantami i operacjami lądowania; kaplice bojowe i łącza do sekcji piechoty.","keywords":"VOIDSHIP, ESSENTIAL, BRIDGE","rarity":"uncommon","source":"Battlefleet Koronus, p. 34"}}
{"_id":"e108a1b2c3d4e5f8","name":"Jovian-pattern Class 8.1 Drive","type":"gear","img":null,"system":{"description":"Fregatowy rdzeń plazmowy Jovian niezawodny i łatwy w serwisie w stoczniach Imperial Navy.","keywords":"VOIDSHIP, ESSENTIAL, DRIVE","rarity":"uncommon","source":"Battlefleet Koronus, p. 34"}}
{"_id":"e109a1b2c3d4e5f9","name":"Jovian-pattern Class 8.2 Drive","type":"gear","img":null,"system":{"description":"Lekkokrezerski wariant napędu Jovian zoptymalizowany do długich patroli i równych cykli obciążenia.","keywords":"VOIDSHIP, ESSENTIAL, DRIVE","rarity":"uncommon","source":"Battlefleet Koronus, p. 34"}}
{"_id":"e10aa1b2c3d4e5fa","name":"Jovian-pattern Class 8.3 Drive","type":"gear","img":null,"system":{"description":"Krezerskie turbiny Jovian balans między ciągiem a nakładem obsługi i remontów.","keywords":"VOIDSHIP, ESSENTIAL, DRIVE","rarity":"uncommon","source":"Battlefleet Koronus, p. 34"}}
{"_id":"e10ba1b2c3d4e5fb","name":"Jovian-pattern Class 8.4 Drive","type":"gear","img":null,"system":{"description":"Rdzeń plazmowy dla ciężkich krążowników długotrwałe kampanie i wysoka rezerwa mocy.","keywords":"VOIDSHIP, ESSENTIAL, DRIVE","rarity":"uncommon","source":"Battlefleet Koronus, p. 34"}}
{"_id":"e10ca1b2c3d4e5fc","name":"Miloslav G-616.b Warp Engine","type":"gear","img":null,"system":{"description":"Kompaktowy silnik Osnowy do rajderów/transportowców/fregat; agresywne, szybkie tranzyty kosztem kapryśności.","keywords":"VOIDSHIP, ESSENTIAL, WARP","rarity":"uncommon","source":"Battlefleet Koronus, p. 34"}}
{"_id":"e10da1b2c3d4e5fd","name":"Miloslav H-616.b Warp Engine","type":"gear","img":null,"system":{"description":"Wzmocniona wersja Miloslava dla lekkich i pełnych krążowników; lepsza stabilność w burzach Osnowy.","keywords":"VOIDSHIP, ESSENTIAL, WARP","rarity":"uncommon","source":"Battlefleet Koronus, p. 34"}}
{"_id":"e10ea1b2c3d4e5fe","name":"Saturine-pattern Class 4A Ultra Drive","type":"gear","img":null,"system":{"description":"Battlecruiserowy napęd plazmowy brutalne przyspieszenia i wysoki ciąg w krótkich oknach bojowych.","keywords":"VOIDSHIP, ESSENTIAL, DRIVE","rarity":"uncommon","source":"Battlefleet Koronus, p. 34"}}
{"_id":"e10fa1b2c3d4e5ff","name":"Saturine-pattern Class 5 Drive","type":"gear","img":null,"system":{"description":"Napęd dla grand cruiser imponująca moc przy wysokich kosztach utrzymania i wymogach serwisowych.","keywords":"VOIDSHIP, ESSENTIAL, DRIVE","rarity":"uncommon","source":"Battlefleet Koronus, p. 34"}}
{"_id":"e110a1b2c3d4e5f0","name":"Triple Void Shield Array","type":"gear","img":null,"system":{"description":"Potrójna warstwa imperialnych osłon dla ciężkich kadłubów linii; zapewnia znacznie większą chłonność ognia.","keywords":"VOIDSHIP, ESSENTIAL, SHIELDS","rarity":"uncommon","source":"Battlefleet Koronus, p. 34"}}
{"_id":"e111a1b2c3d4e5f1","name":"Voss 'Glimmer'-pattern Void Shield Array","type":"gear","img":null,"system":{"description":"Wydajna, jednowarstwowa osłona wg wzorca Voss standard dla lżejszych kadłubów.","keywords":"VOIDSHIP, ESSENTIAL, SHIELDS","rarity":"uncommon","source":"Battlefleet Koronus, p. 34"}}
{"_id":"e112a1b2c3d4e5f2","name":"Voss 'Glimmer'-pattern Multiple Void Shield Array","type":"gear","img":null,"system":{"description":"Rozbudowany układ tarcz Voss z wieloma warstwami typowy dla krążowników.","keywords":"VOIDSHIP, ESSENTIAL, SHIELDS","rarity":"uncommon","source":"Battlefleet Koronus, p. 34"}}
{"_id":"e113a1b2c3d4e5f3","name":"X-470 Ultimo Array","type":"gear","img":null,"system":{"description":"Mocny zewnętrzny zestaw augurów ponadprzeciętna detekcja, ale silna sygnatura emisyjna.","keywords":"VOIDSHIP, ESSENTIAL, AUGUR","rarity":"uncommon","source":"Battlefleet Koronus, p. 34"}}
{"_id":"e114a1b2c3d4e5f4","name":"Arboretum","type":"gear","img":null,"system":{"description":"Hydroponiczne ogrody poprawiające morale i wspomagające podtrzymanie życia w długich rejsach.","keywords":"VOIDSHIP, SUPPLEMENTAL, LIFE-SUPPORT","rarity":"uncommon","source":"Into the Storm, p. 161162"}}
{"_id":"e115a1b2c3d4e5f5","name":"Asteroid Mining Facility","type":"gear","img":null,"system":{"description":"Zestawy górnicze, holowniki i rafinerie pokładowe do samodzielnej eksploatacji pasów asteroid.","keywords":"VOIDSHIP, SUPPLEMENTAL, INDUSTRY","rarity":"uncommon","source":"Into the Storm, p. 161162"}}
{"_id":"e116a1b2c3d4e5f6","name":"Astropathic Choir-chambers","type":"gear","img":null,"system":{"description":"Ufortyfikowane, wyciszone komnaty dla chóru astropatów z wzmacniaczami psycho-łączności.","keywords":"VOIDSHIP, SUPPLEMENTAL, COMMUNICATIONS","rarity":"uncommon","source":"Into the Storm, p. 161"}}
{"_id":"e117a1b2c3d4e5f7","name":"Auxiliary Plasma Banks","type":"gear","img":null,"system":{"description":"Dodatkowe akumulatory plazmowe zapewniające krótkie skoki mocy dla całego okrętu.","keywords":"VOIDSHIP, SUPPLEMENTAL, DRIVE","rarity":"uncommon","source":"Into the Storm, p. 161"}}
{"_id":"e118a1b2c3d4e5f8","name":"Broadband Hymn-casters","type":"gear","img":null,"system":{"description":"Wieże nadawcze zalewające wszystkie pasma hymnami, utrudniające koordynację przeciwnika.","keywords":"VOIDSHIP, SUPPLEMENTAL, COMMUNICATIONS","rarity":"uncommon","install":{"power":3,"space":0,"sp":1},"source":"Into the Storm, p. 161"}}
{"_id":"e119a1b2c3d4e5f9","name":"Drop Pod Launch Bays","type":"gear","img":null,"system":{"description":"Katedry startowe i układy naprowadzania do masowych zrzutów kapsuł desantowych.","keywords":"VOIDSHIP, SUPPLEMENTAL, ORDNANCE","rarity":"uncommon","install":{"power":1,"space":3,"sp":2},"source":"Into the Storm, p. 161"}}
{"_id":"e11aa1b2c3d4e5fa","name":"Empyrean Mantle (Expanded)","type":"gear","img":null,"system":{"description":"Rozbudowane projektory tłumiące sygnaturę w Osnowie; warianty dla mniejszych i większych kadłubów.","keywords":"VOIDSHIP, SUPPLEMENTAL, STEALTH","rarity":"uncommon","install":{"variants":[{"hulls":"Transports/Raiders/Frigates","power":3,"space":0,"sp":2},{"hulls":"Light Cruisers/Cruisers","power":5,"space":0,"sp":2}]},"source":"Into the Storm, p. 161162"}}
{"_id":"e11ba1b2c3d4e5fb","name":"Reinforced Prow","type":"gear","img":null,"system":{"description":"Wzmocniona struktura dziobowa do taranowania i walki na kursie zbieżnym.","keywords":"VOIDSHIP, SUPPLEMENTAL, ARMOUR","rarity":"uncommon","install":{"power":0,"space":2,"sp":1},"source":"Into the Storm, p. 161162"}}
{"_id":"e11ca1b2c3d4e5fc","name":"Shadowblind Bays","type":"gear","img":null,"system":{"description":"Zaciemnione, bafflowane zatoki maskujące ruchy i sygnaturę cieplną w trakcie operacji.","keywords":"VOIDSHIP, SUPPLEMENTAL, CARGO","rarity":"uncommon","source":"Into the Storm, p. 161"}}
{"_id":"e11da1b2c3d4e5fd","name":"Jovian-pattern Missile Battery","type":"weapon","img":null,"system":{"category":"ranged","damage":{"base":12,"bonus":0,"rank":0,"ed":{"base":2,"bonus":0,"rank":0},"ap":{"base":-1,"bonus":0,"rank":0},"enabled":false,"otherDamage":{"mortal":"0","shock":"0","wounds":"0"}},"range":{"short":30,"medium":60,"long":120},"salvo":2,"traits":{"list":[{"name":"volley","rating":"2"}]},"description":"Zewnętrzne zasobniki rakiet do gwałtownego salwowania idealne na otwarcie starcia, potem długi przeładunek.","keywords":"VOIDSHIP, ORDNANCE, MACROBATT","rarity":"uncommon","source":"Into the Storm, p. 161"}}
{"_id":"e11ea1b2c3d4e5fe","name":"Lathe-pattern Grav-culverin Broadside","type":"weapon","img":null,"system":{"category":"ranged","damage":{"base":12,"bonus":0,"rank":0,"ed":{"base":2,"bonus":0,"rank":0},"ap":{"base":-1,"bonus":0,"rank":0},"enabled":false,"otherDamage":{"mortal":"0","shock":"0","wounds":"0"}},"range":{"short":30,"medium":60,"long":120},"salvo":2,"traits":{"list":[{"name":"broadside","rating":"-"},{"name":"option:extended-range (reduced damage)","rating":"-"}]},"description":"Grawitacyjne masowe miotacze; mogą odpalać samonapędzane pociski dla większego zasięgu kosztem obrażeń.","keywords":"VOIDSHIP, MACROBROADSIDES","rarity":"uncommon","source":"Into the Storm, p. 161162"}}
{"_id":"e11fa1b2c3d4e5ff","name":"Mezoa-pattern Macrocannons","type":"weapon","img":null,"system":{"category":"ranged","damage":{"base":12,"bonus":0,"rank":0,"ed":{"base":2,"bonus":0,"rank":0},"ap":{"base":-1,"bonus":0,"rank":0},"enabled":false,"otherDamage":{"mortal":"0","shock":"0","wounds":"0"}},"range":{"short":30,"medium":60,"long":120},"salvo":2,"traits":{"list":[{"name":"bulky","rating":"-"}]},"description":"Mezoański wariant Mars-pattern wyższe osiągi za cenę większych wymagań mocy i przestrzeni.","keywords":"VOIDSHIP, MACROBATT","rarity":"uncommon","source":"Into the Storm, p. 161162"}}
{"_id":"e120a1b2c3d4e5f0","name":"Pyros Melta-cannons","type":"weapon","img":null,"system":{"category":"ranged","damage":{"base":12,"bonus":0,"rank":0,"ed":{"base":2,"bonus":0,"rank":0},"ap":{"base":-1,"bonus":0,"rank":0},"enabled":false,"otherDamage":{"mortal":"0","shock":"0","wounds":"0"}},"range":{"short":30,"medium":60,"long":120},"salvo":2,"traits":{"list":[{"name":"inferno-on-crit","rating":"-"}]},"description":"Przewymiarowane lufy z ładunkami melta; trafienia krytyczne łatwo wzniecają rozległe pożary.","keywords":"VOIDSHIP, MACROBATT, MELTA","rarity":"uncommon","source":"Into the Storm, p. 162"}}
{"_id":"e121a1b2c3d4e5f1","name":"Sunhammer Lance (Weapon)","type":"weapon","img":null,"system":{"category":"ranged","damage":{"base":12,"bonus":0,"rank":0,"ed":{"base":2,"bonus":0,"rank":0},"ap":{"base":-1,"bonus":0,"rank":0},"enabled":false,"otherDamage":{"mortal":"0","shock":"0","wounds":"0"}},"range":{"short":30,"medium":60,"long":120},"salvo":2,"traits":{"list":[{"name":"lance","rating":"-"}]},"description":"Wysokoenergetyczny emiter lancy do przebijania pancerzy i pasów opancerzenia.","keywords":"VOIDSHIP, LANCE","rarity":"uncommon","source":"Into the Storm, p. 163"}}
{"_id":"e122a1b2c3d4e5f2","name":"Sunhammer Lance (Battery)","type":"weapon","img":null,"system":{"category":"ranged","damage":{"base":12,"bonus":0,"rank":0,"ed":{"base":2,"bonus":0,"rank":0},"ap":{"base":-1,"bonus":0,"rank":0},"enabled":false,"otherDamage":{"mortal":"0","shock":"0","wounds":"0"}},"range":{"short":30,"medium":60,"long":120},"salvo":2,"traits":{"list":[{"name":"lance","rating":"-"},{"name":"battery","rating":"-"}]},"description":"Zespół sprzężonych emiterów Sunhammer nasyca cel cięciem wiązek przy ogromnym poborze mocy.","keywords":"VOIDSHIP, LANCE","rarity":"uncommon","source":"Into the Storm, p. 163"}}
{"_id":"e123a1b2c3d4e5f3","name":"Sunsear Las-broadside","type":"weapon","img":null,"system":{"category":"ranged","damage":{"base":12,"bonus":0,"rank":0,"ed":{"base":2,"bonus":0,"rank":0},"ap":{"base":-1,"bonus":0,"rank":0},"enabled":false,"otherDamage":{"mortal":"0","shock":"0","wounds":"0"}},"range":{"short":30,"medium":60,"long":120},"salvo":2,"traits":{"list":[{"name":"broadside","rating":"-"}]},"description":"Długozasięgowe zespoły Sunsear na burtach celność i precyzja na dystansie.","keywords":"VOIDSHIP, MACROLASERS","rarity":"uncommon","source":"Into the Storm, p. 162163"}}
{"_id":"a1b2c3d4e5f60123","name":"Torpedo Warhead — Standard","type":"weapon","img":"modules/wng-core/assets/icons/weapons/ranged-weapon.webp","system":{"quantity":1,"rarity":"uncommon","description":"Standardowa głowica torpedy. Używana przez Torpedo Tubes. Strzał przechwytywalny przez TUR.","value":0,"keywords":"VOIDSHIP, TORPEDO, WARHEAD","equipped":false,"attack":{"base":0,"bonus":0,"rank":"0"},"damage":{"base":14,"bonus":0,"rank":0,"ed":{"base":3,"bonus":0,"rank":0},"ap":{"base":-2,"bonus":0,"rank":0},"enabled":false,"otherDamage":{"mortal":"0","wounds":"0","shock":"0"}},"ed":{"base":3,"bonus":0,"rank":0},"ap":{"base":-2,"bonus":0,"rank":0},"category":"grenade-missile","range":{"short":30,"medium":60,"long":120,"melee":1,"thrown":null},"ammo":{"id":""},"salvo":1,"traits":{"list":[{"name":"ordnance"},{"name":"interceptable","rating":"TUR"}]},"upgrades":[],"combi":{},"twinned":false,"otherDamage":{}}}
{"_id":"b2c3d4e5f6a70124","name":"Torpedo Warhead — Plasma","type":"weapon","img":"modules/wng-core/assets/icons/weapons/ranged-weapon.webp","system":{"quantity":1,"rarity":"rare","description":"+1 ED przeciw celom z aktywnymi SHD.","value":0,"keywords":"VOIDSHIP, TORPEDO, PLASMA, WARHEAD","equipped":false,"attack":{"base":0,"bonus":0,"rank":"0"},"damage":{"base":12,"bonus":0,"rank":0,"ed":{"base":5,"bonus":0,"rank":0},"ap":{"base":-2,"bonus":0,"rank":0},"enabled":false,"otherDamage":{"mortal":"0","wounds":"0","shock":"0"}},"ed":{"base":5,"bonus":0,"rank":0},"ap":{"base":-2,"bonus":0,"rank":0},"category":"grenade-missile","range":{"short":30,"medium":60,"long":120,"melee":1,"thrown":null},"ammo":{"id":""},"salvo":1,"traits":{"list":[{"name":"ordnance"},{"name":"interceptable","rating":"TUR"},{"name":"anti-shield","+1ED"}]},"upgrades":[],"combi":{},"twinned":false,"otherDamage":{}}}
{"_id":"c3d4e5f6a7b80125","name":"Torpedo Warhead — Melta","type":"weapon","img":"modules/wng-core/assets/icons/weapons/ranged-weapon.webp","system":{"quantity":1,"rarity":"rare","description":"W Contact/Close: +2 ED; bardzo wysoki AP.","value":0,"keywords":"VOIDSHIP, TORPEDO, MELTA, WARHEAD","equipped":false,"attack":{"base":0,"bonus":0,"rank":"0"},"damage":{"base":18,"bonus":0,"rank":0,"ed":{"base":2,"bonus":0,"rank":0},"ap":{"base":-4,"bonus":0,"rank":0},"enabled":false,"otherDamage":{"mortal":"0","wounds":"0","shock":"0"}},"ed":{"base":2,"bonus":0,"rank":0},"ap":{"base":-4,"bonus":0,"rank":0},"category":"grenade-missile","range":{"short":30,"medium":60,"long":120,"melee":1,"thrown":null},"ammo":{"id":""},"salvo":1,"traits":{"list":[{"name":"ordnance"},{"name":"interceptable","rating":"TUR"},{"name":"melta","+2ED @ Contact/Close"}]},"upgrades":[],"combi":{},"twinned":false,"otherDamage":{}}}
{"_id":"d4e5f6a7b8c90126","name":"Torpedo Warhead — Virus","type":"weapon","img":"modules/wng-core/assets/icons/weapons/ranged-weapon.webp","system":{"quantity":1,"rarity":"very rare","description":"Niskie obrażenia kadłuba; dewastuje załogę/systemy (CR -1 on Hit bez SHD; na 6 na Wrath: kolejne -1).","value":0,"keywords":"VOIDSHIP, TORPEDO, VIRUS, WARHEAD","equipped":false,"attack":{"base":0,"bonus":0,"rank":"0"},"damage":{"base":4,"bonus":0,"rank":0,"ed":{"base":0,"bonus":0,"rank":0},"ap":{"base":0,"bonus":0,"rank":0},"enabled":false,"otherDamage":{"mortal":"0","wounds":"0","shock":"0"}},"ed":{"base":0,"bonus":0,"rank":0},"ap":{"base":0,"bonus":0,"rank":0},"category":"grenade-missile","range":{"short":30,"medium":60,"long":120,"melee":1,"thrown":null},"ammo":{"id":""},"salvo":1,"traits":{"list":[{"name":"ordnance"},{"name":"interceptable","rating":"TUR"},{"name":"crew-killer"}]},"upgrades":[],"combi":{},"twinned":false,"otherDamage":{}}}
{"_id":"e5f6a7b8c9d00127","name":"Torpedo Warhead — Vortex","type":"weapon","img":"modules/wng-core/assets/icons/weapons/ranged-weapon.webp","system":{"quantity":1,"rarity":"extremely rare","description":"On Crit: dodatkowy d66 Crit i Blast 1 VU.","value":0,"keywords":"VOIDSHIP, TORPEDO, VORTEX, WARHEAD","equipped":false,"attack":{"base":0,"bonus":0,"rank":"0"},"damage":{"base":20,"bonus":0,"rank":0,"ed":{"base":6,"bonus":0,"rank":0},"ap":{"base":-5,"bonus":0,"rank":0},"enabled":false,"otherDamage":{"mortal":"0","wounds":"0","shock":"0"}},"ed":{"base":6,"bonus":0,"rank":0},"ap":{"base":-5,"bonus":0,"rank":0},"category":"grenade-missile","range":{"short":30,"medium":60,"long":120,"melee":1,"thrown":null},"ammo":{"id":""},"salvo":1,"traits":{"list":[{"name":"ordnance"},{"name":"interceptable","rating":"TUR"},{"name":"blast","rating":"1VU"}]},"upgrades":[],"combi":{},"twinned":false,"otherDamage":{}}}
{"_id":"f6a7b8c9d0e10128","name":"Torpedo Warhead — Guided","type":"weapon","img":"modules/wng-core/assets/icons/weapons/ranged-weapon.webp","system":{"quantity":1,"rarity":"rare","description":"+1k do ataku / przerzut 1 kości; TUR przeciwnika -1 do Intercept.","value":0,"keywords":"VOIDSHIP, TORPEDO, GUIDED, WARHEAD","equipped":false,"attack":{"base":0,"bonus":0,"rank":"0"},"damage":{"base":14,"bonus":0,"rank":0,"ed":{"base":3,"bonus":0,"rank":0},"ap":{"base":-2,"bonus":0,"rank":0},"enabled":false,"otherDamage":{"mortal":"0","wounds":"0","shock":"0"}},"ed":{"base":3,"bonus":0,"rank":0},"ap":{"base":-2,"bonus":0,"rank":0},"category":"grenade-missile","range":{"short":30,"medium":60,"long":120,"melee":1,"thrown":null},"ammo":{"id":""},"salvo":1,"traits":{"list":[{"name":"ordnance"},{"name":"guided"},{"name":"interceptable","rating":"TUR-1"}]},"upgrades":[],"combi":{},"twinned":false,"otherDamage":{}}}
{"_id":"a7b8c9d0e1f20129","name":"Wing Loadout — Fury Interceptors","type":"weapon","img":"modules/wng-core/assets/icons/weapons/ranged-weapon.webp","system":{"quantity":1,"rarity":"uncommon","description":"CAP/Intercept przeciw craft/torpedom.","value":0,"keywords":"VOIDSHIP, WING, FURY, INTERCEPT","equipped":false,"attack":{"base":0,"bonus":0,"rank":"0"},"damage":{"base":8,"bonus":0,"rank":0,"ed":{"base":2,"bonus":0,"rank":0},"ap":{"base":-1,"bonus":0,"rank":0},"enabled":false,"otherDamage":{"mortal":"0","wounds":"0","shock":"0"}},"ed":{"base":2,"bonus":0,"rank":0},"ap":{"base":-1,"bonus":0,"rank":0},"category":"grenade-missile","range":{"short":30,"medium":60,"long":120,"melee":1,"thrown":null},"ammo":{"id":""},"salvo":1,"traits":{"list":[{"name":"carrier-wing"},{"name":"cap"},{"name":"intercept","+2 vs craft/torp"}]},"upgrades":[],"combi":{},"twinned":false,"otherDamage":{}}}
{"_id":"b8c9d0e1f2a3012a","name":"Wing Loadout — Starhawk Bombers","type":"weapon","img":"modules/wng-core/assets/icons/weapons/ranged-weapon.webp","system":{"quantity":1,"rarity":"uncommon","description":"Bombing run przeciw okrętom; +1 ED jeśli cel ma SHD>0.","value":0,"keywords":"VOIDSHIP, WING, STARHAWK, BOMBING","equipped":false,"attack":{"base":0,"bonus":0,"rank":"0"},"damage":{"base":12,"bonus":0,"rank":0,"ed":{"base":4,"bonus":0,"rank":0},"ap":{"base":-2,"bonus":0,"rank":0},"enabled":false,"otherDamage":{"mortal":"0","wounds":"0","shock":"0"}},"ed":{"base":4,"bonus":0,"rank":0},"ap":{"base":-2,"bonus":0,"rank":0},"category":"grenade-missile","range":{"short":30,"medium":60,"long":120,"melee":1,"thrown":null},"ammo":{"id":""},"salvo":1,"traits":{"list":[{"name":"carrier-wing"},{"name":"bombing"},{"name":"interceptable","rating":"TUR"}]},"upgrades":[],"combi":{},"twinned":false,"otherDamage":{}}}
{"_id":"c9d0e1f2a3b4012b","name":"Wing Loadout — Assault Boats","type":"weapon","img":"modules/wng-core/assets/icons/weapons/ranged-weapon.webp","system":{"quantity":1,"rarity":"uncommon","description":"Zamiast DMG: Boarding (Close/Contact). Jeśli dotrą bez strat: +2 do 1. fazy.","value":0,"keywords":"VOIDSHIP, WING, ASSAULT, BOARDING","equipped":false,"attack":{"base":0,"bonus":0,"rank":"0"},"damage":{"base":0,"bonus":0,"rank":0,"ed":{"base":0,"bonus":0,"rank":0},"ap":{"base":0,"bonus":0,"rank":0},"enabled":false,"otherDamage":{"mortal":"0","wounds":"0","shock":"0"}},"ed":{"base":0,"bonus":0,"rank":0},"ap":{"base":0,"bonus":0,"rank":0},"category":"grenade-missile","range":{"short":30,"medium":60,"long":120,"melee":1,"thrown":null},"ammo":{"id":""},"salvo":1,"traits":{"list":[{"name":"carrier-wing"},{"name":"assault-boats"},{"name":"boarding"}]},"upgrades":[],"combi":{},"twinned":false,"otherDamage":{}}}
{"_id":"ITEMREACESCJOV01","name":"Plasma Reactor (Escort) — Jovian-Pattern","type":"gear","img":"icons/svg/energy.svg","flags":{"wg-voidships-builder":{"voidOnly":true,"component":{"kind":"reactor","subtype":"escort","tags":["reactor","plasma"]},"voidship":{"slot":"Internal","use":{"space":6,"power":0},"mods":{"power":28}}}},"system":{"description":"Lżejszy reaktor plazmowy dla eskort. Generuje ~28 Power, zajmuje 6 Space."},"effects":[]}
{"_id":"ITEMTORPPROW0001","name":"Torpedo Tubes — Jovian-Pattern","type":"gear","img":"icons/svg/anchor.svg","flags":{"wg-voidships-builder":{"voidOnly":true,"component":{"kind":"weapon","subtype":"torpedo","tags":["weapon","torpedo"],"allowedSlots":["prow"]},"voidship":{"allowedSlots":["prow"],"use":{"space":10,"power":5},"mods":{}}}},"system":{"description":"Wyrzutnie torpedowe montowane w dziobie. Zużycie 10 Space, 5 Power."},"effects":[]}
{"_id":"ITEMLANCEDSL0001","name":"Lance Battery — Starflare-Pattern","type":"gear","img":"icons/svg/sun.svg","flags":{"wg-voidships-builder":{"voidOnly":true,"component":{"kind":"weapon","subtype":"lance","tags":["weapon","lance"],"allowedSlots":["dorsal","port","starboard"]},"voidship":{"allowedSlots":["dorsal","port","starboard"],"use":{"space":10,"power":6},"mods":{}}}},"system":{"description":"Bateria lanc. Montaż: Dorsal/Port/Starboard. Zużycie 10 Space, 6 Power."},"effects":[]}
{"_id":"ITEMWPMACBRD0001","name":"Macrobattery (Broadside) — Mars-Pattern","type":"gear","img":"icons/svg/dice-target.svg","flags":{"wg-voidships-builder":{"voidOnly":true,"component":{"kind":"weapon","subtype":"macro-broadside","tags":["weapon","macro"],"allowedSlots":["port","starboard"]},"voidship":{"allowedSlots":["port","starboard"],"use":{"space":9,"power":4},"mods":{}}}},"system":{"description":"Makrobateria burtowa. Montaż wyłącznie Port/Starboard. Zużycie 9 Space, 4 Power."},"effects":[]}
{"_id":"ITEMMACROUNI0001","name":"Macrobattery (Universal) — Mars-Pattern","type":"gear","img":"icons/svg/dice-target.svg","flags":{"wg-voidships-builder":{"voidOnly":true,"component":{"kind":"weapon","subtype":"macro","tags":["weapon","macro"],"allowedSlots":["prow","dorsal","port","starboard"]},"voidship":{"allowedSlots":["prow","dorsal","port","starboard"],"use":{"space":8,"power":4},"mods":{}}}},"system":{"description":"Uniwersalna makrobateria (prow/dorsal/port/starboard). Zużycie 8 Space, 4 Power."},"effects":[]}
@@ -0,0 +1,10 @@
{"_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":[]}
@@ -1,6 +1,5 @@
{"_id":"2a8c7c6b5d4e3f21","name":"Xenos Habitats","type":"gear","img":null,"system":{"description":"Specialist compartments and atmospherics for transporting or housing alien beings and crews. Includes containment precautions and adaptable life-support matrices.","keywords":"VOIDSHIP, XENOS, QUARTERS","value":0,"rarity":"rare","source":"Into the Storm, p. 161"}}
{"_id":"xeno-ghost-field","name":"Ghost Field","type":"gear","img":null,"system":{"description":"Eldarski „widmowy” ekran tworzący fałszywe echo jednostki i myliący wrogie augury. W akcji wymusza wybór: tarcze osłonowe albo ghost field.","keywords":"VOIDSHIP, XENOS, SHIELDS","rarity":"near unique","source":"RT Core (205210)"}}
{"_id":"xeno-shard-cannon-battery","name":"Shard Cannon Battery","type":"weapon","img":null,"system":{"category":"ranged","damage":{"base":12,"bonus":0,"rank":0,"ed":{"base":2,"bonus":0,"rank":0},"ap":{"base":-1,"bonus":0,"rank":0},"enabled":false,"otherDamage":{"mortal":"0","shock":"0","wounds":"0"}},"range":{"short":30,"medium":60,"long":120},"salvo":2,"traits":{"list":[{"name":"xenos-tech","rating":"-"}]},"description":"Obca, autonomiczna bateria „odłamkowa” nie wymaga standardowego zasilania ani amunicji; jej charakterystyka bojowa odbiega od imperialnych norm.","keywords":"VOIDSHIP, XENOS, MACROBATT","rarity":"near unique","source":"RT Core (205210)"}}
{"_id":"xeno-runecaster","name":"Runecaster","type":"gear","img":null,"system":{"description":"Węzeł runiczny (eldarski) wspierający sensoraż i nawigację; generuje „rune-echoes” poprawiające wykrywanie i maskowanie.","keywords":"VOIDSHIP, XENOS, AUGUR","rarity":"near unique","source":"RT Core (205210)"}}
{"_id":"xeno-micro-laser-defence-grid","name":"Micro Laser Defence Grid","type":"gear","img":null,"system":{"description":"Drobno-segmentowa siatka mikro-laserów przechwytująca bliskie cele (bomby, torpedy, drobne łodzie); rośnie szansa zestrzelenia zagrożeń zbliżeniowych.","keywords":"VOIDSHIP, XENOS, POINT-DEFENCE","rarity":"near unique","source":"RT Core (205210)"}}
{"_id":"xeno-gravity-sails","name":"Gravity Sails","type":"gear","img":null,"system":{"description":"Grawito-żagle (często spotykane u Eldarów) pozwalające na niemal bezgłośny napęd przy minimalnej sygnaturze; idealne do skrytych przelotów.","keywords":"VOIDSHIP, XENOS, DRIVE","rarity":"near unique","source":"RT Core (205210)"}}
{"_id":"XENO000000000001","name":"Eldar Solar Sails","type":"gear","img":"icons/svg/wing.svg","flags":{"wg-voidships-builder":{"component":{"kind":"xenos","subtype":"eldar-sails","tags":["xenos","eldar","propulsion"]},"voidOnly":true}},"system":{"description":"Żagle solarne Aeldari — ciche, wysokosprawne napędy żaglowe. W RT zmniejszają zużycie mocy/ślad; u nas: +Speed i +Power (pula).","voidship":{"slot":"Internal","use":{"space":2,"power":0},"mods":{"armour":0,"integrity":0,"manoeuvre":1,"detection":0,"speed":1,"space":0,"power":2}}},"effects":[]}
{"_id":"XENO000000000002","name":"Eldar Holofield","type":"gear","img":"icons/svg/mystery-man.svg","flags":{"wg-voidships-builder":{"component":{"kind":"xenos","subtype":"eldar-holofield","tags":["xenos","eldar","defence"]},"voidOnly":true}},"system":{"description":"Holo-osłony rozszczepiające obraz i echo sensorażu — trudniej trafić i namierzyć.","voidship":{"slot":"Internal","use":{"space":2,"power":4},"mods":{"armour":0,"integrity":3,"manoeuvre":2,"detection":0,"speed":0,"space":0,"power":0}}},"effects":[]}
{"_id":"XENO000000000003","name":"Ork Kustom Force Field","type":"gear","img":"icons/svg/shield.svg","flags":{"wg-voidships-builder":{"component":{"kind":"xenos","subtype":"ork-kff","tags":["xenos","ork","defence"]},"voidOnly":true}},"system":{"description":"Kustom pole siłowe Mekboyów — bardzo mocne, bardzo kapryśne.","voidship":{"slot":"Internal","use":{"space":3,"power":6},"mods":{"armour":0,"integrity":6,"manoeuvre":-1,"detection":-1,"speed":0,"space":0,"power":0}}},"effects":[]}
{"_id":"XENO000000000004","name":"Ork Reinforced Ram Prow","type":"gear","img":"icons/svg/anchor.svg","flags":{"wg-voidships-builder":{"component":{"kind":"xenos","subtype":"ork-ram","tags":["xenos","ork","prow"]},"voidOnly":true}},"system":{"description":"Mega-rampa do taranowania — i do wygrywania dyskusji na krótkim dystansie.","voidship":{"slot":"Internal","use":{"space":1,"power":0},"mods":{"armour":3,"integrity":2,"manoeuvre":-1,"detection":0,"speed":0,"space":0,"power":0}}},"effects":[]}
{"_id":"XENO000000000005","name":"Eldar Targeting Matrix (Dorsal)","type":"gear","img":"icons/svg/crosshair.svg","flags":{"wg-voidships-builder":{"component":{"kind":"xenos","subtype":"eldar-matrix","tags":["xenos","eldar","weapon-mod","dorsal"]},"voidOnly":true}},"system":{"description":"Aeldari macierz celownicza wzmacniająca akwizycję i śledzenie celów. Działa najlepiej z bateriami dorsalnymi.","voidship":{"slot":"Dorsal","use":{"space":1,"power":2},"mods":{"armour":0,"integrity":0,"manoeuvre":0,"detection":2,"speed":0,"space":0,"power":0}}},"effects":[]}
@@ -0,0 +1,401 @@
// W&G Voidships Builder — Voidship Actor Sheet (vehicle+flag emulation)
// v1.1.0 — Foundry V11V13 safe
/* eslint-env es2021 */
const VB_MOD = "wg-voidships-builder";
const VB_DEBUG = true; // Debug on
function dbg(...args) { if (VB_DEBUG) console.debug("[VB]", ...args); }
// --- SLOT HELPERS: normalizacja i przydział "pierwszy wolny pasujący" ---
const VB_WEAPON_SLOTS = ["prow", "dorsal", "port", "starboard", "keel"];
function normalizeSlotName(s) {
const v = String(s || "").trim().toLowerCase();
return VB_WEAPON_SLOTS.includes(v) ? v : null;
}
function normalizeAllowedSlots(allowed) {
if (!allowed) return [];
if (Array.isArray(allowed)) return allowed.map(normalizeSlotName).filter(Boolean);
return String(allowed).split(/[|,; ]+/g).map(normalizeSlotName).filter(Boolean);
}
function getVSH(it) {
// canonical: flags; fallback: legacy system.voidship (skopiujemy do flags przy dropie)
return it.getFlag(VB_MOD, "voidship") || it.system?.voidship || null;
}
function countUsedWeaponSlots(actor) {
const used = { prow: 0, dorsal: 0, port: 0, starboard: 0, keel: 0 };
for (const it of actor.items ?? []) {
const v = getVSH(it);
const eq = (it.system?.equipped ?? true);
const slot = normalizeSlotName(v?.slot);
if (eq && slot && (slot in used)) used[slot] += 1;
}
return used;
}
function pickFirstFreeSlot(allowed, hullSlots, used) {
const order = ["prow", "dorsal", "port", "starboard", "keel"];
for (const s of order) {
if (!allowed.includes(s)) continue;
const cap = Number(hullSlots?.[s] ?? 0);
const u = Number(used?.[s] ?? 0);
if (u < cap) return s;
}
return null;
}
// ---------------- 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() {
const opts = super.defaultOptions;
return foundry.utils.mergeObject(opts, {
classes: ["wg-voidships", "sheet", "actor", "voidship", "themed", "theme-light"],
template: `modules/${VB_MOD}/templates/voidship-sheet.hbs`,
width: 720,
height: 680,
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; }
// ---- 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 };
for (const it of items) {
const vs = it.system?.voidship;
if (!vs) continue;
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;
}
// 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);
// 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;
}
}
return { mods, use: { space: useSpace, power: usePower }, slotsUsed };
}
// ---- 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)
// czytaj flagi wprost z actor.flags[namespace] (albo pojedyncze klucze)
const flagsNs = actor.flags?.[VB_MOD] || {};
const defaultHull = { class: actor.name, size: "Cruiser", slots: { prow: 0, dorsal: 0, port: 0, starboard: 0, keel: 0 } };
const defaultBase = { armour: 0, integrity: 0, manoeuvre: 0, detection: 0, speed: 0, space: 0, power: 0 };
const defaultCrew = { command: 0, pilot: 0, sensors: 0, engineering: 0, gunnery: 0, security: 0, flightDeck: 0, passengers: 0 };
const crew = actor.getFlag(VB_MOD, "crew") ?? flagsNs.crew ?? defaultCrew;
const rtRaw = actor.getFlag(VB_MOD, "rtRaw") ?? flagsNs.rtRaw ?? {};
const rt = rtRaw.rt || {};
const rtCard = {
speed: rt.speed ?? rtRaw.combat?.speed ?? 0,
manoeuvrability: rt.manoeuvrability ?? rtRaw.mnvr ?? 0,
detection: rt.detection ?? 0,
hullIntegrity: rt.hullIntegrity ?? rtRaw.combat?.wounds?.max ?? 0,
armour: rt.armour ?? 0,
space: rt.space ?? 0,
power: rt.power ?? 0,
weapons: {
prow: rt.weapons?.prow ?? 0,
dorsal: rt.weapons?.dorsal ?? 0,
port: rt.weapons?.port ?? 0,
starboard: rt.weapons?.starboard ?? 0,
keel: rt.weapons?.keel ?? 0
},
turret: rt.turret ?? 0,
notes: rtRaw.notes ?? "",
source: rt.source ?? rtRaw.source ?? ""
};
// --- komponenty z itemów (flags canonical) ---
const items = actor.items.contents || [];
const components = [];
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 useTotal = { space: 0, power: 0 };
for (const it of items) {
const v = getVSH(it);
if (!v) continue;
const c = foundry.utils.duplicate(v);
c.name = it.name;
c.itemId = it.id;
c.equipped = (it.system?.equipped ?? true);
c.slot = normalizeSlotName(c.slot) || "Internal";
c.allowedSlots = normalizeAllowedSlots(c.allowedSlots || foundry.utils.getProperty(it.flags, `${VB_MOD}.component.allowedSlots`));
// defaults
c.use = { space: 0, power: 0, ...(c.use || {}) };
c.mods = { armour: 0, integrity: 0, manoeuvre: 0, detection: 0, speed: 0, space: 0, power: 0, ...(c.mods || {}) };
components.push(c);
if (c.equipped) {
// sumuj mody
for (const k of Object.keys(mods)) {
const val = Number(c.mods[k] || 0);
if (Number.isFinite(val)) mods[k] += val;
}
// sumuj zużycie/produkcję
const us = Number(c.use.space || 0);
const up = Number(c.use.power || 0);
if (Number.isFinite(us)) useTotal.space += us;
if (Number.isFinite(up)) useTotal.power += up;
// slot usage (tylko jeśli to broń z legalnym slotem)
if (VB_WEAPON_SLOTS.includes(c.slot)) {
slotsUsed[c.slot] = (slotsUsed[c.slot] || 0) + 1;
}
}
}
const base = actor.getFlag(VB_MOD, "base") || { armour:0, integrity:0, manoeuvre:0, detection:0, speed:0, space:0, power:0 };
// total = base + mods
const totals = {
armour: (Number(base.armour)||0) + mods.armour,
integrity: (Number(base.integrity)||0) + mods.integrity,
manoeuvre: (Number(base.manoeuvre)||0) + mods.manoeuvre,
detection: (Number(base.detection)||0) + mods.detection,
speed: (Number(base.speed)||0) + mods.speed,
space: (Number(base.space)||0) + mods.space,
power: (Number(base.power)||0) + mods.power
};
totals.spaceFree = totals.space - useTotal.space;
totals.powerFree = totals.power - useTotal.power;
// warnings
const hull = actor.getFlag(VB_MOD, "hull") || { slots: {} };
const warnings = {};
for (const s of VB_WEAPON_SLOTS) {
if ((slotsUsed[s]||0) > (hull.slots?.[s]||0)) { warnings.slots = "One or more weapon slot groups exceed hull limits."; break; }
}
if (totals.spaceFree < 0) warnings.capacity = "Not enough Space for installed components.";
if (totals.powerFree < 0) warnings.capacity = "Not enough Power for installed components.";
// zaszyj
data.hull = hull;
data.base = base;
data.components = components;
data.slotsUsed = slotsUsed;
data.totals = totals;
data.mods = mods;
data.useTotal = useTotal;
// extra debug
data.debug = {
usedWeaponSlots: slotsUsed,
itemsCount: items.length,
componentsCount: components.length,
itemsNoVSH: items.filter(i => !getVSH(i)).map(i => ({id:i.id, name:i.name}))
};
return data;
}
// ---- listeners & UI ----
activateListeners(html) {
super.activateListeners(html);
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);
});
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);
});
}
async _onDropItem(event, data) {
event.preventDefault();
// 1) Rozwiąż źródło (uuid/pack/data)
let doc = null;
try {
if (data?.uuid) doc = await fromUuid(data.uuid);
else if (data?.pack && data?._id) {
const pack = game.packs.get(data.pack);
if (pack) doc = await pack.getDocument(data._id);
} else if (data) {
doc = await Item.implementation.fromDropData(data);
}
} catch (e) { /* ignore */ }
const raw = doc?.toObject?.(false) ?? data?.data ?? data;
if (!raw?.type) { ui.notifications.error("Drop failed: cannot resolve item data (no UUID/DATA)."); return false; }
// 2) Czy to komponent?
const flagsIn = foundry.utils.getProperty(raw, `flags.${VB_MOD}`) || {};
const legacySys = foundry.utils.getProperty(raw, "system.voidship") || null;
const hasCompTag = !!flagsIn.component;
const hasLegacy = !!legacySys;
if (!hasCompTag && !hasLegacy) {
ui.notifications.warn("This item is not a voidship component.");
return false;
}
// 3) Skonstruuj flags.${VB_MOD}.voidship (kanoniczne)
const vshIn = flagsIn.voidship || legacySys || {};
const flagsOut = foundry.utils.duplicate(flagsIn);
flagsOut.voidship = foundry.utils.mergeObject({
slot: vshIn.slot || null,
use: { space: 0, power: 0, ...(vshIn.use || {}) },
mods: { armour: 0, integrity: 0, manoeuvre: 0, detection: 0, speed: 0, space: 0, power: 0, ...(vshIn.mods || {}) },
allowedSlots: normalizeAllowedSlots(vshIn.allowedSlots || flagsIn?.component?.allowedSlots || [])
}, {}, { inplace: false });
// 4) Auto-przydział slotu dla broni (jeśli allowedSlots != pusty)
const allowed = flagsOut.voidship.allowedSlots || [];
if (allowed.length > 0) {
const hull = this.actor.getFlag(VB_MOD, "hull") || {};
const hullSlots = hull.slots || {};
const used = countUsedWeaponSlots(this.actor);
const chosen = pickFirstFreeSlot(allowed, hullSlots, used);
if (!chosen) {
ui.notifications.warn("No free matching weapon slot for this component.");
return false;
}
flagsOut.voidship.slot = chosen;
} else {
// nie-broń
flagsOut.voidship.slot = flagsOut.voidship.slot || "Internal";
}
// 5) wpisz flags i domyślne "equipped"
raw.flags = raw.flags || {};
raw.flags[VB_MOD] = flagsOut;
if (raw.system?.equipped === undefined) {
raw.system = raw.system || {};
raw.system.equipped = true;
}
// 6) Utwórz na aktorze
await this.actor.createEmbeddedDocuments("Item", [raw]);
this.render(true);
return true;
}
}
// Register the sheet
Hooks.once("init", () => {
Actors.registerSheet(VB_MOD, VoidshipSheet, {
types: ["vehicle"],
makeDefault: false,
label: "Voidship (W&G)"
});
game.wgVoidships = game.wgVoidships || {};
game.wgVoidships.createVoidship = async function (name = "New Voidship") {
const actor = await Actor.create({ name, type: "vehicle", folder: null });
await actor.setFlag(VB_MOD, "isVoidship", true);
ui.notifications.info(`Voidship created: ${name}`);
return actor;
};
console.log(`${VB_MOD}: VoidshipSheet registered`);
});
+15 -1
View File
@@ -1 +1,15 @@
Hooks.once('ready',()=>console.warn('wg-voidships-builder: helper script not provided, using stub'));
Hooks.once('init', async () => {
try {
if (typeof Handlebars?.registerHelper === "function") {
Handlebars.registerHelper("json", (ctx) => JSON.stringify(ctx ?? {}, null, 2));
}
await loadTemplates(["modules/wg-voidships-builder/templates/voidship-sheet.hbs"]);
console.debug("[VB] templates preloaded");
} catch (e) {
console.warn("wg-voidships-builder: init failed", e);
}
});
Hooks.once('ready', () => {
console.warn('wg-voidships-builder: builder UI not yet active (stub)');
});
@@ -0,0 +1,231 @@
<form class="voidship-sheet">
<header class="sheet-header flexrow" style="align-items:center; gap:.5rem;">
<img class="profile" src="{{actor.img}}" width="48" height="48">
<h1 class="charname"><input name="name" type="text" value="{{actor.name}}"></h1>
<div style="margin-left:auto; display:flex; gap:.5rem;">
<button type="button" data-action="configure-base"><i class="fas fa-cog"></i> Base</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}}
<button type="button" data-action="mark-voidship"><i class="fas fa-check-circle"></i> Mark Voidship</button>
{{/if}}
</div>
</header>
<nav class="tabs" data-group="primary">
<a class="item" data-tab="wg">W&amp;G</a>
<a class="item" data-tab="rt">Rogue Trader</a>
<a class="item" data-tab="crew">Crew</a>
<a class="item" data-tab="components">Components</a>
</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 (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>
</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 — 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>
<hr>
<div class="grid grid-2col" style="gap:.5rem;">
<div class="card">
<h3>Base (flags)</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>
</ol>
</div>
<div class="card">
<h3>Mods (items)</h3>
<ol class="properties">
<li>Armour: <b>{{mods.armour}}</b></li>
<li>Integrity: <b>{{mods.integrity}}</b></li>
<li>Manoeuvre: <b>{{mods.manoeuvre}}</b></li>
<li>Detection: <b>{{mods.detection}}</b></li>
<li>Speed: <b>{{mods.speed}}</b></li>
<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>
<!-- ROGUE TRADER TAB -->
<div class="tab" data-group="primary" data-tab="rt">
<div class="grid grid-2col" style="gap:.75rem;">
<div class="card">
<h3>RT — Stat Block</h3>
<ol class="properties">
<li><span>Speed</span> <b>{{rtCard.speed}}</b></li>
<li><span>Manoeuvrability</span> <b>{{rtCard.manoeuvrability}}</b></li>
<li><span>Detection</span> <b>{{rtCard.detection}}</b></li>
<li><span>Hull Integrity</span> <b>{{rtCard.hullIntegrity}}</b></li>
<li><span>Armour</span> <b>{{rtCard.armour}}</b></li>
<li><span>Space</span> <b>{{rtCard.space}}</b></li>
<li><span>Power</span> <b>{{rtCard.power}}</b></li>
<li><span>Turret</span> <b>{{rtCard.turret}}</b></li>
</ol>
</div>
<div class="card">
<h3>RT — Weapon Capacity</h3>
<ol class="properties">
<li>Prow: <b>{{rtCard.weapons.prow}}</b></li>
<li>Dorsal: <b>{{rtCard.weapons.dorsal}}</b></li>
<li>Port: <b>{{rtCard.weapons.port}}</b></li>
<li>Starboard: <b>{{rtCard.weapons.starboard}}</b></li>
<li>Keel: <b>{{rtCard.weapons.keel}}</b></li>
</ol>
{{#if rtCard.notes}}<hr><p style="opacity:.85">{{rtCard.notes}}</p>{{/if}}
{{#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 -->
<div class="tab" data-group="primary" data-tab="crew">
<div class="grid grid-2col" style="gap:.5rem;">
<div class="card">
<h3>Main Roles</h3>
<ol class="properties">
<li>Command: <b>{{crew.command}}</b></li>
<li>Pilot/Helm: <b>{{crew.pilot}}</b></li>
<li>Sensors/Auspex: <b>{{crew.sensors}}</b></li>
<li>Engineering: <b>{{crew.engineering}}</b></li>
</ol>
</div>
<div class="card">
<h3>Combat &amp; Support</h3>
<ol class="properties">
<li>Gunnery: <b>{{crew.gunnery}}</b></li>
<li>Security/Armsmen: <b>{{crew.security}}</b></li>
<li>Flight Deck: <b>{{crew.flightDeck}}</b></li>
<li>Passengers: <b>{{crew.passengers}}</b></li>
</ol>
</div>
</div>
<details style="margin-top:.5rem;"><summary>Raw Crew</summary>
<pre>{{json crew}}</pre>
</details>
</div>
<!-- COMPONENTS TAB -->
<div class="tab" data-group="primary" data-tab="components">
<div class="grid grid-2col" style="gap:.75rem;">
<div class="card">
<h3>Capacity</h3>
<ol class="properties">
<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>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>
<li>Port: <b>{{slotsUsed.port}}</b> / <b>{{hull.slots.port}}</b></li>
<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.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 class="card">
<h3>Mounted Components</h3>
{{#if components.length}}
<table class="table" style="width:100%;">
<thead>
<tr>
<th style="text-align:left;">Name</th>
<th>Slot</th>
<th>Use</th>
<th>Mods</th>
<th style="width:90px;">Actions</th>
</tr>
</thead>
<tbody>
{{#each components as |c|}}
<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;">
<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. Drag items from the Components compendium here.</p>
{{/if}}
</div>
</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.
Binary file not shown.
Binary file not shown.
-4
View File
@@ -2,7 +2,3 @@
This module contains a single Journal Entry with subpages created from files in `wg-voidships.1.1.zip`.
Import the Journal into your world from the **W&G Voidships Docs** compendium.
- Compatible with Foundry VTT v11+
- Ownership: default Observer (2)
- Source archive: wg-voidships.1.1.zip
+1 -1
View File
@@ -2,7 +2,7 @@
"id": "wg-voidships-journal",
"title": "W&G Voidships 1.1 — Journal Pack",
"description": "A single Journal Entry with subpages for each document from wg-voidships.1.1.zip.",
"version": "1.0.1",
"version": "1.0.2",
"compatibility": {
"minimum": "11",
"verified": "11"
Binary file not shown.
Binary file not shown.
+1
View File
@@ -0,0 +1 @@
0.2