--- id: objectives title: What winning means, and what to do when it stops being available status: blocked dependsOn: [tactics] exitCriterion: > A losing force switches to preserving what it has, does so on a stated threshold rather than a guess, and does not oscillate across that threshold. --- # objectives An objective is what the side is currently trying to do. It is the **utility function**, not a constraint list: under `WinOnBattleValue` a withdrawal is terrible, and under `PreserveByRouting` an advance is. The same tactics are legal either way; what changes is what they are worth. That distinction is load-bearing. A `TaskOverride` removes options from a set after they are scored. An objective changes the scoring. Collapsing the two loses the difference between "forbidden" and "bad". There is a third, and it sits between them. A `TacticOverride` replaces one unit's weights with a named profile, so it changes the scoring like an objective but for a single machine rather than for the side. The pair is what a spotter needs: the profile sends it somewhere it can see, and the duty stops it shooting once it arrives. A profile a force hands out is normally one no unit could choose for itself - spotting, screening, drawing fire - which is how a force expresses sacrifice, and `Status::OverrideEligible` is what keeps such a profile out of the set a force may transition into. Absent objectives, `Engage` is the whole game and half the tactic vocabulary is unreachable - which is the state today. ## Two to start - `WinOnBattleValue` - the current victory rule. Makes `Retreat` unreachable, `Reposition` nearly so, and `Screen` unavailable to a side with only one force. - `PreserveByRouting` - reached when the match is lost. Admits `Retreat`, `Reposition`, `Screen` above one force, and `Break`, which is how a disengagement survives: losing line of sight is what buys the turn in which withdrawing is not fatal. `Break` sits in both sets, which is right - breaking contact serves winning and losing equally. - [ ] The transition is a **threshold**, not a judgement: remaining battle value, or a count of crippled units. A threshold can be stated, tested and shown to a player; a learned judgement cannot yet - [ ] Verify it does not oscillate. Flip at 30% and check the behaviour at 31% is stable. This is the cheapest available test of the hysteresis in `plan/tactics.md`, and losing is easy to produce on demand - [ ] An objective may also **bias** rather than only constrain, including by which side of the scenario we are on - an attacker and a defender have different utility, not different legal moves ## Scenario-derived objectives, later MegaMek already carries this. MMS V2 has per-player `victory:` conditions and composable triggers, and `UnitPositionTrigger` is literally an extraction objective. None of our maps declare one yet, so the objective layer cannot be exercised beyond the two above. - [ ] Read objectives from the scenario rather than inventing a vocabulary - [ ] Objectives decompose by **assignment** - first lance screens while second exits - which is the coordinator's relational assignment, not a blend