@alpaca-software/40kdc-data 0.1.1 → 0.1.3
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.
- package/README.md +2 -0
- package/dist/abilities-resolver/index.d.ts +9 -0
- package/dist/abilities-resolver/index.d.ts.map +1 -0
- package/dist/abilities-resolver/index.js +9 -0
- package/dist/abilities-resolver/index.js.map +1 -0
- package/dist/abilities-resolver/resolver.d.ts +73 -0
- package/dist/abilities-resolver/resolver.d.ts.map +1 -0
- package/dist/abilities-resolver/resolver.js +142 -0
- package/dist/abilities-resolver/resolver.js.map +1 -0
- package/dist/audit-coverage.d.ts +78 -0
- package/dist/audit-coverage.d.ts.map +1 -0
- package/dist/audit-coverage.js +341 -0
- package/dist/audit-coverage.js.map +1 -0
- package/dist/author-batch.d.ts +147 -0
- package/dist/author-batch.d.ts.map +1 -0
- package/dist/author-batch.js +675 -0
- package/dist/author-batch.js.map +1 -0
- package/dist/author-input.d.ts +37 -0
- package/dist/author-input.d.ts.map +1 -0
- package/dist/author-input.js +162 -0
- package/dist/author-input.js.map +1 -0
- package/dist/bundle-schemas.d.ts +1 -0
- package/dist/bundle-schemas.d.ts.map +1 -0
- package/dist/bundle-schemas.js +1 -0
- package/dist/bundle-schemas.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +9 -0
- package/dist/cli.js.map +1 -0
- package/dist/codegen-data.d.ts +1 -0
- package/dist/codegen-data.d.ts.map +1 -0
- package/dist/codegen-data.js +2 -0
- package/dist/codegen-data.js.map +1 -0
- package/dist/commands/import.d.ts +1 -0
- package/dist/commands/import.d.ts.map +1 -0
- package/dist/commands/import.js +1 -0
- package/dist/commands/import.js.map +1 -0
- package/dist/commands/translate.d.ts +1 -0
- package/dist/commands/translate.d.ts.map +1 -0
- package/dist/commands/translate.js +10 -4
- package/dist/commands/translate.js.map +1 -0
- package/dist/commands/validate-all.d.ts +1 -0
- package/dist/commands/validate-all.d.ts.map +1 -0
- package/dist/commands/validate-all.js +1 -0
- package/dist/commands/validate-all.js.map +1 -0
- package/dist/commands/validate-core.d.ts +1 -0
- package/dist/commands/validate-core.d.ts.map +1 -0
- package/dist/commands/validate-core.js +1 -0
- package/dist/commands/validate-core.js.map +1 -0
- package/dist/commands/validate-enrichment.d.ts +1 -0
- package/dist/commands/validate-enrichment.d.ts.map +1 -0
- package/dist/commands/validate-enrichment.js +1 -0
- package/dist/commands/validate-enrichment.js.map +1 -0
- package/dist/convert-faction.d.ts +1 -0
- package/dist/convert-faction.d.ts.map +1 -0
- package/dist/convert-faction.js +1 -0
- package/dist/convert-faction.js.map +1 -0
- package/dist/converters/configs/adepta-sororitas.d.ts +1 -0
- package/dist/converters/configs/adepta-sororitas.d.ts.map +1 -0
- package/dist/converters/configs/adepta-sororitas.js +1 -0
- package/dist/converters/configs/adepta-sororitas.js.map +1 -0
- package/dist/converters/configs/adeptus-astartes.d.ts +1 -0
- package/dist/converters/configs/adeptus-astartes.d.ts.map +1 -0
- package/dist/converters/configs/adeptus-astartes.js +1 -0
- package/dist/converters/configs/adeptus-astartes.js.map +1 -0
- package/dist/converters/configs/adeptus-custodes.d.ts +1 -0
- package/dist/converters/configs/adeptus-custodes.d.ts.map +1 -0
- package/dist/converters/configs/adeptus-custodes.js +1 -0
- package/dist/converters/configs/adeptus-custodes.js.map +1 -0
- package/dist/converters/configs/adeptus-mechanicus.d.ts +1 -0
- package/dist/converters/configs/adeptus-mechanicus.d.ts.map +1 -0
- package/dist/converters/configs/adeptus-mechanicus.js +1 -0
- package/dist/converters/configs/adeptus-mechanicus.js.map +1 -0
- package/dist/converters/configs/aeldari.d.ts +1 -0
- package/dist/converters/configs/aeldari.d.ts.map +1 -0
- package/dist/converters/configs/aeldari.js +1 -0
- package/dist/converters/configs/aeldari.js.map +1 -0
- package/dist/converters/configs/agents-of-the-imperium.d.ts +1 -0
- package/dist/converters/configs/agents-of-the-imperium.d.ts.map +1 -0
- package/dist/converters/configs/agents-of-the-imperium.js +1 -0
- package/dist/converters/configs/agents-of-the-imperium.js.map +1 -0
- package/dist/converters/configs/astra-militarum.d.ts +1 -0
- package/dist/converters/configs/astra-militarum.d.ts.map +1 -0
- package/dist/converters/configs/astra-militarum.js +1 -0
- package/dist/converters/configs/astra-militarum.js.map +1 -0
- package/dist/converters/configs/black-templars.d.ts +1 -0
- package/dist/converters/configs/black-templars.d.ts.map +1 -0
- package/dist/converters/configs/black-templars.js +1 -0
- package/dist/converters/configs/black-templars.js.map +1 -0
- package/dist/converters/configs/blood-angels.d.ts +1 -0
- package/dist/converters/configs/blood-angels.d.ts.map +1 -0
- package/dist/converters/configs/blood-angels.js +1 -0
- package/dist/converters/configs/blood-angels.js.map +1 -0
- package/dist/converters/configs/chaos-daemons.d.ts +1 -0
- package/dist/converters/configs/chaos-daemons.d.ts.map +1 -0
- package/dist/converters/configs/chaos-daemons.js +1 -0
- package/dist/converters/configs/chaos-daemons.js.map +1 -0
- package/dist/converters/configs/chaos-knights.d.ts +1 -0
- package/dist/converters/configs/chaos-knights.d.ts.map +1 -0
- package/dist/converters/configs/chaos-knights.js +1 -0
- package/dist/converters/configs/chaos-knights.js.map +1 -0
- package/dist/converters/configs/chaos-space-marines.d.ts +1 -0
- package/dist/converters/configs/chaos-space-marines.d.ts.map +1 -0
- package/dist/converters/configs/chaos-space-marines.js +1 -0
- package/dist/converters/configs/chaos-space-marines.js.map +1 -0
- package/dist/converters/configs/crimson-fists.d.ts +1 -0
- package/dist/converters/configs/crimson-fists.d.ts.map +1 -0
- package/dist/converters/configs/crimson-fists.js +1 -0
- package/dist/converters/configs/crimson-fists.js.map +1 -0
- package/dist/converters/configs/dark-angels.d.ts +1 -0
- package/dist/converters/configs/dark-angels.d.ts.map +1 -0
- package/dist/converters/configs/dark-angels.js +1 -0
- package/dist/converters/configs/dark-angels.js.map +1 -0
- package/dist/converters/configs/death-guard.d.ts +1 -0
- package/dist/converters/configs/death-guard.d.ts.map +1 -0
- package/dist/converters/configs/death-guard.js +1 -0
- package/dist/converters/configs/death-guard.js.map +1 -0
- package/dist/converters/configs/deathwatch.d.ts +1 -0
- package/dist/converters/configs/deathwatch.d.ts.map +1 -0
- package/dist/converters/configs/deathwatch.js +1 -0
- package/dist/converters/configs/deathwatch.js.map +1 -0
- package/dist/converters/configs/drukhari.d.ts +1 -0
- package/dist/converters/configs/drukhari.d.ts.map +1 -0
- package/dist/converters/configs/drukhari.js +1 -0
- package/dist/converters/configs/drukhari.js.map +1 -0
- package/dist/converters/configs/emperors-children.d.ts +1 -0
- package/dist/converters/configs/emperors-children.d.ts.map +1 -0
- package/dist/converters/configs/emperors-children.js +1 -0
- package/dist/converters/configs/emperors-children.js.map +1 -0
- package/dist/converters/configs/genestealer-cults.d.ts +1 -0
- package/dist/converters/configs/genestealer-cults.d.ts.map +1 -0
- package/dist/converters/configs/genestealer-cults.js +1 -0
- package/dist/converters/configs/genestealer-cults.js.map +1 -0
- package/dist/converters/configs/grey-knights.d.ts +1 -0
- package/dist/converters/configs/grey-knights.d.ts.map +1 -0
- package/dist/converters/configs/grey-knights.js +1 -0
- package/dist/converters/configs/grey-knights.js.map +1 -0
- package/dist/converters/configs/imperial-fists.d.ts +1 -0
- package/dist/converters/configs/imperial-fists.d.ts.map +1 -0
- package/dist/converters/configs/imperial-fists.js +1 -0
- package/dist/converters/configs/imperial-fists.js.map +1 -0
- package/dist/converters/configs/imperial-knights.d.ts +1 -0
- package/dist/converters/configs/imperial-knights.d.ts.map +1 -0
- package/dist/converters/configs/imperial-knights.js +1 -0
- package/dist/converters/configs/imperial-knights.js.map +1 -0
- package/dist/converters/configs/iron-hands.d.ts +1 -0
- package/dist/converters/configs/iron-hands.d.ts.map +1 -0
- package/dist/converters/configs/iron-hands.js +1 -0
- package/dist/converters/configs/iron-hands.js.map +1 -0
- package/dist/converters/configs/leagues-of-votann.d.ts +1 -0
- package/dist/converters/configs/leagues-of-votann.d.ts.map +1 -0
- package/dist/converters/configs/leagues-of-votann.js +1 -0
- package/dist/converters/configs/leagues-of-votann.js.map +1 -0
- package/dist/converters/configs/necrons.d.ts +1 -0
- package/dist/converters/configs/necrons.d.ts.map +1 -0
- package/dist/converters/configs/necrons.js +1 -0
- package/dist/converters/configs/necrons.js.map +1 -0
- package/dist/converters/configs/orks.d.ts +1 -0
- package/dist/converters/configs/orks.d.ts.map +1 -0
- package/dist/converters/configs/orks.js +1 -0
- package/dist/converters/configs/orks.js.map +1 -0
- package/dist/converters/configs/raven-guard.d.ts +1 -0
- package/dist/converters/configs/raven-guard.d.ts.map +1 -0
- package/dist/converters/configs/raven-guard.js +1 -0
- package/dist/converters/configs/raven-guard.js.map +1 -0
- package/dist/converters/configs/salamanders.d.ts +1 -0
- package/dist/converters/configs/salamanders.d.ts.map +1 -0
- package/dist/converters/configs/salamanders.js +1 -0
- package/dist/converters/configs/salamanders.js.map +1 -0
- package/dist/converters/configs/space-wolves.d.ts +1 -0
- package/dist/converters/configs/space-wolves.d.ts.map +1 -0
- package/dist/converters/configs/space-wolves.js +1 -0
- package/dist/converters/configs/space-wolves.js.map +1 -0
- package/dist/converters/configs/tau-empire.d.ts +1 -0
- package/dist/converters/configs/tau-empire.d.ts.map +1 -0
- package/dist/converters/configs/tau-empire.js +1 -0
- package/dist/converters/configs/tau-empire.js.map +1 -0
- package/dist/converters/configs/thousand-sons.d.ts +1 -0
- package/dist/converters/configs/thousand-sons.d.ts.map +1 -0
- package/dist/converters/configs/thousand-sons.js +1 -0
- package/dist/converters/configs/thousand-sons.js.map +1 -0
- package/dist/converters/configs/tyranids.d.ts +1 -0
- package/dist/converters/configs/tyranids.d.ts.map +1 -0
- package/dist/converters/configs/tyranids.js +1 -0
- package/dist/converters/configs/tyranids.js.map +1 -0
- package/dist/converters/configs/ultramarines.d.ts +1 -0
- package/dist/converters/configs/ultramarines.d.ts.map +1 -0
- package/dist/converters/configs/ultramarines.js +1 -0
- package/dist/converters/configs/ultramarines.js.map +1 -0
- package/dist/converters/configs/white-scars.d.ts +1 -0
- package/dist/converters/configs/white-scars.d.ts.map +1 -0
- package/dist/converters/configs/white-scars.js +1 -0
- package/dist/converters/configs/white-scars.js.map +1 -0
- package/dist/converters/configs/world-eaters.d.ts +1 -0
- package/dist/converters/configs/world-eaters.d.ts.map +1 -0
- package/dist/converters/configs/world-eaters.js +1 -0
- package/dist/converters/configs/world-eaters.js.map +1 -0
- package/dist/converters/faction-config.d.ts +1 -0
- package/dist/converters/faction-config.d.ts.map +1 -0
- package/dist/converters/faction-config.js +1 -0
- package/dist/converters/faction-config.js.map +1 -0
- package/dist/converters/id-generator.d.ts +1 -0
- package/dist/converters/id-generator.d.ts.map +1 -0
- package/dist/converters/id-generator.js +1 -0
- package/dist/converters/id-generator.js.map +1 -0
- package/dist/converters/keyword-filter.d.ts +1 -0
- package/dist/converters/keyword-filter.d.ts.map +1 -0
- package/dist/converters/keyword-filter.js +1 -0
- package/dist/converters/keyword-filter.js.map +1 -0
- package/dist/converters/stat-parser.d.ts +1 -0
- package/dist/converters/stat-parser.d.ts.map +1 -0
- package/dist/converters/stat-parser.js +1 -0
- package/dist/converters/stat-parser.js.map +1 -0
- package/dist/converters/view-selector.d.ts +1 -0
- package/dist/converters/view-selector.d.ts.map +1 -0
- package/dist/converters/view-selector.js +1 -0
- package/dist/converters/view-selector.js.map +1 -0
- package/dist/converters/weapon-dedup.d.ts +1 -0
- package/dist/converters/weapon-dedup.d.ts.map +1 -0
- package/dist/converters/weapon-dedup.js +1 -0
- package/dist/converters/weapon-dedup.js.map +1 -0
- package/dist/cruncher/attribution.d.ts +66 -0
- package/dist/cruncher/attribution.d.ts.map +1 -0
- package/dist/cruncher/attribution.js +88 -0
- package/dist/cruncher/attribution.js.map +1 -0
- package/dist/cruncher/buffs.d.ts +206 -0
- package/dist/cruncher/buffs.d.ts.map +1 -0
- package/dist/cruncher/buffs.js +150 -0
- package/dist/cruncher/buffs.js.map +1 -0
- package/dist/cruncher/engine.d.ts +50 -0
- package/dist/cruncher/engine.d.ts.map +1 -0
- package/dist/cruncher/engine.js +312 -0
- package/dist/cruncher/engine.js.map +1 -0
- package/dist/cruncher/from-dsl.d.ts +101 -0
- package/dist/cruncher/from-dsl.d.ts.map +1 -0
- package/dist/cruncher/from-dsl.js +968 -0
- package/dist/cruncher/from-dsl.js.map +1 -0
- package/dist/cruncher/from-keyword.d.ts +35 -0
- package/dist/cruncher/from-keyword.d.ts.map +1 -0
- package/dist/cruncher/from-keyword.js +159 -0
- package/dist/cruncher/from-keyword.js.map +1 -0
- package/dist/cruncher/get-buffs.d.ts +12 -0
- package/dist/cruncher/get-buffs.d.ts.map +1 -0
- package/dist/cruncher/get-buffs.js +7 -0
- package/dist/cruncher/get-buffs.js.map +1 -0
- package/dist/cruncher/index.d.ts +12 -0
- package/dist/cruncher/index.d.ts.map +1 -0
- package/dist/cruncher/index.js +12 -0
- package/dist/cruncher/index.js.map +1 -0
- package/dist/data/bundle.generated.d.ts +1 -0
- package/dist/data/bundle.generated.d.ts.map +1 -0
- package/dist/data/bundle.generated.js +2 -1
- package/dist/data/bundle.generated.js.map +1 -0
- package/dist/data/collection.d.ts +10 -0
- package/dist/data/collection.d.ts.map +1 -0
- package/dist/data/collection.js +15 -0
- package/dist/data/collection.js.map +1 -0
- package/dist/data/dataset.d.ts +132 -2
- package/dist/data/dataset.d.ts.map +1 -0
- package/dist/data/dataset.js +248 -1
- package/dist/data/dataset.js.map +1 -0
- package/dist/data/entities.d.ts +67 -2
- package/dist/data/entities.d.ts.map +1 -0
- package/dist/data/entities.js +122 -0
- package/dist/data/entities.js.map +1 -0
- package/dist/data/index.d.ts +10 -1
- package/dist/data/index.d.ts.map +1 -0
- package/dist/data/index.js +14 -1
- package/dist/data/index.js.map +1 -0
- package/dist/data/normalize.d.ts +1 -0
- package/dist/data/normalize.d.ts.map +1 -0
- package/dist/data/normalize.js +1 -0
- package/dist/data/normalize.js.map +1 -0
- package/dist/data/roster-resolve.d.ts +58 -0
- package/dist/data/roster-resolve.d.ts.map +1 -0
- package/dist/data/roster-resolve.js +82 -0
- package/dist/data/roster-resolve.js.map +1 -0
- package/dist/data/types.d.ts +4 -1
- package/dist/data/types.d.ts.map +1 -0
- package/dist/data/types.js +2 -0
- package/dist/data/types.js.map +1 -0
- package/dist/export/helpers.d.ts +33 -0
- package/dist/export/helpers.d.ts.map +1 -0
- package/dist/export/helpers.js +57 -0
- package/dist/export/helpers.js.map +1 -0
- package/dist/export/index.d.ts +22 -0
- package/dist/export/index.d.ts.map +1 -0
- package/dist/export/index.js +28 -0
- package/dist/export/index.js.map +1 -0
- package/dist/export/newrecruit-json.d.ts +3 -0
- package/dist/export/newrecruit-json.d.ts.map +1 -0
- package/dist/export/newrecruit-json.js +140 -0
- package/dist/export/newrecruit-json.js.map +1 -0
- package/dist/export/newrecruit-simple.d.ts +3 -0
- package/dist/export/newrecruit-simple.d.ts.map +1 -0
- package/dist/export/newrecruit-simple.js +76 -0
- package/dist/export/newrecruit-simple.js.map +1 -0
- package/dist/export/newrecruit-wtc.d.ts +4 -0
- package/dist/export/newrecruit-wtc.d.ts.map +1 -0
- package/dist/export/newrecruit-wtc.js +142 -0
- package/dist/export/newrecruit-wtc.js.map +1 -0
- package/dist/export/roster-json.d.ts +3 -0
- package/dist/export/roster-json.d.ts.map +1 -0
- package/dist/export/roster-json.js +8 -0
- package/dist/export/roster-json.js.map +1 -0
- package/dist/export/rosterizer.d.ts +3 -0
- package/dist/export/rosterizer.d.ts.map +1 -0
- package/dist/export/rosterizer.js +144 -0
- package/dist/export/rosterizer.js.map +1 -0
- package/dist/export/serializer.d.ts +27 -0
- package/dist/export/serializer.d.ts.map +1 -0
- package/dist/export/serializer.js +2 -0
- package/dist/export/serializer.js.map +1 -0
- package/dist/gen-conformance.d.ts +1 -0
- package/dist/gen-conformance.d.ts.map +1 -0
- package/dist/gen-conformance.js +274 -12
- package/dist/gen-conformance.js.map +1 -0
- package/dist/generated.d.ts +194 -118
- package/dist/generated.d.ts.map +1 -0
- package/dist/generated.js +1 -0
- package/dist/generated.js.map +1 -0
- package/dist/import/adapter.d.ts +4 -3
- package/dist/import/adapter.d.ts.map +1 -0
- package/dist/import/adapter.js +1 -0
- package/dist/import/adapter.js.map +1 -0
- package/dist/import/decode.d.ts +1 -0
- package/dist/import/decode.d.ts.map +1 -0
- package/dist/import/decode.js +1 -0
- package/dist/import/decode.js.map +1 -0
- package/dist/import/gw.d.ts +69 -0
- package/dist/import/gw.d.ts.map +1 -0
- package/dist/import/gw.js +245 -0
- package/dist/import/gw.js.map +1 -0
- package/dist/import/import-roster.d.ts +84 -0
- package/dist/import/import-roster.d.ts.map +1 -0
- package/dist/import/import-roster.js +207 -0
- package/dist/import/import-roster.js.map +1 -0
- package/dist/import/index.d.ts +7 -3
- package/dist/import/index.d.ts.map +1 -0
- package/dist/import/index.js +5 -1
- package/dist/import/index.js.map +1 -0
- package/dist/import/listforge.d.ts +1 -0
- package/dist/import/listforge.d.ts.map +1 -0
- package/dist/import/listforge.js +22 -2
- package/dist/import/listforge.js.map +1 -0
- package/dist/import/newrecruit-json.d.ts +31 -0
- package/dist/import/newrecruit-json.d.ts.map +1 -0
- package/dist/import/newrecruit-json.js +224 -0
- package/dist/import/newrecruit-json.js.map +1 -0
- package/dist/import/newrecruit-simple.d.ts +29 -0
- package/dist/import/newrecruit-simple.d.ts.map +1 -0
- package/dist/import/newrecruit-simple.js +200 -0
- package/dist/import/newrecruit-simple.js.map +1 -0
- package/dist/import/newrecruit-text.d.ts +51 -0
- package/dist/import/newrecruit-text.d.ts.map +1 -0
- package/dist/import/newrecruit-text.js +102 -0
- package/dist/import/newrecruit-text.js.map +1 -0
- package/dist/import/newrecruit-wtc.d.ts +36 -0
- package/dist/import/newrecruit-wtc.d.ts.map +1 -0
- package/dist/import/newrecruit-wtc.js +337 -0
- package/dist/import/newrecruit-wtc.js.map +1 -0
- package/dist/import/resolve.d.ts +3 -2
- package/dist/import/resolve.d.ts.map +1 -0
- package/dist/import/resolve.js +5 -2
- package/dist/import/resolve.js.map +1 -0
- package/dist/import/rosterizer.d.ts +70 -0
- package/dist/import/rosterizer.d.ts.map +1 -0
- package/dist/import/rosterizer.js +348 -0
- package/dist/import/rosterizer.js.map +1 -0
- package/dist/import/types.d.ts +11 -1
- package/dist/import/types.d.ts.map +1 -0
- package/dist/import/types.js +1 -0
- package/dist/import/types.js.map +1 -0
- package/dist/index.d.ts +5 -2
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -0
- package/dist/known-support-10e.d.ts +1 -0
- package/dist/known-support-10e.d.ts.map +1 -0
- package/dist/known-support-10e.js +1 -0
- package/dist/known-support-10e.js.map +1 -0
- package/dist/link-abilities.d.ts +41 -0
- package/dist/link-abilities.d.ts.map +1 -0
- package/dist/link-abilities.js +159 -0
- package/dist/link-abilities.js.map +1 -0
- package/dist/migrations/2026-weapon-keywords.d.ts +2 -0
- package/dist/migrations/2026-weapon-keywords.d.ts.map +1 -0
- package/dist/migrations/2026-weapon-keywords.js +247 -0
- package/dist/migrations/2026-weapon-keywords.js.map +1 -0
- package/dist/port-10e-faction.d.ts +1 -0
- package/dist/port-10e-faction.d.ts.map +1 -0
- package/dist/port-10e-faction.js +1 -0
- package/dist/port-10e-faction.js.map +1 -0
- package/dist/report.d.ts +1 -0
- package/dist/report.d.ts.map +1 -0
- package/dist/report.js +1 -0
- package/dist/report.js.map +1 -0
- package/dist/rube-goldberg.d.ts +3 -0
- package/dist/rube-goldberg.d.ts.map +1 -0
- package/dist/rube-goldberg.js +109 -0
- package/dist/rube-goldberg.js.map +1 -0
- package/dist/runner.d.ts +38 -0
- package/dist/runner.d.ts.map +1 -0
- package/dist/runner.js +492 -0
- package/dist/runner.js.map +1 -0
- package/dist/schema-loader.d.ts +1 -0
- package/dist/schema-loader.d.ts.map +1 -0
- package/dist/schema-loader.js +1 -0
- package/dist/schema-loader.js.map +1 -0
- package/dist/scrub-ip.d.ts +14 -0
- package/dist/scrub-ip.d.ts.map +1 -0
- package/dist/scrub-ip.js +88 -0
- package/dist/scrub-ip.js.map +1 -0
- package/dist/validate.d.ts +1 -0
- package/dist/validate.d.ts.map +1 -0
- package/dist/validate.js +2 -0
- package/dist/validate.js.map +1 -0
- package/package.json +15 -3
- package/schemas/core/roster.schema.json +19 -4
- package/schemas/core/weapon-keyword.schema.json +31 -0
- package/schemas/core/weapon.schema.json +22 -1
- package/schemas/enrichment/ability-dsl/effect.schema.json +23 -1
- package/dist/import/import-listforge.d.ts +0 -23
- package/dist/import/import-listforge.js +0 -32
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"import.js","sourceRoot":"","sources":["../../src/commands/import.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * `import` command: turn a ListForge army-list export into a 40kdc roster.\n *\n * Input may be a ListForge URL, a bare base64 segment, an already-decoded JSON\n * string, or a path to a file containing any of those (or `-`/omitted for stdin).\n * The resolved roster is validated against `roster.schema.json` before output —\n * a guard that the importer only ever emits schema-valid rosters.\n *\n * The import is lenient: unresolved entries do not fail the command (exit 0).\n * Only a decode failure or schema-invalid output is fatal (exit 1).\n */\nimport { existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { importListForge } from \"../import/index.js\";\nimport { createValidator } from \"../schema-loader.js\";\nimport type { Roster } from \"../import/index.js\";\n\nconst ROSTER_SCHEMA_ID = \"https://40kdc.dev/schemas/core/roster.schema.json\";\n\ninterface ImportOpts {\n reporter: string;\n out?: string;\n}\n\nfunction readStdin(): string {\n try {\n return readFileSync(0, \"utf8\");\n } catch {\n return \"\";\n }\n}\n\n/** Resolve the command's input source to a raw payload string. */\nfunction resolveInput(input: string | undefined): string {\n if (!input || input === \"-\") return readStdin().trim();\n if (existsSync(input)) return readFileSync(input, \"utf8\").trim();\n return input;\n}\n\nfunction formatPretty(roster: Roster): string {\n const d = roster.diagnostics;\n const lines: string[] = [];\n lines.push(`Roster: ${roster.name}`);\n lines.push(` Faction: ${roster.faction_id ?? \"(unresolved)\"}`);\n lines.push(` Detachment: ${roster.detachment_id ?? \"(none/unresolved)\"}`);\n lines.push(` Battle size: ${roster.battle_size ?? \"(unmapped)\"}`);\n lines.push(\n ` Points: computed ${roster.points.total_computed}` +\n (roster.points.total_reported !== null ? `, reported ${roster.points.total_reported}` : \"\") +\n (roster.points.declared_limit !== null ? `, limit ${roster.points.declared_limit}` : \"\"),\n );\n lines.push(` Units (${roster.units.length}):`);\n for (const u of roster.units) {\n const mark = u.ref.resolved ? \"✓\" : \"✗\";\n const id = u.ref.resolved ? u.ref.id : `${u.ref.raw_name} → unresolved`;\n const extras: string[] = [];\n if (u.is_warlord) extras.push(\"warlord\");\n if (u.enhancement) extras.push(`enh:${u.enhancement.resolved ? u.enhancement.id : \"?\"}`);\n if (u.leader_attachment) extras.push(`leads:${u.leader_attachment.bodyguard_ref.id}?`);\n const suffix = extras.length ? ` [${extras.join(\", \")}]` : \"\";\n lines.push(` ${mark} ${id} ×${u.model_count}${u.points !== null ? ` (${u.points}pts)` : \"\"}${suffix}`);\n }\n lines.push(\n ` Resolved: ${d.resolved_units} units / ${d.resolved_weapons} weapons; ` +\n `unresolved: ${d.unresolved_units} units / ${d.unresolved_weapons} weapons`,\n );\n if (d.warnings.length) {\n lines.push(` Warnings (${d.warnings.length}):`);\n for (const w of d.warnings) {\n lines.push(` - [${w.code}]${w.raw_name ? ` \"${w.raw_name}\":` : \"\"} ${w.message}`);\n }\n }\n return lines.join(\"\\n\");\n}\n\nexport async function importCommand(\n input: string | undefined,\n opts: ImportOpts,\n): Promise<void> {\n const payload = resolveInput(input);\n if (!payload) {\n console.error(\"import: no input (provide a URL/base64/JSON argument, a file path, or pipe via stdin)\");\n process.exit(1);\n }\n\n let roster: Roster;\n try {\n roster = importListForge(payload);\n } catch (err) {\n console.error(`import: failed to decode/parse payload: ${(err as Error).message}`);\n process.exit(1);\n }\n\n // Guard: our own output must be schema-valid.\n const validate = createValidator().getSchema(ROSTER_SCHEMA_ID);\n if (!validate) {\n console.error(`import: roster schema not found (${ROSTER_SCHEMA_ID})`);\n process.exit(1);\n }\n if (!validate(roster)) {\n console.error(\"import: produced roster failed schema validation:\");\n console.error(JSON.stringify(validate.errors, null, 2));\n process.exit(1);\n }\n\n const json = JSON.stringify(roster, null, 2);\n if (opts.out) {\n writeFileSync(opts.out, json + \"\\n\", \"utf8\");\n console.error(`Wrote roster → ${opts.out}`);\n }\n\n if (opts.reporter === \"pretty\") {\n console.log(formatPretty(roster));\n } else if (!opts.out) {\n console.log(json);\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"translate.d.ts","sourceRoot":"","sources":["../../src/commands/translate.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA6RH,wBAAsB,gBAAgB,CACpC,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC,CAsBf"}
|
|
@@ -132,10 +132,13 @@ function translateEffectInline(e) {
|
|
|
132
132
|
return `deal ${m.amount ?? m.amount_table ? "variable" : "?"} mortal wounds to ${target}`;
|
|
133
133
|
case "feel-no-pain":
|
|
134
134
|
return `${target} gains Feel No Pain ${m.threshold}+`;
|
|
135
|
-
case "keyword-grant":
|
|
136
|
-
|
|
135
|
+
case "keyword-grant": {
|
|
136
|
+
// Grants come as singular `keyword` or the (dominant) `keywords` array.
|
|
137
|
+
const kw = Array.isArray(m.keywords) ? m.keywords.join(", ") : (m.keyword ?? "keywords");
|
|
138
|
+
return `${target}'s ${m.weapon_type ?? "all"} weapons gain ${kw}`;
|
|
139
|
+
}
|
|
137
140
|
case "ability-grant":
|
|
138
|
-
return `${target} gains ${formatGrantType(m.grant_type)}`;
|
|
141
|
+
return `${target} gains ${formatGrantType((m.grant_type ?? m.ability_id))}`;
|
|
139
142
|
case "movement-modifier":
|
|
140
143
|
return `${target} gains ${m.move_type}${m.value ? ` ${m.value}"` : ""}`;
|
|
141
144
|
case "damage-reduction":
|
|
@@ -191,7 +194,9 @@ function formatTarget(t) {
|
|
|
191
194
|
return t.replace(/-/g, " ");
|
|
192
195
|
}
|
|
193
196
|
function formatGrantType(g) {
|
|
194
|
-
|
|
197
|
+
// ability-grant carries either `grant_type` or `ability_id`; an unauthored
|
|
198
|
+
// stub may carry neither. Don't crash the whole translation on a missing key.
|
|
199
|
+
return g ? g.replace(/-/g, " ") : "an ability";
|
|
195
200
|
}
|
|
196
201
|
function formatComparison(comp, threshold) {
|
|
197
202
|
const thStr = typeof threshold === "string" ? threshold : `${threshold}`;
|
|
@@ -236,3 +241,4 @@ export async function translateCommand(path) {
|
|
|
236
241
|
}
|
|
237
242
|
console.log(`\n── ${abilities.length} abilities translated ──`);
|
|
238
243
|
}
|
|
244
|
+
//# sourceMappingURL=translate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"translate.js","sourceRoot":"","sources":["../../src/commands/translate.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Translates ability DSL entries into plain English descriptions.\n *\n * Recursively walks the effect/condition tree and produces human-readable\n * text purely from the structured data — no external text sources needed.\n */\n\nimport { readFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\n\n// ─── Types (minimal, matching schema shapes) ─────────────────────────\n\ninterface Condition {\n type?: string;\n operator?: string;\n operands?: Condition[];\n parameters?: Record<string, unknown>;\n negated?: boolean;\n}\n\ninterface Effect {\n type: string;\n target?: string;\n modifier?: Record<string, unknown>;\n condition?: Condition;\n effect?: Effect;\n steps?: Effect[];\n options?: (Effect & { name?: string; requirement?: Record<string, unknown>; choice_label?: string })[];\n choice_label?: string;\n dice?: string;\n threshold?: number | string;\n comparison?: string;\n on_success?: Effect | null;\n on_fail?: Effect | null;\n pool?: { count: number; die: string };\n max_activations?: number;\n}\n\ninterface Ability {\n ability_id: string;\n name: string;\n ability_type?: string;\n behavior?: string;\n detachment_id?: string | null;\n faction_id?: string | null;\n unit_ids?: string[];\n effect: Effect;\n scope?: { range: string; duration: string; range_inches?: number };\n}\n\n// ─── Condition translator ────────────────────────────────────────────\n\nfunction translateCondition(c: Condition): string {\n const negate = c.negated ? \"not \" : \"\";\n\n // Compound conditions\n if (c.operator === \"and\" && c.operands) {\n const parts = c.operands.map(translateCondition);\n return parts.join(\" AND \");\n }\n if (c.operator === \"or\" && c.operands) {\n const parts = c.operands.map(translateCondition);\n return parts.join(\" OR \");\n }\n if (c.operator === \"not\" && c.operands) {\n return `NOT (${c.operands.map(translateCondition).join(\", \")})`;\n }\n\n const p = c.parameters ?? {};\n\n switch (c.type) {\n case \"phase-is\":\n return `${negate}during the ${p.phase} phase`;\n case \"timing-is\":\n return `${negate}at ${formatTiming(p.timing as string)}`;\n case \"player-turn-is\":\n return `${negate}in ${p.turn === \"your-turn\" ? \"your\" : p.turn === \"opponent-turn\" ? \"opponent's\" : \"either player's\"} turn`;\n case \"charged-this-turn\":\n return `${negate}unit charged this turn`;\n case \"advanced-this-turn\":\n return `${negate}unit advanced this turn`;\n case \"remained-stationary\":\n return `${negate}unit remained stationary`;\n case \"unit-below-starting-strength\":\n return `${negate}target is below starting strength`;\n case \"unit-below-half-strength\":\n return `${negate}target is below half strength`;\n case \"unit-has-keyword\":\n return `${negate}unit has \"${p.keyword}\"`;\n case \"target-has-keyword\":\n return `${negate}target has \"${p.keyword}\"`;\n case \"model-is-leader\":\n return `${negate}model is leading a unit`;\n case \"is-attached\":\n return `${negate}attached to a ${p.keyword ?? \"\"} unit`;\n case \"attack-is-type\":\n return `${negate}for ${p.attack_type} attacks`;\n case \"is-battle-shocked\":\n return `${negate}unit is battle-shocked`;\n case \"has-lost-wounds\":\n return `${negate}model has lost wounds`;\n case \"opponent-unit-within-range\":\n return `${negate}enemy unit within ${p.range === \"engagement\" ? \"engagement range\" : p.range + '\"'}`;\n case \"unit-within-range-of\":\n return `${negate}within ${p.range}\" of ${p.target_type ?? \"target\"}${p.keyword ? ` (${p.keyword})` : \"\"}`;\n case \"within-range-of-objective\":\n return `${negate}within range of an objective`;\n case \"controls-objective\":\n return `${negate}controlling an objective`;\n case \"has-fought-this-phase\":\n return `${negate}has fought this phase`;\n case \"destroyed-by-attack-type\":\n return `${negate}destroyed by ${p.attack_type} attack`;\n default:\n return `${negate}[${c.type ?? \"unknown\"}]`;\n }\n}\n\nfunction formatTiming(t: string): string {\n return t.replace(/-/g, \" \");\n}\n\n// ─── Effect translator ───────────────────────────────────────────────\n\nfunction translateEffect(e: Effect, depth: number = 0): string {\n const indent = \" \".repeat(depth);\n const arrow = depth > 0 ? \"→ \" : \"\";\n\n switch (e.type) {\n case \"conditional\":\n return (\n `${indent}If ${translateCondition(e.condition!)}:\\n` +\n translateEffect(e.effect!, depth + 1)\n );\n\n case \"sequence\":\n return e\n .steps!.map((s) => translateEffect(s, depth))\n .join(\"\\n\");\n\n case \"choice\":\n return (\n `${indent}${arrow}Choose one${e.choice_label ? ` (${e.choice_label})` : \"\"}:\\n` +\n e\n .options!.map((o, i) => `${indent} ${i + 1}. ${translateEffectInline(o)}`)\n .join(\"\\n\")\n );\n\n case \"dice-gated\": {\n const comp = formatComparison(e.comparison ?? \"gte\", e.threshold!);\n const success = e.on_success\n ? translateEffectInline(e.on_success)\n : \"nothing\";\n const fail = e.on_fail\n ? `, otherwise ${translateEffectInline(e.on_fail)}`\n : \"\";\n return `${indent}${arrow}Roll ${e.dice}: on ${comp}, ${success}${fail}`;\n }\n\n case \"dice-pool-allocation\": {\n const poolStr = `${e.pool!.count}${e.pool!.die}`;\n const lines = [`${indent}${arrow}Roll ${poolStr} (max ${e.max_activations} activations):`];\n for (const opt of e.options!) {\n const req = opt.requirement!;\n lines.push(\n `${indent} - ${opt.name}: need ${req.type} of ${req.min_value}+ → ${translateEffectInline(opt.effect!)}`\n );\n }\n return lines.join(\"\\n\");\n }\n\n default:\n return `${indent}${arrow}${translateEffectInline(e)}`;\n }\n}\n\n/** Single-line translation for leaf effects. */\nfunction translateEffectInline(e: Effect): string {\n const m = e.modifier ?? {};\n const target = formatTarget(e.target);\n\n switch (e.type) {\n case \"stat-modifier\": {\n const op = m.operation === \"add\" ? \"+\" : m.operation === \"subtract\" ? \"-\" : `${m.operation} `;\n const scope = m.attack_type ? ` (${m.attack_type})` : \"\";\n return `${op}${m.value} ${m.stat}${scope} for ${target}`;\n }\n case \"roll-modifier\": {\n const op = m.operation === \"add\" ? \"+\" : \"-\";\n return `${op}${m.value} to ${m.roll} rolls for ${target}`;\n }\n case \"re-roll\":\n return `re-roll ${m.roll}${m.value ? ` (${m.value}s)` : \"\"} for ${target}`;\n case \"mortal-wounds\":\n return `deal ${m.amount ?? m.amount_table ? \"variable\" : \"?\"} mortal wounds to ${target}`;\n case \"feel-no-pain\":\n return `${target} gains Feel No Pain ${m.threshold}+`;\n case \"keyword-grant\": {\n // Grants come as singular `keyword` or the (dominant) `keywords` array.\n const kw = Array.isArray(m.keywords) ? m.keywords.join(\", \") : (m.keyword ?? \"keywords\");\n return `${target}'s ${m.weapon_type ?? \"all\"} weapons gain ${kw}`;\n }\n case \"ability-grant\":\n return `${target} gains ${formatGrantType((m.grant_type ?? m.ability_id) as string | undefined)}`;\n case \"movement-modifier\":\n return `${target} gains ${m.move_type}${m.value ? ` ${m.value}\"` : \"\"}`;\n case \"damage-reduction\":\n return `reduce incoming damage to ${target} by ${m.amount}`;\n case \"resurrection\":\n return `return ${m.count ?? 1} model(s) to ${target} with ${m.wounds_remaining ?? \"full\"} wounds`;\n case \"model-destruction\":\n return `destroy ${m.count} non-leader model(s) from ${target}`;\n case \"cp-gain\":\n return `gain ${m.amount} CP`;\n case \"cp-refund\":\n return `refund ${m.amount} CP`;\n case \"resource-gain\":\n return `gain ${m.amount} to ${m.pool_id}`;\n case \"resource-spend\":\n return `spend ${m.amount} from ${m.pool_id}`;\n case \"invulnerable-save\":\n return `${target} gains ${m.value}+ invulnerable save`;\n case \"leadership-modifier\":\n return `force battle-shock test on ${target}`;\n case \"fight-on-death\":\n return `${target} fights on death`;\n case \"shoot-on-death\":\n return `${target} shoots on death`;\n case \"fight-first\":\n return `${target} fights first`;\n case \"fight-last\":\n return `${target} fights last`;\n case \"deep-strike\":\n return `${target} can deep strike`;\n case \"fallback-and-act\":\n return `${target} can fall back and act`;\n case \"attack-restriction\":\n return `${target}: ${m.restriction_type ?? \"restriction\"} (max ${m.max_models ?? \"?\"} models)`;\n case \"objective-control-modifier\":\n return `modify OC of ${target} by ${m.value}`;\n\n // Container types — recurse\n case \"conditional\":\n return `if ${translateCondition(e.condition!)}: ${translateEffectInline(e.effect!)}`;\n case \"sequence\":\n return e.steps!.map(translateEffectInline).join(\"; \");\n case \"dice-gated\": {\n const comp = formatComparison(e.comparison ?? \"gte\", e.threshold!);\n return `roll ${e.dice} (${comp}): ${e.on_success ? translateEffectInline(e.on_success) : \"nothing\"}`;\n }\n\n default:\n return `[${e.type}]`;\n }\n}\n\nfunction formatTarget(t?: string): string {\n if (!t) return \"target\";\n return t.replace(/-/g, \" \");\n}\n\nfunction formatGrantType(g: string | undefined): string {\n // ability-grant carries either `grant_type` or `ability_id`; an unauthored\n // stub may carry neither. Don't crash the whole translation on a missing key.\n return g ? g.replace(/-/g, \" \") : \"an ability\";\n}\n\nfunction formatComparison(comp: string, threshold: number | string): string {\n const thStr = typeof threshold === \"string\" ? threshold : `${threshold}`;\n switch (comp) {\n case \"gte\": return `${thStr}+`;\n case \"lte\": return `${thStr} or less`;\n case \"gt\": return `greater than ${thStr}`;\n case \"lt\": return `less than ${thStr}`;\n case \"eq\": return `exactly ${thStr}`;\n default: return `${thStr}+`;\n }\n}\n\n// ─── Scope translator ────────────────────────────────────────────────\n\nfunction translateScope(s?: { range: string; duration: string; range_inches?: number }): string {\n if (!s) return \"\";\n const range = s.range.replace(/-/g, \" \");\n const duration = s.duration.replace(/-/g, \" \");\n return `Scope: ${range}${s.range_inches ? ` (${s.range_inches}\")` : \"\"}. Duration: ${duration}.`;\n}\n\n// ─── Main command ────────────────────────────────────────────────────\n\nexport async function translateCommand(\n path?: string\n): Promise<void> {\n const filePath = resolve(\n process.cwd(),\n path ?? \"../data/enrichment/world-eaters/abilities.json\"\n );\n const abilities: Ability[] = JSON.parse(readFileSync(filePath, \"utf-8\"));\n\n for (const a of abilities) {\n const meta: string[] = [];\n if (a.ability_type) meta.push(a.ability_type);\n if (a.behavior) meta.push(a.behavior);\n if (a.detachment_id) meta.push(`detachment: ${a.detachment_id}`);\n if (a.unit_ids?.length) meta.push(`units: ${a.unit_ids.join(\", \")}`);\n\n console.log(`\\n═══ ${a.name} [${a.ability_id}] ═══`);\n if (meta.length) console.log(` ${meta.join(\" | \")}`);\n console.log(translateEffect(a.effect));\n const scope = translateScope(a.scope);\n if (scope) console.log(scope);\n }\n\n console.log(`\\n── ${abilities.length} abilities translated ──`);\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-all.d.ts","sourceRoot":"","sources":["../../src/commands/validate-all.ts"],"names":[],"mappings":"AAKA,wBAAsB,kBAAkB,CAAC,IAAI,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAmBlF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-all.js","sourceRoot":"","sources":["../../src/commands/validate-all.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAqB,MAAM,cAAc,CAAC;AAG/D,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,IAA0B;IACjE,MAAM,GAAG,GAAG,eAAe,EAAE,CAAC;IAE9B,MAAM,UAAU,GAAG,MAAM,aAAa,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;IAC9D,MAAM,gBAAgB,GAAG,MAAM,aAAa,CAAC,GAAG,EAAE,sBAAsB,CAAC,CAAC;IAE1E,MAAM,QAAQ,GAAqB;QACjC,UAAU,EAAE,UAAU,CAAC,UAAU,GAAG,gBAAgB,CAAC,UAAU;QAC/D,UAAU,EAAE,UAAU,CAAC,UAAU,GAAG,gBAAgB,CAAC,UAAU;QAC/D,MAAM,EAAE,UAAU,CAAC,MAAM,GAAG,gBAAgB,CAAC,MAAM;QACnD,MAAM,EAAE,UAAU,CAAC,MAAM,GAAG,gBAAgB,CAAC,MAAM;QACnD,MAAM,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,GAAG,gBAAgB,CAAC,MAAM,CAAC;KAC3D,CAAC;IAEF,MAAM,MAAM,GAAG,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAwB,CAAC,CAAC;IACrE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACpB,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC","sourcesContent":["import { createValidator } from \"../schema-loader.js\";\nimport { validateFiles } from \"../validate.js\";\nimport { formatReport, type ReporterMode } from \"../report.js\";\nimport type { ValidationResult } from \"../validate.js\";\n\nexport async function validateAllCommand(opts: { reporter: string }): Promise<void> {\n const ajv = createValidator();\n\n const coreResult = await validateFiles(ajv, \"core/**/*.json\");\n const enrichmentResult = await validateFiles(ajv, \"enrichment/**/*.json\");\n\n const combined: ValidationResult = {\n totalFiles: coreResult.totalFiles + enrichmentResult.totalFiles,\n totalItems: coreResult.totalItems + enrichmentResult.totalItems,\n passed: coreResult.passed + enrichmentResult.passed,\n failed: coreResult.failed + enrichmentResult.failed,\n errors: [...coreResult.errors, ...enrichmentResult.errors],\n };\n\n const output = formatReport(combined, opts.reporter as ReporterMode);\n console.log(output);\n if (combined.failed > 0) {\n process.exit(1);\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-core.d.ts","sourceRoot":"","sources":["../../src/commands/validate-core.ts"],"names":[],"mappings":"AAIA,wBAAsB,mBAAmB,CAAC,IAAI,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAQnF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-core.js","sourceRoot":"","sources":["../../src/commands/validate-core.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAqB,MAAM,cAAc,CAAC;AAE/D,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,IAA0B;IAClE,MAAM,GAAG,GAAG,eAAe,EAAE,CAAC;IAC9B,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;IAC1D,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,QAAwB,CAAC,CAAC;IACnE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACpB,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC","sourcesContent":["import { createValidator } from \"../schema-loader.js\";\nimport { validateFiles } from \"../validate.js\";\nimport { formatReport, type ReporterMode } from \"../report.js\";\n\nexport async function validateCoreCommand(opts: { reporter: string }): Promise<void> {\n const ajv = createValidator();\n const result = await validateFiles(ajv, \"core/**/*.json\");\n const output = formatReport(result, opts.reporter as ReporterMode);\n console.log(output);\n if (result.failed > 0) {\n process.exit(1);\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-enrichment.d.ts","sourceRoot":"","sources":["../../src/commands/validate-enrichment.ts"],"names":[],"mappings":"AAIA,wBAAsB,yBAAyB,CAAC,IAAI,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAQzF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-enrichment.js","sourceRoot":"","sources":["../../src/commands/validate-enrichment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAqB,MAAM,cAAc,CAAC;AAE/D,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAAC,IAA0B;IACxE,MAAM,GAAG,GAAG,eAAe,EAAE,CAAC;IAC9B,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,GAAG,EAAE,sBAAsB,CAAC,CAAC;IAChE,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,QAAwB,CAAC,CAAC;IACnE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACpB,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC","sourcesContent":["import { createValidator } from \"../schema-loader.js\";\nimport { validateFiles } from \"../validate.js\";\nimport { formatReport, type ReporterMode } from \"../report.js\";\n\nexport async function validateEnrichmentCommand(opts: { reporter: string }): Promise<void> {\n const ajv = createValidator();\n const result = await validateFiles(ajv, \"enrichment/**/*.json\");\n const output = formatReport(result, opts.reporter as ReporterMode);\n console.log(output);\n if (result.failed > 0) {\n process.exit(1);\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"convert-faction.d.ts","sourceRoot":"","sources":["../src/convert-faction.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAUH,OAAO,EAAE,KAAK,aAAa,EAAkC,MAAM,gCAAgC,CAAC;AAGpG,OAAO,sCAAsC,CAAC;AAC9C,OAAO,2CAA2C,CAAC;AACnD,OAAO,uCAAuC,CAAC;AAC/C,OAAO,0CAA0C,CAAC;AAClD,OAAO,2CAA2C,CAAC;AACnD,OAAO,kCAAkC,CAAC;AAC1C,OAAO,2CAA2C,CAAC;AACnD,OAAO,sCAAsC,CAAC;AAC9C,OAAO,uCAAuC,CAAC;AAC/C,OAAO,qCAAqC,CAAC;AAC7C,OAAO,0CAA0C,CAAC;AAClD,OAAO,0CAA0C,CAAC;AAClD,OAAO,gDAAgD,CAAC;AACxD,OAAO,4CAA4C,CAAC;AACpD,OAAO,oCAAoC,CAAC;AAC5C,OAAO,kCAAkC,CAAC;AAC1C,OAAO,iCAAiC,CAAC;AACzC,OAAO,uCAAuC,CAAC;AAC/C,OAAO,8BAA8B,CAAC;AACtC,OAAO,iCAAiC,CAAC;AACzC,OAAO,6CAA6C,CAAC;AACrD,OAAO,yCAAyC,CAAC;AACjD,OAAO,0CAA0C,CAAC;AAClD,OAAO,sCAAsC,CAAC;AAC9C,OAAO,qCAAqC,CAAC;AAC7C,OAAO,sCAAsC,CAAC;AAC9C,OAAO,wCAAwC,CAAC;AAChD,OAAO,oCAAoC,CAAC;AAC5C,OAAO,sCAAsC,CAAC;AAC9C,OAAO,wCAAwC,CAAC;AAChD,OAAO,uCAAuC,CAAC;AAC/C,OAAO,oCAAoC,CAAC;AAC5C,OAAO,qCAAqC,CAAC;AAC7C,OAAO,qCAAqC,CAAC;AAC7C,OAAO,qCAAqC,CAAC;AAqJ7C,wBAAgB,cAAc,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAgb1D"}
|
package/dist/convert-faction.js
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"convert-faction.js","sourceRoot":"","sources":["../src/convert-faction.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Generic faction converter: army-assist → 40kdc-data format.\n *\n * Usage: npx tsx tools/src/convert-faction.ts <faction-id>\n * Example: npx tsx tools/src/convert-faction.ts emperors-children\n *\n * Faction configs are registered via side-effect imports from ./converters/configs/.\n */\n\nimport { readFileSync, writeFileSync, mkdirSync } from \"node:fs\";\nimport { resolve, dirname } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { nameToId, parseStratagemType, parsePlayerTurn, mapPhases } from \"./converters/id-generator.js\";\nimport { parseMove, parseTargetNumber, parseIntStat, parseInvuln } from \"./converters/stat-parser.js\";\nimport { findFactionViewIndex, getViewEntries, getPointsForView, splitIntoViews, type SourceAbility } from \"./converters/view-selector.js\";\nimport { buildWeaponRegistry, type SourceWargear } from \"./converters/weapon-dedup.js\";\nimport { getKeywordsForFaction, type SourceKeyword } from \"./converters/keyword-filter.js\";\nimport { type FactionConfig, getFactionConfig, listFactions } from \"./converters/faction-config.js\";\n\n// Register all faction configs\nimport \"./converters/configs/world-eaters.js\";\nimport \"./converters/configs/emperors-children.js\";\nimport \"./converters/configs/chaos-knights.js\";\nimport \"./converters/configs/imperial-knights.js\";\nimport \"./converters/configs/leagues-of-votann.js\";\nimport \"./converters/configs/drukhari.js\";\nimport \"./converters/configs/genestealer-cults.js\";\nimport \"./converters/configs/grey-knights.js\";\nimport \"./converters/configs/thousand-sons.js\";\nimport \"./converters/configs/death-guard.js\";\nimport \"./converters/configs/adeptus-custodes.js\";\nimport \"./converters/configs/adepta-sororitas.js\";\nimport \"./converters/configs/agents-of-the-imperium.js\";\nimport \"./converters/configs/adeptus-mechanicus.js\";\nimport \"./converters/configs/tau-empire.js\";\nimport \"./converters/configs/tyranids.js\";\nimport \"./converters/configs/necrons.js\";\nimport \"./converters/configs/chaos-daemons.js\";\nimport \"./converters/configs/orks.js\";\nimport \"./converters/configs/aeldari.js\";\nimport \"./converters/configs/chaos-space-marines.js\";\nimport \"./converters/configs/astra-militarum.js\";\nimport \"./converters/configs/adeptus-astartes.js\";\nimport \"./converters/configs/blood-angels.js\";\nimport \"./converters/configs/dark-angels.js\";\nimport \"./converters/configs/space-wolves.js\";\nimport \"./converters/configs/black-templars.js\";\nimport \"./converters/configs/deathwatch.js\";\nimport \"./converters/configs/ultramarines.js\";\nimport \"./converters/configs/imperial-fists.js\";\nimport \"./converters/configs/crimson-fists.js\";\nimport \"./converters/configs/iron-hands.js\";\nimport \"./converters/configs/raven-guard.js\";\nimport \"./converters/configs/salamanders.js\";\nimport \"./converters/configs/white-scars.js\";\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\nconst ROOT = resolve(__dirname, \"../..\");\nconst SOURCE = resolve(process.env.HOME!, \"army-assist/src/assets/json\");\nconst GAME_VERSION = { edition: \"10th\", dataslate: \"2025-q3\" };\n\n// ─── Source data types ───────────────────────────────────────────────\n\ninterface SourceDatasheet {\n id: string;\n name: string;\n faction_id: string;\n loadout: string;\n transport: string;\n role: string;\n damaged_w: string;\n damaged_description: string;\n}\n\ninterface SourceModel {\n datasheet_id: string;\n line: string;\n name: string;\n M: string;\n T: string;\n Sv: string;\n inv_sv: string;\n inv_sv_descr: string;\n W: string;\n Ld: string;\n OC: string;\n base_size: string;\n base_size_descr: string;\n}\n\ninterface SourcePoints {\n datasheet_id: string;\n models: string;\n cost: string;\n}\n\ninterface SourceLeader {\n leader_id: string;\n attached_id: string;\n}\n\ninterface SourceEnhancement {\n id: string;\n name: string;\n faction_id: string;\n cost: string;\n detachment: string;\n phases: string[];\n}\n\ninterface SourceStratagem {\n id: string;\n name: string;\n faction_id: string;\n type: string;\n cp_cost: string;\n turn: string;\n phase: string;\n detachment: string;\n phases: string[];\n}\n\ninterface SourceDetachmentAbility {\n name: string;\n faction_id: string;\n detachment: string;\n phases: string[];\n}\n\n// ─── Helpers ─────────────────────────────────────────────────────────\n\nfunction readJSON<T>(filename: string): T {\n return JSON.parse(readFileSync(resolve(SOURCE, filename), \"utf-8\"));\n}\n\nfunction writeOutput(relPath: string, data: unknown): void {\n const outPath = resolve(ROOT, relPath);\n writeFileSync(outPath, JSON.stringify(data, null, 2) + \"\\n\");\n console.log(` ✓ ${relPath} (${Array.isArray(data) ? data.length : 1} entries)`);\n}\n\n/** Determine unit role from keywords and abilities. */\nfunction deriveRole(\n keywords: string[],\n abilities: SourceAbility[],\n name: string\n): string | undefined {\n const kw = new Set(keywords.map((k) => k.toLowerCase()));\n if (kw.has(\"epic hero\")) return \"epic-hero\";\n\n if (kw.has(\"character\")) return \"character\";\n const hasLeader = abilities.some(\n (a) => a.type === \"Core\" && a.name === \"Leader\"\n );\n if (hasLeader) return \"character\";\n\n if (kw.has(\"battleline\")) return \"battleline\";\n\n if (\n name.toLowerCase().includes(\"rhino\") ||\n kw.has(\"dedicated transport\")\n )\n return \"dedicated-transport\";\n\n return undefined;\n}\n\n/** Parse base size string. \"32mm\" → { shape: \"round\", diameter: 32 } */\nfunction parseBaseSize(\n s: string\n): { shape: string; diameter?: number; width?: number; length?: number } | undefined {\n if (!s || s.trim() === \"\") return undefined;\n const round = s.match(/(\\d+)\\s*mm/i);\n if (round) return { shape: \"round\", diameter: parseInt(round[1], 10) };\n const oval = s.match(/(\\d+)\\s*x\\s*(\\d+)/i);\n if (oval)\n return {\n shape: \"oval\",\n width: parseInt(oval[1], 10),\n length: parseInt(oval[2], 10),\n };\n return undefined;\n}\n\n/** Parse transport capacity from transport text. */\nfunction parseTransport(\n s: string\n): { capacity: number; keyword_restrictions?: string[]; exclusion_keywords?: string[] } | undefined {\n if (!s || s.trim() === \"\") return undefined;\n // Match \"capacity of N\" or \"N <FACTION> INFANTRY\"\n const capMatch = s.match(/capacity\\s*(?:of\\s*)?(\\d+)/i) || s.match(/(\\d+)\\s+\\S[\\S\\s]*?\\s+(?:infantry|model)/i);\n if (!capMatch) return undefined;\n const capacity = parseInt(capMatch[1], 10);\n const result: { capacity: number; keyword_restrictions?: string[]; exclusion_keywords?: string[] } = { capacity };\n\n if (/jump pack/i.test(s) && /cannot/i.test(s)) {\n result.exclusion_keywords = [\"Jump Pack\"];\n }\n return result;\n}\n\n// ─── Main conversion ─────────────────────────────────────────────────\n\nexport function convertFaction(config: FactionConfig): void {\n const { sourceFactionId, factionId, factionName, factionAbilityName } = config;\n\n console.log(`Converting ${factionName} (${sourceFactionId} → ${factionId})...`);\n console.log(\"Loading source data from army-assist...\");\n\n const datasheets = readJSON<SourceDatasheet[]>(\"Datasheets.json\");\n const allModels = readJSON<SourceModel[]>(\"Datasheets_models.json\");\n const allWargear = readJSON<SourceWargear[]>(\"Datasheets_wargear.json\");\n const allAbilities = readJSON<SourceAbility[]>(\"Datasheets_abilities.json\");\n const allKeywords = readJSON<SourceKeyword[]>(\"Datasheets_keywords.json\");\n const allPoints = readJSON<SourcePoints[]>(\"Datasheets_points.json\");\n const allLeaders = readJSON<SourceLeader[]>(\"Datasheets_leader.json\");\n const enhancements = readJSON<SourceEnhancement[]>(\"Enhancements.json\");\n const stratagems = readJSON<SourceStratagem[]>(\"Stratagems.json\");\n const detachmentAbilities = readJSON<SourceDetachmentAbility[]>(\n \"Detachment_abilities.json\"\n );\n\n // Filter to target faction, skip datasheets with no model data (metadata entries)\n const modelDatasheetIds = new Set(allModels.map((m) => m.datasheet_id));\n const factionDatasheets = datasheets.filter(\n (d) => d.faction_id === sourceFactionId && modelDatasheetIds.has(d.id)\n );\n const factionIds = new Set(factionDatasheets.map((d) => d.id));\n const idToName = new Map(factionDatasheets.map((d) => [d.id, d.name]));\n\n console.log(`Found ${factionDatasheets.length} ${factionName} datasheets\\n`);\n\n // ─── Determine view indices for shared units ───\n const viewIndices = new Map<string, number>();\n for (const ds of factionDatasheets) {\n const dsAbilities = allAbilities.filter(\n (a) => a.datasheet_id === ds.id\n );\n viewIndices.set(ds.id, findFactionViewIndex(dsAbilities, factionAbilityName));\n }\n\n // ─── Build units ───\n console.log(\"Converting units...\");\n const units: Record<string, unknown>[] = [];\n\n const unitWargearMap = new Map<string, SourceWargear[]>();\n const unitAbilityNames = new Map<string, string[]>();\n\n for (const ds of factionDatasheets) {\n const viewIdx = viewIndices.get(ds.id)!;\n\n // Models\n const dsModels = allModels.filter((m) => m.datasheet_id === ds.id);\n const viewModels = getViewEntries(dsModels, viewIdx);\n\n // Abilities (for role derivation and ability name collection)\n const dsAbilities = allAbilities.filter(\n (a) => a.datasheet_id === ds.id\n );\n const viewAbilities = getViewEntries(dsAbilities, viewIdx);\n\n const abilityNames = viewAbilities\n .filter((a) => a.type !== \"Faction\")\n .map((a) => a.name);\n unitAbilityNames.set(ds.id, [...new Set(abilityNames)]);\n\n // Keywords — use faction-aware filtering for shared units\n const dsKeywords = allKeywords.filter(\n (k) => k.datasheet_id === ds.id\n );\n const { factionKeywords, regularKeywords } = getKeywordsForFaction(\n dsKeywords,\n factionName\n );\n\n // Points — select the correct view for shared units\n const allDsPoints = allPoints.filter((p) => p.datasheet_id === ds.id);\n const dsAbilityViews = splitIntoViews(\n allAbilities.filter((a) => a.datasheet_id === ds.id)\n );\n const numViews = dsAbilityViews.length;\n const viewPoints = getPointsForView(allDsPoints, viewIdx, numViews);\n const dsPoints = viewPoints\n .map((p) => ({\n models: parseInt(p.models, 10),\n cost: parseInt(p.cost, 10),\n }))\n .sort((a, b) => a.models - b.models);\n\n // Wargear for this unit's view\n const dsWargear = allWargear.filter(\n (w) => w.datasheet_id === ds.id\n );\n const viewWargear = getViewEntries(dsWargear, viewIdx);\n unitWargearMap.set(ds.id, viewWargear);\n\n // Build stat profiles\n const profiles = viewModels.map((m) => {\n const profile: Record<string, unknown> = {\n name: m.name,\n M: parseMove(m.M),\n T: parseIntStat(m.T),\n W: parseIntStat(m.W),\n Sv: parseTargetNumber(m.Sv)!,\n invuln_sv: parseInvuln(m.inv_sv),\n Ld: parseTargetNumber(m.Ld)!,\n OC: parseIntStat(m.OC),\n };\n return profile;\n });\n\n const role = deriveRole(regularKeywords, viewAbilities, ds.name);\n const baseSize = parseBaseSize(\n viewModels[0]?.base_size ?? \"\"\n );\n const transport = parseTransport(ds.transport);\n\n const modelMin = dsPoints.length > 0 ? dsPoints[0].models : 1;\n const modelMax =\n dsPoints.length > 0 ? dsPoints[dsPoints.length - 1].models : 1;\n\n const unitId = nameToId(ds.name);\n const unit: Record<string, unknown> = {\n id: unitId,\n name: ds.name,\n faction_id: factionId,\n ...(role ? { role } : {}),\n profiles,\n points: dsPoints,\n keywords: regularKeywords,\n faction_keywords: factionKeywords,\n ...(baseSize ? { base_size_mm: baseSize } : {}),\n model_count: { min: modelMin, max: modelMax },\n weapon_ids: [],\n ability_ids: [],\n ...(transport ? { transport_capacity: transport } : {}),\n game_version: GAME_VERSION,\n is_legend: false,\n };\n\n units.push(unit);\n }\n\n // ─── Build weapons ───\n console.log(\"Converting weapons...\");\n const { weapons, unitWeaponIds } = buildWeaponRegistry(\n unitWargearMap,\n GAME_VERSION\n );\n\n // Wire weapon_ids into units\n for (const unit of units) {\n const dsId = factionDatasheets.find((d) => d.name === (unit as { name: string }).name)!.id;\n const weaponIds = unitWeaponIds.get(dsId);\n if (weaponIds) {\n (unit as { weapon_ids: string[] }).weapon_ids = [...weaponIds].sort();\n }\n }\n\n // ─── Build leader attachments ───\n console.log(\"Converting leader attachments...\");\n const leaderMap = new Map<string, Set<string>>();\n\n for (const l of allLeaders) {\n if (factionIds.has(l.leader_id) && factionIds.has(l.attached_id)) {\n const leaderId = nameToId(idToName.get(l.leader_id)!);\n const attachedId = nameToId(idToName.get(l.attached_id)!);\n if (!leaderMap.has(leaderId)) {\n leaderMap.set(leaderId, new Set());\n }\n leaderMap.get(leaderId)!.add(attachedId);\n }\n }\n\n const leaderAttachments = [...leaderMap.entries()].map(\n ([leaderId, bodyguards]) => ({\n leader_id: leaderId,\n eligible_bodyguard_ids: [...bodyguards].sort(),\n max_leaders_per_unit: 1,\n game_version: GAME_VERSION,\n })\n );\n // ─── Build detachments ───\n console.log(\"Converting detachments...\");\n const factionDetAbilities = detachmentAbilities.filter(\n (d) => d.faction_id === sourceFactionId\n );\n let factionEnhancements = enhancements.filter(\n (e) => e.faction_id === sourceFactionId\n );\n let factionStratagems = stratagems.filter(\n (s) => s.faction_id === sourceFactionId\n );\n\n // Deduplicate detachments (some have multiple ability entries per detachment)\n let detachmentNames = [...new Set(factionDetAbilities.map((da) => da.detachment))];\n\n // Apply detachment filter for subfactions\n if (config.detachmentFilter) {\n detachmentNames = detachmentNames.filter((d) =>\n config.detachmentFilter!.includes(d)\n );\n // Also filter enhancements and stratagems to matching detachments\n const allowedDetachments = new Set(config.detachmentFilter);\n factionEnhancements = factionEnhancements.filter((e) => allowedDetachments.has(e.detachment));\n factionStratagems = factionStratagems.filter((s) => allowedDetachments.has(s.detachment));\n }\n\n const detachments = detachmentNames.map((detName) => {\n const detId = nameToId(detName);\n const detEnhIds = factionEnhancements\n .filter((e) => e.detachment === detName)\n .map((e) => nameToId(e.name));\n const detStratIds = factionStratagems\n .filter((s) => s.detachment === detName)\n .map((s) => nameToId(s.name));\n\n return {\n id: detId,\n name: detName,\n faction_id: factionId,\n detachment_rule_id: null as string | null,\n enhancement_ids: detEnhIds,\n stratagem_ids: detStratIds,\n game_version: GAME_VERSION,\n };\n });\n\n // ─── Build enhancements ───\n console.log(\"Converting enhancements...\");\n const enhancementEntities = factionEnhancements.map((e) => ({\n id: nameToId(e.name),\n name: e.name,\n detachment_id: nameToId(e.detachment),\n cost: parseInt(e.cost, 10),\n keyword_restrictions: [factionName],\n ability_id: null as string | null,\n is_unique: true,\n game_version: GAME_VERSION,\n }));\n\n // ─── Build stratagems ───\n console.log(\"Converting stratagems...\");\n const stratagemEntities = factionStratagems.map((s) => {\n const { type } = parseStratagemType(s.type);\n const phases = mapPhases(s.phases);\n const playerTurn = parsePlayerTurn(s.turn);\n\n return {\n id: nameToId(s.name),\n name: s.name,\n category: \"detachment\" as const,\n type,\n detachment_id: nameToId(s.detachment),\n cp_cost: parseInt(s.cp_cost, 10),\n phases,\n player_turn: playerTurn,\n timing: \"once-per-phase\" as const,\n target_restrictions: null as null,\n ability_id: null as string | null,\n game_version: GAME_VERSION,\n };\n });\n\n // ─── Build phase mappings from source ability phases ───\n console.log(\"Converting phase mappings...\");\n const phaseMappings: Record<string, unknown>[] = [];\n\n // Unit abilities\n for (const ds of factionDatasheets) {\n const viewIdx = viewIndices.get(ds.id)!;\n const dsAbilities = allAbilities.filter(\n (a) => a.datasheet_id === ds.id\n );\n const viewAbilities = getViewEntries(dsAbilities, viewIdx);\n const seen = new Set<string>();\n\n for (const a of viewAbilities) {\n if (a.type === \"Faction\") continue;\n const sourceId = nameToId(a.name);\n if (seen.has(sourceId)) continue;\n seen.add(sourceId);\n\n const sourceType =\n a.type === \"Core\" ? \"ability\" :\n a.type === \"Wargear\" ? \"ability\" :\n \"ability\";\n\n const phases = mapPhases(a.phases);\n if (phases.length > 0) {\n phaseMappings.push({\n source_id: sourceId,\n source_type: sourceType,\n phases,\n game_version: GAME_VERSION,\n authored_by: \"40kdc-community\",\n });\n }\n }\n }\n\n // Stratagem phase mappings\n for (const s of factionStratagems) {\n const phases = mapPhases(s.phases);\n if (phases.length > 0) {\n phaseMappings.push({\n source_id: nameToId(s.name),\n source_type: \"stratagem\",\n phases,\n game_version: GAME_VERSION,\n authored_by: \"40kdc-community\",\n });\n }\n }\n\n // Enhancement phase mappings\n for (const e of factionEnhancements) {\n const phases = mapPhases(e.phases);\n if (phases.length > 0) {\n phaseMappings.push({\n source_id: nameToId(e.name),\n source_type: \"enhancement\",\n phases,\n game_version: GAME_VERSION,\n authored_by: \"40kdc-community\",\n });\n }\n }\n\n // Detachment rule phase mappings\n for (const da of factionDetAbilities) {\n const phases = mapPhases(da.phases);\n if (phases.length > 0) {\n phaseMappings.push({\n source_id: nameToId(da.name),\n source_type: \"detachment-rule\",\n phases,\n game_version: GAME_VERSION,\n authored_by: \"40kdc-community\",\n });\n }\n }\n\n // Deduplicate phase mappings\n const dedupedPhaseMappings = [\n ...new Map(\n phaseMappings.map((pm) => [\n `${(pm as { source_id: string }).source_id}|${(pm as { source_type: string }).source_type}`,\n pm,\n ])\n ).values(),\n ];\n\n // ─── Build unit compositions ───\n console.log(\"Generating unit compositions...\");\n\n const unitCompositions = units.map((u) => {\n const unitId = (u as { id: string }).id;\n const modelCount = (u as { model_count: { min: number; max: number } }).model_count;\n\n const override = config.compositionOverrides[unitId];\n if (override) {\n return {\n unit_id: unitId,\n models: override,\n game_version: GAME_VERSION,\n };\n }\n\n // Single-model unit (vehicles, characters, monsters)\n const profileName = (u as { profiles: { name: string }[] }).profiles[0]?.name;\n return {\n unit_id: unitId,\n models: [\n {\n name: profileName || (u as { name: string }).name,\n min: modelCount.min,\n max: modelCount.max,\n is_leader_model: false,\n },\n ],\n game_version: GAME_VERSION,\n };\n });\n\n // ─── Generate factions.json ───\n const factionEntity = [\n {\n id: factionId,\n name: factionName,\n parent_faction_id: config.parentFactionId,\n game_version: GAME_VERSION,\n keywords: config.factionKeywords,\n aliases: config.aliases,\n faction_rule_id: config.factionRuleId,\n },\n ];\n\n // ─── Write output ──────────────────────────────────────────────────\n const coreDir = `data/core/${factionId}`;\n const enrichDir = `data/enrichment/${factionId}`;\n mkdirSync(resolve(ROOT, coreDir), { recursive: true });\n mkdirSync(resolve(ROOT, enrichDir), { recursive: true });\n\n console.log(\"\\nWriting output files...\");\n\n writeOutput(`${coreDir}/factions.json`, factionEntity);\n if (!config.skipUnits) {\n writeOutput(`${coreDir}/units.json`, units);\n writeOutput(`${coreDir}/weapons.json`, weapons);\n writeOutput(`${coreDir}/leader-attachments.json`, leaderAttachments);\n writeOutput(`${coreDir}/unit-compositions.json`, unitCompositions);\n }\n writeOutput(`${coreDir}/detachments.json`, detachments);\n writeOutput(`${coreDir}/enhancements.json`, enhancementEntities);\n writeOutput(`${coreDir}/stratagems.json`, stratagemEntities);\n if (!config.skipUnits) {\n writeOutput(`${enrichDir}/phase-mappings.json`, dedupedPhaseMappings);\n }\n\n // ─── Summary ───\n console.log(`\\n── ${factionName} Summary ──`);\n if (!config.skipUnits) {\n console.log(` Units: ${units.length}`);\n console.log(` Weapons: ${weapons.length}`);\n console.log(` Leader attachments: ${leaderAttachments.length}`);\n console.log(` Unit compositions: ${unitCompositions.length}`);\n }\n console.log(` Detachments: ${detachments.length}`);\n console.log(` Enhancements: ${enhancementEntities.length}`);\n console.log(` Stratagems: ${stratagemEntities.length}`);\n if (!config.skipUnits) {\n console.log(` Phase mappings: ${dedupedPhaseMappings.length}`);\n }\n console.log(\"\\nDone. Run 'npm run validate' to check output.\");\n}\n\n// ─── CLI entry point ─────────────────────────────────────────────────\n\n// Only run CLI when this module is the entry point (not when imported)\nconst isMain = process.argv[1] &&\n resolve(process.argv[1]).replace(/\\.\\w+$/, \"\") ===\n fileURLToPath(import.meta.url).replace(/\\.\\w+$/, \"\");\n\nif (isMain) {\n const args = process.argv.slice(2);\n\n if (args.length === 0 || args[0] === \"--help\") {\n console.log(\"Usage: npx tsx tools/src/convert-faction.ts <faction-id>\");\n console.log(`Available factions: ${listFactions().join(\", \")}`);\n process.exit(args[0] === \"--help\" ? 0 : 1);\n }\n\n const factionIdArg = args[0];\n const factionConfig = getFactionConfig(factionIdArg);\n convertFaction(factionConfig);\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adepta-sororitas.d.ts","sourceRoot":"","sources":["../../../src/converters/configs/adepta-sororitas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,KAAK,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE3E,QAAA,MAAM,eAAe,EAAE,aAkEtB,CAAC;AAIF,eAAe,eAAe,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adepta-sororitas.js","sourceRoot":"","sources":["../../../src/converters/configs/adepta-sororitas.ts"],"names":[],"mappings":"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","sourcesContent":["import { registerFaction, type FactionConfig } from \"../faction-config.js\";\n\nconst adeptaSororitas: FactionConfig = {\n sourceFactionId: \"AS\",\n factionId: \"adepta-sororitas\",\n factionName: \"Adepta Sororitas\",\n factionAbilityName: \"Acts of Faith\",\n factionRuleId: \"acts-of-faith\",\n factionKeywords: [\"Imperium\", \"Adepta Sororitas\"],\n parentFactionId: null,\n aliases: [],\n compositionOverrides: {\n \"battle-sisters-squad\": [\n { name: \"Sister Superior\", profile_name: \"Battle Sister\", min: 1, max: 1, default_weapon_ids: [\"bolt-pistol\", \"power-weapon\"], is_leader_model: true },\n { name: \"Battle Sister\", min: 9, max: 9, default_weapon_ids: [\"boltgun\", \"close-combat-weapon\"], is_leader_model: false },\n ],\n \"celestian-sacresants\": [\n { name: \"Sacresant Superior\", profile_name: \"Celestian Sacresant\", min: 1, max: 1, default_weapon_ids: [\"bolt-pistol\", \"hallowed-mace\"], is_leader_model: true },\n { name: \"Celestian Sacresant\", min: 4, max: 9, default_weapon_ids: [\"bolt-pistol\", \"hallowed-mace\"], is_leader_model: false },\n ],\n \"celestian-insidiants\": [\n { name: \"Insidiant Superior\", profile_name: \"Celestian Insidiant\", min: 1, max: 1, default_weapon_ids: [\"condemnor-bolt-pistol\", \"blessed-sword\"], is_leader_model: true },\n { name: \"Celestian Insidiant\", min: 9, max: 9, default_weapon_ids: [\"condemnor-bolt-pistol\", \"null-mace\"], is_leader_model: false },\n ],\n \"dominion-squad\": [\n { name: \"Dominion Superior\", profile_name: \"Dominion\", min: 1, max: 1, default_weapon_ids: [\"bolt-pistol\", \"power-weapon\"], is_leader_model: true },\n { name: \"Dominion\", min: 9, max: 9, default_weapon_ids: [\"boltgun\", \"close-combat-weapon\"], is_leader_model: false },\n ],\n \"seraphim-squad\": [\n { name: \"Seraphim Superior\", profile_name: \"Seraphim\", min: 1, max: 1, default_weapon_ids: [\"bolt-pistol\", \"chainsword\"], is_leader_model: true },\n { name: \"Seraphim\", min: 4, max: 9, default_weapon_ids: [\"bolt-pistol\", \"close-combat-weapon\"], is_leader_model: false },\n ],\n \"zephyrim-squad\": [\n { name: \"Zephyrim Superior\", profile_name: \"Zephyrim\", min: 1, max: 1, default_weapon_ids: [\"bolt-pistol\", \"power-weapon\"], is_leader_model: true },\n { name: \"Zephyrim\", min: 4, max: 9, default_weapon_ids: [\"bolt-pistol\", \"power-weapon\"], is_leader_model: false },\n ],\n \"retributor-squad\": [\n { name: \"Retributor Superior\", profile_name: \"Retributor\", min: 1, max: 1, default_weapon_ids: [\"bolt-pistol\", \"power-weapon\"], is_leader_model: true },\n { name: \"Retributor\", min: 4, max: 4, default_weapon_ids: [\"boltgun\", \"close-combat-weapon\"], is_leader_model: false },\n ],\n \"repentia-squad\": [\n { name: \"Repentia Superior\", min: 1, max: 1, default_weapon_ids: [\"bolt-pistol\", \"neural-whips\"], is_leader_model: true },\n { name: \"Sister Repentia\", min: 4, max: 9, default_weapon_ids: [\"penitent-eviscerator\"], is_leader_model: false },\n ],\n \"sisters-novitiate-squad\": [\n { name: \"Novitiate Superior\", min: 1, max: 1, default_weapon_ids: [\"bolt-pistol\", \"power-weapon\"], is_leader_model: true },\n { name: \"Sister Novitiate\", min: 9, max: 9, default_weapon_ids: [\"autogun\", \"close-combat-weapon\"], is_leader_model: false },\n ],\n \"sanctifiers\": [\n { name: \"Missionary\", profile_name: \"Missionary\", min: 1, max: 1, default_weapon_ids: [\"holy-fire\", \"close-combat-weapon\"], is_leader_model: true },\n { name: \"Miraculist\", min: 2, max: 2, default_weapon_ids: [\"ministorum-hand-flamer\", \"close-combat-weapon\"], is_leader_model: false },\n { name: \"Salvationist\", min: 2, max: 2, default_weapon_ids: [\"ministorum-flamer\", \"close-combat-weapon\"], is_leader_model: false },\n { name: \"Death Cult Assassin\", min: 2, max: 2, default_weapon_ids: [\"death-cult-blades\"], is_leader_model: false },\n { name: \"Sanctifier\", min: 2, max: 2, default_weapon_ids: [\"sanctifier-melee-weapon\"], is_leader_model: false },\n ],\n \"saint-celestine\": [\n { name: \"Celestine\", min: 1, max: 1, default_weapon_ids: [\"the-ardent-blade-strike\"], is_leader_model: true },\n { name: \"Geminae Superia\", min: 2, max: 2, default_weapon_ids: [\"bolt-pistol\", \"power-weapon\"], is_leader_model: false },\n ],\n \"aestred-thurga-and-agathae-dolan\": [\n { name: \"Aestred Thurga\", min: 1, max: 1, default_weapon_ids: [\"bolt-pistol\", \"auto-of-castigation\"], is_leader_model: true },\n { name: \"Agathae Dolan\", min: 1, max: 1, default_weapon_ids: [\"close-combat-weapon\"], is_leader_model: false },\n ],\n \"daemonifuge\": [\n { name: \"Ephrael Stern\", min: 1, max: 1, default_weapon_ids: [\"bolt-pistol\", \"sanctity\"], is_leader_model: true },\n { name: \"Kyganil of the Bloody Tears\", profile_name: \"Kyganil of the Bloody Tears\", min: 1, max: 1, default_weapon_ids: [\"the-blades-of-the-harlequin\"], is_leader_model: false },\n ],\n },\n};\n\nregisterFaction(adeptaSororitas);\n\nexport default adeptaSororitas;\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adeptus-astartes.d.ts","sourceRoot":"","sources":["../../../src/converters/configs/adeptus-astartes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,KAAK,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE3E,QAAA,MAAM,eAAe,EAAE,aAsEtB,CAAC;AAIF,eAAe,eAAe,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adeptus-astartes.js","sourceRoot":"","sources":["../../../src/converters/configs/adeptus-astartes.ts"],"names":[],"mappings":"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","sourcesContent":["import { registerFaction, type FactionConfig } from \"../faction-config.js\";\n\nconst adeptusAstartes: FactionConfig = {\n sourceFactionId: \"SM\",\n factionId: \"adeptus-astartes\",\n factionName: \"Adeptus Astartes\",\n factionAbilityName: \"Oath of Moment\",\n factionRuleId: \"oath-of-moment\",\n factionKeywords: [\"Imperium\", \"Adeptus Astartes\"],\n parentFactionId: null,\n aliases: [],\n compositionOverrides: {\n // Crusader Squad (Black Templars)\n \"crusader-squad\": [\n { name: \"Sword Brother\", profile_name: \"Initiate\", min: 1, max: 1, default_weapon_ids: [\"bolt-pistol\", \"power-weapon\"], is_leader_model: true },\n { name: \"Initiate\", min: 5, max: 11, default_weapon_ids: [\"bolt-pistol\", \"close-combat-weapon\"], is_leader_model: false },\n { name: \"Neophyte\", min: 4, max: 8, default_weapon_ids: [\"bolt-pistol\", \"close-combat-weapon\"], is_leader_model: false },\n ],\n // Deathwatch Kill Teams\n \"deathwatch-veterans\": [\n { name: \"Watch Sergeant\", min: 1, max: 1, default_weapon_ids: [\"boltgun\", \"close-combat-weapon\"], is_leader_model: true },\n { name: \"Deathwatch Veteran\", profile_name: \"Deathwatch Veterans\", min: 4, max: 9, default_weapon_ids: [\"boltgun\", \"close-combat-weapon\"], is_leader_model: false },\n ],\n \"decimus-kill-team\": [\n { name: \"Watch Sergeant\", profile_name: \"Deathwatch Veteran\", min: 1, max: 1, default_weapon_ids: [\"boltgun\", \"close-combat-weapon\"], is_leader_model: true },\n { name: \"Deathwatch Veteran\", min: 2, max: 7, default_weapon_ids: [\"boltgun\", \"close-combat-weapon\"], is_leader_model: false },\n { name: \"Gravis Veteran\", min: 2, max: 2, default_weapon_ids: [\"bolt-rifle\", \"close-combat-weapon\"], is_leader_model: false },\n ],\n \"talonstrike-kill-team\": [\n { name: \"Kill Team Intercessor with Jump Pack\", min: 5, max: 10, default_weapon_ids: [\"bolt-rifle\", \"close-combat-weapon\"], is_leader_model: false },\n { 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 },\n ],\n // Outrider Squad with optional ATV\n \"outrider-squad\": [\n { name: \"Outrider Sergeant\", profile_name: \"Outrider\", min: 1, max: 1, default_weapon_ids: [\"heavy-bolt-pistol\", \"astartes-chainsword\"], is_leader_model: true },\n { name: \"Outrider\", min: 2, max: 5, default_weapon_ids: [\"heavy-bolt-pistol\", \"astartes-chainsword\"], is_leader_model: false },\n { name: \"Invader ATV\", min: 0, max: 1, default_weapon_ids: [\"onslaught-gatling-cannon\"], is_leader_model: false },\n ],\n // Space Wolves units\n \"wolf-guard-headtakers\": [\n { name: \"Wolf Guard Headtaker\", min: 3, max: 12, default_weapon_ids: [\"close-combat-weapon\"], is_leader_model: false },\n { name: \"Hunting Wolf\", profile_name: \"Hunting Wolves\", min: 0, max: 2, default_weapon_ids: [\"close-combat-weapon\"], is_leader_model: false },\n ],\n \"wolf-scouts\": [\n { name: \"Wolf Scout Pack Leader\", profile_name: \"Wolf Scout\", min: 1, max: 1, default_weapon_ids: [\"boltgun\", \"close-combat-weapon\"], is_leader_model: true },\n { name: \"Wolf Scout\", min: 4, max: 10, default_weapon_ids: [\"boltgun\", \"close-combat-weapon\"], is_leader_model: false },\n { name: \"Hunting Wolf\", min: 1, max: 1, default_weapon_ids: [\"close-combat-weapon\"], is_leader_model: false },\n ],\n // Character companions\n \"chaplain-grimaldus\": [\n { name: \"Chaplain Grimaldus\", min: 1, max: 1, default_weapon_ids: [\"plasma-pistol\", \"close-combat-weapon\"], is_leader_model: true },\n { name: \"Cenobyte Servitor\", min: 3, max: 3, default_weapon_ids: [\"close-combat-weapon\"], is_leader_model: false },\n ],\n \"wardens-of-ultramar\": [\n { 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 },\n { name: \"Lucia Vestha\", profile_name: \"Lucia Vestha\", min: 1, max: 1, default_weapon_ids: [\"bolt-pistol\", \"close-combat-weapon\"], is_leader_model: false },\n { name: \"Victrix Guard\", profile_name: \"Veteran Sergeant Metaurus\", min: 4, max: 4, default_weapon_ids: [\"bolt-pistol\", \"close-combat-weapon\"], is_leader_model: false },\n ],\n },\n detachmentFilter: [\n \"Gladius Task Force\",\n \"Ironstorm Spearhead\",\n \"1st Company Task Force\",\n \"Firestorm Assault Force\",\n \"Vanguard Spearhead\",\n \"Stormlance Task Force\",\n \"Anvil Siege Force\",\n \"Librarius Conclave\",\n \"Orbital Assault Force\",\n \"Godhammer Assault Force\",\n \"Spearpoint Task Force\",\n ],\n};\n\nregisterFaction(adeptusAstartes);\n\nexport default adeptusAstartes;\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adeptus-custodes.d.ts","sourceRoot":"","sources":["../../../src/converters/configs/adeptus-custodes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,KAAK,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE3E,QAAA,MAAM,eAAe,EAAE,aAUtB,CAAC;AAIF,eAAe,eAAe,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adeptus-custodes.js","sourceRoot":"","sources":["../../../src/converters/configs/adeptus-custodes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAsB,MAAM,sBAAsB,CAAC;AAE3E,MAAM,eAAe,GAAkB;IACrC,eAAe,EAAE,IAAI;IACrB,SAAS,EAAE,kBAAkB;IAC7B,WAAW,EAAE,kBAAkB;IAC/B,kBAAkB,EAAE,qBAAqB;IACzC,aAAa,EAAE,eAAe;IAC9B,eAAe,EAAE,CAAC,UAAU,EAAE,kBAAkB,CAAC;IACjD,eAAe,EAAE,IAAI;IACrB,OAAO,EAAE,EAAE;IACX,oBAAoB,EAAE,EAAE;CACzB,CAAC;AAEF,eAAe,CAAC,eAAe,CAAC,CAAC;AAEjC,eAAe,eAAe,CAAC","sourcesContent":["import { registerFaction, type FactionConfig } from \"../faction-config.js\";\n\nconst adeptusCustodes: FactionConfig = {\n sourceFactionId: \"AC\",\n factionId: \"adeptus-custodes\",\n factionName: \"Adeptus Custodes\",\n factionAbilityName: \"Martial Ka\\u2019tah\",\n factionRuleId: \"martial-katah\",\n factionKeywords: [\"Imperium\", \"Adeptus Custodes\"],\n parentFactionId: null,\n aliases: [],\n compositionOverrides: {},\n};\n\nregisterFaction(adeptusCustodes);\n\nexport default adeptusCustodes;\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adeptus-mechanicus.d.ts","sourceRoot":"","sources":["../../../src/converters/configs/adeptus-mechanicus.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,KAAK,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE3E,QAAA,MAAM,iBAAiB,EAAE,aA+CxB,CAAC;AAIF,eAAe,iBAAiB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adeptus-mechanicus.js","sourceRoot":"","sources":["../../../src/converters/configs/adeptus-mechanicus.ts"],"names":[],"mappings":"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","sourcesContent":["import { registerFaction, type FactionConfig } from \"../faction-config.js\";\n\nconst adeptusMechanicus: FactionConfig = {\n sourceFactionId: \"AdM\",\n factionId: \"adeptus-mechanicus\",\n factionName: \"Adeptus Mechanicus\",\n factionAbilityName: \"Doctrina Imperatives\",\n factionRuleId: \"doctrina-imperatives\",\n factionKeywords: [\"Imperium\", \"Adeptus Mechanicus\"],\n parentFactionId: null,\n aliases: [],\n compositionOverrides: {\n \"skitarii-rangers\": [\n { name: \"Ranger Alpha\", profile_name: \"Skitarii Ranger\", min: 1, max: 1, default_weapon_ids: [\"mechanicus-pistol\", \"alpha-combat-weapon\"], is_leader_model: true },\n { name: \"Skitarii Ranger\", min: 9, max: 9, default_weapon_ids: [\"galvanic-rifle\", \"close-combat-weapon\"], is_leader_model: false },\n ],\n \"skitarii-vanguard\": [\n { name: \"Vanguard Alpha\", profile_name: \"Skitarii Vanguard\", min: 1, max: 1, default_weapon_ids: [\"mechanicus-pistol\", \"alpha-combat-weapon\"], is_leader_model: true },\n { name: \"Skitarii Vanguard\", min: 9, max: 9, default_weapon_ids: [\"radium-carbine\", \"close-combat-weapon\"], is_leader_model: false },\n ],\n \"sicarian-infiltrators\": [\n { name: \"Sicarian Princeps\", profile_name: \"Sicarian Infiltrator\", min: 1, max: 1, default_weapon_ids: [\"stubcarbine\", \"power-weapon\"], is_leader_model: true },\n { name: \"Sicarian Infiltrator\", min: 4, max: 9, default_weapon_ids: [\"stubcarbine\", \"power-weapon\"], is_leader_model: false },\n ],\n \"sicarian-ruststalkers\": [\n { name: \"Sicarian Princeps\", profile_name: \"Sicarian Ruststalker\", min: 1, max: 1, default_weapon_ids: [\"transonic-blades-and-chordclaw\"], is_leader_model: true },\n { name: \"Sicarian Ruststalker\", min: 4, max: 9, default_weapon_ids: [\"transonic-blades-and-chordclaw\"], is_leader_model: false },\n ],\n \"pteraxii-skystalkers\": [\n { name: \"Pteraxii Alpha\", profile_name: \"Pteraxii Skystalker\", min: 1, max: 1, default_weapon_ids: [\"flechette-blaster\", \"taser-goad\"], is_leader_model: true },\n { name: \"Pteraxii Skystalker\", min: 4, max: 9, default_weapon_ids: [\"flechette-carbine\", \"close-combat-weapon\"], is_leader_model: false },\n ],\n \"pteraxii-sterylizors\": [\n { name: \"Pteraxii Alpha\", profile_name: \"Pteraxii Sterylizor\", min: 1, max: 1, default_weapon_ids: [\"flechette-blaster\", \"taser-goad\"], is_leader_model: true },\n { name: \"Pteraxii Sterylizor\", min: 4, max: 9, default_weapon_ids: [\"phosphor-torch\", \"pteraxii-talons\"], is_leader_model: false },\n ],\n \"serberys-raiders\": [\n { 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 },\n { name: \"Serberys Raider\", min: 2, max: 5, default_weapon_ids: [\"galvanic-carbine\", \"cavalry-sabre-and-clawed-limbs\"], is_leader_model: false },\n ],\n \"serberys-sulphurhounds\": [\n { name: \"Serberys Alpha\", profile_name: \"Serberys Sulphurhound\", min: 1, max: 1, default_weapon_ids: [\"mechanicus-pistol\", \"cavalry-arc-maul\"], is_leader_model: true },\n { name: \"Serberys Sulphurhound\", min: 2, max: 5, default_weapon_ids: [\"sulphur-breath\", \"clawed-limbs\"], is_leader_model: false },\n ],\n \"servitor-battleclade\": [\n { name: \"Servitor Underseer\", min: 1, max: 1, default_weapon_ids: [\"mechanicus-pistol\", \"dataspikes\"], is_leader_model: true },\n { name: \"Combat Servitor\", min: 8, max: 8, default_weapon_ids: [\"heavy-bolter\", \"servo-claw\"], is_leader_model: false },\n ],\n },\n};\n\nregisterFaction(adeptusMechanicus);\n\nexport default adeptusMechanicus;\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aeldari.d.ts","sourceRoot":"","sources":["../../../src/converters/configs/aeldari.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,KAAK,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE3E,QAAA,MAAM,OAAO,EAAE,aA2Ed,CAAC;AAIF,eAAe,OAAO,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aeldari.js","sourceRoot":"","sources":["../../../src/converters/configs/aeldari.ts"],"names":[],"mappings":"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","sourcesContent":["import { registerFaction, type FactionConfig } from \"../faction-config.js\";\n\nconst aeldari: FactionConfig = {\n sourceFactionId: \"AE\",\n factionId: \"aeldari\",\n factionName: \"Aeldari\",\n factionAbilityName: \"Strands of Fate\",\n factionRuleId: \"strands-of-fate\",\n factionKeywords: [\"Aeldari\"],\n parentFactionId: null,\n aliases: [],\n compositionOverrides: {\n // Aspect Warriors with Exarchs (from source data)\n \"dire-avengers\": [\n { name: \"Dire Avenger Exarch\", min: 1, max: 1, default_weapon_ids: [\"avenger-shuriken-catapult\", \"close-combat-weapon\"], is_leader_model: true },\n { name: \"Dire Avenger\", min: 4, max: 9, default_weapon_ids: [\"avenger-shuriken-catapult\", \"close-combat-weapon\"], is_leader_model: false },\n ],\n \"howling-banshees\": [\n { name: \"Howling Banshee Exarch\", min: 1, max: 1, default_weapon_ids: [\"shuriken-pistol\", \"power-sword\"], is_leader_model: true },\n { name: \"Howling Banshee\", min: 4, max: 9, default_weapon_ids: [\"shuriken-pistol\", \"power-sword\"], is_leader_model: false },\n ],\n \"striking-scorpions\": [\n { name: \"Striking Scorpion Exarch\", min: 1, max: 1, default_weapon_ids: [\"scorpion-chainsword\", \"shuriken-pistol\"], is_leader_model: true },\n { name: \"Striking Scorpion\", min: 4, max: 9, default_weapon_ids: [\"scorpion-chainsword\", \"shuriken-pistol\"], is_leader_model: false },\n ],\n \"fire-dragons\": [\n { name: \"Fire Dragon Exarch\", min: 1, max: 1, default_weapon_ids: [\"dragon-fusion-gun\", \"close-combat-weapon\"], is_leader_model: true },\n { name: \"Fire Dragon\", min: 4, max: 9, default_weapon_ids: [\"dragon-fusion-gun\", \"close-combat-weapon\"], is_leader_model: false },\n ],\n \"dark-reapers\": [\n { name: \"Dark Reaper Exarch\", min: 1, max: 1, default_weapon_ids: [\"reaper-launcher\", \"close-combat-weapon\"], is_leader_model: true },\n { name: \"Dark Reaper\", min: 4, max: 9, default_weapon_ids: [\"reaper-launcher\", \"close-combat-weapon\"], is_leader_model: false },\n ],\n \"swooping-hawks\": [\n { name: \"Swooping Hawk Exarch\", min: 1, max: 1, default_weapon_ids: [\"lasblaster\", \"close-combat-weapon\"], is_leader_model: true },\n { name: \"Swooping Hawk\", min: 4, max: 9, default_weapon_ids: [\"lasblaster\", \"close-combat-weapon\"], is_leader_model: false },\n ],\n \"warp-spiders\": [\n { name: \"Warp Spider Exarch\", min: 1, max: 1, default_weapon_ids: [\"death-spinner\", \"close-combat-weapon\"], is_leader_model: true },\n { name: \"Warp Spider\", min: 4, max: 9, default_weapon_ids: [\"death-spinner\", \"close-combat-weapon\"], is_leader_model: false },\n ],\n \"shining-spears\": [\n { name: \"Shining Spear Exarch\", min: 1, max: 1, default_weapon_ids: [\"twin-shuriken-catapult\", \"laser-lance\"], is_leader_model: true },\n { name: \"Shining Spear\", min: 2, max: 5, default_weapon_ids: [\"twin-shuriken-catapult\", \"laser-lance\"], is_leader_model: false },\n ],\n // Guardian squads with platforms\n \"guardian-defenders\": [\n { name: \"Guardian Defender\", min: 10, max: 10, default_weapon_ids: [\"shuriken-catapult\", \"close-combat-weapon\"], is_leader_model: false },\n { name: \"Heavy Weapon Platform\", min: 1, max: 1, default_weapon_ids: [\"bright-lance\"], is_leader_model: false },\n ],\n \"storm-guardians\": [\n { name: \"Storm Guardian\", min: 10, max: 10, default_weapon_ids: [\"shuriken-pistol\", \"aeldari-power-sword\"], is_leader_model: false },\n { name: \"Serpent\\u2019s Scale Platform\", min: 1, max: 1, default_weapon_ids: [\"shuriken-catapult\"], is_leader_model: false },\n ],\n // Ynnari subfaction units\n \"ynnari-incubi\": [\n { name: \"Klaivex\", min: 1, max: 1, default_weapon_ids: [\"demiklaives-single-blade\"], is_leader_model: true },\n { name: \"Incubi\", min: 4, max: 9, default_weapon_ids: [\"klaive\"], is_leader_model: false },\n ],\n \"ynnari-kabalite-warriors\": [\n { name: \"Sybarite\", profile_name: \"Kabalite Warrior\", min: 1, max: 1, default_weapon_ids: [\"splinter-pistol\", \"power-weapon\"], is_leader_model: true },\n { name: \"Kabalite Warrior\", min: 9, max: 9, default_weapon_ids: [\"splinter-rifle\", \"close-combat-weapon\"], is_leader_model: false },\n ],\n \"ynnari-wyches\": [\n { name: \"Hekatrix\", profile_name: \"Wych\", min: 1, max: 1, default_weapon_ids: [\"splinter-pistol\", \"power-weapon\"], is_leader_model: true },\n { name: \"Wych\", min: 9, max: 9, default_weapon_ids: [\"splinter-pistol\", \"hekatarii-blade\"], is_leader_model: false },\n ],\n \"ynnari-reavers\": [\n { name: \"Arena Champion\", profile_name: \"Reaver\", min: 1, max: 1, default_weapon_ids: [\"splinter-pistol\", \"bladevanes\"], is_leader_model: true },\n { name: \"Reaver\", min: 2, max: 5, default_weapon_ids: [\"splinter-pistol\", \"bladevanes\"], is_leader_model: false },\n ],\n // Harlequin Troupe\n \"troupe\": [\n { name: \"Lead Player\", profile_name: \"Player\", min: 1, max: 1, default_weapon_ids: [\"shuriken-pistol\", \"harlequins-blade\"], is_leader_model: true },\n { name: \"Player\", min: 4, max: 11, default_weapon_ids: [\"shuriken-pistol\", \"harlequins-blade\"], is_leader_model: false },\n ],\n },\n};\n\nregisterFaction(aeldari);\n\nexport default aeldari;\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agents-of-the-imperium.d.ts","sourceRoot":"","sources":["../../../src/converters/configs/agents-of-the-imperium.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,KAAK,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE3E,QAAA,MAAM,mBAAmB,EAAE,aAqD1B,CAAC;AAIF,eAAe,mBAAmB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agents-of-the-imperium.js","sourceRoot":"","sources":["../../../src/converters/configs/agents-of-the-imperium.ts"],"names":[],"mappings":"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","sourcesContent":["import { registerFaction, type FactionConfig } from \"../faction-config.js\";\n\nconst agentsOfTheImperium: FactionConfig = {\n sourceFactionId: \"AoI\",\n factionId: \"agents-of-the-imperium\",\n factionName: \"Agents of the Imperium\",\n factionAbilityName: \"Assigned Agents\",\n factionRuleId: \"assigned-agents\",\n factionKeywords: [\"Imperium\", \"Agents of the Imperium\"],\n parentFactionId: null,\n aliases: [],\n compositionOverrides: {\n \"deathwatch-kill-team\": [\n { name: \"Watch Sergeant\", min: 1, max: 1, default_weapon_ids: [\"boltgun\", \"close-combat-weapon\"], is_leader_model: true },\n { name: \"Deathwatch Veteran\", profile_name: \"Deathwatch Veterans\", min: 4, max: 9, default_weapon_ids: [\"boltgun\", \"close-combat-weapon\"], is_leader_model: false },\n ],\n \"aquila-kill-team\": [\n { name: \"Watch Sergeant\", profile_name: \"Deathwatch Veteran\", min: 1, max: 1, default_weapon_ids: [\"boltgun\", \"close-combat-weapon\"], is_leader_model: true },\n { name: \"Deathwatch Veteran\", min: 2, max: 7, default_weapon_ids: [\"boltgun\", \"close-combat-weapon\"], is_leader_model: false },\n { name: \"Gravis Veteran\", min: 2, max: 2, default_weapon_ids: [\"bolt-rifle\", \"close-combat-weapon\"], is_leader_model: false },\n ],\n \"rogue-trader-entourage\": [\n { name: \"Rogue Trader\", min: 1, max: 1, default_weapon_ids: [\"dartmask\", \"close-combat-weapon\"], is_leader_model: true },\n { name: \"Rejuvenat Adept\", min: 1, max: 1, default_weapon_ids: [\"close-combat-weapon\"], is_leader_model: false },\n { name: \"Canid\", profile_name: \"Rejuvenat Adept\", min: 1, max: 1, default_weapon_ids: [\"close-combat-weapon\"], is_leader_model: false },\n { name: \"Lectro-Maester\", profile_name: \"Rejuvenat Adept\", min: 1, max: 1, default_weapon_ids: [\"close-combat-weapon\"], is_leader_model: false },\n ],\n \"exaction-squad\": [\n { name: \"Proctor-Exactant\", profile_name: \"Cyber-mastiff\", min: 1, max: 1, default_weapon_ids: [\"arbites-shotpistol\", \"close-combat-weapon\"], is_leader_model: true },\n { name: \"Exaction Vigilant\", profile_name: \"Cyber-mastiff\", min: 9, max: 9, default_weapon_ids: [\"arbites-combat-shotgun\", \"close-combat-weapon\"], is_leader_model: false },\n { name: \"Cyber-mastiff\", min: 1, max: 1, default_weapon_ids: [\"mechanical-bite\"], is_leader_model: false },\n ],\n \"subductor-squad\": [\n { name: \"Subductor Proctor\", profile_name: \"Cyber-mastiff\", min: 1, max: 1, default_weapon_ids: [\"arbites-shotpistol\", \"close-combat-weapon\"], is_leader_model: true },\n { name: \"Subductor\", profile_name: \"Cyber-mastiff\", min: 9, max: 9, default_weapon_ids: [\"arbites-shotpistol\", \"close-combat-weapon\"], is_leader_model: false },\n { name: \"Cyber-mastiff\", min: 1, max: 1, default_weapon_ids: [\"mechanical-bite\"], is_leader_model: false },\n ],\n \"vigilant-squad\": [\n { name: \"Vigilant Proctor\", profile_name: \"Cyber-mastiff\", min: 1, max: 1, default_weapon_ids: [\"arbites-shotpistol\", \"close-combat-weapon\"], is_leader_model: true },\n { name: \"Vigilant\", profile_name: \"Cyber-mastiff\", min: 9, max: 9, default_weapon_ids: [\"arbites-combat-shotgun\", \"close-combat-weapon\"], is_leader_model: false },\n { name: \"Cyber-mastiff\", min: 1, max: 1, default_weapon_ids: [\"mechanical-bite\"], is_leader_model: false },\n ],\n \"voidsmen-at-arms\": [\n { name: \"Voidmaster\", profile_name: \"Canid\", min: 1, max: 1, default_weapon_ids: [\"laspistol\", \"close-combat-weapon\"], is_leader_model: true },\n { name: \"Voidsman\", profile_name: \"Canid\", min: 4, max: 4, default_weapon_ids: [\"lasgun\", \"close-combat-weapon\"], is_leader_model: false },\n { name: \"Canid\", min: 1, max: 1, default_weapon_ids: [\"close-combat-weapon\"], is_leader_model: false },\n ],\n \"sanctifiers\": [\n { name: \"Missionary\", profile_name: \"Missionary\", min: 1, max: 1, default_weapon_ids: [\"holy-fire\", \"close-combat-weapon\"], is_leader_model: true },\n { name: \"Miraculist\", min: 2, max: 2, default_weapon_ids: [\"ministorum-hand-flamer\", \"close-combat-weapon\"], is_leader_model: false },\n { name: \"Salvationist\", min: 2, max: 2, default_weapon_ids: [\"ministorum-flamer\", \"close-combat-weapon\"], is_leader_model: false },\n { name: \"Death Cult Assassin\", min: 2, max: 2, default_weapon_ids: [\"death-cult-blades\"], is_leader_model: false },\n { name: \"Sanctifier\", min: 2, max: 2, default_weapon_ids: [\"sanctifier-melee-weapon\"], is_leader_model: false },\n ],\n },\n};\n\nregisterFaction(agentsOfTheImperium);\n\nexport default agentsOfTheImperium;\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"astra-militarum.d.ts","sourceRoot":"","sources":["../../../src/converters/configs/astra-militarum.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,KAAK,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE3E,QAAA,MAAM,cAAc,EAAE,aA4ErB,CAAC;AAIF,eAAe,cAAc,CAAC"}
|