uto_manager/lib/domain/services/doctrinal_templates.dart

1928 lines
56 KiB
Dart
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import 'package:uto_manager/domain/entities/position_slot.dart';
import 'package:uto_manager/domain/entities/unit_node.dart';
import 'package:uto_manager/domain/services/template_instantiator.dart';
/// Library of 2026 U.S. Army doctrinal force structure templates.
///
/// Each template is a [UnitDefinition] tree that can be instantiated via
/// [TemplateInstantiator] into concrete [UnitNode] and [PositionSlot] objects.
///
/// Templates are defined in pure Dart (no JSON files required at runtime),
/// making them available without asset loading and trivially testable.
///
/// Available templates:
/// - [mbct] — Mobile Brigade Combat Team
/// - [sbct] — Stryker Brigade Combat Team
/// - [abct] — Armored Brigade Combat Team
/// - [cabHeavy] — Combat Aviation Brigade (Heavy)
/// - [cabLight] — Combat Aviation Brigade (Light)
abstract final class DoctrinalTemplates {
// ---------------------------------------------------------------------------
// Shared slot definitions
// ---------------------------------------------------------------------------
static const _rtoSlot = SlotDefinition(
positionTitle: 'Radio Telephone Operator',
dutyMos: '25H',
authorizedRank: 'e3',
);
static const _medicSlot = SlotDefinition(
positionTitle: 'Combat Medic',
dutyMos: '68W',
authorizedRank: 'e4',
);
static const _fsoSlot = SlotDefinition(
positionTitle: 'Fire Support Specialist',
dutyMos: '13F',
authorizedRank: 'e6',
);
// ---------------------------------------------------------------------------
// Shared sub-unit builders
// ---------------------------------------------------------------------------
/// Standard 2026 SaaS Rifle Squad (9 soldiers).
static UnitDefinition _rifleSquad(String name) => UnitDefinition(
name: name,
echelon: 'squad',
branch: 'infantry',
slots: const [
SlotDefinition(
positionTitle: 'Squad Leader',
dutyMos: '11B',
authorizedRank: 'e6',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'Team Leader Alpha',
dutyMos: '11B',
authorizedRank: 'e5',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'Team Leader Bravo',
dutyMos: '11B',
authorizedRank: 'e5',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'Automatic Rifleman (XM250)',
dutyMos: '11B',
authorizedRank: 'e4',
),
SlotDefinition(
positionTitle: 'Automatic Rifleman (XM250)',
dutyMos: '11B',
authorizedRank: 'e4',
),
SlotDefinition(
positionTitle: 'Grenadier (XM7+M320)',
dutyMos: '11B',
authorizedRank: 'e4',
),
SlotDefinition(
positionTitle: 'Grenadier (XM7+M320)',
dutyMos: '11B',
authorizedRank: 'e4',
),
SlotDefinition(
positionTitle: 'sUAS Operator / Rifleman',
dutyMos: '15W',
authorizedRank: 'e4',
),
SlotDefinition(
positionTitle: 'Rifleman',
dutyMos: '11B',
authorizedRank: 'e3',
),
],
);
/// Standard Rifle Platoon HQ slots.
static const List<SlotDefinition> _riflePlatoonHqSlots = [
SlotDefinition(
positionTitle: 'Platoon Leader',
dutyMos: '11A',
authorizedRank: 'o2',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'Platoon Sergeant',
dutyMos: '11B',
authorizedRank: 'e7',
isKeyLeader: true,
),
_rtoSlot,
_medicSlot,
_fsoSlot,
];
/// Standard Rifle Platoon (HQ + 3 squads).
static UnitDefinition _riflePlatoon(String name) => UnitDefinition(
name: name,
echelon: 'platoon',
branch: 'infantry',
slots: _riflePlatoonHqSlots,
children: [
_rifleSquad('1st Squad'),
_rifleSquad('2nd Squad'),
_rifleSquad('3rd Squad'),
],
);
/// Standard Rifle Company (CO HQ + 3 platoons + Weapons Platoon).
static UnitDefinition _rifleCompany(String name) => UnitDefinition(
name: name,
echelon: 'company',
branch: 'infantry',
slots: const [
SlotDefinition(
positionTitle: 'Company Commander',
dutyMos: '11A',
authorizedRank: 'o3',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'Executive Officer',
dutyMos: '11A',
authorizedRank: 'o2',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'First Sergeant',
dutyMos: '11B',
authorizedRank: 'e8',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'Company RTO',
dutyMos: '25H',
authorizedRank: 'e3',
),
SlotDefinition(
positionTitle: 'Company Medic',
dutyMos: '68W',
authorizedRank: 'e5',
),
],
children: [
_riflePlatoon('1st Platoon'),
_riflePlatoon('2nd Platoon'),
_riflePlatoon('3rd Platoon'),
const UnitDefinition(
name: 'Weapons Platoon',
echelon: 'platoon',
branch: 'infantry',
slots: [
SlotDefinition(
positionTitle: 'Weapons Platoon Leader',
dutyMos: '11A',
authorizedRank: 'o2',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'Weapons Platoon Sergeant',
dutyMos: '11B',
authorizedRank: 'e7',
isKeyLeader: true,
),
],
),
],
);
/// Standard Infantry Battalion (HHC + 3 Rifle Companies).
static UnitDefinition _infantryBattalion(String name) => UnitDefinition(
name: name,
echelon: 'battalion',
branch: 'infantry',
slots: const [
SlotDefinition(
positionTitle: 'Battalion Commander',
dutyMos: '11A',
authorizedRank: 'o5',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'Executive Officer',
dutyMos: '11A',
authorizedRank: 'o4',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'Command Sergeant Major',
dutyMos: '11B',
authorizedRank: 'e9',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'S3 Operations Officer',
dutyMos: '11A',
authorizedRank: 'o4',
),
SlotDefinition(
positionTitle: 'Battalion Surgeon',
dutyMos: '68A',
authorizedRank: 'o3',
),
SlotDefinition(
positionTitle: 'Signal Officer',
dutyMos: '25A',
authorizedRank: 'o2',
),
],
children: [
_rifleCompany('Alpha Company'),
_rifleCompany('Bravo Company'),
_rifleCompany('Charlie Company'),
],
);
// ---------------------------------------------------------------------------
// MBCT — Mobile Brigade Combat Team
// ---------------------------------------------------------------------------
/// Mobile Brigade Combat Team (2026 doctrine).
///
/// Structure:
/// - Brigade HQ
/// - 3× Mobile Infantry Battalions
/// - Cavalry Squadron
/// - Field Artillery Battalion
/// - Multi-Domain Effects Platoon (MDEP)
/// - Hunter-Killer Platoon (HKP)
/// - Brigade Engineer Battalion
/// - Brigade Support Battalion
static final UnitDefinition mbct = UnitDefinition(
name: 'Mobile Brigade Combat Team',
echelon: 'brigade',
branch: 'infantry',
slots: const [
SlotDefinition(
positionTitle: 'Brigade Commander',
dutyMos: '11A',
authorizedRank: 'o6',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'Deputy Commander',
dutyMos: '11A',
authorizedRank: 'o5',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'Command Sergeant Major',
dutyMos: '11B',
authorizedRank: 'e9',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'S3 Operations Officer',
dutyMos: '11A',
authorizedRank: 'o4',
),
SlotDefinition(
positionTitle: 'Brigade Signal Officer',
dutyMos: '25A',
authorizedRank: 'o3',
),
SlotDefinition(
positionTitle: 'Brigade Surgeon',
dutyMos: '68A',
authorizedRank: 'o4',
),
],
children: [
_infantryBattalion('1-1 Mobile Infantry Battalion'),
_infantryBattalion('2-1 Mobile Infantry Battalion'),
_infantryBattalion('3-1 Mobile Infantry Battalion'),
// Cavalry Squadron
const UnitDefinition(
name: 'Cavalry Squadron',
echelon: 'battalion',
branch: 'infantry',
slots: [
SlotDefinition(
positionTitle: 'Squadron Commander',
dutyMos: '11A',
authorizedRank: 'o5',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'Squadron Sergeant Major',
dutyMos: '11B',
authorizedRank: 'e9',
isKeyLeader: true,
),
],
children: [
UnitDefinition(
name: 'HHT',
echelon: 'company',
branch: 'infantry',
slots: [
SlotDefinition(
positionTitle: 'HHT Commander',
dutyMos: '11A',
authorizedRank: 'o3',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'HHT First Sergeant',
dutyMos: '11B',
authorizedRank: 'e8',
isKeyLeader: true,
),
],
),
UnitDefinition(
name: 'Alpha Troop',
echelon: 'company',
branch: 'infantry',
slots: [
SlotDefinition(
positionTitle: 'Troop Commander',
dutyMos: '11A',
authorizedRank: 'o3',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'Troop First Sergeant',
dutyMos: '11B',
authorizedRank: 'e8',
isKeyLeader: true,
),
],
),
UnitDefinition(
name: 'Bravo Troop',
echelon: 'company',
branch: 'infantry',
slots: [
SlotDefinition(
positionTitle: 'Troop Commander',
dutyMos: '11A',
authorizedRank: 'o3',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'Troop First Sergeant',
dutyMos: '11B',
authorizedRank: 'e8',
isKeyLeader: true,
),
],
),
UnitDefinition(
name: 'Anti-Tank Troop',
echelon: 'company',
branch: 'infantry',
slots: [
SlotDefinition(
positionTitle: 'Troop Commander',
dutyMos: '11A',
authorizedRank: 'o3',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'Troop First Sergeant',
dutyMos: '11B',
authorizedRank: 'e8',
isKeyLeader: true,
),
],
),
],
),
// Field Artillery Battalion
const UnitDefinition(
name: 'Field Artillery Battalion',
echelon: 'battalion',
branch: 'fires',
slots: [
SlotDefinition(
positionTitle: 'Battalion Commander',
dutyMos: '13A',
authorizedRank: 'o5',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'Command Sergeant Major',
dutyMos: '13B',
authorizedRank: 'e9',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'Fire Direction Officer',
dutyMos: '13A',
authorizedRank: 'o3',
),
],
children: [
UnitDefinition(
name: 'Alpha Battery (105mm)',
echelon: 'company',
branch: 'fires',
slots: [
SlotDefinition(
positionTitle: 'Battery Commander',
dutyMos: '13A',
authorizedRank: 'o3',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'Battery First Sergeant',
dutyMos: '13B',
authorizedRank: 'e8',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'FAATDS Operator',
dutyMos: '13D',
authorizedRank: 'e4',
),
],
),
UnitDefinition(
name: 'Bravo Battery (105mm)',
echelon: 'company',
branch: 'fires',
slots: [
SlotDefinition(
positionTitle: 'Battery Commander',
dutyMos: '13A',
authorizedRank: 'o3',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'Battery First Sergeant',
dutyMos: '13B',
authorizedRank: 'e8',
isKeyLeader: true,
),
],
),
UnitDefinition(
name: 'Charlie Battery (155mm Towed)',
echelon: 'company',
branch: 'fires',
slots: [
SlotDefinition(
positionTitle: 'Battery Commander',
dutyMos: '13A',
authorizedRank: 'o3',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'Battery First Sergeant',
dutyMos: '13B',
authorizedRank: 'e8',
isKeyLeader: true,
),
],
),
],
),
// Multi-Domain Effects Platoon
const UnitDefinition(
name: 'Multi-Domain Effects Platoon (MDEP)',
echelon: 'platoon',
branch: 'cyberEw',
slots: [
SlotDefinition(
positionTitle: 'MDEP Officer',
dutyMos: '17A',
authorizedRank: 'o3',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'EW Specialist',
dutyMos: '17E',
authorizedRank: 'e6',
),
SlotDefinition(
positionTitle: 'EW Specialist',
dutyMos: '17E',
authorizedRank: 'e4',
),
SlotDefinition(
positionTitle: 'C-sUAS Operator',
dutyMos: '17E',
authorizedRank: 'e4',
),
],
),
// Hunter-Killer Platoon
const UnitDefinition(
name: 'Hunter-Killer Platoon (HKP)',
echelon: 'platoon',
branch: 'infantry',
slots: [
SlotDefinition(
positionTitle: 'HKP Leader',
dutyMos: '11A',
authorizedRank: 'o2',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'sUAS Operator',
dutyMos: '15W',
authorizedRank: 'e5',
),
SlotDefinition(
positionTitle: 'sUAS Operator',
dutyMos: '15W',
authorizedRank: 'e4',
),
SlotDefinition(
positionTitle: 'Targeting NCO',
dutyMos: '13F',
authorizedRank: 'e6',
),
],
),
// Brigade Engineer Battalion
const UnitDefinition(
name: 'Brigade Engineer Battalion',
echelon: 'battalion',
branch: 'engineer',
slots: [
SlotDefinition(
positionTitle: 'Battalion Commander',
dutyMos: '12A',
authorizedRank: 'o5',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'Command Sergeant Major',
dutyMos: '12B',
authorizedRank: 'e9',
isKeyLeader: true,
),
],
children: [
UnitDefinition(
name: 'Alpha Engineer Company',
echelon: 'company',
branch: 'engineer',
slots: [
SlotDefinition(
positionTitle: 'Company Commander',
dutyMos: '12A',
authorizedRank: 'o3',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'First Sergeant',
dutyMos: '12B',
authorizedRank: 'e8',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'Combat Engineer',
dutyMos: '12B',
authorizedRank: 'e4',
),
],
),
],
),
// Brigade Support Battalion
const UnitDefinition(
name: 'Brigade Support Battalion',
echelon: 'battalion',
branch: 'logistics',
slots: [
SlotDefinition(
positionTitle: 'Battalion Commander',
dutyMos: '92A',
authorizedRank: 'o5',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'Command Sergeant Major',
dutyMos: '92Y',
authorizedRank: 'e9',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'Unit Supply Specialist',
dutyMos: '92Y',
authorizedRank: 'e4',
),
SlotDefinition(
positionTitle: 'Automated Logistical Specialist',
dutyMos: '92A',
authorizedRank: 'e4',
),
SlotDefinition(
positionTitle: 'Vehicle Mechanic',
dutyMos: '91B',
authorizedRank: 'e4',
),
],
),
],
);
// ---------------------------------------------------------------------------
// SBCT — Stryker Brigade Combat Team
// ---------------------------------------------------------------------------
/// Stryker Brigade Combat Team (2026 doctrine).
static final UnitDefinition sbct = UnitDefinition(
name: 'Stryker Brigade Combat Team',
echelon: 'brigade',
branch: 'infantry',
slots: const [
SlotDefinition(
positionTitle: 'Brigade Commander',
dutyMos: '11A',
authorizedRank: 'o6',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'Deputy Commander',
dutyMos: '11A',
authorizedRank: 'o5',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'Command Sergeant Major',
dutyMos: '11B',
authorizedRank: 'e9',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'S3 Operations Officer',
dutyMos: '11A',
authorizedRank: 'o4',
),
SlotDefinition(
positionTitle: 'Brigade Signal Officer',
dutyMos: '25A',
authorizedRank: 'o3',
),
],
children: [
_infantryBattalion('1-2 Stryker Infantry Battalion'),
_infantryBattalion('2-2 Stryker Infantry Battalion'),
_infantryBattalion('3-2 Stryker Infantry Battalion'),
// Cavalry Reconnaissance Squadron
const UnitDefinition(
name: 'Cavalry Reconnaissance Squadron',
echelon: 'battalion',
branch: 'infantry',
slots: [
SlotDefinition(
positionTitle: 'Squadron Commander',
dutyMos: '11A',
authorizedRank: 'o5',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'Squadron Sergeant Major',
dutyMos: '11B',
authorizedRank: 'e9',
isKeyLeader: true,
),
],
children: [
UnitDefinition(
name: 'HHT',
echelon: 'company',
branch: 'infantry',
slots: [
SlotDefinition(
positionTitle: 'HHT Commander',
dutyMos: '11A',
authorizedRank: 'o3',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'HHT First Sergeant',
dutyMos: '11B',
authorizedRank: 'e8',
isKeyLeader: true,
),
],
),
UnitDefinition(
name: 'Alpha Cav Troop (Stryker)',
echelon: 'company',
branch: 'infantry',
slots: [
SlotDefinition(
positionTitle: 'Troop Commander',
dutyMos: '11A',
authorizedRank: 'o3',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'Troop First Sergeant',
dutyMos: '11B',
authorizedRank: 'e8',
isKeyLeader: true,
),
],
),
UnitDefinition(
name: 'Bravo Cav Troop (Stryker)',
echelon: 'company',
branch: 'infantry',
slots: [
SlotDefinition(
positionTitle: 'Troop Commander',
dutyMos: '11A',
authorizedRank: 'o3',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'Troop First Sergeant',
dutyMos: '11B',
authorizedRank: 'e8',
isKeyLeader: true,
),
],
),
UnitDefinition(
name: 'Charlie Cav Troop (Stryker)',
echelon: 'company',
branch: 'infantry',
slots: [
SlotDefinition(
positionTitle: 'Troop Commander',
dutyMos: '11A',
authorizedRank: 'o3',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'Troop First Sergeant',
dutyMos: '11B',
authorizedRank: 'e8',
isKeyLeader: true,
),
],
),
UnitDefinition(
name: 'Anti-Tank Troop (9× Stryker ATGM)',
echelon: 'company',
branch: 'infantry',
slots: [
SlotDefinition(
positionTitle: 'Troop Commander',
dutyMos: '11A',
authorizedRank: 'o3',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'Troop First Sergeant',
dutyMos: '11B',
authorizedRank: 'e8',
isKeyLeader: true,
),
],
),
],
),
// Field Artillery Battalion (M777A2)
const UnitDefinition(
name: 'Field Artillery Battalion (M777A2)',
echelon: 'battalion',
branch: 'fires',
slots: [
SlotDefinition(
positionTitle: 'Battalion Commander',
dutyMos: '13A',
authorizedRank: 'o5',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'Command Sergeant Major',
dutyMos: '13B',
authorizedRank: 'e9',
isKeyLeader: true,
),
],
children: [
UnitDefinition(
name: 'Alpha Battery (M777A2)',
echelon: 'company',
branch: 'fires',
slots: [
SlotDefinition(
positionTitle: 'Battery Commander',
dutyMos: '13A',
authorizedRank: 'o3',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'Battery First Sergeant',
dutyMos: '13B',
authorizedRank: 'e8',
isKeyLeader: true,
),
],
),
UnitDefinition(
name: 'Bravo Battery (M777A2)',
echelon: 'company',
branch: 'fires',
slots: [
SlotDefinition(
positionTitle: 'Battery Commander',
dutyMos: '13A',
authorizedRank: 'o3',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'Battery First Sergeant',
dutyMos: '13B',
authorizedRank: 'e8',
isKeyLeader: true,
),
],
),
UnitDefinition(
name: 'Charlie Battery (M777A2)',
echelon: 'company',
branch: 'fires',
slots: [
SlotDefinition(
positionTitle: 'Battery Commander',
dutyMos: '13A',
authorizedRank: 'o3',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'Battery First Sergeant',
dutyMos: '13B',
authorizedRank: 'e8',
isKeyLeader: true,
),
],
),
],
),
// Brigade Engineer Battalion
const UnitDefinition(
name: 'Brigade Engineer Battalion',
echelon: 'battalion',
branch: 'engineer',
slots: [
SlotDefinition(
positionTitle: 'Battalion Commander',
dutyMos: '12A',
authorizedRank: 'o5',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'Command Sergeant Major',
dutyMos: '12B',
authorizedRank: 'e9',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'Signal NCO',
dutyMos: '25H',
authorizedRank: 'e5',
),
],
children: [
UnitDefinition(
name: 'Alpha Engineer Company',
echelon: 'company',
branch: 'engineer',
slots: [
SlotDefinition(
positionTitle: 'Company Commander',
dutyMos: '12A',
authorizedRank: 'o3',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'First Sergeant',
dutyMos: '12B',
authorizedRank: 'e8',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'Combat Engineer',
dutyMos: '12B',
authorizedRank: 'e4',
),
],
),
],
),
// Brigade Support Battalion
const UnitDefinition(
name: 'Brigade Support Battalion',
echelon: 'battalion',
branch: 'logistics',
slots: [
SlotDefinition(
positionTitle: 'Battalion Commander',
dutyMos: '92A',
authorizedRank: 'o5',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'Command Sergeant Major',
dutyMos: '92Y',
authorizedRank: 'e9',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'Medical Officer',
dutyMos: '68A',
authorizedRank: 'o3',
),
SlotDefinition(
positionTitle: 'Unit Supply Specialist',
dutyMos: '92Y',
authorizedRank: 'e4',
),
],
),
],
);
// ---------------------------------------------------------------------------
// ABCT — Armored Brigade Combat Team
// ---------------------------------------------------------------------------
/// Armored Brigade Combat Team (2026 doctrine).
static final UnitDefinition abct = UnitDefinition(
name: 'Armored Brigade Combat Team',
echelon: 'brigade',
branch: 'infantry',
slots: const [
SlotDefinition(
positionTitle: 'Brigade Commander',
dutyMos: '11A',
authorizedRank: 'o6',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'Deputy Commander',
dutyMos: '11A',
authorizedRank: 'o5',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'Command Sergeant Major',
dutyMos: '11B',
authorizedRank: 'e9',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'S3 Operations Officer',
dutyMos: '11A',
authorizedRank: 'o4',
),
],
children: [
// Armor-Heavy CAB 1
const UnitDefinition(
name: '1st Combined Arms Battalion (Armor-Heavy)',
echelon: 'battalion',
branch: 'infantry',
slots: [
SlotDefinition(
positionTitle: 'Battalion Commander',
dutyMos: '11A',
authorizedRank: 'o5',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'Command Sergeant Major',
dutyMos: '11B',
authorizedRank: 'e9',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'Battalion Medic',
dutyMos: '68W',
authorizedRank: 'e6',
),
SlotDefinition(
positionTitle: 'Vehicle Mechanic',
dutyMos: '91A',
authorizedRank: 'e5',
),
],
children: [
UnitDefinition(
name: 'Alpha Tank Company (14× M1A2 SEPv3)',
echelon: 'company',
branch: 'infantry',
slots: [
SlotDefinition(
positionTitle: 'Company Commander',
dutyMos: '11A',
authorizedRank: 'o3',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'First Sergeant',
dutyMos: '11B',
authorizedRank: 'e8',
isKeyLeader: true,
),
],
),
UnitDefinition(
name: 'Bravo Tank Company (14× M1A2 SEPv3)',
echelon: 'company',
branch: 'infantry',
slots: [
SlotDefinition(
positionTitle: 'Company Commander',
dutyMos: '11A',
authorizedRank: 'o3',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'First Sergeant',
dutyMos: '11B',
authorizedRank: 'e8',
isKeyLeader: true,
),
],
),
UnitDefinition(
name: 'Charlie Mech Infantry Company (14× M2A3 Bradley)',
echelon: 'company',
branch: 'infantry',
slots: [
SlotDefinition(
positionTitle: 'Company Commander',
dutyMos: '11A',
authorizedRank: 'o3',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'First Sergeant',
dutyMos: '11B',
authorizedRank: 'e8',
isKeyLeader: true,
),
],
),
],
),
// Armor-Heavy CAB 2
const UnitDefinition(
name: '2nd Combined Arms Battalion (Armor-Heavy)',
echelon: 'battalion',
branch: 'infantry',
slots: [
SlotDefinition(
positionTitle: 'Battalion Commander',
dutyMos: '11A',
authorizedRank: 'o5',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'Command Sergeant Major',
dutyMos: '11B',
authorizedRank: 'e9',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'Battalion Medic',
dutyMos: '68W',
authorizedRank: 'e6',
),
],
children: [
UnitDefinition(
name: 'Alpha Tank Company (14× M1A2 SEPv3)',
echelon: 'company',
branch: 'infantry',
slots: [
SlotDefinition(
positionTitle: 'Company Commander',
dutyMos: '11A',
authorizedRank: 'o3',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'First Sergeant',
dutyMos: '11B',
authorizedRank: 'e8',
isKeyLeader: true,
),
],
),
UnitDefinition(
name: 'Bravo Tank Company (14× M1A2 SEPv3)',
echelon: 'company',
branch: 'infantry',
slots: [
SlotDefinition(
positionTitle: 'Company Commander',
dutyMos: '11A',
authorizedRank: 'o3',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'First Sergeant',
dutyMos: '11B',
authorizedRank: 'e8',
isKeyLeader: true,
),
],
),
UnitDefinition(
name: 'Charlie Mech Infantry Company (14× M2A3 Bradley)',
echelon: 'company',
branch: 'infantry',
slots: [
SlotDefinition(
positionTitle: 'Company Commander',
dutyMos: '11A',
authorizedRank: 'o3',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'First Sergeant',
dutyMos: '11B',
authorizedRank: 'e8',
isKeyLeader: true,
),
],
),
],
),
// Infantry-Heavy CAB
_infantryBattalion('3rd Combined Arms Battalion (Infantry-Heavy)'),
// Armored Cavalry Squadron
const UnitDefinition(
name: 'Armored Cavalry Squadron',
echelon: 'battalion',
branch: 'infantry',
slots: [
SlotDefinition(
positionTitle: 'Squadron Commander',
dutyMos: '11A',
authorizedRank: 'o5',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'Squadron Sergeant Major',
dutyMos: '11B',
authorizedRank: 'e9',
isKeyLeader: true,
),
],
children: [
UnitDefinition(
name: 'HHT',
echelon: 'company',
branch: 'infantry',
slots: [
SlotDefinition(
positionTitle: 'HHT Commander',
dutyMos: '11A',
authorizedRank: 'o3',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'HHT First Sergeant',
dutyMos: '11B',
authorizedRank: 'e8',
isKeyLeader: true,
),
],
),
UnitDefinition(
name: 'Alpha Armored Cav Troop',
echelon: 'company',
branch: 'infantry',
slots: [
SlotDefinition(
positionTitle: 'Troop Commander',
dutyMos: '11A',
authorizedRank: 'o3',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'Troop First Sergeant',
dutyMos: '11B',
authorizedRank: 'e8',
isKeyLeader: true,
),
],
),
UnitDefinition(
name: 'Bravo Armored Cav Troop',
echelon: 'company',
branch: 'infantry',
slots: [
SlotDefinition(
positionTitle: 'Troop Commander',
dutyMos: '11A',
authorizedRank: 'o3',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'Troop First Sergeant',
dutyMos: '11B',
authorizedRank: 'e8',
isKeyLeader: true,
),
],
),
UnitDefinition(
name: 'Charlie Armored Cav Troop',
echelon: 'company',
branch: 'infantry',
slots: [
SlotDefinition(
positionTitle: 'Troop Commander',
dutyMos: '11A',
authorizedRank: 'o3',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'Troop First Sergeant',
dutyMos: '11B',
authorizedRank: 'e8',
isKeyLeader: true,
),
],
),
UnitDefinition(
name: 'Tank Troop (14× M1A2)',
echelon: 'company',
branch: 'infantry',
slots: [
SlotDefinition(
positionTitle: 'Troop Commander',
dutyMos: '11A',
authorizedRank: 'o3',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'Troop First Sergeant',
dutyMos: '11B',
authorizedRank: 'e8',
isKeyLeader: true,
),
],
),
],
),
// Field Artillery Battalion (M109A7 Paladin)
const UnitDefinition(
name: 'Field Artillery Battalion (M109A7 Paladin)',
echelon: 'battalion',
branch: 'fires',
slots: [
SlotDefinition(
positionTitle: 'Battalion Commander',
dutyMos: '13A',
authorizedRank: 'o5',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'Command Sergeant Major',
dutyMos: '13B',
authorizedRank: 'e9',
isKeyLeader: true,
),
],
children: [
UnitDefinition(
name: 'Alpha Battery (M109A7)',
echelon: 'company',
branch: 'fires',
slots: [
SlotDefinition(
positionTitle: 'Battery Commander',
dutyMos: '13A',
authorizedRank: 'o3',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'Battery First Sergeant',
dutyMos: '13B',
authorizedRank: 'e8',
isKeyLeader: true,
),
],
),
UnitDefinition(
name: 'Bravo Battery (M109A7)',
echelon: 'company',
branch: 'fires',
slots: [
SlotDefinition(
positionTitle: 'Battery Commander',
dutyMos: '13A',
authorizedRank: 'o3',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'Battery First Sergeant',
dutyMos: '13B',
authorizedRank: 'e8',
isKeyLeader: true,
),
],
),
UnitDefinition(
name: 'Charlie Battery (M109A7)',
echelon: 'company',
branch: 'fires',
slots: [
SlotDefinition(
positionTitle: 'Battery Commander',
dutyMos: '13A',
authorizedRank: 'o3',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'Battery First Sergeant',
dutyMos: '13B',
authorizedRank: 'e8',
isKeyLeader: true,
),
],
),
],
),
// Brigade Engineer Battalion
const UnitDefinition(
name: 'Brigade Engineer Battalion',
echelon: 'battalion',
branch: 'engineer',
slots: [
SlotDefinition(
positionTitle: 'Battalion Commander',
dutyMos: '12A',
authorizedRank: 'o5',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'Command Sergeant Major',
dutyMos: '12B',
authorizedRank: 'e9',
isKeyLeader: true,
),
],
children: [
UnitDefinition(
name: 'Sapper Company',
echelon: 'company',
branch: 'engineer',
slots: [
SlotDefinition(
positionTitle: 'Company Commander',
dutyMos: '12A',
authorizedRank: 'o3',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'First Sergeant',
dutyMos: '12B',
authorizedRank: 'e8',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'Combat Engineer (Sapper)',
dutyMos: '12B',
authorizedRank: 'e5',
),
],
),
],
),
],
);
// ---------------------------------------------------------------------------
// CAB Heavy — Combat Aviation Brigade (Heavy)
// ---------------------------------------------------------------------------
/// Combat Aviation Brigade — Heavy (2026 doctrine).
static const UnitDefinition cabHeavy = UnitDefinition(
name: 'Combat Aviation Brigade (Heavy)',
echelon: 'brigade',
branch: 'aviation',
slots: [
SlotDefinition(
positionTitle: 'Brigade Commander',
dutyMos: '153A',
authorizedRank: 'o6',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'Deputy Commander',
dutyMos: '153A',
authorizedRank: 'o5',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'Command Sergeant Major',
dutyMos: '15Z',
authorizedRank: 'e9',
isKeyLeader: true,
),
],
children: [
// Attack Aviation Battalion
UnitDefinition(
name: 'Attack Aviation Battalion (24× AH-64E Apache)',
echelon: 'battalion',
branch: 'aviation',
slots: [
SlotDefinition(
positionTitle: 'Battalion Commander',
dutyMos: '153A',
authorizedRank: 'o5',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'Command Sergeant Major',
dutyMos: '15Z',
authorizedRank: 'e9',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'Attack Pilot',
dutyMos: '153A',
authorizedRank: 'o3',
),
SlotDefinition(
positionTitle: 'Crew Chief (AH-64E)',
dutyMos: '15T',
authorizedRank: 'e5',
),
],
children: [
UnitDefinition(
name: 'Alpha Attack Company',
echelon: 'company',
branch: 'aviation',
slots: [
SlotDefinition(
positionTitle: 'Company Commander',
dutyMos: '153A',
authorizedRank: 'o4',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'First Sergeant',
dutyMos: '15Z',
authorizedRank: 'e8',
isKeyLeader: true,
),
],
),
UnitDefinition(
name: 'Bravo Attack Company',
echelon: 'company',
branch: 'aviation',
slots: [
SlotDefinition(
positionTitle: 'Company Commander',
dutyMos: '153A',
authorizedRank: 'o4',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'First Sergeant',
dutyMos: '15Z',
authorizedRank: 'e8',
isKeyLeader: true,
),
],
),
],
),
// Assault Helicopter Battalion
UnitDefinition(
name: 'Assault Helicopter Battalion (UH-60M / CH-47F)',
echelon: 'battalion',
branch: 'aviation',
slots: [
SlotDefinition(
positionTitle: 'Battalion Commander',
dutyMos: '153A',
authorizedRank: 'o5',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'Command Sergeant Major',
dutyMos: '15Z',
authorizedRank: 'e9',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'UH-60M Pilot',
dutyMos: '153A',
authorizedRank: 'o3',
),
SlotDefinition(
positionTitle: 'CH-47F Pilot',
dutyMos: '153A',
authorizedRank: 'o3',
),
SlotDefinition(
positionTitle: 'Crew Chief (UH-60M)',
dutyMos: '15T',
authorizedRank: 'e5',
),
],
children: [
UnitDefinition(
name: 'Alpha Assault Company (UH-60M)',
echelon: 'company',
branch: 'aviation',
slots: [
SlotDefinition(
positionTitle: 'Company Commander',
dutyMos: '153A',
authorizedRank: 'o4',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'First Sergeant',
dutyMos: '15Z',
authorizedRank: 'e8',
isKeyLeader: true,
),
],
),
UnitDefinition(
name: 'Bravo Heavy Lift Company (CH-47F)',
echelon: 'company',
branch: 'aviation',
slots: [
SlotDefinition(
positionTitle: 'Company Commander',
dutyMos: '153A',
authorizedRank: 'o4',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'First Sergeant',
dutyMos: '15Z',
authorizedRank: 'e8',
isKeyLeader: true,
),
],
),
],
),
// Air Ambulance Company
UnitDefinition(
name: 'Air Ambulance Company (15× HH-60M)',
echelon: 'company',
branch: 'medical',
slots: [
SlotDefinition(
positionTitle: 'Company Commander',
dutyMos: '153A',
authorizedRank: 'o4',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'First Sergeant',
dutyMos: '68W',
authorizedRank: 'e8',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'Flight Medic',
dutyMos: '68W',
authorizedRank: 'e5',
),
SlotDefinition(
positionTitle: 'Flight Medic',
dutyMos: '68W',
authorizedRank: 'e4',
),
SlotDefinition(
positionTitle: 'MEDEVAC Pilot',
dutyMos: '153A',
authorizedRank: 'o3',
),
],
),
// Aviation Support Battalion
UnitDefinition(
name: 'Aviation Support Battalion',
echelon: 'battalion',
branch: 'logistics',
slots: [
SlotDefinition(
positionTitle: 'Battalion Commander',
dutyMos: '92A',
authorizedRank: 'o5',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'Command Sergeant Major',
dutyMos: '92Y',
authorizedRank: 'e9',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'Aviation Mechanic (Intermediate)',
dutyMos: '15B',
authorizedRank: 'e5',
),
SlotDefinition(
positionTitle: 'Aircraft Powerplant Repairer',
dutyMos: '15D',
authorizedRank: 'e5',
),
SlotDefinition(
positionTitle: 'Unit Supply Specialist',
dutyMos: '92Y',
authorizedRank: 'e4',
),
],
),
],
);
// ---------------------------------------------------------------------------
// CAB Light — Combat Aviation Brigade (Light)
// ---------------------------------------------------------------------------
/// Combat Aviation Brigade — Light (2026 doctrine).
static const UnitDefinition cabLight = UnitDefinition(
name: 'Combat Aviation Brigade (Light)',
echelon: 'brigade',
branch: 'aviation',
slots: [
SlotDefinition(
positionTitle: 'Brigade Commander',
dutyMos: '153A',
authorizedRank: 'o6',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'Deputy Commander',
dutyMos: '153A',
authorizedRank: 'o5',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'Command Sergeant Major',
dutyMos: '15Z',
authorizedRank: 'e9',
isKeyLeader: true,
),
],
children: [
// Attack Reconnaissance Battalion
UnitDefinition(
name: 'Attack Reconnaissance Battalion (AH-64E + MQ-9A)',
echelon: 'battalion',
branch: 'aviation',
slots: [
SlotDefinition(
positionTitle: 'Battalion Commander',
dutyMos: '153A',
authorizedRank: 'o5',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'Command Sergeant Major',
dutyMos: '15Z',
authorizedRank: 'e9',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'Attack Pilot (AH-64E)',
dutyMos: '153A',
authorizedRank: 'o3',
),
SlotDefinition(
positionTitle: 'sUAS Operator',
dutyMos: '15W',
authorizedRank: 'e5',
),
],
children: [
UnitDefinition(
name: 'Alpha Attack Company',
echelon: 'company',
branch: 'aviation',
slots: [
SlotDefinition(
positionTitle: 'Company Commander',
dutyMos: '153A',
authorizedRank: 'o4',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'First Sergeant',
dutyMos: '15Z',
authorizedRank: 'e8',
isKeyLeader: true,
),
],
),
UnitDefinition(
name: 'Troop F (MQ-9A / sUAS)',
echelon: 'company',
branch: 'aviation',
slots: [
SlotDefinition(
positionTitle: 'Troop Commander',
dutyMos: '153A',
authorizedRank: 'o3',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'Troop First Sergeant',
dutyMos: '15Z',
authorizedRank: 'e8',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'sUAS Operator',
dutyMos: '15W',
authorizedRank: 'e4',
),
],
),
],
),
// Assault Helicopter Battalion
UnitDefinition(
name: 'Assault Helicopter Battalion (UH-60M / CH-47F)',
echelon: 'battalion',
branch: 'aviation',
slots: [
SlotDefinition(
positionTitle: 'Battalion Commander',
dutyMos: '153A',
authorizedRank: 'o5',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'Command Sergeant Major',
dutyMos: '15Z',
authorizedRank: 'e9',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'UH-60M Pilot',
dutyMos: '153A',
authorizedRank: 'o3',
),
SlotDefinition(
positionTitle: 'Crew Chief',
dutyMos: '15T',
authorizedRank: 'e5',
),
],
children: [
UnitDefinition(
name: 'Alpha Assault Company',
echelon: 'company',
branch: 'aviation',
slots: [
SlotDefinition(
positionTitle: 'Company Commander',
dutyMos: '153A',
authorizedRank: 'o4',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'First Sergeant',
dutyMos: '15Z',
authorizedRank: 'e8',
isKeyLeader: true,
),
],
),
],
),
// Medical Assault Battalion
UnitDefinition(
name: 'Assault Helicopter Battalion (Medical)',
echelon: 'battalion',
branch: 'medical',
slots: [
SlotDefinition(
positionTitle: 'Battalion Commander',
dutyMos: '153A',
authorizedRank: 'o5',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'Command Sergeant Major',
dutyMos: '68W',
authorizedRank: 'e9',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'Flight Medic',
dutyMos: '68W',
authorizedRank: 'e5',
),
SlotDefinition(
positionTitle: 'MEDEVAC Pilot',
dutyMos: '153A',
authorizedRank: 'o3',
),
],
children: [
UnitDefinition(
name: 'Alpha MEDEVAC Company',
echelon: 'company',
branch: 'medical',
slots: [
SlotDefinition(
positionTitle: 'Company Commander',
dutyMos: '153A',
authorizedRank: 'o4',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'First Sergeant',
dutyMos: '68W',
authorizedRank: 'e8',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'Flight Medic',
dutyMos: '68W',
authorizedRank: 'e4',
),
],
),
],
),
// Aviation Support Battalion
UnitDefinition(
name: 'Aviation Support Battalion',
echelon: 'battalion',
branch: 'logistics',
slots: [
SlotDefinition(
positionTitle: 'Battalion Commander',
dutyMos: '92A',
authorizedRank: 'o5',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'Command Sergeant Major',
dutyMos: '92Y',
authorizedRank: 'e9',
isKeyLeader: true,
),
SlotDefinition(
positionTitle: 'Aviation Mechanic',
dutyMos: '15B',
authorizedRank: 'e5',
),
SlotDefinition(
positionTitle: 'Unit Supply Specialist',
dutyMos: '92Y',
authorizedRank: 'e4',
),
],
),
],
);
/// Returns all available template definitions keyed by a short identifier.
static Map<String, UnitDefinition> get all => {
'mbct': mbct,
'sbct': sbct,
'abct': abct,
'cab_heavy': cabHeavy,
'cab_light': cabLight,
};
/// Returns the display name for a template key.
static String displayName(String key) {
switch (key) {
case 'mbct':
return 'Mobile BCT (MBCT)';
case 'sbct':
return 'Stryker BCT (SBCT)';
case 'abct':
return 'Armored BCT (ABCT)';
case 'cab_heavy':
return 'Combat Aviation Brigade — Heavy';
case 'cab_light':
return 'Combat Aviation Brigade — Light';
default:
return key;
}
}
}