# Formations, and the tactic each one opens on A force does not choose its opening tactic. It is handed one by what it was built as, and what it was built as is a **Formation** - MegaMek's own composition requirements over weight class, movement, armour, damage at a range and the roles present. Nothing on this page is invented here: the requirements are read out of `megamek.client.ratgenerator.FormationType` by `bridge/sds/SdsFormations.java`, committed as `crates/sds-core/tests/corpus/formations.txt`, and checked against the catalogue on every commit. What is *not* MegaMek's is the last column. Which tactic a composition asks for is a reading of it, and it is the one thing here worth arguing with. The cohesion rule is the tabletop rules': a formation holds while **3 or more** of its units are neither destroyed nor routed, and below that it is disabled and the force falls back to `engage`. `FormationType` is a generation filter that never touches a running game, so nothing in MegaMek applies that rule for us and the bot keeps it itself - what MegaMek settles is the predicate under it, which is a unit the game has removed from play. ## The order A lance of four heavies is a Battle Lance and a Heavy Battle Lance and a Support Lance all at once, so which one it *is* comes down to which is asked first. The order is a constant, and scarce means **fewest lances left to take**: each position goes to the formation with the fewest lances no formation above it has already claimed, measured over twenty thousand lances drawn from MegaMek's own force generator. `crates/sds-core/tests/corpus/lances.txt` is that derivation, with the corpus it came from, and `formation::ORDER` is pinned to it. Nothing recomputes the order at build time. The **satisfies** column is how much of that corpus a formation's criteria admit and the **claims** column is how much of it the formation is left once everything above has been asked. The gap between them is what the order costs a formation, and the units column - how much of a lance a definition pins down - is what the order used to be sorted by. A force that qualifies as nothing at all opens on `engage`, and so does a force this bot cannot read - anything that is not four ground Meks. | # | formation | family | units | satisfies | claims | asks for | opens on | |---|---|---|---|---|---|---|---| | 1 | Order * | Command | 0 | 0 | 0 | Same model | never - faction not modelled | | 2 | Artillery Fire | Fire | 2 | 4 | 4 | 2 of Artillery | `bombard` | | 3 | Light Recon | Recon | 4 | 23 | 23 | UltraLight to Light; every unit: Walk/Cruise 6+, Scout | `harass` | | 4 | Horde | Striker/Cavalry | 4 | 48 | 28 | UltraLight to Light; every unit: Damage <= 10 at range 9 | `harass` | | 5 | Fast Assault | Assault | 11 | 58 | 58 | Medium to Colossal; every unit: Walk 5+ or Jump 1+; 3 of Damage 25+ at range 7; 3 of Heavy+; 1 of Juggernaut or 2 of Sniper | `engage` | | 6 | Sweep | Pursuit | 4 | 177 | 177 | UltraLight to Medium; every unit: Walk/Cruise 5+, Damage 10+ at range 6 | `flank` | | 7 | Light Striker/Cavalry | Striker/Cavalry | 8 | 186 | 80 | UltraLight to Medium; every unit: Walk/Cruise 5+; 2 of Weapon with damage 5+ at range 18; 2 of Striker, Skirmisher | `flank` | | 8 | Light Fire | Fire | 2 | 225 | 198 | UltraLight to Medium; 2 of Sniper, Missile Boat | `engage` | | 9 | Probe | Pursuit | 7 | 275 | 201 | UltraLight to Heavy; every unit: Damage 10+ at range 9; 3 of Walk/Cruise 6+ | `flank` | | 10 | Pursuit | Pursuit | 4 | 492 | 286 | UltraLight to Medium; 3 of Walk/Cruise 6+; 1 of Weapon with damage 5+ at range 15 - **or** every unit Striker | `flank` | | 11 | Recon | Recon | 6 | 912 | 427 | every unit: Walk/Cruise 5+; 2 of Scout, Striker - **or** every unit Scout | `flank` | | 12 | Hammer | Striker/Cavalry | 4 | 1243 | 242 | every unit: Walk/Cruise 5+ - **or** every unit Striker | never - faction not modelled | | 13 | Light Battle | Battle | 4 | 726 | 362 | UltraLight to Heavy; 3 of Light; 1 of Scout | `harass` | | 14 | Heavy Striker/Cavalry | Striker/Cavalry | 10 | 449 | 446 | Medium to Colossal; every unit: Walk/Cruise 4+; 3 of Heavy+; 2 of Striker, Skirmisher; 1 of Weapon with damage 5+ at range 18 | `flank` | | 15 | Rifle | Battle | 9 | 782 | 626 | Medium to Colossal; every unit: Walk/Cruise 4+; 3 of Medium, Heavy; 2 of AC weapon | never - faction not modelled | | 16 | Striker/Cavalry | Striker/Cavalry | 6 | 1381 | 653 | UltraLight to Heavy; every unit: Walk/Cruise 5+ or Jump 4+; 2 of Striker, Skirmisher - **or** every unit Striker | `flank` | | 17 | Anti-Air | Fire | 5 | 755 | 736 | 3 of Sniper, Missile Boat; 2 of Standard AC, LBX, Artillery weapon, Anti-Air targeting quirk | never - no behaviour prices it | | 18 | Heavy Recon | Recon | 9 | 1368 | 1082 | every unit: Walk/Cruise 4+; 2 of Walk/Cruise 5+; 2 of Scout; 1 of Heavy+ | `flank` | | 19 | Assault | Assault | 11 | 1194 | 1137 | Medium to Colossal; every unit: Armor 135+; 3 of 25 damage at range 7; 3 of Heavy+; 1 of Juggernaut or 2 of Sniper - **or** every unit Juggernaut | `engage` | | 20 | Hunter | Assault | 2 | 1432 | 1079 | 2 of Juggernaut or Ambusher - **or** every unit Ambusher | `entrench` | | 21 | Direct Fire | Fire | 6 | 1668 | 1159 | every unit: Damage 10 at range 18; 2 of Heavy+ | `engage` | | 22 | Fire | Fire | 3 | 1698 | 942 | 3 of Sniper, Missile Boat - **or** every unit MissileBoat | `engage` | | 23 | Fire Support | Fire | 3 | 2418 | 1231 | 3 of Indirect fire weapon | `bombard` | | 24 | Medium Battle | Battle | 2 | 2927 | 1391 | UltraLight to Heavy; 2 of Medium | `engage` | | 25 | Anvil | Assault | 6 | 5285 | 1373 | Medium to Colossal; every unit: Armor 105+; 2 of AC, SRM, or LRM | never - faction not modelled | | 26 | Ranger | Striker/Cavalry | 0 | 6967 | 1624 | UltraLight to Heavy - **or** every unit Skirmisher | `flank` | | 27 | Heavy Battle | Battle | 2 | 5737 | 1587 | Medium to Colossal; 2 of Heavy+ | `engage` | | 28 | Battle | Battle | 5 | 5149 | 1176 | 2 of Heavy+; 3 of Brawler, Sniper, Skirmisher - **or** every unit Brawler | never - another formation is this predicate | | 29 | Berserker/Close | Battle | 5 | 5149 | 1176 | 2 of Heavy+; 3 of Brawler, Sniper, Skirmisher - **or** every unit Brawler | `advance` | | 30 | Urban | Urban | 4 | 6426 | 1703 | 2 of Jump 1+ or Infantry/BA; 2 of Walk/Cruise <= 4 - **or** every unit Ambusher | `entrench` | | 31 | Security | Security | 5 | 7124 | 1407 | 1 of Scout, Striker; 1 of Sniper, Missile Boat; 3 of Not assault | `entrench` | | 32 | Command | Command | 3 | 12504 | 973 | 2 of Sniper, Missile Boat, Skirmisher, Juggernaught; 1 of Brawler, Striker, Scout | `engage` | | 33 | Support | Support | 0 | 20000 | 566 | nothing at all | `engage` | ## What is never offered These stay in the catalogue with their criteria intact and are never handed to a force. They carry no opening at all, so nothing can turn one into a tactic or fit a weight to it. **Faction not modelled.** MegaMek declares these as one house's. Nothing here knows which house a force belongs to - classification takes designs, and no field on the wire carries a faction - so a gated formation that was offered would match every house's force, which is not a narrower description but a wrong one. These come back by evaluating the gate once a force arrives with a faction. **No behaviour prices it.** Naming a force by a specialism the scorer cannot play describes it by something it will not then do. **Another formation is this predicate.** MegaMek separates the pair by a unit type and the unit types it separates them by are vehicles, so on a force of four Meks the two are one criterion and only the order chooses between them. The one withheld is the one whose distinction is the vehicles. | formation | why | |---|---| | Order | faction not modelled (DC) | | Hammer | faction not modelled (FWL) | | Rifle | faction not modelled (FS) | | Anti-Air | no behaviour prices it | | Anvil | faction not modelled (FWL) | | Battle | another formation is this predicate | ## What this bot declines to decide Marked `*` above. Where the wire cannot answer a requirement the formation is refused rather than guessed at, and a force that would have been one of these is classified as whatever comes next in the order, for a reason that is MegaMek's rather than ours. One narrowing is not a decline and is worth knowing about. The Anti-Air Lance takes a unit either for its guns **or** for the force generator's `ANTI_AIRCRAFT` mission role, which lives in `data/forcegenerator` and is not a fact about a machine on the board. The gun half is read and the role half is not; because the two are an *or*, that can only refuse a force MegaMek would have accepted, never accept one it would have refused. | formation | what is missing | |---|---| | Order | MegaMek's own qualifies() divides by zero here - UPSTREAM.md note 11 | ## What nobody opens on 7 of the 13 tactics are nobody's opening: `break`, `control`, `regroup`, `reposition`, `screen`, `spot`, `withdraw`. That reads as right rather than as a gap. A formation says what a force was built *for*, and none of those is something a force is built for - they are things a force becomes.