1928 lines
56 KiB
Dart
1928 lines
56 KiB
Dart
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;
|
||
}
|
||
}
|
||
}
|