@alpaca-software/40kdc-data 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (155) hide show
  1. package/README.md +78 -0
  2. package/dist/bundle-schemas.d.ts +3 -0
  3. package/dist/bundle-schemas.js +137 -0
  4. package/dist/cli.d.ts +1 -0
  5. package/dist/cli.js +31 -0
  6. package/dist/codegen-data.d.ts +1 -0
  7. package/dist/codegen-data.js +128 -0
  8. package/dist/commands/translate.d.ts +7 -0
  9. package/dist/commands/translate.js +238 -0
  10. package/dist/commands/validate-all.d.ts +3 -0
  11. package/dist/commands/validate-all.js +20 -0
  12. package/dist/commands/validate-core.d.ts +3 -0
  13. package/dist/commands/validate-core.js +12 -0
  14. package/dist/commands/validate-enrichment.d.ts +3 -0
  15. package/dist/commands/validate-enrichment.js +12 -0
  16. package/dist/convert-faction.d.ts +45 -0
  17. package/dist/convert-faction.js +479 -0
  18. package/dist/converters/configs/adepta-sororitas.d.ts +3 -0
  19. package/dist/converters/configs/adepta-sororitas.js +70 -0
  20. package/dist/converters/configs/adeptus-astartes.d.ts +3 -0
  21. package/dist/converters/configs/adeptus-astartes.js +74 -0
  22. package/dist/converters/configs/adeptus-custodes.d.ts +3 -0
  23. package/dist/converters/configs/adeptus-custodes.js +14 -0
  24. package/dist/converters/configs/adeptus-mechanicus.d.ts +3 -0
  25. package/dist/converters/configs/adeptus-mechanicus.js +51 -0
  26. package/dist/converters/configs/aeldari.d.ts +3 -0
  27. package/dist/converters/configs/aeldari.js +79 -0
  28. package/dist/converters/configs/agents-of-the-imperium.d.ts +3 -0
  29. package/dist/converters/configs/agents-of-the-imperium.js +57 -0
  30. package/dist/converters/configs/astra-militarum.d.ts +3 -0
  31. package/dist/converters/configs/astra-militarum.js +80 -0
  32. package/dist/converters/configs/black-templars.d.ts +3 -0
  33. package/dist/converters/configs/black-templars.js +16 -0
  34. package/dist/converters/configs/blood-angels.d.ts +3 -0
  35. package/dist/converters/configs/blood-angels.js +16 -0
  36. package/dist/converters/configs/chaos-daemons.d.ts +3 -0
  37. package/dist/converters/configs/chaos-daemons.js +40 -0
  38. package/dist/converters/configs/chaos-knights.d.ts +3 -0
  39. package/dist/converters/configs/chaos-knights.js +14 -0
  40. package/dist/converters/configs/chaos-space-marines.d.ts +3 -0
  41. package/dist/converters/configs/chaos-space-marines.js +95 -0
  42. package/dist/converters/configs/crimson-fists.d.ts +3 -0
  43. package/dist/converters/configs/crimson-fists.js +16 -0
  44. package/dist/converters/configs/dark-angels.d.ts +3 -0
  45. package/dist/converters/configs/dark-angels.js +16 -0
  46. package/dist/converters/configs/death-guard.d.ts +3 -0
  47. package/dist/converters/configs/death-guard.js +30 -0
  48. package/dist/converters/configs/deathwatch.d.ts +3 -0
  49. package/dist/converters/configs/deathwatch.js +16 -0
  50. package/dist/converters/configs/drukhari.d.ts +3 -0
  51. package/dist/converters/configs/drukhari.js +51 -0
  52. package/dist/converters/configs/emperors-children.d.ts +3 -0
  53. package/dist/converters/configs/emperors-children.js +38 -0
  54. package/dist/converters/configs/genestealer-cults.d.ts +3 -0
  55. package/dist/converters/configs/genestealer-cults.js +36 -0
  56. package/dist/converters/configs/grey-knights.d.ts +3 -0
  57. package/dist/converters/configs/grey-knights.js +39 -0
  58. package/dist/converters/configs/imperial-fists.d.ts +3 -0
  59. package/dist/converters/configs/imperial-fists.js +16 -0
  60. package/dist/converters/configs/imperial-knights.d.ts +3 -0
  61. package/dist/converters/configs/imperial-knights.js +14 -0
  62. package/dist/converters/configs/iron-hands.d.ts +3 -0
  63. package/dist/converters/configs/iron-hands.js +16 -0
  64. package/dist/converters/configs/leagues-of-votann.d.ts +3 -0
  65. package/dist/converters/configs/leagues-of-votann.js +32 -0
  66. package/dist/converters/configs/necrons.d.ts +3 -0
  67. package/dist/converters/configs/necrons.js +19 -0
  68. package/dist/converters/configs/orks.d.ts +3 -0
  69. package/dist/converters/configs/orks.js +71 -0
  70. package/dist/converters/configs/raven-guard.d.ts +3 -0
  71. package/dist/converters/configs/raven-guard.js +16 -0
  72. package/dist/converters/configs/salamanders.d.ts +3 -0
  73. package/dist/converters/configs/salamanders.js +16 -0
  74. package/dist/converters/configs/space-wolves.d.ts +3 -0
  75. package/dist/converters/configs/space-wolves.js +16 -0
  76. package/dist/converters/configs/tau-empire.d.ts +3 -0
  77. package/dist/converters/configs/tau-empire.js +44 -0
  78. package/dist/converters/configs/thousand-sons.d.ts +3 -0
  79. package/dist/converters/configs/thousand-sons.js +30 -0
  80. package/dist/converters/configs/tyranids.d.ts +3 -0
  81. package/dist/converters/configs/tyranids.js +27 -0
  82. package/dist/converters/configs/ultramarines.d.ts +3 -0
  83. package/dist/converters/configs/ultramarines.js +16 -0
  84. package/dist/converters/configs/white-scars.d.ts +3 -0
  85. package/dist/converters/configs/white-scars.js +16 -0
  86. package/dist/converters/configs/world-eaters.d.ts +3 -0
  87. package/dist/converters/configs/world-eaters.js +43 -0
  88. package/dist/converters/faction-config.d.ts +53 -0
  89. package/dist/converters/faction-config.js +22 -0
  90. package/dist/converters/id-generator.d.ts +14 -0
  91. package/dist/converters/id-generator.js +65 -0
  92. package/dist/converters/keyword-filter.d.ts +26 -0
  93. package/dist/converters/keyword-filter.js +78 -0
  94. package/dist/converters/stat-parser.d.ts +22 -0
  95. package/dist/converters/stat-parser.js +84 -0
  96. package/dist/converters/view-selector.d.ts +54 -0
  97. package/dist/converters/view-selector.js +96 -0
  98. package/dist/converters/weapon-dedup.d.ts +60 -0
  99. package/dist/converters/weapon-dedup.js +120 -0
  100. package/dist/data/bundle.generated.d.ts +3 -0
  101. package/dist/data/bundle.generated.js +3 -0
  102. package/dist/data/collection.d.ts +64 -0
  103. package/dist/data/collection.js +118 -0
  104. package/dist/data/dataset.d.ts +50 -0
  105. package/dist/data/dataset.js +134 -0
  106. package/dist/data/entities.d.ts +80 -0
  107. package/dist/data/entities.js +133 -0
  108. package/dist/data/index.d.ts +59 -0
  109. package/dist/data/index.js +57 -0
  110. package/dist/data/normalize.d.ts +29 -0
  111. package/dist/data/normalize.js +37 -0
  112. package/dist/data/types.d.ts +43 -0
  113. package/dist/data/types.js +25 -0
  114. package/dist/generated.d.ts +1084 -0
  115. package/dist/generated.js +2 -0
  116. package/dist/index.d.ts +3 -0
  117. package/dist/index.js +7 -0
  118. package/dist/known-support-10e.d.ts +31 -0
  119. package/dist/known-support-10e.js +113 -0
  120. package/dist/port-10e-faction.d.ts +52 -0
  121. package/dist/port-10e-faction.js +413 -0
  122. package/dist/report.d.ts +3 -0
  123. package/dist/report.js +31 -0
  124. package/dist/schema-loader.d.ts +15 -0
  125. package/dist/schema-loader.js +79 -0
  126. package/dist/validate.d.ts +21 -0
  127. package/dist/validate.js +124 -0
  128. package/package.json +77 -0
  129. package/schemas/$defs/common.schema.json +86 -0
  130. package/schemas/$defs/game-version-ref.schema.json +11 -0
  131. package/schemas/core/deployment-pattern.schema.json +102 -0
  132. package/schemas/core/detachment.schema.json +56 -0
  133. package/schemas/core/enhancement.schema.json +46 -0
  134. package/schemas/core/faction.schema.json +29 -0
  135. package/schemas/core/force-disposition.schema.json +22 -0
  136. package/schemas/core/game-version.schema.json +20 -0
  137. package/schemas/core/leader-attachment.schema.json +18 -0
  138. package/schemas/core/mission-matchup.schema.json +25 -0
  139. package/schemas/core/mission.schema.json +42 -0
  140. package/schemas/core/roster.schema.json +203 -0
  141. package/schemas/core/secondary-card.schema.json +195 -0
  142. package/schemas/core/stratagem.schema.json +58 -0
  143. package/schemas/core/terrain-layout.schema.json +135 -0
  144. package/schemas/core/unit-composition.schema.json +38 -0
  145. package/schemas/core/unit.schema.json +125 -0
  146. package/schemas/core/wargear-option.schema.json +47 -0
  147. package/schemas/core/weapon.schema.json +56 -0
  148. package/schemas/enrichment/ability-dsl/ability.schema.json +60 -0
  149. package/schemas/enrichment/ability-dsl/condition.schema.json +48 -0
  150. package/schemas/enrichment/ability-dsl/effect.schema.json +145 -0
  151. package/schemas/enrichment/ability-dsl/scope.schema.json +12 -0
  152. package/schemas/enrichment/interaction-flag.schema.json +17 -0
  153. package/schemas/enrichment/phase-mapping.schema.json +14 -0
  154. package/schemas/enrichment/resource-pool.schema.json +36 -0
  155. package/schemas/enrichment/timing-flag.schema.json +28 -0
@@ -0,0 +1,74 @@
1
+ import { registerFaction } from "../faction-config.js";
2
+ const adeptusAstartes = {
3
+ sourceFactionId: "SM",
4
+ factionId: "adeptus-astartes",
5
+ factionName: "Adeptus Astartes",
6
+ factionAbilityName: "Oath of Moment",
7
+ factionRuleId: "oath-of-moment",
8
+ factionKeywords: ["Imperium", "Adeptus Astartes"],
9
+ parentFactionId: null,
10
+ aliases: [],
11
+ compositionOverrides: {
12
+ // Crusader Squad (Black Templars)
13
+ "crusader-squad": [
14
+ { name: "Sword Brother", profile_name: "Initiate", min: 1, max: 1, default_weapon_ids: ["bolt-pistol", "power-weapon"], is_leader_model: true },
15
+ { name: "Initiate", min: 5, max: 11, default_weapon_ids: ["bolt-pistol", "close-combat-weapon"], is_leader_model: false },
16
+ { name: "Neophyte", min: 4, max: 8, default_weapon_ids: ["bolt-pistol", "close-combat-weapon"], is_leader_model: false },
17
+ ],
18
+ // Deathwatch Kill Teams
19
+ "deathwatch-veterans": [
20
+ { name: "Watch Sergeant", min: 1, max: 1, default_weapon_ids: ["boltgun", "close-combat-weapon"], is_leader_model: true },
21
+ { name: "Deathwatch Veteran", profile_name: "Deathwatch Veterans", min: 4, max: 9, default_weapon_ids: ["boltgun", "close-combat-weapon"], is_leader_model: false },
22
+ ],
23
+ "decimus-kill-team": [
24
+ { name: "Watch Sergeant", profile_name: "Deathwatch Veteran", min: 1, max: 1, default_weapon_ids: ["boltgun", "close-combat-weapon"], is_leader_model: true },
25
+ { name: "Deathwatch Veteran", min: 2, max: 7, default_weapon_ids: ["boltgun", "close-combat-weapon"], is_leader_model: false },
26
+ { name: "Gravis Veteran", min: 2, max: 2, default_weapon_ids: ["bolt-rifle", "close-combat-weapon"], is_leader_model: false },
27
+ ],
28
+ "talonstrike-kill-team": [
29
+ { name: "Kill Team Intercessor with Jump Pack", min: 5, max: 10, default_weapon_ids: ["bolt-rifle", "close-combat-weapon"], is_leader_model: false },
30
+ { name: "Kill Team Heavy Intercessor with Jump Pack", min: 5, max: 5, default_weapon_ids: ["heavy-bolt-rifle", "close-combat-weapon"], is_leader_model: false },
31
+ ],
32
+ // Outrider Squad with optional ATV
33
+ "outrider-squad": [
34
+ { name: "Outrider Sergeant", profile_name: "Outrider", min: 1, max: 1, default_weapon_ids: ["heavy-bolt-pistol", "astartes-chainsword"], is_leader_model: true },
35
+ { name: "Outrider", min: 2, max: 5, default_weapon_ids: ["heavy-bolt-pistol", "astartes-chainsword"], is_leader_model: false },
36
+ { name: "Invader ATV", min: 0, max: 1, default_weapon_ids: ["onslaught-gatling-cannon"], is_leader_model: false },
37
+ ],
38
+ // Space Wolves units
39
+ "wolf-guard-headtakers": [
40
+ { name: "Wolf Guard Headtaker", min: 3, max: 12, default_weapon_ids: ["close-combat-weapon"], is_leader_model: false },
41
+ { name: "Hunting Wolf", profile_name: "Hunting Wolves", min: 0, max: 2, default_weapon_ids: ["close-combat-weapon"], is_leader_model: false },
42
+ ],
43
+ "wolf-scouts": [
44
+ { name: "Wolf Scout Pack Leader", profile_name: "Wolf Scout", min: 1, max: 1, default_weapon_ids: ["boltgun", "close-combat-weapon"], is_leader_model: true },
45
+ { name: "Wolf Scout", min: 4, max: 10, default_weapon_ids: ["boltgun", "close-combat-weapon"], is_leader_model: false },
46
+ { name: "Hunting Wolf", min: 1, max: 1, default_weapon_ids: ["close-combat-weapon"], is_leader_model: false },
47
+ ],
48
+ // Character companions
49
+ "chaplain-grimaldus": [
50
+ { name: "Chaplain Grimaldus", min: 1, max: 1, default_weapon_ids: ["plasma-pistol", "close-combat-weapon"], is_leader_model: true },
51
+ { name: "Cenobyte Servitor", min: 3, max: 3, default_weapon_ids: ["close-combat-weapon"], is_leader_model: false },
52
+ ],
53
+ "wardens-of-ultramar": [
54
+ { name: "Veteran Sergeant Metaurus", profile_name: "Veteran Sergeant Metaurus", min: 1, max: 1, default_weapon_ids: ["bolt-pistol", "close-combat-weapon"], is_leader_model: true },
55
+ { name: "Lucia Vestha", profile_name: "Lucia Vestha", min: 1, max: 1, default_weapon_ids: ["bolt-pistol", "close-combat-weapon"], is_leader_model: false },
56
+ { name: "Victrix Guard", profile_name: "Veteran Sergeant Metaurus", min: 4, max: 4, default_weapon_ids: ["bolt-pistol", "close-combat-weapon"], is_leader_model: false },
57
+ ],
58
+ },
59
+ detachmentFilter: [
60
+ "Gladius Task Force",
61
+ "Ironstorm Spearhead",
62
+ "1st Company Task Force",
63
+ "Firestorm Assault Force",
64
+ "Vanguard Spearhead",
65
+ "Stormlance Task Force",
66
+ "Anvil Siege Force",
67
+ "Librarius Conclave",
68
+ "Orbital Assault Force",
69
+ "Godhammer Assault Force",
70
+ "Spearpoint Task Force",
71
+ ],
72
+ };
73
+ registerFaction(adeptusAstartes);
74
+ export default adeptusAstartes;
@@ -0,0 +1,3 @@
1
+ import { type FactionConfig } from "../faction-config.js";
2
+ declare const adeptusCustodes: FactionConfig;
3
+ export default adeptusCustodes;
@@ -0,0 +1,14 @@
1
+ import { registerFaction } from "../faction-config.js";
2
+ const adeptusCustodes = {
3
+ sourceFactionId: "AC",
4
+ factionId: "adeptus-custodes",
5
+ factionName: "Adeptus Custodes",
6
+ factionAbilityName: "Martial Ka\u2019tah",
7
+ factionRuleId: "martial-katah",
8
+ factionKeywords: ["Imperium", "Adeptus Custodes"],
9
+ parentFactionId: null,
10
+ aliases: [],
11
+ compositionOverrides: {},
12
+ };
13
+ registerFaction(adeptusCustodes);
14
+ export default adeptusCustodes;
@@ -0,0 +1,3 @@
1
+ import { type FactionConfig } from "../faction-config.js";
2
+ declare const adeptusMechanicus: FactionConfig;
3
+ export default adeptusMechanicus;
@@ -0,0 +1,51 @@
1
+ import { registerFaction } from "../faction-config.js";
2
+ const adeptusMechanicus = {
3
+ sourceFactionId: "AdM",
4
+ factionId: "adeptus-mechanicus",
5
+ factionName: "Adeptus Mechanicus",
6
+ factionAbilityName: "Doctrina Imperatives",
7
+ factionRuleId: "doctrina-imperatives",
8
+ factionKeywords: ["Imperium", "Adeptus Mechanicus"],
9
+ parentFactionId: null,
10
+ aliases: [],
11
+ compositionOverrides: {
12
+ "skitarii-rangers": [
13
+ { name: "Ranger Alpha", profile_name: "Skitarii Ranger", min: 1, max: 1, default_weapon_ids: ["mechanicus-pistol", "alpha-combat-weapon"], is_leader_model: true },
14
+ { name: "Skitarii Ranger", min: 9, max: 9, default_weapon_ids: ["galvanic-rifle", "close-combat-weapon"], is_leader_model: false },
15
+ ],
16
+ "skitarii-vanguard": [
17
+ { name: "Vanguard Alpha", profile_name: "Skitarii Vanguard", min: 1, max: 1, default_weapon_ids: ["mechanicus-pistol", "alpha-combat-weapon"], is_leader_model: true },
18
+ { name: "Skitarii Vanguard", min: 9, max: 9, default_weapon_ids: ["radium-carbine", "close-combat-weapon"], is_leader_model: false },
19
+ ],
20
+ "sicarian-infiltrators": [
21
+ { name: "Sicarian Princeps", profile_name: "Sicarian Infiltrator", min: 1, max: 1, default_weapon_ids: ["stubcarbine", "power-weapon"], is_leader_model: true },
22
+ { name: "Sicarian Infiltrator", min: 4, max: 9, default_weapon_ids: ["stubcarbine", "power-weapon"], is_leader_model: false },
23
+ ],
24
+ "sicarian-ruststalkers": [
25
+ { name: "Sicarian Princeps", profile_name: "Sicarian Ruststalker", min: 1, max: 1, default_weapon_ids: ["transonic-blades-and-chordclaw"], is_leader_model: true },
26
+ { name: "Sicarian Ruststalker", min: 4, max: 9, default_weapon_ids: ["transonic-blades-and-chordclaw"], is_leader_model: false },
27
+ ],
28
+ "pteraxii-skystalkers": [
29
+ { name: "Pteraxii Alpha", profile_name: "Pteraxii Skystalker", min: 1, max: 1, default_weapon_ids: ["flechette-blaster", "taser-goad"], is_leader_model: true },
30
+ { name: "Pteraxii Skystalker", min: 4, max: 9, default_weapon_ids: ["flechette-carbine", "close-combat-weapon"], is_leader_model: false },
31
+ ],
32
+ "pteraxii-sterylizors": [
33
+ { name: "Pteraxii Alpha", profile_name: "Pteraxii Sterylizor", min: 1, max: 1, default_weapon_ids: ["flechette-blaster", "taser-goad"], is_leader_model: true },
34
+ { name: "Pteraxii Sterylizor", min: 4, max: 9, default_weapon_ids: ["phosphor-torch", "pteraxii-talons"], is_leader_model: false },
35
+ ],
36
+ "serberys-raiders": [
37
+ { name: "Serberys Alpha", profile_name: "Serberys Raider", min: 1, max: 1, default_weapon_ids: ["mechanicus-pistol", "cavalry-sabre-and-clawed-limbs"], is_leader_model: true },
38
+ { name: "Serberys Raider", min: 2, max: 5, default_weapon_ids: ["galvanic-carbine", "cavalry-sabre-and-clawed-limbs"], is_leader_model: false },
39
+ ],
40
+ "serberys-sulphurhounds": [
41
+ { name: "Serberys Alpha", profile_name: "Serberys Sulphurhound", min: 1, max: 1, default_weapon_ids: ["mechanicus-pistol", "cavalry-arc-maul"], is_leader_model: true },
42
+ { name: "Serberys Sulphurhound", min: 2, max: 5, default_weapon_ids: ["sulphur-breath", "clawed-limbs"], is_leader_model: false },
43
+ ],
44
+ "servitor-battleclade": [
45
+ { name: "Servitor Underseer", min: 1, max: 1, default_weapon_ids: ["mechanicus-pistol", "dataspikes"], is_leader_model: true },
46
+ { name: "Combat Servitor", min: 8, max: 8, default_weapon_ids: ["heavy-bolter", "servo-claw"], is_leader_model: false },
47
+ ],
48
+ },
49
+ };
50
+ registerFaction(adeptusMechanicus);
51
+ export default adeptusMechanicus;
@@ -0,0 +1,3 @@
1
+ import { type FactionConfig } from "../faction-config.js";
2
+ declare const aeldari: FactionConfig;
3
+ export default aeldari;
@@ -0,0 +1,79 @@
1
+ import { registerFaction } from "../faction-config.js";
2
+ const aeldari = {
3
+ sourceFactionId: "AE",
4
+ factionId: "aeldari",
5
+ factionName: "Aeldari",
6
+ factionAbilityName: "Strands of Fate",
7
+ factionRuleId: "strands-of-fate",
8
+ factionKeywords: ["Aeldari"],
9
+ parentFactionId: null,
10
+ aliases: [],
11
+ compositionOverrides: {
12
+ // Aspect Warriors with Exarchs (from source data)
13
+ "dire-avengers": [
14
+ { name: "Dire Avenger Exarch", min: 1, max: 1, default_weapon_ids: ["avenger-shuriken-catapult", "close-combat-weapon"], is_leader_model: true },
15
+ { name: "Dire Avenger", min: 4, max: 9, default_weapon_ids: ["avenger-shuriken-catapult", "close-combat-weapon"], is_leader_model: false },
16
+ ],
17
+ "howling-banshees": [
18
+ { name: "Howling Banshee Exarch", min: 1, max: 1, default_weapon_ids: ["shuriken-pistol", "power-sword"], is_leader_model: true },
19
+ { name: "Howling Banshee", min: 4, max: 9, default_weapon_ids: ["shuriken-pistol", "power-sword"], is_leader_model: false },
20
+ ],
21
+ "striking-scorpions": [
22
+ { name: "Striking Scorpion Exarch", min: 1, max: 1, default_weapon_ids: ["scorpion-chainsword", "shuriken-pistol"], is_leader_model: true },
23
+ { name: "Striking Scorpion", min: 4, max: 9, default_weapon_ids: ["scorpion-chainsword", "shuriken-pistol"], is_leader_model: false },
24
+ ],
25
+ "fire-dragons": [
26
+ { name: "Fire Dragon Exarch", min: 1, max: 1, default_weapon_ids: ["dragon-fusion-gun", "close-combat-weapon"], is_leader_model: true },
27
+ { name: "Fire Dragon", min: 4, max: 9, default_weapon_ids: ["dragon-fusion-gun", "close-combat-weapon"], is_leader_model: false },
28
+ ],
29
+ "dark-reapers": [
30
+ { name: "Dark Reaper Exarch", min: 1, max: 1, default_weapon_ids: ["reaper-launcher", "close-combat-weapon"], is_leader_model: true },
31
+ { name: "Dark Reaper", min: 4, max: 9, default_weapon_ids: ["reaper-launcher", "close-combat-weapon"], is_leader_model: false },
32
+ ],
33
+ "swooping-hawks": [
34
+ { name: "Swooping Hawk Exarch", min: 1, max: 1, default_weapon_ids: ["lasblaster", "close-combat-weapon"], is_leader_model: true },
35
+ { name: "Swooping Hawk", min: 4, max: 9, default_weapon_ids: ["lasblaster", "close-combat-weapon"], is_leader_model: false },
36
+ ],
37
+ "warp-spiders": [
38
+ { name: "Warp Spider Exarch", min: 1, max: 1, default_weapon_ids: ["death-spinner", "close-combat-weapon"], is_leader_model: true },
39
+ { name: "Warp Spider", min: 4, max: 9, default_weapon_ids: ["death-spinner", "close-combat-weapon"], is_leader_model: false },
40
+ ],
41
+ "shining-spears": [
42
+ { name: "Shining Spear Exarch", min: 1, max: 1, default_weapon_ids: ["twin-shuriken-catapult", "laser-lance"], is_leader_model: true },
43
+ { name: "Shining Spear", min: 2, max: 5, default_weapon_ids: ["twin-shuriken-catapult", "laser-lance"], is_leader_model: false },
44
+ ],
45
+ // Guardian squads with platforms
46
+ "guardian-defenders": [
47
+ { name: "Guardian Defender", min: 10, max: 10, default_weapon_ids: ["shuriken-catapult", "close-combat-weapon"], is_leader_model: false },
48
+ { name: "Heavy Weapon Platform", min: 1, max: 1, default_weapon_ids: ["bright-lance"], is_leader_model: false },
49
+ ],
50
+ "storm-guardians": [
51
+ { name: "Storm Guardian", min: 10, max: 10, default_weapon_ids: ["shuriken-pistol", "aeldari-power-sword"], is_leader_model: false },
52
+ { name: "Serpent\u2019s Scale Platform", min: 1, max: 1, default_weapon_ids: ["shuriken-catapult"], is_leader_model: false },
53
+ ],
54
+ // Ynnari subfaction units
55
+ "ynnari-incubi": [
56
+ { name: "Klaivex", min: 1, max: 1, default_weapon_ids: ["demiklaives-single-blade"], is_leader_model: true },
57
+ { name: "Incubi", min: 4, max: 9, default_weapon_ids: ["klaive"], is_leader_model: false },
58
+ ],
59
+ "ynnari-kabalite-warriors": [
60
+ { name: "Sybarite", profile_name: "Kabalite Warrior", min: 1, max: 1, default_weapon_ids: ["splinter-pistol", "power-weapon"], is_leader_model: true },
61
+ { name: "Kabalite Warrior", min: 9, max: 9, default_weapon_ids: ["splinter-rifle", "close-combat-weapon"], is_leader_model: false },
62
+ ],
63
+ "ynnari-wyches": [
64
+ { name: "Hekatrix", profile_name: "Wych", min: 1, max: 1, default_weapon_ids: ["splinter-pistol", "power-weapon"], is_leader_model: true },
65
+ { name: "Wych", min: 9, max: 9, default_weapon_ids: ["splinter-pistol", "hekatarii-blade"], is_leader_model: false },
66
+ ],
67
+ "ynnari-reavers": [
68
+ { name: "Arena Champion", profile_name: "Reaver", min: 1, max: 1, default_weapon_ids: ["splinter-pistol", "bladevanes"], is_leader_model: true },
69
+ { name: "Reaver", min: 2, max: 5, default_weapon_ids: ["splinter-pistol", "bladevanes"], is_leader_model: false },
70
+ ],
71
+ // Harlequin Troupe
72
+ "troupe": [
73
+ { name: "Lead Player", profile_name: "Player", min: 1, max: 1, default_weapon_ids: ["shuriken-pistol", "harlequins-blade"], is_leader_model: true },
74
+ { name: "Player", min: 4, max: 11, default_weapon_ids: ["shuriken-pistol", "harlequins-blade"], is_leader_model: false },
75
+ ],
76
+ },
77
+ };
78
+ registerFaction(aeldari);
79
+ export default aeldari;
@@ -0,0 +1,3 @@
1
+ import { type FactionConfig } from "../faction-config.js";
2
+ declare const agentsOfTheImperium: FactionConfig;
3
+ export default agentsOfTheImperium;
@@ -0,0 +1,57 @@
1
+ import { registerFaction } from "../faction-config.js";
2
+ const agentsOfTheImperium = {
3
+ sourceFactionId: "AoI",
4
+ factionId: "agents-of-the-imperium",
5
+ factionName: "Agents of the Imperium",
6
+ factionAbilityName: "Assigned Agents",
7
+ factionRuleId: "assigned-agents",
8
+ factionKeywords: ["Imperium", "Agents of the Imperium"],
9
+ parentFactionId: null,
10
+ aliases: [],
11
+ compositionOverrides: {
12
+ "deathwatch-kill-team": [
13
+ { name: "Watch Sergeant", min: 1, max: 1, default_weapon_ids: ["boltgun", "close-combat-weapon"], is_leader_model: true },
14
+ { name: "Deathwatch Veteran", profile_name: "Deathwatch Veterans", min: 4, max: 9, default_weapon_ids: ["boltgun", "close-combat-weapon"], is_leader_model: false },
15
+ ],
16
+ "aquila-kill-team": [
17
+ { name: "Watch Sergeant", profile_name: "Deathwatch Veteran", min: 1, max: 1, default_weapon_ids: ["boltgun", "close-combat-weapon"], is_leader_model: true },
18
+ { name: "Deathwatch Veteran", min: 2, max: 7, default_weapon_ids: ["boltgun", "close-combat-weapon"], is_leader_model: false },
19
+ { name: "Gravis Veteran", min: 2, max: 2, default_weapon_ids: ["bolt-rifle", "close-combat-weapon"], is_leader_model: false },
20
+ ],
21
+ "rogue-trader-entourage": [
22
+ { name: "Rogue Trader", min: 1, max: 1, default_weapon_ids: ["dartmask", "close-combat-weapon"], is_leader_model: true },
23
+ { name: "Rejuvenat Adept", min: 1, max: 1, default_weapon_ids: ["close-combat-weapon"], is_leader_model: false },
24
+ { name: "Canid", profile_name: "Rejuvenat Adept", min: 1, max: 1, default_weapon_ids: ["close-combat-weapon"], is_leader_model: false },
25
+ { name: "Lectro-Maester", profile_name: "Rejuvenat Adept", min: 1, max: 1, default_weapon_ids: ["close-combat-weapon"], is_leader_model: false },
26
+ ],
27
+ "exaction-squad": [
28
+ { name: "Proctor-Exactant", profile_name: "Cyber-mastiff", min: 1, max: 1, default_weapon_ids: ["arbites-shotpistol", "close-combat-weapon"], is_leader_model: true },
29
+ { name: "Exaction Vigilant", profile_name: "Cyber-mastiff", min: 9, max: 9, default_weapon_ids: ["arbites-combat-shotgun", "close-combat-weapon"], is_leader_model: false },
30
+ { name: "Cyber-mastiff", min: 1, max: 1, default_weapon_ids: ["mechanical-bite"], is_leader_model: false },
31
+ ],
32
+ "subductor-squad": [
33
+ { name: "Subductor Proctor", profile_name: "Cyber-mastiff", min: 1, max: 1, default_weapon_ids: ["arbites-shotpistol", "close-combat-weapon"], is_leader_model: true },
34
+ { name: "Subductor", profile_name: "Cyber-mastiff", min: 9, max: 9, default_weapon_ids: ["arbites-shotpistol", "close-combat-weapon"], is_leader_model: false },
35
+ { name: "Cyber-mastiff", min: 1, max: 1, default_weapon_ids: ["mechanical-bite"], is_leader_model: false },
36
+ ],
37
+ "vigilant-squad": [
38
+ { name: "Vigilant Proctor", profile_name: "Cyber-mastiff", min: 1, max: 1, default_weapon_ids: ["arbites-shotpistol", "close-combat-weapon"], is_leader_model: true },
39
+ { name: "Vigilant", profile_name: "Cyber-mastiff", min: 9, max: 9, default_weapon_ids: ["arbites-combat-shotgun", "close-combat-weapon"], is_leader_model: false },
40
+ { name: "Cyber-mastiff", min: 1, max: 1, default_weapon_ids: ["mechanical-bite"], is_leader_model: false },
41
+ ],
42
+ "voidsmen-at-arms": [
43
+ { name: "Voidmaster", profile_name: "Canid", min: 1, max: 1, default_weapon_ids: ["laspistol", "close-combat-weapon"], is_leader_model: true },
44
+ { name: "Voidsman", profile_name: "Canid", min: 4, max: 4, default_weapon_ids: ["lasgun", "close-combat-weapon"], is_leader_model: false },
45
+ { name: "Canid", min: 1, max: 1, default_weapon_ids: ["close-combat-weapon"], is_leader_model: false },
46
+ ],
47
+ "sanctifiers": [
48
+ { name: "Missionary", profile_name: "Missionary", min: 1, max: 1, default_weapon_ids: ["holy-fire", "close-combat-weapon"], is_leader_model: true },
49
+ { name: "Miraculist", min: 2, max: 2, default_weapon_ids: ["ministorum-hand-flamer", "close-combat-weapon"], is_leader_model: false },
50
+ { name: "Salvationist", min: 2, max: 2, default_weapon_ids: ["ministorum-flamer", "close-combat-weapon"], is_leader_model: false },
51
+ { name: "Death Cult Assassin", min: 2, max: 2, default_weapon_ids: ["death-cult-blades"], is_leader_model: false },
52
+ { name: "Sanctifier", min: 2, max: 2, default_weapon_ids: ["sanctifier-melee-weapon"], is_leader_model: false },
53
+ ],
54
+ },
55
+ };
56
+ registerFaction(agentsOfTheImperium);
57
+ export default agentsOfTheImperium;
@@ -0,0 +1,3 @@
1
+ import { type FactionConfig } from "../faction-config.js";
2
+ declare const astraMilitarum: FactionConfig;
3
+ export default astraMilitarum;
@@ -0,0 +1,80 @@
1
+ import { registerFaction } from "../faction-config.js";
2
+ const astraMilitarum = {
3
+ sourceFactionId: "AM",
4
+ factionId: "astra-militarum",
5
+ factionName: "Astra Militarum",
6
+ factionAbilityName: "Voice of Command",
7
+ factionRuleId: "voice-of-command",
8
+ factionKeywords: ["Imperium", "Astra Militarum"],
9
+ parentFactionId: null,
10
+ aliases: [],
11
+ compositionOverrides: {
12
+ "cadian-shock-troops": [
13
+ { name: "Cadian Sergeant", profile_name: "Cadian Shock Trooper", min: 1, max: 1, default_weapon_ids: ["laspistol", "close-combat-weapon"], is_leader_model: true },
14
+ { name: "Cadian Shock Trooper", min: 9, max: 19, default_weapon_ids: ["lasgun", "close-combat-weapon"], is_leader_model: false },
15
+ ],
16
+ "catachan-jungle-fighters": [
17
+ { name: "Catachan Sergeant", profile_name: "Catachan Jungle Fighter", min: 1, max: 1, default_weapon_ids: ["laspistol", "close-combat-weapon"], is_leader_model: true },
18
+ { name: "Catachan Jungle Fighter", min: 9, max: 19, default_weapon_ids: ["lasgun", "close-combat-weapon"], is_leader_model: false },
19
+ ],
20
+ "death-korps-of-krieg": [
21
+ { name: "Watchmaster", profile_name: "Death Korps Trooper", min: 1, max: 1, default_weapon_ids: ["laspistol", "close-combat-weapon"], is_leader_model: true },
22
+ { name: "Death Korps Trooper", min: 9, max: 19, default_weapon_ids: ["lasgun", "close-combat-weapon"], is_leader_model: false },
23
+ ],
24
+ "kasrkin": [
25
+ { name: "Kasrkin Sergeant", profile_name: "Kasrkin", min: 1, max: 1, default_weapon_ids: ["hot-shot-laspistol", "close-combat-weapon"], is_leader_model: true },
26
+ { name: "Kasrkin", min: 9, max: 9, default_weapon_ids: ["hot-shot-lasgun", "close-combat-weapon"], is_leader_model: false },
27
+ ],
28
+ "tempestus-scions": [
29
+ { name: "Tempestor", profile_name: "Tempestus Scion", min: 1, max: 1, default_weapon_ids: ["hot-shot-laspistol", "close-combat-weapon"], is_leader_model: true },
30
+ { name: "Tempestus Scion", min: 4, max: 9, default_weapon_ids: ["hot-shot-lasgun", "close-combat-weapon"], is_leader_model: false },
31
+ ],
32
+ "tempestus-aquilons": [
33
+ { name: "Tempestor", profile_name: "Tempestus Aquilon", min: 1, max: 1, default_weapon_ids: ["hot-shot-laspistol", "close-combat-weapon"], is_leader_model: true },
34
+ { name: "Tempestus Aquilon", min: 9, max: 9, default_weapon_ids: ["hot-shot-lasgun", "close-combat-weapon"], is_leader_model: false },
35
+ ],
36
+ "death-riders": [
37
+ { name: "Ridemaster", min: 1, max: 1, default_weapon_ids: ["laspistol", "death-rider-hunting-lance"], is_leader_model: true },
38
+ { name: "Death Rider", min: 4, max: 9, default_weapon_ids: ["laspistol", "death-rider-hunting-lance"], is_leader_model: false },
39
+ ],
40
+ "krieg-combat-engineers": [
41
+ { name: "Krieg Engineer Watchmaster", min: 1, max: 1, default_weapon_ids: ["laspistol", "close-combat-weapon"], is_leader_model: true },
42
+ { name: "Krieg Combat Engineer", min: 4, max: 9, default_weapon_ids: ["lasgun", "close-combat-weapon"], is_leader_model: false },
43
+ ],
44
+ "krieg-heavy-weapons-squad": [
45
+ { name: "Fire Coordinator", min: 1, max: 1, default_weapon_ids: ["laspistol", "close-combat-weapon"], is_leader_model: true },
46
+ { name: "Heavy Weapons Gunner", min: 3, max: 3, default_weapon_ids: ["heavy-bolter", "close-combat-weapon"], is_leader_model: false },
47
+ ],
48
+ // Command squads (multi-model from source)
49
+ "cadian-command-squad": [
50
+ { name: "Cadian Commander", min: 1, max: 1, default_weapon_ids: ["laspistol", "close-combat-weapon"], is_leader_model: true },
51
+ { name: "Cadian Veteran Guardsman", min: 4, max: 4, default_weapon_ids: ["lasgun", "close-combat-weapon"], is_leader_model: false },
52
+ ],
53
+ "catachan-command-squad": [
54
+ { name: "Catachan Commander", min: 1, max: 1, default_weapon_ids: ["laspistol", "close-combat-weapon"], is_leader_model: true },
55
+ { name: "Veteran Guardsman", min: 4, max: 4, default_weapon_ids: ["lasgun", "close-combat-weapon"], is_leader_model: false },
56
+ ],
57
+ "krieg-command-squad": [
58
+ { name: "Lord Commissar", min: 1, max: 1, default_weapon_ids: ["laspistol", "close-combat-weapon"], is_leader_model: true },
59
+ { name: "Veteran Guardsman", min: 5, max: 5, default_weapon_ids: ["lasgun", "close-combat-weapon"], is_leader_model: false },
60
+ ],
61
+ "militarum-tempestus-command-squad": [
62
+ { name: "Tempestor Prime", min: 1, max: 1, default_weapon_ids: ["hot-shot-laspistol", "close-combat-weapon"], is_leader_model: true },
63
+ { name: "Tempestus Scion", min: 4, max: 4, default_weapon_ids: ["hot-shot-lasgun", "close-combat-weapon"], is_leader_model: false },
64
+ ],
65
+ "gaunts-ghosts": [
66
+ { name: "Ibram Gaunt", min: 1, max: 1, default_weapon_ids: ["bolt-pistol", "power-sword"], is_leader_model: true },
67
+ { name: "Oan Mkoll", min: 1, max: 1, default_weapon_ids: ["laspistol", "close-combat-weapon"], is_leader_model: false },
68
+ { name: "Hlaine Larkin", profile_name: "Oan Mkoll", min: 1, max: 1, default_weapon_ids: ["long-las", "close-combat-weapon"], is_leader_model: false },
69
+ { name: "Elim Rawne", profile_name: "Oan Mkoll", min: 1, max: 1, default_weapon_ids: ["laspistol", "close-combat-weapon"], is_leader_model: false },
70
+ { name: "Brin Milo", profile_name: "Oan Mkoll", min: 1, max: 1, default_weapon_ids: ["lasgun", "close-combat-weapon"], is_leader_model: false },
71
+ { name: "Try Again Bragg", profile_name: "Oan Mkoll", min: 1, max: 1, default_weapon_ids: ["autocannon", "close-combat-weapon"], is_leader_model: false },
72
+ ],
73
+ "attilan-rough-riders": [
74
+ { name: "Rough Rider Sergeant", profile_name: "Attilan Rough Rider", min: 1, max: 1, default_weapon_ids: ["laspistol", "hunting-lance"], is_leader_model: true },
75
+ { name: "Attilan Rough Rider", min: 4, max: 9, default_weapon_ids: ["laspistol", "hunting-lance"], is_leader_model: false },
76
+ ],
77
+ },
78
+ };
79
+ registerFaction(astraMilitarum);
80
+ export default astraMilitarum;
@@ -0,0 +1,3 @@
1
+ import { type FactionConfig } from "../faction-config.js";
2
+ declare const blackTemplars: FactionConfig;
3
+ export default blackTemplars;
@@ -0,0 +1,16 @@
1
+ import { registerFaction } from "../faction-config.js";
2
+ const blackTemplars = {
3
+ sourceFactionId: "SM",
4
+ factionId: "black-templars",
5
+ factionName: "Black Templars",
6
+ factionAbilityName: "Oath of Moment",
7
+ factionRuleId: "templar-vows",
8
+ factionKeywords: ["Imperium", "Adeptus Astartes", "Black Templars"],
9
+ parentFactionId: "adeptus-astartes",
10
+ aliases: [],
11
+ compositionOverrides: {},
12
+ skipUnits: true,
13
+ detachmentFilter: ["Wrathful Procession", "Vindication Task Force", "Companions of Vehemence"],
14
+ };
15
+ registerFaction(blackTemplars);
16
+ export default blackTemplars;
@@ -0,0 +1,3 @@
1
+ import { type FactionConfig } from "../faction-config.js";
2
+ declare const bloodAngels: FactionConfig;
3
+ export default bloodAngels;
@@ -0,0 +1,16 @@
1
+ import { registerFaction } from "../faction-config.js";
2
+ const bloodAngels = {
3
+ sourceFactionId: "SM",
4
+ factionId: "blood-angels",
5
+ factionName: "Blood Angels",
6
+ factionAbilityName: "Oath of Moment",
7
+ factionRuleId: "the-red-thirst",
8
+ factionKeywords: ["Imperium", "Adeptus Astartes", "Blood Angels"],
9
+ parentFactionId: "adeptus-astartes",
10
+ aliases: [],
11
+ compositionOverrides: {},
12
+ skipUnits: true,
13
+ detachmentFilter: ["Angelic Inheritors", "The Lost Brethren", "The Angelic Host", "Rage-cursed Onslaught"],
14
+ };
15
+ registerFaction(bloodAngels);
16
+ export default bloodAngels;
@@ -0,0 +1,3 @@
1
+ import { type FactionConfig } from "../faction-config.js";
2
+ declare const chaosDaemons: FactionConfig;
3
+ export default chaosDaemons;
@@ -0,0 +1,40 @@
1
+ import { registerFaction } from "../faction-config.js";
2
+ const chaosDaemons = {
3
+ sourceFactionId: "CD",
4
+ factionId: "chaos-daemons",
5
+ factionName: "Chaos Daemons",
6
+ factionAbilityName: "The Shadow of Chaos",
7
+ factionRuleId: "the-shadow-of-chaos",
8
+ factionKeywords: ["Chaos", "Daemons"],
9
+ parentFactionId: null,
10
+ aliases: [],
11
+ compositionOverrides: {
12
+ "bloodletters": [
13
+ { name: "Bloodreaper", profile_name: "Bloodletter", min: 1, max: 1, default_weapon_ids: ["hellblade"], is_leader_model: true },
14
+ { name: "Bloodletter", min: 9, max: 9, default_weapon_ids: ["hellblade"], is_leader_model: false },
15
+ ],
16
+ "daemonettes": [
17
+ { name: "Alluress", profile_name: "Daemonette", min: 1, max: 1, default_weapon_ids: ["slashing-claws"], is_leader_model: true },
18
+ { name: "Daemonette", min: 9, max: 9, default_weapon_ids: ["slashing-claws"], is_leader_model: false },
19
+ ],
20
+ "plaguebearers": [
21
+ { name: "Plagueridden", profile_name: "Plaguebearer", min: 1, max: 1, default_weapon_ids: ["plaguesword"], is_leader_model: true },
22
+ { name: "Plaguebearer", min: 9, max: 9, default_weapon_ids: ["plaguesword"], is_leader_model: false },
23
+ ],
24
+ "blue-horrors": [
25
+ { name: "Iridescent Horror", profile_name: "Blue Horror", min: 1, max: 1, default_weapon_ids: ["coruscating-flames"], is_leader_model: true },
26
+ { name: "Blue Horror", min: 9, max: 9, default_weapon_ids: ["coruscating-flames"], is_leader_model: false },
27
+ ],
28
+ "pink-horrors": [
29
+ { name: "Iridescent Horror", profile_name: "Pink Horror", min: 1, max: 1, default_weapon_ids: ["coruscating-flames"], is_leader_model: true },
30
+ { name: "Pink Horror", min: 8, max: 8, default_weapon_ids: ["coruscating-flames"], is_leader_model: false },
31
+ { name: "Brimstone Horror", min: 1, max: 1, default_weapon_ids: ["coruscating-flames"], is_leader_model: false },
32
+ ],
33
+ "seekers": [
34
+ { name: "Heartseeker", profile_name: "Seeker", min: 1, max: 1, default_weapon_ids: ["slashing-claws", "lashing-tongues"], is_leader_model: true },
35
+ { name: "Seeker", min: 4, max: 9, default_weapon_ids: ["slashing-claws", "lashing-tongues"], is_leader_model: false },
36
+ ],
37
+ },
38
+ };
39
+ registerFaction(chaosDaemons);
40
+ export default chaosDaemons;
@@ -0,0 +1,3 @@
1
+ import { type FactionConfig } from "../faction-config.js";
2
+ declare const chaosKnights: FactionConfig;
3
+ export default chaosKnights;
@@ -0,0 +1,14 @@
1
+ import { registerFaction } from "../faction-config.js";
2
+ const chaosKnights = {
3
+ sourceFactionId: "QT",
4
+ factionId: "chaos-knights",
5
+ factionName: "Chaos Knights",
6
+ factionAbilityName: "Harbingers of Dread",
7
+ factionRuleId: "harbingers-of-dread",
8
+ factionKeywords: ["Chaos", "Chaos Knights"],
9
+ parentFactionId: null,
10
+ aliases: [],
11
+ compositionOverrides: {},
12
+ };
13
+ registerFaction(chaosKnights);
14
+ export default chaosKnights;
@@ -0,0 +1,3 @@
1
+ import { type FactionConfig } from "../faction-config.js";
2
+ declare const chaosSpaceMarines: FactionConfig;
3
+ export default chaosSpaceMarines;
@@ -0,0 +1,95 @@
1
+ import { registerFaction } from "../faction-config.js";
2
+ const chaosSpaceMarines = {
3
+ sourceFactionId: "CSM",
4
+ factionId: "chaos-space-marines",
5
+ factionName: "Chaos Space Marines",
6
+ factionAbilityName: "Dark Pacts",
7
+ factionRuleId: "dark-pacts",
8
+ factionKeywords: ["Chaos", "Heretic Astartes"],
9
+ parentFactionId: null,
10
+ aliases: [],
11
+ compositionOverrides: {
12
+ "legionaries": [
13
+ { name: "Aspiring Champion", profile_name: "Legionary", min: 1, max: 1, default_weapon_ids: ["bolt-pistol", "accursed-weapon"], is_leader_model: true },
14
+ { name: "Legionary", min: 4, max: 9, default_weapon_ids: ["boltgun", "close-combat-weapon"], is_leader_model: false },
15
+ ],
16
+ "chosen": [
17
+ { name: "Chosen Champion", profile_name: "Chosen", min: 1, max: 1, default_weapon_ids: ["bolt-pistol", "accursed-weapon"], is_leader_model: true },
18
+ { name: "Chosen", min: 4, max: 9, default_weapon_ids: ["bolt-pistol", "accursed-weapon"], is_leader_model: false },
19
+ ],
20
+ "chaos-terminator-squad": [
21
+ { name: "Terminator Champion", profile_name: "Chaos Terminator", min: 1, max: 1, default_weapon_ids: ["combi-bolter", "accursed-weapon"], is_leader_model: true },
22
+ { name: "Chaos Terminator", min: 4, max: 9, default_weapon_ids: ["combi-bolter", "accursed-weapon"], is_leader_model: false },
23
+ ],
24
+ "cultist-mob": [
25
+ { name: "Cultist Champion", profile_name: "Cultist", min: 1, max: 1, default_weapon_ids: ["autopistol", "brutal-assault-weapon"], is_leader_model: true },
26
+ { name: "Cultist", min: 9, max: 19, default_weapon_ids: ["autogun", "close-combat-weapon"], is_leader_model: false },
27
+ ],
28
+ "accursed-cultists": [
29
+ { name: "Torment", min: 1, max: 3, default_weapon_ids: ["hideous-mutations"], is_leader_model: false },
30
+ { name: "Mutant", min: 5, max: 13, default_weapon_ids: ["blasphemous-appendages"], is_leader_model: false },
31
+ ],
32
+ "havocs": [
33
+ { name: "Havoc Champion", profile_name: "Havoc", min: 1, max: 1, default_weapon_ids: ["bolt-pistol", "accursed-weapon"], is_leader_model: true },
34
+ { name: "Havoc", min: 4, max: 4, default_weapon_ids: ["lascannon", "close-combat-weapon"], is_leader_model: false },
35
+ ],
36
+ "raptors": [
37
+ { name: "Raptor Champion", profile_name: "Raptor", min: 1, max: 1, default_weapon_ids: ["bolt-pistol", "accursed-weapon"], is_leader_model: true },
38
+ { name: "Raptor", min: 4, max: 9, default_weapon_ids: ["bolt-pistol", "close-combat-weapon"], is_leader_model: false },
39
+ ],
40
+ "warp-talons": [
41
+ { name: "Warp Talon Champion", profile_name: "Warp Talon", min: 1, max: 1, default_weapon_ids: ["warp-talon-claws"], is_leader_model: true },
42
+ { name: "Warp Talon", min: 4, max: 9, default_weapon_ids: ["warp-talon-claws"], is_leader_model: false },
43
+ ],
44
+ "chaos-bikers": [
45
+ { name: "Biker Champion", profile_name: "Chaos Biker", min: 1, max: 1, default_weapon_ids: ["bolt-pistol", "accursed-weapon"], is_leader_model: true },
46
+ { name: "Chaos Biker", min: 2, max: 5, default_weapon_ids: ["combi-bolter", "close-combat-weapon"], is_leader_model: false },
47
+ ],
48
+ "nemesis-claw": [
49
+ { name: "Nemesis Champion", profile_name: "Nemesis Claw", min: 1, max: 1, default_weapon_ids: ["bolt-pistol", "accursed-weapon"], is_leader_model: true },
50
+ { name: "Nemesis Claw", min: 4, max: 9, default_weapon_ids: ["bolt-pistol", "close-combat-weapon"], is_leader_model: false },
51
+ ],
52
+ "red-corsairs-raiders": [
53
+ { name: "Corsair Champion", profile_name: "Red Corsair", min: 1, max: 1, default_weapon_ids: ["bolt-pistol", "accursed-weapon"], is_leader_model: true },
54
+ { name: "Red Corsair", min: 4, max: 9, default_weapon_ids: ["boltgun", "close-combat-weapon"], is_leader_model: false },
55
+ ],
56
+ "traitor-guardsmen-squad": [
57
+ { name: "Traitor Sergeant", profile_name: "Traitor Guardsman", min: 1, max: 1, default_weapon_ids: ["laspistol", "close-combat-weapon"], is_leader_model: true },
58
+ { name: "Traitor Guardsman", min: 9, max: 9, default_weapon_ids: ["lasgun", "close-combat-weapon"], is_leader_model: false },
59
+ ],
60
+ "fellgor-beastmen": [
61
+ { name: "Fellgor Mangler", profile_name: "Fellgor Beastman", min: 1, max: 1, default_weapon_ids: ["autopistol", "close-combat-weapon"], is_leader_model: true },
62
+ { name: "Fellgor Beastman", min: 9, max: 9, default_weapon_ids: ["autopistol", "close-combat-weapon"], is_leader_model: false },
63
+ ],
64
+ "chaos-spawn": [
65
+ { name: "Chaos Spawn", min: 2, max: 2, default_weapon_ids: ["hideous-mutations"], is_leader_model: false },
66
+ ],
67
+ // Character units with companions
68
+ "dark-apostle": [
69
+ { name: "Dark Apostle", min: 1, max: 1, default_weapon_ids: ["bolt-pistol", "accursed-crozius"], is_leader_model: true },
70
+ { name: "Dark Disciple", min: 2, max: 2, default_weapon_ids: ["close-combat-weapon"], is_leader_model: false },
71
+ ],
72
+ "dark-commune": [
73
+ { name: "Cult Demagogue", min: 1, max: 1, default_weapon_ids: ["autopistol", "close-combat-weapon"], is_leader_model: true },
74
+ { name: "Blessed Blade", min: 1, max: 1, default_weapon_ids: ["close-combat-weapon"], is_leader_model: false },
75
+ { name: "Mindwitch", profile_name: "Cult Demagogue", min: 1, max: 1, default_weapon_ids: ["close-combat-weapon"], is_leader_model: false },
76
+ { name: "Iconarch", profile_name: "Cult Demagogue", min: 1, max: 1, default_weapon_ids: ["close-combat-weapon"], is_leader_model: false },
77
+ { name: "Accursed Mutant", profile_name: "Blessed Blade", min: 1, max: 1, default_weapon_ids: ["close-combat-weapon"], is_leader_model: false },
78
+ ],
79
+ "fabius-bile": [
80
+ { name: "Fabius Bile", min: 1, max: 1, default_weapon_ids: ["xyclos-needler", "chirurgeon"], is_leader_model: true },
81
+ { name: "Surgeon Acolyte", min: 1, max: 1, default_weapon_ids: ["close-combat-weapon"], is_leader_model: false },
82
+ ],
83
+ "masters-of-the-maelstrom": [
84
+ { name: "Katar Garrix", min: 1, max: 1, default_weapon_ids: ["close-combat-weapon"], is_leader_model: true },
85
+ { name: "The Enforcer", min: 1, max: 1, default_weapon_ids: ["close-combat-weapon"], is_leader_model: false },
86
+ { name: "Corsair", profile_name: "Katar Garrix", min: 3, max: 3, default_weapon_ids: ["boltgun", "close-combat-weapon"], is_leader_model: false },
87
+ ],
88
+ "traitor-enforcer": [
89
+ { name: "Traitor Enforcer", min: 1, max: 1, default_weapon_ids: ["autopistol", "close-combat-weapon"], is_leader_model: true },
90
+ { name: "Traitor Ogryn", min: 1, max: 1, default_weapon_ids: ["close-combat-weapon"], is_leader_model: false },
91
+ ],
92
+ },
93
+ };
94
+ registerFaction(chaosSpaceMarines);
95
+ export default chaosSpaceMarines;
@@ -0,0 +1,3 @@
1
+ import { type FactionConfig } from "../faction-config.js";
2
+ declare const crimsonFists: FactionConfig;
3
+ export default crimsonFists;