From 2149f2d5273990b2ca0d6975101cd00c49b302f3 Mon Sep 17 00:00:00 2001 From: "@permadeath.com" Date: Thu, 20 Aug 2026 15:33:41 -0400 Subject: [PATCH] docs(candidates): put MegaMek's own counts in the table The 41/151 and 10/37 figures and the 2.6-3.5 facings band were pre-corpus and disagreed with each other. The differential corpus settles it: at 6 MP the Phoenix Hawk reaches 36-55 hexes in the open and 10-13 in heavy forest, at 3.2 and 3.6 facings per hex. The band was wrong at both ends and is gone. --- plan/candidates.md | 47 +++++++++++++++++++++++++++++----------------- 1 file changed, 30 insertions(+), 17 deletions(-) diff --git a/plan/candidates.md b/plan/candidates.md index 251f762..a4517dd 100644 --- a/plan/candidates.md +++ b/plan/candidates.md @@ -25,22 +25,26 @@ never more. `walk_toward` is a greedy stepper that picks a heading and stops at the first step that is not closer, so it does not reliably reach even those four destinations. -Meanwhile a mech with 6 MP has, measured with real terrain costs and 1 MP per -hexside of turning: - -| board | reachable hexes | reachable `(hex, facing)` states | -|---|---|---| -| `Map Set 5/16x17 Open Terrain 1` | 41 | 151 | -| `Map Set 4/16x17 Heavy Forest 1` | 10 | 37 | - -Both are suite boards, with mixed terrain, elevation and edges a 6 MP mech -reaches. A uniform synthetic board is a different measurement and its counts do +Meanwhile a Phoenix Hawk PXH-1 walking its full 6 MP has, **measured by +MegaMek** over `tests/corpus/pathfind.jsonl` - three starts and two facings per +board, so a range rather than a point: + +| board | reachable hexes | reachable `(hex, facing)` states | facings per hex | +|---|---|---|---| +| `Map Set 5/16x17 Open Terrain 1` | 36-55 | 129-177 | 3.23 | +| `Map Set 4/16x17 Heavy Forest 1` | 10-13 | 34-48 | 3.59 | +| `Map Set 2/16x17 Lake Area` | 12-26 | 43-91 | 3.35 | + +All three are suite boards, with mixed terrain, elevation and edges a 6 MP +mech reaches. A uniform synthetic board is a different measurement and its counts do not belong in this table: 6 MP on an all-clear plain reaches more than a real open-terrain sheet does, because the sheet has terrain and edges in it. -These figures give 3.68 and 3.70 facings per hex, which contradicts the -2.6-3.5 band recorded further down. Both are pre-corpus figures and both stand -as written until the differential corpus settles which is right. +The facings column is states over hexes across all six cases on the board, not +a mean of ratios. The pre-corpus figures this table replaces were 41/151 for +open terrain and 10/37 for heavy forest; the hex counts were in range and the +state counts were not. The `2.6-3.5` band that used to sit further down was +wrong at both ends and has gone. So the scoring work - line of sight, hit locations, damage distributions, per-location value - is being used to rank five options out of scores. **No @@ -62,8 +66,10 @@ hexes_moved`. The last two are separate on purpose: TMM keys on hexes moved, the attacker's own modifier keys on movement class, and terrain burns MP without moving you. -Measured at 2.6-3.5 facings per hex rather than 6, because budget spent getting -somewhere is budget not available for turning. +Measured by MegaMek at 3.2 facings per hex in the open, 3.4 on the lake board +and 3.6 in heavy forest rather than 6, because budget spent getting somewhere +is budget not available for turning. Forest is the highest of the three: a mech +that has spent its points on woods has gone nowhere and can afford to turn. **Engagement.** For each of my states `L` against each enemy hex `M`, prune cheap to expensive, then run the volley estimator on the survivors. Enemy @@ -114,9 +120,16 @@ good offence and bad defence, and a single operator over `N` cannot say so. - [x] `pathfind.rs`: Dijkstra over `Stand` with terrain MP, elevation delta (illegal above two levels), 1 MP per hexside. Test: every state within budget; the set for MP *n* is a subset of MP *n+1*; deterministic -- [ ] **Differential test against the dumped corpus.** Our reachable state set +- [x] **Differential test against the dumped corpus.** Our reachable state set equals MegaMek's. This is the one that matters - the LOS port and the hit - tables were both validated this way and both turned up real bugs + tables were both validated this way and both turned up real bugs. + `tests/pathfind_differential.rs`: equal on `(hex, facing, mp_spent)` over + all 36 cases and 1979 states. The first two boards carried no water and + no adjacent pair more than two levels apart, so `Map Set 2/16x17 Lake + Area` was added to put the water double charge and the refused climb + under the same comparison. Woods, water at depth one and two, floor + changes of one, two and a refused three, and both column parities are now + confirmed; every terrain arm other than woods is not - [x] `hexes_moved` recorded separately from `mp_spent`. Test: a path through woods spends more MP than hexes; a straight clear path spends equal - [ ] TMM from the existing `target_movement_modifier(hexes_moved, jumped)`. -- 2.51.2